Remove duplicate code. Reduce diff between amd64 and i386.

This commit is contained in:
Jung-uk Kim 2012-12-01 00:56:19 +00:00
parent 5a5d90a268
commit 7609e73ca0
2 changed files with 26 additions and 31 deletions

View File

@ -295,6 +295,13 @@ pcie_cfgregopen(uint64_t base, uint8_t minbus, uint8_t maxbus)
return (1); return (1);
} }
#define PCIE_VADDR(base, reg, bus, slot, func) \
((base) + \
((((bus) & 0xff) << 20) | \
(((slot) & 0x1f) << 15) | \
(((func) & 0x7) << 12) | \
((reg) & 0xfff)))
/* /*
* AMD BIOS And Kernel Developer's Guides for CPU families starting with 10h * AMD BIOS And Kernel Developer's Guides for CPU families starting with 10h
* have a requirement that all accesses to the memory mapped PCI configuration * have a requirement that all accesses to the memory mapped PCI configuration
@ -302,12 +309,6 @@ pcie_cfgregopen(uint64_t base, uint8_t minbus, uint8_t maxbus)
* Since other vendors do not currently have any contradicting requirements * Since other vendors do not currently have any contradicting requirements
* the AMD access pattern is applied universally. * the AMD access pattern is applied universally.
*/ */
#define PCIE_VADDR(base, reg, bus, slot, func) \
((base) + \
((((bus) & 0xff) << 20) | \
(((slot) & 0x1f) << 15) | \
(((func) & 0x7) << 12) | \
((reg) & 0xfff)))
static int static int
pciereg_cfgread(int bus, unsigned slot, unsigned func, unsigned reg, pciereg_cfgread(int bus, unsigned slot, unsigned func, unsigned reg,

View File

@ -610,25 +610,29 @@ pcie_cfgregopen(uint64_t base, uint8_t minbus, uint8_t maxbus)
} }
#endif /* !XEN */ #endif /* !XEN */
#define PCIE_PADDR(bar, reg, bus, slot, func) \ #define PCIE_PADDR(base, reg, bus, slot, func) \
((bar) | \ ((base) + \
(((bus) & 0xff) << 20) | \ ((((bus) & 0xff) << 20) | \
(((slot) & 0x1f) << 15) | \ (((slot) & 0x1f) << 15) | \
(((func) & 0x7) << 12) | \ (((func) & 0x7) << 12) | \
((reg) & 0xfff)) ((reg) & 0xfff)))
/* static __inline vm_offset_t
* Find an element in the cache that matches the physical page desired, or pciereg_findaddr(int bus, unsigned slot, unsigned func, unsigned reg)
* create a new mapping from the least recently used element.
* A very simple LRU algorithm is used here, does it need to be more
* efficient?
*/
static __inline struct pcie_cfg_elem *
pciereg_findelem(vm_paddr_t papage)
{ {
struct pcie_cfg_list *pcielist; struct pcie_cfg_list *pcielist;
struct pcie_cfg_elem *elem; struct pcie_cfg_elem *elem;
vm_paddr_t pa, papage;
pa = PCIE_PADDR(pcie_base, reg, bus, slot, func);
papage = pa & ~PAGE_MASK;
/*
* Find an element in the cache that matches the physical page desired,
* or create a new mapping from the least recently used element.
* A very simple LRU algorithm is used here, does it need to be more
* efficient?
*/
pcielist = &pcie_list[PCPU_GET(cpuid)]; pcielist = &pcie_list[PCPU_GET(cpuid)];
TAILQ_FOREACH(elem, pcielist, elem) { TAILQ_FOREACH(elem, pcielist, elem) {
if (elem->papage == papage) if (elem->papage == papage)
@ -649,7 +653,7 @@ pciereg_findelem(vm_paddr_t papage)
TAILQ_REMOVE(pcielist, elem, elem); TAILQ_REMOVE(pcielist, elem, elem);
TAILQ_INSERT_HEAD(pcielist, elem, elem); TAILQ_INSERT_HEAD(pcielist, elem, elem);
} }
return (elem); return (elem->vapage | (pa & PAGE_MASK));
} }
/* /*
@ -664,9 +668,7 @@ static int
pciereg_cfgread(int bus, unsigned slot, unsigned func, unsigned reg, pciereg_cfgread(int bus, unsigned slot, unsigned func, unsigned reg,
unsigned bytes) unsigned bytes)
{ {
struct pcie_cfg_elem *elem;
vm_offset_t va; vm_offset_t va;
vm_paddr_t pa, papage;
int data = -1; int data = -1;
if (bus < pcie_minbus || bus > pcie_maxbus || slot > PCI_SLOTMAX || if (bus < pcie_minbus || bus > pcie_maxbus || slot > PCI_SLOTMAX ||
@ -674,10 +676,7 @@ pciereg_cfgread(int bus, unsigned slot, unsigned func, unsigned reg,
return (-1); return (-1);
critical_enter(); critical_enter();
pa = PCIE_PADDR(pcie_base, reg, bus, slot, func); va = pciereg_findaddr(bus, slot, func, reg);
papage = pa & ~PAGE_MASK;
elem = pciereg_findelem(papage);
va = elem->vapage | (pa & PAGE_MASK);
switch (bytes) { switch (bytes) {
case 4: case 4:
@ -702,19 +701,14 @@ static void
pciereg_cfgwrite(int bus, unsigned slot, unsigned func, unsigned reg, int data, pciereg_cfgwrite(int bus, unsigned slot, unsigned func, unsigned reg, int data,
unsigned bytes) unsigned bytes)
{ {
struct pcie_cfg_elem *elem;
vm_offset_t va; vm_offset_t va;
vm_paddr_t pa, papage;
if (bus < pcie_minbus || bus > pcie_maxbus || slot > PCI_SLOTMAX || if (bus < pcie_minbus || bus > pcie_maxbus || slot > PCI_SLOTMAX ||
func > PCI_FUNCMAX || reg > PCIE_REGMAX) func > PCI_FUNCMAX || reg > PCIE_REGMAX)
return; return;
critical_enter(); critical_enter();
pa = PCIE_PADDR(pcie_base, reg, bus, slot, func); va = pciereg_findaddr(bus, slot, func, reg);
papage = pa & ~PAGE_MASK;
elem = pciereg_findelem(papage);
va = elem->vapage | (pa & PAGE_MASK);
switch (bytes) { switch (bytes) {
case 4: case 4: