Revision 5607c388 hw/pci.c
b/hw/pci.c | ||
---|---|---|
254 | 254 |
return pci_parse_devaddr(devaddr, domp, busp, slotp); |
255 | 255 |
} |
256 | 256 |
|
257 |
static PCIBus *pci_get_bus_devfn(int *devfnp, const char *devaddr) |
|
258 |
{ |
|
259 |
int dom, bus; |
|
260 |
unsigned slot; |
|
261 |
|
|
262 |
if (!devaddr) { |
|
263 |
*devfnp = -1; |
|
264 |
return pci_find_bus(0); |
|
265 |
} |
|
266 |
|
|
267 |
if (pci_parse_devaddr(devaddr, &dom, &bus, &slot) < 0) { |
|
268 |
return NULL; |
|
269 |
} |
|
270 |
|
|
271 |
*devfnp = slot << 3; |
|
272 |
return pci_find_bus(bus); |
|
273 |
} |
|
274 |
|
|
257 | 275 |
/* -1 for devfn means auto assign */ |
258 | 276 |
static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus, |
259 | 277 |
const char *name, int devfn, |
... | ... | |
802 | 820 |
pci_for_each_device(0, pci_info_device); |
803 | 821 |
} |
804 | 822 |
|
823 |
static PCIDevice *pci_create(const char *name, const char *devaddr) |
|
824 |
{ |
|
825 |
PCIBus *bus; |
|
826 |
int devfn; |
|
827 |
DeviceState *dev; |
|
828 |
|
|
829 |
bus = pci_get_bus_devfn(&devfn, devaddr); |
|
830 |
if (!bus) { |
|
831 |
fprintf(stderr, "Invalid PCI device address %s for device %s\n", |
|
832 |
devaddr, name); |
|
833 |
exit(1); |
|
834 |
} |
|
835 |
|
|
836 |
dev = qdev_create(&bus->qbus, name); |
|
837 |
qdev_set_prop_int(dev, "devfn", devfn); |
|
838 |
return (PCIDevice *)dev; |
|
839 |
} |
|
840 |
|
|
805 | 841 |
static const char * const pci_nic_models[] = { |
806 | 842 |
"ne2k_pci", |
807 | 843 |
"i82551", |
... | ... | |
827 | 863 |
}; |
828 | 864 |
|
829 | 865 |
/* Initialize a PCI NIC. */ |
830 |
PCIDevice *pci_nic_init(PCIBus *bus, NICInfo *nd, int devfn,
|
|
831 |
const char *default_model)
|
|
866 |
PCIDevice *pci_nic_init(NICInfo *nd, const char *default_model,
|
|
867 |
const char *default_devaddr)
|
|
832 | 868 |
{ |
869 |
const char *devaddr = nd->devaddr ? nd->devaddr : default_devaddr; |
|
870 |
PCIDevice *pci_dev; |
|
833 | 871 |
DeviceState *dev; |
834 | 872 |
int i; |
835 | 873 |
|
... | ... | |
837 | 875 |
|
838 | 876 |
for (i = 0; pci_nic_models[i]; i++) { |
839 | 877 |
if (strcmp(nd->model, pci_nic_models[i]) == 0) { |
840 |
dev = qdev_create(&bus->qbus, pci_nic_names[i]);
|
|
841 |
qdev_set_prop_int(dev, "devfn", devfn);
|
|
878 |
pci_dev = pci_create(pci_nic_names[i], devaddr);
|
|
879 |
dev = &pci_dev->qdev;
|
|
842 | 880 |
qdev_set_netdev(dev, nd); |
843 | 881 |
qdev_init(dev); |
844 | 882 |
nd->private = dev; |
845 |
return (PCIDevice *)dev;
|
|
883 |
return pci_dev;
|
|
846 | 884 |
} |
847 | 885 |
} |
848 | 886 |
|
Also available in: Unified diff