Statistics
| Branch: | Revision:

root / hw / pci.c @ 0be71e32

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