summaryrefslogtreecommitdiffstats
path: root/hw/pci.c
diff options
context:
space:
mode:
authorIsaku Yamahata <yamahata@valinux.co.jp>2009-10-30 21:21:14 +0900
committerAnthony Liguori <aliguori@us.ibm.com>2009-11-09 08:43:09 -0600
commit74e32ac1d1fd0d508b1d7497c841cbce70848833 (patch)
treef185bae7814ee28060fabdfe18f8dd527660a1b0 /hw/pci.c
parente822a52a81f16e09b59cfd8126786bff6bde98bd (diff)
downloadhqemu-74e32ac1d1fd0d508b1d7497c841cbce70848833.zip
hqemu-74e32ac1d1fd0d508b1d7497c841cbce70848833.tar.gz
pci: factor out the conversion logic from io port address into pci device.
factor out the logic which converts io port address into pci device and offset in PCI configuration space. Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'hw/pci.c')
-rw-r--r--hw/pci.c32
1 files changed, 18 insertions, 14 deletions
diff --git a/hw/pci.c b/hw/pci.c
index 3e5780a..d0a96c6 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -663,24 +663,33 @@ void pci_default_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int l)
pci_update_mappings(d);
}
+static inline PCIDevice *pci_addr_to_dev(PCIBus *bus, uint32_t addr)
+{
+ uint8_t bus_num = (addr >> 16) & 0xff;
+ uint8_t devfn = (addr >> 8) & 0xff;
+ return pci_find_device(bus, bus_num, PCI_SLOT(devfn), PCI_FUNC(devfn));
+}
+
+static inline int pci_addr_to_config(uint32_t addr)
+{
+ return addr & (PCI_CONFIG_SPACE_SIZE - 1);
+}
+
void pci_data_write(void *opaque, uint32_t addr, uint32_t val, int len)
{
PCIBus *s = opaque;
PCIDevice *pci_dev;
- int config_addr, bus_num;
+ int config_addr;
#if 0
PCI_DPRINTF("pci_data_write: addr=%08x val=%08x len=%d\n",
addr, val, len);
#endif
- bus_num = (addr >> 16) & 0xff;
- s = pci_find_bus(s, bus_num);
- if (!s)
- return;
- pci_dev = s->devices[(addr >> 8) & 0xff];
+ pci_dev = pci_addr_to_dev(s, addr);
if (!pci_dev)
return;
config_addr = addr & 0xff;
+ config_addr = pci_addr_to_config(addr);
PCI_DPRINTF("pci_config_write: %s: addr=%02x val=%08x len=%d\n",
pci_dev->name, config_addr, val, len);
pci_dev->config_write(pci_dev, config_addr, val, len);
@@ -690,16 +699,11 @@ uint32_t pci_data_read(void *opaque, uint32_t addr, int len)
{
PCIBus *s = opaque;
PCIDevice *pci_dev;
- int config_addr, bus_num;
+ int config_addr;
uint32_t val;
- bus_num = (addr >> 16) & 0xff;
- s = pci_find_bus(s, bus_num);
- if (!s)
- goto fail;
- pci_dev = s->devices[(addr >> 8) & 0xff];
+ pci_dev = pci_addr_to_dev(s, addr);
if (!pci_dev) {
- fail:
switch(len) {
case 1:
val = 0xff;
@@ -714,7 +718,7 @@ uint32_t pci_data_read(void *opaque, uint32_t addr, int len)
}
goto the_end;
}
- config_addr = addr & 0xff;
+ config_addr = pci_addr_to_config(addr);
val = pci_dev->config_read(pci_dev, config_addr, len);
PCI_DPRINTF("pci_config_read: %s: addr=%02x val=%08x len=%d\n",
pci_dev->name, config_addr, val, len);
OpenPOWER on IntegriCloud