Statistics
| Branch: | Revision:

root / hw / pci.c @ 49823868

History | View | Annotate | Download (56.5 kB)

1 69b91039 bellard
/*
2 69b91039 bellard
 * QEMU PCI bus manager
3 69b91039 bellard
 *
4 69b91039 bellard
 * Copyright (c) 2004 Fabrice Bellard
5 5fafdf24 ths
 *
6 69b91039 bellard
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 69b91039 bellard
 * of this software and associated documentation files (the "Software"), to deal
8 69b91039 bellard
 * in the Software without restriction, including without limitation the rights
9 69b91039 bellard
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 69b91039 bellard
 * copies of the Software, and to permit persons to whom the Software is
11 69b91039 bellard
 * furnished to do so, subject to the following conditions:
12 69b91039 bellard
 *
13 69b91039 bellard
 * The above copyright notice and this permission notice shall be included in
14 69b91039 bellard
 * all copies or substantial portions of the Software.
15 69b91039 bellard
 *
16 69b91039 bellard
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 69b91039 bellard
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 69b91039 bellard
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 69b91039 bellard
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 69b91039 bellard
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 69b91039 bellard
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 69b91039 bellard
 * THE SOFTWARE.
23 69b91039 bellard
 */
24 87ecb68b pbrook
#include "hw.h"
25 87ecb68b pbrook
#include "pci.h"
26 376253ec aliguori
#include "monitor.h"
27 87ecb68b pbrook
#include "net.h"
28 880345c4 aliguori
#include "sysemu.h"
29 c2039bd0 Anthony Liguori
#include "loader.h"
30 163c8a59 Luiz Capitulino
#include "qemu-objects.h"
31 69b91039 bellard
32 69b91039 bellard
//#define DEBUG_PCI
33 d8d2e079 Isaku Yamahata
#ifdef DEBUG_PCI
34 2e49d64a Isaku Yamahata
# define PCI_DPRINTF(format, ...)       printf(format, ## __VA_ARGS__)
35 d8d2e079 Isaku Yamahata
#else
36 d8d2e079 Isaku Yamahata
# define PCI_DPRINTF(format, ...)       do { } while (0)
37 d8d2e079 Isaku Yamahata
#endif
38 69b91039 bellard
39 30468f78 bellard
struct PCIBus {
40 02e2da45 Paul Brook
    BusState qbus;
41 30468f78 bellard
    int devfn_min;
42 502a5395 pbrook
    pci_set_irq_fn set_irq;
43 d2b59317 pbrook
    pci_map_irq_fn map_irq;
44 ee995ffb Gerd Hoffmann
    pci_hotplug_fn hotplug;
45 87c30546 Isaku Yamahata
    DeviceState *hotplug_qdev;
46 5d4e84c8 Juan Quintela
    void *irq_opaque;
47 30468f78 bellard
    PCIDevice *devices[256];
48 80b3ada7 pbrook
    PCIDevice *parent_dev;
49 2e01c8cf Blue Swirl
    target_phys_addr_t mem_base;
50 e822a52a Isaku Yamahata
51 e822a52a Isaku Yamahata
    QLIST_HEAD(, PCIBus) child; /* this will be replaced by qdev later */
52 e822a52a Isaku Yamahata
    QLIST_ENTRY(PCIBus) sibling;/* this will be replaced by qdev later */
53 e822a52a Isaku Yamahata
54 d2b59317 pbrook
    /* The bus IRQ state is the logical OR of the connected devices.
55 d2b59317 pbrook
       Keep a count of the number of devices with raised IRQs.  */
56 52fc1d83 balrog
    int nirq;
57 10c4c98a Gerd Hoffmann
    int *irq_count;
58 10c4c98a Gerd Hoffmann
};
59 10c4c98a Gerd Hoffmann
60 10c4c98a Gerd Hoffmann
static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent);
61 4f43c1ff Alex Williamson
static char *pcibus_get_dev_path(DeviceState *dev);
62 10c4c98a Gerd Hoffmann
63 10c4c98a Gerd Hoffmann
static struct BusInfo pci_bus_info = {
64 10c4c98a Gerd Hoffmann
    .name       = "PCI",
65 10c4c98a Gerd Hoffmann
    .size       = sizeof(PCIBus),
66 10c4c98a Gerd Hoffmann
    .print_dev  = pcibus_dev_print,
67 4f43c1ff Alex Williamson
    .get_dev_path = pcibus_get_dev_path,
68 ee6847d1 Gerd Hoffmann
    .props      = (Property[]) {
69 54586bd1 Gerd Hoffmann
        DEFINE_PROP_PCI_DEVFN("addr", PCIDevice, devfn, -1),
70 8c52c8f3 Gerd Hoffmann
        DEFINE_PROP_STRING("romfile", PCIDevice, romfile),
71 88169ddf Gerd Hoffmann
        DEFINE_PROP_UINT32("rombar",  PCIDevice, rom_bar, 1),
72 49823868 Isaku Yamahata
        DEFINE_PROP_BIT("multifunction", PCIDevice, cap_present,
73 49823868 Isaku Yamahata
                        QEMU_PCI_CAP_MULTIFUNCTION_BITNR, false),
74 54586bd1 Gerd Hoffmann
        DEFINE_PROP_END_OF_LIST()
75 ee6847d1 Gerd Hoffmann
    }
76 30468f78 bellard
};
77 69b91039 bellard
78 1941d19c bellard
static void pci_update_mappings(PCIDevice *d);
79 d537cf6c pbrook
static void pci_set_irq(void *opaque, int irq_num, int level);
80 8c52c8f3 Gerd Hoffmann
static int pci_add_option_rom(PCIDevice *pdev);
81 230741dc Alex Williamson
static void pci_del_option_rom(PCIDevice *pdev);
82 1941d19c bellard
83 d350d97d aliguori
static uint16_t pci_default_sub_vendor_id = PCI_SUBVENDOR_ID_REDHAT_QUMRANET;
84 d350d97d aliguori
static uint16_t pci_default_sub_device_id = PCI_SUBDEVICE_ID_QEMU;
85 e822a52a Isaku Yamahata
86 e822a52a Isaku Yamahata
struct PCIHostBus {
87 e822a52a Isaku Yamahata
    int domain;
88 e822a52a Isaku Yamahata
    struct PCIBus *bus;
89 e822a52a Isaku Yamahata
    QLIST_ENTRY(PCIHostBus) next;
90 e822a52a Isaku Yamahata
};
91 e822a52a Isaku Yamahata
static QLIST_HEAD(, PCIHostBus) host_buses;
92 30468f78 bellard
93 2d1e9f96 Juan Quintela
static const VMStateDescription vmstate_pcibus = {
94 2d1e9f96 Juan Quintela
    .name = "PCIBUS",
95 2d1e9f96 Juan Quintela
    .version_id = 1,
96 2d1e9f96 Juan Quintela
    .minimum_version_id = 1,
97 2d1e9f96 Juan Quintela
    .minimum_version_id_old = 1,
98 2d1e9f96 Juan Quintela
    .fields      = (VMStateField []) {
99 2d1e9f96 Juan Quintela
        VMSTATE_INT32_EQUAL(nirq, PCIBus),
100 c7bde572 Juan Quintela
        VMSTATE_VARRAY_INT32(irq_count, PCIBus, nirq, 0, vmstate_info_int32, int32_t),
101 2d1e9f96 Juan Quintela
        VMSTATE_END_OF_LIST()
102 52fc1d83 balrog
    }
103 2d1e9f96 Juan Quintela
};
104 52fc1d83 balrog
105 b3b11697 Isaku Yamahata
static int pci_bar(PCIDevice *d, int reg)
106 5330de09 Michael S. Tsirkin
{
107 b3b11697 Isaku Yamahata
    uint8_t type;
108 b3b11697 Isaku Yamahata
109 b3b11697 Isaku Yamahata
    if (reg != PCI_ROM_SLOT)
110 b3b11697 Isaku Yamahata
        return PCI_BASE_ADDRESS_0 + reg * 4;
111 b3b11697 Isaku Yamahata
112 b3b11697 Isaku Yamahata
    type = d->config[PCI_HEADER_TYPE] & ~PCI_HEADER_TYPE_MULTI_FUNCTION;
113 b3b11697 Isaku Yamahata
    return type == PCI_HEADER_TYPE_BRIDGE ? PCI_ROM_ADDRESS1 : PCI_ROM_ADDRESS;
114 5330de09 Michael S. Tsirkin
}
115 5330de09 Michael S. Tsirkin
116 d036bb21 Michael S. Tsirkin
static inline int pci_irq_state(PCIDevice *d, int irq_num)
117 d036bb21 Michael S. Tsirkin
{
118 d036bb21 Michael S. Tsirkin
        return (d->irq_state >> irq_num) & 0x1;
119 d036bb21 Michael S. Tsirkin
}
120 d036bb21 Michael S. Tsirkin
121 d036bb21 Michael S. Tsirkin
static inline void pci_set_irq_state(PCIDevice *d, int irq_num, int level)
122 d036bb21 Michael S. Tsirkin
{
123 d036bb21 Michael S. Tsirkin
        d->irq_state &= ~(0x1 << irq_num);
124 d036bb21 Michael S. Tsirkin
        d->irq_state |= level << irq_num;
125 d036bb21 Michael S. Tsirkin
}
126 d036bb21 Michael S. Tsirkin
127 d036bb21 Michael S. Tsirkin
static void pci_change_irq_level(PCIDevice *pci_dev, int irq_num, int change)
128 d036bb21 Michael S. Tsirkin
{
129 d036bb21 Michael S. Tsirkin
    PCIBus *bus;
130 d036bb21 Michael S. Tsirkin
    for (;;) {
131 d036bb21 Michael S. Tsirkin
        bus = pci_dev->bus;
132 d036bb21 Michael S. Tsirkin
        irq_num = bus->map_irq(pci_dev, irq_num);
133 d036bb21 Michael S. Tsirkin
        if (bus->set_irq)
134 d036bb21 Michael S. Tsirkin
            break;
135 d036bb21 Michael S. Tsirkin
        pci_dev = bus->parent_dev;
136 d036bb21 Michael S. Tsirkin
    }
137 d036bb21 Michael S. Tsirkin
    bus->irq_count[irq_num] += change;
138 d036bb21 Michael S. Tsirkin
    bus->set_irq(bus->irq_opaque, irq_num, bus->irq_count[irq_num] != 0);
139 d036bb21 Michael S. Tsirkin
}
140 d036bb21 Michael S. Tsirkin
141 f9bf77dd Michael S. Tsirkin
/* Update interrupt status bit in config space on interrupt
142 f9bf77dd Michael S. Tsirkin
 * state change. */
143 f9bf77dd Michael S. Tsirkin
static void pci_update_irq_status(PCIDevice *dev)
144 f9bf77dd Michael S. Tsirkin
{
145 f9bf77dd Michael S. Tsirkin
    if (dev->irq_state) {
146 f9bf77dd Michael S. Tsirkin
        dev->config[PCI_STATUS] |= PCI_STATUS_INTERRUPT;
147 f9bf77dd Michael S. Tsirkin
    } else {
148 f9bf77dd Michael S. Tsirkin
        dev->config[PCI_STATUS] &= ~PCI_STATUS_INTERRUPT;
149 f9bf77dd Michael S. Tsirkin
    }
150 f9bf77dd Michael S. Tsirkin
}
151 f9bf77dd Michael S. Tsirkin
152 5330de09 Michael S. Tsirkin
static void pci_device_reset(PCIDevice *dev)
153 5330de09 Michael S. Tsirkin
{
154 c0b1905b Michael S. Tsirkin
    int r;
155 c0b1905b Michael S. Tsirkin
156 d036bb21 Michael S. Tsirkin
    dev->irq_state = 0;
157 f9bf77dd Michael S. Tsirkin
    pci_update_irq_status(dev);
158 c0b1905b Michael S. Tsirkin
    dev->config[PCI_COMMAND] &= ~(PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
159 c0b1905b Michael S. Tsirkin
                                  PCI_COMMAND_MASTER);
160 c0b1905b Michael S. Tsirkin
    dev->config[PCI_CACHE_LINE_SIZE] = 0x0;
161 c0b1905b Michael S. Tsirkin
    dev->config[PCI_INTERRUPT_LINE] = 0x0;
162 c0b1905b Michael S. Tsirkin
    for (r = 0; r < PCI_NUM_REGIONS; ++r) {
163 c0b1905b Michael S. Tsirkin
        if (!dev->io_regions[r].size) {
164 c0b1905b Michael S. Tsirkin
            continue;
165 c0b1905b Michael S. Tsirkin
        }
166 b3b11697 Isaku Yamahata
        pci_set_long(dev->config + pci_bar(dev, r), dev->io_regions[r].type);
167 c0b1905b Michael S. Tsirkin
    }
168 c0b1905b Michael S. Tsirkin
    pci_update_mappings(dev);
169 5330de09 Michael S. Tsirkin
}
170 5330de09 Michael S. Tsirkin
171 6eaa6847 Gleb Natapov
static void pci_bus_reset(void *opaque)
172 6eaa6847 Gleb Natapov
{
173 a60380a5 Juan Quintela
    PCIBus *bus = opaque;
174 6eaa6847 Gleb Natapov
    int i;
175 6eaa6847 Gleb Natapov
176 6eaa6847 Gleb Natapov
    for (i = 0; i < bus->nirq; i++) {
177 6eaa6847 Gleb Natapov
        bus->irq_count[i] = 0;
178 6eaa6847 Gleb Natapov
    }
179 5330de09 Michael S. Tsirkin
    for (i = 0; i < ARRAY_SIZE(bus->devices); ++i) {
180 5330de09 Michael S. Tsirkin
        if (bus->devices[i]) {
181 5330de09 Michael S. Tsirkin
            pci_device_reset(bus->devices[i]);
182 5330de09 Michael S. Tsirkin
        }
183 6eaa6847 Gleb Natapov
    }
184 6eaa6847 Gleb Natapov
}
185 6eaa6847 Gleb Natapov
186 e822a52a Isaku Yamahata
static void pci_host_bus_register(int domain, PCIBus *bus)
187 e822a52a Isaku Yamahata
{
188 e822a52a Isaku Yamahata
    struct PCIHostBus *host;
189 e822a52a Isaku Yamahata
    host = qemu_mallocz(sizeof(*host));
190 e822a52a Isaku Yamahata
    host->domain = domain;
191 e822a52a Isaku Yamahata
    host->bus = bus;
192 e822a52a Isaku Yamahata
    QLIST_INSERT_HEAD(&host_buses, host, next);
193 e822a52a Isaku Yamahata
}
194 e822a52a Isaku Yamahata
195 c469e1dd Isaku Yamahata
PCIBus *pci_find_root_bus(int domain)
196 e822a52a Isaku Yamahata
{
197 e822a52a Isaku Yamahata
    struct PCIHostBus *host;
198 e822a52a Isaku Yamahata
199 e822a52a Isaku Yamahata
    QLIST_FOREACH(host, &host_buses, next) {
200 e822a52a Isaku Yamahata
        if (host->domain == domain) {
201 e822a52a Isaku Yamahata
            return host->bus;
202 e822a52a Isaku Yamahata
        }
203 e822a52a Isaku Yamahata
    }
204 e822a52a Isaku Yamahata
205 e822a52a Isaku Yamahata
    return NULL;
206 e822a52a Isaku Yamahata
}
207 e822a52a Isaku Yamahata
208 e075e788 Isaku Yamahata
int pci_find_domain(const PCIBus *bus)
209 e075e788 Isaku Yamahata
{
210 e075e788 Isaku Yamahata
    PCIDevice *d;
211 e075e788 Isaku Yamahata
    struct PCIHostBus *host;
212 e075e788 Isaku Yamahata
213 e075e788 Isaku Yamahata
    /* obtain root bus */
214 e075e788 Isaku Yamahata
    while ((d = bus->parent_dev) != NULL) {
215 e075e788 Isaku Yamahata
        bus = d->bus;
216 e075e788 Isaku Yamahata
    }
217 e075e788 Isaku Yamahata
218 e075e788 Isaku Yamahata
    QLIST_FOREACH(host, &host_buses, next) {
219 e075e788 Isaku Yamahata
        if (host->bus == bus) {
220 e075e788 Isaku Yamahata
            return host->domain;
221 e075e788 Isaku Yamahata
        }
222 e075e788 Isaku Yamahata
    }
223 e075e788 Isaku Yamahata
224 e075e788 Isaku Yamahata
    abort();    /* should not be reached */
225 e075e788 Isaku Yamahata
    return -1;
226 e075e788 Isaku Yamahata
}
227 e075e788 Isaku Yamahata
228 21eea4b3 Gerd Hoffmann
void pci_bus_new_inplace(PCIBus *bus, DeviceState *parent,
229 21eea4b3 Gerd Hoffmann
                         const char *name, int devfn_min)
230 30468f78 bellard
{
231 21eea4b3 Gerd Hoffmann
    qbus_create_inplace(&bus->qbus, &pci_bus_info, parent, name);
232 6fa84913 Isaku Yamahata
    assert(PCI_FUNC(devfn_min) == 0);
233 502a5395 pbrook
    bus->devfn_min = devfn_min;
234 e822a52a Isaku Yamahata
235 e822a52a Isaku Yamahata
    /* host bridge */
236 e822a52a Isaku Yamahata
    QLIST_INIT(&bus->child);
237 e822a52a Isaku Yamahata
    pci_host_bus_register(0, bus); /* for now only pci domain 0 is supported */
238 e822a52a Isaku Yamahata
239 0be71e32 Alex Williamson
    vmstate_register(NULL, -1, &vmstate_pcibus, bus);
240 a08d4367 Jan Kiszka
    qemu_register_reset(pci_bus_reset, bus);
241 21eea4b3 Gerd Hoffmann
}
242 21eea4b3 Gerd Hoffmann
243 21eea4b3 Gerd Hoffmann
PCIBus *pci_bus_new(DeviceState *parent, const char *name, int devfn_min)
244 21eea4b3 Gerd Hoffmann
{
245 21eea4b3 Gerd Hoffmann
    PCIBus *bus;
246 21eea4b3 Gerd Hoffmann
247 21eea4b3 Gerd Hoffmann
    bus = qemu_mallocz(sizeof(*bus));
248 21eea4b3 Gerd Hoffmann
    bus->qbus.qdev_allocated = 1;
249 21eea4b3 Gerd Hoffmann
    pci_bus_new_inplace(bus, parent, name, devfn_min);
250 21eea4b3 Gerd Hoffmann
    return bus;
251 21eea4b3 Gerd Hoffmann
}
252 21eea4b3 Gerd Hoffmann
253 21eea4b3 Gerd Hoffmann
void pci_bus_irqs(PCIBus *bus, pci_set_irq_fn set_irq, pci_map_irq_fn map_irq,
254 21eea4b3 Gerd Hoffmann
                  void *irq_opaque, int nirq)
255 21eea4b3 Gerd Hoffmann
{
256 21eea4b3 Gerd Hoffmann
    bus->set_irq = set_irq;
257 21eea4b3 Gerd Hoffmann
    bus->map_irq = map_irq;
258 21eea4b3 Gerd Hoffmann
    bus->irq_opaque = irq_opaque;
259 21eea4b3 Gerd Hoffmann
    bus->nirq = nirq;
260 21eea4b3 Gerd Hoffmann
    bus->irq_count = qemu_mallocz(nirq * sizeof(bus->irq_count[0]));
261 21eea4b3 Gerd Hoffmann
}
262 21eea4b3 Gerd Hoffmann
263 87c30546 Isaku Yamahata
void pci_bus_hotplug(PCIBus *bus, pci_hotplug_fn hotplug, DeviceState *qdev)
264 ee995ffb Gerd Hoffmann
{
265 ee995ffb Gerd Hoffmann
    bus->qbus.allow_hotplug = 1;
266 ee995ffb Gerd Hoffmann
    bus->hotplug = hotplug;
267 87c30546 Isaku Yamahata
    bus->hotplug_qdev = qdev;
268 ee995ffb Gerd Hoffmann
}
269 ee995ffb Gerd Hoffmann
270 2e01c8cf Blue Swirl
void pci_bus_set_mem_base(PCIBus *bus, target_phys_addr_t base)
271 2e01c8cf Blue Swirl
{
272 2e01c8cf Blue Swirl
    bus->mem_base = base;
273 2e01c8cf Blue Swirl
}
274 2e01c8cf Blue Swirl
275 21eea4b3 Gerd Hoffmann
PCIBus *pci_register_bus(DeviceState *parent, const char *name,
276 21eea4b3 Gerd Hoffmann
                         pci_set_irq_fn set_irq, pci_map_irq_fn map_irq,
277 21eea4b3 Gerd Hoffmann
                         void *irq_opaque, int devfn_min, int nirq)
278 21eea4b3 Gerd Hoffmann
{
279 21eea4b3 Gerd Hoffmann
    PCIBus *bus;
280 21eea4b3 Gerd Hoffmann
281 21eea4b3 Gerd Hoffmann
    bus = pci_bus_new(parent, name, devfn_min);
282 21eea4b3 Gerd Hoffmann
    pci_bus_irqs(bus, set_irq, map_irq, irq_opaque, nirq);
283 30468f78 bellard
    return bus;
284 30468f78 bellard
}
285 69b91039 bellard
286 e822a52a Isaku Yamahata
static void pci_register_secondary_bus(PCIBus *parent,
287 e822a52a Isaku Yamahata
                                       PCIBus *bus,
288 03587182 Gerd Hoffmann
                                       PCIDevice *dev,
289 03587182 Gerd Hoffmann
                                       pci_map_irq_fn map_irq,
290 03587182 Gerd Hoffmann
                                       const char *name)
291 80b3ada7 pbrook
{
292 03587182 Gerd Hoffmann
    qbus_create_inplace(&bus->qbus, &pci_bus_info, &dev->qdev, name);
293 80b3ada7 pbrook
    bus->map_irq = map_irq;
294 80b3ada7 pbrook
    bus->parent_dev = dev;
295 e822a52a Isaku Yamahata
296 e822a52a Isaku Yamahata
    QLIST_INIT(&bus->child);
297 e822a52a Isaku Yamahata
    QLIST_INSERT_HEAD(&parent->child, bus, sibling);
298 e822a52a Isaku Yamahata
}
299 e822a52a Isaku Yamahata
300 e822a52a Isaku Yamahata
static void pci_unregister_secondary_bus(PCIBus *bus)
301 e822a52a Isaku Yamahata
{
302 e822a52a Isaku Yamahata
    assert(QLIST_EMPTY(&bus->child));
303 e822a52a Isaku Yamahata
    QLIST_REMOVE(bus, sibling);
304 80b3ada7 pbrook
}
305 80b3ada7 pbrook
306 502a5395 pbrook
int pci_bus_num(PCIBus *s)
307 502a5395 pbrook
{
308 e94ff650 Isaku Yamahata
    if (!s->parent_dev)
309 e94ff650 Isaku Yamahata
        return 0;       /* pci host bridge */
310 e94ff650 Isaku Yamahata
    return s->parent_dev->config[PCI_SECONDARY_BUS];
311 502a5395 pbrook
}
312 502a5395 pbrook
313 73534f2f Juan Quintela
static int get_pci_config_device(QEMUFile *f, void *pv, size_t size)
314 30ca2aab bellard
{
315 73534f2f Juan Quintela
    PCIDevice *s = container_of(pv, PCIDevice, config);
316 a9f49946 Isaku Yamahata
    uint8_t *config;
317 52fc1d83 balrog
    int i;
318 52fc1d83 balrog
319 a9f49946 Isaku Yamahata
    assert(size == pci_config_size(s));
320 a9f49946 Isaku Yamahata
    config = qemu_malloc(size);
321 a9f49946 Isaku Yamahata
322 a9f49946 Isaku Yamahata
    qemu_get_buffer(f, config, size);
323 a9f49946 Isaku Yamahata
    for (i = 0; i < size; ++i) {
324 a9f49946 Isaku Yamahata
        if ((config[i] ^ s->config[i]) & s->cmask[i] & ~s->wmask[i]) {
325 a9f49946 Isaku Yamahata
            qemu_free(config);
326 bd4b65ee Michael S. Tsirkin
            return -EINVAL;
327 a9f49946 Isaku Yamahata
        }
328 a9f49946 Isaku Yamahata
    }
329 a9f49946 Isaku Yamahata
    memcpy(s->config, config, size);
330 bd4b65ee Michael S. Tsirkin
331 1941d19c bellard
    pci_update_mappings(s);
332 52fc1d83 balrog
333 a9f49946 Isaku Yamahata
    qemu_free(config);
334 30ca2aab bellard
    return 0;
335 30ca2aab bellard
}
336 30ca2aab bellard
337 73534f2f Juan Quintela
/* just put buffer */
338 84e2e3eb Juan Quintela
static void put_pci_config_device(QEMUFile *f, void *pv, size_t size)
339 73534f2f Juan Quintela
{
340 dbe73d7f Juan Quintela
    const uint8_t **v = pv;
341 a9f49946 Isaku Yamahata
    assert(size == pci_config_size(container_of(pv, PCIDevice, config)));
342 dbe73d7f Juan Quintela
    qemu_put_buffer(f, *v, size);
343 73534f2f Juan Quintela
}
344 73534f2f Juan Quintela
345 73534f2f Juan Quintela
static VMStateInfo vmstate_info_pci_config = {
346 73534f2f Juan Quintela
    .name = "pci config",
347 73534f2f Juan Quintela
    .get  = get_pci_config_device,
348 73534f2f Juan Quintela
    .put  = put_pci_config_device,
349 73534f2f Juan Quintela
};
350 73534f2f Juan Quintela
351 d036bb21 Michael S. Tsirkin
static int get_pci_irq_state(QEMUFile *f, void *pv, size_t size)
352 d036bb21 Michael S. Tsirkin
{
353 c3f8f611 Michael S. Tsirkin
    PCIDevice *s = container_of(pv, PCIDevice, irq_state);
354 d036bb21 Michael S. Tsirkin
    uint32_t irq_state[PCI_NUM_PINS];
355 d036bb21 Michael S. Tsirkin
    int i;
356 d036bb21 Michael S. Tsirkin
    for (i = 0; i < PCI_NUM_PINS; ++i) {
357 d036bb21 Michael S. Tsirkin
        irq_state[i] = qemu_get_be32(f);
358 d036bb21 Michael S. Tsirkin
        if (irq_state[i] != 0x1 && irq_state[i] != 0) {
359 d036bb21 Michael S. Tsirkin
            fprintf(stderr, "irq state %d: must be 0 or 1.\n",
360 d036bb21 Michael S. Tsirkin
                    irq_state[i]);
361 d036bb21 Michael S. Tsirkin
            return -EINVAL;
362 d036bb21 Michael S. Tsirkin
        }
363 d036bb21 Michael S. Tsirkin
    }
364 d036bb21 Michael S. Tsirkin
365 d036bb21 Michael S. Tsirkin
    for (i = 0; i < PCI_NUM_PINS; ++i) {
366 d036bb21 Michael S. Tsirkin
        pci_set_irq_state(s, i, irq_state[i]);
367 d036bb21 Michael S. Tsirkin
    }
368 d036bb21 Michael S. Tsirkin
369 d036bb21 Michael S. Tsirkin
    return 0;
370 d036bb21 Michael S. Tsirkin
}
371 d036bb21 Michael S. Tsirkin
372 d036bb21 Michael S. Tsirkin
static void put_pci_irq_state(QEMUFile *f, void *pv, size_t size)
373 d036bb21 Michael S. Tsirkin
{
374 d036bb21 Michael S. Tsirkin
    int i;
375 c3f8f611 Michael S. Tsirkin
    PCIDevice *s = container_of(pv, PCIDevice, irq_state);
376 d036bb21 Michael S. Tsirkin
377 d036bb21 Michael S. Tsirkin
    for (i = 0; i < PCI_NUM_PINS; ++i) {
378 d036bb21 Michael S. Tsirkin
        qemu_put_be32(f, pci_irq_state(s, i));
379 d036bb21 Michael S. Tsirkin
    }
380 d036bb21 Michael S. Tsirkin
}
381 d036bb21 Michael S. Tsirkin
382 d036bb21 Michael S. Tsirkin
static VMStateInfo vmstate_info_pci_irq_state = {
383 d036bb21 Michael S. Tsirkin
    .name = "pci irq state",
384 d036bb21 Michael S. Tsirkin
    .get  = get_pci_irq_state,
385 d036bb21 Michael S. Tsirkin
    .put  = put_pci_irq_state,
386 d036bb21 Michael S. Tsirkin
};
387 d036bb21 Michael S. Tsirkin
388 73534f2f Juan Quintela
const VMStateDescription vmstate_pci_device = {
389 73534f2f Juan Quintela
    .name = "PCIDevice",
390 73534f2f Juan Quintela
    .version_id = 2,
391 73534f2f Juan Quintela
    .minimum_version_id = 1,
392 73534f2f Juan Quintela
    .minimum_version_id_old = 1,
393 73534f2f Juan Quintela
    .fields      = (VMStateField []) {
394 73534f2f Juan Quintela
        VMSTATE_INT32_LE(version_id, PCIDevice),
395 a9f49946 Isaku Yamahata
        VMSTATE_BUFFER_UNSAFE_INFO(config, PCIDevice, 0,
396 a9f49946 Isaku Yamahata
                                   vmstate_info_pci_config,
397 a9f49946 Isaku Yamahata
                                   PCI_CONFIG_SPACE_SIZE),
398 d036bb21 Michael S. Tsirkin
        VMSTATE_BUFFER_UNSAFE_INFO(irq_state, PCIDevice, 2,
399 d036bb21 Michael S. Tsirkin
                                   vmstate_info_pci_irq_state,
400 d036bb21 Michael S. Tsirkin
                                   PCI_NUM_PINS * sizeof(int32_t)),
401 a9f49946 Isaku Yamahata
        VMSTATE_END_OF_LIST()
402 a9f49946 Isaku Yamahata
    }
403 a9f49946 Isaku Yamahata
};
404 a9f49946 Isaku Yamahata
405 a9f49946 Isaku Yamahata
const VMStateDescription vmstate_pcie_device = {
406 a9f49946 Isaku Yamahata
    .name = "PCIDevice",
407 a9f49946 Isaku Yamahata
    .version_id = 2,
408 a9f49946 Isaku Yamahata
    .minimum_version_id = 1,
409 a9f49946 Isaku Yamahata
    .minimum_version_id_old = 1,
410 a9f49946 Isaku Yamahata
    .fields      = (VMStateField []) {
411 a9f49946 Isaku Yamahata
        VMSTATE_INT32_LE(version_id, PCIDevice),
412 a9f49946 Isaku Yamahata
        VMSTATE_BUFFER_UNSAFE_INFO(config, PCIDevice, 0,
413 a9f49946 Isaku Yamahata
                                   vmstate_info_pci_config,
414 a9f49946 Isaku Yamahata
                                   PCIE_CONFIG_SPACE_SIZE),
415 d036bb21 Michael S. Tsirkin
        VMSTATE_BUFFER_UNSAFE_INFO(irq_state, PCIDevice, 2,
416 d036bb21 Michael S. Tsirkin
                                   vmstate_info_pci_irq_state,
417 d036bb21 Michael S. Tsirkin
                                   PCI_NUM_PINS * sizeof(int32_t)),
418 73534f2f Juan Quintela
        VMSTATE_END_OF_LIST()
419 73534f2f Juan Quintela
    }
420 73534f2f Juan Quintela
};
421 73534f2f Juan Quintela
422 a9f49946 Isaku Yamahata
static inline const VMStateDescription *pci_get_vmstate(PCIDevice *s)
423 a9f49946 Isaku Yamahata
{
424 a9f49946 Isaku Yamahata
    return pci_is_express(s) ? &vmstate_pcie_device : &vmstate_pci_device;
425 a9f49946 Isaku Yamahata
}
426 a9f49946 Isaku Yamahata
427 73534f2f Juan Quintela
void pci_device_save(PCIDevice *s, QEMUFile *f)
428 73534f2f Juan Quintela
{
429 f9bf77dd Michael S. Tsirkin
    /* Clear interrupt status bit: it is implicit
430 f9bf77dd Michael S. Tsirkin
     * in irq_state which we are saving.
431 f9bf77dd Michael S. Tsirkin
     * This makes us compatible with old devices
432 f9bf77dd Michael S. Tsirkin
     * which never set or clear this bit. */
433 f9bf77dd Michael S. Tsirkin
    s->config[PCI_STATUS] &= ~PCI_STATUS_INTERRUPT;
434 a9f49946 Isaku Yamahata
    vmstate_save_state(f, pci_get_vmstate(s), s);
435 f9bf77dd Michael S. Tsirkin
    /* Restore the interrupt status bit. */
436 f9bf77dd Michael S. Tsirkin
    pci_update_irq_status(s);
437 73534f2f Juan Quintela
}
438 73534f2f Juan Quintela
439 73534f2f Juan Quintela
int pci_device_load(PCIDevice *s, QEMUFile *f)
440 73534f2f Juan Quintela
{
441 f9bf77dd Michael S. Tsirkin
    int ret;
442 f9bf77dd Michael S. Tsirkin
    ret = vmstate_load_state(f, pci_get_vmstate(s), s, s->version_id);
443 f9bf77dd Michael S. Tsirkin
    /* Restore the interrupt status bit. */
444 f9bf77dd Michael S. Tsirkin
    pci_update_irq_status(s);
445 f9bf77dd Michael S. Tsirkin
    return ret;
446 73534f2f Juan Quintela
}
447 73534f2f Juan Quintela
448 5e434f4e Isaku Yamahata
static void pci_set_default_subsystem_id(PCIDevice *pci_dev)
449 d350d97d aliguori
{
450 5e434f4e Isaku Yamahata
    pci_set_word(pci_dev->config + PCI_SUBSYSTEM_VENDOR_ID,
451 5e434f4e Isaku Yamahata
                 pci_default_sub_vendor_id);
452 5e434f4e Isaku Yamahata
    pci_set_word(pci_dev->config + PCI_SUBSYSTEM_ID,
453 5e434f4e Isaku Yamahata
                 pci_default_sub_device_id);
454 d350d97d aliguori
}
455 d350d97d aliguori
456 880345c4 aliguori
/*
457 880345c4 aliguori
 * Parse [[<domain>:]<bus>:]<slot>, return -1 on error
458 880345c4 aliguori
 */
459 880345c4 aliguori
static int pci_parse_devaddr(const char *addr, int *domp, int *busp, unsigned *slotp)
460 880345c4 aliguori
{
461 880345c4 aliguori
    const char *p;
462 880345c4 aliguori
    char *e;
463 880345c4 aliguori
    unsigned long val;
464 880345c4 aliguori
    unsigned long dom = 0, bus = 0;
465 880345c4 aliguori
    unsigned slot = 0;
466 880345c4 aliguori
467 880345c4 aliguori
    p = addr;
468 880345c4 aliguori
    val = strtoul(p, &e, 16);
469 880345c4 aliguori
    if (e == p)
470 880345c4 aliguori
        return -1;
471 880345c4 aliguori
    if (*e == ':') {
472 880345c4 aliguori
        bus = val;
473 880345c4 aliguori
        p = e + 1;
474 880345c4 aliguori
        val = strtoul(p, &e, 16);
475 880345c4 aliguori
        if (e == p)
476 880345c4 aliguori
            return -1;
477 880345c4 aliguori
        if (*e == ':') {
478 880345c4 aliguori
            dom = bus;
479 880345c4 aliguori
            bus = val;
480 880345c4 aliguori
            p = e + 1;
481 880345c4 aliguori
            val = strtoul(p, &e, 16);
482 880345c4 aliguori
            if (e == p)
483 880345c4 aliguori
                return -1;
484 880345c4 aliguori
        }
485 880345c4 aliguori
    }
486 880345c4 aliguori
487 880345c4 aliguori
    if (dom > 0xffff || bus > 0xff || val > 0x1f)
488 880345c4 aliguori
        return -1;
489 880345c4 aliguori
490 880345c4 aliguori
    slot = val;
491 880345c4 aliguori
492 880345c4 aliguori
    if (*e)
493 880345c4 aliguori
        return -1;
494 880345c4 aliguori
495 880345c4 aliguori
    /* Note: QEMU doesn't implement domains other than 0 */
496 c469e1dd Isaku Yamahata
    if (!pci_find_bus(pci_find_root_bus(dom), bus))
497 880345c4 aliguori
        return -1;
498 880345c4 aliguori
499 880345c4 aliguori
    *domp = dom;
500 880345c4 aliguori
    *busp = bus;
501 880345c4 aliguori
    *slotp = slot;
502 880345c4 aliguori
    return 0;
503 880345c4 aliguori
}
504 880345c4 aliguori
505 e9283f8b Jan Kiszka
int pci_read_devaddr(Monitor *mon, const char *addr, int *domp, int *busp,
506 e9283f8b Jan Kiszka
                     unsigned *slotp)
507 880345c4 aliguori
{
508 e9283f8b Jan Kiszka
    /* strip legacy tag */
509 e9283f8b Jan Kiszka
    if (!strncmp(addr, "pci_addr=", 9)) {
510 e9283f8b Jan Kiszka
        addr += 9;
511 e9283f8b Jan Kiszka
    }
512 e9283f8b Jan Kiszka
    if (pci_parse_devaddr(addr, domp, busp, slotp)) {
513 e9283f8b Jan Kiszka
        monitor_printf(mon, "Invalid pci address\n");
514 880345c4 aliguori
        return -1;
515 e9283f8b Jan Kiszka
    }
516 e9283f8b Jan Kiszka
    return 0;
517 880345c4 aliguori
}
518 880345c4 aliguori
519 49bd1458 Markus Armbruster
PCIBus *pci_get_bus_devfn(int *devfnp, const char *devaddr)
520 5607c388 Markus Armbruster
{
521 5607c388 Markus Armbruster
    int dom, bus;
522 5607c388 Markus Armbruster
    unsigned slot;
523 5607c388 Markus Armbruster
524 5607c388 Markus Armbruster
    if (!devaddr) {
525 5607c388 Markus Armbruster
        *devfnp = -1;
526 c469e1dd Isaku Yamahata
        return pci_find_bus(pci_find_root_bus(0), 0);
527 5607c388 Markus Armbruster
    }
528 5607c388 Markus Armbruster
529 5607c388 Markus Armbruster
    if (pci_parse_devaddr(devaddr, &dom, &bus, &slot) < 0) {
530 5607c388 Markus Armbruster
        return NULL;
531 5607c388 Markus Armbruster
    }
532 5607c388 Markus Armbruster
533 5607c388 Markus Armbruster
    *devfnp = slot << 3;
534 e075e788 Isaku Yamahata
    return pci_find_bus(pci_find_root_bus(dom), bus);
535 5607c388 Markus Armbruster
}
536 5607c388 Markus Armbruster
537 bd4b65ee Michael S. Tsirkin
static void pci_init_cmask(PCIDevice *dev)
538 bd4b65ee Michael S. Tsirkin
{
539 bd4b65ee Michael S. Tsirkin
    pci_set_word(dev->cmask + PCI_VENDOR_ID, 0xffff);
540 bd4b65ee Michael S. Tsirkin
    pci_set_word(dev->cmask + PCI_DEVICE_ID, 0xffff);
541 bd4b65ee Michael S. Tsirkin
    dev->cmask[PCI_STATUS] = PCI_STATUS_CAP_LIST;
542 bd4b65ee Michael S. Tsirkin
    dev->cmask[PCI_REVISION_ID] = 0xff;
543 bd4b65ee Michael S. Tsirkin
    dev->cmask[PCI_CLASS_PROG] = 0xff;
544 bd4b65ee Michael S. Tsirkin
    pci_set_word(dev->cmask + PCI_CLASS_DEVICE, 0xffff);
545 bd4b65ee Michael S. Tsirkin
    dev->cmask[PCI_HEADER_TYPE] = 0xff;
546 bd4b65ee Michael S. Tsirkin
    dev->cmask[PCI_CAPABILITY_LIST] = 0xff;
547 bd4b65ee Michael S. Tsirkin
}
548 bd4b65ee Michael S. Tsirkin
549 b7ee1603 Michael S. Tsirkin
static void pci_init_wmask(PCIDevice *dev)
550 b7ee1603 Michael S. Tsirkin
{
551 a9f49946 Isaku Yamahata
    int config_size = pci_config_size(dev);
552 a9f49946 Isaku Yamahata
553 b7ee1603 Michael S. Tsirkin
    dev->wmask[PCI_CACHE_LINE_SIZE] = 0xff;
554 b7ee1603 Michael S. Tsirkin
    dev->wmask[PCI_INTERRUPT_LINE] = 0xff;
555 67a51b48 Isaku Yamahata
    pci_set_word(dev->wmask + PCI_COMMAND,
556 a7b15a5c Michael S. Tsirkin
                 PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER |
557 a7b15a5c Michael S. Tsirkin
                 PCI_COMMAND_INTX_DISABLE);
558 3e21ffc9 Isaku Yamahata
559 3e21ffc9 Isaku Yamahata
    memset(dev->wmask + PCI_CONFIG_HEADER_SIZE, 0xff,
560 3e21ffc9 Isaku Yamahata
           config_size - PCI_CONFIG_HEADER_SIZE);
561 b7ee1603 Michael S. Tsirkin
}
562 b7ee1603 Michael S. Tsirkin
563 fb231628 Isaku Yamahata
static void pci_init_wmask_bridge(PCIDevice *d)
564 fb231628 Isaku Yamahata
{
565 fb231628 Isaku Yamahata
    /* PCI_PRIMARY_BUS, PCI_SECONDARY_BUS, PCI_SUBORDINATE_BUS and
566 fb231628 Isaku Yamahata
       PCI_SEC_LETENCY_TIMER */
567 fb231628 Isaku Yamahata
    memset(d->wmask + PCI_PRIMARY_BUS, 0xff, 4);
568 fb231628 Isaku Yamahata
569 fb231628 Isaku Yamahata
    /* base and limit */
570 fb231628 Isaku Yamahata
    d->wmask[PCI_IO_BASE] = PCI_IO_RANGE_MASK & 0xff;
571 fb231628 Isaku Yamahata
    d->wmask[PCI_IO_LIMIT] = PCI_IO_RANGE_MASK & 0xff;
572 fb231628 Isaku Yamahata
    pci_set_word(d->wmask + PCI_MEMORY_BASE,
573 fb231628 Isaku Yamahata
                 PCI_MEMORY_RANGE_MASK & 0xffff);
574 fb231628 Isaku Yamahata
    pci_set_word(d->wmask + PCI_MEMORY_LIMIT,
575 fb231628 Isaku Yamahata
                 PCI_MEMORY_RANGE_MASK & 0xffff);
576 fb231628 Isaku Yamahata
    pci_set_word(d->wmask + PCI_PREF_MEMORY_BASE,
577 fb231628 Isaku Yamahata
                 PCI_PREF_RANGE_MASK & 0xffff);
578 fb231628 Isaku Yamahata
    pci_set_word(d->wmask + PCI_PREF_MEMORY_LIMIT,
579 fb231628 Isaku Yamahata
                 PCI_PREF_RANGE_MASK & 0xffff);
580 fb231628 Isaku Yamahata
581 fb231628 Isaku Yamahata
    /* PCI_PREF_BASE_UPPER32 and PCI_PREF_LIMIT_UPPER32 */
582 fb231628 Isaku Yamahata
    memset(d->wmask + PCI_PREF_BASE_UPPER32, 0xff, 8);
583 fb231628 Isaku Yamahata
584 fb231628 Isaku Yamahata
    pci_set_word(d->wmask + PCI_BRIDGE_CONTROL, 0xffff);
585 fb231628 Isaku Yamahata
}
586 fb231628 Isaku Yamahata
587 a9f49946 Isaku Yamahata
static void pci_config_alloc(PCIDevice *pci_dev)
588 a9f49946 Isaku Yamahata
{
589 a9f49946 Isaku Yamahata
    int config_size = pci_config_size(pci_dev);
590 a9f49946 Isaku Yamahata
591 a9f49946 Isaku Yamahata
    pci_dev->config = qemu_mallocz(config_size);
592 a9f49946 Isaku Yamahata
    pci_dev->cmask = qemu_mallocz(config_size);
593 a9f49946 Isaku Yamahata
    pci_dev->wmask = qemu_mallocz(config_size);
594 a9f49946 Isaku Yamahata
    pci_dev->used = qemu_mallocz(config_size);
595 a9f49946 Isaku Yamahata
}
596 a9f49946 Isaku Yamahata
597 a9f49946 Isaku Yamahata
static void pci_config_free(PCIDevice *pci_dev)
598 a9f49946 Isaku Yamahata
{
599 a9f49946 Isaku Yamahata
    qemu_free(pci_dev->config);
600 a9f49946 Isaku Yamahata
    qemu_free(pci_dev->cmask);
601 a9f49946 Isaku Yamahata
    qemu_free(pci_dev->wmask);
602 a9f49946 Isaku Yamahata
    qemu_free(pci_dev->used);
603 a9f49946 Isaku Yamahata
}
604 a9f49946 Isaku Yamahata
605 69b91039 bellard
/* -1 for devfn means auto assign */
606 6b1b92d3 Paul Brook
static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus,
607 6b1b92d3 Paul Brook
                                         const char *name, int devfn,
608 6b1b92d3 Paul Brook
                                         PCIConfigReadFunc *config_read,
609 fb231628 Isaku Yamahata
                                         PCIConfigWriteFunc *config_write,
610 e327e323 Isaku Yamahata
                                         bool is_bridge)
611 69b91039 bellard
{
612 69b91039 bellard
    if (devfn < 0) {
613 b47b0706 Isaku Yamahata
        for(devfn = bus->devfn_min ; devfn < ARRAY_SIZE(bus->devices);
614 6fa84913 Isaku Yamahata
            devfn += PCI_FUNC_MAX) {
615 30468f78 bellard
            if (!bus->devices[devfn])
616 69b91039 bellard
                goto found;
617 69b91039 bellard
        }
618 3709c1b7 Daniel P. Berrange
        error_report("PCI: no slot/function available for %s, all in use", name);
619 09e3acc6 Gerd Hoffmann
        return NULL;
620 69b91039 bellard
    found: ;
621 07b7d053 Markus Armbruster
    } else if (bus->devices[devfn]) {
622 3709c1b7 Daniel P. Berrange
        error_report("PCI: slot %d function %d not available for %s, in use by %s",
623 3709c1b7 Daniel P. Berrange
                     PCI_SLOT(devfn), PCI_FUNC(devfn), name, bus->devices[devfn]->name);
624 09e3acc6 Gerd Hoffmann
        return NULL;
625 69b91039 bellard
    }
626 30468f78 bellard
    pci_dev->bus = bus;
627 69b91039 bellard
    pci_dev->devfn = devfn;
628 69b91039 bellard
    pstrcpy(pci_dev->name, sizeof(pci_dev->name), name);
629 d036bb21 Michael S. Tsirkin
    pci_dev->irq_state = 0;
630 a9f49946 Isaku Yamahata
    pci_config_alloc(pci_dev);
631 fb231628 Isaku Yamahata
632 e327e323 Isaku Yamahata
    if (!is_bridge) {
633 fb231628 Isaku Yamahata
        pci_set_default_subsystem_id(pci_dev);
634 fb231628 Isaku Yamahata
    }
635 bd4b65ee Michael S. Tsirkin
    pci_init_cmask(pci_dev);
636 b7ee1603 Michael S. Tsirkin
    pci_init_wmask(pci_dev);
637 e327e323 Isaku Yamahata
    if (is_bridge) {
638 fb231628 Isaku Yamahata
        pci_init_wmask_bridge(pci_dev);
639 fb231628 Isaku Yamahata
    }
640 0ac32c83 bellard
641 0ac32c83 bellard
    if (!config_read)
642 0ac32c83 bellard
        config_read = pci_default_read_config;
643 0ac32c83 bellard
    if (!config_write)
644 0ac32c83 bellard
        config_write = pci_default_write_config;
645 69b91039 bellard
    pci_dev->config_read = config_read;
646 69b91039 bellard
    pci_dev->config_write = config_write;
647 30468f78 bellard
    bus->devices[devfn] = pci_dev;
648 e369cad7 Isaku Yamahata
    pci_dev->irq = qemu_allocate_irqs(pci_set_irq, pci_dev, PCI_NUM_PINS);
649 f16c4abf Juan Quintela
    pci_dev->version_id = 2; /* Current pci device vmstate version */
650 69b91039 bellard
    return pci_dev;
651 69b91039 bellard
}
652 69b91039 bellard
653 925fe64a Alex Williamson
static void do_pci_unregister_device(PCIDevice *pci_dev)
654 925fe64a Alex Williamson
{
655 925fe64a Alex Williamson
    qemu_free_irqs(pci_dev->irq);
656 925fe64a Alex Williamson
    pci_dev->bus->devices[pci_dev->devfn] = NULL;
657 925fe64a Alex Williamson
    pci_config_free(pci_dev);
658 925fe64a Alex Williamson
}
659 925fe64a Alex Williamson
660 6b1b92d3 Paul Brook
PCIDevice *pci_register_device(PCIBus *bus, const char *name,
661 6b1b92d3 Paul Brook
                               int instance_size, int devfn,
662 6b1b92d3 Paul Brook
                               PCIConfigReadFunc *config_read,
663 6b1b92d3 Paul Brook
                               PCIConfigWriteFunc *config_write)
664 6b1b92d3 Paul Brook
{
665 6b1b92d3 Paul Brook
    PCIDevice *pci_dev;
666 6b1b92d3 Paul Brook
667 6b1b92d3 Paul Brook
    pci_dev = qemu_mallocz(instance_size);
668 6b1b92d3 Paul Brook
    pci_dev = do_pci_register_device(pci_dev, bus, name, devfn,
669 fb231628 Isaku Yamahata
                                     config_read, config_write,
670 fb231628 Isaku Yamahata
                                     PCI_HEADER_TYPE_NORMAL);
671 09e3acc6 Gerd Hoffmann
    if (pci_dev == NULL) {
672 09e3acc6 Gerd Hoffmann
        hw_error("PCI: can't register device\n");
673 09e3acc6 Gerd Hoffmann
    }
674 6b1b92d3 Paul Brook
    return pci_dev;
675 6b1b92d3 Paul Brook
}
676 2e01c8cf Blue Swirl
677 2e01c8cf Blue Swirl
static target_phys_addr_t pci_to_cpu_addr(PCIBus *bus,
678 2e01c8cf Blue Swirl
                                          target_phys_addr_t addr)
679 5851e08c aliguori
{
680 2e01c8cf Blue Swirl
    return addr + bus->mem_base;
681 5851e08c aliguori
}
682 5851e08c aliguori
683 5851e08c aliguori
static void pci_unregister_io_regions(PCIDevice *pci_dev)
684 5851e08c aliguori
{
685 5851e08c aliguori
    PCIIORegion *r;
686 5851e08c aliguori
    int i;
687 5851e08c aliguori
688 5851e08c aliguori
    for(i = 0; i < PCI_NUM_REGIONS; i++) {
689 5851e08c aliguori
        r = &pci_dev->io_regions[i];
690 182f9c8a Isaku Yamahata
        if (!r->size || r->addr == PCI_BAR_UNMAPPED)
691 5851e08c aliguori
            continue;
692 0392a017 Isaku Yamahata
        if (r->type == PCI_BASE_ADDRESS_SPACE_IO) {
693 a0c7a97e Isaku Yamahata
            isa_unassign_ioport(r->addr, r->filtered_size);
694 5851e08c aliguori
        } else {
695 2e01c8cf Blue Swirl
            cpu_register_physical_memory(pci_to_cpu_addr(pci_dev->bus,
696 2e01c8cf Blue Swirl
                                                         r->addr),
697 2e01c8cf Blue Swirl
                                         r->filtered_size,
698 2e01c8cf Blue Swirl
                                         IO_MEM_UNASSIGNED);
699 5851e08c aliguori
        }
700 5851e08c aliguori
    }
701 5851e08c aliguori
}
702 5851e08c aliguori
703 a36a344d Gerd Hoffmann
static int pci_unregister_device(DeviceState *dev)
704 5851e08c aliguori
{
705 a36a344d Gerd Hoffmann
    PCIDevice *pci_dev = DO_UPCAST(PCIDevice, qdev, dev);
706 e3936fa5 Gerd Hoffmann
    PCIDeviceInfo *info = DO_UPCAST(PCIDeviceInfo, qdev, dev->info);
707 5851e08c aliguori
    int ret = 0;
708 5851e08c aliguori
709 e3936fa5 Gerd Hoffmann
    if (info->exit)
710 e3936fa5 Gerd Hoffmann
        ret = info->exit(pci_dev);
711 5851e08c aliguori
    if (ret)
712 5851e08c aliguori
        return ret;
713 5851e08c aliguori
714 5851e08c aliguori
    pci_unregister_io_regions(pci_dev);
715 230741dc Alex Williamson
    pci_del_option_rom(pci_dev);
716 925fe64a Alex Williamson
    do_pci_unregister_device(pci_dev);
717 5851e08c aliguori
    return 0;
718 5851e08c aliguori
}
719 5851e08c aliguori
720 28c2c264 Avi Kivity
void pci_register_bar(PCIDevice *pci_dev, int region_num,
721 6e355d90 Isaku Yamahata
                            pcibus_t size, int type,
722 69b91039 bellard
                            PCIMapIORegionFunc *map_func)
723 69b91039 bellard
{
724 69b91039 bellard
    PCIIORegion *r;
725 d7ce493a pbrook
    uint32_t addr;
726 6e355d90 Isaku Yamahata
    pcibus_t wmask;
727 69b91039 bellard
728 8a8696a3 bellard
    if ((unsigned int)region_num >= PCI_NUM_REGIONS)
729 69b91039 bellard
        return;
730 a4c20c6a aliguori
731 a4c20c6a aliguori
    if (size & (size-1)) {
732 a4c20c6a aliguori
        fprintf(stderr, "ERROR: PCI region size must be pow2 "
733 89e8b13c Isaku Yamahata
                    "type=0x%x, size=0x%"FMT_PCIBUS"\n", type, size);
734 a4c20c6a aliguori
        exit(1);
735 a4c20c6a aliguori
    }
736 a4c20c6a aliguori
737 69b91039 bellard
    r = &pci_dev->io_regions[region_num];
738 182f9c8a Isaku Yamahata
    r->addr = PCI_BAR_UNMAPPED;
739 69b91039 bellard
    r->size = size;
740 a0c7a97e Isaku Yamahata
    r->filtered_size = size;
741 69b91039 bellard
    r->type = type;
742 69b91039 bellard
    r->map_func = map_func;
743 b7ee1603 Michael S. Tsirkin
744 b7ee1603 Michael S. Tsirkin
    wmask = ~(size - 1);
745 b3b11697 Isaku Yamahata
    addr = pci_bar(pci_dev, region_num);
746 d7ce493a pbrook
    if (region_num == PCI_ROM_SLOT) {
747 b7ee1603 Michael S. Tsirkin
        /* ROM enable bit is writeable */
748 5330de09 Michael S. Tsirkin
        wmask |= PCI_ROM_ADDRESS_ENABLE;
749 d7ce493a pbrook
    }
750 b0ff8eb2 Isaku Yamahata
    pci_set_long(pci_dev->config + addr, type);
751 14421258 Isaku Yamahata
    if (!(r->type & PCI_BASE_ADDRESS_SPACE_IO) &&
752 14421258 Isaku Yamahata
        r->type & PCI_BASE_ADDRESS_MEM_TYPE_64) {
753 14421258 Isaku Yamahata
        pci_set_quad(pci_dev->wmask + addr, wmask);
754 14421258 Isaku Yamahata
        pci_set_quad(pci_dev->cmask + addr, ~0ULL);
755 14421258 Isaku Yamahata
    } else {
756 14421258 Isaku Yamahata
        pci_set_long(pci_dev->wmask + addr, wmask & 0xffffffff);
757 14421258 Isaku Yamahata
        pci_set_long(pci_dev->cmask + addr, 0xffffffff);
758 14421258 Isaku Yamahata
    }
759 69b91039 bellard
}
760 69b91039 bellard
761 a0c7a97e Isaku Yamahata
static uint32_t pci_config_get_io_base(PCIDevice *d,
762 a0c7a97e Isaku Yamahata
                                       uint32_t base, uint32_t base_upper16)
763 a0c7a97e Isaku Yamahata
{
764 a0c7a97e Isaku Yamahata
    uint32_t val;
765 a0c7a97e Isaku Yamahata
766 a0c7a97e Isaku Yamahata
    val = ((uint32_t)d->config[base] & PCI_IO_RANGE_MASK) << 8;
767 a0c7a97e Isaku Yamahata
    if (d->config[base] & PCI_IO_RANGE_TYPE_32) {
768 10c9c329 Isaku Yamahata
        val |= (uint32_t)pci_get_word(d->config + base_upper16) << 16;
769 a0c7a97e Isaku Yamahata
    }
770 a0c7a97e Isaku Yamahata
    return val;
771 a0c7a97e Isaku Yamahata
}
772 a0c7a97e Isaku Yamahata
773 d46636b8 Isaku Yamahata
static pcibus_t pci_config_get_memory_base(PCIDevice *d, uint32_t base)
774 a0c7a97e Isaku Yamahata
{
775 d46636b8 Isaku Yamahata
    return ((pcibus_t)pci_get_word(d->config + base) & PCI_MEMORY_RANGE_MASK)
776 a0c7a97e Isaku Yamahata
        << 16;
777 a0c7a97e Isaku Yamahata
}
778 a0c7a97e Isaku Yamahata
779 d46636b8 Isaku Yamahata
static pcibus_t pci_config_get_pref_base(PCIDevice *d,
780 a0c7a97e Isaku Yamahata
                                         uint32_t base, uint32_t upper)
781 a0c7a97e Isaku Yamahata
{
782 d46636b8 Isaku Yamahata
    pcibus_t tmp;
783 d46636b8 Isaku Yamahata
    pcibus_t val;
784 d46636b8 Isaku Yamahata
785 d46636b8 Isaku Yamahata
    tmp = (pcibus_t)pci_get_word(d->config + base);
786 d46636b8 Isaku Yamahata
    val = (tmp & PCI_PREF_RANGE_MASK) << 16;
787 d46636b8 Isaku Yamahata
    if (tmp & PCI_PREF_RANGE_TYPE_64) {
788 d46636b8 Isaku Yamahata
        val |= (pcibus_t)pci_get_long(d->config + upper) << 32;
789 d46636b8 Isaku Yamahata
    }
790 a0c7a97e Isaku Yamahata
    return val;
791 a0c7a97e Isaku Yamahata
}
792 a0c7a97e Isaku Yamahata
793 a0c7a97e Isaku Yamahata
static pcibus_t pci_bridge_get_base(PCIDevice *bridge, uint8_t type)
794 a0c7a97e Isaku Yamahata
{
795 a0c7a97e Isaku Yamahata
    pcibus_t base;
796 a0c7a97e Isaku Yamahata
    if (type & PCI_BASE_ADDRESS_SPACE_IO) {
797 a0c7a97e Isaku Yamahata
        base = pci_config_get_io_base(bridge,
798 a0c7a97e Isaku Yamahata
                                      PCI_IO_BASE, PCI_IO_BASE_UPPER16);
799 a0c7a97e Isaku Yamahata
    } else {
800 a0c7a97e Isaku Yamahata
        if (type & PCI_BASE_ADDRESS_MEM_PREFETCH) {
801 a0c7a97e Isaku Yamahata
            base = pci_config_get_pref_base(
802 a0c7a97e Isaku Yamahata
                bridge, PCI_PREF_MEMORY_BASE, PCI_PREF_BASE_UPPER32);
803 a0c7a97e Isaku Yamahata
        } else {
804 a0c7a97e Isaku Yamahata
            base = pci_config_get_memory_base(bridge, PCI_MEMORY_BASE);
805 a0c7a97e Isaku Yamahata
        }
806 a0c7a97e Isaku Yamahata
    }
807 a0c7a97e Isaku Yamahata
808 a0c7a97e Isaku Yamahata
    return base;
809 a0c7a97e Isaku Yamahata
}
810 a0c7a97e Isaku Yamahata
811 a0c7a97e Isaku Yamahata
static pcibus_t pci_bridge_get_limit(PCIDevice *bridge, uint8_t type)
812 a0c7a97e Isaku Yamahata
{
813 a0c7a97e Isaku Yamahata
    pcibus_t limit;
814 a0c7a97e Isaku Yamahata
    if (type & PCI_BASE_ADDRESS_SPACE_IO) {
815 a0c7a97e Isaku Yamahata
        limit = pci_config_get_io_base(bridge,
816 a0c7a97e Isaku Yamahata
                                      PCI_IO_LIMIT, PCI_IO_LIMIT_UPPER16);
817 a0c7a97e Isaku Yamahata
        limit |= 0xfff;         /* PCI bridge spec 3.2.5.6. */
818 a0c7a97e Isaku Yamahata
    } else {
819 a0c7a97e Isaku Yamahata
        if (type & PCI_BASE_ADDRESS_MEM_PREFETCH) {
820 a0c7a97e Isaku Yamahata
            limit = pci_config_get_pref_base(
821 a0c7a97e Isaku Yamahata
                bridge, PCI_PREF_MEMORY_LIMIT, PCI_PREF_LIMIT_UPPER32);
822 a0c7a97e Isaku Yamahata
        } else {
823 a0c7a97e Isaku Yamahata
            limit = pci_config_get_memory_base(bridge, PCI_MEMORY_LIMIT);
824 a0c7a97e Isaku Yamahata
        }
825 a0c7a97e Isaku Yamahata
        limit |= 0xfffff;       /* PCI bridge spec 3.2.5.{1, 8}. */
826 a0c7a97e Isaku Yamahata
    }
827 a0c7a97e Isaku Yamahata
    return limit;
828 a0c7a97e Isaku Yamahata
}
829 a0c7a97e Isaku Yamahata
830 a0c7a97e Isaku Yamahata
static void pci_bridge_filter(PCIDevice *d, pcibus_t *addr, pcibus_t *size,
831 a0c7a97e Isaku Yamahata
                              uint8_t type)
832 a0c7a97e Isaku Yamahata
{
833 a0c7a97e Isaku Yamahata
    pcibus_t base = *addr;
834 a0c7a97e Isaku Yamahata
    pcibus_t limit = *addr + *size - 1;
835 a0c7a97e Isaku Yamahata
    PCIDevice *br;
836 a0c7a97e Isaku Yamahata
837 a0c7a97e Isaku Yamahata
    for (br = d->bus->parent_dev; br; br = br->bus->parent_dev) {
838 a0c7a97e Isaku Yamahata
        uint16_t cmd = pci_get_word(d->config + PCI_COMMAND);
839 a0c7a97e Isaku Yamahata
840 a0c7a97e Isaku Yamahata
        if (type & PCI_BASE_ADDRESS_SPACE_IO) {
841 a0c7a97e Isaku Yamahata
            if (!(cmd & PCI_COMMAND_IO)) {
842 a0c7a97e Isaku Yamahata
                goto no_map;
843 a0c7a97e Isaku Yamahata
            }
844 a0c7a97e Isaku Yamahata
        } else {
845 a0c7a97e Isaku Yamahata
            if (!(cmd & PCI_COMMAND_MEMORY)) {
846 a0c7a97e Isaku Yamahata
                goto no_map;
847 a0c7a97e Isaku Yamahata
            }
848 a0c7a97e Isaku Yamahata
        }
849 a0c7a97e Isaku Yamahata
850 a0c7a97e Isaku Yamahata
        base = MAX(base, pci_bridge_get_base(br, type));
851 a0c7a97e Isaku Yamahata
        limit = MIN(limit, pci_bridge_get_limit(br, type));
852 a0c7a97e Isaku Yamahata
    }
853 a0c7a97e Isaku Yamahata
854 a0c7a97e Isaku Yamahata
    if (base > limit) {
855 88a95564 Michael S. Tsirkin
        goto no_map;
856 a0c7a97e Isaku Yamahata
    }
857 88a95564 Michael S. Tsirkin
    *addr = base;
858 88a95564 Michael S. Tsirkin
    *size = limit - base + 1;
859 88a95564 Michael S. Tsirkin
    return;
860 88a95564 Michael S. Tsirkin
no_map:
861 88a95564 Michael S. Tsirkin
    *addr = PCI_BAR_UNMAPPED;
862 88a95564 Michael S. Tsirkin
    *size = 0;
863 a0c7a97e Isaku Yamahata
}
864 a0c7a97e Isaku Yamahata
865 876a350d Michael S. Tsirkin
static pcibus_t pci_bar_address(PCIDevice *d,
866 876a350d Michael S. Tsirkin
                                int reg, uint8_t type, pcibus_t size)
867 876a350d Michael S. Tsirkin
{
868 876a350d Michael S. Tsirkin
    pcibus_t new_addr, last_addr;
869 876a350d Michael S. Tsirkin
    int bar = pci_bar(d, reg);
870 876a350d Michael S. Tsirkin
    uint16_t cmd = pci_get_word(d->config + PCI_COMMAND);
871 876a350d Michael S. Tsirkin
872 876a350d Michael S. Tsirkin
    if (type & PCI_BASE_ADDRESS_SPACE_IO) {
873 876a350d Michael S. Tsirkin
        if (!(cmd & PCI_COMMAND_IO)) {
874 876a350d Michael S. Tsirkin
            return PCI_BAR_UNMAPPED;
875 876a350d Michael S. Tsirkin
        }
876 876a350d Michael S. Tsirkin
        new_addr = pci_get_long(d->config + bar) & ~(size - 1);
877 876a350d Michael S. Tsirkin
        last_addr = new_addr + size - 1;
878 876a350d Michael S. Tsirkin
        /* NOTE: we have only 64K ioports on PC */
879 876a350d Michael S. Tsirkin
        if (last_addr <= new_addr || new_addr == 0 || last_addr > UINT16_MAX) {
880 876a350d Michael S. Tsirkin
            return PCI_BAR_UNMAPPED;
881 876a350d Michael S. Tsirkin
        }
882 876a350d Michael S. Tsirkin
        return new_addr;
883 876a350d Michael S. Tsirkin
    }
884 876a350d Michael S. Tsirkin
885 876a350d Michael S. Tsirkin
    if (!(cmd & PCI_COMMAND_MEMORY)) {
886 876a350d Michael S. Tsirkin
        return PCI_BAR_UNMAPPED;
887 876a350d Michael S. Tsirkin
    }
888 876a350d Michael S. Tsirkin
    if (type & PCI_BASE_ADDRESS_MEM_TYPE_64) {
889 876a350d Michael S. Tsirkin
        new_addr = pci_get_quad(d->config + bar);
890 876a350d Michael S. Tsirkin
    } else {
891 876a350d Michael S. Tsirkin
        new_addr = pci_get_long(d->config + bar);
892 876a350d Michael S. Tsirkin
    }
893 876a350d Michael S. Tsirkin
    /* the ROM slot has a specific enable bit */
894 876a350d Michael S. Tsirkin
    if (reg == PCI_ROM_SLOT && !(new_addr & PCI_ROM_ADDRESS_ENABLE)) {
895 876a350d Michael S. Tsirkin
        return PCI_BAR_UNMAPPED;
896 876a350d Michael S. Tsirkin
    }
897 876a350d Michael S. Tsirkin
    new_addr &= ~(size - 1);
898 876a350d Michael S. Tsirkin
    last_addr = new_addr + size - 1;
899 876a350d Michael S. Tsirkin
    /* NOTE: we do not support wrapping */
900 876a350d Michael S. Tsirkin
    /* XXX: as we cannot support really dynamic
901 876a350d Michael S. Tsirkin
       mappings, we handle specific values as invalid
902 876a350d Michael S. Tsirkin
       mappings. */
903 876a350d Michael S. Tsirkin
    if (last_addr <= new_addr || new_addr == 0 ||
904 876a350d Michael S. Tsirkin
        last_addr == PCI_BAR_UNMAPPED) {
905 876a350d Michael S. Tsirkin
        return PCI_BAR_UNMAPPED;
906 876a350d Michael S. Tsirkin
    }
907 876a350d Michael S. Tsirkin
908 876a350d Michael S. Tsirkin
    /* Now pcibus_t is 64bit.
909 876a350d Michael S. Tsirkin
     * Check if 32 bit BAR wraps around explicitly.
910 876a350d Michael S. Tsirkin
     * Without this, PC ide doesn't work well.
911 876a350d Michael S. Tsirkin
     * TODO: remove this work around.
912 876a350d Michael S. Tsirkin
     */
913 876a350d Michael S. Tsirkin
    if  (!(type & PCI_BASE_ADDRESS_MEM_TYPE_64) && last_addr >= UINT32_MAX) {
914 876a350d Michael S. Tsirkin
        return PCI_BAR_UNMAPPED;
915 876a350d Michael S. Tsirkin
    }
916 876a350d Michael S. Tsirkin
917 876a350d Michael S. Tsirkin
    /*
918 876a350d Michael S. Tsirkin
     * OS is allowed to set BAR beyond its addressable
919 876a350d Michael S. Tsirkin
     * bits. For example, 32 bit OS can set 64bit bar
920 876a350d Michael S. Tsirkin
     * to >4G. Check it. TODO: we might need to support
921 876a350d Michael S. Tsirkin
     * it in the future for e.g. PAE.
922 876a350d Michael S. Tsirkin
     */
923 876a350d Michael S. Tsirkin
    if (last_addr >= TARGET_PHYS_ADDR_MAX) {
924 876a350d Michael S. Tsirkin
        return PCI_BAR_UNMAPPED;
925 876a350d Michael S. Tsirkin
    }
926 876a350d Michael S. Tsirkin
927 876a350d Michael S. Tsirkin
    return new_addr;
928 876a350d Michael S. Tsirkin
}
929 876a350d Michael S. Tsirkin
930 0ac32c83 bellard
static void pci_update_mappings(PCIDevice *d)
931 0ac32c83 bellard
{
932 0ac32c83 bellard
    PCIIORegion *r;
933 876a350d Michael S. Tsirkin
    int i;
934 c71b5b4a Blue Swirl
    pcibus_t new_addr, filtered_size;
935 3b46e624 ths
936 8a8696a3 bellard
    for(i = 0; i < PCI_NUM_REGIONS; i++) {
937 0ac32c83 bellard
        r = &d->io_regions[i];
938 a9688570 Isaku Yamahata
939 a9688570 Isaku Yamahata
        /* this region isn't registered */
940 ec503442 Isaku Yamahata
        if (!r->size)
941 a9688570 Isaku Yamahata
            continue;
942 a9688570 Isaku Yamahata
943 876a350d Michael S. Tsirkin
        new_addr = pci_bar_address(d, i, r->type, r->size);
944 a9688570 Isaku Yamahata
945 a0c7a97e Isaku Yamahata
        /* bridge filtering */
946 a0c7a97e Isaku Yamahata
        filtered_size = r->size;
947 a0c7a97e Isaku Yamahata
        if (new_addr != PCI_BAR_UNMAPPED) {
948 a0c7a97e Isaku Yamahata
            pci_bridge_filter(d, &new_addr, &filtered_size, r->type);
949 a0c7a97e Isaku Yamahata
        }
950 a0c7a97e Isaku Yamahata
951 a9688570 Isaku Yamahata
        /* This bar isn't changed */
952 a0c7a97e Isaku Yamahata
        if (new_addr == r->addr && filtered_size == r->filtered_size)
953 a9688570 Isaku Yamahata
            continue;
954 a9688570 Isaku Yamahata
955 a9688570 Isaku Yamahata
        /* now do the real mapping */
956 a9688570 Isaku Yamahata
        if (r->addr != PCI_BAR_UNMAPPED) {
957 a9688570 Isaku Yamahata
            if (r->type & PCI_BASE_ADDRESS_SPACE_IO) {
958 a9688570 Isaku Yamahata
                int class;
959 a9688570 Isaku Yamahata
                /* NOTE: specific hack for IDE in PC case:
960 a9688570 Isaku Yamahata
                   only one byte must be mapped. */
961 a9688570 Isaku Yamahata
                class = pci_get_word(d->config + PCI_CLASS_DEVICE);
962 a9688570 Isaku Yamahata
                if (class == 0x0101 && r->size == 4) {
963 a9688570 Isaku Yamahata
                    isa_unassign_ioport(r->addr + 2, 1);
964 a9688570 Isaku Yamahata
                } else {
965 a0c7a97e Isaku Yamahata
                    isa_unassign_ioport(r->addr, r->filtered_size);
966 0ac32c83 bellard
                }
967 a9688570 Isaku Yamahata
            } else {
968 c71b5b4a Blue Swirl
                cpu_register_physical_memory(pci_to_cpu_addr(d->bus, r->addr),
969 a0c7a97e Isaku Yamahata
                                             r->filtered_size,
970 a9688570 Isaku Yamahata
                                             IO_MEM_UNASSIGNED);
971 a0c7a97e Isaku Yamahata
                qemu_unregister_coalesced_mmio(r->addr, r->filtered_size);
972 0ac32c83 bellard
            }
973 0ac32c83 bellard
        }
974 a9688570 Isaku Yamahata
        r->addr = new_addr;
975 a0c7a97e Isaku Yamahata
        r->filtered_size = filtered_size;
976 a9688570 Isaku Yamahata
        if (r->addr != PCI_BAR_UNMAPPED) {
977 a0c7a97e Isaku Yamahata
            /*
978 a0c7a97e Isaku Yamahata
             * TODO: currently almost all the map funcions assumes
979 a0c7a97e Isaku Yamahata
             * filtered_size == size and addr & ~(size - 1) == addr.
980 a0c7a97e Isaku Yamahata
             * However with bridge filtering, they aren't always true.
981 a0c7a97e Isaku Yamahata
             * Teach them such cases, such that filtered_size < size and
982 a0c7a97e Isaku Yamahata
             * addr & (size - 1) != 0.
983 a0c7a97e Isaku Yamahata
             */
984 cf616802 Blue Swirl
            if (r->type & PCI_BASE_ADDRESS_SPACE_IO) {
985 cf616802 Blue Swirl
                r->map_func(d, i, r->addr, r->filtered_size, r->type);
986 cf616802 Blue Swirl
            } else {
987 cf616802 Blue Swirl
                r->map_func(d, i, pci_to_cpu_addr(d->bus, r->addr),
988 cf616802 Blue Swirl
                            r->filtered_size, r->type);
989 cf616802 Blue Swirl
            }
990 a9688570 Isaku Yamahata
        }
991 0ac32c83 bellard
    }
992 0ac32c83 bellard
}
993 0ac32c83 bellard
994 a7b15a5c Michael S. Tsirkin
static inline int pci_irq_disabled(PCIDevice *d)
995 a7b15a5c Michael S. Tsirkin
{
996 a7b15a5c Michael S. Tsirkin
    return pci_get_word(d->config + PCI_COMMAND) & PCI_COMMAND_INTX_DISABLE;
997 a7b15a5c Michael S. Tsirkin
}
998 a7b15a5c Michael S. Tsirkin
999 a7b15a5c Michael S. Tsirkin
/* Called after interrupt disabled field update in config space,
1000 a7b15a5c Michael S. Tsirkin
 * assert/deassert interrupts if necessary.
1001 a7b15a5c Michael S. Tsirkin
 * Gets original interrupt disable bit value (before update). */
1002 a7b15a5c Michael S. Tsirkin
static void pci_update_irq_disabled(PCIDevice *d, int was_irq_disabled)
1003 a7b15a5c Michael S. Tsirkin
{
1004 a7b15a5c Michael S. Tsirkin
    int i, disabled = pci_irq_disabled(d);
1005 a7b15a5c Michael S. Tsirkin
    if (disabled == was_irq_disabled)
1006 a7b15a5c Michael S. Tsirkin
        return;
1007 a7b15a5c Michael S. Tsirkin
    for (i = 0; i < PCI_NUM_PINS; ++i) {
1008 a7b15a5c Michael S. Tsirkin
        int state = pci_irq_state(d, i);
1009 a7b15a5c Michael S. Tsirkin
        pci_change_irq_level(d, i, disabled ? -state : state);
1010 a7b15a5c Michael S. Tsirkin
    }
1011 a7b15a5c Michael S. Tsirkin
}
1012 a7b15a5c Michael S. Tsirkin
1013 5fafdf24 ths
uint32_t pci_default_read_config(PCIDevice *d,
1014 0ac32c83 bellard
                                 uint32_t address, int len)
1015 69b91039 bellard
{
1016 5029fe12 Isaku Yamahata
    uint32_t val = 0;
1017 5029fe12 Isaku Yamahata
    assert(len == 1 || len == 2 || len == 4);
1018 a9f49946 Isaku Yamahata
    len = MIN(len, pci_config_size(d) - address);
1019 5029fe12 Isaku Yamahata
    memcpy(&val, d->config + address, len);
1020 5029fe12 Isaku Yamahata
    return le32_to_cpu(val);
1021 0ac32c83 bellard
}
1022 0ac32c83 bellard
1023 b7ee1603 Michael S. Tsirkin
void pci_default_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int l)
1024 0ac32c83 bellard
{
1025 a7b15a5c Michael S. Tsirkin
    int i, was_irq_disabled = pci_irq_disabled(d);
1026 a9f49946 Isaku Yamahata
    uint32_t config_size = pci_config_size(d);
1027 0ac32c83 bellard
1028 91011d4f Stefan Weil
    for (i = 0; i < l && addr + i < config_size; val >>= 8, ++i) {
1029 91011d4f Stefan Weil
        uint8_t wmask = d->wmask[addr + i];
1030 91011d4f Stefan Weil
        d->config[addr + i] = (d->config[addr + i] & ~wmask) | (val & wmask);
1031 0ac32c83 bellard
    }
1032 260c0cd3 Isaku Yamahata
    if (ranges_overlap(addr, l, PCI_BASE_ADDRESS_0, 24) ||
1033 edb00035 Isaku Yamahata
        ranges_overlap(addr, l, PCI_ROM_ADDRESS, 4) ||
1034 edb00035 Isaku Yamahata
        ranges_overlap(addr, l, PCI_ROM_ADDRESS1, 4) ||
1035 260c0cd3 Isaku Yamahata
        range_covers_byte(addr, l, PCI_COMMAND))
1036 0ac32c83 bellard
        pci_update_mappings(d);
1037 a7b15a5c Michael S. Tsirkin
1038 a7b15a5c Michael S. Tsirkin
    if (range_covers_byte(addr, l, PCI_COMMAND))
1039 a7b15a5c Michael S. Tsirkin
        pci_update_irq_disabled(d, was_irq_disabled);
1040 69b91039 bellard
}
1041 69b91039 bellard
1042 502a5395 pbrook
/***********************************************************/
1043 502a5395 pbrook
/* generic PCI irq support */
1044 30468f78 bellard
1045 502a5395 pbrook
/* 0 <= irq_num <= 3. level must be 0 or 1 */
1046 d537cf6c pbrook
static void pci_set_irq(void *opaque, int irq_num, int level)
1047 69b91039 bellard
{
1048 a60380a5 Juan Quintela
    PCIDevice *pci_dev = opaque;
1049 80b3ada7 pbrook
    int change;
1050 3b46e624 ths
1051 d036bb21 Michael S. Tsirkin
    change = level - pci_irq_state(pci_dev, irq_num);
1052 80b3ada7 pbrook
    if (!change)
1053 80b3ada7 pbrook
        return;
1054 d2b59317 pbrook
1055 d036bb21 Michael S. Tsirkin
    pci_set_irq_state(pci_dev, irq_num, level);
1056 f9bf77dd Michael S. Tsirkin
    pci_update_irq_status(pci_dev);
1057 a7b15a5c Michael S. Tsirkin
    if (pci_irq_disabled(pci_dev))
1058 a7b15a5c Michael S. Tsirkin
        return;
1059 d036bb21 Michael S. Tsirkin
    pci_change_irq_level(pci_dev, irq_num, change);
1060 69b91039 bellard
}
1061 69b91039 bellard
1062 502a5395 pbrook
/***********************************************************/
1063 502a5395 pbrook
/* monitor info on PCI */
1064 0ac32c83 bellard
1065 6650ee6d pbrook
typedef struct {
1066 6650ee6d pbrook
    uint16_t class;
1067 6650ee6d pbrook
    const char *desc;
1068 6650ee6d pbrook
} pci_class_desc;
1069 6650ee6d pbrook
1070 09bc878a blueswir1
static const pci_class_desc pci_class_descriptions[] =
1071 6650ee6d pbrook
{
1072 4ca9c76f pbrook
    { 0x0100, "SCSI controller"},
1073 6650ee6d pbrook
    { 0x0101, "IDE controller"},
1074 dcb5b19a ths
    { 0x0102, "Floppy controller"},
1075 dcb5b19a ths
    { 0x0103, "IPI controller"},
1076 dcb5b19a ths
    { 0x0104, "RAID controller"},
1077 dcb5b19a ths
    { 0x0106, "SATA controller"},
1078 dcb5b19a ths
    { 0x0107, "SAS controller"},
1079 dcb5b19a ths
    { 0x0180, "Storage controller"},
1080 6650ee6d pbrook
    { 0x0200, "Ethernet controller"},
1081 dcb5b19a ths
    { 0x0201, "Token Ring controller"},
1082 dcb5b19a ths
    { 0x0202, "FDDI controller"},
1083 dcb5b19a ths
    { 0x0203, "ATM controller"},
1084 dcb5b19a ths
    { 0x0280, "Network controller"},
1085 6650ee6d pbrook
    { 0x0300, "VGA controller"},
1086 dcb5b19a ths
    { 0x0301, "XGA controller"},
1087 dcb5b19a ths
    { 0x0302, "3D controller"},
1088 dcb5b19a ths
    { 0x0380, "Display controller"},
1089 dcb5b19a ths
    { 0x0400, "Video controller"},
1090 dcb5b19a ths
    { 0x0401, "Audio controller"},
1091 dcb5b19a ths
    { 0x0402, "Phone"},
1092 dcb5b19a ths
    { 0x0480, "Multimedia controller"},
1093 dcb5b19a ths
    { 0x0500, "RAM controller"},
1094 dcb5b19a ths
    { 0x0501, "Flash controller"},
1095 dcb5b19a ths
    { 0x0580, "Memory controller"},
1096 6650ee6d pbrook
    { 0x0600, "Host bridge"},
1097 6650ee6d pbrook
    { 0x0601, "ISA bridge"},
1098 dcb5b19a ths
    { 0x0602, "EISA bridge"},
1099 dcb5b19a ths
    { 0x0603, "MC bridge"},
1100 6650ee6d pbrook
    { 0x0604, "PCI bridge"},
1101 dcb5b19a ths
    { 0x0605, "PCMCIA bridge"},
1102 dcb5b19a ths
    { 0x0606, "NUBUS bridge"},
1103 dcb5b19a ths
    { 0x0607, "CARDBUS bridge"},
1104 dcb5b19a ths
    { 0x0608, "RACEWAY bridge"},
1105 dcb5b19a ths
    { 0x0680, "Bridge"},
1106 6650ee6d pbrook
    { 0x0c03, "USB controller"},
1107 6650ee6d pbrook
    { 0, NULL}
1108 6650ee6d pbrook
};
1109 6650ee6d pbrook
1110 163c8a59 Luiz Capitulino
static void pci_for_each_device_under_bus(PCIBus *bus,
1111 163c8a59 Luiz Capitulino
                                          void (*fn)(PCIBus *b, PCIDevice *d))
1112 30468f78 bellard
{
1113 163c8a59 Luiz Capitulino
    PCIDevice *d;
1114 163c8a59 Luiz Capitulino
    int devfn;
1115 30468f78 bellard
1116 163c8a59 Luiz Capitulino
    for(devfn = 0; devfn < ARRAY_SIZE(bus->devices); devfn++) {
1117 163c8a59 Luiz Capitulino
        d = bus->devices[devfn];
1118 163c8a59 Luiz Capitulino
        if (d) {
1119 163c8a59 Luiz Capitulino
            fn(bus, d);
1120 163c8a59 Luiz Capitulino
        }
1121 163c8a59 Luiz Capitulino
    }
1122 163c8a59 Luiz Capitulino
}
1123 163c8a59 Luiz Capitulino
1124 163c8a59 Luiz Capitulino
void pci_for_each_device(PCIBus *bus, int bus_num,
1125 163c8a59 Luiz Capitulino
                         void (*fn)(PCIBus *b, PCIDevice *d))
1126 163c8a59 Luiz Capitulino
{
1127 163c8a59 Luiz Capitulino
    bus = pci_find_bus(bus, bus_num);
1128 163c8a59 Luiz Capitulino
1129 163c8a59 Luiz Capitulino
    if (bus) {
1130 163c8a59 Luiz Capitulino
        pci_for_each_device_under_bus(bus, fn);
1131 163c8a59 Luiz Capitulino
    }
1132 163c8a59 Luiz Capitulino
}
1133 163c8a59 Luiz Capitulino
1134 163c8a59 Luiz Capitulino
static void pci_device_print(Monitor *mon, QDict *device)
1135 163c8a59 Luiz Capitulino
{
1136 163c8a59 Luiz Capitulino
    QDict *qdict;
1137 163c8a59 Luiz Capitulino
    QListEntry *entry;
1138 163c8a59 Luiz Capitulino
    uint64_t addr, size;
1139 163c8a59 Luiz Capitulino
1140 163c8a59 Luiz Capitulino
    monitor_printf(mon, "  Bus %2" PRId64 ", ", qdict_get_int(device, "bus"));
1141 163c8a59 Luiz Capitulino
    monitor_printf(mon, "device %3" PRId64 ", function %" PRId64 ":\n",
1142 163c8a59 Luiz Capitulino
                        qdict_get_int(device, "slot"),
1143 163c8a59 Luiz Capitulino
                        qdict_get_int(device, "function"));
1144 376253ec aliguori
    monitor_printf(mon, "    ");
1145 163c8a59 Luiz Capitulino
1146 163c8a59 Luiz Capitulino
    qdict = qdict_get_qdict(device, "class_info");
1147 163c8a59 Luiz Capitulino
    if (qdict_haskey(qdict, "desc")) {
1148 163c8a59 Luiz Capitulino
        monitor_printf(mon, "%s", qdict_get_str(qdict, "desc"));
1149 6650ee6d pbrook
    } else {
1150 163c8a59 Luiz Capitulino
        monitor_printf(mon, "Class %04" PRId64, qdict_get_int(qdict, "class"));
1151 72cc6cfe bellard
    }
1152 30468f78 bellard
1153 163c8a59 Luiz Capitulino
    qdict = qdict_get_qdict(device, "id");
1154 163c8a59 Luiz Capitulino
    monitor_printf(mon, ": PCI device %04" PRIx64 ":%04" PRIx64 "\n",
1155 163c8a59 Luiz Capitulino
                        qdict_get_int(qdict, "device"),
1156 163c8a59 Luiz Capitulino
                        qdict_get_int(qdict, "vendor"));
1157 163c8a59 Luiz Capitulino
1158 163c8a59 Luiz Capitulino
    if (qdict_haskey(device, "irq")) {
1159 163c8a59 Luiz Capitulino
        monitor_printf(mon, "      IRQ %" PRId64 ".\n",
1160 163c8a59 Luiz Capitulino
                            qdict_get_int(device, "irq"));
1161 30468f78 bellard
    }
1162 b4dccd8d Isaku Yamahata
1163 163c8a59 Luiz Capitulino
    if (qdict_haskey(device, "pci_bridge")) {
1164 163c8a59 Luiz Capitulino
        QDict *info;
1165 163c8a59 Luiz Capitulino
1166 163c8a59 Luiz Capitulino
        qdict = qdict_get_qdict(device, "pci_bridge");
1167 163c8a59 Luiz Capitulino
1168 163c8a59 Luiz Capitulino
        info = qdict_get_qdict(qdict, "bus");
1169 163c8a59 Luiz Capitulino
        monitor_printf(mon, "      BUS %" PRId64 ".\n",
1170 163c8a59 Luiz Capitulino
                            qdict_get_int(info, "number"));
1171 163c8a59 Luiz Capitulino
        monitor_printf(mon, "      secondary bus %" PRId64 ".\n",
1172 163c8a59 Luiz Capitulino
                            qdict_get_int(info, "secondary"));
1173 163c8a59 Luiz Capitulino
        monitor_printf(mon, "      subordinate bus %" PRId64 ".\n",
1174 163c8a59 Luiz Capitulino
                            qdict_get_int(info, "subordinate"));
1175 b4dccd8d Isaku Yamahata
1176 163c8a59 Luiz Capitulino
        info = qdict_get_qdict(qdict, "io_range");
1177 b4dccd8d Isaku Yamahata
        monitor_printf(mon, "      IO range [0x%04"PRIx64", 0x%04"PRIx64"]\n",
1178 163c8a59 Luiz Capitulino
                       qdict_get_int(info, "base"),
1179 163c8a59 Luiz Capitulino
                       qdict_get_int(info, "limit"));
1180 b4dccd8d Isaku Yamahata
1181 163c8a59 Luiz Capitulino
        info = qdict_get_qdict(qdict, "memory_range");
1182 b4dccd8d Isaku Yamahata
        monitor_printf(mon,
1183 b4dccd8d Isaku Yamahata
                       "      memory range [0x%08"PRIx64", 0x%08"PRIx64"]\n",
1184 163c8a59 Luiz Capitulino
                       qdict_get_int(info, "base"),
1185 163c8a59 Luiz Capitulino
                       qdict_get_int(info, "limit"));
1186 b4dccd8d Isaku Yamahata
1187 163c8a59 Luiz Capitulino
        info = qdict_get_qdict(qdict, "prefetchable_range");
1188 b4dccd8d Isaku Yamahata
        monitor_printf(mon, "      prefetchable memory range "
1189 163c8a59 Luiz Capitulino
                       "[0x%08"PRIx64", 0x%08"PRIx64"]\n",
1190 163c8a59 Luiz Capitulino
                       qdict_get_int(info, "base"),
1191 163c8a59 Luiz Capitulino
        qdict_get_int(info, "limit"));
1192 80b3ada7 pbrook
    }
1193 14421258 Isaku Yamahata
1194 163c8a59 Luiz Capitulino
    QLIST_FOREACH_ENTRY(qdict_get_qlist(device, "regions"), entry) {
1195 163c8a59 Luiz Capitulino
        qdict = qobject_to_qdict(qlist_entry_obj(entry));
1196 163c8a59 Luiz Capitulino
        monitor_printf(mon, "      BAR%d: ", (int) qdict_get_int(qdict, "bar"));
1197 163c8a59 Luiz Capitulino
1198 163c8a59 Luiz Capitulino
        addr = qdict_get_int(qdict, "address");
1199 163c8a59 Luiz Capitulino
        size = qdict_get_int(qdict, "size");
1200 163c8a59 Luiz Capitulino
1201 163c8a59 Luiz Capitulino
        if (!strcmp(qdict_get_str(qdict, "type"), "io")) {
1202 163c8a59 Luiz Capitulino
            monitor_printf(mon, "I/O at 0x%04"FMT_PCIBUS
1203 163c8a59 Luiz Capitulino
                                " [0x%04"FMT_PCIBUS"].\n",
1204 163c8a59 Luiz Capitulino
                                addr, addr + size - 1);
1205 163c8a59 Luiz Capitulino
        } else {
1206 163c8a59 Luiz Capitulino
            monitor_printf(mon, "%d bit%s memory at 0x%08"FMT_PCIBUS
1207 89e8b13c Isaku Yamahata
                               " [0x%08"FMT_PCIBUS"].\n",
1208 163c8a59 Luiz Capitulino
                                qdict_get_bool(qdict, "mem_type_64") ? 64 : 32,
1209 163c8a59 Luiz Capitulino
                                qdict_get_bool(qdict, "prefetch") ?
1210 163c8a59 Luiz Capitulino
                                " prefetchable" : "", addr, addr + size - 1);
1211 502a5395 pbrook
        }
1212 77d4bc34 bellard
    }
1213 163c8a59 Luiz Capitulino
1214 163c8a59 Luiz Capitulino
    monitor_printf(mon, "      id \"%s\"\n", qdict_get_str(device, "qdev_id"));
1215 163c8a59 Luiz Capitulino
1216 d5e4acf7 Luiz Capitulino
    if (qdict_haskey(device, "pci_bridge")) {
1217 d5e4acf7 Luiz Capitulino
        qdict = qdict_get_qdict(device, "pci_bridge");
1218 d5e4acf7 Luiz Capitulino
        if (qdict_haskey(qdict, "devices")) {
1219 d5e4acf7 Luiz Capitulino
            QListEntry *dev;
1220 d5e4acf7 Luiz Capitulino
            QLIST_FOREACH_ENTRY(qdict_get_qlist(qdict, "devices"), dev) {
1221 d5e4acf7 Luiz Capitulino
                pci_device_print(mon, qobject_to_qdict(qlist_entry_obj(dev)));
1222 d5e4acf7 Luiz Capitulino
            }
1223 d5e4acf7 Luiz Capitulino
        }
1224 d5e4acf7 Luiz Capitulino
    }
1225 163c8a59 Luiz Capitulino
}
1226 163c8a59 Luiz Capitulino
1227 163c8a59 Luiz Capitulino
void do_pci_info_print(Monitor *mon, const QObject *data)
1228 163c8a59 Luiz Capitulino
{
1229 163c8a59 Luiz Capitulino
    QListEntry *bus, *dev;
1230 163c8a59 Luiz Capitulino
1231 163c8a59 Luiz Capitulino
    QLIST_FOREACH_ENTRY(qobject_to_qlist(data), bus) {
1232 163c8a59 Luiz Capitulino
        QDict *qdict = qobject_to_qdict(qlist_entry_obj(bus));
1233 163c8a59 Luiz Capitulino
        QLIST_FOREACH_ENTRY(qdict_get_qlist(qdict, "devices"), dev) {
1234 163c8a59 Luiz Capitulino
            pci_device_print(mon, qobject_to_qdict(qlist_entry_obj(dev)));
1235 163c8a59 Luiz Capitulino
        }
1236 80b3ada7 pbrook
    }
1237 384d8876 bellard
}
1238 384d8876 bellard
1239 163c8a59 Luiz Capitulino
static QObject *pci_get_dev_class(const PCIDevice *dev)
1240 163c8a59 Luiz Capitulino
{
1241 163c8a59 Luiz Capitulino
    int class;
1242 163c8a59 Luiz Capitulino
    const pci_class_desc *desc;
1243 163c8a59 Luiz Capitulino
1244 163c8a59 Luiz Capitulino
    class = pci_get_word(dev->config + PCI_CLASS_DEVICE);
1245 163c8a59 Luiz Capitulino
    desc = pci_class_descriptions;
1246 163c8a59 Luiz Capitulino
    while (desc->desc && class != desc->class)
1247 163c8a59 Luiz Capitulino
        desc++;
1248 163c8a59 Luiz Capitulino
1249 163c8a59 Luiz Capitulino
    if (desc->desc) {
1250 163c8a59 Luiz Capitulino
        return qobject_from_jsonf("{ 'desc': %s, 'class': %d }",
1251 163c8a59 Luiz Capitulino
                                  desc->desc, class);
1252 163c8a59 Luiz Capitulino
    } else {
1253 163c8a59 Luiz Capitulino
        return qobject_from_jsonf("{ 'class': %d }", class);
1254 163c8a59 Luiz Capitulino
    }
1255 163c8a59 Luiz Capitulino
}
1256 163c8a59 Luiz Capitulino
1257 163c8a59 Luiz Capitulino
static QObject *pci_get_dev_id(const PCIDevice *dev)
1258 163c8a59 Luiz Capitulino
{
1259 163c8a59 Luiz Capitulino
    return qobject_from_jsonf("{ 'device': %d, 'vendor': %d }",
1260 163c8a59 Luiz Capitulino
                              pci_get_word(dev->config + PCI_VENDOR_ID),
1261 163c8a59 Luiz Capitulino
                              pci_get_word(dev->config + PCI_DEVICE_ID));
1262 163c8a59 Luiz Capitulino
}
1263 163c8a59 Luiz Capitulino
1264 163c8a59 Luiz Capitulino
static QObject *pci_get_regions_list(const PCIDevice *dev)
1265 163c8a59 Luiz Capitulino
{
1266 163c8a59 Luiz Capitulino
    int i;
1267 163c8a59 Luiz Capitulino
    QList *regions_list;
1268 163c8a59 Luiz Capitulino
1269 163c8a59 Luiz Capitulino
    regions_list = qlist_new();
1270 163c8a59 Luiz Capitulino
1271 163c8a59 Luiz Capitulino
    for (i = 0; i < PCI_NUM_REGIONS; i++) {
1272 163c8a59 Luiz Capitulino
        QObject *obj;
1273 163c8a59 Luiz Capitulino
        const PCIIORegion *r = &dev->io_regions[i];
1274 163c8a59 Luiz Capitulino
1275 163c8a59 Luiz Capitulino
        if (!r->size) {
1276 163c8a59 Luiz Capitulino
            continue;
1277 163c8a59 Luiz Capitulino
        }
1278 163c8a59 Luiz Capitulino
1279 163c8a59 Luiz Capitulino
        if (r->type & PCI_BASE_ADDRESS_SPACE_IO) {
1280 163c8a59 Luiz Capitulino
            obj = qobject_from_jsonf("{ 'bar': %d, 'type': 'io', "
1281 163c8a59 Luiz Capitulino
                                     "'address': %" PRId64 ", "
1282 163c8a59 Luiz Capitulino
                                     "'size': %" PRId64 " }",
1283 163c8a59 Luiz Capitulino
                                     i, r->addr, r->size);
1284 163c8a59 Luiz Capitulino
        } else {
1285 163c8a59 Luiz Capitulino
            int mem_type_64 = r->type & PCI_BASE_ADDRESS_MEM_TYPE_64;
1286 163c8a59 Luiz Capitulino
1287 163c8a59 Luiz Capitulino
            obj = qobject_from_jsonf("{ 'bar': %d, 'type': 'memory', "
1288 163c8a59 Luiz Capitulino
                                     "'mem_type_64': %i, 'prefetch': %i, "
1289 163c8a59 Luiz Capitulino
                                     "'address': %" PRId64 ", "
1290 163c8a59 Luiz Capitulino
                                     "'size': %" PRId64 " }",
1291 163c8a59 Luiz Capitulino
                                     i, mem_type_64,
1292 163c8a59 Luiz Capitulino
                                     r->type & PCI_BASE_ADDRESS_MEM_PREFETCH,
1293 163c8a59 Luiz Capitulino
                                     r->addr, r->size);
1294 163c8a59 Luiz Capitulino
        }
1295 163c8a59 Luiz Capitulino
1296 163c8a59 Luiz Capitulino
        qlist_append_obj(regions_list, obj);
1297 163c8a59 Luiz Capitulino
    }
1298 163c8a59 Luiz Capitulino
1299 163c8a59 Luiz Capitulino
    return QOBJECT(regions_list);
1300 163c8a59 Luiz Capitulino
}
1301 163c8a59 Luiz Capitulino
1302 d5e4acf7 Luiz Capitulino
static QObject *pci_get_devices_list(PCIBus *bus, int bus_num);
1303 d5e4acf7 Luiz Capitulino
1304 d5e4acf7 Luiz Capitulino
static QObject *pci_get_dev_dict(PCIDevice *dev, PCIBus *bus, int bus_num)
1305 163c8a59 Luiz Capitulino
{
1306 b5937f29 Isaku Yamahata
    uint8_t type;
1307 163c8a59 Luiz Capitulino
    QObject *obj;
1308 163c8a59 Luiz Capitulino
1309 163c8a59 Luiz Capitulino
    obj = qobject_from_jsonf("{ 'bus': %d, 'slot': %d, 'function': %d,"                                       "'class_info': %p, 'id': %p, 'regions': %p,"
1310 163c8a59 Luiz Capitulino
                              " 'qdev_id': %s }",
1311 163c8a59 Luiz Capitulino
                              bus_num,
1312 163c8a59 Luiz Capitulino
                              PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn),
1313 163c8a59 Luiz Capitulino
                              pci_get_dev_class(dev), pci_get_dev_id(dev),
1314 163c8a59 Luiz Capitulino
                              pci_get_regions_list(dev),
1315 163c8a59 Luiz Capitulino
                              dev->qdev.id ? dev->qdev.id : "");
1316 163c8a59 Luiz Capitulino
1317 163c8a59 Luiz Capitulino
    if (dev->config[PCI_INTERRUPT_PIN] != 0) {
1318 163c8a59 Luiz Capitulino
        QDict *qdict = qobject_to_qdict(obj);
1319 163c8a59 Luiz Capitulino
        qdict_put(qdict, "irq", qint_from_int(dev->config[PCI_INTERRUPT_LINE]));
1320 163c8a59 Luiz Capitulino
    }
1321 163c8a59 Luiz Capitulino
1322 b5937f29 Isaku Yamahata
    type = dev->config[PCI_HEADER_TYPE] & ~PCI_HEADER_TYPE_MULTI_FUNCTION;
1323 b5937f29 Isaku Yamahata
    if (type == PCI_HEADER_TYPE_BRIDGE) {
1324 163c8a59 Luiz Capitulino
        QDict *qdict;
1325 163c8a59 Luiz Capitulino
        QObject *pci_bridge;
1326 163c8a59 Luiz Capitulino
1327 163c8a59 Luiz Capitulino
        pci_bridge = qobject_from_jsonf("{ 'bus': "
1328 163c8a59 Luiz Capitulino
        "{ 'number': %d, 'secondary': %d, 'subordinate': %d }, "
1329 163c8a59 Luiz Capitulino
        "'io_range': { 'base': %" PRId64 ", 'limit': %" PRId64 "}, "
1330 163c8a59 Luiz Capitulino
        "'memory_range': { 'base': %" PRId64 ", 'limit': %" PRId64 "}, "
1331 163c8a59 Luiz Capitulino
        "'prefetchable_range': { 'base': %" PRId64 ", 'limit': %" PRId64 "} }",
1332 c021f8e6 Blue Swirl
        dev->config[PCI_PRIMARY_BUS], dev->config[PCI_SECONDARY_BUS],
1333 163c8a59 Luiz Capitulino
        dev->config[PCI_SUBORDINATE_BUS],
1334 163c8a59 Luiz Capitulino
        pci_bridge_get_base(dev, PCI_BASE_ADDRESS_SPACE_IO),
1335 163c8a59 Luiz Capitulino
        pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_SPACE_IO),
1336 163c8a59 Luiz Capitulino
        pci_bridge_get_base(dev, PCI_BASE_ADDRESS_SPACE_MEMORY),
1337 163c8a59 Luiz Capitulino
        pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_SPACE_MEMORY),
1338 163c8a59 Luiz Capitulino
        pci_bridge_get_base(dev, PCI_BASE_ADDRESS_SPACE_MEMORY |
1339 163c8a59 Luiz Capitulino
                               PCI_BASE_ADDRESS_MEM_PREFETCH),
1340 163c8a59 Luiz Capitulino
        pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_SPACE_MEMORY |
1341 163c8a59 Luiz Capitulino
                                PCI_BASE_ADDRESS_MEM_PREFETCH));
1342 163c8a59 Luiz Capitulino
1343 c021f8e6 Blue Swirl
        if (dev->config[PCI_SECONDARY_BUS] != 0) {
1344 c021f8e6 Blue Swirl
            PCIBus *child_bus = pci_find_bus(bus, dev->config[PCI_SECONDARY_BUS]);
1345 d5e4acf7 Luiz Capitulino
1346 c021f8e6 Blue Swirl
            if (child_bus) {
1347 c021f8e6 Blue Swirl
                qdict = qobject_to_qdict(pci_bridge);
1348 c021f8e6 Blue Swirl
                qdict_put_obj(qdict, "devices",
1349 c021f8e6 Blue Swirl
                              pci_get_devices_list(child_bus,
1350 c021f8e6 Blue Swirl
                                                   dev->config[PCI_SECONDARY_BUS]));
1351 c021f8e6 Blue Swirl
            }
1352 c021f8e6 Blue Swirl
        }
1353 163c8a59 Luiz Capitulino
        qdict = qobject_to_qdict(obj);
1354 163c8a59 Luiz Capitulino
        qdict_put_obj(qdict, "pci_bridge", pci_bridge);
1355 163c8a59 Luiz Capitulino
    }
1356 163c8a59 Luiz Capitulino
1357 163c8a59 Luiz Capitulino
    return obj;
1358 163c8a59 Luiz Capitulino
}
1359 163c8a59 Luiz Capitulino
1360 163c8a59 Luiz Capitulino
static QObject *pci_get_devices_list(PCIBus *bus, int bus_num)
1361 384d8876 bellard
{
1362 502a5395 pbrook
    int devfn;
1363 163c8a59 Luiz Capitulino
    PCIDevice *dev;
1364 163c8a59 Luiz Capitulino
    QList *dev_list;
1365 3b46e624 ths
1366 163c8a59 Luiz Capitulino
    dev_list = qlist_new();
1367 163c8a59 Luiz Capitulino
1368 163c8a59 Luiz Capitulino
    for (devfn = 0; devfn < ARRAY_SIZE(bus->devices); devfn++) {
1369 163c8a59 Luiz Capitulino
        dev = bus->devices[devfn];
1370 163c8a59 Luiz Capitulino
        if (dev) {
1371 d5e4acf7 Luiz Capitulino
            qlist_append_obj(dev_list, pci_get_dev_dict(dev, bus, bus_num));
1372 163c8a59 Luiz Capitulino
        }
1373 1074df4f Isaku Yamahata
    }
1374 163c8a59 Luiz Capitulino
1375 163c8a59 Luiz Capitulino
    return QOBJECT(dev_list);
1376 1074df4f Isaku Yamahata
}
1377 1074df4f Isaku Yamahata
1378 163c8a59 Luiz Capitulino
static QObject *pci_get_bus_dict(PCIBus *bus, int bus_num)
1379 1074df4f Isaku Yamahata
{
1380 e822a52a Isaku Yamahata
    bus = pci_find_bus(bus, bus_num);
1381 502a5395 pbrook
    if (bus) {
1382 163c8a59 Luiz Capitulino
        return qobject_from_jsonf("{ 'bus': %d, 'devices': %p }",
1383 163c8a59 Luiz Capitulino
                                  bus_num, pci_get_devices_list(bus, bus_num));
1384 f2aa58c6 bellard
    }
1385 163c8a59 Luiz Capitulino
1386 163c8a59 Luiz Capitulino
    return NULL;
1387 f2aa58c6 bellard
}
1388 f2aa58c6 bellard
1389 163c8a59 Luiz Capitulino
void do_pci_info(Monitor *mon, QObject **ret_data)
1390 f2aa58c6 bellard
{
1391 163c8a59 Luiz Capitulino
    QList *bus_list;
1392 e822a52a Isaku Yamahata
    struct PCIHostBus *host;
1393 163c8a59 Luiz Capitulino
1394 163c8a59 Luiz Capitulino
    bus_list = qlist_new();
1395 163c8a59 Luiz Capitulino
1396 e822a52a Isaku Yamahata
    QLIST_FOREACH(host, &host_buses, next) {
1397 163c8a59 Luiz Capitulino
        QObject *obj = pci_get_bus_dict(host->bus, 0);
1398 163c8a59 Luiz Capitulino
        if (obj) {
1399 163c8a59 Luiz Capitulino
            qlist_append_obj(bus_list, obj);
1400 163c8a59 Luiz Capitulino
        }
1401 e822a52a Isaku Yamahata
    }
1402 163c8a59 Luiz Capitulino
1403 163c8a59 Luiz Capitulino
    *ret_data = QOBJECT(bus_list);
1404 77d4bc34 bellard
}
1405 a41b2ff2 pbrook
1406 cb457d76 aliguori
static const char * const pci_nic_models[] = {
1407 cb457d76 aliguori
    "ne2k_pci",
1408 cb457d76 aliguori
    "i82551",
1409 cb457d76 aliguori
    "i82557b",
1410 cb457d76 aliguori
    "i82559er",
1411 cb457d76 aliguori
    "rtl8139",
1412 cb457d76 aliguori
    "e1000",
1413 cb457d76 aliguori
    "pcnet",
1414 cb457d76 aliguori
    "virtio",
1415 cb457d76 aliguori
    NULL
1416 cb457d76 aliguori
};
1417 cb457d76 aliguori
1418 9d07d757 Paul Brook
static const char * const pci_nic_names[] = {
1419 9d07d757 Paul Brook
    "ne2k_pci",
1420 9d07d757 Paul Brook
    "i82551",
1421 9d07d757 Paul Brook
    "i82557b",
1422 9d07d757 Paul Brook
    "i82559er",
1423 9d07d757 Paul Brook
    "rtl8139",
1424 9d07d757 Paul Brook
    "e1000",
1425 9d07d757 Paul Brook
    "pcnet",
1426 53c25cea Paul Brook
    "virtio-net-pci",
1427 cb457d76 aliguori
    NULL
1428 cb457d76 aliguori
};
1429 cb457d76 aliguori
1430 a41b2ff2 pbrook
/* Initialize a PCI NIC.  */
1431 33e66b86 Markus Armbruster
/* FIXME callers should check for failure, but don't */
1432 5607c388 Markus Armbruster
PCIDevice *pci_nic_init(NICInfo *nd, const char *default_model,
1433 5607c388 Markus Armbruster
                        const char *default_devaddr)
1434 a41b2ff2 pbrook
{
1435 5607c388 Markus Armbruster
    const char *devaddr = nd->devaddr ? nd->devaddr : default_devaddr;
1436 07caea31 Markus Armbruster
    PCIBus *bus;
1437 07caea31 Markus Armbruster
    int devfn;
1438 5607c388 Markus Armbruster
    PCIDevice *pci_dev;
1439 9d07d757 Paul Brook
    DeviceState *dev;
1440 cb457d76 aliguori
    int i;
1441 cb457d76 aliguori
1442 07caea31 Markus Armbruster
    i = qemu_find_nic_model(nd, pci_nic_models, default_model);
1443 07caea31 Markus Armbruster
    if (i < 0)
1444 07caea31 Markus Armbruster
        return NULL;
1445 07caea31 Markus Armbruster
1446 07caea31 Markus Armbruster
    bus = pci_get_bus_devfn(&devfn, devaddr);
1447 07caea31 Markus Armbruster
    if (!bus) {
1448 1ecda02b Markus Armbruster
        error_report("Invalid PCI device address %s for device %s",
1449 1ecda02b Markus Armbruster
                     devaddr, pci_nic_names[i]);
1450 07caea31 Markus Armbruster
        return NULL;
1451 07caea31 Markus Armbruster
    }
1452 07caea31 Markus Armbruster
1453 499cf102 Markus Armbruster
    pci_dev = pci_create(bus, devfn, pci_nic_names[i]);
1454 9ee05825 Markus Armbruster
    dev = &pci_dev->qdev;
1455 1cc33683 Gerd Hoffmann
    qdev_set_nic_properties(dev, nd);
1456 07caea31 Markus Armbruster
    if (qdev_init(dev) < 0)
1457 07caea31 Markus Armbruster
        return NULL;
1458 9ee05825 Markus Armbruster
    return pci_dev;
1459 a41b2ff2 pbrook
}
1460 a41b2ff2 pbrook
1461 07caea31 Markus Armbruster
PCIDevice *pci_nic_init_nofail(NICInfo *nd, const char *default_model,
1462 07caea31 Markus Armbruster
                               const char *default_devaddr)
1463 07caea31 Markus Armbruster
{
1464 07caea31 Markus Armbruster
    PCIDevice *res;
1465 07caea31 Markus Armbruster
1466 07caea31 Markus Armbruster
    if (qemu_show_nic_models(nd->model, pci_nic_models))
1467 07caea31 Markus Armbruster
        exit(0);
1468 07caea31 Markus Armbruster
1469 07caea31 Markus Armbruster
    res = pci_nic_init(nd, default_model, default_devaddr);
1470 07caea31 Markus Armbruster
    if (!res)
1471 07caea31 Markus Armbruster
        exit(1);
1472 07caea31 Markus Armbruster
    return res;
1473 07caea31 Markus Armbruster
}
1474 07caea31 Markus Armbruster
1475 80b3ada7 pbrook
typedef struct {
1476 80b3ada7 pbrook
    PCIDevice dev;
1477 03587182 Gerd Hoffmann
    PCIBus bus;
1478 03587182 Gerd Hoffmann
    uint32_t vid;
1479 03587182 Gerd Hoffmann
    uint32_t did;
1480 80b3ada7 pbrook
} PCIBridge;
1481 80b3ada7 pbrook
1482 a0c7a97e Isaku Yamahata
1483 a0c7a97e Isaku Yamahata
static void pci_bridge_update_mappings_fn(PCIBus *b, PCIDevice *d)
1484 a0c7a97e Isaku Yamahata
{
1485 a0c7a97e Isaku Yamahata
    pci_update_mappings(d);
1486 a0c7a97e Isaku Yamahata
}
1487 a0c7a97e Isaku Yamahata
1488 a0c7a97e Isaku Yamahata
static void pci_bridge_update_mappings(PCIBus *b)
1489 a0c7a97e Isaku Yamahata
{
1490 a0c7a97e Isaku Yamahata
    PCIBus *child;
1491 a0c7a97e Isaku Yamahata
1492 a0c7a97e Isaku Yamahata
    pci_for_each_device_under_bus(b, pci_bridge_update_mappings_fn);
1493 a0c7a97e Isaku Yamahata
1494 a0c7a97e Isaku Yamahata
    QLIST_FOREACH(child, &b->child, sibling) {
1495 a0c7a97e Isaku Yamahata
        pci_bridge_update_mappings(child);
1496 a0c7a97e Isaku Yamahata
    }
1497 a0c7a97e Isaku Yamahata
}
1498 a0c7a97e Isaku Yamahata
1499 9596ebb7 pbrook
static void pci_bridge_write_config(PCIDevice *d,
1500 80b3ada7 pbrook
                             uint32_t address, uint32_t val, int len)
1501 80b3ada7 pbrook
{
1502 80b3ada7 pbrook
    pci_default_write_config(d, address, val, len);
1503 a0c7a97e Isaku Yamahata
1504 a0c7a97e Isaku Yamahata
    if (/* io base/limit */
1505 a0c7a97e Isaku Yamahata
        ranges_overlap(address, len, PCI_IO_BASE, 2) ||
1506 a0c7a97e Isaku Yamahata
1507 a0c7a97e Isaku Yamahata
        /* memory base/limit, prefetchable base/limit and
1508 a0c7a97e Isaku Yamahata
           io base/limit upper 16 */
1509 a0c7a97e Isaku Yamahata
        ranges_overlap(address, len, PCI_MEMORY_BASE, 20)) {
1510 a0c7a97e Isaku Yamahata
        pci_bridge_update_mappings(d->bus);
1511 a0c7a97e Isaku Yamahata
    }
1512 80b3ada7 pbrook
}
1513 80b3ada7 pbrook
1514 e822a52a Isaku Yamahata
PCIBus *pci_find_bus(PCIBus *bus, int bus_num)
1515 3ae80618 aliguori
{
1516 470e6363 Isaku Yamahata
    PCIBus *sec;
1517 3ae80618 aliguori
1518 470e6363 Isaku Yamahata
    if (!bus) {
1519 e822a52a Isaku Yamahata
        return NULL;
1520 470e6363 Isaku Yamahata
    }
1521 3ae80618 aliguori
1522 e822a52a Isaku Yamahata
    if (pci_bus_num(bus) == bus_num) {
1523 e822a52a Isaku Yamahata
        return bus;
1524 e822a52a Isaku Yamahata
    }
1525 e822a52a Isaku Yamahata
1526 e822a52a Isaku Yamahata
    /* try child bus */
1527 470e6363 Isaku Yamahata
    if (!bus->parent_dev /* host pci bridge */ ||
1528 470e6363 Isaku Yamahata
        (bus->parent_dev->config[PCI_SECONDARY_BUS] < bus_num &&
1529 470e6363 Isaku Yamahata
         bus_num <= bus->parent_dev->config[PCI_SUBORDINATE_BUS])) {
1530 470e6363 Isaku Yamahata
        for (; bus; bus = sec) {
1531 470e6363 Isaku Yamahata
            QLIST_FOREACH(sec, &bus->child, sibling) {
1532 470e6363 Isaku Yamahata
                assert(sec->parent_dev);
1533 470e6363 Isaku Yamahata
                if (sec->parent_dev->config[PCI_SECONDARY_BUS] == bus_num) {
1534 470e6363 Isaku Yamahata
                    return sec;
1535 470e6363 Isaku Yamahata
                }
1536 470e6363 Isaku Yamahata
                if (sec->parent_dev->config[PCI_SECONDARY_BUS] < bus_num &&
1537 470e6363 Isaku Yamahata
                    bus_num <= sec->parent_dev->config[PCI_SUBORDINATE_BUS]) {
1538 470e6363 Isaku Yamahata
                    break;
1539 470e6363 Isaku Yamahata
                }
1540 c021f8e6 Blue Swirl
            }
1541 e822a52a Isaku Yamahata
        }
1542 e822a52a Isaku Yamahata
    }
1543 e822a52a Isaku Yamahata
1544 e822a52a Isaku Yamahata
    return NULL;
1545 3ae80618 aliguori
}
1546 3ae80618 aliguori
1547 e822a52a Isaku Yamahata
PCIDevice *pci_find_device(PCIBus *bus, int bus_num, int slot, int function)
1548 3ae80618 aliguori
{
1549 e822a52a Isaku Yamahata
    bus = pci_find_bus(bus, bus_num);
1550 3ae80618 aliguori
1551 3ae80618 aliguori
    if (!bus)
1552 3ae80618 aliguori
        return NULL;
1553 3ae80618 aliguori
1554 3ae80618 aliguori
    return bus->devices[PCI_DEVFN(slot, function)];
1555 3ae80618 aliguori
}
1556 3ae80618 aliguori
1557 03587182 Gerd Hoffmann
static int pci_bridge_initfn(PCIDevice *dev)
1558 80b3ada7 pbrook
{
1559 03587182 Gerd Hoffmann
    PCIBridge *s = DO_UPCAST(PCIBridge, dev, dev);
1560 480b9f24 blueswir1
1561 03587182 Gerd Hoffmann
    pci_config_set_vendor_id(s->dev.config, s->vid);
1562 03587182 Gerd Hoffmann
    pci_config_set_device_id(s->dev.config, s->did);
1563 480b9f24 blueswir1
1564 74c01823 Isaku Yamahata
    pci_set_word(dev->config + PCI_STATUS,
1565 74c01823 Isaku Yamahata
                 PCI_STATUS_66MHZ | PCI_STATUS_FAST_BACK);
1566 74c01823 Isaku Yamahata
    pci_config_set_class(dev->config, PCI_CLASS_BRIDGE_PCI);
1567 e327e323 Isaku Yamahata
    dev->config[PCI_HEADER_TYPE] =
1568 e327e323 Isaku Yamahata
        (dev->config[PCI_HEADER_TYPE] & PCI_HEADER_TYPE_MULTI_FUNCTION) |
1569 e327e323 Isaku Yamahata
        PCI_HEADER_TYPE_BRIDGE;
1570 74c01823 Isaku Yamahata
    pci_set_word(dev->config + PCI_SEC_STATUS,
1571 74c01823 Isaku Yamahata
                 PCI_STATUS_66MHZ | PCI_STATUS_FAST_BACK);
1572 03587182 Gerd Hoffmann
    return 0;
1573 03587182 Gerd Hoffmann
}
1574 80b3ada7 pbrook
1575 e822a52a Isaku Yamahata
static int pci_bridge_exitfn(PCIDevice *pci_dev)
1576 e822a52a Isaku Yamahata
{
1577 e822a52a Isaku Yamahata
    PCIBridge *s = DO_UPCAST(PCIBridge, dev, pci_dev);
1578 e822a52a Isaku Yamahata
    PCIBus *bus = &s->bus;
1579 e822a52a Isaku Yamahata
    pci_unregister_secondary_bus(bus);
1580 e822a52a Isaku Yamahata
    return 0;
1581 e822a52a Isaku Yamahata
}
1582 e822a52a Isaku Yamahata
1583 03587182 Gerd Hoffmann
PCIBus *pci_bridge_init(PCIBus *bus, int devfn, uint16_t vid, uint16_t did,
1584 03587182 Gerd Hoffmann
                        pci_map_irq_fn map_irq, const char *name)
1585 03587182 Gerd Hoffmann
{
1586 03587182 Gerd Hoffmann
    PCIDevice *dev;
1587 03587182 Gerd Hoffmann
    PCIBridge *s;
1588 03587182 Gerd Hoffmann
1589 499cf102 Markus Armbruster
    dev = pci_create(bus, devfn, "pci-bridge");
1590 03587182 Gerd Hoffmann
    qdev_prop_set_uint32(&dev->qdev, "vendorid", vid);
1591 03587182 Gerd Hoffmann
    qdev_prop_set_uint32(&dev->qdev, "deviceid", did);
1592 e23a1b33 Markus Armbruster
    qdev_init_nofail(&dev->qdev);
1593 03587182 Gerd Hoffmann
1594 03587182 Gerd Hoffmann
    s = DO_UPCAST(PCIBridge, dev, dev);
1595 e822a52a Isaku Yamahata
    pci_register_secondary_bus(bus, &s->bus, &s->dev, map_irq, name);
1596 03587182 Gerd Hoffmann
    return &s->bus;
1597 80b3ada7 pbrook
}
1598 6b1b92d3 Paul Brook
1599 d6318738 Michael S. Tsirkin
PCIDevice *pci_bridge_get_device(PCIBus *bus)
1600 d6318738 Michael S. Tsirkin
{
1601 d6318738 Michael S. Tsirkin
    return bus->parent_dev;
1602 d6318738 Michael S. Tsirkin
}
1603 d6318738 Michael S. Tsirkin
1604 81a322d4 Gerd Hoffmann
static int pci_qdev_init(DeviceState *qdev, DeviceInfo *base)
1605 6b1b92d3 Paul Brook
{
1606 6b1b92d3 Paul Brook
    PCIDevice *pci_dev = (PCIDevice *)qdev;
1607 02e2da45 Paul Brook
    PCIDeviceInfo *info = container_of(base, PCIDeviceInfo, qdev);
1608 6b1b92d3 Paul Brook
    PCIBus *bus;
1609 ee995ffb Gerd Hoffmann
    int devfn, rc;
1610 6b1b92d3 Paul Brook
1611 a9f49946 Isaku Yamahata
    /* initialize cap_present for pci_is_express() and pci_config_size() */
1612 a9f49946 Isaku Yamahata
    if (info->is_express) {
1613 a9f49946 Isaku Yamahata
        pci_dev->cap_present |= QEMU_PCI_CAP_EXPRESS;
1614 a9f49946 Isaku Yamahata
    }
1615 a9f49946 Isaku Yamahata
1616 02e2da45 Paul Brook
    bus = FROM_QBUS(PCIBus, qdev_get_parent_bus(qdev));
1617 ee6847d1 Gerd Hoffmann
    devfn = pci_dev->devfn;
1618 16eaedf2 Gerd Hoffmann
    pci_dev = do_pci_register_device(pci_dev, bus, base->name, devfn,
1619 fb231628 Isaku Yamahata
                                     info->config_read, info->config_write,
1620 e327e323 Isaku Yamahata
                                     info->is_bridge);
1621 09e3acc6 Gerd Hoffmann
    if (pci_dev == NULL)
1622 09e3acc6 Gerd Hoffmann
        return -1;
1623 ee995ffb Gerd Hoffmann
    rc = info->init(pci_dev);
1624 925fe64a Alex Williamson
    if (rc != 0) {
1625 925fe64a Alex Williamson
        do_pci_unregister_device(pci_dev);
1626 ee995ffb Gerd Hoffmann
        return rc;
1627 925fe64a Alex Williamson
    }
1628 8c52c8f3 Gerd Hoffmann
1629 8c52c8f3 Gerd Hoffmann
    /* rom loading */
1630 8c52c8f3 Gerd Hoffmann
    if (pci_dev->romfile == NULL && info->romfile != NULL)
1631 8c52c8f3 Gerd Hoffmann
        pci_dev->romfile = qemu_strdup(info->romfile);
1632 8c52c8f3 Gerd Hoffmann
    pci_add_option_rom(pci_dev);
1633 8c52c8f3 Gerd Hoffmann
1634 ee995ffb Gerd Hoffmann
    if (qdev->hotplugged)
1635 87c30546 Isaku Yamahata
        bus->hotplug(bus->hotplug_qdev, pci_dev, 1);
1636 ee995ffb Gerd Hoffmann
    return 0;
1637 ee995ffb Gerd Hoffmann
}
1638 ee995ffb Gerd Hoffmann
1639 ee995ffb Gerd Hoffmann
static int pci_unplug_device(DeviceState *qdev)
1640 ee995ffb Gerd Hoffmann
{
1641 ee995ffb Gerd Hoffmann
    PCIDevice *dev = DO_UPCAST(PCIDevice, qdev, qdev);
1642 ee995ffb Gerd Hoffmann
1643 87c30546 Isaku Yamahata
    dev->bus->hotplug(dev->bus->hotplug_qdev, dev, 0);
1644 ee995ffb Gerd Hoffmann
    return 0;
1645 6b1b92d3 Paul Brook
}
1646 6b1b92d3 Paul Brook
1647 0aab0d3a Gerd Hoffmann
void pci_qdev_register(PCIDeviceInfo *info)
1648 6b1b92d3 Paul Brook
{
1649 02e2da45 Paul Brook
    info->qdev.init = pci_qdev_init;
1650 ee995ffb Gerd Hoffmann
    info->qdev.unplug = pci_unplug_device;
1651 a36a344d Gerd Hoffmann
    info->qdev.exit = pci_unregister_device;
1652 10c4c98a Gerd Hoffmann
    info->qdev.bus_info = &pci_bus_info;
1653 074f2fff Gerd Hoffmann
    qdev_register(&info->qdev);
1654 6b1b92d3 Paul Brook
}
1655 6b1b92d3 Paul Brook
1656 0aab0d3a Gerd Hoffmann
void pci_qdev_register_many(PCIDeviceInfo *info)
1657 0aab0d3a Gerd Hoffmann
{
1658 0aab0d3a Gerd Hoffmann
    while (info->qdev.name) {
1659 0aab0d3a Gerd Hoffmann
        pci_qdev_register(info);
1660 0aab0d3a Gerd Hoffmann
        info++;
1661 0aab0d3a Gerd Hoffmann
    }
1662 0aab0d3a Gerd Hoffmann
}
1663 0aab0d3a Gerd Hoffmann
1664 49823868 Isaku Yamahata
PCIDevice *pci_create_multifunction(PCIBus *bus, int devfn, bool multifunction,
1665 49823868 Isaku Yamahata
                                    const char *name)
1666 6b1b92d3 Paul Brook
{
1667 6b1b92d3 Paul Brook
    DeviceState *dev;
1668 6b1b92d3 Paul Brook
1669 02e2da45 Paul Brook
    dev = qdev_create(&bus->qbus, name);
1670 a6307b08 Gerd Hoffmann
    qdev_prop_set_uint32(dev, "addr", devfn);
1671 49823868 Isaku Yamahata
    qdev_prop_set_bit(dev, "multifunction", multifunction);
1672 71077c1c Gerd Hoffmann
    return DO_UPCAST(PCIDevice, qdev, dev);
1673 71077c1c Gerd Hoffmann
}
1674 6b1b92d3 Paul Brook
1675 49823868 Isaku Yamahata
PCIDevice *pci_create_simple_multifunction(PCIBus *bus, int devfn,
1676 49823868 Isaku Yamahata
                                           bool multifunction,
1677 49823868 Isaku Yamahata
                                           const char *name)
1678 71077c1c Gerd Hoffmann
{
1679 49823868 Isaku Yamahata
    PCIDevice *dev = pci_create_multifunction(bus, devfn, multifunction, name);
1680 e23a1b33 Markus Armbruster
    qdev_init_nofail(&dev->qdev);
1681 71077c1c Gerd Hoffmann
    return dev;
1682 6b1b92d3 Paul Brook
}
1683 6f4cbd39 Michael S. Tsirkin
1684 49823868 Isaku Yamahata
PCIDevice *pci_create(PCIBus *bus, int devfn, const char *name)
1685 49823868 Isaku Yamahata
{
1686 49823868 Isaku Yamahata
    return pci_create_multifunction(bus, devfn, false, name);
1687 49823868 Isaku Yamahata
}
1688 49823868 Isaku Yamahata
1689 49823868 Isaku Yamahata
PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name)
1690 49823868 Isaku Yamahata
{
1691 49823868 Isaku Yamahata
    return pci_create_simple_multifunction(bus, devfn, false, name);
1692 49823868 Isaku Yamahata
}
1693 49823868 Isaku Yamahata
1694 6f4cbd39 Michael S. Tsirkin
static int pci_find_space(PCIDevice *pdev, uint8_t size)
1695 6f4cbd39 Michael S. Tsirkin
{
1696 a9f49946 Isaku Yamahata
    int config_size = pci_config_size(pdev);
1697 6f4cbd39 Michael S. Tsirkin
    int offset = PCI_CONFIG_HEADER_SIZE;
1698 6f4cbd39 Michael S. Tsirkin
    int i;
1699 a9f49946 Isaku Yamahata
    for (i = PCI_CONFIG_HEADER_SIZE; i < config_size; ++i)
1700 6f4cbd39 Michael S. Tsirkin
        if (pdev->used[i])
1701 6f4cbd39 Michael S. Tsirkin
            offset = i + 1;
1702 6f4cbd39 Michael S. Tsirkin
        else if (i - offset + 1 == size)
1703 6f4cbd39 Michael S. Tsirkin
            return offset;
1704 6f4cbd39 Michael S. Tsirkin
    return 0;
1705 6f4cbd39 Michael S. Tsirkin
}
1706 6f4cbd39 Michael S. Tsirkin
1707 6f4cbd39 Michael S. Tsirkin
static uint8_t pci_find_capability_list(PCIDevice *pdev, uint8_t cap_id,
1708 6f4cbd39 Michael S. Tsirkin
                                        uint8_t *prev_p)
1709 6f4cbd39 Michael S. Tsirkin
{
1710 6f4cbd39 Michael S. Tsirkin
    uint8_t next, prev;
1711 6f4cbd39 Michael S. Tsirkin
1712 6f4cbd39 Michael S. Tsirkin
    if (!(pdev->config[PCI_STATUS] & PCI_STATUS_CAP_LIST))
1713 6f4cbd39 Michael S. Tsirkin
        return 0;
1714 6f4cbd39 Michael S. Tsirkin
1715 6f4cbd39 Michael S. Tsirkin
    for (prev = PCI_CAPABILITY_LIST; (next = pdev->config[prev]);
1716 6f4cbd39 Michael S. Tsirkin
         prev = next + PCI_CAP_LIST_NEXT)
1717 6f4cbd39 Michael S. Tsirkin
        if (pdev->config[next + PCI_CAP_LIST_ID] == cap_id)
1718 6f4cbd39 Michael S. Tsirkin
            break;
1719 6f4cbd39 Michael S. Tsirkin
1720 6f4cbd39 Michael S. Tsirkin
    if (prev_p)
1721 6f4cbd39 Michael S. Tsirkin
        *prev_p = prev;
1722 6f4cbd39 Michael S. Tsirkin
    return next;
1723 6f4cbd39 Michael S. Tsirkin
}
1724 6f4cbd39 Michael S. Tsirkin
1725 c2039bd0 Anthony Liguori
static void pci_map_option_rom(PCIDevice *pdev, int region_num, pcibus_t addr, pcibus_t size, int type)
1726 c2039bd0 Anthony Liguori
{
1727 c2039bd0 Anthony Liguori
    cpu_register_physical_memory(addr, size, pdev->rom_offset);
1728 c2039bd0 Anthony Liguori
}
1729 c2039bd0 Anthony Liguori
1730 c2039bd0 Anthony Liguori
/* Add an option rom for the device */
1731 8c52c8f3 Gerd Hoffmann
static int pci_add_option_rom(PCIDevice *pdev)
1732 c2039bd0 Anthony Liguori
{
1733 c2039bd0 Anthony Liguori
    int size;
1734 c2039bd0 Anthony Liguori
    char *path;
1735 c2039bd0 Anthony Liguori
    void *ptr;
1736 1724f049 Alex Williamson
    char name[32];
1737 c2039bd0 Anthony Liguori
1738 8c52c8f3 Gerd Hoffmann
    if (!pdev->romfile)
1739 8c52c8f3 Gerd Hoffmann
        return 0;
1740 8c52c8f3 Gerd Hoffmann
    if (strlen(pdev->romfile) == 0)
1741 8c52c8f3 Gerd Hoffmann
        return 0;
1742 8c52c8f3 Gerd Hoffmann
1743 88169ddf Gerd Hoffmann
    if (!pdev->rom_bar) {
1744 88169ddf Gerd Hoffmann
        /*
1745 88169ddf Gerd Hoffmann
         * Load rom via fw_cfg instead of creating a rom bar,
1746 88169ddf Gerd Hoffmann
         * for 0.11 compatibility.
1747 88169ddf Gerd Hoffmann
         */
1748 88169ddf Gerd Hoffmann
        int class = pci_get_word(pdev->config + PCI_CLASS_DEVICE);
1749 88169ddf Gerd Hoffmann
        if (class == 0x0300) {
1750 88169ddf Gerd Hoffmann
            rom_add_vga(pdev->romfile);
1751 88169ddf Gerd Hoffmann
        } else {
1752 88169ddf Gerd Hoffmann
            rom_add_option(pdev->romfile);
1753 88169ddf Gerd Hoffmann
        }
1754 88169ddf Gerd Hoffmann
        return 0;
1755 88169ddf Gerd Hoffmann
    }
1756 88169ddf Gerd Hoffmann
1757 8c52c8f3 Gerd Hoffmann
    path = qemu_find_file(QEMU_FILE_TYPE_BIOS, pdev->romfile);
1758 c2039bd0 Anthony Liguori
    if (path == NULL) {
1759 8c52c8f3 Gerd Hoffmann
        path = qemu_strdup(pdev->romfile);
1760 c2039bd0 Anthony Liguori
    }
1761 c2039bd0 Anthony Liguori
1762 c2039bd0 Anthony Liguori
    size = get_image_size(path);
1763 8c52c8f3 Gerd Hoffmann
    if (size < 0) {
1764 1ecda02b Markus Armbruster
        error_report("%s: failed to find romfile \"%s\"",
1765 1ecda02b Markus Armbruster
                     __FUNCTION__, pdev->romfile);
1766 8c52c8f3 Gerd Hoffmann
        return -1;
1767 8c52c8f3 Gerd Hoffmann
    }
1768 c2039bd0 Anthony Liguori
    if (size & (size - 1)) {
1769 c2039bd0 Anthony Liguori
        size = 1 << qemu_fls(size);
1770 c2039bd0 Anthony Liguori
    }
1771 c2039bd0 Anthony Liguori
1772 1724f049 Alex Williamson
    if (pdev->qdev.info->vmsd)
1773 1724f049 Alex Williamson
        snprintf(name, sizeof(name), "%s.rom", pdev->qdev.info->vmsd->name);
1774 1724f049 Alex Williamson
    else
1775 1724f049 Alex Williamson
        snprintf(name, sizeof(name), "%s.rom", pdev->qdev.info->name);
1776 1724f049 Alex Williamson
    pdev->rom_offset = qemu_ram_alloc(&pdev->qdev, name, size);
1777 c2039bd0 Anthony Liguori
1778 c2039bd0 Anthony Liguori
    ptr = qemu_get_ram_ptr(pdev->rom_offset);
1779 c2039bd0 Anthony Liguori
    load_image(path, ptr);
1780 c2039bd0 Anthony Liguori
    qemu_free(path);
1781 c2039bd0 Anthony Liguori
1782 c2039bd0 Anthony Liguori
    pci_register_bar(pdev, PCI_ROM_SLOT, size,
1783 c2039bd0 Anthony Liguori
                     0, pci_map_option_rom);
1784 c2039bd0 Anthony Liguori
1785 c2039bd0 Anthony Liguori
    return 0;
1786 c2039bd0 Anthony Liguori
}
1787 c2039bd0 Anthony Liguori
1788 230741dc Alex Williamson
static void pci_del_option_rom(PCIDevice *pdev)
1789 230741dc Alex Williamson
{
1790 230741dc Alex Williamson
    if (!pdev->rom_offset)
1791 230741dc Alex Williamson
        return;
1792 230741dc Alex Williamson
1793 230741dc Alex Williamson
    qemu_ram_free(pdev->rom_offset);
1794 230741dc Alex Williamson
    pdev->rom_offset = 0;
1795 230741dc Alex Williamson
}
1796 230741dc Alex Williamson
1797 6f4cbd39 Michael S. Tsirkin
/* Reserve space and add capability to the linked list in pci config space */
1798 1db5a3aa Michael S. Tsirkin
int pci_add_capability_at_offset(PCIDevice *pdev, uint8_t cap_id,
1799 1db5a3aa Michael S. Tsirkin
                                 uint8_t offset, uint8_t size)
1800 6f4cbd39 Michael S. Tsirkin
{
1801 6f4cbd39 Michael S. Tsirkin
    uint8_t *config = pdev->config + offset;
1802 6f4cbd39 Michael S. Tsirkin
    config[PCI_CAP_LIST_ID] = cap_id;
1803 6f4cbd39 Michael S. Tsirkin
    config[PCI_CAP_LIST_NEXT] = pdev->config[PCI_CAPABILITY_LIST];
1804 6f4cbd39 Michael S. Tsirkin
    pdev->config[PCI_CAPABILITY_LIST] = offset;
1805 6f4cbd39 Michael S. Tsirkin
    pdev->config[PCI_STATUS] |= PCI_STATUS_CAP_LIST;
1806 6f4cbd39 Michael S. Tsirkin
    memset(pdev->used + offset, 0xFF, size);
1807 6f4cbd39 Michael S. Tsirkin
    /* Make capability read-only by default */
1808 6f4cbd39 Michael S. Tsirkin
    memset(pdev->wmask + offset, 0, size);
1809 bd4b65ee Michael S. Tsirkin
    /* Check capability by default */
1810 bd4b65ee Michael S. Tsirkin
    memset(pdev->cmask + offset, 0xFF, size);
1811 6f4cbd39 Michael S. Tsirkin
    return offset;
1812 6f4cbd39 Michael S. Tsirkin
}
1813 6f4cbd39 Michael S. Tsirkin
1814 1db5a3aa Michael S. Tsirkin
/* Find and reserve space and add capability to the linked list
1815 1db5a3aa Michael S. Tsirkin
 * in pci config space */
1816 1db5a3aa Michael S. Tsirkin
int pci_add_capability(PCIDevice *pdev, uint8_t cap_id, uint8_t size)
1817 1db5a3aa Michael S. Tsirkin
{
1818 1db5a3aa Michael S. Tsirkin
    uint8_t offset = pci_find_space(pdev, size);
1819 1db5a3aa Michael S. Tsirkin
    if (!offset) {
1820 1db5a3aa Michael S. Tsirkin
        return -ENOSPC;
1821 1db5a3aa Michael S. Tsirkin
    }
1822 1db5a3aa Michael S. Tsirkin
    return pci_add_capability_at_offset(pdev, cap_id, offset, size);
1823 1db5a3aa Michael S. Tsirkin
}
1824 1db5a3aa Michael S. Tsirkin
1825 6f4cbd39 Michael S. Tsirkin
/* Unlink capability from the pci config space. */
1826 6f4cbd39 Michael S. Tsirkin
void pci_del_capability(PCIDevice *pdev, uint8_t cap_id, uint8_t size)
1827 6f4cbd39 Michael S. Tsirkin
{
1828 6f4cbd39 Michael S. Tsirkin
    uint8_t prev, offset = pci_find_capability_list(pdev, cap_id, &prev);
1829 6f4cbd39 Michael S. Tsirkin
    if (!offset)
1830 6f4cbd39 Michael S. Tsirkin
        return;
1831 6f4cbd39 Michael S. Tsirkin
    pdev->config[prev] = pdev->config[offset + PCI_CAP_LIST_NEXT];
1832 6f4cbd39 Michael S. Tsirkin
    /* Make capability writeable again */
1833 6f4cbd39 Michael S. Tsirkin
    memset(pdev->wmask + offset, 0xff, size);
1834 bd4b65ee Michael S. Tsirkin
    /* Clear cmask as device-specific registers can't be checked */
1835 bd4b65ee Michael S. Tsirkin
    memset(pdev->cmask + offset, 0, size);
1836 6f4cbd39 Michael S. Tsirkin
    memset(pdev->used + offset, 0, size);
1837 6f4cbd39 Michael S. Tsirkin
1838 6f4cbd39 Michael S. Tsirkin
    if (!pdev->config[PCI_CAPABILITY_LIST])
1839 6f4cbd39 Michael S. Tsirkin
        pdev->config[PCI_STATUS] &= ~PCI_STATUS_CAP_LIST;
1840 6f4cbd39 Michael S. Tsirkin
}
1841 6f4cbd39 Michael S. Tsirkin
1842 6f4cbd39 Michael S. Tsirkin
/* Reserve space for capability at a known offset (to call after load). */
1843 6f4cbd39 Michael S. Tsirkin
void pci_reserve_capability(PCIDevice *pdev, uint8_t offset, uint8_t size)
1844 6f4cbd39 Michael S. Tsirkin
{
1845 6f4cbd39 Michael S. Tsirkin
    memset(pdev->used + offset, 0xff, size);
1846 6f4cbd39 Michael S. Tsirkin
}
1847 6f4cbd39 Michael S. Tsirkin
1848 6f4cbd39 Michael S. Tsirkin
uint8_t pci_find_capability(PCIDevice *pdev, uint8_t cap_id)
1849 6f4cbd39 Michael S. Tsirkin
{
1850 6f4cbd39 Michael S. Tsirkin
    return pci_find_capability_list(pdev, cap_id, NULL);
1851 6f4cbd39 Michael S. Tsirkin
}
1852 10c4c98a Gerd Hoffmann
1853 10c4c98a Gerd Hoffmann
static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent)
1854 10c4c98a Gerd Hoffmann
{
1855 10c4c98a Gerd Hoffmann
    PCIDevice *d = (PCIDevice *)dev;
1856 10c4c98a Gerd Hoffmann
    const pci_class_desc *desc;
1857 10c4c98a Gerd Hoffmann
    char ctxt[64];
1858 10c4c98a Gerd Hoffmann
    PCIIORegion *r;
1859 10c4c98a Gerd Hoffmann
    int i, class;
1860 10c4c98a Gerd Hoffmann
1861 b0ff8eb2 Isaku Yamahata
    class = pci_get_word(d->config + PCI_CLASS_DEVICE);
1862 10c4c98a Gerd Hoffmann
    desc = pci_class_descriptions;
1863 10c4c98a Gerd Hoffmann
    while (desc->desc && class != desc->class)
1864 10c4c98a Gerd Hoffmann
        desc++;
1865 10c4c98a Gerd Hoffmann
    if (desc->desc) {
1866 10c4c98a Gerd Hoffmann
        snprintf(ctxt, sizeof(ctxt), "%s", desc->desc);
1867 10c4c98a Gerd Hoffmann
    } else {
1868 10c4c98a Gerd Hoffmann
        snprintf(ctxt, sizeof(ctxt), "Class %04x", class);
1869 10c4c98a Gerd Hoffmann
    }
1870 10c4c98a Gerd Hoffmann
1871 10c4c98a Gerd Hoffmann
    monitor_printf(mon, "%*sclass %s, addr %02x:%02x.%x, "
1872 10c4c98a Gerd Hoffmann
                   "pci id %04x:%04x (sub %04x:%04x)\n",
1873 10c4c98a Gerd Hoffmann
                   indent, "", ctxt,
1874 e822a52a Isaku Yamahata
                   d->config[PCI_SECONDARY_BUS],
1875 e822a52a Isaku Yamahata
                   PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
1876 b0ff8eb2 Isaku Yamahata
                   pci_get_word(d->config + PCI_VENDOR_ID),
1877 b0ff8eb2 Isaku Yamahata
                   pci_get_word(d->config + PCI_DEVICE_ID),
1878 b0ff8eb2 Isaku Yamahata
                   pci_get_word(d->config + PCI_SUBSYSTEM_VENDOR_ID),
1879 b0ff8eb2 Isaku Yamahata
                   pci_get_word(d->config + PCI_SUBSYSTEM_ID));
1880 10c4c98a Gerd Hoffmann
    for (i = 0; i < PCI_NUM_REGIONS; i++) {
1881 10c4c98a Gerd Hoffmann
        r = &d->io_regions[i];
1882 10c4c98a Gerd Hoffmann
        if (!r->size)
1883 10c4c98a Gerd Hoffmann
            continue;
1884 89e8b13c Isaku Yamahata
        monitor_printf(mon, "%*sbar %d: %s at 0x%"FMT_PCIBUS
1885 89e8b13c Isaku Yamahata
                       " [0x%"FMT_PCIBUS"]\n",
1886 89e8b13c Isaku Yamahata
                       indent, "",
1887 0392a017 Isaku Yamahata
                       i, r->type & PCI_BASE_ADDRESS_SPACE_IO ? "i/o" : "mem",
1888 10c4c98a Gerd Hoffmann
                       r->addr, r->addr + r->size - 1);
1889 10c4c98a Gerd Hoffmann
    }
1890 10c4c98a Gerd Hoffmann
}
1891 03587182 Gerd Hoffmann
1892 4f43c1ff Alex Williamson
static char *pcibus_get_dev_path(DeviceState *dev)
1893 4f43c1ff Alex Williamson
{
1894 4f43c1ff Alex Williamson
    PCIDevice *d = (PCIDevice *)dev;
1895 4f43c1ff Alex Williamson
    char path[16];
1896 4f43c1ff Alex Williamson
1897 4f43c1ff Alex Williamson
    snprintf(path, sizeof(path), "%04x:%02x:%02x.%x",
1898 4f43c1ff Alex Williamson
             pci_find_domain(d->bus), d->config[PCI_SECONDARY_BUS],
1899 4f43c1ff Alex Williamson
             PCI_SLOT(d->devfn), PCI_FUNC(d->devfn));
1900 4f43c1ff Alex Williamson
1901 4f43c1ff Alex Williamson
    return strdup(path);
1902 4f43c1ff Alex Williamson
}
1903 4f43c1ff Alex Williamson
1904 03587182 Gerd Hoffmann
static PCIDeviceInfo bridge_info = {
1905 03587182 Gerd Hoffmann
    .qdev.name    = "pci-bridge",
1906 03587182 Gerd Hoffmann
    .qdev.size    = sizeof(PCIBridge),
1907 03587182 Gerd Hoffmann
    .init         = pci_bridge_initfn,
1908 e822a52a Isaku Yamahata
    .exit         = pci_bridge_exitfn,
1909 03587182 Gerd Hoffmann
    .config_write = pci_bridge_write_config,
1910 e327e323 Isaku Yamahata
    .is_bridge    = 1,
1911 03587182 Gerd Hoffmann
    .qdev.props   = (Property[]) {
1912 03587182 Gerd Hoffmann
        DEFINE_PROP_HEX32("vendorid", PCIBridge, vid, 0),
1913 03587182 Gerd Hoffmann
        DEFINE_PROP_HEX32("deviceid", PCIBridge, did, 0),
1914 03587182 Gerd Hoffmann
        DEFINE_PROP_END_OF_LIST(),
1915 03587182 Gerd Hoffmann
    }
1916 03587182 Gerd Hoffmann
};
1917 03587182 Gerd Hoffmann
1918 03587182 Gerd Hoffmann
static void pci_register_devices(void)
1919 03587182 Gerd Hoffmann
{
1920 03587182 Gerd Hoffmann
    pci_qdev_register(&bridge_info);
1921 03587182 Gerd Hoffmann
}
1922 03587182 Gerd Hoffmann
1923 03587182 Gerd Hoffmann
device_init(pci_register_devices)