diff options
Diffstat (limited to 'src/devices/machine/pci.cpp')
-rw-r--r-- | src/devices/machine/pci.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/devices/machine/pci.cpp b/src/devices/machine/pci.cpp index c0f2676ca56..10433028f2a 100644 --- a/src/devices/machine/pci.cpp +++ b/src/devices/machine/pci.cpp @@ -938,6 +938,38 @@ void pci_host_device::config_data_w(offs_t offset, uint32_t data, uint32_t mem_m root_config_write((config_address >> 16) & 0xff, (config_address >> 8) & 0xff, config_address & 0xfc, data, mem_mask); } +uint32_t pci_host_device::config_data_ex_r(offs_t offset, uint32_t mem_mask) +{ + // is this a Type 0 or Type 1 configuration address? (page 31, PCI 2.2 Specification) + if ((config_address & 3) == 0) + { + const int devnum = 31 - count_leading_zeros_32(config_address & 0xfffff800); + return root_config_read(0, devnum << 3, config_address & 0xfc, mem_mask); + } + else if ((config_address & 3) == 1) + return config_address & 0x80000000 ? root_config_read((config_address >> 16) & 0xff, (config_address >> 8) & 0xff, config_address & 0xfc, mem_mask) : 0xffffffff; + + logerror("pci: configuration address format %d unsupported", config_address & 3); + return 0xffffffff; +} + +void pci_host_device::config_data_ex_w(offs_t offset, uint32_t data, uint32_t mem_mask) +{ + // is this a Type 0 or Type 1 configuration address? (page 31, PCI 2.2 Specification) + if ((config_address & 3) == 0) + { + const int devnum = 31 - count_leading_zeros_32(config_address & 0xfffff800); + root_config_write(0, devnum << 3, config_address & 0xfc, data, mem_mask); + } + else if ((config_address & 3) == 1) + { + if (config_address & 0x80000000) + root_config_write((config_address >> 16) & 0xff, (config_address >> 8) & 0xff, config_address & 0xfc, data, mem_mask); + } + else + logerror("pci: configuration address format %d unsupported", config_address & 3); +} + uint32_t pci_host_device::root_config_read(uint8_t bus, uint8_t device, uint16_t reg, uint32_t mem_mask) { if(bus == 0x00) |