[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 29/61] pci: factor out the logic to get pci device f
From: |
Isaku Yamahata |
Subject: |
[Qemu-devel] [PATCH 29/61] pci: factor out the logic to get pci device from address. |
Date: |
Wed, 30 Sep 2009 19:18:05 +0900 |
factor out conversion logic from io port address into bus+dev+func
with bit shift operation and conversion bus+dev+func into pci device.
They will be used later.
This patch also eliminates the logic duplication.
Signed-off-by: Isaku Yamahata <address@hidden>
---
hw/pci.c | 105 ++++++++++++++++++++++++++++++++++---------------------------
1 files changed, 58 insertions(+), 47 deletions(-)
diff --git a/hw/pci.c b/hw/pci.c
index 5d6b3ea..d1745ab 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -587,71 +587,82 @@ static PCIBus *pci_find_bus_from(PCIBus *from, int
bus_num)
return s;
}
-void pci_data_write(void *opaque, uint32_t addr, uint32_t val, int len)
+static PCIDevice *pci_bdf_to_dev(PCIBus *s, int bus_num, unsigned int devfn)
{
- PCIBus *s = opaque;
- PCIDevice *pci_dev;
- int config_addr, bus_num;
-
-#if 0
- PCI_DPRINTF("pci_data_write: addr=%08"PRIx32" val=%08"PRIx32" len=%d\n",
- addr, val, len);
-#endif
- bus_num = (addr >> 16) & 0xff;
s = pci_find_bus_from(s, bus_num);
if (!s)
- return;
- pci_dev = s->devices[(addr >> 8) & 0xff];
+ return NULL;
+
+ return s->devices[devfn];
+}
+
+static void pci_dev_data_write(PCIDevice *pci_dev,
+ uint32_t config_addr, uint32_t val, int len)
+{
+ assert(len == 1 || len == 2 || len == 4);
if (!pci_dev)
return;
- config_addr = addr & 0xff;
- PCI_DPRINTF("pci_config_write: %s: "
- "addr=%02"PRIx32" val=%08"PRI32x" len=%d\n",
- pci_dev->name, config_addr, val, len);
+
+ PCI_DPRINTF("%s: %s: addr=%02"PRIx32" val=%08"PRI32x" len=%d\n",
+ __func__, pci_dev->name, config_addr, val, len);
pci_dev->config_write(pci_dev, config_addr, val, len);
}
-uint32_t pci_data_read(void *opaque, uint32_t addr, int len)
+static uint32_t pci_dev_data_read(PCIDevice *pci_dev,
+ uint32_t config_addr, int len)
{
- PCIBus *s = opaque;
- PCIDevice *pci_dev;
- int config_addr, bus_num;
uint32_t val;
- bus_num = (addr >> 16) & 0xff;
- s = pci_find_bus_from(s, bus_num);
- if (!s)
- goto fail;
- pci_dev = s->devices[(addr >> 8) & 0xff];
+ assert(len == 1 || len == 2 || len == 4);
if (!pci_dev) {
- fail:
- switch(len) {
- case 1:
- val = 0xff;
- break;
- case 2:
- val = 0xffff;
- break;
- default:
- case 4:
- val = 0xffffffff;
- break;
- }
- goto the_end;
+ val = (1 << (len * 8)) - 1;
+ } else {
+ val = pci_dev->config_read(pci_dev, config_addr, len);
+ PCI_DPRINTF("%s: %s: addr=%02"PRIx32" val=%08"PRIx32" len=%d\n",
+ __func__, pci_dev->name, config_addr, val, len);
}
- config_addr = addr & 0xff;
- val = pci_dev->config_read(pci_dev, config_addr, len);
- PCI_DPRINTF("pci_config_read: %s: "
- "addr=%02"PRIx32" val=%08"PRIx32" len=%d\n",
- pci_dev->name, config_addr, val, len);
- the_end:
+
#if 0
- PCI_DPRINTF("pci_data_read: addr=%08"PRIx32" val=%08"PRIx32" len=%d\n",
- addr, val, len);
+ PCI_DPRINTF("%s: addr=%08"PRIx32" val=%08"PRIx32" len=%d\n",
+ __func__, addr, val, len);
#endif
return val;
}
+static void pci_addr_to_dev(PCIBus *s, uint32_t addr,
+ PCIDevice **pci_dev, uint32_t *config_addr)
+{
+ int bus_num = (addr >> 16) & 0xff;
+ unsigned int devfn = (addr >> 8) & 0xff;
+
+ *pci_dev = pci_bdf_to_dev(s, bus_num, devfn);
+ *config_addr = addr & 0xff;
+}
+
+void pci_data_write(void *opaque, uint32_t addr, uint32_t val, int len)
+{
+ PCIBus *s = opaque;
+ PCIDevice *pci_dev;
+ uint32_t config_addr;
+
+#if 0
+ PCI_DPRINTF("pci_data_write: addr=%08"PRIx32" val=%08"PRIx32" len=%d\n",
+ addr, val, len);
+#endif
+
+ pci_addr_to_dev(s, addr, &pci_dev, &config_addr);
+ pci_dev_data_write(pci_dev, config_addr, val, len);
+}
+
+uint32_t pci_data_read(void *opaque, uint32_t addr, int len)
+{
+ PCIBus *s = opaque;
+ PCIDevice *pci_dev;
+ uint32_t config_addr;
+
+ pci_addr_to_dev(s, addr, &pci_dev, &config_addr);
+ return pci_dev_data_read(pci_dev, config_addr, len);
+}
/***********************************************************/
/* generic PCI irq support */
--
1.6.0.2
- [Qemu-devel] [PATCH 57/61] ioapic: add callback when entry is set or ioapic is reset, (continued)
- [Qemu-devel] [PATCH 57/61] ioapic: add callback when entry is set or ioapic is reset, Isaku Yamahata, 2009/09/30
- [Qemu-devel] [PATCH 24/61] pci: define a constant to represent a unmapped bar and use it., Isaku Yamahata, 2009/09/30
- [Qemu-devel] [PATCH 18/61] pc: split out piix specific part from pc.c into pc_piix.c, Isaku Yamahata, 2009/09/30
- [Qemu-devel] [PATCH 42/61] pci/brdige: qdevfy and initialize secondary bus and subordinate bus., Isaku Yamahata, 2009/09/30
- [Qemu-devel] [PATCH 35/61] piix_pci: use pci_swizzle_map_irq_fn()., Isaku Yamahata, 2009/09/30
- [Qemu-devel] [PATCH 34/61] pci: introduce pci_swizzle_map_irq_fn() for interrupt pin swizzle., Isaku Yamahata, 2009/09/30
- [Qemu-devel] [PATCH 60/61] pci: add opaque arg to pci_map_irq_fn., Isaku Yamahata, 2009/09/30
- [Qemu-devel] [PATCH 46/61] pci/bridge: implement intel 82801ba bridge., Isaku Yamahata, 2009/09/30
- [Qemu-devel] [PATCH 40/61] pci: use qdev to get parent bus with PCIBus., Isaku Yamahata, 2009/09/30
- [Qemu-devel] [PATCH 45/61] pci/monitor: print out bridge's filtering values and so on., Isaku Yamahata, 2009/09/30
- [Qemu-devel] [PATCH 29/61] pci: factor out the logic to get pci device from address.,
Isaku Yamahata <=
- [Qemu-devel] [PATCH 08/61] pc: make an unnecessary global variable, pit, local., Isaku Yamahata, 2009/09/30
- [Qemu-devel] [PATCH 52/61] pci: add a hook to replace default pci bus instead of 0 bus., Isaku Yamahata, 2009/09/30
- [Qemu-devel] [PATCH 33/61] pci: use the symbolic constant, PCI_ROM_ADDRESS_ENABLE instead of 1., Isaku Yamahata, 2009/09/30
- [Qemu-devel] [PATCH 48/61] pci id: add subclass codes for serial device., Isaku Yamahata, 2009/09/30
- [Qemu-devel] [PATCH 13/61] pc: split out cpu initialization from pc_init1() into pc_cpus_init()., Isaku Yamahata, 2009/09/30
- [Qemu-devel] [PATCH 10/61] pc: remove a global variable, RTCState *rtc_state., Isaku Yamahata, 2009/09/30
- [Qemu-devel] [PATCH 25/61] pci: use uint64_t for bar addr and size instead of uint32_t., Isaku Yamahata, 2009/09/30
- [Qemu-devel] Re: [PATCH 00/61] Q35 chip set and stuff., Michael S. Tsirkin, 2009/09/30
- Re: [Qemu-devel] [PATCH 00/61] Q35 chip set and stuff., Aurelien Jarno, 2009/09/30