Statistics
| Branch: | Revision:

root / hw / pci.c @ c06aaf01

History | View | Annotate | Download (60.6 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 376253ec aliguori
#include "monitor.h"
29 87ecb68b pbrook
#include "net.h"
30 880345c4 aliguori
#include "sysemu.h"
31 c2039bd0 Anthony Liguori
#include "loader.h"
32 bf1b0071 Blue Swirl
#include "range.h"
33 79627472 Luiz Capitulino
#include "qmp-commands.h"
34 cbd2d434 Jan Kiszka
#include "msi.h"
35 cbd2d434 Jan Kiszka
#include "msix.h"
36 69b91039 bellard
37 69b91039 bellard
//#define DEBUG_PCI
38 d8d2e079 Isaku Yamahata
#ifdef DEBUG_PCI
39 2e49d64a Isaku Yamahata
# define PCI_DPRINTF(format, ...)       printf(format, ## __VA_ARGS__)
40 d8d2e079 Isaku Yamahata
#else
41 d8d2e079 Isaku Yamahata
# define PCI_DPRINTF(format, ...)       do { } while (0)
42 d8d2e079 Isaku Yamahata
#endif
43 69b91039 bellard
44 10c4c98a Gerd Hoffmann
static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent);
45 4f43c1ff Alex Williamson
static char *pcibus_get_dev_path(DeviceState *dev);
46 5e0259e7 Gleb Natapov
static char *pcibus_get_fw_dev_path(DeviceState *dev);
47 9bb33586 Isaku Yamahata
static int pcibus_reset(BusState *qbus);
48 10c4c98a Gerd Hoffmann
49 3cb75a7c Paolo Bonzini
static Property pci_props[] = {
50 3cb75a7c Paolo Bonzini
    DEFINE_PROP_PCI_DEVFN("addr", PCIDevice, devfn, -1),
51 3cb75a7c Paolo Bonzini
    DEFINE_PROP_STRING("romfile", PCIDevice, romfile),
52 3cb75a7c Paolo Bonzini
    DEFINE_PROP_UINT32("rombar",  PCIDevice, rom_bar, 1),
53 3cb75a7c Paolo Bonzini
    DEFINE_PROP_BIT("multifunction", PCIDevice, cap_present,
54 3cb75a7c Paolo Bonzini
                    QEMU_PCI_CAP_MULTIFUNCTION_BITNR, false),
55 3cb75a7c Paolo Bonzini
    DEFINE_PROP_BIT("command_serr_enable", PCIDevice, cap_present,
56 3cb75a7c Paolo Bonzini
                    QEMU_PCI_CAP_SERR_BITNR, true),
57 3cb75a7c Paolo Bonzini
    DEFINE_PROP_END_OF_LIST()
58 3cb75a7c Paolo Bonzini
};
59 3cb75a7c Paolo Bonzini
60 0d936928 Anthony Liguori
static void pci_bus_class_init(ObjectClass *klass, void *data)
61 0d936928 Anthony Liguori
{
62 0d936928 Anthony Liguori
    BusClass *k = BUS_CLASS(klass);
63 0d936928 Anthony Liguori
64 0d936928 Anthony Liguori
    k->print_dev = pcibus_dev_print;
65 0d936928 Anthony Liguori
    k->get_dev_path = pcibus_get_dev_path;
66 0d936928 Anthony Liguori
    k->get_fw_dev_path = pcibus_get_fw_dev_path;
67 0d936928 Anthony Liguori
    k->reset = pcibus_reset;
68 0d936928 Anthony Liguori
}
69 0d936928 Anthony Liguori
70 0d936928 Anthony Liguori
static const TypeInfo pci_bus_info = {
71 0d936928 Anthony Liguori
    .name = TYPE_PCI_BUS,
72 0d936928 Anthony Liguori
    .parent = TYPE_BUS,
73 0d936928 Anthony Liguori
    .instance_size = sizeof(PCIBus),
74 0d936928 Anthony Liguori
    .class_init = pci_bus_class_init,
75 30468f78 bellard
};
76 69b91039 bellard
77 d662210a Michael S. Tsirkin
static PCIBus *pci_find_bus_nr(PCIBus *bus, int bus_num);
78 1941d19c bellard
static void pci_update_mappings(PCIDevice *d);
79 d537cf6c pbrook
static void pci_set_irq(void *opaque, int irq_num, int level);
80 ab85ceb1 Stefan Weil
static int pci_add_option_rom(PCIDevice *pdev, bool is_default_rom);
81 230741dc Alex Williamson
static void pci_del_option_rom(PCIDevice *pdev);
82 1941d19c bellard
83 d350d97d aliguori
static uint16_t pci_default_sub_vendor_id = PCI_SUBVENDOR_ID_REDHAT_QUMRANET;
84 d350d97d aliguori
static uint16_t pci_default_sub_device_id = PCI_SUBDEVICE_ID_QEMU;
85 e822a52a Isaku Yamahata
86 e822a52a Isaku Yamahata
struct PCIHostBus {
87 e822a52a Isaku Yamahata
    int domain;
88 e822a52a Isaku Yamahata
    struct PCIBus *bus;
89 e822a52a Isaku Yamahata
    QLIST_ENTRY(PCIHostBus) next;
90 e822a52a Isaku Yamahata
};
91 e822a52a Isaku Yamahata
static QLIST_HEAD(, PCIHostBus) host_buses;
92 30468f78 bellard
93 2d1e9f96 Juan Quintela
static const VMStateDescription vmstate_pcibus = {
94 2d1e9f96 Juan Quintela
    .name = "PCIBUS",
95 2d1e9f96 Juan Quintela
    .version_id = 1,
96 2d1e9f96 Juan Quintela
    .minimum_version_id = 1,
97 2d1e9f96 Juan Quintela
    .minimum_version_id_old = 1,
98 2d1e9f96 Juan Quintela
    .fields      = (VMStateField []) {
99 2d1e9f96 Juan Quintela
        VMSTATE_INT32_EQUAL(nirq, PCIBus),
100 c7bde572 Juan Quintela
        VMSTATE_VARRAY_INT32(irq_count, PCIBus, nirq, 0, vmstate_info_int32, int32_t),
101 2d1e9f96 Juan Quintela
        VMSTATE_END_OF_LIST()
102 52fc1d83 balrog
    }
103 2d1e9f96 Juan Quintela
};
104 b3b11697 Isaku Yamahata
static int pci_bar(PCIDevice *d, int reg)
105 5330de09 Michael S. Tsirkin
{
106 b3b11697 Isaku Yamahata
    uint8_t type;
107 b3b11697 Isaku Yamahata
108 b3b11697 Isaku Yamahata
    if (reg != PCI_ROM_SLOT)
109 b3b11697 Isaku Yamahata
        return PCI_BASE_ADDRESS_0 + reg * 4;
110 b3b11697 Isaku Yamahata
111 b3b11697 Isaku Yamahata
    type = d->config[PCI_HEADER_TYPE] & ~PCI_HEADER_TYPE_MULTI_FUNCTION;
112 b3b11697 Isaku Yamahata
    return type == PCI_HEADER_TYPE_BRIDGE ? PCI_ROM_ADDRESS1 : PCI_ROM_ADDRESS;
113 5330de09 Michael S. Tsirkin
}
114 5330de09 Michael S. Tsirkin
115 d036bb21 Michael S. Tsirkin
static inline int pci_irq_state(PCIDevice *d, int irq_num)
116 d036bb21 Michael S. Tsirkin
{
117 d036bb21 Michael S. Tsirkin
        return (d->irq_state >> irq_num) & 0x1;
118 d036bb21 Michael S. Tsirkin
}
119 d036bb21 Michael S. Tsirkin
120 d036bb21 Michael S. Tsirkin
static inline void pci_set_irq_state(PCIDevice *d, int irq_num, int level)
121 d036bb21 Michael S. Tsirkin
{
122 d036bb21 Michael S. Tsirkin
        d->irq_state &= ~(0x1 << irq_num);
123 d036bb21 Michael S. Tsirkin
        d->irq_state |= level << irq_num;
124 d036bb21 Michael S. Tsirkin
}
125 d036bb21 Michael S. Tsirkin
126 d036bb21 Michael S. Tsirkin
static void pci_change_irq_level(PCIDevice *pci_dev, int irq_num, int change)
127 d036bb21 Michael S. Tsirkin
{
128 d036bb21 Michael S. Tsirkin
    PCIBus *bus;
129 d036bb21 Michael S. Tsirkin
    for (;;) {
130 d036bb21 Michael S. Tsirkin
        bus = pci_dev->bus;
131 d036bb21 Michael S. Tsirkin
        irq_num = bus->map_irq(pci_dev, irq_num);
132 d036bb21 Michael S. Tsirkin
        if (bus->set_irq)
133 d036bb21 Michael S. Tsirkin
            break;
134 d036bb21 Michael S. Tsirkin
        pci_dev = bus->parent_dev;
135 d036bb21 Michael S. Tsirkin
    }
136 d036bb21 Michael S. Tsirkin
    bus->irq_count[irq_num] += change;
137 d036bb21 Michael S. Tsirkin
    bus->set_irq(bus->irq_opaque, irq_num, bus->irq_count[irq_num] != 0);
138 d036bb21 Michael S. Tsirkin
}
139 d036bb21 Michael S. Tsirkin
140 9ddf8437 Isaku Yamahata
int pci_bus_get_irq_level(PCIBus *bus, int irq_num)
141 9ddf8437 Isaku Yamahata
{
142 9ddf8437 Isaku Yamahata
    assert(irq_num >= 0);
143 9ddf8437 Isaku Yamahata
    assert(irq_num < bus->nirq);
144 9ddf8437 Isaku Yamahata
    return !!bus->irq_count[irq_num];
145 9ddf8437 Isaku Yamahata
}
146 9ddf8437 Isaku Yamahata
147 f9bf77dd Michael S. Tsirkin
/* Update interrupt status bit in config space on interrupt
148 f9bf77dd Michael S. Tsirkin
 * state change. */
149 f9bf77dd Michael S. Tsirkin
static void pci_update_irq_status(PCIDevice *dev)
150 f9bf77dd Michael S. Tsirkin
{
151 f9bf77dd Michael S. Tsirkin
    if (dev->irq_state) {
152 f9bf77dd Michael S. Tsirkin
        dev->config[PCI_STATUS] |= PCI_STATUS_INTERRUPT;
153 f9bf77dd Michael S. Tsirkin
    } else {
154 f9bf77dd Michael S. Tsirkin
        dev->config[PCI_STATUS] &= ~PCI_STATUS_INTERRUPT;
155 f9bf77dd Michael S. Tsirkin
    }
156 f9bf77dd Michael S. Tsirkin
}
157 f9bf77dd Michael S. Tsirkin
158 4c92325b Isaku Yamahata
void pci_device_deassert_intx(PCIDevice *dev)
159 4c92325b Isaku Yamahata
{
160 4c92325b Isaku Yamahata
    int i;
161 4c92325b Isaku Yamahata
    for (i = 0; i < PCI_NUM_PINS; ++i) {
162 4c92325b Isaku Yamahata
        qemu_set_irq(dev->irq[i], 0);
163 4c92325b Isaku Yamahata
    }
164 4c92325b Isaku Yamahata
}
165 4c92325b Isaku Yamahata
166 0ead87c8 Isaku Yamahata
/*
167 0ead87c8 Isaku Yamahata
 * This function is called on #RST and FLR.
168 0ead87c8 Isaku Yamahata
 * FLR if PCI_EXP_DEVCTL_BCR_FLR is set
169 0ead87c8 Isaku Yamahata
 */
170 0ead87c8 Isaku Yamahata
void pci_device_reset(PCIDevice *dev)
171 5330de09 Michael S. Tsirkin
{
172 c0b1905b Michael S. Tsirkin
    int r;
173 6fc4925b Anthony Liguori
174 6fc4925b Anthony Liguori
    qdev_reset_all(&dev->qdev);
175 c0b1905b Michael S. Tsirkin
176 d036bb21 Michael S. Tsirkin
    dev->irq_state = 0;
177 f9bf77dd Michael S. Tsirkin
    pci_update_irq_status(dev);
178 4c92325b Isaku Yamahata
    pci_device_deassert_intx(dev);
179 ebabb67a Stefan Weil
    /* Clear all writable bits */
180 99443c21 Isaku Yamahata
    pci_word_test_and_clear_mask(dev->config + PCI_COMMAND,
181 f9aebe2e Michael S. Tsirkin
                                 pci_get_word(dev->wmask + PCI_COMMAND) |
182 f9aebe2e Michael S. Tsirkin
                                 pci_get_word(dev->w1cmask + PCI_COMMAND));
183 89d437df Isaku Yamahata
    pci_word_test_and_clear_mask(dev->config + PCI_STATUS,
184 89d437df Isaku Yamahata
                                 pci_get_word(dev->wmask + PCI_STATUS) |
185 89d437df Isaku Yamahata
                                 pci_get_word(dev->w1cmask + PCI_STATUS));
186 c0b1905b Michael S. Tsirkin
    dev->config[PCI_CACHE_LINE_SIZE] = 0x0;
187 c0b1905b Michael S. Tsirkin
    dev->config[PCI_INTERRUPT_LINE] = 0x0;
188 c0b1905b Michael S. Tsirkin
    for (r = 0; r < PCI_NUM_REGIONS; ++r) {
189 71ebd6dc Isaku Yamahata
        PCIIORegion *region = &dev->io_regions[r];
190 71ebd6dc Isaku Yamahata
        if (!region->size) {
191 c0b1905b Michael S. Tsirkin
            continue;
192 c0b1905b Michael S. Tsirkin
        }
193 71ebd6dc Isaku Yamahata
194 71ebd6dc Isaku Yamahata
        if (!(region->type & PCI_BASE_ADDRESS_SPACE_IO) &&
195 71ebd6dc Isaku Yamahata
            region->type & PCI_BASE_ADDRESS_MEM_TYPE_64) {
196 71ebd6dc Isaku Yamahata
            pci_set_quad(dev->config + pci_bar(dev, r), region->type);
197 71ebd6dc Isaku Yamahata
        } else {
198 71ebd6dc Isaku Yamahata
            pci_set_long(dev->config + pci_bar(dev, r), region->type);
199 71ebd6dc Isaku Yamahata
        }
200 c0b1905b Michael S. Tsirkin
    }
201 c0b1905b Michael S. Tsirkin
    pci_update_mappings(dev);
202 cbd2d434 Jan Kiszka
203 cbd2d434 Jan Kiszka
    msi_reset(dev);
204 cbd2d434 Jan Kiszka
    msix_reset(dev);
205 5330de09 Michael S. Tsirkin
}
206 5330de09 Michael S. Tsirkin
207 9bb33586 Isaku Yamahata
/*
208 9bb33586 Isaku Yamahata
 * Trigger pci bus reset under a given bus.
209 9bb33586 Isaku Yamahata
 * To be called on RST# assert.
210 9bb33586 Isaku Yamahata
 */
211 9bb33586 Isaku Yamahata
void pci_bus_reset(PCIBus *bus)
212 6eaa6847 Gleb Natapov
{
213 6eaa6847 Gleb Natapov
    int i;
214 6eaa6847 Gleb Natapov
215 6eaa6847 Gleb Natapov
    for (i = 0; i < bus->nirq; i++) {
216 6eaa6847 Gleb Natapov
        bus->irq_count[i] = 0;
217 6eaa6847 Gleb Natapov
    }
218 5330de09 Michael S. Tsirkin
    for (i = 0; i < ARRAY_SIZE(bus->devices); ++i) {
219 5330de09 Michael S. Tsirkin
        if (bus->devices[i]) {
220 5330de09 Michael S. Tsirkin
            pci_device_reset(bus->devices[i]);
221 5330de09 Michael S. Tsirkin
        }
222 6eaa6847 Gleb Natapov
    }
223 6eaa6847 Gleb Natapov
}
224 6eaa6847 Gleb Natapov
225 9bb33586 Isaku Yamahata
static int pcibus_reset(BusState *qbus)
226 9bb33586 Isaku Yamahata
{
227 9bb33586 Isaku Yamahata
    pci_bus_reset(DO_UPCAST(PCIBus, qbus, qbus));
228 9bb33586 Isaku Yamahata
229 9bb33586 Isaku Yamahata
    /* topology traverse is done by pci_bus_reset().
230 9bb33586 Isaku Yamahata
       Tell qbus/qdev walker not to traverse the tree */
231 9bb33586 Isaku Yamahata
    return 1;
232 9bb33586 Isaku Yamahata
}
233 9bb33586 Isaku Yamahata
234 e822a52a Isaku Yamahata
static void pci_host_bus_register(int domain, PCIBus *bus)
235 e822a52a Isaku Yamahata
{
236 e822a52a Isaku Yamahata
    struct PCIHostBus *host;
237 7267c094 Anthony Liguori
    host = g_malloc0(sizeof(*host));
238 e822a52a Isaku Yamahata
    host->domain = domain;
239 e822a52a Isaku Yamahata
    host->bus = bus;
240 e822a52a Isaku Yamahata
    QLIST_INSERT_HEAD(&host_buses, host, next);
241 e822a52a Isaku Yamahata
}
242 e822a52a Isaku Yamahata
243 c469e1dd Isaku Yamahata
PCIBus *pci_find_root_bus(int domain)
244 e822a52a Isaku Yamahata
{
245 e822a52a Isaku Yamahata
    struct PCIHostBus *host;
246 e822a52a Isaku Yamahata
247 e822a52a Isaku Yamahata
    QLIST_FOREACH(host, &host_buses, next) {
248 e822a52a Isaku Yamahata
        if (host->domain == domain) {
249 e822a52a Isaku Yamahata
            return host->bus;
250 e822a52a Isaku Yamahata
        }
251 e822a52a Isaku Yamahata
    }
252 e822a52a Isaku Yamahata
253 e822a52a Isaku Yamahata
    return NULL;
254 e822a52a Isaku Yamahata
}
255 e822a52a Isaku Yamahata
256 e075e788 Isaku Yamahata
int pci_find_domain(const PCIBus *bus)
257 e075e788 Isaku Yamahata
{
258 e075e788 Isaku Yamahata
    PCIDevice *d;
259 e075e788 Isaku Yamahata
    struct PCIHostBus *host;
260 e075e788 Isaku Yamahata
261 e075e788 Isaku Yamahata
    /* obtain root bus */
262 e075e788 Isaku Yamahata
    while ((d = bus->parent_dev) != NULL) {
263 e075e788 Isaku Yamahata
        bus = d->bus;
264 e075e788 Isaku Yamahata
    }
265 e075e788 Isaku Yamahata
266 e075e788 Isaku Yamahata
    QLIST_FOREACH(host, &host_buses, next) {
267 e075e788 Isaku Yamahata
        if (host->bus == bus) {
268 e075e788 Isaku Yamahata
            return host->domain;
269 e075e788 Isaku Yamahata
        }
270 e075e788 Isaku Yamahata
    }
271 e075e788 Isaku Yamahata
272 e075e788 Isaku Yamahata
    abort();    /* should not be reached */
273 e075e788 Isaku Yamahata
    return -1;
274 e075e788 Isaku Yamahata
}
275 e075e788 Isaku Yamahata
276 21eea4b3 Gerd Hoffmann
void pci_bus_new_inplace(PCIBus *bus, DeviceState *parent,
277 1e39101c Avi Kivity
                         const char *name,
278 aee97b84 Avi Kivity
                         MemoryRegion *address_space_mem,
279 aee97b84 Avi Kivity
                         MemoryRegion *address_space_io,
280 1e39101c Avi Kivity
                         uint8_t devfn_min)
281 30468f78 bellard
{
282 0d936928 Anthony Liguori
    qbus_create_inplace(&bus->qbus, TYPE_PCI_BUS, parent, name);
283 6fa84913 Isaku Yamahata
    assert(PCI_FUNC(devfn_min) == 0);
284 502a5395 pbrook
    bus->devfn_min = devfn_min;
285 5968eca3 Avi Kivity
    bus->address_space_mem = address_space_mem;
286 5968eca3 Avi Kivity
    bus->address_space_io = address_space_io;
287 e822a52a Isaku Yamahata
288 e822a52a Isaku Yamahata
    /* host bridge */
289 e822a52a Isaku Yamahata
    QLIST_INIT(&bus->child);
290 e822a52a Isaku Yamahata
    pci_host_bus_register(0, bus); /* for now only pci domain 0 is supported */
291 e822a52a Isaku Yamahata
292 0be71e32 Alex Williamson
    vmstate_register(NULL, -1, &vmstate_pcibus, bus);
293 21eea4b3 Gerd Hoffmann
}
294 21eea4b3 Gerd Hoffmann
295 1e39101c Avi Kivity
PCIBus *pci_bus_new(DeviceState *parent, const char *name,
296 aee97b84 Avi Kivity
                    MemoryRegion *address_space_mem,
297 aee97b84 Avi Kivity
                    MemoryRegion *address_space_io,
298 aee97b84 Avi Kivity
                    uint8_t devfn_min)
299 21eea4b3 Gerd Hoffmann
{
300 21eea4b3 Gerd Hoffmann
    PCIBus *bus;
301 21eea4b3 Gerd Hoffmann
302 7267c094 Anthony Liguori
    bus = g_malloc0(sizeof(*bus));
303 0d936928 Anthony Liguori
    bus->qbus.glib_allocated = true;
304 aee97b84 Avi Kivity
    pci_bus_new_inplace(bus, parent, name, address_space_mem,
305 aee97b84 Avi Kivity
                        address_space_io, devfn_min);
306 21eea4b3 Gerd Hoffmann
    return bus;
307 21eea4b3 Gerd Hoffmann
}
308 21eea4b3 Gerd Hoffmann
309 21eea4b3 Gerd Hoffmann
void pci_bus_irqs(PCIBus *bus, pci_set_irq_fn set_irq, pci_map_irq_fn map_irq,
310 21eea4b3 Gerd Hoffmann
                  void *irq_opaque, int nirq)
311 21eea4b3 Gerd Hoffmann
{
312 21eea4b3 Gerd Hoffmann
    bus->set_irq = set_irq;
313 21eea4b3 Gerd Hoffmann
    bus->map_irq = map_irq;
314 21eea4b3 Gerd Hoffmann
    bus->irq_opaque = irq_opaque;
315 21eea4b3 Gerd Hoffmann
    bus->nirq = nirq;
316 7267c094 Anthony Liguori
    bus->irq_count = g_malloc0(nirq * sizeof(bus->irq_count[0]));
317 21eea4b3 Gerd Hoffmann
}
318 21eea4b3 Gerd Hoffmann
319 87c30546 Isaku Yamahata
void pci_bus_hotplug(PCIBus *bus, pci_hotplug_fn hotplug, DeviceState *qdev)
320 ee995ffb Gerd Hoffmann
{
321 ee995ffb Gerd Hoffmann
    bus->qbus.allow_hotplug = 1;
322 ee995ffb Gerd Hoffmann
    bus->hotplug = hotplug;
323 87c30546 Isaku Yamahata
    bus->hotplug_qdev = qdev;
324 ee995ffb Gerd Hoffmann
}
325 ee995ffb Gerd Hoffmann
326 21eea4b3 Gerd Hoffmann
PCIBus *pci_register_bus(DeviceState *parent, const char *name,
327 21eea4b3 Gerd Hoffmann
                         pci_set_irq_fn set_irq, pci_map_irq_fn map_irq,
328 1e39101c Avi Kivity
                         void *irq_opaque,
329 aee97b84 Avi Kivity
                         MemoryRegion *address_space_mem,
330 aee97b84 Avi Kivity
                         MemoryRegion *address_space_io,
331 1e39101c Avi Kivity
                         uint8_t devfn_min, int nirq)
332 21eea4b3 Gerd Hoffmann
{
333 21eea4b3 Gerd Hoffmann
    PCIBus *bus;
334 21eea4b3 Gerd Hoffmann
335 aee97b84 Avi Kivity
    bus = pci_bus_new(parent, name, address_space_mem,
336 aee97b84 Avi Kivity
                      address_space_io, devfn_min);
337 21eea4b3 Gerd Hoffmann
    pci_bus_irqs(bus, set_irq, map_irq, irq_opaque, nirq);
338 30468f78 bellard
    return bus;
339 30468f78 bellard
}
340 69b91039 bellard
341 502a5395 pbrook
int pci_bus_num(PCIBus *s)
342 502a5395 pbrook
{
343 e94ff650 Isaku Yamahata
    if (!s->parent_dev)
344 e94ff650 Isaku Yamahata
        return 0;       /* pci host bridge */
345 e94ff650 Isaku Yamahata
    return s->parent_dev->config[PCI_SECONDARY_BUS];
346 502a5395 pbrook
}
347 502a5395 pbrook
348 73534f2f Juan Quintela
static int get_pci_config_device(QEMUFile *f, void *pv, size_t size)
349 30ca2aab bellard
{
350 73534f2f Juan Quintela
    PCIDevice *s = container_of(pv, PCIDevice, config);
351 a9f49946 Isaku Yamahata
    uint8_t *config;
352 52fc1d83 balrog
    int i;
353 52fc1d83 balrog
354 a9f49946 Isaku Yamahata
    assert(size == pci_config_size(s));
355 7267c094 Anthony Liguori
    config = g_malloc(size);
356 a9f49946 Isaku Yamahata
357 a9f49946 Isaku Yamahata
    qemu_get_buffer(f, config, size);
358 a9f49946 Isaku Yamahata
    for (i = 0; i < size; ++i) {
359 f9aebe2e Michael S. Tsirkin
        if ((config[i] ^ s->config[i]) &
360 f9aebe2e Michael S. Tsirkin
            s->cmask[i] & ~s->wmask[i] & ~s->w1cmask[i]) {
361 7267c094 Anthony Liguori
            g_free(config);
362 bd4b65ee Michael S. Tsirkin
            return -EINVAL;
363 a9f49946 Isaku Yamahata
        }
364 a9f49946 Isaku Yamahata
    }
365 a9f49946 Isaku Yamahata
    memcpy(s->config, config, size);
366 bd4b65ee Michael S. Tsirkin
367 1941d19c bellard
    pci_update_mappings(s);
368 52fc1d83 balrog
369 7267c094 Anthony Liguori
    g_free(config);
370 30ca2aab bellard
    return 0;
371 30ca2aab bellard
}
372 30ca2aab bellard
373 73534f2f Juan Quintela
/* just put buffer */
374 84e2e3eb Juan Quintela
static void put_pci_config_device(QEMUFile *f, void *pv, size_t size)
375 73534f2f Juan Quintela
{
376 dbe73d7f Juan Quintela
    const uint8_t **v = pv;
377 a9f49946 Isaku Yamahata
    assert(size == pci_config_size(container_of(pv, PCIDevice, config)));
378 dbe73d7f Juan Quintela
    qemu_put_buffer(f, *v, size);
379 73534f2f Juan Quintela
}
380 73534f2f Juan Quintela
381 73534f2f Juan Quintela
static VMStateInfo vmstate_info_pci_config = {
382 73534f2f Juan Quintela
    .name = "pci config",
383 73534f2f Juan Quintela
    .get  = get_pci_config_device,
384 73534f2f Juan Quintela
    .put  = put_pci_config_device,
385 73534f2f Juan Quintela
};
386 73534f2f Juan Quintela
387 d036bb21 Michael S. Tsirkin
static int get_pci_irq_state(QEMUFile *f, void *pv, size_t size)
388 d036bb21 Michael S. Tsirkin
{
389 c3f8f611 Michael S. Tsirkin
    PCIDevice *s = container_of(pv, PCIDevice, irq_state);
390 d036bb21 Michael S. Tsirkin
    uint32_t irq_state[PCI_NUM_PINS];
391 d036bb21 Michael S. Tsirkin
    int i;
392 d036bb21 Michael S. Tsirkin
    for (i = 0; i < PCI_NUM_PINS; ++i) {
393 d036bb21 Michael S. Tsirkin
        irq_state[i] = qemu_get_be32(f);
394 d036bb21 Michael S. Tsirkin
        if (irq_state[i] != 0x1 && irq_state[i] != 0) {
395 d036bb21 Michael S. Tsirkin
            fprintf(stderr, "irq state %d: must be 0 or 1.\n",
396 d036bb21 Michael S. Tsirkin
                    irq_state[i]);
397 d036bb21 Michael S. Tsirkin
            return -EINVAL;
398 d036bb21 Michael S. Tsirkin
        }
399 d036bb21 Michael S. Tsirkin
    }
400 d036bb21 Michael S. Tsirkin
401 d036bb21 Michael S. Tsirkin
    for (i = 0; i < PCI_NUM_PINS; ++i) {
402 d036bb21 Michael S. Tsirkin
        pci_set_irq_state(s, i, irq_state[i]);
403 d036bb21 Michael S. Tsirkin
    }
404 d036bb21 Michael S. Tsirkin
405 d036bb21 Michael S. Tsirkin
    return 0;
406 d036bb21 Michael S. Tsirkin
}
407 d036bb21 Michael S. Tsirkin
408 d036bb21 Michael S. Tsirkin
static void put_pci_irq_state(QEMUFile *f, void *pv, size_t size)
409 d036bb21 Michael S. Tsirkin
{
410 d036bb21 Michael S. Tsirkin
    int i;
411 c3f8f611 Michael S. Tsirkin
    PCIDevice *s = container_of(pv, PCIDevice, irq_state);
412 d036bb21 Michael S. Tsirkin
413 d036bb21 Michael S. Tsirkin
    for (i = 0; i < PCI_NUM_PINS; ++i) {
414 d036bb21 Michael S. Tsirkin
        qemu_put_be32(f, pci_irq_state(s, i));
415 d036bb21 Michael S. Tsirkin
    }
416 d036bb21 Michael S. Tsirkin
}
417 d036bb21 Michael S. Tsirkin
418 d036bb21 Michael S. Tsirkin
static VMStateInfo vmstate_info_pci_irq_state = {
419 d036bb21 Michael S. Tsirkin
    .name = "pci irq state",
420 d036bb21 Michael S. Tsirkin
    .get  = get_pci_irq_state,
421 d036bb21 Michael S. Tsirkin
    .put  = put_pci_irq_state,
422 d036bb21 Michael S. Tsirkin
};
423 d036bb21 Michael S. Tsirkin
424 73534f2f Juan Quintela
const VMStateDescription vmstate_pci_device = {
425 73534f2f Juan Quintela
    .name = "PCIDevice",
426 73534f2f Juan Quintela
    .version_id = 2,
427 73534f2f Juan Quintela
    .minimum_version_id = 1,
428 73534f2f Juan Quintela
    .minimum_version_id_old = 1,
429 73534f2f Juan Quintela
    .fields      = (VMStateField []) {
430 73534f2f Juan Quintela
        VMSTATE_INT32_LE(version_id, PCIDevice),
431 a9f49946 Isaku Yamahata
        VMSTATE_BUFFER_UNSAFE_INFO(config, PCIDevice, 0,
432 a9f49946 Isaku Yamahata
                                   vmstate_info_pci_config,
433 a9f49946 Isaku Yamahata
                                   PCI_CONFIG_SPACE_SIZE),
434 d036bb21 Michael S. Tsirkin
        VMSTATE_BUFFER_UNSAFE_INFO(irq_state, PCIDevice, 2,
435 d036bb21 Michael S. Tsirkin
                                   vmstate_info_pci_irq_state,
436 d036bb21 Michael S. Tsirkin
                                   PCI_NUM_PINS * sizeof(int32_t)),
437 a9f49946 Isaku Yamahata
        VMSTATE_END_OF_LIST()
438 a9f49946 Isaku Yamahata
    }
439 a9f49946 Isaku Yamahata
};
440 a9f49946 Isaku Yamahata
441 a9f49946 Isaku Yamahata
const VMStateDescription vmstate_pcie_device = {
442 a9f49946 Isaku Yamahata
    .name = "PCIDevice",
443 a9f49946 Isaku Yamahata
    .version_id = 2,
444 a9f49946 Isaku Yamahata
    .minimum_version_id = 1,
445 a9f49946 Isaku Yamahata
    .minimum_version_id_old = 1,
446 a9f49946 Isaku Yamahata
    .fields      = (VMStateField []) {
447 a9f49946 Isaku Yamahata
        VMSTATE_INT32_LE(version_id, PCIDevice),
448 a9f49946 Isaku Yamahata
        VMSTATE_BUFFER_UNSAFE_INFO(config, PCIDevice, 0,
449 a9f49946 Isaku Yamahata
                                   vmstate_info_pci_config,
450 a9f49946 Isaku Yamahata
                                   PCIE_CONFIG_SPACE_SIZE),
451 d036bb21 Michael S. Tsirkin
        VMSTATE_BUFFER_UNSAFE_INFO(irq_state, PCIDevice, 2,
452 d036bb21 Michael S. Tsirkin
                                   vmstate_info_pci_irq_state,
453 d036bb21 Michael S. Tsirkin
                                   PCI_NUM_PINS * sizeof(int32_t)),
454 73534f2f Juan Quintela
        VMSTATE_END_OF_LIST()
455 73534f2f Juan Quintela
    }
456 73534f2f Juan Quintela
};
457 73534f2f Juan Quintela
458 a9f49946 Isaku Yamahata
static inline const VMStateDescription *pci_get_vmstate(PCIDevice *s)
459 a9f49946 Isaku Yamahata
{
460 a9f49946 Isaku Yamahata
    return pci_is_express(s) ? &vmstate_pcie_device : &vmstate_pci_device;
461 a9f49946 Isaku Yamahata
}
462 a9f49946 Isaku Yamahata
463 73534f2f Juan Quintela
void pci_device_save(PCIDevice *s, QEMUFile *f)
464 73534f2f Juan Quintela
{
465 f9bf77dd Michael S. Tsirkin
    /* Clear interrupt status bit: it is implicit
466 f9bf77dd Michael S. Tsirkin
     * in irq_state which we are saving.
467 f9bf77dd Michael S. Tsirkin
     * This makes us compatible with old devices
468 f9bf77dd Michael S. Tsirkin
     * which never set or clear this bit. */
469 f9bf77dd Michael S. Tsirkin
    s->config[PCI_STATUS] &= ~PCI_STATUS_INTERRUPT;
470 a9f49946 Isaku Yamahata
    vmstate_save_state(f, pci_get_vmstate(s), s);
471 f9bf77dd Michael S. Tsirkin
    /* Restore the interrupt status bit. */
472 f9bf77dd Michael S. Tsirkin
    pci_update_irq_status(s);
473 73534f2f Juan Quintela
}
474 73534f2f Juan Quintela
475 73534f2f Juan Quintela
int pci_device_load(PCIDevice *s, QEMUFile *f)
476 73534f2f Juan Quintela
{
477 f9bf77dd Michael S. Tsirkin
    int ret;
478 f9bf77dd Michael S. Tsirkin
    ret = vmstate_load_state(f, pci_get_vmstate(s), s, s->version_id);
479 f9bf77dd Michael S. Tsirkin
    /* Restore the interrupt status bit. */
480 f9bf77dd Michael S. Tsirkin
    pci_update_irq_status(s);
481 f9bf77dd Michael S. Tsirkin
    return ret;
482 73534f2f Juan Quintela
}
483 73534f2f Juan Quintela
484 5e434f4e Isaku Yamahata
static void pci_set_default_subsystem_id(PCIDevice *pci_dev)
485 d350d97d aliguori
{
486 5e434f4e Isaku Yamahata
    pci_set_word(pci_dev->config + PCI_SUBSYSTEM_VENDOR_ID,
487 5e434f4e Isaku Yamahata
                 pci_default_sub_vendor_id);
488 5e434f4e Isaku Yamahata
    pci_set_word(pci_dev->config + PCI_SUBSYSTEM_ID,
489 5e434f4e Isaku Yamahata
                 pci_default_sub_device_id);
490 d350d97d aliguori
}
491 d350d97d aliguori
492 880345c4 aliguori
/*
493 43c945f1 Isaku Yamahata
 * Parse [[<domain>:]<bus>:]<slot>, return -1 on error if funcp == NULL
494 43c945f1 Isaku Yamahata
 *       [[<domain>:]<bus>:]<slot>.<func>, return -1 on error
495 880345c4 aliguori
 */
496 94a09e2c Michael S. Tsirkin
static int pci_parse_devaddr(const char *addr, int *domp, int *busp,
497 43c945f1 Isaku Yamahata
                      unsigned int *slotp, unsigned int *funcp)
498 880345c4 aliguori
{
499 880345c4 aliguori
    const char *p;
500 880345c4 aliguori
    char *e;
501 880345c4 aliguori
    unsigned long val;
502 880345c4 aliguori
    unsigned long dom = 0, bus = 0;
503 43c945f1 Isaku Yamahata
    unsigned int slot = 0;
504 43c945f1 Isaku Yamahata
    unsigned int func = 0;
505 880345c4 aliguori
506 880345c4 aliguori
    p = addr;
507 880345c4 aliguori
    val = strtoul(p, &e, 16);
508 880345c4 aliguori
    if (e == p)
509 880345c4 aliguori
        return -1;
510 880345c4 aliguori
    if (*e == ':') {
511 880345c4 aliguori
        bus = val;
512 880345c4 aliguori
        p = e + 1;
513 880345c4 aliguori
        val = strtoul(p, &e, 16);
514 880345c4 aliguori
        if (e == p)
515 880345c4 aliguori
            return -1;
516 880345c4 aliguori
        if (*e == ':') {
517 880345c4 aliguori
            dom = bus;
518 880345c4 aliguori
            bus = val;
519 880345c4 aliguori
            p = e + 1;
520 880345c4 aliguori
            val = strtoul(p, &e, 16);
521 880345c4 aliguori
            if (e == p)
522 880345c4 aliguori
                return -1;
523 880345c4 aliguori
        }
524 880345c4 aliguori
    }
525 880345c4 aliguori
526 880345c4 aliguori
    slot = val;
527 880345c4 aliguori
528 43c945f1 Isaku Yamahata
    if (funcp != NULL) {
529 43c945f1 Isaku Yamahata
        if (*e != '.')
530 43c945f1 Isaku Yamahata
            return -1;
531 43c945f1 Isaku Yamahata
532 43c945f1 Isaku Yamahata
        p = e + 1;
533 43c945f1 Isaku Yamahata
        val = strtoul(p, &e, 16);
534 43c945f1 Isaku Yamahata
        if (e == p)
535 43c945f1 Isaku Yamahata
            return -1;
536 43c945f1 Isaku Yamahata
537 43c945f1 Isaku Yamahata
        func = val;
538 43c945f1 Isaku Yamahata
    }
539 43c945f1 Isaku Yamahata
540 43c945f1 Isaku Yamahata
    /* if funcp == NULL func is 0 */
541 43c945f1 Isaku Yamahata
    if (dom > 0xffff || bus > 0xff || slot > 0x1f || func > 7)
542 43c945f1 Isaku Yamahata
        return -1;
543 43c945f1 Isaku Yamahata
544 880345c4 aliguori
    if (*e)
545 880345c4 aliguori
        return -1;
546 880345c4 aliguori
547 880345c4 aliguori
    *domp = dom;
548 880345c4 aliguori
    *busp = bus;
549 880345c4 aliguori
    *slotp = slot;
550 43c945f1 Isaku Yamahata
    if (funcp != NULL)
551 43c945f1 Isaku Yamahata
        *funcp = func;
552 880345c4 aliguori
    return 0;
553 880345c4 aliguori
}
554 880345c4 aliguori
555 e9283f8b Jan Kiszka
int pci_read_devaddr(Monitor *mon, const char *addr, int *domp, int *busp,
556 e9283f8b Jan Kiszka
                     unsigned *slotp)
557 880345c4 aliguori
{
558 e9283f8b Jan Kiszka
    /* strip legacy tag */
559 e9283f8b Jan Kiszka
    if (!strncmp(addr, "pci_addr=", 9)) {
560 e9283f8b Jan Kiszka
        addr += 9;
561 e9283f8b Jan Kiszka
    }
562 43c945f1 Isaku Yamahata
    if (pci_parse_devaddr(addr, domp, busp, slotp, NULL)) {
563 e9283f8b Jan Kiszka
        monitor_printf(mon, "Invalid pci address\n");
564 880345c4 aliguori
        return -1;
565 e9283f8b Jan Kiszka
    }
566 e9283f8b Jan Kiszka
    return 0;
567 880345c4 aliguori
}
568 880345c4 aliguori
569 49bd1458 Markus Armbruster
PCIBus *pci_get_bus_devfn(int *devfnp, const char *devaddr)
570 5607c388 Markus Armbruster
{
571 5607c388 Markus Armbruster
    int dom, bus;
572 5607c388 Markus Armbruster
    unsigned slot;
573 5607c388 Markus Armbruster
574 5607c388 Markus Armbruster
    if (!devaddr) {
575 5607c388 Markus Armbruster
        *devfnp = -1;
576 d662210a Michael S. Tsirkin
        return pci_find_bus_nr(pci_find_root_bus(0), 0);
577 5607c388 Markus Armbruster
    }
578 5607c388 Markus Armbruster
579 43c945f1 Isaku Yamahata
    if (pci_parse_devaddr(devaddr, &dom, &bus, &slot, NULL) < 0) {
580 5607c388 Markus Armbruster
        return NULL;
581 5607c388 Markus Armbruster
    }
582 5607c388 Markus Armbruster
583 6ff534b6 Isaku Yamahata
    *devfnp = PCI_DEVFN(slot, 0);
584 d662210a Michael S. Tsirkin
    return pci_find_bus_nr(pci_find_root_bus(dom), bus);
585 5607c388 Markus Armbruster
}
586 5607c388 Markus Armbruster
587 bd4b65ee Michael S. Tsirkin
static void pci_init_cmask(PCIDevice *dev)
588 bd4b65ee Michael S. Tsirkin
{
589 bd4b65ee Michael S. Tsirkin
    pci_set_word(dev->cmask + PCI_VENDOR_ID, 0xffff);
590 bd4b65ee Michael S. Tsirkin
    pci_set_word(dev->cmask + PCI_DEVICE_ID, 0xffff);
591 bd4b65ee Michael S. Tsirkin
    dev->cmask[PCI_STATUS] = PCI_STATUS_CAP_LIST;
592 bd4b65ee Michael S. Tsirkin
    dev->cmask[PCI_REVISION_ID] = 0xff;
593 bd4b65ee Michael S. Tsirkin
    dev->cmask[PCI_CLASS_PROG] = 0xff;
594 bd4b65ee Michael S. Tsirkin
    pci_set_word(dev->cmask + PCI_CLASS_DEVICE, 0xffff);
595 bd4b65ee Michael S. Tsirkin
    dev->cmask[PCI_HEADER_TYPE] = 0xff;
596 bd4b65ee Michael S. Tsirkin
    dev->cmask[PCI_CAPABILITY_LIST] = 0xff;
597 bd4b65ee Michael S. Tsirkin
}
598 bd4b65ee Michael S. Tsirkin
599 b7ee1603 Michael S. Tsirkin
static void pci_init_wmask(PCIDevice *dev)
600 b7ee1603 Michael S. Tsirkin
{
601 a9f49946 Isaku Yamahata
    int config_size = pci_config_size(dev);
602 a9f49946 Isaku Yamahata
603 b7ee1603 Michael S. Tsirkin
    dev->wmask[PCI_CACHE_LINE_SIZE] = 0xff;
604 b7ee1603 Michael S. Tsirkin
    dev->wmask[PCI_INTERRUPT_LINE] = 0xff;
605 67a51b48 Isaku Yamahata
    pci_set_word(dev->wmask + PCI_COMMAND,
606 a7b15a5c Michael S. Tsirkin
                 PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER |
607 a7b15a5c Michael S. Tsirkin
                 PCI_COMMAND_INTX_DISABLE);
608 b1aeb926 Isaku Yamahata
    if (dev->cap_present & QEMU_PCI_CAP_SERR) {
609 b1aeb926 Isaku Yamahata
        pci_word_test_and_set_mask(dev->wmask + PCI_COMMAND, PCI_COMMAND_SERR);
610 b1aeb926 Isaku Yamahata
    }
611 3e21ffc9 Isaku Yamahata
612 3e21ffc9 Isaku Yamahata
    memset(dev->wmask + PCI_CONFIG_HEADER_SIZE, 0xff,
613 3e21ffc9 Isaku Yamahata
           config_size - PCI_CONFIG_HEADER_SIZE);
614 b7ee1603 Michael S. Tsirkin
}
615 b7ee1603 Michael S. Tsirkin
616 89d437df Isaku Yamahata
static void pci_init_w1cmask(PCIDevice *dev)
617 89d437df Isaku Yamahata
{
618 89d437df Isaku Yamahata
    /*
619 f6bdfcc9 Michael S. Tsirkin
     * Note: It's okay to set w1cmask even for readonly bits as
620 89d437df Isaku Yamahata
     * long as their value is hardwired to 0.
621 89d437df Isaku Yamahata
     */
622 89d437df Isaku Yamahata
    pci_set_word(dev->w1cmask + PCI_STATUS,
623 89d437df Isaku Yamahata
                 PCI_STATUS_PARITY | PCI_STATUS_SIG_TARGET_ABORT |
624 89d437df Isaku Yamahata
                 PCI_STATUS_REC_TARGET_ABORT | PCI_STATUS_REC_MASTER_ABORT |
625 89d437df Isaku Yamahata
                 PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_DETECTED_PARITY);
626 89d437df Isaku Yamahata
}
627 89d437df Isaku Yamahata
628 d5f27e88 Michael S. Tsirkin
static void pci_init_mask_bridge(PCIDevice *d)
629 fb231628 Isaku Yamahata
{
630 fb231628 Isaku Yamahata
    /* PCI_PRIMARY_BUS, PCI_SECONDARY_BUS, PCI_SUBORDINATE_BUS and
631 fb231628 Isaku Yamahata
       PCI_SEC_LETENCY_TIMER */
632 fb231628 Isaku Yamahata
    memset(d->wmask + PCI_PRIMARY_BUS, 0xff, 4);
633 fb231628 Isaku Yamahata
634 fb231628 Isaku Yamahata
    /* base and limit */
635 fb231628 Isaku Yamahata
    d->wmask[PCI_IO_BASE] = PCI_IO_RANGE_MASK & 0xff;
636 fb231628 Isaku Yamahata
    d->wmask[PCI_IO_LIMIT] = PCI_IO_RANGE_MASK & 0xff;
637 fb231628 Isaku Yamahata
    pci_set_word(d->wmask + PCI_MEMORY_BASE,
638 fb231628 Isaku Yamahata
                 PCI_MEMORY_RANGE_MASK & 0xffff);
639 fb231628 Isaku Yamahata
    pci_set_word(d->wmask + PCI_MEMORY_LIMIT,
640 fb231628 Isaku Yamahata
                 PCI_MEMORY_RANGE_MASK & 0xffff);
641 fb231628 Isaku Yamahata
    pci_set_word(d->wmask + PCI_PREF_MEMORY_BASE,
642 fb231628 Isaku Yamahata
                 PCI_PREF_RANGE_MASK & 0xffff);
643 fb231628 Isaku Yamahata
    pci_set_word(d->wmask + PCI_PREF_MEMORY_LIMIT,
644 fb231628 Isaku Yamahata
                 PCI_PREF_RANGE_MASK & 0xffff);
645 fb231628 Isaku Yamahata
646 fb231628 Isaku Yamahata
    /* PCI_PREF_BASE_UPPER32 and PCI_PREF_LIMIT_UPPER32 */
647 fb231628 Isaku Yamahata
    memset(d->wmask + PCI_PREF_BASE_UPPER32, 0xff, 8);
648 fb231628 Isaku Yamahata
649 d5f27e88 Michael S. Tsirkin
    /* Supported memory and i/o types */
650 68917102 Michael S. Tsirkin
    d->config[PCI_IO_BASE] |= PCI_IO_RANGE_TYPE_16;
651 68917102 Michael S. Tsirkin
    d->config[PCI_IO_LIMIT] |= PCI_IO_RANGE_TYPE_16;
652 d5f27e88 Michael S. Tsirkin
    pci_word_test_and_set_mask(d->config + PCI_PREF_MEMORY_BASE,
653 d5f27e88 Michael S. Tsirkin
                               PCI_PREF_RANGE_TYPE_64);
654 d5f27e88 Michael S. Tsirkin
    pci_word_test_and_set_mask(d->config + PCI_PREF_MEMORY_LIMIT,
655 d5f27e88 Michael S. Tsirkin
                               PCI_PREF_RANGE_TYPE_64);
656 d5f27e88 Michael S. Tsirkin
657 f6bdfcc9 Michael S. Tsirkin
/* TODO: add this define to pci_regs.h in linux and then in qemu. */
658 f6bdfcc9 Michael S. Tsirkin
#define  PCI_BRIDGE_CTL_VGA_16BIT        0x10        /* VGA 16-bit decode */
659 f6bdfcc9 Michael S. Tsirkin
#define  PCI_BRIDGE_CTL_DISCARD                0x100        /* Primary discard timer */
660 f6bdfcc9 Michael S. Tsirkin
#define  PCI_BRIDGE_CTL_SEC_DISCARD        0x200        /* Secondary discard timer */
661 f6bdfcc9 Michael S. Tsirkin
#define  PCI_BRIDGE_CTL_DISCARD_STATUS        0x400        /* Discard timer status */
662 f6bdfcc9 Michael S. Tsirkin
#define  PCI_BRIDGE_CTL_DISCARD_SERR        0x800        /* Discard timer SERR# enable */
663 f6bdfcc9 Michael S. Tsirkin
    pci_set_word(d->wmask + PCI_BRIDGE_CONTROL,
664 f6bdfcc9 Michael S. Tsirkin
                 PCI_BRIDGE_CTL_PARITY |
665 f6bdfcc9 Michael S. Tsirkin
                 PCI_BRIDGE_CTL_SERR |
666 f6bdfcc9 Michael S. Tsirkin
                 PCI_BRIDGE_CTL_ISA |
667 f6bdfcc9 Michael S. Tsirkin
                 PCI_BRIDGE_CTL_VGA |
668 f6bdfcc9 Michael S. Tsirkin
                 PCI_BRIDGE_CTL_VGA_16BIT |
669 f6bdfcc9 Michael S. Tsirkin
                 PCI_BRIDGE_CTL_MASTER_ABORT |
670 f6bdfcc9 Michael S. Tsirkin
                 PCI_BRIDGE_CTL_BUS_RESET |
671 f6bdfcc9 Michael S. Tsirkin
                 PCI_BRIDGE_CTL_FAST_BACK |
672 f6bdfcc9 Michael S. Tsirkin
                 PCI_BRIDGE_CTL_DISCARD |
673 f6bdfcc9 Michael S. Tsirkin
                 PCI_BRIDGE_CTL_SEC_DISCARD |
674 f6bdfcc9 Michael S. Tsirkin
                 PCI_BRIDGE_CTL_DISCARD_SERR);
675 f6bdfcc9 Michael S. Tsirkin
    /* Below does not do anything as we never set this bit, put here for
676 f6bdfcc9 Michael S. Tsirkin
     * completeness. */
677 f6bdfcc9 Michael S. Tsirkin
    pci_set_word(d->w1cmask + PCI_BRIDGE_CONTROL,
678 f6bdfcc9 Michael S. Tsirkin
                 PCI_BRIDGE_CTL_DISCARD_STATUS);
679 d5f27e88 Michael S. Tsirkin
    d->cmask[PCI_IO_BASE] |= PCI_IO_RANGE_TYPE_MASK;
680 15ab7a75 Michael S. Tsirkin
    d->cmask[PCI_IO_LIMIT] |= PCI_IO_RANGE_TYPE_MASK;
681 d5f27e88 Michael S. Tsirkin
    pci_word_test_and_set_mask(d->cmask + PCI_PREF_MEMORY_BASE,
682 d5f27e88 Michael S. Tsirkin
                               PCI_PREF_RANGE_TYPE_MASK);
683 15ab7a75 Michael S. Tsirkin
    pci_word_test_and_set_mask(d->cmask + PCI_PREF_MEMORY_LIMIT,
684 15ab7a75 Michael S. Tsirkin
                               PCI_PREF_RANGE_TYPE_MASK);
685 fb231628 Isaku Yamahata
}
686 fb231628 Isaku Yamahata
687 6eab3de1 Isaku Yamahata
static int pci_init_multifunction(PCIBus *bus, PCIDevice *dev)
688 6eab3de1 Isaku Yamahata
{
689 6eab3de1 Isaku Yamahata
    uint8_t slot = PCI_SLOT(dev->devfn);
690 6eab3de1 Isaku Yamahata
    uint8_t func;
691 6eab3de1 Isaku Yamahata
692 6eab3de1 Isaku Yamahata
    if (dev->cap_present & QEMU_PCI_CAP_MULTIFUNCTION) {
693 6eab3de1 Isaku Yamahata
        dev->config[PCI_HEADER_TYPE] |= PCI_HEADER_TYPE_MULTI_FUNCTION;
694 6eab3de1 Isaku Yamahata
    }
695 6eab3de1 Isaku Yamahata
696 6eab3de1 Isaku Yamahata
    /*
697 b0cd712c Stefan Weil
     * multifunction bit is interpreted in two ways as follows.
698 6eab3de1 Isaku Yamahata
     *   - all functions must set the bit to 1.
699 6eab3de1 Isaku Yamahata
     *     Example: Intel X53
700 6eab3de1 Isaku Yamahata
     *   - function 0 must set the bit, but the rest function (> 0)
701 6eab3de1 Isaku Yamahata
     *     is allowed to leave the bit to 0.
702 6eab3de1 Isaku Yamahata
     *     Example: PIIX3(also in qemu), PIIX4(also in qemu), ICH10,
703 6eab3de1 Isaku Yamahata
     *
704 6eab3de1 Isaku Yamahata
     * So OS (at least Linux) checks the bit of only function 0,
705 6eab3de1 Isaku Yamahata
     * and doesn't see the bit of function > 0.
706 6eab3de1 Isaku Yamahata
     *
707 6eab3de1 Isaku Yamahata
     * The below check allows both interpretation.
708 6eab3de1 Isaku Yamahata
     */
709 6eab3de1 Isaku Yamahata
    if (PCI_FUNC(dev->devfn)) {
710 6eab3de1 Isaku Yamahata
        PCIDevice *f0 = bus->devices[PCI_DEVFN(slot, 0)];
711 6eab3de1 Isaku Yamahata
        if (f0 && !(f0->cap_present & QEMU_PCI_CAP_MULTIFUNCTION)) {
712 6eab3de1 Isaku Yamahata
            /* function 0 should set multifunction bit */
713 6eab3de1 Isaku Yamahata
            error_report("PCI: single function device can't be populated "
714 6eab3de1 Isaku Yamahata
                         "in function %x.%x", slot, PCI_FUNC(dev->devfn));
715 6eab3de1 Isaku Yamahata
            return -1;
716 6eab3de1 Isaku Yamahata
        }
717 6eab3de1 Isaku Yamahata
        return 0;
718 6eab3de1 Isaku Yamahata
    }
719 6eab3de1 Isaku Yamahata
720 6eab3de1 Isaku Yamahata
    if (dev->cap_present & QEMU_PCI_CAP_MULTIFUNCTION) {
721 6eab3de1 Isaku Yamahata
        return 0;
722 6eab3de1 Isaku Yamahata
    }
723 6eab3de1 Isaku Yamahata
    /* function 0 indicates single function, so function > 0 must be NULL */
724 6eab3de1 Isaku Yamahata
    for (func = 1; func < PCI_FUNC_MAX; ++func) {
725 6eab3de1 Isaku Yamahata
        if (bus->devices[PCI_DEVFN(slot, func)]) {
726 6eab3de1 Isaku Yamahata
            error_report("PCI: %x.0 indicates single function, "
727 6eab3de1 Isaku Yamahata
                         "but %x.%x is already populated.",
728 6eab3de1 Isaku Yamahata
                         slot, slot, func);
729 6eab3de1 Isaku Yamahata
            return -1;
730 6eab3de1 Isaku Yamahata
        }
731 6eab3de1 Isaku Yamahata
    }
732 6eab3de1 Isaku Yamahata
    return 0;
733 6eab3de1 Isaku Yamahata
}
734 6eab3de1 Isaku Yamahata
735 a9f49946 Isaku Yamahata
static void pci_config_alloc(PCIDevice *pci_dev)
736 a9f49946 Isaku Yamahata
{
737 a9f49946 Isaku Yamahata
    int config_size = pci_config_size(pci_dev);
738 a9f49946 Isaku Yamahata
739 7267c094 Anthony Liguori
    pci_dev->config = g_malloc0(config_size);
740 7267c094 Anthony Liguori
    pci_dev->cmask = g_malloc0(config_size);
741 7267c094 Anthony Liguori
    pci_dev->wmask = g_malloc0(config_size);
742 7267c094 Anthony Liguori
    pci_dev->w1cmask = g_malloc0(config_size);
743 7267c094 Anthony Liguori
    pci_dev->used = g_malloc0(config_size);
744 a9f49946 Isaku Yamahata
}
745 a9f49946 Isaku Yamahata
746 a9f49946 Isaku Yamahata
static void pci_config_free(PCIDevice *pci_dev)
747 a9f49946 Isaku Yamahata
{
748 7267c094 Anthony Liguori
    g_free(pci_dev->config);
749 7267c094 Anthony Liguori
    g_free(pci_dev->cmask);
750 7267c094 Anthony Liguori
    g_free(pci_dev->wmask);
751 7267c094 Anthony Liguori
    g_free(pci_dev->w1cmask);
752 7267c094 Anthony Liguori
    g_free(pci_dev->used);
753 a9f49946 Isaku Yamahata
}
754 a9f49946 Isaku Yamahata
755 69b91039 bellard
/* -1 for devfn means auto assign */
756 6b1b92d3 Paul Brook
static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus,
757 40021f08 Anthony Liguori
                                         const char *name, int devfn)
758 69b91039 bellard
{
759 40021f08 Anthony Liguori
    PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(pci_dev);
760 40021f08 Anthony Liguori
    PCIConfigReadFunc *config_read = pc->config_read;
761 40021f08 Anthony Liguori
    PCIConfigWriteFunc *config_write = pc->config_write;
762 113f89df Isaku Yamahata
763 69b91039 bellard
    if (devfn < 0) {
764 b47b0706 Isaku Yamahata
        for(devfn = bus->devfn_min ; devfn < ARRAY_SIZE(bus->devices);
765 6fa84913 Isaku Yamahata
            devfn += PCI_FUNC_MAX) {
766 30468f78 bellard
            if (!bus->devices[devfn])
767 69b91039 bellard
                goto found;
768 69b91039 bellard
        }
769 3709c1b7 Daniel P. Berrange
        error_report("PCI: no slot/function available for %s, all in use", name);
770 09e3acc6 Gerd Hoffmann
        return NULL;
771 69b91039 bellard
    found: ;
772 07b7d053 Markus Armbruster
    } else if (bus->devices[devfn]) {
773 3709c1b7 Daniel P. Berrange
        error_report("PCI: slot %d function %d not available for %s, in use by %s",
774 3709c1b7 Daniel P. Berrange
                     PCI_SLOT(devfn), PCI_FUNC(devfn), name, bus->devices[devfn]->name);
775 09e3acc6 Gerd Hoffmann
        return NULL;
776 69b91039 bellard
    }
777 30468f78 bellard
    pci_dev->bus = bus;
778 5fa45de5 David Gibson
    if (bus->dma_context_fn) {
779 5fa45de5 David Gibson
        pci_dev->dma = bus->dma_context_fn(bus, bus->dma_context_opaque, devfn);
780 5fa45de5 David Gibson
    }
781 69b91039 bellard
    pci_dev->devfn = devfn;
782 69b91039 bellard
    pstrcpy(pci_dev->name, sizeof(pci_dev->name), name);
783 d036bb21 Michael S. Tsirkin
    pci_dev->irq_state = 0;
784 a9f49946 Isaku Yamahata
    pci_config_alloc(pci_dev);
785 fb231628 Isaku Yamahata
786 40021f08 Anthony Liguori
    pci_config_set_vendor_id(pci_dev->config, pc->vendor_id);
787 40021f08 Anthony Liguori
    pci_config_set_device_id(pci_dev->config, pc->device_id);
788 40021f08 Anthony Liguori
    pci_config_set_revision(pci_dev->config, pc->revision);
789 40021f08 Anthony Liguori
    pci_config_set_class(pci_dev->config, pc->class_id);
790 113f89df Isaku Yamahata
791 40021f08 Anthony Liguori
    if (!pc->is_bridge) {
792 40021f08 Anthony Liguori
        if (pc->subsystem_vendor_id || pc->subsystem_id) {
793 113f89df Isaku Yamahata
            pci_set_word(pci_dev->config + PCI_SUBSYSTEM_VENDOR_ID,
794 40021f08 Anthony Liguori
                         pc->subsystem_vendor_id);
795 113f89df Isaku Yamahata
            pci_set_word(pci_dev->config + PCI_SUBSYSTEM_ID,
796 40021f08 Anthony Liguori
                         pc->subsystem_id);
797 113f89df Isaku Yamahata
        } else {
798 113f89df Isaku Yamahata
            pci_set_default_subsystem_id(pci_dev);
799 113f89df Isaku Yamahata
        }
800 113f89df Isaku Yamahata
    } else {
801 113f89df Isaku Yamahata
        /* subsystem_vendor_id/subsystem_id are only for header type 0 */
802 40021f08 Anthony Liguori
        assert(!pc->subsystem_vendor_id);
803 40021f08 Anthony Liguori
        assert(!pc->subsystem_id);
804 fb231628 Isaku Yamahata
    }
805 bd4b65ee Michael S. Tsirkin
    pci_init_cmask(pci_dev);
806 b7ee1603 Michael S. Tsirkin
    pci_init_wmask(pci_dev);
807 89d437df Isaku Yamahata
    pci_init_w1cmask(pci_dev);
808 40021f08 Anthony Liguori
    if (pc->is_bridge) {
809 d5f27e88 Michael S. Tsirkin
        pci_init_mask_bridge(pci_dev);
810 fb231628 Isaku Yamahata
    }
811 6eab3de1 Isaku Yamahata
    if (pci_init_multifunction(bus, pci_dev)) {
812 6eab3de1 Isaku Yamahata
        pci_config_free(pci_dev);
813 6eab3de1 Isaku Yamahata
        return NULL;
814 6eab3de1 Isaku Yamahata
    }
815 0ac32c83 bellard
816 0ac32c83 bellard
    if (!config_read)
817 0ac32c83 bellard
        config_read = pci_default_read_config;
818 0ac32c83 bellard
    if (!config_write)
819 0ac32c83 bellard
        config_write = pci_default_write_config;
820 69b91039 bellard
    pci_dev->config_read = config_read;
821 69b91039 bellard
    pci_dev->config_write = config_write;
822 30468f78 bellard
    bus->devices[devfn] = pci_dev;
823 e369cad7 Isaku Yamahata
    pci_dev->irq = qemu_allocate_irqs(pci_set_irq, pci_dev, PCI_NUM_PINS);
824 f16c4abf Juan Quintela
    pci_dev->version_id = 2; /* Current pci device vmstate version */
825 69b91039 bellard
    return pci_dev;
826 69b91039 bellard
}
827 69b91039 bellard
828 925fe64a Alex Williamson
static void do_pci_unregister_device(PCIDevice *pci_dev)
829 925fe64a Alex Williamson
{
830 925fe64a Alex Williamson
    qemu_free_irqs(pci_dev->irq);
831 925fe64a Alex Williamson
    pci_dev->bus->devices[pci_dev->devfn] = NULL;
832 925fe64a Alex Williamson
    pci_config_free(pci_dev);
833 925fe64a Alex Williamson
}
834 925fe64a Alex Williamson
835 5851e08c aliguori
static void pci_unregister_io_regions(PCIDevice *pci_dev)
836 5851e08c aliguori
{
837 5851e08c aliguori
    PCIIORegion *r;
838 5851e08c aliguori
    int i;
839 5851e08c aliguori
840 5851e08c aliguori
    for(i = 0; i < PCI_NUM_REGIONS; i++) {
841 5851e08c aliguori
        r = &pci_dev->io_regions[i];
842 182f9c8a Isaku Yamahata
        if (!r->size || r->addr == PCI_BAR_UNMAPPED)
843 5851e08c aliguori
            continue;
844 03952339 Avi Kivity
        memory_region_del_subregion(r->address_space, r->memory);
845 5851e08c aliguori
    }
846 5851e08c aliguori
}
847 5851e08c aliguori
848 a36a344d Gerd Hoffmann
static int pci_unregister_device(DeviceState *dev)
849 5851e08c aliguori
{
850 40021f08 Anthony Liguori
    PCIDevice *pci_dev = PCI_DEVICE(dev);
851 40021f08 Anthony Liguori
    PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(pci_dev);
852 5851e08c aliguori
    int ret = 0;
853 5851e08c aliguori
854 40021f08 Anthony Liguori
    if (pc->exit)
855 40021f08 Anthony Liguori
        ret = pc->exit(pci_dev);
856 5851e08c aliguori
    if (ret)
857 5851e08c aliguori
        return ret;
858 5851e08c aliguori
859 5851e08c aliguori
    pci_unregister_io_regions(pci_dev);
860 230741dc Alex Williamson
    pci_del_option_rom(pci_dev);
861 925fe64a Alex Williamson
    do_pci_unregister_device(pci_dev);
862 5851e08c aliguori
    return 0;
863 5851e08c aliguori
}
864 5851e08c aliguori
865 e824b2cc Avi Kivity
void pci_register_bar(PCIDevice *pci_dev, int region_num,
866 e824b2cc Avi Kivity
                      uint8_t type, MemoryRegion *memory)
867 69b91039 bellard
{
868 69b91039 bellard
    PCIIORegion *r;
869 d7ce493a pbrook
    uint32_t addr;
870 5a9ff381 Isaku Yamahata
    uint64_t wmask;
871 cfc0be25 Avi Kivity
    pcibus_t size = memory_region_size(memory);
872 a4c20c6a aliguori
873 2bbb9c2f Isaku Yamahata
    assert(region_num >= 0);
874 2bbb9c2f Isaku Yamahata
    assert(region_num < PCI_NUM_REGIONS);
875 a4c20c6a aliguori
    if (size & (size-1)) {
876 a4c20c6a aliguori
        fprintf(stderr, "ERROR: PCI region size must be pow2 "
877 89e8b13c Isaku Yamahata
                    "type=0x%x, size=0x%"FMT_PCIBUS"\n", type, size);
878 a4c20c6a aliguori
        exit(1);
879 a4c20c6a aliguori
    }
880 a4c20c6a aliguori
881 69b91039 bellard
    r = &pci_dev->io_regions[region_num];
882 182f9c8a Isaku Yamahata
    r->addr = PCI_BAR_UNMAPPED;
883 69b91039 bellard
    r->size = size;
884 69b91039 bellard
    r->type = type;
885 79ff8cb0 Avi Kivity
    r->memory = NULL;
886 b7ee1603 Michael S. Tsirkin
887 b7ee1603 Michael S. Tsirkin
    wmask = ~(size - 1);
888 b3b11697 Isaku Yamahata
    addr = pci_bar(pci_dev, region_num);
889 d7ce493a pbrook
    if (region_num == PCI_ROM_SLOT) {
890 ebabb67a Stefan Weil
        /* ROM enable bit is writable */
891 5330de09 Michael S. Tsirkin
        wmask |= PCI_ROM_ADDRESS_ENABLE;
892 d7ce493a pbrook
    }
893 b0ff8eb2 Isaku Yamahata
    pci_set_long(pci_dev->config + addr, type);
894 14421258 Isaku Yamahata
    if (!(r->type & PCI_BASE_ADDRESS_SPACE_IO) &&
895 14421258 Isaku Yamahata
        r->type & PCI_BASE_ADDRESS_MEM_TYPE_64) {
896 14421258 Isaku Yamahata
        pci_set_quad(pci_dev->wmask + addr, wmask);
897 14421258 Isaku Yamahata
        pci_set_quad(pci_dev->cmask + addr, ~0ULL);
898 14421258 Isaku Yamahata
    } else {
899 14421258 Isaku Yamahata
        pci_set_long(pci_dev->wmask + addr, wmask & 0xffffffff);
900 14421258 Isaku Yamahata
        pci_set_long(pci_dev->cmask + addr, 0xffffffff);
901 14421258 Isaku Yamahata
    }
902 79ff8cb0 Avi Kivity
    pci_dev->io_regions[region_num].memory = memory;
903 5968eca3 Avi Kivity
    pci_dev->io_regions[region_num].address_space
904 cfc0be25 Avi Kivity
        = type & PCI_BASE_ADDRESS_SPACE_IO
905 5968eca3 Avi Kivity
        ? pci_dev->bus->address_space_io
906 5968eca3 Avi Kivity
        : pci_dev->bus->address_space_mem;
907 79ff8cb0 Avi Kivity
}
908 79ff8cb0 Avi Kivity
909 16a96f28 Avi Kivity
pcibus_t pci_get_bar_addr(PCIDevice *pci_dev, int region_num)
910 16a96f28 Avi Kivity
{
911 16a96f28 Avi Kivity
    return pci_dev->io_regions[region_num].addr;
912 16a96f28 Avi Kivity
}
913 16a96f28 Avi Kivity
914 876a350d Michael S. Tsirkin
static pcibus_t pci_bar_address(PCIDevice *d,
915 876a350d Michael S. Tsirkin
                                int reg, uint8_t type, pcibus_t size)
916 876a350d Michael S. Tsirkin
{
917 876a350d Michael S. Tsirkin
    pcibus_t new_addr, last_addr;
918 876a350d Michael S. Tsirkin
    int bar = pci_bar(d, reg);
919 876a350d Michael S. Tsirkin
    uint16_t cmd = pci_get_word(d->config + PCI_COMMAND);
920 876a350d Michael S. Tsirkin
921 876a350d Michael S. Tsirkin
    if (type & PCI_BASE_ADDRESS_SPACE_IO) {
922 876a350d Michael S. Tsirkin
        if (!(cmd & PCI_COMMAND_IO)) {
923 876a350d Michael S. Tsirkin
            return PCI_BAR_UNMAPPED;
924 876a350d Michael S. Tsirkin
        }
925 876a350d Michael S. Tsirkin
        new_addr = pci_get_long(d->config + bar) & ~(size - 1);
926 876a350d Michael S. Tsirkin
        last_addr = new_addr + size - 1;
927 876a350d Michael S. Tsirkin
        /* NOTE: we have only 64K ioports on PC */
928 876a350d Michael S. Tsirkin
        if (last_addr <= new_addr || new_addr == 0 || last_addr > UINT16_MAX) {
929 876a350d Michael S. Tsirkin
            return PCI_BAR_UNMAPPED;
930 876a350d Michael S. Tsirkin
        }
931 876a350d Michael S. Tsirkin
        return new_addr;
932 876a350d Michael S. Tsirkin
    }
933 876a350d Michael S. Tsirkin
934 876a350d Michael S. Tsirkin
    if (!(cmd & PCI_COMMAND_MEMORY)) {
935 876a350d Michael S. Tsirkin
        return PCI_BAR_UNMAPPED;
936 876a350d Michael S. Tsirkin
    }
937 876a350d Michael S. Tsirkin
    if (type & PCI_BASE_ADDRESS_MEM_TYPE_64) {
938 876a350d Michael S. Tsirkin
        new_addr = pci_get_quad(d->config + bar);
939 876a350d Michael S. Tsirkin
    } else {
940 876a350d Michael S. Tsirkin
        new_addr = pci_get_long(d->config + bar);
941 876a350d Michael S. Tsirkin
    }
942 876a350d Michael S. Tsirkin
    /* the ROM slot has a specific enable bit */
943 876a350d Michael S. Tsirkin
    if (reg == PCI_ROM_SLOT && !(new_addr & PCI_ROM_ADDRESS_ENABLE)) {
944 876a350d Michael S. Tsirkin
        return PCI_BAR_UNMAPPED;
945 876a350d Michael S. Tsirkin
    }
946 876a350d Michael S. Tsirkin
    new_addr &= ~(size - 1);
947 876a350d Michael S. Tsirkin
    last_addr = new_addr + size - 1;
948 876a350d Michael S. Tsirkin
    /* NOTE: we do not support wrapping */
949 876a350d Michael S. Tsirkin
    /* XXX: as we cannot support really dynamic
950 876a350d Michael S. Tsirkin
       mappings, we handle specific values as invalid
951 876a350d Michael S. Tsirkin
       mappings. */
952 876a350d Michael S. Tsirkin
    if (last_addr <= new_addr || new_addr == 0 ||
953 876a350d Michael S. Tsirkin
        last_addr == PCI_BAR_UNMAPPED) {
954 876a350d Michael S. Tsirkin
        return PCI_BAR_UNMAPPED;
955 876a350d Michael S. Tsirkin
    }
956 876a350d Michael S. Tsirkin
957 876a350d Michael S. Tsirkin
    /* Now pcibus_t is 64bit.
958 876a350d Michael S. Tsirkin
     * Check if 32 bit BAR wraps around explicitly.
959 876a350d Michael S. Tsirkin
     * Without this, PC ide doesn't work well.
960 876a350d Michael S. Tsirkin
     * TODO: remove this work around.
961 876a350d Michael S. Tsirkin
     */
962 876a350d Michael S. Tsirkin
    if  (!(type & PCI_BASE_ADDRESS_MEM_TYPE_64) && last_addr >= UINT32_MAX) {
963 876a350d Michael S. Tsirkin
        return PCI_BAR_UNMAPPED;
964 876a350d Michael S. Tsirkin
    }
965 876a350d Michael S. Tsirkin
966 876a350d Michael S. Tsirkin
    /*
967 876a350d Michael S. Tsirkin
     * OS is allowed to set BAR beyond its addressable
968 876a350d Michael S. Tsirkin
     * bits. For example, 32 bit OS can set 64bit bar
969 876a350d Michael S. Tsirkin
     * to >4G. Check it. TODO: we might need to support
970 876a350d Michael S. Tsirkin
     * it in the future for e.g. PAE.
971 876a350d Michael S. Tsirkin
     */
972 876a350d Michael S. Tsirkin
    if (last_addr >= TARGET_PHYS_ADDR_MAX) {
973 876a350d Michael S. Tsirkin
        return PCI_BAR_UNMAPPED;
974 876a350d Michael S. Tsirkin
    }
975 876a350d Michael S. Tsirkin
976 876a350d Michael S. Tsirkin
    return new_addr;
977 876a350d Michael S. Tsirkin
}
978 876a350d Michael S. Tsirkin
979 0ac32c83 bellard
static void pci_update_mappings(PCIDevice *d)
980 0ac32c83 bellard
{
981 0ac32c83 bellard
    PCIIORegion *r;
982 876a350d Michael S. Tsirkin
    int i;
983 7df32ca0 Michael S. Tsirkin
    pcibus_t new_addr;
984 3b46e624 ths
985 8a8696a3 bellard
    for(i = 0; i < PCI_NUM_REGIONS; i++) {
986 0ac32c83 bellard
        r = &d->io_regions[i];
987 a9688570 Isaku Yamahata
988 a9688570 Isaku Yamahata
        /* this region isn't registered */
989 ec503442 Isaku Yamahata
        if (!r->size)
990 a9688570 Isaku Yamahata
            continue;
991 a9688570 Isaku Yamahata
992 876a350d Michael S. Tsirkin
        new_addr = pci_bar_address(d, i, r->type, r->size);
993 a9688570 Isaku Yamahata
994 a9688570 Isaku Yamahata
        /* This bar isn't changed */
995 7df32ca0 Michael S. Tsirkin
        if (new_addr == r->addr)
996 a9688570 Isaku Yamahata
            continue;
997 a9688570 Isaku Yamahata
998 a9688570 Isaku Yamahata
        /* now do the real mapping */
999 a9688570 Isaku Yamahata
        if (r->addr != PCI_BAR_UNMAPPED) {
1000 03952339 Avi Kivity
            memory_region_del_subregion(r->address_space, r->memory);
1001 0ac32c83 bellard
        }
1002 a9688570 Isaku Yamahata
        r->addr = new_addr;
1003 a9688570 Isaku Yamahata
        if (r->addr != PCI_BAR_UNMAPPED) {
1004 8b881e77 Avi Kivity
            memory_region_add_subregion_overlap(r->address_space,
1005 8b881e77 Avi Kivity
                                                r->addr, r->memory, 1);
1006 a9688570 Isaku Yamahata
        }
1007 0ac32c83 bellard
    }
1008 0ac32c83 bellard
}
1009 0ac32c83 bellard
1010 a7b15a5c Michael S. Tsirkin
static inline int pci_irq_disabled(PCIDevice *d)
1011 a7b15a5c Michael S. Tsirkin
{
1012 a7b15a5c Michael S. Tsirkin
    return pci_get_word(d->config + PCI_COMMAND) & PCI_COMMAND_INTX_DISABLE;
1013 a7b15a5c Michael S. Tsirkin
}
1014 a7b15a5c Michael S. Tsirkin
1015 a7b15a5c Michael S. Tsirkin
/* Called after interrupt disabled field update in config space,
1016 a7b15a5c Michael S. Tsirkin
 * assert/deassert interrupts if necessary.
1017 a7b15a5c Michael S. Tsirkin
 * Gets original interrupt disable bit value (before update). */
1018 a7b15a5c Michael S. Tsirkin
static void pci_update_irq_disabled(PCIDevice *d, int was_irq_disabled)
1019 a7b15a5c Michael S. Tsirkin
{
1020 a7b15a5c Michael S. Tsirkin
    int i, disabled = pci_irq_disabled(d);
1021 a7b15a5c Michael S. Tsirkin
    if (disabled == was_irq_disabled)
1022 a7b15a5c Michael S. Tsirkin
        return;
1023 a7b15a5c Michael S. Tsirkin
    for (i = 0; i < PCI_NUM_PINS; ++i) {
1024 a7b15a5c Michael S. Tsirkin
        int state = pci_irq_state(d, i);
1025 a7b15a5c Michael S. Tsirkin
        pci_change_irq_level(d, i, disabled ? -state : state);
1026 a7b15a5c Michael S. Tsirkin
    }
1027 a7b15a5c Michael S. Tsirkin
}
1028 a7b15a5c Michael S. Tsirkin
1029 5fafdf24 ths
uint32_t pci_default_read_config(PCIDevice *d,
1030 0ac32c83 bellard
                                 uint32_t address, int len)
1031 69b91039 bellard
{
1032 5029fe12 Isaku Yamahata
    uint32_t val = 0;
1033 42e4126b Jan Kiszka
1034 5029fe12 Isaku Yamahata
    memcpy(&val, d->config + address, len);
1035 5029fe12 Isaku Yamahata
    return le32_to_cpu(val);
1036 0ac32c83 bellard
}
1037 0ac32c83 bellard
1038 b7ee1603 Michael S. Tsirkin
void pci_default_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int l)
1039 0ac32c83 bellard
{
1040 a7b15a5c Michael S. Tsirkin
    int i, was_irq_disabled = pci_irq_disabled(d);
1041 0ac32c83 bellard
1042 42e4126b Jan Kiszka
    for (i = 0; i < l; val >>= 8, ++i) {
1043 91011d4f Stefan Weil
        uint8_t wmask = d->wmask[addr + i];
1044 92ba5f51 Isaku Yamahata
        uint8_t w1cmask = d->w1cmask[addr + i];
1045 92ba5f51 Isaku Yamahata
        assert(!(wmask & w1cmask));
1046 91011d4f Stefan Weil
        d->config[addr + i] = (d->config[addr + i] & ~wmask) | (val & wmask);
1047 92ba5f51 Isaku Yamahata
        d->config[addr + i] &= ~(val & w1cmask); /* W1C: Write 1 to Clear */
1048 0ac32c83 bellard
    }
1049 260c0cd3 Isaku Yamahata
    if (ranges_overlap(addr, l, PCI_BASE_ADDRESS_0, 24) ||
1050 edb00035 Isaku Yamahata
        ranges_overlap(addr, l, PCI_ROM_ADDRESS, 4) ||
1051 edb00035 Isaku Yamahata
        ranges_overlap(addr, l, PCI_ROM_ADDRESS1, 4) ||
1052 260c0cd3 Isaku Yamahata
        range_covers_byte(addr, l, PCI_COMMAND))
1053 0ac32c83 bellard
        pci_update_mappings(d);
1054 a7b15a5c Michael S. Tsirkin
1055 a7b15a5c Michael S. Tsirkin
    if (range_covers_byte(addr, l, PCI_COMMAND))
1056 a7b15a5c Michael S. Tsirkin
        pci_update_irq_disabled(d, was_irq_disabled);
1057 95d65800 Jan Kiszka
1058 95d65800 Jan Kiszka
    msi_write_config(d, addr, val, l);
1059 95d65800 Jan Kiszka
    msix_write_config(d, addr, val, l);
1060 69b91039 bellard
}
1061 69b91039 bellard
1062 502a5395 pbrook
/***********************************************************/
1063 502a5395 pbrook
/* generic PCI irq support */
1064 30468f78 bellard
1065 502a5395 pbrook
/* 0 <= irq_num <= 3. level must be 0 or 1 */
1066 d537cf6c pbrook
static void pci_set_irq(void *opaque, int irq_num, int level)
1067 69b91039 bellard
{
1068 a60380a5 Juan Quintela
    PCIDevice *pci_dev = opaque;
1069 80b3ada7 pbrook
    int change;
1070 3b46e624 ths
1071 d036bb21 Michael S. Tsirkin
    change = level - pci_irq_state(pci_dev, irq_num);
1072 80b3ada7 pbrook
    if (!change)
1073 80b3ada7 pbrook
        return;
1074 d2b59317 pbrook
1075 d036bb21 Michael S. Tsirkin
    pci_set_irq_state(pci_dev, irq_num, level);
1076 f9bf77dd Michael S. Tsirkin
    pci_update_irq_status(pci_dev);
1077 a7b15a5c Michael S. Tsirkin
    if (pci_irq_disabled(pci_dev))
1078 a7b15a5c Michael S. Tsirkin
        return;
1079 d036bb21 Michael S. Tsirkin
    pci_change_irq_level(pci_dev, irq_num, change);
1080 69b91039 bellard
}
1081 69b91039 bellard
1082 502a5395 pbrook
/***********************************************************/
1083 502a5395 pbrook
/* monitor info on PCI */
1084 0ac32c83 bellard
1085 6650ee6d pbrook
typedef struct {
1086 6650ee6d pbrook
    uint16_t class;
1087 6650ee6d pbrook
    const char *desc;
1088 5e0259e7 Gleb Natapov
    const char *fw_name;
1089 5e0259e7 Gleb Natapov
    uint16_t fw_ign_bits;
1090 6650ee6d pbrook
} pci_class_desc;
1091 6650ee6d pbrook
1092 09bc878a blueswir1
static const pci_class_desc pci_class_descriptions[] =
1093 6650ee6d pbrook
{
1094 5e0259e7 Gleb Natapov
    { 0x0001, "VGA controller", "display"},
1095 5e0259e7 Gleb Natapov
    { 0x0100, "SCSI controller", "scsi"},
1096 5e0259e7 Gleb Natapov
    { 0x0101, "IDE controller", "ide"},
1097 5e0259e7 Gleb Natapov
    { 0x0102, "Floppy controller", "fdc"},
1098 5e0259e7 Gleb Natapov
    { 0x0103, "IPI controller", "ipi"},
1099 5e0259e7 Gleb Natapov
    { 0x0104, "RAID controller", "raid"},
1100 dcb5b19a ths
    { 0x0106, "SATA controller"},
1101 dcb5b19a ths
    { 0x0107, "SAS controller"},
1102 dcb5b19a ths
    { 0x0180, "Storage controller"},
1103 5e0259e7 Gleb Natapov
    { 0x0200, "Ethernet controller", "ethernet"},
1104 5e0259e7 Gleb Natapov
    { 0x0201, "Token Ring controller", "token-ring"},
1105 5e0259e7 Gleb Natapov
    { 0x0202, "FDDI controller", "fddi"},
1106 5e0259e7 Gleb Natapov
    { 0x0203, "ATM controller", "atm"},
1107 dcb5b19a ths
    { 0x0280, "Network controller"},
1108 5e0259e7 Gleb Natapov
    { 0x0300, "VGA controller", "display", 0x00ff},
1109 dcb5b19a ths
    { 0x0301, "XGA controller"},
1110 dcb5b19a ths
    { 0x0302, "3D controller"},
1111 dcb5b19a ths
    { 0x0380, "Display controller"},
1112 5e0259e7 Gleb Natapov
    { 0x0400, "Video controller", "video"},
1113 5e0259e7 Gleb Natapov
    { 0x0401, "Audio controller", "sound"},
1114 dcb5b19a ths
    { 0x0402, "Phone"},
1115 602ef4d9 Jan Kiszka
    { 0x0403, "Audio controller", "sound"},
1116 dcb5b19a ths
    { 0x0480, "Multimedia controller"},
1117 5e0259e7 Gleb Natapov
    { 0x0500, "RAM controller", "memory"},
1118 5e0259e7 Gleb Natapov
    { 0x0501, "Flash controller", "flash"},
1119 dcb5b19a ths
    { 0x0580, "Memory controller"},
1120 5e0259e7 Gleb Natapov
    { 0x0600, "Host bridge", "host"},
1121 5e0259e7 Gleb Natapov
    { 0x0601, "ISA bridge", "isa"},
1122 5e0259e7 Gleb Natapov
    { 0x0602, "EISA bridge", "eisa"},
1123 5e0259e7 Gleb Natapov
    { 0x0603, "MC bridge", "mca"},
1124 5e0259e7 Gleb Natapov
    { 0x0604, "PCI bridge", "pci"},
1125 5e0259e7 Gleb Natapov
    { 0x0605, "PCMCIA bridge", "pcmcia"},
1126 5e0259e7 Gleb Natapov
    { 0x0606, "NUBUS bridge", "nubus"},
1127 5e0259e7 Gleb Natapov
    { 0x0607, "CARDBUS bridge", "cardbus"},
1128 dcb5b19a ths
    { 0x0608, "RACEWAY bridge"},
1129 dcb5b19a ths
    { 0x0680, "Bridge"},
1130 5e0259e7 Gleb Natapov
    { 0x0700, "Serial port", "serial"},
1131 5e0259e7 Gleb Natapov
    { 0x0701, "Parallel port", "parallel"},
1132 5e0259e7 Gleb Natapov
    { 0x0800, "Interrupt controller", "interrupt-controller"},
1133 5e0259e7 Gleb Natapov
    { 0x0801, "DMA controller", "dma-controller"},
1134 5e0259e7 Gleb Natapov
    { 0x0802, "Timer", "timer"},
1135 5e0259e7 Gleb Natapov
    { 0x0803, "RTC", "rtc"},
1136 5e0259e7 Gleb Natapov
    { 0x0900, "Keyboard", "keyboard"},
1137 5e0259e7 Gleb Natapov
    { 0x0901, "Pen", "pen"},
1138 5e0259e7 Gleb Natapov
    { 0x0902, "Mouse", "mouse"},
1139 5e0259e7 Gleb Natapov
    { 0x0A00, "Dock station", "dock", 0x00ff},
1140 5e0259e7 Gleb Natapov
    { 0x0B00, "i386 cpu", "cpu", 0x00ff},
1141 5e0259e7 Gleb Natapov
    { 0x0c00, "Fireware contorller", "fireware"},
1142 5e0259e7 Gleb Natapov
    { 0x0c01, "Access bus controller", "access-bus"},
1143 5e0259e7 Gleb Natapov
    { 0x0c02, "SSA controller", "ssa"},
1144 5e0259e7 Gleb Natapov
    { 0x0c03, "USB controller", "usb"},
1145 5e0259e7 Gleb Natapov
    { 0x0c04, "Fibre channel controller", "fibre-channel"},
1146 6650ee6d pbrook
    { 0, NULL}
1147 6650ee6d pbrook
};
1148 6650ee6d pbrook
1149 163c8a59 Luiz Capitulino
static void pci_for_each_device_under_bus(PCIBus *bus,
1150 7aa8cbb9 Anthony PERARD
                                          void (*fn)(PCIBus *b, PCIDevice *d,
1151 7aa8cbb9 Anthony PERARD
                                                     void *opaque),
1152 7aa8cbb9 Anthony PERARD
                                          void *opaque)
1153 30468f78 bellard
{
1154 163c8a59 Luiz Capitulino
    PCIDevice *d;
1155 163c8a59 Luiz Capitulino
    int devfn;
1156 30468f78 bellard
1157 163c8a59 Luiz Capitulino
    for(devfn = 0; devfn < ARRAY_SIZE(bus->devices); devfn++) {
1158 163c8a59 Luiz Capitulino
        d = bus->devices[devfn];
1159 163c8a59 Luiz Capitulino
        if (d) {
1160 7aa8cbb9 Anthony PERARD
            fn(bus, d, opaque);
1161 163c8a59 Luiz Capitulino
        }
1162 163c8a59 Luiz Capitulino
    }
1163 163c8a59 Luiz Capitulino
}
1164 163c8a59 Luiz Capitulino
1165 163c8a59 Luiz Capitulino
void pci_for_each_device(PCIBus *bus, int bus_num,
1166 7aa8cbb9 Anthony PERARD
                         void (*fn)(PCIBus *b, PCIDevice *d, void *opaque),
1167 7aa8cbb9 Anthony PERARD
                         void *opaque)
1168 163c8a59 Luiz Capitulino
{
1169 d662210a Michael S. Tsirkin
    bus = pci_find_bus_nr(bus, bus_num);
1170 163c8a59 Luiz Capitulino
1171 163c8a59 Luiz Capitulino
    if (bus) {
1172 7aa8cbb9 Anthony PERARD
        pci_for_each_device_under_bus(bus, fn, opaque);
1173 163c8a59 Luiz Capitulino
    }
1174 163c8a59 Luiz Capitulino
}
1175 163c8a59 Luiz Capitulino
1176 79627472 Luiz Capitulino
static const pci_class_desc *get_class_desc(int class)
1177 163c8a59 Luiz Capitulino
{
1178 79627472 Luiz Capitulino
    const pci_class_desc *desc;
1179 163c8a59 Luiz Capitulino
1180 79627472 Luiz Capitulino
    desc = pci_class_descriptions;
1181 79627472 Luiz Capitulino
    while (desc->desc && class != desc->class) {
1182 79627472 Luiz Capitulino
        desc++;
1183 30468f78 bellard
    }
1184 b4dccd8d Isaku Yamahata
1185 79627472 Luiz Capitulino
    return desc;
1186 79627472 Luiz Capitulino
}
1187 14421258 Isaku Yamahata
1188 79627472 Luiz Capitulino
static PciDeviceInfoList *qmp_query_pci_devices(PCIBus *bus, int bus_num);
1189 163c8a59 Luiz Capitulino
1190 79627472 Luiz Capitulino
static PciMemoryRegionList *qmp_query_pci_regions(const PCIDevice *dev)
1191 79627472 Luiz Capitulino
{
1192 79627472 Luiz Capitulino
    PciMemoryRegionList *head = NULL, *cur_item = NULL;
1193 79627472 Luiz Capitulino
    int i;
1194 163c8a59 Luiz Capitulino
1195 79627472 Luiz Capitulino
    for (i = 0; i < PCI_NUM_REGIONS; i++) {
1196 79627472 Luiz Capitulino
        const PCIIORegion *r = &dev->io_regions[i];
1197 79627472 Luiz Capitulino
        PciMemoryRegionList *region;
1198 79627472 Luiz Capitulino
1199 79627472 Luiz Capitulino
        if (!r->size) {
1200 79627472 Luiz Capitulino
            continue;
1201 502a5395 pbrook
        }
1202 163c8a59 Luiz Capitulino
1203 79627472 Luiz Capitulino
        region = g_malloc0(sizeof(*region));
1204 79627472 Luiz Capitulino
        region->value = g_malloc0(sizeof(*region->value));
1205 163c8a59 Luiz Capitulino
1206 79627472 Luiz Capitulino
        if (r->type & PCI_BASE_ADDRESS_SPACE_IO) {
1207 79627472 Luiz Capitulino
            region->value->type = g_strdup("io");
1208 79627472 Luiz Capitulino
        } else {
1209 79627472 Luiz Capitulino
            region->value->type = g_strdup("memory");
1210 79627472 Luiz Capitulino
            region->value->has_prefetch = true;
1211 79627472 Luiz Capitulino
            region->value->prefetch = !!(r->type & PCI_BASE_ADDRESS_MEM_PREFETCH);
1212 79627472 Luiz Capitulino
            region->value->has_mem_type_64 = true;
1213 79627472 Luiz Capitulino
            region->value->mem_type_64 = !!(r->type & PCI_BASE_ADDRESS_MEM_TYPE_64);
1214 d5e4acf7 Luiz Capitulino
        }
1215 163c8a59 Luiz Capitulino
1216 79627472 Luiz Capitulino
        region->value->bar = i;
1217 79627472 Luiz Capitulino
        region->value->address = r->addr;
1218 79627472 Luiz Capitulino
        region->value->size = r->size;
1219 163c8a59 Luiz Capitulino
1220 79627472 Luiz Capitulino
        /* XXX: waiting for the qapi to support GSList */
1221 79627472 Luiz Capitulino
        if (!cur_item) {
1222 79627472 Luiz Capitulino
            head = cur_item = region;
1223 79627472 Luiz Capitulino
        } else {
1224 79627472 Luiz Capitulino
            cur_item->next = region;
1225 79627472 Luiz Capitulino
            cur_item = region;
1226 163c8a59 Luiz Capitulino
        }
1227 80b3ada7 pbrook
    }
1228 384d8876 bellard
1229 79627472 Luiz Capitulino
    return head;
1230 163c8a59 Luiz Capitulino
}
1231 163c8a59 Luiz Capitulino
1232 79627472 Luiz Capitulino
static PciBridgeInfo *qmp_query_pci_bridge(PCIDevice *dev, PCIBus *bus,
1233 79627472 Luiz Capitulino
                                           int bus_num)
1234 163c8a59 Luiz Capitulino
{
1235 79627472 Luiz Capitulino
    PciBridgeInfo *info;
1236 163c8a59 Luiz Capitulino
1237 79627472 Luiz Capitulino
    info = g_malloc0(sizeof(*info));
1238 163c8a59 Luiz Capitulino
1239 79627472 Luiz Capitulino
    info->bus.number = dev->config[PCI_PRIMARY_BUS];
1240 79627472 Luiz Capitulino
    info->bus.secondary = dev->config[PCI_SECONDARY_BUS];
1241 79627472 Luiz Capitulino
    info->bus.subordinate = dev->config[PCI_SUBORDINATE_BUS];
1242 163c8a59 Luiz Capitulino
1243 79627472 Luiz Capitulino
    info->bus.io_range = g_malloc0(sizeof(*info->bus.io_range));
1244 79627472 Luiz Capitulino
    info->bus.io_range->base = pci_bridge_get_base(dev, PCI_BASE_ADDRESS_SPACE_IO);
1245 79627472 Luiz Capitulino
    info->bus.io_range->limit = pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_SPACE_IO);
1246 163c8a59 Luiz Capitulino
1247 79627472 Luiz Capitulino
    info->bus.memory_range = g_malloc0(sizeof(*info->bus.memory_range));
1248 79627472 Luiz Capitulino
    info->bus.memory_range->base = pci_bridge_get_base(dev, PCI_BASE_ADDRESS_SPACE_MEMORY);
1249 79627472 Luiz Capitulino
    info->bus.memory_range->limit = pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_SPACE_MEMORY);
1250 163c8a59 Luiz Capitulino
1251 79627472 Luiz Capitulino
    info->bus.prefetchable_range = g_malloc0(sizeof(*info->bus.prefetchable_range));
1252 79627472 Luiz Capitulino
    info->bus.prefetchable_range->base = pci_bridge_get_base(dev, PCI_BASE_ADDRESS_MEM_PREFETCH);
1253 79627472 Luiz Capitulino
    info->bus.prefetchable_range->limit = pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_MEM_PREFETCH);
1254 163c8a59 Luiz Capitulino
1255 79627472 Luiz Capitulino
    if (dev->config[PCI_SECONDARY_BUS] != 0) {
1256 d662210a Michael S. Tsirkin
        PCIBus *child_bus = pci_find_bus_nr(bus, dev->config[PCI_SECONDARY_BUS]);
1257 79627472 Luiz Capitulino
        if (child_bus) {
1258 79627472 Luiz Capitulino
            info->has_devices = true;
1259 79627472 Luiz Capitulino
            info->devices = qmp_query_pci_devices(child_bus, dev->config[PCI_SECONDARY_BUS]);
1260 79627472 Luiz Capitulino
        }
1261 163c8a59 Luiz Capitulino
    }
1262 163c8a59 Luiz Capitulino
1263 79627472 Luiz Capitulino
    return info;
1264 163c8a59 Luiz Capitulino
}
1265 163c8a59 Luiz Capitulino
1266 79627472 Luiz Capitulino
static PciDeviceInfo *qmp_query_pci_device(PCIDevice *dev, PCIBus *bus,
1267 79627472 Luiz Capitulino
                                           int bus_num)
1268 163c8a59 Luiz Capitulino
{
1269 79627472 Luiz Capitulino
    const pci_class_desc *desc;
1270 79627472 Luiz Capitulino
    PciDeviceInfo *info;
1271 b5937f29 Isaku Yamahata
    uint8_t type;
1272 79627472 Luiz Capitulino
    int class;
1273 163c8a59 Luiz Capitulino
1274 79627472 Luiz Capitulino
    info = g_malloc0(sizeof(*info));
1275 79627472 Luiz Capitulino
    info->bus = bus_num;
1276 79627472 Luiz Capitulino
    info->slot = PCI_SLOT(dev->devfn);
1277 79627472 Luiz Capitulino
    info->function = PCI_FUNC(dev->devfn);
1278 79627472 Luiz Capitulino
1279 79627472 Luiz Capitulino
    class = pci_get_word(dev->config + PCI_CLASS_DEVICE);
1280 79627472 Luiz Capitulino
    info->class_info.class = class;
1281 79627472 Luiz Capitulino
    desc = get_class_desc(class);
1282 79627472 Luiz Capitulino
    if (desc->desc) {
1283 79627472 Luiz Capitulino
        info->class_info.has_desc = true;
1284 79627472 Luiz Capitulino
        info->class_info.desc = g_strdup(desc->desc);
1285 79627472 Luiz Capitulino
    }
1286 79627472 Luiz Capitulino
1287 79627472 Luiz Capitulino
    info->id.vendor = pci_get_word(dev->config + PCI_VENDOR_ID);
1288 79627472 Luiz Capitulino
    info->id.device = pci_get_word(dev->config + PCI_DEVICE_ID);
1289 79627472 Luiz Capitulino
    info->regions = qmp_query_pci_regions(dev);
1290 79627472 Luiz Capitulino
    info->qdev_id = g_strdup(dev->qdev.id ? dev->qdev.id : "");
1291 163c8a59 Luiz Capitulino
1292 163c8a59 Luiz Capitulino
    if (dev->config[PCI_INTERRUPT_PIN] != 0) {
1293 79627472 Luiz Capitulino
        info->has_irq = true;
1294 79627472 Luiz Capitulino
        info->irq = dev->config[PCI_INTERRUPT_LINE];
1295 163c8a59 Luiz Capitulino
    }
1296 163c8a59 Luiz Capitulino
1297 b5937f29 Isaku Yamahata
    type = dev->config[PCI_HEADER_TYPE] & ~PCI_HEADER_TYPE_MULTI_FUNCTION;
1298 b5937f29 Isaku Yamahata
    if (type == PCI_HEADER_TYPE_BRIDGE) {
1299 79627472 Luiz Capitulino
        info->has_pci_bridge = true;
1300 79627472 Luiz Capitulino
        info->pci_bridge = qmp_query_pci_bridge(dev, bus, bus_num);
1301 163c8a59 Luiz Capitulino
    }
1302 163c8a59 Luiz Capitulino
1303 79627472 Luiz Capitulino
    return info;
1304 163c8a59 Luiz Capitulino
}
1305 163c8a59 Luiz Capitulino
1306 79627472 Luiz Capitulino
static PciDeviceInfoList *qmp_query_pci_devices(PCIBus *bus, int bus_num)
1307 384d8876 bellard
{
1308 79627472 Luiz Capitulino
    PciDeviceInfoList *info, *head = NULL, *cur_item = NULL;
1309 163c8a59 Luiz Capitulino
    PCIDevice *dev;
1310 79627472 Luiz Capitulino
    int devfn;
1311 163c8a59 Luiz Capitulino
1312 163c8a59 Luiz Capitulino
    for (devfn = 0; devfn < ARRAY_SIZE(bus->devices); devfn++) {
1313 163c8a59 Luiz Capitulino
        dev = bus->devices[devfn];
1314 163c8a59 Luiz Capitulino
        if (dev) {
1315 79627472 Luiz Capitulino
            info = g_malloc0(sizeof(*info));
1316 79627472 Luiz Capitulino
            info->value = qmp_query_pci_device(dev, bus, bus_num);
1317 79627472 Luiz Capitulino
1318 79627472 Luiz Capitulino
            /* XXX: waiting for the qapi to support GSList */
1319 79627472 Luiz Capitulino
            if (!cur_item) {
1320 79627472 Luiz Capitulino
                head = cur_item = info;
1321 79627472 Luiz Capitulino
            } else {
1322 79627472 Luiz Capitulino
                cur_item->next = info;
1323 79627472 Luiz Capitulino
                cur_item = info;
1324 79627472 Luiz Capitulino
            }
1325 163c8a59 Luiz Capitulino
        }
1326 1074df4f Isaku Yamahata
    }
1327 163c8a59 Luiz Capitulino
1328 79627472 Luiz Capitulino
    return head;
1329 1074df4f Isaku Yamahata
}
1330 1074df4f Isaku Yamahata
1331 79627472 Luiz Capitulino
static PciInfo *qmp_query_pci_bus(PCIBus *bus, int bus_num)
1332 1074df4f Isaku Yamahata
{
1333 79627472 Luiz Capitulino
    PciInfo *info = NULL;
1334 79627472 Luiz Capitulino
1335 d662210a Michael S. Tsirkin
    bus = pci_find_bus_nr(bus, bus_num);
1336 502a5395 pbrook
    if (bus) {
1337 79627472 Luiz Capitulino
        info = g_malloc0(sizeof(*info));
1338 79627472 Luiz Capitulino
        info->bus = bus_num;
1339 79627472 Luiz Capitulino
        info->devices = qmp_query_pci_devices(bus, bus_num);
1340 f2aa58c6 bellard
    }
1341 163c8a59 Luiz Capitulino
1342 79627472 Luiz Capitulino
    return info;
1343 f2aa58c6 bellard
}
1344 f2aa58c6 bellard
1345 79627472 Luiz Capitulino
PciInfoList *qmp_query_pci(Error **errp)
1346 f2aa58c6 bellard
{
1347 79627472 Luiz Capitulino
    PciInfoList *info, *head = NULL, *cur_item = NULL;
1348 e822a52a Isaku Yamahata
    struct PCIHostBus *host;
1349 163c8a59 Luiz Capitulino
1350 e822a52a Isaku Yamahata
    QLIST_FOREACH(host, &host_buses, next) {
1351 79627472 Luiz Capitulino
        info = g_malloc0(sizeof(*info));
1352 79627472 Luiz Capitulino
        info->value = qmp_query_pci_bus(host->bus, 0);
1353 79627472 Luiz Capitulino
1354 79627472 Luiz Capitulino
        /* XXX: waiting for the qapi to support GSList */
1355 79627472 Luiz Capitulino
        if (!cur_item) {
1356 79627472 Luiz Capitulino
            head = cur_item = info;
1357 79627472 Luiz Capitulino
        } else {
1358 79627472 Luiz Capitulino
            cur_item->next = info;
1359 79627472 Luiz Capitulino
            cur_item = info;
1360 163c8a59 Luiz Capitulino
        }
1361 e822a52a Isaku Yamahata
    }
1362 163c8a59 Luiz Capitulino
1363 79627472 Luiz Capitulino
    return head;
1364 77d4bc34 bellard
}
1365 a41b2ff2 pbrook
1366 cb457d76 aliguori
static const char * const pci_nic_models[] = {
1367 cb457d76 aliguori
    "ne2k_pci",
1368 cb457d76 aliguori
    "i82551",
1369 cb457d76 aliguori
    "i82557b",
1370 cb457d76 aliguori
    "i82559er",
1371 cb457d76 aliguori
    "rtl8139",
1372 cb457d76 aliguori
    "e1000",
1373 cb457d76 aliguori
    "pcnet",
1374 cb457d76 aliguori
    "virtio",
1375 cb457d76 aliguori
    NULL
1376 cb457d76 aliguori
};
1377 cb457d76 aliguori
1378 9d07d757 Paul Brook
static const char * const pci_nic_names[] = {
1379 9d07d757 Paul Brook
    "ne2k_pci",
1380 9d07d757 Paul Brook
    "i82551",
1381 9d07d757 Paul Brook
    "i82557b",
1382 9d07d757 Paul Brook
    "i82559er",
1383 9d07d757 Paul Brook
    "rtl8139",
1384 9d07d757 Paul Brook
    "e1000",
1385 9d07d757 Paul Brook
    "pcnet",
1386 53c25cea Paul Brook
    "virtio-net-pci",
1387 cb457d76 aliguori
    NULL
1388 cb457d76 aliguori
};
1389 cb457d76 aliguori
1390 a41b2ff2 pbrook
/* Initialize a PCI NIC.  */
1391 33e66b86 Markus Armbruster
/* FIXME callers should check for failure, but don't */
1392 5607c388 Markus Armbruster
PCIDevice *pci_nic_init(NICInfo *nd, const char *default_model,
1393 5607c388 Markus Armbruster
                        const char *default_devaddr)
1394 a41b2ff2 pbrook
{
1395 5607c388 Markus Armbruster
    const char *devaddr = nd->devaddr ? nd->devaddr : default_devaddr;
1396 07caea31 Markus Armbruster
    PCIBus *bus;
1397 07caea31 Markus Armbruster
    int devfn;
1398 5607c388 Markus Armbruster
    PCIDevice *pci_dev;
1399 9d07d757 Paul Brook
    DeviceState *dev;
1400 cb457d76 aliguori
    int i;
1401 cb457d76 aliguori
1402 07caea31 Markus Armbruster
    i = qemu_find_nic_model(nd, pci_nic_models, default_model);
1403 07caea31 Markus Armbruster
    if (i < 0)
1404 07caea31 Markus Armbruster
        return NULL;
1405 07caea31 Markus Armbruster
1406 07caea31 Markus Armbruster
    bus = pci_get_bus_devfn(&devfn, devaddr);
1407 07caea31 Markus Armbruster
    if (!bus) {
1408 1ecda02b Markus Armbruster
        error_report("Invalid PCI device address %s for device %s",
1409 1ecda02b Markus Armbruster
                     devaddr, pci_nic_names[i]);
1410 07caea31 Markus Armbruster
        return NULL;
1411 07caea31 Markus Armbruster
    }
1412 07caea31 Markus Armbruster
1413 499cf102 Markus Armbruster
    pci_dev = pci_create(bus, devfn, pci_nic_names[i]);
1414 9ee05825 Markus Armbruster
    dev = &pci_dev->qdev;
1415 1cc33683 Gerd Hoffmann
    qdev_set_nic_properties(dev, nd);
1416 07caea31 Markus Armbruster
    if (qdev_init(dev) < 0)
1417 07caea31 Markus Armbruster
        return NULL;
1418 9ee05825 Markus Armbruster
    return pci_dev;
1419 a41b2ff2 pbrook
}
1420 a41b2ff2 pbrook
1421 07caea31 Markus Armbruster
PCIDevice *pci_nic_init_nofail(NICInfo *nd, const char *default_model,
1422 07caea31 Markus Armbruster
                               const char *default_devaddr)
1423 07caea31 Markus Armbruster
{
1424 07caea31 Markus Armbruster
    PCIDevice *res;
1425 07caea31 Markus Armbruster
1426 07caea31 Markus Armbruster
    if (qemu_show_nic_models(nd->model, pci_nic_models))
1427 07caea31 Markus Armbruster
        exit(0);
1428 07caea31 Markus Armbruster
1429 07caea31 Markus Armbruster
    res = pci_nic_init(nd, default_model, default_devaddr);
1430 07caea31 Markus Armbruster
    if (!res)
1431 07caea31 Markus Armbruster
        exit(1);
1432 07caea31 Markus Armbruster
    return res;
1433 07caea31 Markus Armbruster
}
1434 07caea31 Markus Armbruster
1435 929176c3 Michael S. Tsirkin
/* Whether a given bus number is in range of the secondary
1436 929176c3 Michael S. Tsirkin
 * bus of the given bridge device. */
1437 929176c3 Michael S. Tsirkin
static bool pci_secondary_bus_in_range(PCIDevice *dev, int bus_num)
1438 929176c3 Michael S. Tsirkin
{
1439 929176c3 Michael S. Tsirkin
    return !(pci_get_word(dev->config + PCI_BRIDGE_CONTROL) &
1440 929176c3 Michael S. Tsirkin
             PCI_BRIDGE_CTL_BUS_RESET) /* Don't walk the bus if it's reset. */ &&
1441 929176c3 Michael S. Tsirkin
        dev->config[PCI_SECONDARY_BUS] < bus_num &&
1442 929176c3 Michael S. Tsirkin
        bus_num <= dev->config[PCI_SUBORDINATE_BUS];
1443 929176c3 Michael S. Tsirkin
}
1444 929176c3 Michael S. Tsirkin
1445 d662210a Michael S. Tsirkin
static PCIBus *pci_find_bus_nr(PCIBus *bus, int bus_num)
1446 3ae80618 aliguori
{
1447 470e6363 Isaku Yamahata
    PCIBus *sec;
1448 3ae80618 aliguori
1449 470e6363 Isaku Yamahata
    if (!bus) {
1450 e822a52a Isaku Yamahata
        return NULL;
1451 470e6363 Isaku Yamahata
    }
1452 3ae80618 aliguori
1453 e822a52a Isaku Yamahata
    if (pci_bus_num(bus) == bus_num) {
1454 e822a52a Isaku Yamahata
        return bus;
1455 e822a52a Isaku Yamahata
    }
1456 e822a52a Isaku Yamahata
1457 929176c3 Michael S. Tsirkin
    /* Consider all bus numbers in range for the host pci bridge. */
1458 929176c3 Michael S. Tsirkin
    if (bus->parent_dev &&
1459 929176c3 Michael S. Tsirkin
        !pci_secondary_bus_in_range(bus->parent_dev, bus_num)) {
1460 929176c3 Michael S. Tsirkin
        return NULL;
1461 929176c3 Michael S. Tsirkin
    }
1462 929176c3 Michael S. Tsirkin
1463 e822a52a Isaku Yamahata
    /* try child bus */
1464 929176c3 Michael S. Tsirkin
    for (; bus; bus = sec) {
1465 929176c3 Michael S. Tsirkin
        QLIST_FOREACH(sec, &bus->child, sibling) {
1466 929176c3 Michael S. Tsirkin
            assert(sec->parent_dev);
1467 929176c3 Michael S. Tsirkin
            if (sec->parent_dev->config[PCI_SECONDARY_BUS] == bus_num) {
1468 929176c3 Michael S. Tsirkin
                return sec;
1469 929176c3 Michael S. Tsirkin
            }
1470 929176c3 Michael S. Tsirkin
            if (pci_secondary_bus_in_range(sec->parent_dev, bus_num)) {
1471 929176c3 Michael S. Tsirkin
                break;
1472 c021f8e6 Blue Swirl
            }
1473 e822a52a Isaku Yamahata
        }
1474 e822a52a Isaku Yamahata
    }
1475 e822a52a Isaku Yamahata
1476 e822a52a Isaku Yamahata
    return NULL;
1477 3ae80618 aliguori
}
1478 3ae80618 aliguori
1479 5256d8bf Isaku Yamahata
PCIDevice *pci_find_device(PCIBus *bus, int bus_num, uint8_t devfn)
1480 3ae80618 aliguori
{
1481 d662210a Michael S. Tsirkin
    bus = pci_find_bus_nr(bus, bus_num);
1482 3ae80618 aliguori
1483 3ae80618 aliguori
    if (!bus)
1484 3ae80618 aliguori
        return NULL;
1485 3ae80618 aliguori
1486 5256d8bf Isaku Yamahata
    return bus->devices[devfn];
1487 3ae80618 aliguori
}
1488 3ae80618 aliguori
1489 d307af79 Anthony Liguori
static int pci_qdev_init(DeviceState *qdev)
1490 6b1b92d3 Paul Brook
{
1491 6b1b92d3 Paul Brook
    PCIDevice *pci_dev = (PCIDevice *)qdev;
1492 40021f08 Anthony Liguori
    PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(pci_dev);
1493 6b1b92d3 Paul Brook
    PCIBus *bus;
1494 113f89df Isaku Yamahata
    int rc;
1495 ab85ceb1 Stefan Weil
    bool is_default_rom;
1496 6b1b92d3 Paul Brook
1497 a9f49946 Isaku Yamahata
    /* initialize cap_present for pci_is_express() and pci_config_size() */
1498 40021f08 Anthony Liguori
    if (pc->is_express) {
1499 a9f49946 Isaku Yamahata
        pci_dev->cap_present |= QEMU_PCI_CAP_EXPRESS;
1500 a9f49946 Isaku Yamahata
    }
1501 a9f49946 Isaku Yamahata
1502 02e2da45 Paul Brook
    bus = FROM_QBUS(PCIBus, qdev_get_parent_bus(qdev));
1503 6e008585 Anthony Liguori
    pci_dev = do_pci_register_device(pci_dev, bus,
1504 6e008585 Anthony Liguori
                                     object_get_typename(OBJECT(qdev)),
1505 6e008585 Anthony Liguori
                                     pci_dev->devfn);
1506 09e3acc6 Gerd Hoffmann
    if (pci_dev == NULL)
1507 09e3acc6 Gerd Hoffmann
        return -1;
1508 40021f08 Anthony Liguori
    if (qdev->hotplugged && pc->no_hotplug) {
1509 f79f2bfc Anthony Liguori
        qerror_report(QERR_DEVICE_NO_HOTPLUG, object_get_typename(OBJECT(pci_dev)));
1510 180c22e1 Gerd Hoffmann
        do_pci_unregister_device(pci_dev);
1511 180c22e1 Gerd Hoffmann
        return -1;
1512 180c22e1 Gerd Hoffmann
    }
1513 40021f08 Anthony Liguori
    if (pc->init) {
1514 40021f08 Anthony Liguori
        rc = pc->init(pci_dev);
1515 c2afc922 Isaku Yamahata
        if (rc != 0) {
1516 c2afc922 Isaku Yamahata
            do_pci_unregister_device(pci_dev);
1517 c2afc922 Isaku Yamahata
            return rc;
1518 c2afc922 Isaku Yamahata
        }
1519 925fe64a Alex Williamson
    }
1520 8c52c8f3 Gerd Hoffmann
1521 8c52c8f3 Gerd Hoffmann
    /* rom loading */
1522 ab85ceb1 Stefan Weil
    is_default_rom = false;
1523 40021f08 Anthony Liguori
    if (pci_dev->romfile == NULL && pc->romfile != NULL) {
1524 40021f08 Anthony Liguori
        pci_dev->romfile = g_strdup(pc->romfile);
1525 ab85ceb1 Stefan Weil
        is_default_rom = true;
1526 ab85ceb1 Stefan Weil
    }
1527 ab85ceb1 Stefan Weil
    pci_add_option_rom(pci_dev, is_default_rom);
1528 8c52c8f3 Gerd Hoffmann
1529 5beb8ad5 Isaku Yamahata
    if (bus->hotplug) {
1530 e927d487 Michael S. Tsirkin
        /* Let buses differentiate between hotplug and when device is
1531 e927d487 Michael S. Tsirkin
         * enabled during qemu machine creation. */
1532 e927d487 Michael S. Tsirkin
        rc = bus->hotplug(bus->hotplug_qdev, pci_dev,
1533 e927d487 Michael S. Tsirkin
                          qdev->hotplugged ? PCI_HOTPLUG_ENABLED:
1534 e927d487 Michael S. Tsirkin
                          PCI_COLDPLUG_ENABLED);
1535 a213ff63 Isaku Yamahata
        if (rc != 0) {
1536 a213ff63 Isaku Yamahata
            int r = pci_unregister_device(&pci_dev->qdev);
1537 a213ff63 Isaku Yamahata
            assert(!r);
1538 a213ff63 Isaku Yamahata
            return rc;
1539 a213ff63 Isaku Yamahata
        }
1540 a213ff63 Isaku Yamahata
    }
1541 ee995ffb Gerd Hoffmann
    return 0;
1542 ee995ffb Gerd Hoffmann
}
1543 ee995ffb Gerd Hoffmann
1544 ee995ffb Gerd Hoffmann
static int pci_unplug_device(DeviceState *qdev)
1545 ee995ffb Gerd Hoffmann
{
1546 40021f08 Anthony Liguori
    PCIDevice *dev = PCI_DEVICE(qdev);
1547 40021f08 Anthony Liguori
    PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
1548 ee995ffb Gerd Hoffmann
1549 40021f08 Anthony Liguori
    if (pc->no_hotplug) {
1550 f79f2bfc Anthony Liguori
        qerror_report(QERR_DEVICE_NO_HOTPLUG, object_get_typename(OBJECT(dev)));
1551 180c22e1 Gerd Hoffmann
        return -1;
1552 180c22e1 Gerd Hoffmann
    }
1553 e927d487 Michael S. Tsirkin
    return dev->bus->hotplug(dev->bus->hotplug_qdev, dev,
1554 e927d487 Michael S. Tsirkin
                             PCI_HOTPLUG_DISABLED);
1555 6b1b92d3 Paul Brook
}
1556 6b1b92d3 Paul Brook
1557 49823868 Isaku Yamahata
PCIDevice *pci_create_multifunction(PCIBus *bus, int devfn, bool multifunction,
1558 49823868 Isaku Yamahata
                                    const char *name)
1559 6b1b92d3 Paul Brook
{
1560 6b1b92d3 Paul Brook
    DeviceState *dev;
1561 6b1b92d3 Paul Brook
1562 02e2da45 Paul Brook
    dev = qdev_create(&bus->qbus, name);
1563 09f1bbcd Michael Roth
    qdev_prop_set_int32(dev, "addr", devfn);
1564 49823868 Isaku Yamahata
    qdev_prop_set_bit(dev, "multifunction", multifunction);
1565 40021f08 Anthony Liguori
    return PCI_DEVICE(dev);
1566 71077c1c Gerd Hoffmann
}
1567 6b1b92d3 Paul Brook
1568 49823868 Isaku Yamahata
PCIDevice *pci_create_simple_multifunction(PCIBus *bus, int devfn,
1569 49823868 Isaku Yamahata
                                           bool multifunction,
1570 49823868 Isaku Yamahata
                                           const char *name)
1571 71077c1c Gerd Hoffmann
{
1572 49823868 Isaku Yamahata
    PCIDevice *dev = pci_create_multifunction(bus, devfn, multifunction, name);
1573 e23a1b33 Markus Armbruster
    qdev_init_nofail(&dev->qdev);
1574 71077c1c Gerd Hoffmann
    return dev;
1575 6b1b92d3 Paul Brook
}
1576 6f4cbd39 Michael S. Tsirkin
1577 49823868 Isaku Yamahata
PCIDevice *pci_create(PCIBus *bus, int devfn, const char *name)
1578 49823868 Isaku Yamahata
{
1579 49823868 Isaku Yamahata
    return pci_create_multifunction(bus, devfn, false, name);
1580 49823868 Isaku Yamahata
}
1581 49823868 Isaku Yamahata
1582 49823868 Isaku Yamahata
PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name)
1583 49823868 Isaku Yamahata
{
1584 49823868 Isaku Yamahata
    return pci_create_simple_multifunction(bus, devfn, false, name);
1585 49823868 Isaku Yamahata
}
1586 49823868 Isaku Yamahata
1587 6f4cbd39 Michael S. Tsirkin
static int pci_find_space(PCIDevice *pdev, uint8_t size)
1588 6f4cbd39 Michael S. Tsirkin
{
1589 a9f49946 Isaku Yamahata
    int config_size = pci_config_size(pdev);
1590 6f4cbd39 Michael S. Tsirkin
    int offset = PCI_CONFIG_HEADER_SIZE;
1591 6f4cbd39 Michael S. Tsirkin
    int i;
1592 a9f49946 Isaku Yamahata
    for (i = PCI_CONFIG_HEADER_SIZE; i < config_size; ++i)
1593 6f4cbd39 Michael S. Tsirkin
        if (pdev->used[i])
1594 6f4cbd39 Michael S. Tsirkin
            offset = i + 1;
1595 6f4cbd39 Michael S. Tsirkin
        else if (i - offset + 1 == size)
1596 6f4cbd39 Michael S. Tsirkin
            return offset;
1597 6f4cbd39 Michael S. Tsirkin
    return 0;
1598 6f4cbd39 Michael S. Tsirkin
}
1599 6f4cbd39 Michael S. Tsirkin
1600 6f4cbd39 Michael S. Tsirkin
static uint8_t pci_find_capability_list(PCIDevice *pdev, uint8_t cap_id,
1601 6f4cbd39 Michael S. Tsirkin
                                        uint8_t *prev_p)
1602 6f4cbd39 Michael S. Tsirkin
{
1603 6f4cbd39 Michael S. Tsirkin
    uint8_t next, prev;
1604 6f4cbd39 Michael S. Tsirkin
1605 6f4cbd39 Michael S. Tsirkin
    if (!(pdev->config[PCI_STATUS] & PCI_STATUS_CAP_LIST))
1606 6f4cbd39 Michael S. Tsirkin
        return 0;
1607 6f4cbd39 Michael S. Tsirkin
1608 6f4cbd39 Michael S. Tsirkin
    for (prev = PCI_CAPABILITY_LIST; (next = pdev->config[prev]);
1609 6f4cbd39 Michael S. Tsirkin
         prev = next + PCI_CAP_LIST_NEXT)
1610 6f4cbd39 Michael S. Tsirkin
        if (pdev->config[next + PCI_CAP_LIST_ID] == cap_id)
1611 6f4cbd39 Michael S. Tsirkin
            break;
1612 6f4cbd39 Michael S. Tsirkin
1613 6f4cbd39 Michael S. Tsirkin
    if (prev_p)
1614 6f4cbd39 Michael S. Tsirkin
        *prev_p = prev;
1615 6f4cbd39 Michael S. Tsirkin
    return next;
1616 6f4cbd39 Michael S. Tsirkin
}
1617 6f4cbd39 Michael S. Tsirkin
1618 c9abe111 Jan Kiszka
static uint8_t pci_find_capability_at_offset(PCIDevice *pdev, uint8_t offset)
1619 c9abe111 Jan Kiszka
{
1620 c9abe111 Jan Kiszka
    uint8_t next, prev, found = 0;
1621 c9abe111 Jan Kiszka
1622 c9abe111 Jan Kiszka
    if (!(pdev->used[offset])) {
1623 c9abe111 Jan Kiszka
        return 0;
1624 c9abe111 Jan Kiszka
    }
1625 c9abe111 Jan Kiszka
1626 c9abe111 Jan Kiszka
    assert(pdev->config[PCI_STATUS] & PCI_STATUS_CAP_LIST);
1627 c9abe111 Jan Kiszka
1628 c9abe111 Jan Kiszka
    for (prev = PCI_CAPABILITY_LIST; (next = pdev->config[prev]);
1629 c9abe111 Jan Kiszka
         prev = next + PCI_CAP_LIST_NEXT) {
1630 c9abe111 Jan Kiszka
        if (next <= offset && next > found) {
1631 c9abe111 Jan Kiszka
            found = next;
1632 c9abe111 Jan Kiszka
        }
1633 c9abe111 Jan Kiszka
    }
1634 c9abe111 Jan Kiszka
    return found;
1635 c9abe111 Jan Kiszka
}
1636 c9abe111 Jan Kiszka
1637 ab85ceb1 Stefan Weil
/* Patch the PCI vendor and device ids in a PCI rom image if necessary.
1638 ab85ceb1 Stefan Weil
   This is needed for an option rom which is used for more than one device. */
1639 ab85ceb1 Stefan Weil
static void pci_patch_ids(PCIDevice *pdev, uint8_t *ptr, int size)
1640 ab85ceb1 Stefan Weil
{
1641 ab85ceb1 Stefan Weil
    uint16_t vendor_id;
1642 ab85ceb1 Stefan Weil
    uint16_t device_id;
1643 ab85ceb1 Stefan Weil
    uint16_t rom_vendor_id;
1644 ab85ceb1 Stefan Weil
    uint16_t rom_device_id;
1645 ab85ceb1 Stefan Weil
    uint16_t rom_magic;
1646 ab85ceb1 Stefan Weil
    uint16_t pcir_offset;
1647 ab85ceb1 Stefan Weil
    uint8_t checksum;
1648 ab85ceb1 Stefan Weil
1649 ab85ceb1 Stefan Weil
    /* Words in rom data are little endian (like in PCI configuration),
1650 ab85ceb1 Stefan Weil
       so they can be read / written with pci_get_word / pci_set_word. */
1651 ab85ceb1 Stefan Weil
1652 ab85ceb1 Stefan Weil
    /* Only a valid rom will be patched. */
1653 ab85ceb1 Stefan Weil
    rom_magic = pci_get_word(ptr);
1654 ab85ceb1 Stefan Weil
    if (rom_magic != 0xaa55) {
1655 ab85ceb1 Stefan Weil
        PCI_DPRINTF("Bad ROM magic %04x\n", rom_magic);
1656 ab85ceb1 Stefan Weil
        return;
1657 ab85ceb1 Stefan Weil
    }
1658 ab85ceb1 Stefan Weil
    pcir_offset = pci_get_word(ptr + 0x18);
1659 ab85ceb1 Stefan Weil
    if (pcir_offset + 8 >= size || memcmp(ptr + pcir_offset, "PCIR", 4)) {
1660 ab85ceb1 Stefan Weil
        PCI_DPRINTF("Bad PCIR offset 0x%x or signature\n", pcir_offset);
1661 ab85ceb1 Stefan Weil
        return;
1662 ab85ceb1 Stefan Weil
    }
1663 ab85ceb1 Stefan Weil
1664 ab85ceb1 Stefan Weil
    vendor_id = pci_get_word(pdev->config + PCI_VENDOR_ID);
1665 ab85ceb1 Stefan Weil
    device_id = pci_get_word(pdev->config + PCI_DEVICE_ID);
1666 ab85ceb1 Stefan Weil
    rom_vendor_id = pci_get_word(ptr + pcir_offset + 4);
1667 ab85ceb1 Stefan Weil
    rom_device_id = pci_get_word(ptr + pcir_offset + 6);
1668 ab85ceb1 Stefan Weil
1669 ab85ceb1 Stefan Weil
    PCI_DPRINTF("%s: ROM id %04x%04x / PCI id %04x%04x\n", pdev->romfile,
1670 ab85ceb1 Stefan Weil
                vendor_id, device_id, rom_vendor_id, rom_device_id);
1671 ab85ceb1 Stefan Weil
1672 ab85ceb1 Stefan Weil
    checksum = ptr[6];
1673 ab85ceb1 Stefan Weil
1674 ab85ceb1 Stefan Weil
    if (vendor_id != rom_vendor_id) {
1675 ab85ceb1 Stefan Weil
        /* Patch vendor id and checksum (at offset 6 for etherboot roms). */
1676 ab85ceb1 Stefan Weil
        checksum += (uint8_t)rom_vendor_id + (uint8_t)(rom_vendor_id >> 8);
1677 ab85ceb1 Stefan Weil
        checksum -= (uint8_t)vendor_id + (uint8_t)(vendor_id >> 8);
1678 ab85ceb1 Stefan Weil
        PCI_DPRINTF("ROM checksum %02x / %02x\n", ptr[6], checksum);
1679 ab85ceb1 Stefan Weil
        ptr[6] = checksum;
1680 ab85ceb1 Stefan Weil
        pci_set_word(ptr + pcir_offset + 4, vendor_id);
1681 ab85ceb1 Stefan Weil
    }
1682 ab85ceb1 Stefan Weil
1683 ab85ceb1 Stefan Weil
    if (device_id != rom_device_id) {
1684 ab85ceb1 Stefan Weil
        /* Patch device id and checksum (at offset 6 for etherboot roms). */
1685 ab85ceb1 Stefan Weil
        checksum += (uint8_t)rom_device_id + (uint8_t)(rom_device_id >> 8);
1686 ab85ceb1 Stefan Weil
        checksum -= (uint8_t)device_id + (uint8_t)(device_id >> 8);
1687 ab85ceb1 Stefan Weil
        PCI_DPRINTF("ROM checksum %02x / %02x\n", ptr[6], checksum);
1688 ab85ceb1 Stefan Weil
        ptr[6] = checksum;
1689 ab85ceb1 Stefan Weil
        pci_set_word(ptr + pcir_offset + 6, device_id);
1690 ab85ceb1 Stefan Weil
    }
1691 ab85ceb1 Stefan Weil
}
1692 ab85ceb1 Stefan Weil
1693 c2039bd0 Anthony Liguori
/* Add an option rom for the device */
1694 ab85ceb1 Stefan Weil
static int pci_add_option_rom(PCIDevice *pdev, bool is_default_rom)
1695 c2039bd0 Anthony Liguori
{
1696 c2039bd0 Anthony Liguori
    int size;
1697 c2039bd0 Anthony Liguori
    char *path;
1698 c2039bd0 Anthony Liguori
    void *ptr;
1699 1724f049 Alex Williamson
    char name[32];
1700 4be9f0d1 Anthony Liguori
    const VMStateDescription *vmsd;
1701 c2039bd0 Anthony Liguori
1702 8c52c8f3 Gerd Hoffmann
    if (!pdev->romfile)
1703 8c52c8f3 Gerd Hoffmann
        return 0;
1704 8c52c8f3 Gerd Hoffmann
    if (strlen(pdev->romfile) == 0)
1705 8c52c8f3 Gerd Hoffmann
        return 0;
1706 8c52c8f3 Gerd Hoffmann
1707 88169ddf Gerd Hoffmann
    if (!pdev->rom_bar) {
1708 88169ddf Gerd Hoffmann
        /*
1709 88169ddf Gerd Hoffmann
         * Load rom via fw_cfg instead of creating a rom bar,
1710 88169ddf Gerd Hoffmann
         * for 0.11 compatibility.
1711 88169ddf Gerd Hoffmann
         */
1712 88169ddf Gerd Hoffmann
        int class = pci_get_word(pdev->config + PCI_CLASS_DEVICE);
1713 88169ddf Gerd Hoffmann
        if (class == 0x0300) {
1714 88169ddf Gerd Hoffmann
            rom_add_vga(pdev->romfile);
1715 88169ddf Gerd Hoffmann
        } else {
1716 2e55e842 Gleb Natapov
            rom_add_option(pdev->romfile, -1);
1717 88169ddf Gerd Hoffmann
        }
1718 88169ddf Gerd Hoffmann
        return 0;
1719 88169ddf Gerd Hoffmann
    }
1720 88169ddf Gerd Hoffmann
1721 8c52c8f3 Gerd Hoffmann
    path = qemu_find_file(QEMU_FILE_TYPE_BIOS, pdev->romfile);
1722 c2039bd0 Anthony Liguori
    if (path == NULL) {
1723 7267c094 Anthony Liguori
        path = g_strdup(pdev->romfile);
1724 c2039bd0 Anthony Liguori
    }
1725 c2039bd0 Anthony Liguori
1726 c2039bd0 Anthony Liguori
    size = get_image_size(path);
1727 8c52c8f3 Gerd Hoffmann
    if (size < 0) {
1728 1ecda02b Markus Armbruster
        error_report("%s: failed to find romfile \"%s\"",
1729 1ecda02b Markus Armbruster
                     __FUNCTION__, pdev->romfile);
1730 7267c094 Anthony Liguori
        g_free(path);
1731 8c52c8f3 Gerd Hoffmann
        return -1;
1732 8c52c8f3 Gerd Hoffmann
    }
1733 c2039bd0 Anthony Liguori
    if (size & (size - 1)) {
1734 c2039bd0 Anthony Liguori
        size = 1 << qemu_fls(size);
1735 c2039bd0 Anthony Liguori
    }
1736 c2039bd0 Anthony Liguori
1737 4be9f0d1 Anthony Liguori
    vmsd = qdev_get_vmsd(DEVICE(pdev));
1738 4be9f0d1 Anthony Liguori
1739 4be9f0d1 Anthony Liguori
    if (vmsd) {
1740 4be9f0d1 Anthony Liguori
        snprintf(name, sizeof(name), "%s.rom", vmsd->name);
1741 4be9f0d1 Anthony Liguori
    } else {
1742 f79f2bfc Anthony Liguori
        snprintf(name, sizeof(name), "%s.rom", object_get_typename(OBJECT(pdev)));
1743 4be9f0d1 Anthony Liguori
    }
1744 14caaf7f Avi Kivity
    pdev->has_rom = true;
1745 c5705a77 Avi Kivity
    memory_region_init_ram(&pdev->rom, name, size);
1746 c5705a77 Avi Kivity
    vmstate_register_ram(&pdev->rom, &pdev->qdev);
1747 14caaf7f Avi Kivity
    ptr = memory_region_get_ram_ptr(&pdev->rom);
1748 c2039bd0 Anthony Liguori
    load_image(path, ptr);
1749 7267c094 Anthony Liguori
    g_free(path);
1750 c2039bd0 Anthony Liguori
1751 ab85ceb1 Stefan Weil
    if (is_default_rom) {
1752 ab85ceb1 Stefan Weil
        /* Only the default rom images will be patched (if needed). */
1753 ab85ceb1 Stefan Weil
        pci_patch_ids(pdev, ptr, size);
1754 ab85ceb1 Stefan Weil
    }
1755 ab85ceb1 Stefan Weil
1756 8c12f191 John Baboval
    qemu_put_ram_ptr(ptr);
1757 8c12f191 John Baboval
1758 e824b2cc Avi Kivity
    pci_register_bar(pdev, PCI_ROM_SLOT, 0, &pdev->rom);
1759 c2039bd0 Anthony Liguori
1760 c2039bd0 Anthony Liguori
    return 0;
1761 c2039bd0 Anthony Liguori
}
1762 c2039bd0 Anthony Liguori
1763 230741dc Alex Williamson
static void pci_del_option_rom(PCIDevice *pdev)
1764 230741dc Alex Williamson
{
1765 14caaf7f Avi Kivity
    if (!pdev->has_rom)
1766 230741dc Alex Williamson
        return;
1767 230741dc Alex Williamson
1768 c5705a77 Avi Kivity
    vmstate_unregister_ram(&pdev->rom, &pdev->qdev);
1769 14caaf7f Avi Kivity
    memory_region_destroy(&pdev->rom);
1770 14caaf7f Avi Kivity
    pdev->has_rom = false;
1771 230741dc Alex Williamson
}
1772 230741dc Alex Williamson
1773 ca77089d Isaku Yamahata
/*
1774 ca77089d Isaku Yamahata
 * if !offset
1775 ca77089d Isaku Yamahata
 * Reserve space and add capability to the linked list in pci config space
1776 ca77089d Isaku Yamahata
 *
1777 ca77089d Isaku Yamahata
 * if offset = 0,
1778 ca77089d Isaku Yamahata
 * Find and reserve space and add capability to the linked list
1779 ca77089d Isaku Yamahata
 * in pci config space */
1780 ca77089d Isaku Yamahata
int pci_add_capability(PCIDevice *pdev, uint8_t cap_id,
1781 ca77089d Isaku Yamahata
                       uint8_t offset, uint8_t size)
1782 6f4cbd39 Michael S. Tsirkin
{
1783 ca77089d Isaku Yamahata
    uint8_t *config;
1784 c9abe111 Jan Kiszka
    int i, overlapping_cap;
1785 c9abe111 Jan Kiszka
1786 ca77089d Isaku Yamahata
    if (!offset) {
1787 ca77089d Isaku Yamahata
        offset = pci_find_space(pdev, size);
1788 ca77089d Isaku Yamahata
        if (!offset) {
1789 ca77089d Isaku Yamahata
            return -ENOSPC;
1790 ca77089d Isaku Yamahata
        }
1791 c9abe111 Jan Kiszka
    } else {
1792 c9abe111 Jan Kiszka
        /* Verify that capabilities don't overlap.  Note: device assignment
1793 c9abe111 Jan Kiszka
         * depends on this check to verify that the device is not broken.
1794 c9abe111 Jan Kiszka
         * Should never trigger for emulated devices, but it's helpful
1795 c9abe111 Jan Kiszka
         * for debugging these. */
1796 c9abe111 Jan Kiszka
        for (i = offset; i < offset + size; i++) {
1797 c9abe111 Jan Kiszka
            overlapping_cap = pci_find_capability_at_offset(pdev, i);
1798 c9abe111 Jan Kiszka
            if (overlapping_cap) {
1799 c9abe111 Jan Kiszka
                fprintf(stderr, "ERROR: %04x:%02x:%02x.%x "
1800 c9abe111 Jan Kiszka
                        "Attempt to add PCI capability %x at offset "
1801 c9abe111 Jan Kiszka
                        "%x overlaps existing capability %x at offset %x\n",
1802 c9abe111 Jan Kiszka
                        pci_find_domain(pdev->bus), pci_bus_num(pdev->bus),
1803 c9abe111 Jan Kiszka
                        PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn),
1804 c9abe111 Jan Kiszka
                        cap_id, offset, overlapping_cap, i);
1805 c9abe111 Jan Kiszka
                return -EINVAL;
1806 c9abe111 Jan Kiszka
            }
1807 c9abe111 Jan Kiszka
        }
1808 ca77089d Isaku Yamahata
    }
1809 ca77089d Isaku Yamahata
1810 ca77089d Isaku Yamahata
    config = pdev->config + offset;
1811 6f4cbd39 Michael S. Tsirkin
    config[PCI_CAP_LIST_ID] = cap_id;
1812 6f4cbd39 Michael S. Tsirkin
    config[PCI_CAP_LIST_NEXT] = pdev->config[PCI_CAPABILITY_LIST];
1813 6f4cbd39 Michael S. Tsirkin
    pdev->config[PCI_CAPABILITY_LIST] = offset;
1814 6f4cbd39 Michael S. Tsirkin
    pdev->config[PCI_STATUS] |= PCI_STATUS_CAP_LIST;
1815 6f4cbd39 Michael S. Tsirkin
    memset(pdev->used + offset, 0xFF, size);
1816 6f4cbd39 Michael S. Tsirkin
    /* Make capability read-only by default */
1817 6f4cbd39 Michael S. Tsirkin
    memset(pdev->wmask + offset, 0, size);
1818 bd4b65ee Michael S. Tsirkin
    /* Check capability by default */
1819 bd4b65ee Michael S. Tsirkin
    memset(pdev->cmask + offset, 0xFF, size);
1820 6f4cbd39 Michael S. Tsirkin
    return offset;
1821 6f4cbd39 Michael S. Tsirkin
}
1822 6f4cbd39 Michael S. Tsirkin
1823 6f4cbd39 Michael S. Tsirkin
/* Unlink capability from the pci config space. */
1824 6f4cbd39 Michael S. Tsirkin
void pci_del_capability(PCIDevice *pdev, uint8_t cap_id, uint8_t size)
1825 6f4cbd39 Michael S. Tsirkin
{
1826 6f4cbd39 Michael S. Tsirkin
    uint8_t prev, offset = pci_find_capability_list(pdev, cap_id, &prev);
1827 6f4cbd39 Michael S. Tsirkin
    if (!offset)
1828 6f4cbd39 Michael S. Tsirkin
        return;
1829 6f4cbd39 Michael S. Tsirkin
    pdev->config[prev] = pdev->config[offset + PCI_CAP_LIST_NEXT];
1830 ebabb67a Stefan Weil
    /* Make capability writable again */
1831 6f4cbd39 Michael S. Tsirkin
    memset(pdev->wmask + offset, 0xff, size);
1832 1a4f5971 Isaku Yamahata
    memset(pdev->w1cmask + offset, 0, size);
1833 bd4b65ee Michael S. Tsirkin
    /* Clear cmask as device-specific registers can't be checked */
1834 bd4b65ee Michael S. Tsirkin
    memset(pdev->cmask + offset, 0, size);
1835 6f4cbd39 Michael S. Tsirkin
    memset(pdev->used + offset, 0, size);
1836 6f4cbd39 Michael S. Tsirkin
1837 6f4cbd39 Michael S. Tsirkin
    if (!pdev->config[PCI_CAPABILITY_LIST])
1838 6f4cbd39 Michael S. Tsirkin
        pdev->config[PCI_STATUS] &= ~PCI_STATUS_CAP_LIST;
1839 6f4cbd39 Michael S. Tsirkin
}
1840 6f4cbd39 Michael S. Tsirkin
1841 6f4cbd39 Michael S. Tsirkin
uint8_t pci_find_capability(PCIDevice *pdev, uint8_t cap_id)
1842 6f4cbd39 Michael S. Tsirkin
{
1843 6f4cbd39 Michael S. Tsirkin
    return pci_find_capability_list(pdev, cap_id, NULL);
1844 6f4cbd39 Michael S. Tsirkin
}
1845 10c4c98a Gerd Hoffmann
1846 10c4c98a Gerd Hoffmann
static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent)
1847 10c4c98a Gerd Hoffmann
{
1848 10c4c98a Gerd Hoffmann
    PCIDevice *d = (PCIDevice *)dev;
1849 10c4c98a Gerd Hoffmann
    const pci_class_desc *desc;
1850 10c4c98a Gerd Hoffmann
    char ctxt[64];
1851 10c4c98a Gerd Hoffmann
    PCIIORegion *r;
1852 10c4c98a Gerd Hoffmann
    int i, class;
1853 10c4c98a Gerd Hoffmann
1854 b0ff8eb2 Isaku Yamahata
    class = pci_get_word(d->config + PCI_CLASS_DEVICE);
1855 10c4c98a Gerd Hoffmann
    desc = pci_class_descriptions;
1856 10c4c98a Gerd Hoffmann
    while (desc->desc && class != desc->class)
1857 10c4c98a Gerd Hoffmann
        desc++;
1858 10c4c98a Gerd Hoffmann
    if (desc->desc) {
1859 10c4c98a Gerd Hoffmann
        snprintf(ctxt, sizeof(ctxt), "%s", desc->desc);
1860 10c4c98a Gerd Hoffmann
    } else {
1861 10c4c98a Gerd Hoffmann
        snprintf(ctxt, sizeof(ctxt), "Class %04x", class);
1862 10c4c98a Gerd Hoffmann
    }
1863 10c4c98a Gerd Hoffmann
1864 10c4c98a Gerd Hoffmann
    monitor_printf(mon, "%*sclass %s, addr %02x:%02x.%x, "
1865 10c4c98a Gerd Hoffmann
                   "pci id %04x:%04x (sub %04x:%04x)\n",
1866 7f5feab4 Alex Williamson
                   indent, "", ctxt, pci_bus_num(d->bus),
1867 e822a52a Isaku Yamahata
                   PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
1868 b0ff8eb2 Isaku Yamahata
                   pci_get_word(d->config + PCI_VENDOR_ID),
1869 b0ff8eb2 Isaku Yamahata
                   pci_get_word(d->config + PCI_DEVICE_ID),
1870 b0ff8eb2 Isaku Yamahata
                   pci_get_word(d->config + PCI_SUBSYSTEM_VENDOR_ID),
1871 b0ff8eb2 Isaku Yamahata
                   pci_get_word(d->config + PCI_SUBSYSTEM_ID));
1872 10c4c98a Gerd Hoffmann
    for (i = 0; i < PCI_NUM_REGIONS; i++) {
1873 10c4c98a Gerd Hoffmann
        r = &d->io_regions[i];
1874 10c4c98a Gerd Hoffmann
        if (!r->size)
1875 10c4c98a Gerd Hoffmann
            continue;
1876 89e8b13c Isaku Yamahata
        monitor_printf(mon, "%*sbar %d: %s at 0x%"FMT_PCIBUS
1877 89e8b13c Isaku Yamahata
                       " [0x%"FMT_PCIBUS"]\n",
1878 89e8b13c Isaku Yamahata
                       indent, "",
1879 0392a017 Isaku Yamahata
                       i, r->type & PCI_BASE_ADDRESS_SPACE_IO ? "i/o" : "mem",
1880 10c4c98a Gerd Hoffmann
                       r->addr, r->addr + r->size - 1);
1881 10c4c98a Gerd Hoffmann
    }
1882 10c4c98a Gerd Hoffmann
}
1883 03587182 Gerd Hoffmann
1884 5e0259e7 Gleb Natapov
static char *pci_dev_fw_name(DeviceState *dev, char *buf, int len)
1885 5e0259e7 Gleb Natapov
{
1886 5e0259e7 Gleb Natapov
    PCIDevice *d = (PCIDevice *)dev;
1887 5e0259e7 Gleb Natapov
    const char *name = NULL;
1888 5e0259e7 Gleb Natapov
    const pci_class_desc *desc =  pci_class_descriptions;
1889 5e0259e7 Gleb Natapov
    int class = pci_get_word(d->config + PCI_CLASS_DEVICE);
1890 5e0259e7 Gleb Natapov
1891 5e0259e7 Gleb Natapov
    while (desc->desc &&
1892 5e0259e7 Gleb Natapov
          (class & ~desc->fw_ign_bits) !=
1893 5e0259e7 Gleb Natapov
          (desc->class & ~desc->fw_ign_bits)) {
1894 5e0259e7 Gleb Natapov
        desc++;
1895 5e0259e7 Gleb Natapov
    }
1896 5e0259e7 Gleb Natapov
1897 5e0259e7 Gleb Natapov
    if (desc->desc) {
1898 5e0259e7 Gleb Natapov
        name = desc->fw_name;
1899 5e0259e7 Gleb Natapov
    }
1900 5e0259e7 Gleb Natapov
1901 5e0259e7 Gleb Natapov
    if (name) {
1902 5e0259e7 Gleb Natapov
        pstrcpy(buf, len, name);
1903 5e0259e7 Gleb Natapov
    } else {
1904 5e0259e7 Gleb Natapov
        snprintf(buf, len, "pci%04x,%04x",
1905 5e0259e7 Gleb Natapov
                 pci_get_word(d->config + PCI_VENDOR_ID),
1906 5e0259e7 Gleb Natapov
                 pci_get_word(d->config + PCI_DEVICE_ID));
1907 5e0259e7 Gleb Natapov
    }
1908 5e0259e7 Gleb Natapov
1909 5e0259e7 Gleb Natapov
    return buf;
1910 5e0259e7 Gleb Natapov
}
1911 5e0259e7 Gleb Natapov
1912 5e0259e7 Gleb Natapov
static char *pcibus_get_fw_dev_path(DeviceState *dev)
1913 5e0259e7 Gleb Natapov
{
1914 5e0259e7 Gleb Natapov
    PCIDevice *d = (PCIDevice *)dev;
1915 5e0259e7 Gleb Natapov
    char path[50], name[33];
1916 5e0259e7 Gleb Natapov
    int off;
1917 5e0259e7 Gleb Natapov
1918 5e0259e7 Gleb Natapov
    off = snprintf(path, sizeof(path), "%s@%x",
1919 5e0259e7 Gleb Natapov
                   pci_dev_fw_name(dev, name, sizeof name),
1920 5e0259e7 Gleb Natapov
                   PCI_SLOT(d->devfn));
1921 5e0259e7 Gleb Natapov
    if (PCI_FUNC(d->devfn))
1922 5e0259e7 Gleb Natapov
        snprintf(path + off, sizeof(path) + off, ",%x", PCI_FUNC(d->devfn));
1923 5e0259e7 Gleb Natapov
    return strdup(path);
1924 5e0259e7 Gleb Natapov
}
1925 5e0259e7 Gleb Natapov
1926 4f43c1ff Alex Williamson
static char *pcibus_get_dev_path(DeviceState *dev)
1927 4f43c1ff Alex Williamson
{
1928 a6a7005d Michael S. Tsirkin
    PCIDevice *d = container_of(dev, PCIDevice, qdev);
1929 a6a7005d Michael S. Tsirkin
    PCIDevice *t;
1930 a6a7005d Michael S. Tsirkin
    int slot_depth;
1931 a6a7005d Michael S. Tsirkin
    /* Path format: Domain:00:Slot.Function:Slot.Function....:Slot.Function.
1932 a6a7005d Michael S. Tsirkin
     * 00 is added here to make this format compatible with
1933 a6a7005d Michael S. Tsirkin
     * domain:Bus:Slot.Func for systems without nested PCI bridges.
1934 a6a7005d Michael S. Tsirkin
     * Slot.Function list specifies the slot and function numbers for all
1935 a6a7005d Michael S. Tsirkin
     * devices on the path from root to the specific device. */
1936 2991181a Michael S. Tsirkin
    char domain[] = "DDDD:00";
1937 2991181a Michael S. Tsirkin
    char slot[] = ":SS.F";
1938 2991181a Michael S. Tsirkin
    int domain_len = sizeof domain - 1 /* For '\0' */;
1939 2991181a Michael S. Tsirkin
    int slot_len = sizeof slot - 1 /* For '\0' */;
1940 a6a7005d Michael S. Tsirkin
    int path_len;
1941 a6a7005d Michael S. Tsirkin
    char *path, *p;
1942 2991181a Michael S. Tsirkin
    int s;
1943 a6a7005d Michael S. Tsirkin
1944 a6a7005d Michael S. Tsirkin
    /* Calculate # of slots on path between device and root. */;
1945 a6a7005d Michael S. Tsirkin
    slot_depth = 0;
1946 a6a7005d Michael S. Tsirkin
    for (t = d; t; t = t->bus->parent_dev) {
1947 a6a7005d Michael S. Tsirkin
        ++slot_depth;
1948 a6a7005d Michael S. Tsirkin
    }
1949 a6a7005d Michael S. Tsirkin
1950 a6a7005d Michael S. Tsirkin
    path_len = domain_len + slot_len * slot_depth;
1951 a6a7005d Michael S. Tsirkin
1952 a6a7005d Michael S. Tsirkin
    /* Allocate memory, fill in the terminating null byte. */
1953 7267c094 Anthony Liguori
    path = g_malloc(path_len + 1 /* For '\0' */);
1954 a6a7005d Michael S. Tsirkin
    path[path_len] = '\0';
1955 a6a7005d Michael S. Tsirkin
1956 a6a7005d Michael S. Tsirkin
    /* First field is the domain. */
1957 2991181a Michael S. Tsirkin
    s = snprintf(domain, sizeof domain, "%04x:00", pci_find_domain(d->bus));
1958 2991181a Michael S. Tsirkin
    assert(s == domain_len);
1959 2991181a Michael S. Tsirkin
    memcpy(path, domain, domain_len);
1960 a6a7005d Michael S. Tsirkin
1961 a6a7005d Michael S. Tsirkin
    /* Fill in slot numbers. We walk up from device to root, so need to print
1962 a6a7005d Michael S. Tsirkin
     * them in the reverse order, last to first. */
1963 a6a7005d Michael S. Tsirkin
    p = path + path_len;
1964 a6a7005d Michael S. Tsirkin
    for (t = d; t; t = t->bus->parent_dev) {
1965 a6a7005d Michael S. Tsirkin
        p -= slot_len;
1966 2991181a Michael S. Tsirkin
        s = snprintf(slot, sizeof slot, ":%02x.%x",
1967 4c900518 Isaku Yamahata
                     PCI_SLOT(t->devfn), PCI_FUNC(t->devfn));
1968 2991181a Michael S. Tsirkin
        assert(s == slot_len);
1969 2991181a Michael S. Tsirkin
        memcpy(p, slot, slot_len);
1970 a6a7005d Michael S. Tsirkin
    }
1971 a6a7005d Michael S. Tsirkin
1972 a6a7005d Michael S. Tsirkin
    return path;
1973 4f43c1ff Alex Williamson
}
1974 4f43c1ff Alex Williamson
1975 f3006dd1 Isaku Yamahata
static int pci_qdev_find_recursive(PCIBus *bus,
1976 f3006dd1 Isaku Yamahata
                                   const char *id, PCIDevice **pdev)
1977 f3006dd1 Isaku Yamahata
{
1978 f3006dd1 Isaku Yamahata
    DeviceState *qdev = qdev_find_recursive(&bus->qbus, id);
1979 f3006dd1 Isaku Yamahata
    if (!qdev) {
1980 f3006dd1 Isaku Yamahata
        return -ENODEV;
1981 f3006dd1 Isaku Yamahata
    }
1982 f3006dd1 Isaku Yamahata
1983 f3006dd1 Isaku Yamahata
    /* roughly check if given qdev is pci device */
1984 4be9f0d1 Anthony Liguori
    if (object_dynamic_cast(OBJECT(qdev), TYPE_PCI_DEVICE)) {
1985 40021f08 Anthony Liguori
        *pdev = PCI_DEVICE(qdev);
1986 f3006dd1 Isaku Yamahata
        return 0;
1987 f3006dd1 Isaku Yamahata
    }
1988 f3006dd1 Isaku Yamahata
    return -EINVAL;
1989 f3006dd1 Isaku Yamahata
}
1990 f3006dd1 Isaku Yamahata
1991 f3006dd1 Isaku Yamahata
int pci_qdev_find_device(const char *id, PCIDevice **pdev)
1992 f3006dd1 Isaku Yamahata
{
1993 f3006dd1 Isaku Yamahata
    struct PCIHostBus *host;
1994 f3006dd1 Isaku Yamahata
    int rc = -ENODEV;
1995 f3006dd1 Isaku Yamahata
1996 f3006dd1 Isaku Yamahata
    QLIST_FOREACH(host, &host_buses, next) {
1997 f3006dd1 Isaku Yamahata
        int tmp = pci_qdev_find_recursive(host->bus, id, pdev);
1998 f3006dd1 Isaku Yamahata
        if (!tmp) {
1999 f3006dd1 Isaku Yamahata
            rc = 0;
2000 f3006dd1 Isaku Yamahata
            break;
2001 f3006dd1 Isaku Yamahata
        }
2002 f3006dd1 Isaku Yamahata
        if (tmp != -ENODEV) {
2003 f3006dd1 Isaku Yamahata
            rc = tmp;
2004 f3006dd1 Isaku Yamahata
        }
2005 f3006dd1 Isaku Yamahata
    }
2006 f3006dd1 Isaku Yamahata
2007 f3006dd1 Isaku Yamahata
    return rc;
2008 f3006dd1 Isaku Yamahata
}
2009 f5e6fed8 Avi Kivity
2010 f5e6fed8 Avi Kivity
MemoryRegion *pci_address_space(PCIDevice *dev)
2011 f5e6fed8 Avi Kivity
{
2012 f5e6fed8 Avi Kivity
    return dev->bus->address_space_mem;
2013 f5e6fed8 Avi Kivity
}
2014 e11d6439 Richard Henderson
2015 e11d6439 Richard Henderson
MemoryRegion *pci_address_space_io(PCIDevice *dev)
2016 e11d6439 Richard Henderson
{
2017 e11d6439 Richard Henderson
    return dev->bus->address_space_io;
2018 e11d6439 Richard Henderson
}
2019 40021f08 Anthony Liguori
2020 39bffca2 Anthony Liguori
static void pci_device_class_init(ObjectClass *klass, void *data)
2021 39bffca2 Anthony Liguori
{
2022 39bffca2 Anthony Liguori
    DeviceClass *k = DEVICE_CLASS(klass);
2023 39bffca2 Anthony Liguori
    k->init = pci_qdev_init;
2024 39bffca2 Anthony Liguori
    k->unplug = pci_unplug_device;
2025 39bffca2 Anthony Liguori
    k->exit = pci_unregister_device;
2026 0d936928 Anthony Liguori
    k->bus_type = TYPE_PCI_BUS;
2027 bce54474 Paolo Bonzini
    k->props = pci_props;
2028 39bffca2 Anthony Liguori
}
2029 39bffca2 Anthony Liguori
2030 5fa45de5 David Gibson
void pci_setup_iommu(PCIBus *bus, PCIDMAContextFunc fn, void *opaque)
2031 5fa45de5 David Gibson
{
2032 5fa45de5 David Gibson
    bus->dma_context_fn = fn;
2033 5fa45de5 David Gibson
    bus->dma_context_opaque = opaque;
2034 5fa45de5 David Gibson
}
2035 5fa45de5 David Gibson
2036 40021f08 Anthony Liguori
static TypeInfo pci_device_type_info = {
2037 40021f08 Anthony Liguori
    .name = TYPE_PCI_DEVICE,
2038 40021f08 Anthony Liguori
    .parent = TYPE_DEVICE,
2039 40021f08 Anthony Liguori
    .instance_size = sizeof(PCIDevice),
2040 40021f08 Anthony Liguori
    .abstract = true,
2041 40021f08 Anthony Liguori
    .class_size = sizeof(PCIDeviceClass),
2042 39bffca2 Anthony Liguori
    .class_init = pci_device_class_init,
2043 40021f08 Anthony Liguori
};
2044 40021f08 Anthony Liguori
2045 83f7d43a Andreas Färber
static void pci_register_types(void)
2046 40021f08 Anthony Liguori
{
2047 0d936928 Anthony Liguori
    type_register_static(&pci_bus_info);
2048 40021f08 Anthony Liguori
    type_register_static(&pci_device_type_info);
2049 40021f08 Anthony Liguori
}
2050 40021f08 Anthony Liguori
2051 83f7d43a Andreas Färber
type_init(pci_register_types)