I suggest to change PCI_ADDR and PCI_DEV to followings
#define PCI_ADDR(SEGBUS, DEV, FN, WHERE) ( \ (((SEGBUS) & 0xFFF) << 20) | \ (((DEV) & 0x1F) << 15) | \ (((FN) & 0x07) << 12) | \ ((WHERE) & 0xFFF))
#define PCI_DEV(SEGBUS, DEV, FN) ( \ (((SEGBUS) & 0xFFF) << 20) | \ (((DEV) & 0x1F) << 15) | \ (((FN) & 0x07) << 12))
So we can put extened reg pos together...
pci read will become
static inline __attribute__((always_inline)) uint32_t pci_read_config32(device_t dev, unsigned where) { unsigned addr; addr = (dev>>4) | (where & 0xff) | ((where & 0xf00)<<16); outl(0x80000000 | (addr & ~3), 0xCF8); return inl(0xCFC); }
static inline __attribute__((always_inline)) uint32_t pci_mmio_read_config32(device_t dev, unsigned where) { unsigned addr; addr = dev | where; return read32(addr); }
static inline __attribute__((always_inline)) uint32_t pci_read_config32x(device_t dev, unsigned where) { if(dev & 0xf0000000) { return pci_mmio_read_config32(dev, where); } else { return pci_read_config32(dev, where); } }
YH