Statistics
| Branch: | Revision:

root / hw / pci.c @ f9aebe2e

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