pci.c 72.5 KB
Newer Older
B
bellard 已提交
1 2 3 4
/*
 * QEMU PCI bus manager
 *
 * Copyright (c) 2004 Fabrice Bellard
5
 *
B
bellard 已提交
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
24 25 26
#include "hw/hw.h"
#include "hw/pci/pci.h"
#include "hw/pci/pci_bridge.h"
27
#include "hw/pci/pci_bus.h"
28
#include "hw/pci/pci_host.h"
29
#include "monitor/monitor.h"
P
Paolo Bonzini 已提交
30
#include "net/net.h"
31
#include "sysemu/sysemu.h"
32
#include "hw/loader.h"
33
#include "qemu/error-report.h"
34
#include "qemu/range.h"
L
Luiz Capitulino 已提交
35
#include "qmp-commands.h"
D
Don Koch 已提交
36
#include "trace.h"
37 38
#include "hw/pci/msi.h"
#include "hw/pci/msix.h"
39
#include "exec/address-spaces.h"
40
#include "hw/hotplug.h"
41
#include "hw/boards.h"
B
bellard 已提交
42 43

//#define DEBUG_PCI
44
#ifdef DEBUG_PCI
45
# define PCI_DPRINTF(format, ...)       printf(format, ## __VA_ARGS__)
46 47 48
#else
# define PCI_DPRINTF(format, ...)       do { } while (0)
#endif
B
bellard 已提交
49

50
static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent);
51
static char *pcibus_get_dev_path(DeviceState *dev);
52
static char *pcibus_get_fw_dev_path(DeviceState *dev);
P
Paolo Bonzini 已提交
53
static void pcibus_reset(BusState *qbus);
54

55 56 57 58 59 60 61 62 63 64 65
static Property pci_props[] = {
    DEFINE_PROP_PCI_DEVFN("addr", PCIDevice, devfn, -1),
    DEFINE_PROP_STRING("romfile", PCIDevice, romfile),
    DEFINE_PROP_UINT32("rombar",  PCIDevice, rom_bar, 1),
    DEFINE_PROP_BIT("multifunction", PCIDevice, cap_present,
                    QEMU_PCI_CAP_MULTIFUNCTION_BITNR, false),
    DEFINE_PROP_BIT("command_serr_enable", PCIDevice, cap_present,
                    QEMU_PCI_CAP_SERR_BITNR, true),
    DEFINE_PROP_END_OF_LIST()
};

66 67 68 69
static const VMStateDescription vmstate_pcibus = {
    .name = "PCIBUS",
    .version_id = 1,
    .minimum_version_id = 1,
70
    .fields = (VMStateField[]) {
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
        VMSTATE_INT32_EQUAL(nirq, PCIBus),
        VMSTATE_VARRAY_INT32(irq_count, PCIBus,
                             nirq, 0, vmstate_info_int32,
                             int32_t),
        VMSTATE_END_OF_LIST()
    }
};

static void pci_bus_realize(BusState *qbus, Error **errp)
{
    PCIBus *bus = PCI_BUS(qbus);

    vmstate_register(NULL, -1, &vmstate_pcibus, bus);
}

static void pci_bus_unrealize(BusState *qbus, Error **errp)
{
    PCIBus *bus = PCI_BUS(qbus);

    vmstate_unregister(NULL, &vmstate_pcibus, bus);
}

93 94 95 96 97
static bool pcibus_is_root(PCIBus *bus)
{
    return !bus->parent_dev;
}

98 99 100 101 102 103 104 105
static int pcibus_num(PCIBus *bus)
{
    if (pcibus_is_root(bus)) {
        return 0; /* pci host bridge */
    }
    return bus->parent_dev->config[PCI_SECONDARY_BUS];
}

106 107 108 109 110
static uint16_t pcibus_numa_node(PCIBus *bus)
{
    return NUMA_NODE_UNASSIGNED;
}

111 112 113
static void pci_bus_class_init(ObjectClass *klass, void *data)
{
    BusClass *k = BUS_CLASS(klass);
114
    PCIBusClass *pbc = PCI_BUS_CLASS(klass);
115 116 117 118

    k->print_dev = pcibus_dev_print;
    k->get_dev_path = pcibus_get_dev_path;
    k->get_fw_dev_path = pcibus_get_fw_dev_path;
119 120
    k->realize = pci_bus_realize;
    k->unrealize = pci_bus_unrealize;
121
    k->reset = pcibus_reset;
122 123

    pbc->is_root = pcibus_is_root;
124
    pbc->bus_num = pcibus_num;
125
    pbc->numa_node = pcibus_numa_node;
126 127 128 129 130 131
}

static const TypeInfo pci_bus_info = {
    .name = TYPE_PCI_BUS,
    .parent = TYPE_BUS,
    .instance_size = sizeof(PCIBus),
132
    .class_size = sizeof(PCIBusClass),
133
    .class_init = pci_bus_class_init,
134
};
B
bellard 已提交
135

136 137 138 139 140
static const TypeInfo pcie_bus_info = {
    .name = TYPE_PCIE_BUS,
    .parent = TYPE_PCI_BUS,
};

141
static PCIBus *pci_find_bus_nr(PCIBus *bus, int bus_num);
B
bellard 已提交
142
static void pci_update_mappings(PCIDevice *d);
143
static void pci_irq_handler(void *opaque, int irq_num, int level);
M
Markus Armbruster 已提交
144
static void pci_add_option_rom(PCIDevice *pdev, bool is_default_rom, Error **);
145
static void pci_del_option_rom(PCIDevice *pdev);
B
bellard 已提交
146

147 148
static uint16_t pci_default_sub_vendor_id = PCI_SUBVENDOR_ID_REDHAT_QUMRANET;
static uint16_t pci_default_sub_device_id = PCI_SUBDEVICE_ID_QEMU;
149

150
static QLIST_HEAD(, PCIHostState) pci_host_bridges;
151

152
int pci_bar(PCIDevice *d, int reg)
153
{
154 155 156 157 158 159 160
    uint8_t type;

    if (reg != PCI_ROM_SLOT)
        return PCI_BASE_ADDRESS_0 + reg * 4;

    type = d->config[PCI_HEADER_TYPE] & ~PCI_HEADER_TYPE_MULTI_FUNCTION;
    return type == PCI_HEADER_TYPE_BRIDGE ? PCI_ROM_ADDRESS1 : PCI_ROM_ADDRESS;
161 162
}

163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
static inline int pci_irq_state(PCIDevice *d, int irq_num)
{
	return (d->irq_state >> irq_num) & 0x1;
}

static inline void pci_set_irq_state(PCIDevice *d, int irq_num, int level)
{
	d->irq_state &= ~(0x1 << irq_num);
	d->irq_state |= level << irq_num;
}

static void pci_change_irq_level(PCIDevice *pci_dev, int irq_num, int change)
{
    PCIBus *bus;
    for (;;) {
        bus = pci_dev->bus;
        irq_num = bus->map_irq(pci_dev, irq_num);
        if (bus->set_irq)
            break;
        pci_dev = bus->parent_dev;
    }
    bus->irq_count[irq_num] += change;
    bus->set_irq(bus->irq_opaque, irq_num, bus->irq_count[irq_num] != 0);
}

188 189 190 191 192 193 194
int pci_bus_get_irq_level(PCIBus *bus, int irq_num)
{
    assert(irq_num >= 0);
    assert(irq_num < bus->nirq);
    return !!bus->irq_count[irq_num];
}

195 196 197 198 199 200 201 202 203 204 205
/* Update interrupt status bit in config space on interrupt
 * state change. */
static void pci_update_irq_status(PCIDevice *dev)
{
    if (dev->irq_state) {
        dev->config[PCI_STATUS] |= PCI_STATUS_INTERRUPT;
    } else {
        dev->config[PCI_STATUS] &= ~PCI_STATUS_INTERRUPT;
    }
}

I
Isaku Yamahata 已提交
206 207 208 209
void pci_device_deassert_intx(PCIDevice *dev)
{
    int i;
    for (i = 0; i < PCI_NUM_PINS; ++i) {
210
        pci_irq_handler(dev, i, 0);
I
Isaku Yamahata 已提交
211 212 213
    }
}

P
Paolo Bonzini 已提交
214
static void pci_do_device_reset(PCIDevice *dev)
215
{
216
    int r;
217

I
Isaku Yamahata 已提交
218
    pci_device_deassert_intx(dev);
C
Cole Robinson 已提交
219 220
    assert(dev->irq_state == 0);

S
Stefan Weil 已提交
221
    /* Clear all writable bits */
222
    pci_word_test_and_clear_mask(dev->config + PCI_COMMAND,
223 224
                                 pci_get_word(dev->wmask + PCI_COMMAND) |
                                 pci_get_word(dev->w1cmask + PCI_COMMAND));
225 226 227
    pci_word_test_and_clear_mask(dev->config + PCI_STATUS,
                                 pci_get_word(dev->wmask + PCI_STATUS) |
                                 pci_get_word(dev->w1cmask + PCI_STATUS));
228 229 230
    dev->config[PCI_CACHE_LINE_SIZE] = 0x0;
    dev->config[PCI_INTERRUPT_LINE] = 0x0;
    for (r = 0; r < PCI_NUM_REGIONS; ++r) {
I
Isaku Yamahata 已提交
231 232
        PCIIORegion *region = &dev->io_regions[r];
        if (!region->size) {
233 234
            continue;
        }
I
Isaku Yamahata 已提交
235 236 237 238 239 240 241

        if (!(region->type & PCI_BASE_ADDRESS_SPACE_IO) &&
            region->type & PCI_BASE_ADDRESS_MEM_TYPE_64) {
            pci_set_quad(dev->config + pci_bar(dev, r), region->type);
        } else {
            pci_set_long(dev->config + pci_bar(dev, r), region->type);
        }
242 243
    }
    pci_update_mappings(dev);
244 245 246

    msi_reset(dev);
    msix_reset(dev);
247 248
}

P
Paolo Bonzini 已提交
249 250 251 252 253 254 255 256 257 258
/*
 * This function is called on #RST and FLR.
 * FLR if PCI_EXP_DEVCTL_BCR_FLR is set
 */
void pci_device_reset(PCIDevice *dev)
{
    qdev_reset_all(&dev->qdev);
    pci_do_device_reset(dev);
}

259 260
/*
 * Trigger pci bus reset under a given bus.
P
Paolo Bonzini 已提交
261 262
 * Called via qbus_reset_all on RST# assert, after the devices
 * have been reset qdev_reset_all-ed already.
263
 */
P
Paolo Bonzini 已提交
264
static void pcibus_reset(BusState *qbus)
G
Gleb Natapov 已提交
265
{
P
Paolo Bonzini 已提交
266
    PCIBus *bus = DO_UPCAST(PCIBus, qbus, qbus);
G
Gleb Natapov 已提交
267 268
    int i;

269 270
    for (i = 0; i < ARRAY_SIZE(bus->devices); ++i) {
        if (bus->devices[i]) {
P
Paolo Bonzini 已提交
271
            pci_do_device_reset(bus->devices[i]);
272
        }
G
Gleb Natapov 已提交
273
    }
274

P
Paolo Bonzini 已提交
275 276 277
    for (i = 0; i < bus->nirq; i++) {
        assert(bus->irq_count[i] == 0);
    }
278 279
}

280
static void pci_host_bus_register(PCIBus *bus, DeviceState *parent)
281
{
282 283 284
    PCIHostState *host_bridge = PCI_HOST_BRIDGE(parent);

    QLIST_INSERT_HEAD(&pci_host_bridges, host_bridge, next);
285 286
}

D
David Gibson 已提交
287
PCIBus *pci_find_primary_bus(void)
288
{
289
    PCIBus *primary_bus = NULL;
290
    PCIHostState *host;
291

292
    QLIST_FOREACH(host, &pci_host_bridges, next) {
293 294 295
        if (primary_bus) {
            /* We have multiple root buses, refuse to select a primary */
            return NULL;
296
        }
297
        primary_bus = host->bus;
298 299
    }

300
    return primary_bus;
301 302
}

303
PCIBus *pci_device_root_bus(const PCIDevice *d)
304
{
305
    PCIBus *bus = d->bus;
306

307 308 309 310
    while (!pci_bus_is_root(bus)) {
        d = bus->parent_dev;
        assert(d != NULL);

311 312 313
        bus = d->bus;
    }

314 315 316
    return bus;
}

317
const char *pci_root_bus_path(PCIDevice *dev)
318
{
319 320 321
    PCIBus *rootbus = pci_device_root_bus(dev);
    PCIHostState *host_bridge = PCI_HOST_BRIDGE(rootbus->qbus.parent);
    PCIHostBridgeClass *hc = PCI_HOST_BRIDGE_GET_CLASS(host_bridge);
322

323 324 325 326
    assert(host_bridge->bus == rootbus);

    if (hc->root_bus_path) {
        return (*hc->root_bus_path)(host_bridge, rootbus);
327 328
    }

329
    return rootbus->qbus.name;
330 331
}

332
static void pci_bus_init(PCIBus *bus, DeviceState *parent,
333
                         const char *name,
334 335
                         MemoryRegion *address_space_mem,
                         MemoryRegion *address_space_io,
336
                         uint8_t devfn_min)
337
{
338
    assert(PCI_FUNC(devfn_min) == 0);
P
pbrook 已提交
339
    bus->devfn_min = devfn_min;
340 341
    bus->address_space_mem = address_space_mem;
    bus->address_space_io = address_space_io;
342 343 344

    /* host bridge */
    QLIST_INIT(&bus->child);
345

346
    pci_host_bus_register(bus, parent);
347 348
}

349 350 351 352 353
bool pci_bus_is_express(PCIBus *bus)
{
    return object_dynamic_cast(OBJECT(bus), TYPE_PCIE_BUS);
}

354 355
bool pci_bus_is_root(PCIBus *bus)
{
356
    return PCI_BUS_GET_CLASS(bus)->is_root(bus);
357 358
}

359
void pci_bus_new_inplace(PCIBus *bus, size_t bus_size, DeviceState *parent,
360 361 362
                         const char *name,
                         MemoryRegion *address_space_mem,
                         MemoryRegion *address_space_io,
363
                         uint8_t devfn_min, const char *typename)
364
{
365
    qbus_create_inplace(bus, bus_size, typename, parent, name);
366 367 368 369
    pci_bus_init(bus, parent, name, address_space_mem,
                 address_space_io, devfn_min);
}

370
PCIBus *pci_bus_new(DeviceState *parent, const char *name,
371 372
                    MemoryRegion *address_space_mem,
                    MemoryRegion *address_space_io,
373
                    uint8_t devfn_min, const char *typename)
374 375 376
{
    PCIBus *bus;

377
    bus = PCI_BUS(qbus_create(typename, parent, name));
378 379
    pci_bus_init(bus, parent, name, address_space_mem,
                 address_space_io, devfn_min);
380 381 382 383 384 385 386 387 388 389
    return bus;
}

void pci_bus_irqs(PCIBus *bus, pci_set_irq_fn set_irq, pci_map_irq_fn map_irq,
                  void *irq_opaque, int nirq)
{
    bus->set_irq = set_irq;
    bus->map_irq = map_irq;
    bus->irq_opaque = irq_opaque;
    bus->nirq = nirq;
390
    bus->irq_count = g_malloc0(nirq * sizeof(bus->irq_count[0]));
391 392 393 394
}

PCIBus *pci_register_bus(DeviceState *parent, const char *name,
                         pci_set_irq_fn set_irq, pci_map_irq_fn map_irq,
395
                         void *irq_opaque,
396 397
                         MemoryRegion *address_space_mem,
                         MemoryRegion *address_space_io,
398
                         uint8_t devfn_min, int nirq, const char *typename)
399 400 401
{
    PCIBus *bus;

402
    bus = pci_bus_new(parent, name, address_space_mem,
403
                      address_space_io, devfn_min, typename);
404
    pci_bus_irqs(bus, set_irq, map_irq, irq_opaque, nirq);
405 406
    return bus;
}
B
bellard 已提交
407

P
pbrook 已提交
408 409
int pci_bus_num(PCIBus *s)
{
410
    return PCI_BUS_GET_CLASS(s)->bus_num(s);
P
pbrook 已提交
411 412
}

413 414 415
int pci_bus_numa_node(PCIBus *bus)
{
    return PCI_BUS_GET_CLASS(bus)->numa_node(bus);
P
pbrook 已提交
416 417
}

J
Juan Quintela 已提交
418
static int get_pci_config_device(QEMUFile *f, void *pv, size_t size)
419
{
J
Juan Quintela 已提交
420
    PCIDevice *s = container_of(pv, PCIDevice, config);
421
    PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(s);
I
Isaku Yamahata 已提交
422
    uint8_t *config;
423 424
    int i;

I
Isaku Yamahata 已提交
425
    assert(size == pci_config_size(s));
426
    config = g_malloc(size);
I
Isaku Yamahata 已提交
427 428 429

    qemu_get_buffer(f, config, size);
    for (i = 0; i < size; ++i) {
430 431
        if ((config[i] ^ s->config[i]) &
            s->cmask[i] & ~s->wmask[i] & ~s->w1cmask[i]) {
432 433 434 435
            error_report("%s: Bad config data: i=0x%x read: %x device: %x "
                         "cmask: %x wmask: %x w1cmask:%x", __func__,
                         i, config[i], s->config[i],
                         s->cmask[i], s->wmask[i], s->w1cmask[i]);
436
            g_free(config);
437
            return -EINVAL;
I
Isaku Yamahata 已提交
438 439 440
        }
    }
    memcpy(s->config, config, size);
441

B
bellard 已提交
442
    pci_update_mappings(s);
443
    if (pc->is_bridge) {
444
        PCIBridge *b = PCI_BRIDGE(s);
445 446
        pci_bridge_update_mappings(b);
    }
447

G
Gerd Hoffmann 已提交
448 449 450 451
    memory_region_set_enabled(&s->bus_master_enable_region,
                              pci_get_word(s->config + PCI_COMMAND)
                              & PCI_COMMAND_MASTER);

452
    g_free(config);
453 454 455
    return 0;
}

J
Juan Quintela 已提交
456
/* just put buffer */
457
static void put_pci_config_device(QEMUFile *f, void *pv, size_t size)
J
Juan Quintela 已提交
458
{
459
    const uint8_t **v = pv;
I
Isaku Yamahata 已提交
460
    assert(size == pci_config_size(container_of(pv, PCIDevice, config)));
461
    qemu_put_buffer(f, *v, size);
J
Juan Quintela 已提交
462 463 464 465 466 467 468 469
}

static VMStateInfo vmstate_info_pci_config = {
    .name = "pci config",
    .get  = get_pci_config_device,
    .put  = put_pci_config_device,
};

470 471
static int get_pci_irq_state(QEMUFile *f, void *pv, size_t size)
{
472
    PCIDevice *s = container_of(pv, PCIDevice, irq_state);
473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493
    uint32_t irq_state[PCI_NUM_PINS];
    int i;
    for (i = 0; i < PCI_NUM_PINS; ++i) {
        irq_state[i] = qemu_get_be32(f);
        if (irq_state[i] != 0x1 && irq_state[i] != 0) {
            fprintf(stderr, "irq state %d: must be 0 or 1.\n",
                    irq_state[i]);
            return -EINVAL;
        }
    }

    for (i = 0; i < PCI_NUM_PINS; ++i) {
        pci_set_irq_state(s, i, irq_state[i]);
    }

    return 0;
}

static void put_pci_irq_state(QEMUFile *f, void *pv, size_t size)
{
    int i;
494
    PCIDevice *s = container_of(pv, PCIDevice, irq_state);
495 496 497 498 499 500 501 502 503 504 505 506

    for (i = 0; i < PCI_NUM_PINS; ++i) {
        qemu_put_be32(f, pci_irq_state(s, i));
    }
}

static VMStateInfo vmstate_info_pci_irq_state = {
    .name = "pci irq state",
    .get  = get_pci_irq_state,
    .put  = put_pci_irq_state,
};

J
Juan Quintela 已提交
507 508 509 510
const VMStateDescription vmstate_pci_device = {
    .name = "PCIDevice",
    .version_id = 2,
    .minimum_version_id = 1,
511
    .fields = (VMStateField[]) {
512
        VMSTATE_INT32_POSITIVE_LE(version_id, PCIDevice),
I
Isaku Yamahata 已提交
513 514 515
        VMSTATE_BUFFER_UNSAFE_INFO(config, PCIDevice, 0,
                                   vmstate_info_pci_config,
                                   PCI_CONFIG_SPACE_SIZE),
516 517 518
        VMSTATE_BUFFER_UNSAFE_INFO(irq_state, PCIDevice, 2,
				   vmstate_info_pci_irq_state,
				   PCI_NUM_PINS * sizeof(int32_t)),
I
Isaku Yamahata 已提交
519 520 521 522 523
        VMSTATE_END_OF_LIST()
    }
};

const VMStateDescription vmstate_pcie_device = {
524
    .name = "PCIEDevice",
I
Isaku Yamahata 已提交
525 526
    .version_id = 2,
    .minimum_version_id = 1,
527
    .fields = (VMStateField[]) {
528
        VMSTATE_INT32_POSITIVE_LE(version_id, PCIDevice),
I
Isaku Yamahata 已提交
529 530 531
        VMSTATE_BUFFER_UNSAFE_INFO(config, PCIDevice, 0,
                                   vmstate_info_pci_config,
                                   PCIE_CONFIG_SPACE_SIZE),
532 533 534
        VMSTATE_BUFFER_UNSAFE_INFO(irq_state, PCIDevice, 2,
				   vmstate_info_pci_irq_state,
				   PCI_NUM_PINS * sizeof(int32_t)),
J
Juan Quintela 已提交
535 536 537 538
        VMSTATE_END_OF_LIST()
    }
};

I
Isaku Yamahata 已提交
539 540 541 542 543
static inline const VMStateDescription *pci_get_vmstate(PCIDevice *s)
{
    return pci_is_express(s) ? &vmstate_pcie_device : &vmstate_pci_device;
}

J
Juan Quintela 已提交
544 545
void pci_device_save(PCIDevice *s, QEMUFile *f)
{
546 547 548 549 550
    /* Clear interrupt status bit: it is implicit
     * in irq_state which we are saving.
     * This makes us compatible with old devices
     * which never set or clear this bit. */
    s->config[PCI_STATUS] &= ~PCI_STATUS_INTERRUPT;
551
    vmstate_save_state(f, pci_get_vmstate(s), s, NULL);
552 553
    /* Restore the interrupt status bit. */
    pci_update_irq_status(s);
J
Juan Quintela 已提交
554 555 556 557
}

int pci_device_load(PCIDevice *s, QEMUFile *f)
{
558 559 560 561 562
    int ret;
    ret = vmstate_load_state(f, pci_get_vmstate(s), s, s->version_id);
    /* Restore the interrupt status bit. */
    pci_update_irq_status(s);
    return ret;
J
Juan Quintela 已提交
563 564
}

565
static void pci_set_default_subsystem_id(PCIDevice *pci_dev)
566
{
567 568 569 570
    pci_set_word(pci_dev->config + PCI_SUBSYSTEM_VENDOR_ID,
                 pci_default_sub_vendor_id);
    pci_set_word(pci_dev->config + PCI_SUBSYSTEM_ID,
                 pci_default_sub_device_id);
571 572
}

573
/*
574 575
 * Parse [[<domain>:]<bus>:]<slot>, return -1 on error if funcp == NULL
 *       [[<domain>:]<bus>:]<slot>.<func>, return -1 on error
576
 */
577 578
static int pci_parse_devaddr(const char *addr, int *domp, int *busp,
                             unsigned int *slotp, unsigned int *funcp)
579 580 581 582 583
{
    const char *p;
    char *e;
    unsigned long val;
    unsigned long dom = 0, bus = 0;
584 585
    unsigned int slot = 0;
    unsigned int func = 0;
586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608

    p = addr;
    val = strtoul(p, &e, 16);
    if (e == p)
	return -1;
    if (*e == ':') {
	bus = val;
	p = e + 1;
	val = strtoul(p, &e, 16);
	if (e == p)
	    return -1;
	if (*e == ':') {
	    dom = bus;
	    bus = val;
	    p = e + 1;
	    val = strtoul(p, &e, 16);
	    if (e == p)
		return -1;
	}
    }

    slot = val;

609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624
    if (funcp != NULL) {
        if (*e != '.')
            return -1;

        p = e + 1;
        val = strtoul(p, &e, 16);
        if (e == p)
            return -1;

        func = val;
    }

    /* if funcp == NULL func is 0 */
    if (dom > 0xffff || bus > 0xff || slot > 0x1f || func > 7)
	return -1;

625 626 627 628 629 630
    if (*e)
	return -1;

    *domp = dom;
    *busp = bus;
    *slotp = slot;
631 632
    if (funcp != NULL)
        *funcp = func;
633 634 635
    return 0;
}

636 637
static PCIBus *pci_get_bus_devfn(int *devfnp, PCIBus *root,
                                 const char *devaddr)
638 639 640 641
{
    int dom, bus;
    unsigned slot;

D
David Gibson 已提交
642 643 644 645 646
    if (!root) {
        fprintf(stderr, "No primary PCI bus\n");
        return NULL;
    }

647 648
    assert(!root->parent_dev);

649 650
    if (!devaddr) {
        *devfnp = -1;
D
David Gibson 已提交
651
        return pci_find_bus_nr(root, 0);
652 653
    }

654
    if (pci_parse_devaddr(devaddr, &dom, &bus, &slot, NULL) < 0) {
655 656 657
        return NULL;
    }

D
David Gibson 已提交
658 659 660 661 662
    if (dom != 0) {
        fprintf(stderr, "No support for non-zero PCI domains\n");
        return NULL;
    }

663
    *devfnp = PCI_DEVFN(slot, 0);
D
David Gibson 已提交
664
    return pci_find_bus_nr(root, bus);
665 666
}

667 668 669 670 671 672 673 674 675 676 677 678
static void pci_init_cmask(PCIDevice *dev)
{
    pci_set_word(dev->cmask + PCI_VENDOR_ID, 0xffff);
    pci_set_word(dev->cmask + PCI_DEVICE_ID, 0xffff);
    dev->cmask[PCI_STATUS] = PCI_STATUS_CAP_LIST;
    dev->cmask[PCI_REVISION_ID] = 0xff;
    dev->cmask[PCI_CLASS_PROG] = 0xff;
    pci_set_word(dev->cmask + PCI_CLASS_DEVICE, 0xffff);
    dev->cmask[PCI_HEADER_TYPE] = 0xff;
    dev->cmask[PCI_CAPABILITY_LIST] = 0xff;
}

679 680
static void pci_init_wmask(PCIDevice *dev)
{
I
Isaku Yamahata 已提交
681 682
    int config_size = pci_config_size(dev);

683 684
    dev->wmask[PCI_CACHE_LINE_SIZE] = 0xff;
    dev->wmask[PCI_INTERRUPT_LINE] = 0xff;
I
Isaku Yamahata 已提交
685
    pci_set_word(dev->wmask + PCI_COMMAND,
686 687
                 PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER |
                 PCI_COMMAND_INTX_DISABLE);
688 689 690
    if (dev->cap_present & QEMU_PCI_CAP_SERR) {
        pci_word_test_and_set_mask(dev->wmask + PCI_COMMAND, PCI_COMMAND_SERR);
    }
691 692 693

    memset(dev->wmask + PCI_CONFIG_HEADER_SIZE, 0xff,
           config_size - PCI_CONFIG_HEADER_SIZE);
694 695
}

696 697 698
static void pci_init_w1cmask(PCIDevice *dev)
{
    /*
699
     * Note: It's okay to set w1cmask even for readonly bits as
700 701 702 703 704 705 706 707
     * long as their value is hardwired to 0.
     */
    pci_set_word(dev->w1cmask + PCI_STATUS,
                 PCI_STATUS_PARITY | PCI_STATUS_SIG_TARGET_ABORT |
                 PCI_STATUS_REC_TARGET_ABORT | PCI_STATUS_REC_MASTER_ABORT |
                 PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_DETECTED_PARITY);
}

708
static void pci_init_mask_bridge(PCIDevice *d)
709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728
{
    /* PCI_PRIMARY_BUS, PCI_SECONDARY_BUS, PCI_SUBORDINATE_BUS and
       PCI_SEC_LETENCY_TIMER */
    memset(d->wmask + PCI_PRIMARY_BUS, 0xff, 4);

    /* base and limit */
    d->wmask[PCI_IO_BASE] = PCI_IO_RANGE_MASK & 0xff;
    d->wmask[PCI_IO_LIMIT] = PCI_IO_RANGE_MASK & 0xff;
    pci_set_word(d->wmask + PCI_MEMORY_BASE,
                 PCI_MEMORY_RANGE_MASK & 0xffff);
    pci_set_word(d->wmask + PCI_MEMORY_LIMIT,
                 PCI_MEMORY_RANGE_MASK & 0xffff);
    pci_set_word(d->wmask + PCI_PREF_MEMORY_BASE,
                 PCI_PREF_RANGE_MASK & 0xffff);
    pci_set_word(d->wmask + PCI_PREF_MEMORY_LIMIT,
                 PCI_PREF_RANGE_MASK & 0xffff);

    /* PCI_PREF_BASE_UPPER32 and PCI_PREF_LIMIT_UPPER32 */
    memset(d->wmask + PCI_PREF_BASE_UPPER32, 0xff, 8);

729
    /* Supported memory and i/o types */
M
Michael S. Tsirkin 已提交
730 731
    d->config[PCI_IO_BASE] |= PCI_IO_RANGE_TYPE_16;
    d->config[PCI_IO_LIMIT] |= PCI_IO_RANGE_TYPE_16;
732 733 734 735 736
    pci_word_test_and_set_mask(d->config + PCI_PREF_MEMORY_BASE,
                               PCI_PREF_RANGE_TYPE_64);
    pci_word_test_and_set_mask(d->config + PCI_PREF_MEMORY_LIMIT,
                               PCI_PREF_RANGE_TYPE_64);

737 738 739 740
    /*
     * TODO: Bridges default to 10-bit VGA decoding but we currently only
     * implement 16-bit decoding (no alias support).
     */
741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756
    pci_set_word(d->wmask + PCI_BRIDGE_CONTROL,
                 PCI_BRIDGE_CTL_PARITY |
                 PCI_BRIDGE_CTL_SERR |
                 PCI_BRIDGE_CTL_ISA |
                 PCI_BRIDGE_CTL_VGA |
                 PCI_BRIDGE_CTL_VGA_16BIT |
                 PCI_BRIDGE_CTL_MASTER_ABORT |
                 PCI_BRIDGE_CTL_BUS_RESET |
                 PCI_BRIDGE_CTL_FAST_BACK |
                 PCI_BRIDGE_CTL_DISCARD |
                 PCI_BRIDGE_CTL_SEC_DISCARD |
                 PCI_BRIDGE_CTL_DISCARD_SERR);
    /* Below does not do anything as we never set this bit, put here for
     * completeness. */
    pci_set_word(d->w1cmask + PCI_BRIDGE_CONTROL,
                 PCI_BRIDGE_CTL_DISCARD_STATUS);
757
    d->cmask[PCI_IO_BASE] |= PCI_IO_RANGE_TYPE_MASK;
758
    d->cmask[PCI_IO_LIMIT] |= PCI_IO_RANGE_TYPE_MASK;
759 760
    pci_word_test_and_set_mask(d->cmask + PCI_PREF_MEMORY_BASE,
                               PCI_PREF_RANGE_TYPE_MASK);
761 762
    pci_word_test_and_set_mask(d->cmask + PCI_PREF_MEMORY_LIMIT,
                               PCI_PREF_RANGE_TYPE_MASK);
763 764
}

M
Markus Armbruster 已提交
765
static void pci_init_multifunction(PCIBus *bus, PCIDevice *dev, Error **errp)
766 767 768 769 770 771 772 773 774
{
    uint8_t slot = PCI_SLOT(dev->devfn);
    uint8_t func;

    if (dev->cap_present & QEMU_PCI_CAP_MULTIFUNCTION) {
        dev->config[PCI_HEADER_TYPE] |= PCI_HEADER_TYPE_MULTI_FUNCTION;
    }

    /*
S
Stefan Weil 已提交
775
     * multifunction bit is interpreted in two ways as follows.
776 777 778 779 780 781 782 783 784 785 786 787 788 789 790
     *   - all functions must set the bit to 1.
     *     Example: Intel X53
     *   - function 0 must set the bit, but the rest function (> 0)
     *     is allowed to leave the bit to 0.
     *     Example: PIIX3(also in qemu), PIIX4(also in qemu), ICH10,
     *
     * So OS (at least Linux) checks the bit of only function 0,
     * and doesn't see the bit of function > 0.
     *
     * The below check allows both interpretation.
     */
    if (PCI_FUNC(dev->devfn)) {
        PCIDevice *f0 = bus->devices[PCI_DEVFN(slot, 0)];
        if (f0 && !(f0->cap_present & QEMU_PCI_CAP_MULTIFUNCTION)) {
            /* function 0 should set multifunction bit */
M
Markus Armbruster 已提交
791 792 793
            error_setg(errp, "PCI: single function device can't be populated "
                       "in function %x.%x", slot, PCI_FUNC(dev->devfn));
            return;
794
        }
M
Markus Armbruster 已提交
795
        return;
796 797 798
    }

    if (dev->cap_present & QEMU_PCI_CAP_MULTIFUNCTION) {
M
Markus Armbruster 已提交
799
        return;
800 801 802 803
    }
    /* function 0 indicates single function, so function > 0 must be NULL */
    for (func = 1; func < PCI_FUNC_MAX; ++func) {
        if (bus->devices[PCI_DEVFN(slot, func)]) {
M
Markus Armbruster 已提交
804 805 806 807
            error_setg(errp, "PCI: %x.0 indicates single function, "
                       "but %x.%x is already populated.",
                       slot, slot, func);
            return;
808 809 810 811
        }
    }
}

I
Isaku Yamahata 已提交
812 813 814 815
static void pci_config_alloc(PCIDevice *pci_dev)
{
    int config_size = pci_config_size(pci_dev);

816 817 818 819 820
    pci_dev->config = g_malloc0(config_size);
    pci_dev->cmask = g_malloc0(config_size);
    pci_dev->wmask = g_malloc0(config_size);
    pci_dev->w1cmask = g_malloc0(config_size);
    pci_dev->used = g_malloc0(config_size);
I
Isaku Yamahata 已提交
821 822 823 824
}

static void pci_config_free(PCIDevice *pci_dev)
{
825 826 827 828 829
    g_free(pci_dev->config);
    g_free(pci_dev->cmask);
    g_free(pci_dev->wmask);
    g_free(pci_dev->w1cmask);
    g_free(pci_dev->used);
I
Isaku Yamahata 已提交
830 831
}

832 833 834 835 836 837 838 839
static void do_pci_unregister_device(PCIDevice *pci_dev)
{
    pci_dev->bus->devices[pci_dev->devfn] = NULL;
    pci_config_free(pci_dev);

    address_space_destroy(&pci_dev->bus_master_as);
}

B
bellard 已提交
840
/* -1 for devfn means auto assign */
P
Paul Brook 已提交
841
static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus,
M
Markus Armbruster 已提交
842 843
                                         const char *name, int devfn,
                                         Error **errp)
B
bellard 已提交
844
{
845 846 847
    PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(pci_dev);
    PCIConfigReadFunc *config_read = pc->config_read;
    PCIConfigWriteFunc *config_write = pc->config_write;
M
Markus Armbruster 已提交
848
    Error *local_err = NULL;
849
    AddressSpace *dma_as;
850

B
bellard 已提交
851
    if (devfn < 0) {
852
        for(devfn = bus->devfn_min ; devfn < ARRAY_SIZE(bus->devices);
853
            devfn += PCI_FUNC_MAX) {
854
            if (!bus->devices[devfn])
B
bellard 已提交
855 856
                goto found;
        }
M
Markus Armbruster 已提交
857 858
        error_setg(errp, "PCI: no slot/function available for %s, all in use",
                   name);
859
        return NULL;
B
bellard 已提交
860
    found: ;
861
    } else if (bus->devices[devfn]) {
M
Markus Armbruster 已提交
862 863 864 865
        error_setg(errp, "PCI: slot %d function %d not available for %s,"
                   " in use by %s",
                   PCI_SLOT(devfn), PCI_FUNC(devfn), name,
                   bus->devices[devfn]->name);
866
        return NULL;
B
bellard 已提交
867
    }
868

869
    pci_dev->bus = bus;
870
    pci_dev->devfn = devfn;
871
    dma_as = pci_device_iommu_address_space(pci_dev);
872

873 874
    memory_region_init_alias(&pci_dev->bus_master_enable_region,
                             OBJECT(pci_dev), "bus master",
875 876
                             dma_as->root, 0, memory_region_size(dma_as->root));
    memory_region_set_enabled(&pci_dev->bus_master_enable_region, false);
877 878
    address_space_init(&pci_dev->bus_master_as, &pci_dev->bus_master_enable_region,
                       name);
879

B
bellard 已提交
880
    pstrcpy(pci_dev->name, sizeof(pci_dev->name), name);
881
    pci_dev->irq_state = 0;
I
Isaku Yamahata 已提交
882
    pci_config_alloc(pci_dev);
883

884 885 886 887
    pci_config_set_vendor_id(pci_dev->config, pc->vendor_id);
    pci_config_set_device_id(pci_dev->config, pc->device_id);
    pci_config_set_revision(pci_dev->config, pc->revision);
    pci_config_set_class(pci_dev->config, pc->class_id);
888

889 890
    if (!pc->is_bridge) {
        if (pc->subsystem_vendor_id || pc->subsystem_id) {
891
            pci_set_word(pci_dev->config + PCI_SUBSYSTEM_VENDOR_ID,
892
                         pc->subsystem_vendor_id);
893
            pci_set_word(pci_dev->config + PCI_SUBSYSTEM_ID,
894
                         pc->subsystem_id);
895 896 897 898 899
        } else {
            pci_set_default_subsystem_id(pci_dev);
        }
    } else {
        /* subsystem_vendor_id/subsystem_id are only for header type 0 */
900 901
        assert(!pc->subsystem_vendor_id);
        assert(!pc->subsystem_id);
902
    }
903
    pci_init_cmask(pci_dev);
904
    pci_init_wmask(pci_dev);
905
    pci_init_w1cmask(pci_dev);
906
    if (pc->is_bridge) {
907
        pci_init_mask_bridge(pci_dev);
908
    }
M
Markus Armbruster 已提交
909 910 911
    pci_init_multifunction(bus, pci_dev, &local_err);
    if (local_err) {
        error_propagate(errp, local_err);
912
        do_pci_unregister_device(pci_dev);
913 914
        return NULL;
    }
915 916 917 918 919

    if (!config_read)
        config_read = pci_default_read_config;
    if (!config_write)
        config_write = pci_default_write_config;
B
bellard 已提交
920 921
    pci_dev->config_read = config_read;
    pci_dev->config_write = config_write;
922
    bus->devices[devfn] = pci_dev;
J
Juan Quintela 已提交
923
    pci_dev->version_id = 2; /* Current pci device vmstate version */
B
bellard 已提交
924 925 926
    return pci_dev;
}

927 928 929 930 931 932 933
static void pci_unregister_io_regions(PCIDevice *pci_dev)
{
    PCIIORegion *r;
    int i;

    for(i = 0; i < PCI_NUM_REGIONS; i++) {
        r = &pci_dev->io_regions[i];
934
        if (!r->size || r->addr == PCI_BAR_UNMAPPED)
935
            continue;
936
        memory_region_del_subregion(r->address_space, r->memory);
937
    }
A
Alex Williamson 已提交
938 939

    pci_unregister_vga(pci_dev);
940 941
}

M
Markus Armbruster 已提交
942
static void pci_qdev_unrealize(DeviceState *dev, Error **errp)
943
{
944 945
    PCIDevice *pci_dev = PCI_DEVICE(dev);
    PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(pci_dev);
946 947

    pci_unregister_io_regions(pci_dev);
948
    pci_del_option_rom(pci_dev);
949

950 951 952
    if (pc->exit) {
        pc->exit(pci_dev);
    }
953

954
    do_pci_unregister_device(pci_dev);
955 956
}

957 958
void pci_register_bar(PCIDevice *pci_dev, int region_num,
                      uint8_t type, MemoryRegion *memory)
B
bellard 已提交
959 960
{
    PCIIORegion *r;
P
pbrook 已提交
961
    uint32_t addr;
962
    uint64_t wmask;
A
Avi Kivity 已提交
963
    pcibus_t size = memory_region_size(memory);
964

965 966
    assert(region_num >= 0);
    assert(region_num < PCI_NUM_REGIONS);
967 968
    if (size & (size-1)) {
        fprintf(stderr, "ERROR: PCI region size must be pow2 "
969
                    "type=0x%x, size=0x%"FMT_PCIBUS"\n", type, size);
970 971 972
        exit(1);
    }

B
bellard 已提交
973
    r = &pci_dev->io_regions[region_num];
974
    r->addr = PCI_BAR_UNMAPPED;
B
bellard 已提交
975 976
    r->size = size;
    r->type = type;
977
    r->memory = NULL;
978 979

    wmask = ~(size - 1);
980
    addr = pci_bar(pci_dev, region_num);
P
pbrook 已提交
981
    if (region_num == PCI_ROM_SLOT) {
S
Stefan Weil 已提交
982
        /* ROM enable bit is writable */
983
        wmask |= PCI_ROM_ADDRESS_ENABLE;
P
pbrook 已提交
984
    }
985
    pci_set_long(pci_dev->config + addr, type);
I
Isaku Yamahata 已提交
986 987 988 989 990 991 992 993
    if (!(r->type & PCI_BASE_ADDRESS_SPACE_IO) &&
        r->type & PCI_BASE_ADDRESS_MEM_TYPE_64) {
        pci_set_quad(pci_dev->wmask + addr, wmask);
        pci_set_quad(pci_dev->cmask + addr, ~0ULL);
    } else {
        pci_set_long(pci_dev->wmask + addr, wmask & 0xffffffff);
        pci_set_long(pci_dev->cmask + addr, 0xffffffff);
    }
994
    pci_dev->io_regions[region_num].memory = memory;
995
    pci_dev->io_regions[region_num].address_space
A
Avi Kivity 已提交
996
        = type & PCI_BASE_ADDRESS_SPACE_IO
997 998
        ? pci_dev->bus->address_space_io
        : pci_dev->bus->address_space_mem;
999 1000
}

A
Alex Williamson 已提交
1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057
static void pci_update_vga(PCIDevice *pci_dev)
{
    uint16_t cmd;

    if (!pci_dev->has_vga) {
        return;
    }

    cmd = pci_get_word(pci_dev->config + PCI_COMMAND);

    memory_region_set_enabled(pci_dev->vga_regions[QEMU_PCI_VGA_MEM],
                              cmd & PCI_COMMAND_MEMORY);
    memory_region_set_enabled(pci_dev->vga_regions[QEMU_PCI_VGA_IO_LO],
                              cmd & PCI_COMMAND_IO);
    memory_region_set_enabled(pci_dev->vga_regions[QEMU_PCI_VGA_IO_HI],
                              cmd & PCI_COMMAND_IO);
}

void pci_register_vga(PCIDevice *pci_dev, MemoryRegion *mem,
                      MemoryRegion *io_lo, MemoryRegion *io_hi)
{
    assert(!pci_dev->has_vga);

    assert(memory_region_size(mem) == QEMU_PCI_VGA_MEM_SIZE);
    pci_dev->vga_regions[QEMU_PCI_VGA_MEM] = mem;
    memory_region_add_subregion_overlap(pci_dev->bus->address_space_mem,
                                        QEMU_PCI_VGA_MEM_BASE, mem, 1);

    assert(memory_region_size(io_lo) == QEMU_PCI_VGA_IO_LO_SIZE);
    pci_dev->vga_regions[QEMU_PCI_VGA_IO_LO] = io_lo;
    memory_region_add_subregion_overlap(pci_dev->bus->address_space_io,
                                        QEMU_PCI_VGA_IO_LO_BASE, io_lo, 1);

    assert(memory_region_size(io_hi) == QEMU_PCI_VGA_IO_HI_SIZE);
    pci_dev->vga_regions[QEMU_PCI_VGA_IO_HI] = io_hi;
    memory_region_add_subregion_overlap(pci_dev->bus->address_space_io,
                                        QEMU_PCI_VGA_IO_HI_BASE, io_hi, 1);
    pci_dev->has_vga = true;

    pci_update_vga(pci_dev);
}

void pci_unregister_vga(PCIDevice *pci_dev)
{
    if (!pci_dev->has_vga) {
        return;
    }

    memory_region_del_subregion(pci_dev->bus->address_space_mem,
                                pci_dev->vga_regions[QEMU_PCI_VGA_MEM]);
    memory_region_del_subregion(pci_dev->bus->address_space_io,
                                pci_dev->vga_regions[QEMU_PCI_VGA_IO_LO]);
    memory_region_del_subregion(pci_dev->bus->address_space_io,
                                pci_dev->vga_regions[QEMU_PCI_VGA_IO_HI]);
    pci_dev->has_vga = false;
}

1058 1059 1060 1061 1062
pcibus_t pci_get_bar_addr(PCIDevice *pci_dev, int region_num)
{
    return pci_dev->io_regions[region_num].addr;
}

1063 1064 1065 1066 1067 1068
static pcibus_t pci_bar_address(PCIDevice *d,
				int reg, uint8_t type, pcibus_t size)
{
    pcibus_t new_addr, last_addr;
    int bar = pci_bar(d, reg);
    uint16_t cmd = pci_get_word(d->config + PCI_COMMAND);
1069 1070 1071 1072
    Object *machine = qdev_get_machine();
    ObjectClass *oc = object_get_class(machine);
    MachineClass *mc = MACHINE_CLASS(oc);
    bool allow_0_address = mc->pci_allow_0_address;
1073 1074 1075 1076 1077 1078 1079

    if (type & PCI_BASE_ADDRESS_SPACE_IO) {
        if (!(cmd & PCI_COMMAND_IO)) {
            return PCI_BAR_UNMAPPED;
        }
        new_addr = pci_get_long(d->config + bar) & ~(size - 1);
        last_addr = new_addr + size - 1;
1080 1081 1082
        /* Check if 32 bit BAR wraps around explicitly.
         * TODO: make priorities correct and remove this work around.
         */
1083 1084
        if (last_addr <= new_addr || last_addr >= UINT32_MAX ||
            (!allow_0_address && new_addr == 0)) {
1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107
            return PCI_BAR_UNMAPPED;
        }
        return new_addr;
    }

    if (!(cmd & PCI_COMMAND_MEMORY)) {
        return PCI_BAR_UNMAPPED;
    }
    if (type & PCI_BASE_ADDRESS_MEM_TYPE_64) {
        new_addr = pci_get_quad(d->config + bar);
    } else {
        new_addr = pci_get_long(d->config + bar);
    }
    /* the ROM slot has a specific enable bit */
    if (reg == PCI_ROM_SLOT && !(new_addr & PCI_ROM_ADDRESS_ENABLE)) {
        return PCI_BAR_UNMAPPED;
    }
    new_addr &= ~(size - 1);
    last_addr = new_addr + size - 1;
    /* NOTE: we do not support wrapping */
    /* XXX: as we cannot support really dynamic
       mappings, we handle specific values as invalid
       mappings. */
1108 1109
    if (last_addr <= new_addr || last_addr == PCI_BAR_UNMAPPED ||
        (!allow_0_address && new_addr == 0)) {
1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127
        return PCI_BAR_UNMAPPED;
    }

    /* Now pcibus_t is 64bit.
     * Check if 32 bit BAR wraps around explicitly.
     * Without this, PC ide doesn't work well.
     * TODO: remove this work around.
     */
    if  (!(type & PCI_BASE_ADDRESS_MEM_TYPE_64) && last_addr >= UINT32_MAX) {
        return PCI_BAR_UNMAPPED;
    }

    /*
     * OS is allowed to set BAR beyond its addressable
     * bits. For example, 32 bit OS can set 64bit bar
     * to >4G. Check it. TODO: we might need to support
     * it in the future for e.g. PAE.
     */
A
Avi Kivity 已提交
1128
    if (last_addr >= HWADDR_MAX) {
1129 1130 1131 1132 1133 1134
        return PCI_BAR_UNMAPPED;
    }

    return new_addr;
}

1135 1136 1137
static void pci_update_mappings(PCIDevice *d)
{
    PCIIORegion *r;
1138
    int i;
1139
    pcibus_t new_addr;
1140

1141
    for(i = 0; i < PCI_NUM_REGIONS; i++) {
1142
        r = &d->io_regions[i];
1143 1144

        /* this region isn't registered */
1145
        if (!r->size)
1146 1147
            continue;

1148
        new_addr = pci_bar_address(d, i, r->type, r->size);
1149 1150

        /* This bar isn't changed */
1151
        if (new_addr == r->addr)
1152 1153 1154 1155
            continue;

        /* now do the real mapping */
        if (r->addr != PCI_BAR_UNMAPPED) {
D
Don Koch 已提交
1156 1157
            trace_pci_update_mappings_del(d, pci_bus_num(d->bus),
                                          PCI_SLOT(d->devfn),
1158
                                          PCI_FUNC(d->devfn),
D
Don Koch 已提交
1159
                                          i, r->addr, r->size);
1160
            memory_region_del_subregion(r->address_space, r->memory);
1161
        }
1162 1163
        r->addr = new_addr;
        if (r->addr != PCI_BAR_UNMAPPED) {
D
Don Koch 已提交
1164 1165
            trace_pci_update_mappings_add(d, pci_bus_num(d->bus),
                                          PCI_SLOT(d->devfn),
1166
                                          PCI_FUNC(d->devfn),
D
Don Koch 已提交
1167
                                          i, r->addr, r->size);
1168 1169
            memory_region_add_subregion_overlap(r->address_space,
                                                r->addr, r->memory, 1);
1170
        }
1171
    }
A
Alex Williamson 已提交
1172 1173

    pci_update_vga(d);
1174 1175
}

1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194
static inline int pci_irq_disabled(PCIDevice *d)
{
    return pci_get_word(d->config + PCI_COMMAND) & PCI_COMMAND_INTX_DISABLE;
}

/* Called after interrupt disabled field update in config space,
 * assert/deassert interrupts if necessary.
 * Gets original interrupt disable bit value (before update). */
static void pci_update_irq_disabled(PCIDevice *d, int was_irq_disabled)
{
    int i, disabled = pci_irq_disabled(d);
    if (disabled == was_irq_disabled)
        return;
    for (i = 0; i < PCI_NUM_PINS; ++i) {
        int state = pci_irq_state(d, i);
        pci_change_irq_level(d, i, disabled ? -state : state);
    }
}

1195
uint32_t pci_default_read_config(PCIDevice *d,
1196
                                 uint32_t address, int len)
B
bellard 已提交
1197
{
1198
    uint32_t val = 0;
J
Jan Kiszka 已提交
1199

1200 1201
    memcpy(&val, d->config + address, len);
    return le32_to_cpu(val);
1202 1203
}

1204
void pci_default_write_config(PCIDevice *d, uint32_t addr, uint32_t val_in, int l)
1205
{
1206
    int i, was_irq_disabled = pci_irq_disabled(d);
1207
    uint32_t val = val_in;
1208

J
Jan Kiszka 已提交
1209
    for (i = 0; i < l; val >>= 8, ++i) {
1210
        uint8_t wmask = d->wmask[addr + i];
1211 1212
        uint8_t w1cmask = d->w1cmask[addr + i];
        assert(!(wmask & w1cmask));
1213
        d->config[addr + i] = (d->config[addr + i] & ~wmask) | (val & wmask);
1214
        d->config[addr + i] &= ~(val & w1cmask); /* W1C: Write 1 to Clear */
1215
    }
I
Isaku Yamahata 已提交
1216
    if (ranges_overlap(addr, l, PCI_BASE_ADDRESS_0, 24) ||
1217 1218
        ranges_overlap(addr, l, PCI_ROM_ADDRESS, 4) ||
        ranges_overlap(addr, l, PCI_ROM_ADDRESS1, 4) ||
I
Isaku Yamahata 已提交
1219
        range_covers_byte(addr, l, PCI_COMMAND))
1220
        pci_update_mappings(d);
1221

A
Avi Kivity 已提交
1222
    if (range_covers_byte(addr, l, PCI_COMMAND)) {
1223
        pci_update_irq_disabled(d, was_irq_disabled);
A
Avi Kivity 已提交
1224 1225 1226 1227
        memory_region_set_enabled(&d->bus_master_enable_region,
                                  pci_get_word(d->config + PCI_COMMAND)
                                    & PCI_COMMAND_MASTER);
    }
1228

1229 1230
    msi_write_config(d, addr, val_in, l);
    msix_write_config(d, addr, val_in, l);
B
bellard 已提交
1231 1232
}

P
pbrook 已提交
1233 1234
/***********************************************************/
/* generic PCI irq support */
1235

P
pbrook 已提交
1236
/* 0 <= irq_num <= 3. level must be 0 or 1 */
1237
static void pci_irq_handler(void *opaque, int irq_num, int level)
B
bellard 已提交
1238
{
1239
    PCIDevice *pci_dev = opaque;
P
pbrook 已提交
1240
    int change;
1241

1242
    change = level - pci_irq_state(pci_dev, irq_num);
P
pbrook 已提交
1243 1244
    if (!change)
        return;
1245

1246
    pci_set_irq_state(pci_dev, irq_num, level);
1247
    pci_update_irq_status(pci_dev);
1248 1249
    if (pci_irq_disabled(pci_dev))
        return;
1250
    pci_change_irq_level(pci_dev, irq_num, change);
B
bellard 已提交
1251 1252
}

1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270
static inline int pci_intx(PCIDevice *pci_dev)
{
    return pci_get_byte(pci_dev->config + PCI_INTERRUPT_PIN) - 1;
}

qemu_irq pci_allocate_irq(PCIDevice *pci_dev)
{
    int intx = pci_intx(pci_dev);

    return qemu_allocate_irq(pci_irq_handler, pci_dev, intx);
}

void pci_set_irq(PCIDevice *pci_dev, int level)
{
    int intx = pci_intx(pci_dev);
    pci_irq_handler(pci_dev, intx, level);
}

1271 1272 1273
/* Special hooks used by device assignment */
void pci_bus_set_route_irq_fn(PCIBus *bus, pci_route_irq_fn route_intx_to_irq)
{
1274
    assert(pci_bus_is_root(bus));
1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286
    bus->route_intx_to_irq = route_intx_to_irq;
}

PCIINTxRoute pci_device_route_intx_to_irq(PCIDevice *dev, int pin)
{
    PCIBus *bus;

    do {
         bus = dev->bus;
         pin = bus->map_irq(dev, pin);
         dev = bus->parent_dev;
    } while (dev);
1287 1288

    if (!bus->route_intx_to_irq) {
1289
        error_report("PCI: Bug - unimplemented PCI INTx routing (%s)",
1290 1291 1292 1293
                     object_get_typename(OBJECT(bus->qbus.parent)));
        return (PCIINTxRoute) { PCI_INTX_DISABLED, -1 };
    }

1294
    return bus->route_intx_to_irq(bus->irq_opaque, pin);
J
Jan Kiszka 已提交
1295 1296
}

1297 1298 1299 1300 1301
bool pci_intx_route_changed(PCIINTxRoute *old, PCIINTxRoute *new)
{
    return old->mode != new->mode || old->irq != new->irq;
}

J
Jan Kiszka 已提交
1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312
void pci_bus_fire_intx_routing_notifier(PCIBus *bus)
{
    PCIDevice *dev;
    PCIBus *sec;
    int i;

    for (i = 0; i < ARRAY_SIZE(bus->devices); ++i) {
        dev = bus->devices[i];
        if (dev && dev->intx_routing_notifier) {
            dev->intx_routing_notifier(dev);
        }
1313 1314 1315 1316
    }

    QLIST_FOREACH(sec, &bus->child, sibling) {
        pci_bus_fire_intx_routing_notifier(sec);
J
Jan Kiszka 已提交
1317 1318 1319 1320 1321 1322 1323
    }
}

void pci_device_set_intx_routing_notifier(PCIDevice *dev,
                                          PCIINTxRoutingNotifier notifier)
{
    dev->intx_routing_notifier = notifier;
B
bellard 已提交
1324 1325
}

1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343
/*
 * PCI-to-PCI bridge specification
 * 9.1: Interrupt routing. Table 9-1
 *
 * the PCI Express Base Specification, Revision 2.1
 * 2.2.8.1: INTx interrutp signaling - Rules
 *          the Implementation Note
 *          Table 2-20
 */
/*
 * 0 <= pin <= 3 0 = INTA, 1 = INTB, 2 = INTC, 3 = INTD
 * 0-origin unlike PCI interrupt pin register.
 */
int pci_swizzle_map_irq_fn(PCIDevice *pci_dev, int pin)
{
    return (pin + PCI_SLOT(pci_dev->devfn)) % PCI_NUM_PINS;
}

P
pbrook 已提交
1344 1345
/***********************************************************/
/* monitor info on PCI */
1346

1347 1348 1349
typedef struct {
    uint16_t class;
    const char *desc;
1350 1351
    const char *fw_name;
    uint16_t fw_ign_bits;
1352 1353
} pci_class_desc;

1354
static const pci_class_desc pci_class_descriptions[] =
1355
{
1356 1357 1358 1359 1360 1361
    { 0x0001, "VGA controller", "display"},
    { 0x0100, "SCSI controller", "scsi"},
    { 0x0101, "IDE controller", "ide"},
    { 0x0102, "Floppy controller", "fdc"},
    { 0x0103, "IPI controller", "ipi"},
    { 0x0104, "RAID controller", "raid"},
T
ths 已提交
1362 1363 1364
    { 0x0106, "SATA controller"},
    { 0x0107, "SAS controller"},
    { 0x0180, "Storage controller"},
1365 1366 1367 1368
    { 0x0200, "Ethernet controller", "ethernet"},
    { 0x0201, "Token Ring controller", "token-ring"},
    { 0x0202, "FDDI controller", "fddi"},
    { 0x0203, "ATM controller", "atm"},
T
ths 已提交
1369
    { 0x0280, "Network controller"},
1370
    { 0x0300, "VGA controller", "display", 0x00ff},
T
ths 已提交
1371 1372 1373
    { 0x0301, "XGA controller"},
    { 0x0302, "3D controller"},
    { 0x0380, "Display controller"},
1374 1375
    { 0x0400, "Video controller", "video"},
    { 0x0401, "Audio controller", "sound"},
T
ths 已提交
1376
    { 0x0402, "Phone"},
1377
    { 0x0403, "Audio controller", "sound"},
T
ths 已提交
1378
    { 0x0480, "Multimedia controller"},
1379 1380
    { 0x0500, "RAM controller", "memory"},
    { 0x0501, "Flash controller", "flash"},
T
ths 已提交
1381
    { 0x0580, "Memory controller"},
1382 1383 1384 1385
    { 0x0600, "Host bridge", "host"},
    { 0x0601, "ISA bridge", "isa"},
    { 0x0602, "EISA bridge", "eisa"},
    { 0x0603, "MC bridge", "mca"},
G
Gerd Hoffmann 已提交
1386
    { 0x0604, "PCI bridge", "pci-bridge"},
1387 1388 1389
    { 0x0605, "PCMCIA bridge", "pcmcia"},
    { 0x0606, "NUBUS bridge", "nubus"},
    { 0x0607, "CARDBUS bridge", "cardbus"},
T
ths 已提交
1390 1391
    { 0x0608, "RACEWAY bridge"},
    { 0x0680, "Bridge"},
1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407
    { 0x0700, "Serial port", "serial"},
    { 0x0701, "Parallel port", "parallel"},
    { 0x0800, "Interrupt controller", "interrupt-controller"},
    { 0x0801, "DMA controller", "dma-controller"},
    { 0x0802, "Timer", "timer"},
    { 0x0803, "RTC", "rtc"},
    { 0x0900, "Keyboard", "keyboard"},
    { 0x0901, "Pen", "pen"},
    { 0x0902, "Mouse", "mouse"},
    { 0x0A00, "Dock station", "dock", 0x00ff},
    { 0x0B00, "i386 cpu", "cpu", 0x00ff},
    { 0x0c00, "Fireware contorller", "fireware"},
    { 0x0c01, "Access bus controller", "access-bus"},
    { 0x0c02, "SSA controller", "ssa"},
    { 0x0c03, "USB controller", "usb"},
    { 0x0c04, "Fibre channel controller", "fibre-channel"},
J
Jan Kiszka 已提交
1408
    { 0x0c05, "SMBus"},
1409 1410 1411
    { 0, NULL}
};

1412
static void pci_for_each_device_under_bus(PCIBus *bus,
1413 1414 1415
                                          void (*fn)(PCIBus *b, PCIDevice *d,
                                                     void *opaque),
                                          void *opaque)
1416
{
1417 1418
    PCIDevice *d;
    int devfn;
1419

1420 1421 1422
    for(devfn = 0; devfn < ARRAY_SIZE(bus->devices); devfn++) {
        d = bus->devices[devfn];
        if (d) {
1423
            fn(bus, d, opaque);
1424 1425 1426 1427 1428
        }
    }
}

void pci_for_each_device(PCIBus *bus, int bus_num,
1429 1430
                         void (*fn)(PCIBus *b, PCIDevice *d, void *opaque),
                         void *opaque)
1431
{
1432
    bus = pci_find_bus_nr(bus, bus_num);
1433 1434

    if (bus) {
1435
        pci_for_each_device_under_bus(bus, fn, opaque);
1436 1437 1438
    }
}

L
Luiz Capitulino 已提交
1439
static const pci_class_desc *get_class_desc(int class)
1440
{
L
Luiz Capitulino 已提交
1441
    const pci_class_desc *desc;
1442

L
Luiz Capitulino 已提交
1443 1444 1445
    desc = pci_class_descriptions;
    while (desc->desc && class != desc->class) {
        desc++;
1446
    }
1447

L
Luiz Capitulino 已提交
1448 1449
    return desc;
}
I
Isaku Yamahata 已提交
1450

L
Luiz Capitulino 已提交
1451
static PciDeviceInfoList *qmp_query_pci_devices(PCIBus *bus, int bus_num);
1452

L
Luiz Capitulino 已提交
1453 1454 1455 1456
static PciMemoryRegionList *qmp_query_pci_regions(const PCIDevice *dev)
{
    PciMemoryRegionList *head = NULL, *cur_item = NULL;
    int i;
1457

L
Luiz Capitulino 已提交
1458 1459 1460 1461 1462 1463
    for (i = 0; i < PCI_NUM_REGIONS; i++) {
        const PCIIORegion *r = &dev->io_regions[i];
        PciMemoryRegionList *region;

        if (!r->size) {
            continue;
P
pbrook 已提交
1464
        }
1465

L
Luiz Capitulino 已提交
1466 1467
        region = g_malloc0(sizeof(*region));
        region->value = g_malloc0(sizeof(*region->value));
1468

L
Luiz Capitulino 已提交
1469 1470 1471 1472 1473 1474 1475 1476
        if (r->type & PCI_BASE_ADDRESS_SPACE_IO) {
            region->value->type = g_strdup("io");
        } else {
            region->value->type = g_strdup("memory");
            region->value->has_prefetch = true;
            region->value->prefetch = !!(r->type & PCI_BASE_ADDRESS_MEM_PREFETCH);
            region->value->has_mem_type_64 = true;
            region->value->mem_type_64 = !!(r->type & PCI_BASE_ADDRESS_MEM_TYPE_64);
1477
        }
1478

L
Luiz Capitulino 已提交
1479 1480 1481
        region->value->bar = i;
        region->value->address = r->addr;
        region->value->size = r->size;
1482

L
Luiz Capitulino 已提交
1483 1484 1485 1486 1487 1488
        /* XXX: waiting for the qapi to support GSList */
        if (!cur_item) {
            head = cur_item = region;
        } else {
            cur_item->next = region;
            cur_item = region;
1489
        }
P
pbrook 已提交
1490
    }
1491

L
Luiz Capitulino 已提交
1492
    return head;
1493 1494
}

L
Luiz Capitulino 已提交
1495 1496
static PciBridgeInfo *qmp_query_pci_bridge(PCIDevice *dev, PCIBus *bus,
                                           int bus_num)
1497
{
L
Luiz Capitulino 已提交
1498
    PciBridgeInfo *info;
1499
    PciMemoryRange *range;
1500

1501
    info = g_new0(PciBridgeInfo, 1);
1502

1503 1504 1505 1506
    info->bus = g_new0(PciBusInfo, 1);
    info->bus->number = dev->config[PCI_PRIMARY_BUS];
    info->bus->secondary = dev->config[PCI_SECONDARY_BUS];
    info->bus->subordinate = dev->config[PCI_SUBORDINATE_BUS];
1507

1508 1509 1510
    range = info->bus->io_range = g_new0(PciMemoryRange, 1);
    range->base = pci_bridge_get_base(dev, PCI_BASE_ADDRESS_SPACE_IO);
    range->limit = pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_SPACE_IO);
1511

1512 1513 1514
    range = info->bus->memory_range = g_new0(PciMemoryRange, 1);
    range->base = pci_bridge_get_base(dev, PCI_BASE_ADDRESS_SPACE_MEMORY);
    range->limit = pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_SPACE_MEMORY);
1515

1516 1517 1518
    range = info->bus->prefetchable_range = g_new0(PciMemoryRange, 1);
    range->base = pci_bridge_get_base(dev, PCI_BASE_ADDRESS_MEM_PREFETCH);
    range->limit = pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_MEM_PREFETCH);
1519

L
Luiz Capitulino 已提交
1520
    if (dev->config[PCI_SECONDARY_BUS] != 0) {
1521
        PCIBus *child_bus = pci_find_bus_nr(bus, dev->config[PCI_SECONDARY_BUS]);
L
Luiz Capitulino 已提交
1522 1523 1524 1525
        if (child_bus) {
            info->has_devices = true;
            info->devices = qmp_query_pci_devices(child_bus, dev->config[PCI_SECONDARY_BUS]);
        }
1526 1527
    }

L
Luiz Capitulino 已提交
1528
    return info;
1529 1530
}

L
Luiz Capitulino 已提交
1531 1532
static PciDeviceInfo *qmp_query_pci_device(PCIDevice *dev, PCIBus *bus,
                                           int bus_num)
1533
{
L
Luiz Capitulino 已提交
1534 1535
    const pci_class_desc *desc;
    PciDeviceInfo *info;
1536
    uint8_t type;
L
Luiz Capitulino 已提交
1537
    int class;
1538

1539
    info = g_new0(PciDeviceInfo, 1);
L
Luiz Capitulino 已提交
1540 1541 1542 1543
    info->bus = bus_num;
    info->slot = PCI_SLOT(dev->devfn);
    info->function = PCI_FUNC(dev->devfn);

1544
    info->class_info = g_new0(PciDeviceClass, 1);
L
Luiz Capitulino 已提交
1545
    class = pci_get_word(dev->config + PCI_CLASS_DEVICE);
1546
    info->class_info->q_class = class;
L
Luiz Capitulino 已提交
1547 1548
    desc = get_class_desc(class);
    if (desc->desc) {
1549 1550
        info->class_info->has_desc = true;
        info->class_info->desc = g_strdup(desc->desc);
L
Luiz Capitulino 已提交
1551 1552
    }

1553 1554 1555
    info->id = g_new0(PciDeviceId, 1);
    info->id->vendor = pci_get_word(dev->config + PCI_VENDOR_ID);
    info->id->device = pci_get_word(dev->config + PCI_DEVICE_ID);
L
Luiz Capitulino 已提交
1556 1557
    info->regions = qmp_query_pci_regions(dev);
    info->qdev_id = g_strdup(dev->qdev.id ? dev->qdev.id : "");
1558 1559

    if (dev->config[PCI_INTERRUPT_PIN] != 0) {
L
Luiz Capitulino 已提交
1560 1561
        info->has_irq = true;
        info->irq = dev->config[PCI_INTERRUPT_LINE];
1562 1563
    }

1564 1565
    type = dev->config[PCI_HEADER_TYPE] & ~PCI_HEADER_TYPE_MULTI_FUNCTION;
    if (type == PCI_HEADER_TYPE_BRIDGE) {
L
Luiz Capitulino 已提交
1566 1567
        info->has_pci_bridge = true;
        info->pci_bridge = qmp_query_pci_bridge(dev, bus, bus_num);
1568 1569
    }

L
Luiz Capitulino 已提交
1570
    return info;
1571 1572
}

L
Luiz Capitulino 已提交
1573
static PciDeviceInfoList *qmp_query_pci_devices(PCIBus *bus, int bus_num)
1574
{
L
Luiz Capitulino 已提交
1575
    PciDeviceInfoList *info, *head = NULL, *cur_item = NULL;
1576
    PCIDevice *dev;
L
Luiz Capitulino 已提交
1577
    int devfn;
1578 1579 1580 1581

    for (devfn = 0; devfn < ARRAY_SIZE(bus->devices); devfn++) {
        dev = bus->devices[devfn];
        if (dev) {
L
Luiz Capitulino 已提交
1582 1583 1584 1585 1586 1587 1588 1589 1590 1591
            info = g_malloc0(sizeof(*info));
            info->value = qmp_query_pci_device(dev, bus, bus_num);

            /* XXX: waiting for the qapi to support GSList */
            if (!cur_item) {
                head = cur_item = info;
            } else {
                cur_item->next = info;
                cur_item = info;
            }
1592
        }
1593
    }
1594

L
Luiz Capitulino 已提交
1595
    return head;
1596 1597
}

L
Luiz Capitulino 已提交
1598
static PciInfo *qmp_query_pci_bus(PCIBus *bus, int bus_num)
1599
{
L
Luiz Capitulino 已提交
1600 1601
    PciInfo *info = NULL;

1602
    bus = pci_find_bus_nr(bus, bus_num);
P
pbrook 已提交
1603
    if (bus) {
L
Luiz Capitulino 已提交
1604 1605 1606
        info = g_malloc0(sizeof(*info));
        info->bus = bus_num;
        info->devices = qmp_query_pci_devices(bus, bus_num);
B
bellard 已提交
1607
    }
1608

L
Luiz Capitulino 已提交
1609
    return info;
B
bellard 已提交
1610 1611
}

L
Luiz Capitulino 已提交
1612
PciInfoList *qmp_query_pci(Error **errp)
B
bellard 已提交
1613
{
L
Luiz Capitulino 已提交
1614
    PciInfoList *info, *head = NULL, *cur_item = NULL;
1615
    PCIHostState *host_bridge;
1616

1617
    QLIST_FOREACH(host_bridge, &pci_host_bridges, next) {
L
Luiz Capitulino 已提交
1618
        info = g_malloc0(sizeof(*info));
1619 1620
        info->value = qmp_query_pci_bus(host_bridge->bus,
                                        pci_bus_num(host_bridge->bus));
L
Luiz Capitulino 已提交
1621 1622 1623 1624 1625 1626 1627

        /* XXX: waiting for the qapi to support GSList */
        if (!cur_item) {
            head = cur_item = info;
        } else {
            cur_item->next = info;
            cur_item = info;
1628
        }
1629
    }
1630

L
Luiz Capitulino 已提交
1631
    return head;
B
bellard 已提交
1632
}
1633

1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645
static const char * const pci_nic_models[] = {
    "ne2k_pci",
    "i82551",
    "i82557b",
    "i82559er",
    "rtl8139",
    "e1000",
    "pcnet",
    "virtio",
    NULL
};

P
Paul Brook 已提交
1646 1647 1648 1649 1650 1651 1652 1653
static const char * const pci_nic_names[] = {
    "ne2k_pci",
    "i82551",
    "i82557b",
    "i82559er",
    "rtl8139",
    "e1000",
    "pcnet",
P
Paul Brook 已提交
1654
    "virtio-net-pci",
1655 1656 1657
    NULL
};

1658
/* Initialize a PCI NIC.  */
1659
PCIDevice *pci_nic_init_nofail(NICInfo *nd, PCIBus *rootbus,
1660
                               const char *default_model,
1661
                               const char *default_devaddr)
1662
{
1663
    const char *devaddr = nd->devaddr ? nd->devaddr : default_devaddr;
1664
    Error *err = NULL;
1665
    PCIBus *bus;
1666
    PCIDevice *pci_dev;
P
Paul Brook 已提交
1667
    DeviceState *dev;
1668
    int devfn;
1669 1670
    int i;

1671 1672 1673 1674
    if (qemu_show_nic_models(nd->model, pci_nic_models)) {
        exit(0);
    }

1675
    i = qemu_find_nic_model(nd, pci_nic_models, default_model);
1676 1677 1678
    if (i < 0) {
        exit(1);
    }
1679

1680
    bus = pci_get_bus_devfn(&devfn, rootbus, devaddr);
1681
    if (!bus) {
1682 1683
        error_report("Invalid PCI device address %s for device %s",
                     devaddr, pci_nic_names[i]);
1684
        exit(1);
1685 1686
    }

1687
    pci_dev = pci_create(bus, devfn, pci_nic_names[i]);
1688
    dev = &pci_dev->qdev;
G
Gerd Hoffmann 已提交
1689
    qdev_set_nic_properties(dev, nd);
1690 1691 1692

    object_property_set_bool(OBJECT(dev), true, "realized", &err);
    if (err) {
1693
        error_report_err(err);
1694
        object_unparent(OBJECT(dev));
1695
        exit(1);
1696
    }
1697 1698

    return pci_dev;
1699 1700
}

1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711
PCIDevice *pci_vga_init(PCIBus *bus)
{
    switch (vga_interface_type) {
    case VGA_CIRRUS:
        return pci_create_simple(bus, -1, "cirrus-vga");
    case VGA_QXL:
        return pci_create_simple(bus, -1, "qxl-vga");
    case VGA_STD:
        return pci_create_simple(bus, -1, "VGA");
    case VGA_VMWARE:
        return pci_create_simple(bus, -1, "vmware-svga");
1712 1713
    case VGA_VIRTIO:
        return pci_create_simple(bus, -1, "virtio-vga");
1714 1715 1716 1717 1718 1719 1720
    case VGA_NONE:
    default: /* Other non-PCI types. Checking for unsupported types is already
                done in vl.c. */
        return NULL;
    }
}

1721 1722 1723 1724 1725 1726
/* Whether a given bus number is in range of the secondary
 * bus of the given bridge device. */
static bool pci_secondary_bus_in_range(PCIDevice *dev, int bus_num)
{
    return !(pci_get_word(dev->config + PCI_BRIDGE_CONTROL) &
             PCI_BRIDGE_CTL_BUS_RESET) /* Don't walk the bus if it's reset. */ &&
1727
        dev->config[PCI_SECONDARY_BUS] <= bus_num &&
1728 1729 1730
        bus_num <= dev->config[PCI_SUBORDINATE_BUS];
}

1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748
/* Whether a given bus number is in a range of a root bus */
static bool pci_root_bus_in_range(PCIBus *bus, int bus_num)
{
    int i;

    for (i = 0; i < ARRAY_SIZE(bus->devices); ++i) {
        PCIDevice *dev = bus->devices[i];

        if (dev && PCI_DEVICE_GET_CLASS(dev)->is_bridge) {
            if (pci_secondary_bus_in_range(dev, bus_num)) {
                return true;
            }
        }
    }

    return false;
}

1749
static PCIBus *pci_find_bus_nr(PCIBus *bus, int bus_num)
1750
{
I
Isaku Yamahata 已提交
1751
    PCIBus *sec;
1752

I
Isaku Yamahata 已提交
1753
    if (!bus) {
1754
        return NULL;
I
Isaku Yamahata 已提交
1755
    }
1756

1757 1758 1759 1760
    if (pci_bus_num(bus) == bus_num) {
        return bus;
    }

1761
    /* Consider all bus numbers in range for the host pci bridge. */
1762
    if (!pci_bus_is_root(bus) &&
1763 1764 1765 1766
        !pci_secondary_bus_in_range(bus->parent_dev, bus_num)) {
        return NULL;
    }

1767
    /* try child bus */
1768 1769
    for (; bus; bus = sec) {
        QLIST_FOREACH(sec, &bus->child, sibling) {
1770
            if (pci_bus_num(sec) == bus_num) {
1771 1772
                return sec;
            }
1773 1774 1775 1776 1777 1778 1779 1780 1781
            /* PXB buses assumed to be children of bus 0 */
            if (pci_bus_is_root(sec)) {
                if (pci_root_bus_in_range(sec, bus_num)) {
                    break;
                }
            } else {
                if (pci_secondary_bus_in_range(sec->parent_dev, bus_num)) {
                    break;
                }
B
Blue Swirl 已提交
1782
            }
1783 1784 1785 1786
        }
    }

    return NULL;
1787 1788
}

1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816
void pci_for_each_bus_depth_first(PCIBus *bus,
                                  void *(*begin)(PCIBus *bus, void *parent_state),
                                  void (*end)(PCIBus *bus, void *state),
                                  void *parent_state)
{
    PCIBus *sec;
    void *state;

    if (!bus) {
        return;
    }

    if (begin) {
        state = begin(bus, parent_state);
    } else {
        state = parent_state;
    }

    QLIST_FOREACH(sec, &bus->child, sibling) {
        pci_for_each_bus_depth_first(sec, begin, end, state);
    }

    if (end) {
        end(bus, state);
    }
}


1817
PCIDevice *pci_find_device(PCIBus *bus, int bus_num, uint8_t devfn)
1818
{
1819
    bus = pci_find_bus_nr(bus, bus_num);
1820 1821 1822 1823

    if (!bus)
        return NULL;

1824
    return bus->devices[devfn];
1825 1826
}

M
Markus Armbruster 已提交
1827
static void pci_qdev_realize(DeviceState *qdev, Error **errp)
P
Paul Brook 已提交
1828 1829
{
    PCIDevice *pci_dev = (PCIDevice *)qdev;
1830
    PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(pci_dev);
M
Markus Armbruster 已提交
1831
    Error *local_err = NULL;
P
Paul Brook 已提交
1832
    PCIBus *bus;
1833
    bool is_default_rom;
P
Paul Brook 已提交
1834

I
Isaku Yamahata 已提交
1835
    /* initialize cap_present for pci_is_express() and pci_config_size() */
1836
    if (pc->is_express) {
I
Isaku Yamahata 已提交
1837 1838 1839
        pci_dev->cap_present |= QEMU_PCI_CAP_EXPRESS;
    }

A
Andreas Färber 已提交
1840
    bus = PCI_BUS(qdev_get_parent_bus(qdev));
A
Anthony Liguori 已提交
1841 1842
    pci_dev = do_pci_register_device(pci_dev, bus,
                                     object_get_typename(OBJECT(qdev)),
M
Markus Armbruster 已提交
1843
                                     pci_dev->devfn, errp);
1844
    if (pci_dev == NULL)
M
Markus Armbruster 已提交
1845
        return;
1846

1847 1848 1849 1850
    if (pc->realize) {
        pc->realize(pci_dev, &local_err);
        if (local_err) {
            error_propagate(errp, local_err);
1851
            do_pci_unregister_device(pci_dev);
M
Markus Armbruster 已提交
1852
            return;
1853
        }
1854
    }
1855 1856

    /* rom loading */
1857
    is_default_rom = false;
1858 1859
    if (pci_dev->romfile == NULL && pc->romfile != NULL) {
        pci_dev->romfile = g_strdup(pc->romfile);
1860 1861
        is_default_rom = true;
    }
1862

M
Markus Armbruster 已提交
1863 1864 1865 1866 1867
    pci_add_option_rom(pci_dev, is_default_rom, &local_err);
    if (local_err) {
        error_propagate(errp, local_err);
        pci_qdev_unrealize(DEVICE(pci_dev), NULL);
        return;
1868
    }
G
Gerd Hoffmann 已提交
1869 1870
}

1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882
static void pci_default_realize(PCIDevice *dev, Error **errp)
{
    PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);

    if (pc->init) {
        if (pc->init(dev) < 0) {
            error_setg(errp, "Device initialization failed");
            return;
        }
    }
}

1883 1884
PCIDevice *pci_create_multifunction(PCIBus *bus, int devfn, bool multifunction,
                                    const char *name)
P
Paul Brook 已提交
1885 1886 1887
{
    DeviceState *dev;

P
Paul Brook 已提交
1888
    dev = qdev_create(&bus->qbus, name);
1889
    qdev_prop_set_int32(dev, "addr", devfn);
1890
    qdev_prop_set_bit(dev, "multifunction", multifunction);
1891
    return PCI_DEVICE(dev);
1892
}
P
Paul Brook 已提交
1893

1894 1895 1896
PCIDevice *pci_create_simple_multifunction(PCIBus *bus, int devfn,
                                           bool multifunction,
                                           const char *name)
1897
{
1898
    PCIDevice *dev = pci_create_multifunction(bus, devfn, multifunction, name);
M
Markus Armbruster 已提交
1899
    qdev_init_nofail(&dev->qdev);
1900
    return dev;
P
Paul Brook 已提交
1901
}
1902

1903 1904 1905 1906 1907 1908 1909 1910 1911 1912
PCIDevice *pci_create(PCIBus *bus, int devfn, const char *name)
{
    return pci_create_multifunction(bus, devfn, false, name);
}

PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name)
{
    return pci_create_simple_multifunction(bus, devfn, false, name);
}

1913
static uint8_t pci_find_space(PCIDevice *pdev, uint8_t size)
1914 1915 1916
{
    int offset = PCI_CONFIG_HEADER_SIZE;
    int i;
1917
    for (i = PCI_CONFIG_HEADER_SIZE; i < PCI_CONFIG_SPACE_SIZE; ++i) {
1918 1919 1920 1921
        if (pdev->used[i])
            offset = i + 1;
        else if (i - offset + 1 == size)
            return offset;
1922
    }
1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943
    return 0;
}

static uint8_t pci_find_capability_list(PCIDevice *pdev, uint8_t cap_id,
                                        uint8_t *prev_p)
{
    uint8_t next, prev;

    if (!(pdev->config[PCI_STATUS] & PCI_STATUS_CAP_LIST))
        return 0;

    for (prev = PCI_CAPABILITY_LIST; (next = pdev->config[prev]);
         prev = next + PCI_CAP_LIST_NEXT)
        if (pdev->config[next + PCI_CAP_LIST_ID] == cap_id)
            break;

    if (prev_p)
        *prev_p = prev;
    return next;
}

1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962
static uint8_t pci_find_capability_at_offset(PCIDevice *pdev, uint8_t offset)
{
    uint8_t next, prev, found = 0;

    if (!(pdev->used[offset])) {
        return 0;
    }

    assert(pdev->config[PCI_STATUS] & PCI_STATUS_CAP_LIST);

    for (prev = PCI_CAPABILITY_LIST; (next = pdev->config[prev]);
         prev = next + PCI_CAP_LIST_NEXT) {
        if (next <= offset && next > found) {
            found = next;
        }
    }
    return found;
}

1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018
/* Patch the PCI vendor and device ids in a PCI rom image if necessary.
   This is needed for an option rom which is used for more than one device. */
static void pci_patch_ids(PCIDevice *pdev, uint8_t *ptr, int size)
{
    uint16_t vendor_id;
    uint16_t device_id;
    uint16_t rom_vendor_id;
    uint16_t rom_device_id;
    uint16_t rom_magic;
    uint16_t pcir_offset;
    uint8_t checksum;

    /* Words in rom data are little endian (like in PCI configuration),
       so they can be read / written with pci_get_word / pci_set_word. */

    /* Only a valid rom will be patched. */
    rom_magic = pci_get_word(ptr);
    if (rom_magic != 0xaa55) {
        PCI_DPRINTF("Bad ROM magic %04x\n", rom_magic);
        return;
    }
    pcir_offset = pci_get_word(ptr + 0x18);
    if (pcir_offset + 8 >= size || memcmp(ptr + pcir_offset, "PCIR", 4)) {
        PCI_DPRINTF("Bad PCIR offset 0x%x or signature\n", pcir_offset);
        return;
    }

    vendor_id = pci_get_word(pdev->config + PCI_VENDOR_ID);
    device_id = pci_get_word(pdev->config + PCI_DEVICE_ID);
    rom_vendor_id = pci_get_word(ptr + pcir_offset + 4);
    rom_device_id = pci_get_word(ptr + pcir_offset + 6);

    PCI_DPRINTF("%s: ROM id %04x%04x / PCI id %04x%04x\n", pdev->romfile,
                vendor_id, device_id, rom_vendor_id, rom_device_id);

    checksum = ptr[6];

    if (vendor_id != rom_vendor_id) {
        /* Patch vendor id and checksum (at offset 6 for etherboot roms). */
        checksum += (uint8_t)rom_vendor_id + (uint8_t)(rom_vendor_id >> 8);
        checksum -= (uint8_t)vendor_id + (uint8_t)(vendor_id >> 8);
        PCI_DPRINTF("ROM checksum %02x / %02x\n", ptr[6], checksum);
        ptr[6] = checksum;
        pci_set_word(ptr + pcir_offset + 4, vendor_id);
    }

    if (device_id != rom_device_id) {
        /* Patch device id and checksum (at offset 6 for etherboot roms). */
        checksum += (uint8_t)rom_device_id + (uint8_t)(rom_device_id >> 8);
        checksum -= (uint8_t)device_id + (uint8_t)(device_id >> 8);
        PCI_DPRINTF("ROM checksum %02x / %02x\n", ptr[6], checksum);
        ptr[6] = checksum;
        pci_set_word(ptr + pcir_offset + 6, device_id);
    }
}

2019
/* Add an option rom for the device */
M
Markus Armbruster 已提交
2020 2021
static void pci_add_option_rom(PCIDevice *pdev, bool is_default_rom,
                               Error **errp)
2022 2023 2024 2025
{
    int size;
    char *path;
    void *ptr;
2026
    char name[32];
A
Anthony Liguori 已提交
2027
    const VMStateDescription *vmsd;
2028

2029
    if (!pdev->romfile)
M
Markus Armbruster 已提交
2030
        return;
2031
    if (strlen(pdev->romfile) == 0)
M
Markus Armbruster 已提交
2032
        return;
2033

2034 2035 2036 2037 2038 2039
    if (!pdev->rom_bar) {
        /*
         * Load rom via fw_cfg instead of creating a rom bar,
         * for 0.11 compatibility.
         */
        int class = pci_get_word(pdev->config + PCI_CLASS_DEVICE);
2040 2041 2042 2043 2044 2045

        /*
         * Hot-plugged devices can't use the option ROM
         * if the rom bar is disabled.
         */
        if (DEVICE(pdev)->hotplugged) {
M
Markus Armbruster 已提交
2046 2047 2048
            error_setg(errp, "Hot-plugged device without ROM bar"
                       " can't have an option ROM");
            return;
2049 2050
        }

2051 2052 2053
        if (class == 0x0300) {
            rom_add_vga(pdev->romfile);
        } else {
G
Gleb Natapov 已提交
2054
            rom_add_option(pdev->romfile, -1);
2055
        }
M
Markus Armbruster 已提交
2056
        return;
2057 2058
    }

2059
    path = qemu_find_file(QEMU_FILE_TYPE_BIOS, pdev->romfile);
2060
    if (path == NULL) {
2061
        path = g_strdup(pdev->romfile);
2062 2063 2064
    }

    size = get_image_size(path);
2065
    if (size < 0) {
M
Markus Armbruster 已提交
2066
        error_setg(errp, "failed to find romfile \"%s\"", pdev->romfile);
S
Stefan Hajnoczi 已提交
2067
        g_free(path);
M
Markus Armbruster 已提交
2068
        return;
S
Stefan Hajnoczi 已提交
2069
    } else if (size == 0) {
M
Markus Armbruster 已提交
2070
        error_setg(errp, "romfile \"%s\" is empty", pdev->romfile);
2071
        g_free(path);
M
Markus Armbruster 已提交
2072
        return;
2073
    }
2074
    size = pow2ceil(size);
2075

A
Anthony Liguori 已提交
2076 2077 2078 2079 2080
    vmsd = qdev_get_vmsd(DEVICE(pdev));

    if (vmsd) {
        snprintf(name, sizeof(name), "%s.rom", vmsd->name);
    } else {
2081
        snprintf(name, sizeof(name), "%s.rom", object_get_typename(OBJECT(pdev)));
A
Anthony Liguori 已提交
2082
    }
A
Avi Kivity 已提交
2083
    pdev->has_rom = true;
2084
    memory_region_init_ram(&pdev->rom, OBJECT(pdev), name, size, &error_fatal);
2085
    vmstate_register_ram(&pdev->rom, &pdev->qdev);
A
Avi Kivity 已提交
2086
    ptr = memory_region_get_ram_ptr(&pdev->rom);
2087
    load_image(path, ptr);
2088
    g_free(path);
2089

2090 2091 2092 2093 2094
    if (is_default_rom) {
        /* Only the default rom images will be patched (if needed). */
        pci_patch_ids(pdev, ptr, size);
    }

2095
    pci_register_bar(pdev, PCI_ROM_SLOT, 0, &pdev->rom);
2096 2097
}

2098 2099
static void pci_del_option_rom(PCIDevice *pdev)
{
A
Avi Kivity 已提交
2100
    if (!pdev->has_rom)
2101 2102
        return;

2103
    vmstate_unregister_ram(&pdev->rom, &pdev->qdev);
A
Avi Kivity 已提交
2104
    pdev->has_rom = false;
2105 2106
}

2107 2108 2109
/*
 * if offset = 0,
 * Find and reserve space and add capability to the linked list
2110 2111
 * in pci config space
 */
2112 2113
int pci_add_capability(PCIDevice *pdev, uint8_t cap_id,
                       uint8_t offset, uint8_t size)
2114 2115 2116 2117 2118 2119 2120
{
    int ret;
    Error *local_err = NULL;

    ret = pci_add_capability2(pdev, cap_id, offset, size, &local_err);
    if (local_err) {
        assert(ret < 0);
2121
        error_report_err(local_err);
2122 2123 2124 2125 2126 2127 2128 2129 2130 2131
    } else {
        /* success implies a positive offset in config space */
        assert(ret > 0);
    }
    return ret;
}

int pci_add_capability2(PCIDevice *pdev, uint8_t cap_id,
                       uint8_t offset, uint8_t size,
                       Error **errp)
2132
{
2133
    uint8_t *config;
2134 2135
    int i, overlapping_cap;

2136 2137 2138
    if (!offset) {
        offset = pci_find_space(pdev, size);
        if (!offset) {
2139
            error_setg(errp, "out of PCI config space");
2140 2141
            return -ENOSPC;
        }
2142 2143 2144 2145 2146 2147 2148 2149
    } else {
        /* Verify that capabilities don't overlap.  Note: device assignment
         * depends on this check to verify that the device is not broken.
         * Should never trigger for emulated devices, but it's helpful
         * for debugging these. */
        for (i = offset; i < offset + size; i++) {
            overlapping_cap = pci_find_capability_at_offset(pdev, i);
            if (overlapping_cap) {
2150 2151 2152 2153 2154 2155
                error_setg(errp, "%s:%02x:%02x.%x "
                           "Attempt to add PCI capability %x at offset "
                           "%x overlaps existing capability %x at offset %x",
                           pci_root_bus_path(pdev), pci_bus_num(pdev->bus),
                           PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn),
                           cap_id, offset, overlapping_cap, i);
2156 2157 2158
                return -EINVAL;
            }
        }
2159 2160 2161
    }

    config = pdev->config + offset;
2162 2163 2164 2165
    config[PCI_CAP_LIST_ID] = cap_id;
    config[PCI_CAP_LIST_NEXT] = pdev->config[PCI_CAPABILITY_LIST];
    pdev->config[PCI_CAPABILITY_LIST] = offset;
    pdev->config[PCI_STATUS] |= PCI_STATUS_CAP_LIST;
2166
    memset(pdev->used + offset, 0xFF, QEMU_ALIGN_UP(size, 4));
2167 2168
    /* Make capability read-only by default */
    memset(pdev->wmask + offset, 0, size);
2169 2170
    /* Check capability by default */
    memset(pdev->cmask + offset, 0xFF, size);
2171 2172 2173 2174 2175 2176 2177 2178 2179 2180
    return offset;
}

/* Unlink capability from the pci config space. */
void pci_del_capability(PCIDevice *pdev, uint8_t cap_id, uint8_t size)
{
    uint8_t prev, offset = pci_find_capability_list(pdev, cap_id, &prev);
    if (!offset)
        return;
    pdev->config[prev] = pdev->config[offset + PCI_CAP_LIST_NEXT];
S
Stefan Weil 已提交
2181
    /* Make capability writable again */
2182
    memset(pdev->wmask + offset, 0xff, size);
2183
    memset(pdev->w1cmask + offset, 0, size);
2184 2185
    /* Clear cmask as device-specific registers can't be checked */
    memset(pdev->cmask + offset, 0, size);
2186
    memset(pdev->used + offset, 0, QEMU_ALIGN_UP(size, 4));
2187 2188 2189 2190 2191 2192 2193 2194 2195

    if (!pdev->config[PCI_CAPABILITY_LIST])
        pdev->config[PCI_STATUS] &= ~PCI_STATUS_CAP_LIST;
}

uint8_t pci_find_capability(PCIDevice *pdev, uint8_t cap_id)
{
    return pci_find_capability_list(pdev, cap_id, NULL);
}
2196 2197 2198 2199 2200 2201 2202 2203 2204

static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent)
{
    PCIDevice *d = (PCIDevice *)dev;
    const pci_class_desc *desc;
    char ctxt[64];
    PCIIORegion *r;
    int i, class;

2205
    class = pci_get_word(d->config + PCI_CLASS_DEVICE);
2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216
    desc = pci_class_descriptions;
    while (desc->desc && class != desc->class)
        desc++;
    if (desc->desc) {
        snprintf(ctxt, sizeof(ctxt), "%s", desc->desc);
    } else {
        snprintf(ctxt, sizeof(ctxt), "Class %04x", class);
    }

    monitor_printf(mon, "%*sclass %s, addr %02x:%02x.%x, "
                   "pci id %04x:%04x (sub %04x:%04x)\n",
2217
                   indent, "", ctxt, pci_bus_num(d->bus),
2218
                   PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
2219 2220 2221 2222
                   pci_get_word(d->config + PCI_VENDOR_ID),
                   pci_get_word(d->config + PCI_DEVICE_ID),
                   pci_get_word(d->config + PCI_SUBSYSTEM_VENDOR_ID),
                   pci_get_word(d->config + PCI_SUBSYSTEM_ID));
2223 2224 2225 2226
    for (i = 0; i < PCI_NUM_REGIONS; i++) {
        r = &d->io_regions[i];
        if (!r->size)
            continue;
2227 2228 2229
        monitor_printf(mon, "%*sbar %d: %s at 0x%"FMT_PCIBUS
                       " [0x%"FMT_PCIBUS"]\n",
                       indent, "",
2230
                       i, r->type & PCI_BASE_ADDRESS_SPACE_IO ? "i/o" : "mem",
2231 2232 2233
                       r->addr, r->addr + r->size - 1);
    }
}
G
Gerd Hoffmann 已提交
2234

2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273
static char *pci_dev_fw_name(DeviceState *dev, char *buf, int len)
{
    PCIDevice *d = (PCIDevice *)dev;
    const char *name = NULL;
    const pci_class_desc *desc =  pci_class_descriptions;
    int class = pci_get_word(d->config + PCI_CLASS_DEVICE);

    while (desc->desc &&
          (class & ~desc->fw_ign_bits) !=
          (desc->class & ~desc->fw_ign_bits)) {
        desc++;
    }

    if (desc->desc) {
        name = desc->fw_name;
    }

    if (name) {
        pstrcpy(buf, len, name);
    } else {
        snprintf(buf, len, "pci%04x,%04x",
                 pci_get_word(d->config + PCI_VENDOR_ID),
                 pci_get_word(d->config + PCI_DEVICE_ID));
    }

    return buf;
}

static char *pcibus_get_fw_dev_path(DeviceState *dev)
{
    PCIDevice *d = (PCIDevice *)dev;
    char path[50], name[33];
    int off;

    off = snprintf(path, sizeof(path), "%s@%x",
                   pci_dev_fw_name(dev, name, sizeof name),
                   PCI_SLOT(d->devfn));
    if (PCI_FUNC(d->devfn))
        snprintf(path + off, sizeof(path) + off, ",%x", PCI_FUNC(d->devfn));
2274
    return g_strdup(path);
2275 2276
}

2277 2278
static char *pcibus_get_dev_path(DeviceState *dev)
{
2279 2280 2281 2282 2283 2284 2285 2286
    PCIDevice *d = container_of(dev, PCIDevice, qdev);
    PCIDevice *t;
    int slot_depth;
    /* Path format: Domain:00:Slot.Function:Slot.Function....:Slot.Function.
     * 00 is added here to make this format compatible with
     * domain:Bus:Slot.Func for systems without nested PCI bridges.
     * Slot.Function list specifies the slot and function numbers for all
     * devices on the path from root to the specific device. */
2287 2288
    const char *root_bus_path;
    int root_bus_len;
M
Michael S. Tsirkin 已提交
2289 2290
    char slot[] = ":SS.F";
    int slot_len = sizeof slot - 1 /* For '\0' */;
2291 2292
    int path_len;
    char *path, *p;
M
Michael S. Tsirkin 已提交
2293
    int s;
2294

2295 2296 2297
    root_bus_path = pci_root_bus_path(d);
    root_bus_len = strlen(root_bus_path);

2298 2299 2300 2301 2302 2303
    /* Calculate # of slots on path between device and root. */;
    slot_depth = 0;
    for (t = d; t; t = t->bus->parent_dev) {
        ++slot_depth;
    }

2304
    path_len = root_bus_len + slot_len * slot_depth;
2305 2306

    /* Allocate memory, fill in the terminating null byte. */
2307
    path = g_malloc(path_len + 1 /* For '\0' */);
2308 2309
    path[path_len] = '\0';

2310
    memcpy(path, root_bus_path, root_bus_len);
2311 2312 2313 2314 2315 2316

    /* Fill in slot numbers. We walk up from device to root, so need to print
     * them in the reverse order, last to first. */
    p = path + path_len;
    for (t = d; t; t = t->bus->parent_dev) {
        p -= slot_len;
M
Michael S. Tsirkin 已提交
2317
        s = snprintf(slot, sizeof slot, ":%02x.%x",
2318
                     PCI_SLOT(t->devfn), PCI_FUNC(t->devfn));
M
Michael S. Tsirkin 已提交
2319 2320
        assert(s == slot_len);
        memcpy(p, slot, slot_len);
2321 2322 2323
    }

    return path;
2324 2325
}

2326 2327 2328 2329 2330 2331 2332 2333 2334
static int pci_qdev_find_recursive(PCIBus *bus,
                                   const char *id, PCIDevice **pdev)
{
    DeviceState *qdev = qdev_find_recursive(&bus->qbus, id);
    if (!qdev) {
        return -ENODEV;
    }

    /* roughly check if given qdev is pci device */
A
Anthony Liguori 已提交
2335
    if (object_dynamic_cast(OBJECT(qdev), TYPE_PCI_DEVICE)) {
2336
        *pdev = PCI_DEVICE(qdev);
2337 2338 2339 2340 2341 2342 2343
        return 0;
    }
    return -EINVAL;
}

int pci_qdev_find_device(const char *id, PCIDevice **pdev)
{
2344
    PCIHostState *host_bridge;
2345 2346
    int rc = -ENODEV;

2347 2348
    QLIST_FOREACH(host_bridge, &pci_host_bridges, next) {
        int tmp = pci_qdev_find_recursive(host_bridge->bus, id, pdev);
2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359
        if (!tmp) {
            rc = 0;
            break;
        }
        if (tmp != -ENODEV) {
            rc = tmp;
        }
    }

    return rc;
}
A
Avi Kivity 已提交
2360 2361 2362 2363 2364

MemoryRegion *pci_address_space(PCIDevice *dev)
{
    return dev->bus->address_space_mem;
}
2365 2366 2367 2368 2369

MemoryRegion *pci_address_space_io(PCIDevice *dev)
{
    return dev->bus->address_space_io;
}
2370

2371 2372 2373
static void pci_device_class_init(ObjectClass *klass, void *data)
{
    DeviceClass *k = DEVICE_CLASS(klass);
2374 2375
    PCIDeviceClass *pc = PCI_DEVICE_CLASS(klass);

M
Markus Armbruster 已提交
2376 2377
    k->realize = pci_qdev_realize;
    k->unrealize = pci_qdev_unrealize;
2378
    k->bus_type = TYPE_PCI_BUS;
2379
    k->props = pci_props;
2380
    pc->realize = pci_default_realize;
2381 2382
}

2383 2384 2385
AddressSpace *pci_device_iommu_address_space(PCIDevice *dev)
{
    PCIBus *bus = PCI_BUS(dev->bus);
2386
    PCIBus *iommu_bus = bus;
2387

2388 2389
    while(iommu_bus && !iommu_bus->iommu_fn && iommu_bus->parent_dev) {
        iommu_bus = PCI_BUS(iommu_bus->parent_dev->bus);
2390
    }
2391 2392
    if (iommu_bus && iommu_bus->iommu_fn) {
        return iommu_bus->iommu_fn(bus, iommu_bus->iommu_opaque, dev->devfn);
2393 2394 2395 2396
    }
    return &address_space_memory;
}

2397
void pci_setup_iommu(PCIBus *bus, PCIIOMMUFunc fn, void *opaque)
2398
{
2399 2400
    bus->iommu_fn = fn;
    bus->iommu_opaque = opaque;
2401 2402
}

2403 2404 2405 2406 2407
static void pci_dev_get_w64(PCIBus *b, PCIDevice *dev, void *opaque)
{
    Range *range = opaque;
    PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
    uint16_t cmd = pci_get_word(dev->config + PCI_COMMAND);
2408
    int i;
2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426

    if (!(cmd & PCI_COMMAND_MEMORY)) {
        return;
    }

    if (pc->is_bridge) {
        pcibus_t base = pci_bridge_get_base(dev, PCI_BASE_ADDRESS_MEM_PREFETCH);
        pcibus_t limit = pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_MEM_PREFETCH);

        base = MAX(base, 0x1ULL << 32);

        if (limit >= base) {
            Range pref_range;
            pref_range.begin = base;
            pref_range.end = limit + 1;
            range_extend(range, &pref_range);
        }
    }
2427 2428
    for (i = 0; i < PCI_NUM_REGIONS; ++i) {
        PCIIORegion *r = &dev->io_regions[i];
2429 2430
        Range region_range;

2431 2432 2433 2434 2435 2436 2437 2438 2439
        if (!r->size ||
            (r->type & PCI_BASE_ADDRESS_SPACE_IO) ||
            !(r->type & PCI_BASE_ADDRESS_MEM_TYPE_64)) {
            continue;
        }
        region_range.begin = pci_bar_address(dev, i, r->type, r->size);
        region_range.end = region_range.begin + r->size;

        if (region_range.begin == PCI_BAR_UNMAPPED) {
2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456
            continue;
        }

        region_range.begin = MAX(region_range.begin, 0x1ULL << 32);

        if (region_range.end - 1 >= region_range.begin) {
            range_extend(range, &region_range);
        }
    }
}

void pci_bus_get_w64_range(PCIBus *bus, Range *range)
{
    range->begin = range->end = 0;
    pci_for_each_device_under_bus(bus, pci_dev_get_w64, range);
}

2457
static const TypeInfo pci_device_type_info = {
2458 2459 2460 2461 2462
    .name = TYPE_PCI_DEVICE,
    .parent = TYPE_DEVICE,
    .instance_size = sizeof(PCIDevice),
    .abstract = true,
    .class_size = sizeof(PCIDeviceClass),
2463
    .class_init = pci_device_class_init,
2464 2465
};

A
Andreas Färber 已提交
2466
static void pci_register_types(void)
2467
{
2468
    type_register_static(&pci_bus_info);
2469
    type_register_static(&pcie_bus_info);
2470 2471 2472
    type_register_static(&pci_device_type_info);
}

A
Andreas Färber 已提交
2473
type_init(pci_register_types)