pci.c 30.1 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.
 */
P
pbrook 已提交
24 25
#include "hw.h"
#include "pci.h"
A
aliguori 已提交
26
#include "monitor.h"
P
pbrook 已提交
27
#include "net.h"
28
#include "sysemu.h"
B
bellard 已提交
29 30

//#define DEBUG_PCI
31 32 33 34 35
#ifdef DEBUG_PCI
# define PCI_DPRINTF(format, ...)       printf(format, __VA_ARGS__)
#else
# define PCI_DPRINTF(format, ...)       do { } while (0)
#endif
B
bellard 已提交
36

37
struct PCIBus {
P
Paul Brook 已提交
38
    BusState qbus;
39 40
    int bus_num;
    int devfn_min;
P
pbrook 已提交
41
    pci_set_irq_fn set_irq;
42
    pci_map_irq_fn map_irq;
43
    uint32_t config_reg; /* XXX: suppress */
P
pbrook 已提交
44
    qemu_irq *irq_opaque;
45
    PCIDevice *devices[256];
P
pbrook 已提交
46 47
    PCIDevice *parent_dev;
    PCIBus *next;
48 49
    /* The bus IRQ state is the logical OR of the connected devices.
       Keep a count of the number of devices with raised IRQs.  */
50
    int nirq;
51 52 53 54 55 56 57 58 59
    int *irq_count;
};

static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent);

static struct BusInfo pci_bus_info = {
    .name       = "PCI",
    .size       = sizeof(PCIBus),
    .print_dev  = pcibus_dev_print,
G
Gerd Hoffmann 已提交
60
    .props      = (Property[]) {
61 62
        DEFINE_PROP_PCI_DEVFN("addr", PCIDevice, devfn, -1),
        DEFINE_PROP_END_OF_LIST()
G
Gerd Hoffmann 已提交
63
    }
64
};
B
bellard 已提交
65

B
bellard 已提交
66
static void pci_update_mappings(PCIDevice *d);
P
pbrook 已提交
67
static void pci_set_irq(void *opaque, int irq_num, int level);
B
bellard 已提交
68

B
bellard 已提交
69
target_phys_addr_t pci_mem_base;
70 71
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;
72 73
static PCIBus *first_bus;

J
Juan Quintela 已提交
74 75 76 77 78 79 80 81 82
static const VMStateDescription vmstate_pcibus = {
    .name = "PCIBUS",
    .version_id = 1,
    .minimum_version_id = 1,
    .minimum_version_id_old = 1,
    .fields      = (VMStateField []) {
        VMSTATE_INT32_EQUAL(nirq, PCIBus),
        VMSTATE_INT32_VARRAY(irq_count, PCIBus, nirq),
        VMSTATE_END_OF_LIST()
83
    }
J
Juan Quintela 已提交
84
};
85

G
Gleb Natapov 已提交
86 87
static void pci_bus_reset(void *opaque)
{
88
    PCIBus *bus = opaque;
G
Gleb Natapov 已提交
89 90 91 92 93 94 95 96 97 98 99 100
    int i;

    for (i = 0; i < bus->nirq; i++) {
        bus->irq_count[i] = 0;
    }
    for (i = 0; i < 256; i++) {
        if (bus->devices[i])
            memset(bus->devices[i]->irq_state, 0,
                   sizeof(bus->devices[i]->irq_state));
    }
}

P
Paul Brook 已提交
101 102
PCIBus *pci_register_bus(DeviceState *parent, const char *name,
                         pci_set_irq_fn set_irq, pci_map_irq_fn map_irq,
P
pbrook 已提交
103
                         qemu_irq *pic, int devfn_min, int nirq)
104 105
{
    PCIBus *bus;
106 107
    static int nbus = 0;

108
    bus = FROM_QBUS(PCIBus, qbus_create(&pci_bus_info, parent, name));
P
pbrook 已提交
109
    bus->set_irq = set_irq;
110
    bus->map_irq = map_irq;
P
pbrook 已提交
111 112
    bus->irq_opaque = pic;
    bus->devfn_min = devfn_min;
113
    bus->nirq = nirq;
P
Paul Brook 已提交
114
    bus->irq_count = qemu_mallocz(nirq * sizeof(bus->irq_count[0]));
I
Isaku Yamahata 已提交
115
    bus->next = first_bus;
116
    first_bus = bus;
J
Juan Quintela 已提交
117
    vmstate_register(nbus++, &vmstate_pcibus, bus);
118
    qemu_register_reset(pci_bus_reset, bus);
119 120
    return bus;
}
B
bellard 已提交
121

B
Blue Swirl 已提交
122 123 124
static PCIBus *pci_register_secondary_bus(PCIDevice *dev,
                                          pci_map_irq_fn map_irq,
                                          const char *name)
P
pbrook 已提交
125 126
{
    PCIBus *bus;
G
Gerd Hoffmann 已提交
127

B
Blue Swirl 已提交
128
    bus = FROM_QBUS(PCIBus, qbus_create(&pci_bus_info, &dev->qdev, name));
P
pbrook 已提交
129 130 131 132 133 134 135
    bus->map_irq = map_irq;
    bus->parent_dev = dev;
    bus->next = dev->bus->next;
    dev->bus->next = bus;
    return bus;
}

P
pbrook 已提交
136 137 138 139 140
int pci_bus_num(PCIBus *s)
{
    return s->bus_num;
}

J
Juan Quintela 已提交
141
static int get_pci_config_device(QEMUFile *f, void *pv, size_t size)
142
{
J
Juan Quintela 已提交
143 144
    PCIDevice *s = container_of(pv, PCIDevice, config);
    uint8_t config[size];
145 146
    int i;

J
Juan Quintela 已提交
147 148
    qemu_get_buffer(f, config, size);
    for (i = 0; i < size; ++i)
149 150
        if ((config[i] ^ s->config[i]) & s->cmask[i] & ~s->wmask[i])
            return -EINVAL;
J
Juan Quintela 已提交
151
    memcpy(s->config, config, size);
152

B
bellard 已提交
153
    pci_update_mappings(s);
154

155 156 157
    return 0;
}

J
Juan Quintela 已提交
158 159 160 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 188 189 190 191 192 193 194
/* just put buffer */
static void put_pci_config_device(QEMUFile *f, const void *pv, size_t size)
{
    const uint8_t *v = pv;
    qemu_put_buffer(f, v, size);
}

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

const VMStateDescription vmstate_pci_device = {
    .name = "PCIDevice",
    .version_id = 2,
    .minimum_version_id = 1,
    .minimum_version_id_old = 1,
    .fields      = (VMStateField []) {
        VMSTATE_INT32_LE(version_id, PCIDevice),
        VMSTATE_SINGLE(config, PCIDevice, 0, vmstate_info_pci_config,
                       typeof_field(PCIDevice,config)),
        VMSTATE_INT32_ARRAY_V(irq_state, PCIDevice, 4, 2),
        VMSTATE_END_OF_LIST()
    }
};

void pci_device_save(PCIDevice *s, QEMUFile *f)
{
    vmstate_save_state(f, &vmstate_pci_device, s);
}

int pci_device_load(PCIDevice *s, QEMUFile *f)
{
    return vmstate_load_state(f, &vmstate_pci_device, s, s->version_id);
}

195 196 197 198 199 200 201 202 203 204
static int pci_set_default_subsystem_id(PCIDevice *pci_dev)
{
    uint16_t *id;

    id = (void*)(&pci_dev->config[PCI_SUBVENDOR_ID]);
    id[0] = cpu_to_le16(pci_default_sub_vendor_id);
    id[1] = cpu_to_le16(pci_default_sub_device_id);
    return 0;
}

205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253
/*
 * Parse [[<domain>:]<bus>:]<slot>, return -1 on error
 */
static int pci_parse_devaddr(const char *addr, int *domp, int *busp, unsigned *slotp)
{
    const char *p;
    char *e;
    unsigned long val;
    unsigned long dom = 0, bus = 0;
    unsigned slot = 0;

    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;
	}
    }

    if (dom > 0xffff || bus > 0xff || val > 0x1f)
	return -1;

    slot = val;

    if (*e)
	return -1;

    /* Note: QEMU doesn't implement domains other than 0 */
    if (dom != 0 || pci_find_bus(bus) == NULL)
	return -1;

    *domp = dom;
    *busp = bus;
    *slotp = slot;
    return 0;
}

254 255
int pci_read_devaddr(Monitor *mon, const char *addr, int *domp, int *busp,
                     unsigned *slotp)
256
{
257 258 259 260 261 262
    /* strip legacy tag */
    if (!strncmp(addr, "pci_addr=", 9)) {
        addr += 9;
    }
    if (pci_parse_devaddr(addr, domp, busp, slotp)) {
        monitor_printf(mon, "Invalid pci address\n");
263
        return -1;
264 265
    }
    return 0;
266 267
}

268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285
static PCIBus *pci_get_bus_devfn(int *devfnp, const char *devaddr)
{
    int dom, bus;
    unsigned slot;

    if (!devaddr) {
        *devfnp = -1;
        return pci_find_bus(0);
    }

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

    *devfnp = slot << 3;
    return pci_find_bus(bus);
}

286 287 288 289 290 291 292 293 294 295 296 297
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;
}

298 299 300 301 302 303 304 305 306 307 308
static void pci_init_wmask(PCIDevice *dev)
{
    int i;
    dev->wmask[PCI_CACHE_LINE_SIZE] = 0xff;
    dev->wmask[PCI_INTERRUPT_LINE] = 0xff;
    dev->wmask[PCI_COMMAND] = PCI_COMMAND_IO | PCI_COMMAND_MEMORY
                              | PCI_COMMAND_MASTER;
    for (i = PCI_CONFIG_HEADER_SIZE; i < PCI_CONFIG_SPACE_SIZE; ++i)
        dev->wmask[i] = 0xff;
}

B
bellard 已提交
309
/* -1 for devfn means auto assign */
P
Paul Brook 已提交
310 311 312 313
static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus,
                                         const char *name, int devfn,
                                         PCIConfigReadFunc *config_read,
                                         PCIConfigWriteFunc *config_write)
B
bellard 已提交
314 315
{
    if (devfn < 0) {
316 317
        for(devfn = bus->devfn_min ; devfn < 256; devfn += 8) {
            if (!bus->devices[devfn])
B
bellard 已提交
318 319 320 321
                goto found;
        }
        return NULL;
    found: ;
322 323
    } else if (bus->devices[devfn]) {
        return NULL;
B
bellard 已提交
324
    }
325
    pci_dev->bus = bus;
B
bellard 已提交
326 327
    pci_dev->devfn = devfn;
    pstrcpy(pci_dev->name, sizeof(pci_dev->name), name);
328
    memset(pci_dev->irq_state, 0, sizeof(pci_dev->irq_state));
329
    pci_set_default_subsystem_id(pci_dev);
330
    pci_init_cmask(pci_dev);
331
    pci_init_wmask(pci_dev);
332 333 334 335 336

    if (!config_read)
        config_read = pci_default_read_config;
    if (!config_write)
        config_write = pci_default_write_config;
B
bellard 已提交
337 338
    pci_dev->config_read = config_read;
    pci_dev->config_write = config_write;
339
    bus->devices[devfn] = pci_dev;
P
pbrook 已提交
340
    pci_dev->irq = qemu_allocate_irqs(pci_set_irq, pci_dev, 4);
J
Juan Quintela 已提交
341
    pci_dev->version_id = 2; /* Current pci device vmstate version */
B
bellard 已提交
342 343 344
    return pci_dev;
}

P
Paul Brook 已提交
345 346 347 348 349 350 351 352 353 354 355 356
PCIDevice *pci_register_device(PCIBus *bus, const char *name,
                               int instance_size, int devfn,
                               PCIConfigReadFunc *config_read,
                               PCIConfigWriteFunc *config_write)
{
    PCIDevice *pci_dev;

    pci_dev = qemu_mallocz(instance_size);
    pci_dev = do_pci_register_device(pci_dev, bus, name, devfn,
                                     config_read, config_write);
    return pci_dev;
}
357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393
static target_phys_addr_t pci_to_cpu_addr(target_phys_addr_t addr)
{
    return addr + pci_mem_base;
}

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];
        if (!r->size || r->addr == -1)
            continue;
        if (r->type == PCI_ADDRESS_SPACE_IO) {
            isa_unassign_ioport(r->addr, r->size);
        } else {
            cpu_register_physical_memory(pci_to_cpu_addr(r->addr),
                                                     r->size,
                                                     IO_MEM_UNASSIGNED);
        }
    }
}

int pci_unregister_device(PCIDevice *pci_dev)
{
    int ret = 0;

    if (pci_dev->unregister)
        ret = pci_dev->unregister(pci_dev);
    if (ret)
        return ret;

    pci_unregister_io_regions(pci_dev);

    qemu_free_irqs(pci_dev->irq);
    pci_dev->bus->devices[pci_dev->devfn] = NULL;
P
Paul Brook 已提交
394
    qdev_free(&pci_dev->qdev);
395 396 397
    return 0;
}

398
void pci_register_bar(PCIDevice *pci_dev, int region_num,
399
                            uint32_t size, int type,
B
bellard 已提交
400 401 402
                            PCIMapIORegionFunc *map_func)
{
    PCIIORegion *r;
P
pbrook 已提交
403
    uint32_t addr;
404
    uint32_t wmask;
B
bellard 已提交
405

406
    if ((unsigned int)region_num >= PCI_NUM_REGIONS)
B
bellard 已提交
407
        return;
408 409 410 411 412 413 414

    if (size & (size-1)) {
        fprintf(stderr, "ERROR: PCI region size must be pow2 "
                    "type=0x%x, size=0x%x\n", type, size);
        exit(1);
    }

B
bellard 已提交
415 416 417 418 419
    r = &pci_dev->io_regions[region_num];
    r->addr = -1;
    r->size = size;
    r->type = type;
    r->map_func = map_func;
420 421

    wmask = ~(size - 1);
P
pbrook 已提交
422 423
    if (region_num == PCI_ROM_SLOT) {
        addr = 0x30;
424 425
        /* ROM enable bit is writeable */
        wmask |= 1;
P
pbrook 已提交
426 427 428 429
    } else {
        addr = 0x10 + region_num * 4;
    }
    *(uint32_t *)(pci_dev->config + addr) = cpu_to_le32(type);
430
    *(uint32_t *)(pci_dev->wmask + addr) = cpu_to_le32(wmask);
431
    *(uint32_t *)(pci_dev->cmask + addr) = 0xffffffff;
B
bellard 已提交
432 433
}

434 435 436 437
static void pci_update_mappings(PCIDevice *d)
{
    PCIIORegion *r;
    int cmd, i;
438
    uint32_t last_addr, new_addr, config_ofs;
439

440
    cmd = le16_to_cpu(*(uint16_t *)(d->config + PCI_COMMAND));
441
    for(i = 0; i < PCI_NUM_REGIONS; i++) {
442
        r = &d->io_regions[i];
443 444 445 446 447
        if (i == PCI_ROM_SLOT) {
            config_ofs = 0x30;
        } else {
            config_ofs = 0x10 + i * 4;
        }
448 449 450
        if (r->size != 0) {
            if (r->type & PCI_ADDRESS_SPACE_IO) {
                if (cmd & PCI_COMMAND_IO) {
451
                    new_addr = le32_to_cpu(*(uint32_t *)(d->config +
452
                                                         config_ofs));
453 454 455 456 457 458 459 460 461 462 463 464
                    new_addr = new_addr & ~(r->size - 1);
                    last_addr = new_addr + r->size - 1;
                    /* NOTE: we have only 64K ioports on PC */
                    if (last_addr <= new_addr || new_addr == 0 ||
                        last_addr >= 0x10000) {
                        new_addr = -1;
                    }
                } else {
                    new_addr = -1;
                }
            } else {
                if (cmd & PCI_COMMAND_MEMORY) {
465
                    new_addr = le32_to_cpu(*(uint32_t *)(d->config +
466 467 468 469
                                                         config_ofs));
                    /* the ROM slot has a specific enable bit */
                    if (i == PCI_ROM_SLOT && !(new_addr & 1))
                        goto no_mem_map;
470 471 472 473 474 475 476 477 478 479 480
                    new_addr = new_addr & ~(r->size - 1);
                    last_addr = new_addr + r->size - 1;
                    /* NOTE: we do not support wrapping */
                    /* XXX: as we cannot support really dynamic
                       mappings, we handle specific values as invalid
                       mappings. */
                    if (last_addr <= new_addr || new_addr == 0 ||
                        last_addr == -1) {
                        new_addr = -1;
                    }
                } else {
481
                no_mem_map:
482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498
                    new_addr = -1;
                }
            }
            /* now do the real mapping */
            if (new_addr != r->addr) {
                if (r->addr != -1) {
                    if (r->type & PCI_ADDRESS_SPACE_IO) {
                        int class;
                        /* NOTE: specific hack for IDE in PC case:
                           only one byte must be mapped. */
                        class = d->config[0x0a] | (d->config[0x0b] << 8);
                        if (class == 0x0101 && r->size == 4) {
                            isa_unassign_ioport(r->addr + 2, 1);
                        } else {
                            isa_unassign_ioport(r->addr, r->size);
                        }
                    } else {
P
pbrook 已提交
499
                        cpu_register_physical_memory(pci_to_cpu_addr(r->addr),
500
                                                     r->size,
501
                                                     IO_MEM_UNASSIGNED);
A
aliguori 已提交
502
                        qemu_unregister_coalesced_mmio(r->addr, r->size);
503 504 505 506 507 508 509 510 511 512 513
                    }
                }
                r->addr = new_addr;
                if (r->addr != -1) {
                    r->map_func(d, i, r->addr, r->size, r->type);
                }
            }
        }
    }
}

514
uint32_t pci_default_read_config(PCIDevice *d,
515
                                 uint32_t address, int len)
B
bellard 已提交
516
{
517
    uint32_t val;
518

519 520 521
    switch(len) {
    default:
    case 4:
522 523 524 525 526 527 528 529 530 531 532 533 534
	if (address <= 0xfc) {
	    val = le32_to_cpu(*(uint32_t *)(d->config + address));
	    break;
	}
	/* fall through */
    case 2:
        if (address <= 0xfe) {
	    val = le16_to_cpu(*(uint16_t *)(d->config + address));
	    break;
	}
	/* fall through */
    case 1:
        val = d->config[address];
535 536 537 538 539
        break;
    }
    return val;
}

540
void pci_default_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int l)
541
{
542 543
    uint8_t orig[PCI_CONFIG_SPACE_SIZE];
    int i;
544 545

    /* not efficient, but simple */
546 547 548 549
    memcpy(orig, d->config, PCI_CONFIG_SPACE_SIZE);
    for(i = 0; i < l && addr < PCI_CONFIG_SPACE_SIZE; val >>= 8, ++i, ++addr) {
        uint8_t wmask = d->wmask[addr];
        d->config[addr] = (d->config[addr] & ~wmask) | (val & wmask);
550
    }
551 552 553
    if (memcmp(orig + PCI_BASE_ADDRESS_0, d->config + PCI_BASE_ADDRESS_0, 24)
        || ((orig[PCI_COMMAND] ^ d->config[PCI_COMMAND])
            & (PCI_COMMAND_MEMORY | PCI_COMMAND_IO)))
554
        pci_update_mappings(d);
B
bellard 已提交
555 556
}

P
pbrook 已提交
557
void pci_data_write(void *opaque, uint32_t addr, uint32_t val, int len)
B
bellard 已提交
558
{
559 560 561
    PCIBus *s = opaque;
    PCIDevice *pci_dev;
    int config_addr, bus_num;
562

563 564 565
#if 0
    PCI_DPRINTF("pci_data_write: addr=%08x val=%08x len=%d\n",
                addr, val, len);
B
bellard 已提交
566
#endif
P
pbrook 已提交
567
    bus_num = (addr >> 16) & 0xff;
P
pbrook 已提交
568 569 570
    while (s && s->bus_num != bus_num)
        s = s->next;
    if (!s)
B
bellard 已提交
571
        return;
P
pbrook 已提交
572
    pci_dev = s->devices[(addr >> 8) & 0xff];
B
bellard 已提交
573 574
    if (!pci_dev)
        return;
P
pbrook 已提交
575
    config_addr = addr & 0xff;
576 577
    PCI_DPRINTF("pci_config_write: %s: addr=%02x val=%08x len=%d\n",
                pci_dev->name, config_addr, val, len);
578
    pci_dev->config_write(pci_dev, config_addr, val, len);
B
bellard 已提交
579 580
}

P
pbrook 已提交
581
uint32_t pci_data_read(void *opaque, uint32_t addr, int len)
B
bellard 已提交
582
{
583 584 585
    PCIBus *s = opaque;
    PCIDevice *pci_dev;
    int config_addr, bus_num;
B
bellard 已提交
586 587
    uint32_t val;

P
pbrook 已提交
588
    bus_num = (addr >> 16) & 0xff;
P
pbrook 已提交
589 590 591
    while (s && s->bus_num != bus_num)
        s= s->next;
    if (!s)
B
bellard 已提交
592
        goto fail;
P
pbrook 已提交
593
    pci_dev = s->devices[(addr >> 8) & 0xff];
B
bellard 已提交
594 595
    if (!pci_dev) {
    fail:
596 597 598 599 600 601 602 603 604 605 606 607
        switch(len) {
        case 1:
            val = 0xff;
            break;
        case 2:
            val = 0xffff;
            break;
        default:
        case 4:
            val = 0xffffffff;
            break;
        }
B
bellard 已提交
608 609
        goto the_end;
    }
P
pbrook 已提交
610
    config_addr = addr & 0xff;
B
bellard 已提交
611
    val = pci_dev->config_read(pci_dev, config_addr, len);
612 613
    PCI_DPRINTF("pci_config_read: %s: addr=%02x val=%08x len=%d\n",
                pci_dev->name, config_addr, val, len);
B
bellard 已提交
614
 the_end:
615 616 617
#if 0
    PCI_DPRINTF("pci_data_read: addr=%08x val=%08x len=%d\n",
                addr, val, len);
B
bellard 已提交
618 619 620 621
#endif
    return val;
}

P
pbrook 已提交
622 623
/***********************************************************/
/* generic PCI irq support */
624

P
pbrook 已提交
625
/* 0 <= irq_num <= 3. level must be 0 or 1 */
P
pbrook 已提交
626
static void pci_set_irq(void *opaque, int irq_num, int level)
B
bellard 已提交
627
{
628
    PCIDevice *pci_dev = opaque;
P
pbrook 已提交
629 630
    PCIBus *bus;
    int change;
631

P
pbrook 已提交
632 633 634
    change = level - pci_dev->irq_state[irq_num];
    if (!change)
        return;
635 636

    pci_dev->irq_state[irq_num] = level;
P
pbrook 已提交
637 638
    for (;;) {
        bus = pci_dev->bus;
P
pbrook 已提交
639
        irq_num = bus->map_irq(pci_dev, irq_num);
P
pbrook 已提交
640 641
        if (bus->set_irq)
            break;
P
pbrook 已提交
642 643 644
        pci_dev = bus->parent_dev;
    }
    bus->irq_count[irq_num] += change;
645
    bus->set_irq(bus->irq_opaque, irq_num, bus->irq_count[irq_num] != 0);
B
bellard 已提交
646 647
}

P
pbrook 已提交
648 649
/***********************************************************/
/* monitor info on PCI */
650

651 652 653 654 655
typedef struct {
    uint16_t class;
    const char *desc;
} pci_class_desc;

656
static const pci_class_desc pci_class_descriptions[] =
657
{
P
pbrook 已提交
658
    { 0x0100, "SCSI controller"},
659
    { 0x0101, "IDE controller"},
T
ths 已提交
660 661 662 663 664 665
    { 0x0102, "Floppy controller"},
    { 0x0103, "IPI controller"},
    { 0x0104, "RAID controller"},
    { 0x0106, "SATA controller"},
    { 0x0107, "SAS controller"},
    { 0x0180, "Storage controller"},
666
    { 0x0200, "Ethernet controller"},
T
ths 已提交
667 668 669 670
    { 0x0201, "Token Ring controller"},
    { 0x0202, "FDDI controller"},
    { 0x0203, "ATM controller"},
    { 0x0280, "Network controller"},
671
    { 0x0300, "VGA controller"},
T
ths 已提交
672 673 674 675 676 677 678 679 680 681
    { 0x0301, "XGA controller"},
    { 0x0302, "3D controller"},
    { 0x0380, "Display controller"},
    { 0x0400, "Video controller"},
    { 0x0401, "Audio controller"},
    { 0x0402, "Phone"},
    { 0x0480, "Multimedia controller"},
    { 0x0500, "RAM controller"},
    { 0x0501, "Flash controller"},
    { 0x0580, "Memory controller"},
682 683
    { 0x0600, "Host bridge"},
    { 0x0601, "ISA bridge"},
T
ths 已提交
684 685
    { 0x0602, "EISA bridge"},
    { 0x0603, "MC bridge"},
686
    { 0x0604, "PCI bridge"},
T
ths 已提交
687 688 689 690 691
    { 0x0605, "PCMCIA bridge"},
    { 0x0606, "NUBUS bridge"},
    { 0x0607, "CARDBUS bridge"},
    { 0x0608, "RACEWAY bridge"},
    { 0x0680, "Bridge"},
692 693 694 695
    { 0x0c03, "USB controller"},
    { 0, NULL}
};

P
pbrook 已提交
696
static void pci_info_device(PCIDevice *d)
697
{
A
aliguori 已提交
698
    Monitor *mon = cur_mon;
P
pbrook 已提交
699 700
    int i, class;
    PCIIORegion *r;
701
    const pci_class_desc *desc;
702

A
aliguori 已提交
703 704
    monitor_printf(mon, "  Bus %2d, device %3d, function %d:\n",
                   d->bus->bus_num, d->devfn >> 3, d->devfn & 7);
P
pbrook 已提交
705
    class = le16_to_cpu(*((uint16_t *)(d->config + PCI_CLASS_DEVICE)));
A
aliguori 已提交
706
    monitor_printf(mon, "    ");
707 708 709 710
    desc = pci_class_descriptions;
    while (desc->desc && class != desc->class)
        desc++;
    if (desc->desc) {
A
aliguori 已提交
711
        monitor_printf(mon, "%s", desc->desc);
712
    } else {
A
aliguori 已提交
713
        monitor_printf(mon, "Class %04x", class);
714
    }
A
aliguori 已提交
715
    monitor_printf(mon, ": PCI device %04x:%04x\n",
P
pbrook 已提交
716 717
           le16_to_cpu(*((uint16_t *)(d->config + PCI_VENDOR_ID))),
           le16_to_cpu(*((uint16_t *)(d->config + PCI_DEVICE_ID))));
718

P
pbrook 已提交
719
    if (d->config[PCI_INTERRUPT_PIN] != 0) {
A
aliguori 已提交
720 721
        monitor_printf(mon, "      IRQ %d.\n",
                       d->config[PCI_INTERRUPT_LINE]);
722
    }
P
pbrook 已提交
723
    if (class == 0x0604) {
A
aliguori 已提交
724
        monitor_printf(mon, "      BUS %d.\n", d->config[0x19]);
P
pbrook 已提交
725
    }
P
pbrook 已提交
726 727 728
    for(i = 0;i < PCI_NUM_REGIONS; i++) {
        r = &d->io_regions[i];
        if (r->size != 0) {
A
aliguori 已提交
729
            monitor_printf(mon, "      BAR%d: ", i);
P
pbrook 已提交
730
            if (r->type & PCI_ADDRESS_SPACE_IO) {
A
aliguori 已提交
731 732
                monitor_printf(mon, "I/O at 0x%04x [0x%04x].\n",
                               r->addr, r->addr + r->size - 1);
P
pbrook 已提交
733
            } else {
A
aliguori 已提交
734 735
                monitor_printf(mon, "32 bit memory at 0x%08x [0x%08x].\n",
                               r->addr, r->addr + r->size - 1);
P
pbrook 已提交
736 737
            }
        }
B
bellard 已提交
738
    }
739
    monitor_printf(mon, "      id \"%s\"\n", d->qdev.id ? d->qdev.id : "");
P
pbrook 已提交
740 741 742
    if (class == 0x0604 && d->config[0x19] != 0) {
        pci_for_each_device(d->config[0x19], pci_info_device);
    }
743 744
}

P
pbrook 已提交
745
void pci_for_each_device(int bus_num, void (*fn)(PCIDevice *d))
746
{
P
pbrook 已提交
747
    PCIBus *bus = first_bus;
748
    PCIDevice *d;
P
pbrook 已提交
749
    int devfn;
750

P
pbrook 已提交
751 752
    while (bus && bus->bus_num != bus_num)
        bus = bus->next;
P
pbrook 已提交
753 754 755 756 757 758
    if (bus) {
        for(devfn = 0; devfn < 256; devfn++) {
            d = bus->devices[devfn];
            if (d)
                fn(d);
        }
B
bellard 已提交
759 760 761
    }
}

A
aliguori 已提交
762
void pci_info(Monitor *mon)
B
bellard 已提交
763
{
P
pbrook 已提交
764
    pci_for_each_device(0, pci_info_device);
B
bellard 已提交
765
}
766

767
PCIDevice *pci_create(const char *name, const char *devaddr)
768 769 770 771 772 773 774 775 776 777 778 779 780
{
    PCIBus *bus;
    int devfn;
    DeviceState *dev;

    bus = pci_get_bus_devfn(&devfn, devaddr);
    if (!bus) {
        fprintf(stderr, "Invalid PCI device address %s for device %s\n",
                devaddr, name);
        exit(1);
    }

    dev = qdev_create(&bus->qbus, name);
781
    qdev_prop_set_uint32(dev, "addr", devfn);
782 783 784
    return (PCIDevice *)dev;
}

785 786 787 788 789 790 791 792 793 794 795 796
static const char * const pci_nic_models[] = {
    "ne2k_pci",
    "i82551",
    "i82557b",
    "i82559er",
    "rtl8139",
    "e1000",
    "pcnet",
    "virtio",
    NULL
};

P
Paul Brook 已提交
797 798 799 800 801 802 803 804
static const char * const pci_nic_names[] = {
    "ne2k_pci",
    "i82551",
    "i82557b",
    "i82559er",
    "rtl8139",
    "e1000",
    "pcnet",
P
Paul Brook 已提交
805
    "virtio-net-pci",
806 807 808
    NULL
};

809
/* Initialize a PCI NIC.  */
810 811
PCIDevice *pci_nic_init(NICInfo *nd, const char *default_model,
                        const char *default_devaddr)
812
{
813 814
    const char *devaddr = nd->devaddr ? nd->devaddr : default_devaddr;
    PCIDevice *pci_dev;
P
Paul Brook 已提交
815
    DeviceState *dev;
816 817 818 819
    int i;

    qemu_check_nic_model_list(nd, pci_nic_models, default_model);

P
Paul Brook 已提交
820
    for (i = 0; pci_nic_models[i]; i++) {
821
        if (strcmp(nd->model, pci_nic_models[i]) == 0) {
822 823
            pci_dev = pci_create(pci_nic_names[i], devaddr);
            dev = &pci_dev->qdev;
824 825
            if (nd->id)
                dev->id = qemu_strdup(nd->id);
G
Gerd Hoffmann 已提交
826
            dev->nd = nd;
P
Paul Brook 已提交
827 828
            qdev_init(dev);
            nd->private = dev;
829
            return pci_dev;
830
        }
P
Paul Brook 已提交
831
    }
832 833

    return NULL;
834 835
}

P
pbrook 已提交
836 837 838 839 840
typedef struct {
    PCIDevice dev;
    PCIBus *bus;
} PCIBridge;

841
static void pci_bridge_write_config(PCIDevice *d,
P
pbrook 已提交
842 843 844 845 846
                             uint32_t address, uint32_t val, int len)
{
    PCIBridge *s = (PCIBridge *)d;

    pci_default_write_config(d, address, val, len);
847
    s->bus->bus_num = d->config[PCI_SECONDARY_BUS];
P
pbrook 已提交
848 849
}

850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869
PCIBus *pci_find_bus(int bus_num)
{
    PCIBus *bus = first_bus;

    while (bus && bus->bus_num != bus_num)
        bus = bus->next;

    return bus;
}

PCIDevice *pci_find_device(int bus_num, int slot, int function)
{
    PCIBus *bus = pci_find_bus(bus_num);

    if (!bus)
        return NULL;

    return bus->devices[PCI_DEVFN(slot, function)];
}

B
blueswir1 已提交
870
PCIBus *pci_bridge_init(PCIBus *bus, int devfn, uint16_t vid, uint16_t did,
P
pbrook 已提交
871 872 873
                        pci_map_irq_fn map_irq, const char *name)
{
    PCIBridge *s;
874
    s = (PCIBridge *)pci_register_device(bus, name, sizeof(PCIBridge),
P
pbrook 已提交
875
                                         devfn, NULL, pci_bridge_write_config);
B
blueswir1 已提交
876 877 878 879

    pci_config_set_vendor_id(s->dev.config, vid);
    pci_config_set_device_id(s->dev.config, did);

P
pbrook 已提交
880 881 882 883 884 885
    s->dev.config[0x04] = 0x06; // command = bus master, pci mem
    s->dev.config[0x05] = 0x00;
    s->dev.config[0x06] = 0xa0; // status = fast back-to-back, 66MHz, no error
    s->dev.config[0x07] = 0x00; // status = fast devsel
    s->dev.config[0x08] = 0x00; // revision
    s->dev.config[0x09] = 0x00; // programming i/f
886
    pci_config_set_class(s->dev.config, PCI_CLASS_BRIDGE_PCI);
P
pbrook 已提交
887
    s->dev.config[0x0D] = 0x10; // latency_timer
I
Isaku Yamahata 已提交
888 889
    s->dev.config[PCI_HEADER_TYPE] =
        PCI_HEADER_TYPE_MULTI_FUNCTION | PCI_HEADER_TYPE_BRIDGE; // header_type
P
pbrook 已提交
890 891
    s->dev.config[0x1E] = 0xa0; // secondary status

B
Blue Swirl 已提交
892
    s->bus = pci_register_secondary_bus(&s->dev, map_irq, name);
P
pbrook 已提交
893 894
    return s->bus;
}
P
Paul Brook 已提交
895

896
static int pci_qdev_init(DeviceState *qdev, DeviceInfo *base)
P
Paul Brook 已提交
897 898
{
    PCIDevice *pci_dev = (PCIDevice *)qdev;
P
Paul Brook 已提交
899
    PCIDeviceInfo *info = container_of(base, PCIDeviceInfo, qdev);
P
Paul Brook 已提交
900 901 902
    PCIBus *bus;
    int devfn;

P
Paul Brook 已提交
903
    bus = FROM_QBUS(PCIBus, qdev_get_parent_bus(qdev));
G
Gerd Hoffmann 已提交
904
    devfn = pci_dev->devfn;
G
Gerd Hoffmann 已提交
905
    pci_dev = do_pci_register_device(pci_dev, bus, base->name, devfn,
906
                                     info->config_read, info->config_write);
P
Paul Brook 已提交
907
    assert(pci_dev);
908
    return info->init(pci_dev);
P
Paul Brook 已提交
909 910
}

911
void pci_qdev_register(PCIDeviceInfo *info)
P
Paul Brook 已提交
912
{
P
Paul Brook 已提交
913
    info->qdev.init = pci_qdev_init;
914
    info->qdev.bus_info = &pci_bus_info;
915
    qdev_register(&info->qdev);
P
Paul Brook 已提交
916 917
}

918 919 920 921 922 923 924 925
void pci_qdev_register_many(PCIDeviceInfo *info)
{
    while (info->qdev.name) {
        pci_qdev_register(info);
        info++;
    }
}

P
Paul Brook 已提交
926 927 928 929
PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name)
{
    DeviceState *dev;

P
Paul Brook 已提交
930
    dev = qdev_create(&bus->qbus, name);
931
    qdev_prop_set_uint32(dev, "addr", devfn);
P
Paul Brook 已提交
932 933 934 935
    qdev_init(dev);

    return (PCIDevice *)dev;
}
936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980

static int pci_find_space(PCIDevice *pdev, uint8_t size)
{
    int offset = PCI_CONFIG_HEADER_SIZE;
    int i;
    for (i = PCI_CONFIG_HEADER_SIZE; i < PCI_CONFIG_SPACE_SIZE; ++i)
        if (pdev->used[i])
            offset = i + 1;
        else if (i - offset + 1 == size)
            return offset;
    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;
}

/* Reserve space and add capability to the linked list in pci config space */
int pci_add_capability(PCIDevice *pdev, uint8_t cap_id, uint8_t size)
{
    uint8_t offset = pci_find_space(pdev, size);
    uint8_t *config = pdev->config + offset;
    if (!offset)
        return -ENOSPC;
    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;
    memset(pdev->used + offset, 0xFF, size);
    /* Make capability read-only by default */
    memset(pdev->wmask + offset, 0, size);
981 982
    /* Check capability by default */
    memset(pdev->cmask + offset, 0xFF, size);
983 984 985 986 987 988 989 990 991 992 993 994
    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];
    /* Make capability writeable again */
    memset(pdev->wmask + offset, 0xff, size);
995 996
    /* Clear cmask as device-specific registers can't be checked */
    memset(pdev->cmask + offset, 0, size);
997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012
    memset(pdev->used + offset, 0, size);

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

/* Reserve space for capability at a known offset (to call after load). */
void pci_reserve_capability(PCIDevice *pdev, uint8_t offset, uint8_t size)
{
    memset(pdev->used + offset, 0xff, size);
}

uint8_t pci_find_capability(PCIDevice *pdev, uint8_t cap_id)
{
    return pci_find_capability_list(pdev, cap_id, NULL);
}
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

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;

    class = le16_to_cpu(*((uint16_t *)(d->config + PCI_CLASS_DEVICE)));
    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",
                   indent, "", ctxt,
                   d->bus->bus_num, d->devfn >> 3, d->devfn & 7,
                   le16_to_cpu(*((uint16_t *)(d->config + PCI_VENDOR_ID))),
                   le16_to_cpu(*((uint16_t *)(d->config + PCI_DEVICE_ID))),
                   le16_to_cpu(*((uint16_t *)(d->config + PCI_SUBSYSTEM_VENDOR_ID))),
                   le16_to_cpu(*((uint16_t *)(d->config + PCI_SUBSYSTEM_ID))));
    for (i = 0; i < PCI_NUM_REGIONS; i++) {
        r = &d->io_regions[i];
        if (!r->size)
            continue;
        monitor_printf(mon, "%*sbar %d: %s at 0x%x [0x%x]\n", indent, "",
                       i, r->type & PCI_ADDRESS_SPACE_IO ? "i/o" : "mem",
                       r->addr, r->addr + r->size - 1);
    }
}