Refactor linuxGetIOSize and linuxGetSizes. Eliminate the unnecessary

optimization in the search loop.
This commit is contained in:
Ian Romanick 2006-07-06 12:48:51 -07:00
parent 704e645207
commit 8d07ee070e

View File

@ -421,7 +421,7 @@ xf86GetPciHostConfigFromTag(PCITAG Tag)
* *
* Please keep this table in ascending vendor/device order. * Please keep this table in ascending vendor/device order.
*/ */
static struct pciSizes { static const struct pciSizes {
unsigned short vendor, device; unsigned short vendor, device;
unsigned long io_size, mem_size; unsigned long io_size, mem_size;
} pciControllerSizes[] = { } pciControllerSizes[] = {
@ -444,9 +444,12 @@ static struct pciSizes {
}; };
#define NUM_SIZES (sizeof(pciControllerSizes) / sizeof(pciControllerSizes[0])) #define NUM_SIZES (sizeof(pciControllerSizes) / sizeof(pciControllerSizes[0]))
static unsigned long static const struct pciSizes *
linuxGetIOSize(PCITAG Tag) linuxGetSizesStruct(PCITAG Tag)
{ {
static const struct pciSizes default_size = {
0, 0, 1U << 16, (unsigned long)(1ULL << 32)
};
pciConfigPtr pPCI; pciConfigPtr pPCI;
int i; int i;
@ -454,47 +457,31 @@ linuxGetIOSize(PCITAG Tag)
if ((pPCI = xf86GetPciHostConfigFromTag(Tag))) { if ((pPCI = xf86GetPciHostConfigFromTag(Tag))) {
/* Look up vendor/device */ /* Look up vendor/device */
for (i = 0; i < NUM_SIZES; i++) { for (i = 0; i < NUM_SIZES; i++) {
if (pPCI->pci_vendor > pciControllerSizes[i].vendor) if ((pPCI->pci_vendor == pciControllerSizes[i].vendor)
continue; && (pPCI->pci_device == pciControllerSizes[i].device)) {
if (pPCI->pci_vendor < pciControllerSizes[i].vendor) return & pciControllerSizes[i];
break; }
if (pPCI->pci_device > pciControllerSizes[i].device)
continue;
if (pPCI->pci_device < pciControllerSizes[i].device)
break;
return pciControllerSizes[i].io_size;
} }
} }
return 1U << 16; /* Default to 64K */ /* Default to 64KB I/O and 4GB memory. */
return & default_size;
} }
static void static __inline__ unsigned long
linuxGetIOSize(PCITAG Tag)
{
const struct pciSizes * const sizes = linuxGetSizesStruct(Tag);
return sizes->io_size;
}
static __inline__ void
linuxGetSizes(PCITAG Tag, unsigned long *io_size, unsigned long *mem_size) linuxGetSizes(PCITAG Tag, unsigned long *io_size, unsigned long *mem_size)
{ {
pciConfigPtr pPCI; const struct pciSizes * const sizes = linuxGetSizesStruct(Tag);
int i;
*io_size = (1U << 16); /* Default to 64K */ *io_size = sizes->io_size;
*mem_size = (unsigned long)(1ULL << 32); /* Default to 4G */ *mem_size = sizes->mem_size;
/* Find host bridge */
if ((pPCI = xf86GetPciHostConfigFromTag(Tag))) {
/* Look up vendor/device */
for (i = 0; i < NUM_SIZES; i++) {
if (pPCI->pci_vendor > pciControllerSizes[i].vendor)
continue;
if (pPCI->pci_vendor < pciControllerSizes[i].vendor)
break;
if (pPCI->pci_device > pciControllerSizes[i].device)
continue;
if (pPCI->pci_device < pciControllerSizes[i].device)
break;
*io_size = pciControllerSizes[i].io_size;
*mem_size = pciControllerSizes[i].mem_size;
break;
}
}
} }
_X_EXPORT int _X_EXPORT int