Statistics
| Branch: | Revision:

root / hw / pci.c @ bc20ba98

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