Commit 6b1b92d35b247188139c3dd022fd9521882ef8a9
1 parent
4d6ae674
PCI qdev support
Signed-off-by: Paul Brook <paul@codesourcery.com>
Showing
2 changed files
with
56 additions
and
7 deletions
hw/pci.c
... | ... | @@ -237,13 +237,11 @@ int pci_assign_devaddr(const char *addr, int *domp, int *busp, unsigned *slotp) |
237 | 237 | } |
238 | 238 | |
239 | 239 | /* -1 for devfn means auto assign */ |
240 | -PCIDevice *pci_register_device(PCIBus *bus, const char *name, | |
241 | - int instance_size, int devfn, | |
242 | - PCIConfigReadFunc *config_read, | |
243 | - PCIConfigWriteFunc *config_write) | |
240 | +static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus, | |
241 | + const char *name, int devfn, | |
242 | + PCIConfigReadFunc *config_read, | |
243 | + PCIConfigWriteFunc *config_write) | |
244 | 244 | { |
245 | - PCIDevice *pci_dev; | |
246 | - | |
247 | 245 | if (pci_irq_index >= PCI_DEVICES_MAX) |
248 | 246 | return NULL; |
249 | 247 | |
... | ... | @@ -255,7 +253,6 @@ PCIDevice *pci_register_device(PCIBus *bus, const char *name, |
255 | 253 | return NULL; |
256 | 254 | found: ; |
257 | 255 | } |
258 | - pci_dev = qemu_mallocz(instance_size); | |
259 | 256 | pci_dev->bus = bus; |
260 | 257 | pci_dev->devfn = devfn; |
261 | 258 | pstrcpy(pci_dev->name, sizeof(pci_dev->name), name); |
... | ... | @@ -274,6 +271,18 @@ PCIDevice *pci_register_device(PCIBus *bus, const char *name, |
274 | 271 | return pci_dev; |
275 | 272 | } |
276 | 273 | |
274 | +PCIDevice *pci_register_device(PCIBus *bus, const char *name, | |
275 | + int instance_size, int devfn, | |
276 | + PCIConfigReadFunc *config_read, | |
277 | + PCIConfigWriteFunc *config_write) | |
278 | +{ | |
279 | + PCIDevice *pci_dev; | |
280 | + | |
281 | + pci_dev = qemu_mallocz(instance_size); | |
282 | + pci_dev = do_pci_register_device(pci_dev, bus, name, devfn, | |
283 | + config_read, config_write); | |
284 | + return pci_dev; | |
285 | +} | |
277 | 286 | static target_phys_addr_t pci_to_cpu_addr(target_phys_addr_t addr) |
278 | 287 | { |
279 | 288 | return addr + pci_mem_base; |
... | ... | @@ -891,3 +900,35 @@ PCIBus *pci_bridge_init(PCIBus *bus, int devfn, uint16_t vid, uint16_t did, |
891 | 900 | s->bus = pci_register_secondary_bus(&s->dev, map_irq); |
892 | 901 | return s->bus; |
893 | 902 | } |
903 | + | |
904 | +static void pci_qdev_init(DeviceState *qdev, void *opaque) | |
905 | +{ | |
906 | + PCIDevice *pci_dev = (PCIDevice *)qdev; | |
907 | + pci_qdev_initfn init; | |
908 | + PCIBus *bus; | |
909 | + int devfn; | |
910 | + | |
911 | + init = opaque; | |
912 | + bus = qdev_get_bus(qdev); | |
913 | + devfn = qdev_get_prop_int(qdev, "devfn", -1); | |
914 | + pci_dev = do_pci_register_device(pci_dev, bus, "FIXME", devfn, | |
915 | + NULL, NULL);//FIXME:config_read, config_write); | |
916 | + assert(pci_dev); | |
917 | + init(pci_dev); | |
918 | +} | |
919 | + | |
920 | +void pci_qdev_register(const char *name, int size, pci_qdev_initfn init) | |
921 | +{ | |
922 | + qdev_register(name, size, pci_qdev_init, init); | |
923 | +} | |
924 | + | |
925 | +PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name) | |
926 | +{ | |
927 | + DeviceState *dev; | |
928 | + | |
929 | + dev = qdev_create(bus, name); | |
930 | + qdev_set_prop_int(dev, "devfn", devfn); | |
931 | + qdev_init(dev); | |
932 | + | |
933 | + return (PCIDevice *)dev; | |
934 | +} | ... | ... |
hw/pci.h
... | ... | @@ -3,6 +3,8 @@ |
3 | 3 | |
4 | 4 | #include "qemu-common.h" |
5 | 5 | |
6 | +#include "qdev.h" | |
7 | + | |
6 | 8 | /* PCI includes legacy ISA access. */ |
7 | 9 | #include "isa.h" |
8 | 10 | |
... | ... | @@ -138,6 +140,7 @@ typedef struct PCIIORegion { |
138 | 140 | #define PCI_COMMAND_RESERVED_MASK_HI (PCI_COMMAND_RESERVED >> 8) |
139 | 141 | |
140 | 142 | struct PCIDevice { |
143 | + DeviceState qdev; | |
141 | 144 | /* PCI config space */ |
142 | 145 | uint8_t config[256]; |
143 | 146 | |
... | ... | @@ -217,6 +220,11 @@ pci_config_set_class(uint8_t *pci_config, uint16_t val) |
217 | 220 | cpu_to_le16wu((uint16_t *)&pci_config[PCI_CLASS_DEVICE], val); |
218 | 221 | } |
219 | 222 | |
223 | +typedef void (*pci_qdev_initfn)(PCIDevice *dev); | |
224 | +void pci_qdev_register(const char *name, int size, pci_qdev_initfn init); | |
225 | + | |
226 | +PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name); | |
227 | + | |
220 | 228 | /* lsi53c895a.c */ |
221 | 229 | #define LSI_MAX_DEVS 7 |
222 | 230 | void lsi_scsi_attach(void *opaque, BlockDriverState *bd, int id); | ... | ... |