43 |
43 |
|
44 |
44 |
static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent);
|
45 |
45 |
static char *pcibus_get_dev_path(DeviceState *dev);
|
|
46 |
static int pcibus_reset(BusState *qbus);
|
46 |
47 |
|
47 |
48 |
struct BusInfo pci_bus_info = {
|
48 |
49 |
.name = "PCI",
|
49 |
50 |
.size = sizeof(PCIBus),
|
50 |
51 |
.print_dev = pcibus_dev_print,
|
51 |
52 |
.get_dev_path = pcibus_get_dev_path,
|
|
53 |
.reset = pcibus_reset,
|
52 |
54 |
.props = (Property[]) {
|
53 |
55 |
DEFINE_PROP_PCI_DEVFN("addr", PCIDevice, devfn, -1),
|
54 |
56 |
DEFINE_PROP_STRING("romfile", PCIDevice, romfile),
|
... | ... | |
136 |
138 |
static void pci_device_reset(PCIDevice *dev)
|
137 |
139 |
{
|
138 |
140 |
int r;
|
|
141 |
/* TODO: call the below unconditionally once all pci devices
|
|
142 |
* are qdevified */
|
|
143 |
if (dev->qdev.info) {
|
|
144 |
qdev_reset_all(&dev->qdev);
|
|
145 |
}
|
139 |
146 |
|
140 |
147 |
dev->irq_state = 0;
|
141 |
148 |
pci_update_irq_status(dev);
|
... | ... | |
164 |
171 |
pci_update_mappings(dev);
|
165 |
172 |
}
|
166 |
173 |
|
167 |
|
static void pci_bus_reset(void *opaque)
|
|
174 |
/*
|
|
175 |
* Trigger pci bus reset under a given bus.
|
|
176 |
* To be called on RST# assert.
|
|
177 |
*/
|
|
178 |
void pci_bus_reset(PCIBus *bus)
|
168 |
179 |
{
|
169 |
|
PCIBus *bus = opaque;
|
170 |
180 |
int i;
|
171 |
181 |
|
172 |
182 |
for (i = 0; i < bus->nirq; i++) {
|
... | ... | |
179 |
189 |
}
|
180 |
190 |
}
|
181 |
191 |
|
|
192 |
static int pcibus_reset(BusState *qbus)
|
|
193 |
{
|
|
194 |
pci_bus_reset(DO_UPCAST(PCIBus, qbus, qbus));
|
|
195 |
|
|
196 |
/* topology traverse is done by pci_bus_reset().
|
|
197 |
Tell qbus/qdev walker not to traverse the tree */
|
|
198 |
return 1;
|
|
199 |
}
|
|
200 |
|
182 |
201 |
static void pci_host_bus_register(int domain, PCIBus *bus)
|
183 |
202 |
{
|
184 |
203 |
struct PCIHostBus *host;
|
... | ... | |
233 |
252 |
pci_host_bus_register(0, bus); /* for now only pci domain 0 is supported */
|
234 |
253 |
|
235 |
254 |
vmstate_register(NULL, -1, &vmstate_pcibus, bus);
|
236 |
|
qemu_register_reset(pci_bus_reset, bus);
|
237 |
255 |
}
|
238 |
256 |
|
239 |
257 |
PCIBus *pci_bus_new(DeviceState *parent, const char *name, int devfn_min)
|