Commit 1f5f6638c063514f193ca447d49fa95f8a574a69

Authored by Markus Armbruster
Committed by Anthony Liguori
1 parent 5607c388

Make first argument of monitor command pci_add work

Simply pass the PCI address through qemu_pci_hot_add_nic() to
pci_nic_init() and through qemu_pci_hot_add_storage() to pci_create().

Before, pci_device_hot_add() passed along the PCI bus to use, and
ignored any user-specified slot.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
hw/pci-hotplug.c
... ... @@ -33,7 +33,8 @@
33 33 #include "virtio-blk.h"
34 34  
35 35 #if defined(TARGET_I386) || defined(TARGET_X86_64)
36   -static PCIDevice *qemu_pci_hot_add_nic(Monitor *mon, const char *opts)
  36 +static PCIDevice *qemu_pci_hot_add_nic(Monitor *mon,
  37 + const char *devaddr, const char *opts)
37 38 {
38 39 int ret;
39 40  
... ... @@ -44,7 +45,7 @@ static PCIDevice *qemu_pci_hot_add_nic(Monitor *mon, const char *opts)
44 45 monitor_printf(mon, "Parameter addr not supported\n");
45 46 return NULL;
46 47 }
47   - return pci_nic_init(&nd_table[ret], "rtl8139", NULL);
  48 + return pci_nic_init(&nd_table[ret], "rtl8139", devaddr);
48 49 }
49 50  
50 51 void drive_hot_add(Monitor *mon, const char *pci_addr, const char *opts)
... ... @@ -89,10 +90,11 @@ void drive_hot_add(Monitor *mon, const char *pci_addr, const char *opts)
89 90 return;
90 91 }
91 92  
92   -static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon, PCIBus *pci_bus,
  93 +static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon,
  94 + const char *devaddr,
93 95 const char *opts)
94 96 {
95   - void *opaque = NULL;
  97 + PCIDevice *dev;
96 98 int type = -1, drive_idx = -1;
97 99 char buf[128];
98 100  
... ... @@ -103,63 +105,62 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon, PCIBus *pci_bus,
103 105 type = IF_VIRTIO;
104 106 } else {
105 107 monitor_printf(mon, "type %s not a hotpluggable PCI device.\n", buf);
106   - goto out;
  108 + return NULL;
107 109 }
108 110 } else {
109 111 monitor_printf(mon, "no if= specified\n");
110   - goto out;
  112 + return NULL;
111 113 }
112 114  
113 115 if (get_param_value(buf, sizeof(buf), "file", opts)) {
114 116 drive_idx = add_init_drive(opts);
115 117 if (drive_idx < 0)
116   - goto out;
  118 + return NULL;
117 119 } else if (type == IF_VIRTIO) {
118 120 monitor_printf(mon, "virtio requires a backing file/device.\n");
119   - goto out;
  121 + return NULL;
120 122 }
121 123  
122 124 switch (type) {
123 125 case IF_SCSI:
124   - opaque = pci_create_simple(pci_bus, -1, "lsi53c895a");
  126 + dev = pci_create("lsi53c895a", devaddr);
125 127 break;
126 128 case IF_VIRTIO:
127   - opaque = pci_create_simple(pci_bus, -1, "virtio-blk-pci");
  129 + dev = pci_create("virtio-blk-pci", devaddr);
128 130 break;
  131 + default:
  132 + dev = NULL;
129 133 }
130   -
131   -out:
132   - return opaque;
  134 + if (dev)
  135 + qdev_init(&dev->qdev);
  136 + return dev;
133 137 }
134 138  
135 139 void pci_device_hot_add(Monitor *mon, const char *pci_addr, const char *type,
136 140 const char *opts)
137 141 {
138 142 PCIDevice *dev = NULL;
139   - PCIBus *pci_bus;
140   - int dom, bus;
141   - unsigned slot;
  143 + const char *devaddr = NULL;
  144 + char buf[32];
142 145  
143   - if (pci_assign_devaddr(pci_addr, &dom, &bus, &slot)) {
  146 + if (!get_param_value(buf, sizeof(buf), "pci_addr", pci_addr)) {
144 147 monitor_printf(mon, "Invalid pci address\n");
145 148 return;
146 149 }
147 150  
148   - pci_bus = pci_find_bus(bus);
149   - if (!pci_bus) {
150   - monitor_printf(mon, "Can't find pci_bus %d\n", bus);
151   - return;
152   - }
  151 + if (strcmp(buf, "auto"))
  152 + devaddr = buf;
153 153  
154 154 if (strcmp(type, "nic") == 0)
155   - dev = qemu_pci_hot_add_nic(mon, opts);
  155 + dev = qemu_pci_hot_add_nic(mon, devaddr, opts);
156 156 else if (strcmp(type, "storage") == 0)
157   - dev = qemu_pci_hot_add_storage(mon, pci_bus, opts);
  157 + dev = qemu_pci_hot_add_storage(mon, devaddr, opts);
158 158 else
159 159 monitor_printf(mon, "invalid type: %s\n", type);
160 160  
161 161 if (dev) {
162   - qemu_system_device_hot_add(bus, PCI_SLOT(dev->devfn), 1);
  162 + qemu_system_device_hot_add(pci_bus_num(dev->bus),
  163 + PCI_SLOT(dev->devfn), 1);
163 164 monitor_printf(mon, "OK domain %d, bus %d, slot %d, function %d\n",
164 165 0, pci_bus_num(dev->bus), PCI_SLOT(dev->devfn),
165 166 PCI_FUNC(dev->devfn));
... ...
hw/pci.c
... ... @@ -237,23 +237,6 @@ int pci_read_devaddr(const char *addr, int *domp, int *busp, unsigned *slotp)
237 237 return pci_parse_devaddr(devaddr, domp, busp, slotp);
238 238 }
239 239  
240   -int pci_assign_devaddr(const char *addr, int *domp, int *busp, unsigned *slotp)
241   -{
242   - char devaddr[32];
243   -
244   - if (!get_param_value(devaddr, sizeof(devaddr), "pci_addr", addr))
245   - return -1;
246   -
247   - if (!strcmp(devaddr, "auto")) {
248   - *domp = *busp = 0;
249   - *slotp = -1;
250   - /* want to support dom/bus auto-assign at some point */
251   - return 0;
252   - }
253   -
254   - return pci_parse_devaddr(devaddr, domp, busp, slotp);
255   -}
256   -
257 240 static PCIBus *pci_get_bus_devfn(int *devfnp, const char *devaddr)
258 241 {
259 242 int dom, bus;
... ... @@ -820,7 +803,7 @@ void pci_info(Monitor *mon)
820 803 pci_for_each_device(0, pci_info_device);
821 804 }
822 805  
823   -static PCIDevice *pci_create(const char *name, const char *devaddr)
  806 +PCIDevice *pci_create(const char *name, const char *devaddr)
824 807 {
825 808 PCIBus *bus;
826 809 int devfn;
... ...
hw/pci.h
... ... @@ -193,7 +193,6 @@ PCIBus *pci_find_bus(int bus_num);
193 193 PCIDevice *pci_find_device(int bus_num, int slot, int function);
194 194  
195 195 int pci_read_devaddr(const char *addr, int *domp, int *busp, unsigned *slotp);
196   -int pci_assign_devaddr(const char *addr, int *domp, int *busp, unsigned *slotp);
197 196  
198 197 void pci_info(Monitor *mon);
199 198 PCIBus *pci_bridge_init(PCIBus *bus, int devfn, uint16_t vid, uint16_t did,
... ... @@ -220,6 +219,7 @@ pci_config_set_class(uint8_t *pci_config, uint16_t val)
220 219 typedef void (*pci_qdev_initfn)(PCIDevice *dev);
221 220 void pci_qdev_register(const char *name, int size, pci_qdev_initfn init);
222 221  
  222 +PCIDevice *pci_create(const char *name, const char *devaddr);
223 223 PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name);
224 224  
225 225 /* lsi53c895a.c */
... ...