Skip to content

Commit 7f95775

Browse files
committed
pci: pci res have pci addr and cpu addr, ecam use map translation pci
addr to cpuaddr Signed-off-by: lipengfei28 <[email protected]>
1 parent 21343f6 commit 7f95775

File tree

4 files changed

+70
-11
lines changed

4 files changed

+70
-11
lines changed

drivers/devicetree/fdt_pci.c

+7-3
Original file line numberDiff line numberDiff line change
@@ -118,22 +118,26 @@ int fdt_pci_ecam_register(FAR const void *fdt)
118118

119119
if ((type & FDT_PCI_TYPE_MASK) == FDT_PCI_TYPE_IO)
120120
{
121-
io.start = fdt_ld_by_cells(ranges + na, pna);
121+
io.start = fdt_ld_by_cells(ranges + 1, na -1);
122122
io.end = io.start + fdt_ld_by_cells(ranges + na + pna, ns);
123+
io.offset = fdt_ld_by_cells(ranges + na, pna) - io.start;
123124
}
124125
else if ((type & FDT_PCI_PREFTCH) == FDT_PCI_PREFTCH)
125126
{
126-
prefetch.start = fdt_ld_by_cells(ranges + na, pna);
127+
prefetch.start = fdt_ld_by_cells(ranges + 1, na - 1);
127128
prefetch.end = prefetch.start +
128129
fdt_ld_by_cells(ranges + na + pna, ns);
130+
prefetch.offset = fdt_ld_by_cells(ranges + na, pna) -
131+
prefetch.start;
129132
}
130133
else if (((type & FDT_PCI_TYPE_MEM32) == FDT_PCI_TYPE_MEM32 &&
131134
sizeof(uintptr_t) == 4) ||
132135
((type & FDT_PCI_TYPE_MEM64) == FDT_PCI_TYPE_MEM64 &&
133136
sizeof(uintptr_t) == 8))
134137
{
135-
mem.start = fdt_ld_by_cells(ranges + na, pna);
138+
mem.start = fdt_ld_by_cells(ranges + 1, na - 1);
136139
mem.end = mem.start + fdt_ld_by_cells(ranges + na + pna, ns);
140+
mem.offset = fdt_ld_by_cells(ranges + na, pna) - mem.start;
137141
}
138142
}
139143

drivers/pci/pci.c

+20-8
Original file line numberDiff line numberDiff line change
@@ -672,14 +672,19 @@ static uint32_t pci_size(uint32_t base, uint32_t maxbase, uint32_t mask)
672672
* prefetchable MEM, and add this dev to the device list.
673673
*
674674
* Input Parameters:
675-
* dev - The PCI device be found
676-
* max_bar - Max bar number(6 or 2)
675+
* dev - The PCI device be found
676+
* max_bar - Max bar number(6 or 2)
677677
* rom_addr - The pci device rom addr
678+
* io - The pci bus io resource
679+
* mem - The pci bus mem resource
680+
* mem_pref - The pci bus mem_pref resource
678681
*
679682
****************************************************************************/
680683

681684
static void pci_setup_device(FAR struct pci_device_s *dev, int max_bar,
682-
uint8_t rom_addr)
685+
uint8_t rom_addr, FAR struct pci_resource_s *io,
686+
FAR struct pci_resource_s *mem,
687+
FAR struct pci_resource_s *mem_pref)
683688
{
684689
int bar;
685690
uint32_t orig;
@@ -720,7 +725,7 @@ static void pci_setup_device(FAR struct pci_device_s *dev, int max_bar,
720725

721726
size = pci_size(orig, mask, 0xfffffffe);
722727
flags = PCI_RESOURCE_IO;
723-
res = &dev->bus->ctrl->io;
728+
res = io;
724729
}
725730
else if ((mask & PCI_BASE_ADDRESS_MEM_PREFETCH) &&
726731
pci_resource_size(&dev->bus->ctrl->mem_pref))
@@ -729,15 +734,15 @@ static void pci_setup_device(FAR struct pci_device_s *dev, int max_bar,
729734

730735
size = pci_size(orig, mask, 0xfffffff0);
731736
flags = PCI_RESOURCE_MEM | PCI_RESOURCE_PREFETCH;
732-
res = &dev->bus->ctrl->mem_pref;
737+
res = mem_pref;
733738
}
734739
else
735740
{
736741
/* Non-prefetch MEM */
737742

738743
size = pci_size(orig, mask, 0xfffffff0);
739744
flags = PCI_RESOURCE_MEM;
740-
res = &dev->bus->ctrl->mem;
745+
res = mem;
741746
}
742747

743748
if (size == 0)
@@ -963,6 +968,9 @@ static void pci_scan_bus(FAR struct pci_bus_s *bus)
963968
{
964969
FAR struct pci_device_s *dev;
965970
FAR struct pci_bus_s *child_bus;
971+
struct pci_resource_s mem_pref;
972+
struct pci_resource_s mem;
973+
struct pci_resource_s io;
966974
unsigned int devfn;
967975
uint32_t l;
968976
uint32_t class;
@@ -971,6 +979,10 @@ static void pci_scan_bus(FAR struct pci_bus_s *bus)
971979

972980
pciinfo("pci_scan_bus for bus %d\n", bus->number);
973981

982+
memcpy(&io, &bus->ctrl->io, sizeof(struct pci_resource_s));
983+
memcpy(&mem, &bus->ctrl->mem, sizeof(struct pci_resource_s));
984+
memcpy(&mem_pref, &bus->ctrl->mem_pref, sizeof(struct pci_resource_s));
985+
974986
for (devfn = 0; devfn < 0xff; ++devfn)
975987
{
976988
if (PCI_FUNC(devfn) && !is_multi)
@@ -1027,7 +1039,7 @@ static void pci_scan_bus(FAR struct pci_bus_s *bus)
10271039
goto bad;
10281040
}
10291041

1030-
pci_setup_device(dev, 6, PCI_ROM_ADDRESS);
1042+
pci_setup_device(dev, 6, PCI_ROM_ADDRESS, &io, &mem, &mem_pref);
10311043

10321044
pci_read_config_word(dev, PCI_SUBSYSTEM_ID,
10331045
&dev->subsystem_device);
@@ -1056,7 +1068,7 @@ static void pci_scan_bus(FAR struct pci_bus_s *bus)
10561068
pci_scan_bus(child_bus);
10571069
pci_postsetup_bridge(dev);
10581070

1059-
pci_setup_device(dev, 2, PCI_ROM_ADDRESS1);
1071+
pci_setup_device(dev, 2, PCI_ROM_ADDRESS1, &io, &mem, &mem_pref);
10601072
break;
10611073

10621074
default:

drivers/pci/pci_ecam.c

+42
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ static int pci_ecam_write_io(FAR struct pci_bus_s *bus, uintptr_t addr,
6565
static int pci_ecam_get_irq(FAR struct pci_bus_s *bus, uint32_t devfn,
6666
uint8_t line, uint8_t pin);
6767

68+
static uintptr_t pci_ecam_map(FAR struct pci_bus_s *bus, uintptr_t start,
69+
uintptr_t end);
6870
#ifdef CONFIG_PCI_MSIX
6971
static int pci_ecam_alloc_irq(FAR struct pci_bus_s *bus, uint32_t devfn,
7072
FAR int *irq, int num);
@@ -98,6 +100,7 @@ static const struct pci_ops_s g_pci_ecam_ops =
98100
.read_io = pci_ecam_read_io,
99101
.write_io = pci_ecam_write_io,
100102
.get_irq = pci_ecam_get_irq,
103+
.map = pci_ecam_map,
101104
#ifdef CONFIG_PCI_MSIX
102105
.alloc_irq = pci_ecam_alloc_irq,
103106
.release_irq = pci_ecam_release_irq,
@@ -436,6 +439,45 @@ static int pci_ecam_get_irq(FAR struct pci_bus_s *bus, uint32_t devfn,
436439
return up_get_legacy_irq(devfn, line, pin);
437440
}
438441

442+
/****************************************************************************
443+
* Name: pci_ecam_map
444+
*
445+
* Description:
446+
* Map pci addr to cpu addr.
447+
*
448+
* Input Parameters:
449+
* bus - Bus that PCI device resides
450+
* start - The pci device start pci addr
451+
* end - The pci device end pci addr
452+
*
453+
* Returned Value:
454+
* Return pci device cpu addr
455+
*
456+
****************************************************************************/
457+
458+
static uintptr_t pci_ecam_map(FAR struct pci_bus_s *bus, uintptr_t start,
459+
uintptr_t end)
460+
{
461+
FAR struct pci_controller_s *ctrl = bus->ctrl;
462+
463+
if (start >= ctrl->io.start && end < ctrl->io.end)
464+
{
465+
return start + ctrl->io.offset;
466+
}
467+
468+
if (start >= ctrl->mem.start && end < ctrl->mem.end)
469+
{
470+
return start + ctrl->mem.offset;
471+
}
472+
473+
if (start >= ctrl->mem_pref.start && end < ctrl->mem_pref.end)
474+
{
475+
return start + ctrl->mem_pref.offset;
476+
}
477+
478+
return 0;
479+
}
480+
439481
/****************************************************************************
440482
* Public Functions
441483
****************************************************************************/

include/nuttx/pci/pci.h

+1
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@ struct pci_resource_s
238238
{
239239
uintptr_t start;
240240
uintptr_t end;
241+
uintptr_t offset;
241242
unsigned int flags;
242243
};
243244

0 commit comments

Comments
 (0)