38
39
typedef PCIHostState I440FXState;
41
#define PIIX_NUM_PIC_IRQS 16 /* i8259 * 2 */
42
#define PIIX_NUM_PIRQS 4ULL /* PIRQ[A-D] */
43
#define XEN_PIIX_NUM_PIRQS 128ULL
44
#define PIIX_PIRQC 0x60
40
46
typedef struct PIIX3State {
42
int pci_irq_levels[4];
50
* bitmap to track pic levels.
51
* The pic level is the logical OR of all the PCI irqs mapped to it
52
* So one PIC level is tracked by PIIX_NUM_PIRQS bits.
54
* PIRQ is mapped to PIC pins, we track it by
55
* PIIX_NUM_PIRQS * PIIX_NUM_PIC_IRQS = 64 bits with
56
* pic_irq * PIIX_NUM_PIRQS + pirq
58
#if PIIX_NUM_PIC_IRQS * PIIX_NUM_PIRQS > 64
59
#error "unable to encode pic state in 64bit in pic_levels."
65
/* This member isn't used. Just for save/load compatibility */
66
int32_t pci_irq_levels_vmstate[PIIX_NUM_PIRQS];
46
69
struct PCII440FXState {
55
78
#define I440FX_PAM_SIZE 7
56
79
#define I440FX_SMRAM 0x72
58
static void piix3_set_irq(void *opaque, int irq_num, int level);
81
static void piix3_set_irq(void *opaque, int pirq, int level);
82
static void piix3_write_config_xen(PCIDevice *dev,
83
uint32_t address, uint32_t val, int len);
60
85
/* return the global irq number corresponding to a given device irq
61
86
pin. We could also use the bus number to have a more precise
63
static int pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num)
88
static int pci_slot_get_pirq(PCIDevice *pci_dev, int pci_intx)
66
91
slot_addend = (pci_dev->devfn >> 3) - 1;
67
return (irq_num + slot_addend) & 3;
92
return (pci_intx + slot_addend) & 3;
70
95
static void update_pam(PCII440FXState *d, uint32_t start, uint32_t end, int r)
206
233
PCII440FXState *d = DO_UPCAST(PCII440FXState, dev, dev);
208
pci_config_set_vendor_id(d->dev.config, PCI_VENDOR_ID_INTEL);
209
pci_config_set_device_id(d->dev.config, PCI_DEVICE_ID_INTEL_82441);
210
d->dev.config[0x08] = 0x02; // revision
211
pci_config_set_class(d->dev.config, PCI_CLASS_BRIDGE_HOST);
213
235
d->dev.config[I440FX_SMRAM] = 0x02;
215
237
cpu_smm_register(&i440fx_set_smm, d);
219
PCIBus *i440fx_init(PCII440FXState **pi440fx_state, int *piix3_devfn, qemu_irq *pic, ram_addr_t ram_size)
241
static PCIBus *i440fx_common_init(const char *device_name,
242
PCII440FXState **pi440fx_state,
244
qemu_irq *pic, ram_addr_t ram_size)
221
246
DeviceState *dev;
231
256
qdev_init_nofail(dev);
233
d = pci_create_simple(b, 0, "i440FX");
258
d = pci_create_simple(b, 0, device_name);
234
259
*pi440fx_state = DO_UPCAST(PCII440FXState, dev, d);
236
piix3 = DO_UPCAST(PIIX3State, dev,
237
pci_create_simple_multifunction(b, -1, true, "PIIX3"));
261
/* Xen supports additional interrupt routes from the PCI devices to
262
* the IOAPIC: the four pins of each PCI device on the bus are also
263
* connected to the IOAPIC directly.
264
* These additional routes can be discovered through ACPI. */
266
piix3 = DO_UPCAST(PIIX3State, dev,
267
pci_create_simple_multifunction(b, -1, true, "PIIX3-xen"));
268
pci_bus_irqs(b, xen_piix3_set_irq, xen_pci_slot_get_pirq,
269
piix3, XEN_PIIX_NUM_PIRQS);
271
piix3 = DO_UPCAST(PIIX3State, dev,
272
pci_create_simple_multifunction(b, -1, true, "PIIX3"));
273
pci_bus_irqs(b, piix3_set_irq, pci_slot_get_pirq, piix3,
238
276
piix3->pic = pic;
239
pci_bus_irqs(b, piix3_set_irq, pci_slot_get_pirq, piix3, 4);
240
278
(*pi440fx_state)->piix3 = piix3;
242
280
*piix3_devfn = piix3->dev.devfn;
290
PCIBus *i440fx_init(PCII440FXState **pi440fx_state, int *piix3_devfn,
291
qemu_irq *pic, ram_addr_t ram_size)
295
b = i440fx_common_init("i440FX", pi440fx_state, piix3_devfn, pic, ram_size);
252
299
/* PIIX3 PCI to ISA bridge */
254
static void piix3_set_irq(void *opaque, int irq_num, int level)
256
int i, pic_irq, pic_level;
300
static void piix3_set_irq_pic(PIIX3State *piix3, int pic_irq)
302
qemu_set_irq(piix3->pic[pic_irq],
303
!!(piix3->pic_levels &
304
(((1ULL << PIIX_NUM_PIRQS) - 1) <<
305
(pic_irq * PIIX_NUM_PIRQS))));
308
static void piix3_set_irq_level(PIIX3State *piix3, int pirq, int level)
313
pic_irq = piix3->dev.config[PIIX_PIRQC + pirq];
314
if (pic_irq >= PIIX_NUM_PIC_IRQS) {
318
mask = 1ULL << ((pic_irq * PIIX_NUM_PIRQS) + pirq);
319
piix3->pic_levels &= ~mask;
320
piix3->pic_levels |= mask * !!level;
322
piix3_set_irq_pic(piix3, pic_irq);
325
static void piix3_set_irq(void *opaque, int pirq, int level)
257
327
PIIX3State *piix3 = opaque;
259
piix3->pci_irq_levels[irq_num] = level;
261
/* now we change the pic irq level according to the piix irq mappings */
263
pic_irq = piix3->dev.config[0x60 + irq_num];
265
/* The pic level is the logical OR of all the PCI irqs mapped
268
for (i = 0; i < 4; i++) {
269
if (pic_irq == piix3->dev.config[0x60 + i])
270
pic_level |= piix3->pci_irq_levels[i];
328
piix3_set_irq_level(piix3, pirq, level);
331
/* irq routing is changed. so rebuild bitmap */
332
static void piix3_update_irq_levels(PIIX3State *piix3)
336
piix3->pic_levels = 0;
337
for (pirq = 0; pirq < PIIX_NUM_PIRQS; pirq++) {
338
piix3_set_irq_level(piix3, pirq,
339
pci_bus_get_irq_level(piix3->dev.bus, pirq));
343
static void piix3_write_config(PCIDevice *dev,
344
uint32_t address, uint32_t val, int len)
346
pci_default_write_config(dev, address, val, len);
347
if (ranges_overlap(address, len, PIIX_PIRQC, 4)) {
348
PIIX3State *piix3 = DO_UPCAST(PIIX3State, dev, dev);
350
piix3_update_irq_levels(piix3);
351
for (pic_irq = 0; pic_irq < PIIX_NUM_PIC_IRQS; pic_irq++) {
352
piix3_set_irq_pic(piix3, pic_irq);
272
qemu_set_irq(piix3->pic[pic_irq], pic_level);
357
static void piix3_write_config_xen(PCIDevice *dev,
358
uint32_t address, uint32_t val, int len)
360
xen_piix_pci_write_config_client(address, val, len);
361
piix3_write_config(dev, address, val, len);
276
364
static void piix3_reset(void *opaque)
278
366
PIIX3State *d = opaque;
310
398
pci_conf[0xac] = 0x00;
311
399
pci_conf[0xae] = 0x00;
313
memset(d->pci_irq_levels, 0, sizeof(d->pci_irq_levels));
404
static int piix3_post_load(void *opaque, int version_id)
406
PIIX3State *piix3 = opaque;
407
piix3_update_irq_levels(piix3);
411
static void piix3_pre_save(void *opaque)
414
PIIX3State *piix3 = opaque;
416
for (i = 0; i < ARRAY_SIZE(piix3->pci_irq_levels_vmstate); i++) {
417
piix3->pci_irq_levels_vmstate[i] =
418
pci_bus_get_irq_level(piix3->dev.bus, i);
316
422
static const VMStateDescription vmstate_piix3 = {
319
425
.minimum_version_id = 2,
320
426
.minimum_version_id_old = 2,
427
.post_load = piix3_post_load,
428
.pre_save = piix3_pre_save,
321
429
.fields = (VMStateField []) {
322
430
VMSTATE_PCI_DEVICE(dev, PIIX3State),
323
VMSTATE_INT32_ARRAY_V(pci_irq_levels, PIIX3State, 4, 3),
431
VMSTATE_INT32_ARRAY_V(pci_irq_levels_vmstate, PIIX3State,
324
433
VMSTATE_END_OF_LIST()
328
437
static int piix3_initfn(PCIDevice *dev)
330
439
PIIX3State *d = DO_UPCAST(PIIX3State, dev, dev);
333
441
isa_bus_new(&d->dev.qdev);
335
pci_conf = d->dev.config;
336
pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_INTEL);
337
pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_INTEL_82371SB_0); // 82371SB PIIX3 PCI-to-ISA bridge (Step A1)
338
pci_config_set_class(pci_conf, PCI_CLASS_BRIDGE_ISA);
340
442
qemu_register_reset(piix3_reset, d);
359
465
.qdev.no_user = 1,
361
467
.init = piix3_initfn,
468
.config_write = piix3_write_config,
469
.vendor_id = PCI_VENDOR_ID_INTEL,
470
.device_id = PCI_DEVICE_ID_INTEL_82371SB_0, // 82371SB PIIX3 PCI-to-ISA bridge (Step A1)
471
.class_id = PCI_CLASS_BRIDGE_ISA,
473
.qdev.name = "PIIX3-xen",
474
.qdev.desc = "ISA bridge",
475
.qdev.size = sizeof(PIIX3State),
476
.qdev.vmsd = &vmstate_piix3,
479
.init = piix3_initfn,
480
.config_write = piix3_write_config_xen,
481
.vendor_id = PCI_VENDOR_ID_INTEL,
482
.device_id = PCI_DEVICE_ID_INTEL_82371SB_0, // 82371SB PIIX3 PCI-to-ISA bridge (Step A1)
483
.class_id = PCI_CLASS_BRIDGE_ISA,
363
485
/* end of list */