pci: Add root bus parameter to pci_nic_init()

At present, pci_nic_init() and pci_nic_init_nofail() assume that they will
only create a NIC under the primary PCI root.  As we add support for
multiple PCI roots, that may no longer be the case.  This patch adds a root
bus parameter to pci_nic_init() (and updates callers accordingly) to allow
the machine init code using it to specify the right PCI root for NICs
created by old-style -net nic parameters.  NICs created new-style, with
-device can of course be put anywhere.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
David Gibson 2013-06-06 18:48:51 +10:00 committed by Michael S. Tsirkin
parent 85c6e4fabb
commit 29b358f93a
17 changed files with 36 additions and 26 deletions

View File

@ -89,7 +89,7 @@ static void clipper_init(QEMUMachineInitArgs *args)
/* Network setup. e1000 is good enough, failing Tulip support. */ /* Network setup. e1000 is good enough, failing Tulip support. */
for (i = 0; i < nb_nics; i++) { for (i = 0; i < nb_nics; i++) {
pci_nic_init_nofail(&nd_table[i], "e1000", NULL); pci_nic_init_nofail(&nd_table[i], pci_bus, "e1000", NULL);
} }
/* IDE disk setup. */ /* IDE disk setup. */

View File

@ -59,7 +59,7 @@ static void realview_init(QEMUMachineInitArgs *args,
qemu_irq *irqp; qemu_irq *irqp;
qemu_irq pic[64]; qemu_irq pic[64];
qemu_irq mmc_irq[2]; qemu_irq mmc_irq[2];
PCIBus *pci_bus; PCIBus *pci_bus = NULL;
NICInfo *nd; NICInfo *nd;
i2c_bus *i2c; i2c_bus *i2c;
int n; int n;
@ -250,7 +250,9 @@ static void realview_init(QEMUMachineInitArgs *args,
} }
done_nic = 1; done_nic = 1;
} else { } else {
pci_nic_init_nofail(nd, "rtl8139", NULL); if (pci_bus) {
pci_nic_init_nofail(nd, pci_bus, "rtl8139", NULL);
}
} }
} }

View File

@ -244,7 +244,7 @@ static void versatile_init(QEMUMachineInitArgs *args, int board_id)
smc91c111_init(nd, 0x10010000, sic[25]); smc91c111_init(nd, 0x10010000, sic[25]);
done_smc = 1; done_smc = 1;
} else { } else {
pci_nic_init_nofail(nd, "rtl8139", NULL); pci_nic_init_nofail(nd, pci_bus, "rtl8139", NULL);
} }
} }
if (usb_enabled(false)) { if (usb_enabled(false)) {

View File

@ -1310,7 +1310,7 @@ void pc_nic_init(ISABus *isa_bus, PCIBus *pci_bus)
if (!pci_bus || (nd->model && strcmp(nd->model, "ne2k_isa") == 0)) { if (!pci_bus || (nd->model && strcmp(nd->model, "ne2k_isa") == 0)) {
pc_init_ne2k_isa(isa_bus, nd); pc_init_ne2k_isa(isa_bus, nd);
} else { } else {
pci_nic_init_nofail(nd, "e1000", NULL); pci_nic_init_nofail(nd, pci_bus, "e1000", NULL);
} }
} }
} }

View File

@ -231,7 +231,7 @@ static void audio_init (PCIBus *pci_bus)
} }
/* Network support */ /* Network support */
static void network_init (void) static void network_init (PCIBus *pci_bus)
{ {
int i; int i;
@ -244,7 +244,7 @@ static void network_init (void)
default_devaddr = "07"; default_devaddr = "07";
} }
pci_nic_init_nofail(nd, "rtl8139", default_devaddr); pci_nic_init_nofail(nd, pci_bus, "rtl8139", default_devaddr);
} }
} }
@ -393,7 +393,7 @@ static void mips_fulong2e_init(QEMUMachineInitArgs *args)
/* Sound card */ /* Sound card */
audio_init(pci_bus); audio_init(pci_bus);
/* Network card */ /* Network card */
network_init(); network_init(pci_bus);
} }
static QEMUMachine mips_fulong2e_machine = { static QEMUMachine mips_fulong2e_machine = {

View File

@ -468,7 +468,7 @@ static MaltaFPGAState *malta_fpga_init(MemoryRegion *address_space,
} }
/* Network support */ /* Network support */
static void network_init(void) static void network_init(PCIBus *pci_bus)
{ {
int i; int i;
@ -480,7 +480,7 @@ static void network_init(void)
/* The malta board has a PCNet card using PCI SLOT 11 */ /* The malta board has a PCNet card using PCI SLOT 11 */
default_devaddr = "0b"; default_devaddr = "0b";
pci_nic_init_nofail(nd, "pcnet", default_devaddr); pci_nic_init_nofail(nd, pci_bus, "pcnet", default_devaddr);
} }
} }
@ -985,7 +985,7 @@ void mips_malta_init(QEMUMachineInitArgs *args)
fdctrl_init_isa(isa_bus, fd); fdctrl_init_isa(isa_bus, fd);
/* Network card */ /* Network card */
network_init(); network_init(pci_bus);
/* Optional PCI video card */ /* Optional PCI video card */
pci_vga_init(pci_bus); pci_vga_init(pci_bus);

View File

@ -92,7 +92,8 @@ static PCIDevice *qemu_pci_hot_add_nic(Monitor *mon,
monitor_printf(mon, "Parameter addr not supported\n"); monitor_printf(mon, "Parameter addr not supported\n");
return NULL; return NULL;
} }
return pci_nic_init(&nd_table[ret], "rtl8139", devaddr); return pci_nic_init(&nd_table[ret], pci_find_primary_bus(),
"rtl8139", devaddr);
} }
static int scsi_hot_add(Monitor *mon, DeviceState *adapter, static int scsi_hot_add(Monitor *mon, DeviceState *adapter,

View File

@ -1575,7 +1575,8 @@ static const char * const pci_nic_names[] = {
/* Initialize a PCI NIC. */ /* Initialize a PCI NIC. */
/* FIXME callers should check for failure, but don't */ /* FIXME callers should check for failure, but don't */
PCIDevice *pci_nic_init(NICInfo *nd, const char *default_model, PCIDevice *pci_nic_init(NICInfo *nd, PCIBus *rootbus,
const char *default_model,
const char *default_devaddr) const char *default_devaddr)
{ {
const char *devaddr = nd->devaddr ? nd->devaddr : default_devaddr; const char *devaddr = nd->devaddr ? nd->devaddr : default_devaddr;
@ -1589,7 +1590,7 @@ PCIDevice *pci_nic_init(NICInfo *nd, const char *default_model,
if (i < 0) if (i < 0)
return NULL; return NULL;
bus = pci_get_bus_devfn(&devfn, pci_find_primary_bus(), devaddr); bus = pci_get_bus_devfn(&devfn, rootbus, devaddr);
if (!bus) { if (!bus) {
error_report("Invalid PCI device address %s for device %s", error_report("Invalid PCI device address %s for device %s",
devaddr, pci_nic_names[i]); devaddr, pci_nic_names[i]);
@ -1604,7 +1605,8 @@ PCIDevice *pci_nic_init(NICInfo *nd, const char *default_model,
return pci_dev; return pci_dev;
} }
PCIDevice *pci_nic_init_nofail(NICInfo *nd, const char *default_model, PCIDevice *pci_nic_init_nofail(NICInfo *nd, PCIBus *rootbus,
const char *default_model,
const char *default_devaddr) const char *default_devaddr)
{ {
PCIDevice *res; PCIDevice *res;
@ -1612,7 +1614,7 @@ PCIDevice *pci_nic_init_nofail(NICInfo *nd, const char *default_model,
if (qemu_show_nic_models(nd->model, pci_nic_models)) if (qemu_show_nic_models(nd->model, pci_nic_models))
exit(0); exit(0);
res = pci_nic_init(nd, default_model, default_devaddr); res = pci_nic_init(nd, rootbus, default_model, default_devaddr);
if (!res) if (!res)
exit(1); exit(1);
return res; return res;

View File

@ -707,7 +707,7 @@ void ppce500_init(PPCE500Params *params)
if (pci_bus) { if (pci_bus) {
/* Register network interfaces. */ /* Register network interfaces. */
for (i = 0; i < nb_nics; i++) { for (i = 0; i < nb_nics; i++) {
pci_nic_init_nofail(&nd_table[i], "virtio", NULL); pci_nic_init_nofail(&nd_table[i], pci_bus, "virtio", NULL);
} }
} }

View File

@ -375,7 +375,7 @@ static void ppc_core99_init(QEMUMachineInitArgs *args)
escc_mem, 0, memory_region_size(escc_mem)); escc_mem, 0, memory_region_size(escc_mem));
for(i = 0; i < nb_nics; i++) for(i = 0; i < nb_nics; i++)
pci_nic_init_nofail(&nd_table[i], "ne2k_pci", NULL); pci_nic_init_nofail(&nd_table[i], pci_bus, "ne2k_pci", NULL);
ide_drive_get(hd, MAX_IDE_BUS); ide_drive_get(hd, MAX_IDE_BUS);

View File

@ -259,7 +259,7 @@ static void ppc_heathrow_init(QEMUMachineInitArgs *args)
escc_mem, 0, memory_region_size(escc_mem)); escc_mem, 0, memory_region_size(escc_mem));
for(i = 0; i < nb_nics; i++) for(i = 0; i < nb_nics; i++)
pci_nic_init_nofail(&nd_table[i], "ne2k_pci", NULL); pci_nic_init_nofail(&nd_table[i], pci_bus, "ne2k_pci", NULL);
ide_drive_get(hd, MAX_IDE_BUS); ide_drive_get(hd, MAX_IDE_BUS);

View File

@ -243,7 +243,7 @@ static void bamboo_init(QEMUMachineInitArgs *args)
for (i = 0; i < nb_nics; i++) { for (i = 0; i < nb_nics; i++) {
/* There are no PCI NICs on the Bamboo board, but there are /* There are no PCI NICs on the Bamboo board, but there are
* PCI slots, so we can pick whatever default model we want. */ * PCI slots, so we can pick whatever default model we want. */
pci_nic_init_nofail(&nd_table[i], "e1000", NULL); pci_nic_init_nofail(&nd_table[i], pcibus, "e1000", NULL);
} }
} }

View File

@ -628,7 +628,7 @@ static void ppc_prep_init(QEMUMachineInitArgs *args)
isa_ne2000_init(isa_bus, ne2000_io[i], ne2000_irq[i], isa_ne2000_init(isa_bus, ne2000_io[i], ne2000_irq[i],
&nd_table[i]); &nd_table[i]);
} else { } else {
pci_nic_init_nofail(&nd_table[i], "ne2k_pci", NULL); pci_nic_init_nofail(&nd_table[i], pci_bus, "ne2k_pci", NULL);
} }
} }

View File

@ -887,7 +887,7 @@ static void ppc_spapr_init(QEMUMachineInitArgs *args)
if (strcmp(nd->model, "ibmveth") == 0) { if (strcmp(nd->model, "ibmveth") == 0) {
spapr_vlan_create(spapr->vio_bus, nd); spapr_vlan_create(spapr->vio_bus, nd);
} else { } else {
pci_nic_init_nofail(&nd_table[i], nd->model, NULL); pci_nic_init_nofail(&nd_table[i], phb->bus, nd->model, NULL);
} }
} }

View File

@ -236,6 +236,7 @@ static void r2d_init(QEMUMachineInitArgs *args)
DeviceState *dev; DeviceState *dev;
SysBusDevice *busdev; SysBusDevice *busdev;
MemoryRegion *address_space_mem = get_system_memory(); MemoryRegion *address_space_mem = get_system_memory();
PCIBus *pci_bus;
if (cpu_model == NULL) { if (cpu_model == NULL) {
cpu_model = "SH7751R"; cpu_model = "SH7751R";
@ -264,6 +265,7 @@ static void r2d_init(QEMUMachineInitArgs *args)
dev = qdev_create(NULL, "sh_pci"); dev = qdev_create(NULL, "sh_pci");
busdev = SYS_BUS_DEVICE(dev); busdev = SYS_BUS_DEVICE(dev);
qdev_init_nofail(dev); qdev_init_nofail(dev);
pci_bus = PCI_BUS(qdev_get_child_bus(dev, "pci"));
sysbus_mmio_map(busdev, 0, P4ADDR(0x1e200000)); sysbus_mmio_map(busdev, 0, P4ADDR(0x1e200000));
sysbus_mmio_map(busdev, 1, A7ADDR(0x1e200000)); sysbus_mmio_map(busdev, 1, A7ADDR(0x1e200000));
sysbus_connect_irq(busdev, 0, irq[PCI_INTA]); sysbus_connect_irq(busdev, 0, irq[PCI_INTA]);
@ -295,7 +297,8 @@ static void r2d_init(QEMUMachineInitArgs *args)
/* NIC: rtl8139 on-board, and 2 slots. */ /* NIC: rtl8139 on-board, and 2 slots. */
for (i = 0; i < nb_nics; i++) for (i = 0; i < nb_nics; i++)
pci_nic_init_nofail(&nd_table[i], "rtl8139", i==0 ? "2" : NULL); pci_nic_init_nofail(&nd_table[i], pci_bus,
"rtl8139", i==0 ? "2" : NULL);
/* USB keyboard */ /* USB keyboard */
usbdevice_create("keyboard"); usbdevice_create("keyboard");

View File

@ -854,7 +854,7 @@ static void sun4uv_init(MemoryRegion *address_space_mem,
} }
for(i = 0; i < nb_nics; i++) for(i = 0; i < nb_nics; i++)
pci_nic_init_nofail(&nd_table[i], "ne2k_pci", NULL); pci_nic_init_nofail(&nd_table[i], pci_bus, "ne2k_pci", NULL);
ide_drive_get(hd, MAX_IDE_BUS); ide_drive_get(hd, MAX_IDE_BUS);

View File

@ -378,9 +378,11 @@ void pci_device_set_intx_routing_notifier(PCIDevice *dev,
void pci_device_reset(PCIDevice *dev); void pci_device_reset(PCIDevice *dev);
void pci_bus_reset(PCIBus *bus); void pci_bus_reset(PCIBus *bus);
PCIDevice *pci_nic_init(NICInfo *nd, const char *default_model, PCIDevice *pci_nic_init(NICInfo *nd, PCIBus *rootbus,
const char *default_model,
const char *default_devaddr); const char *default_devaddr);
PCIDevice *pci_nic_init_nofail(NICInfo *nd, const char *default_model, PCIDevice *pci_nic_init_nofail(NICInfo *nd, PCIBus *rootbus,
const char *default_model,
const char *default_devaddr); const char *default_devaddr);
PCIDevice *pci_vga_init(PCIBus *bus); PCIDevice *pci_vga_init(PCIBus *bus);