41
41
//#define DEBUG_IRQ_LATENCY
42
42
//#define DEBUG_IRQ_COUNT
44
#define TYPE_I8259 "isa-i8259"
45
#define PIC_CLASS(class) OBJECT_CLASS_CHECK(PICClass, (class), TYPE_I8259)
46
#define PIC_GET_CLASS(obj) OBJECT_GET_CLASS(PICClass, (obj), TYPE_I8259)
50
* @parent_realize: The parent's realizefn.
52
typedef struct PICClass {
53
PICCommonClass parent_class;
55
DeviceRealize parent_realize;
44
58
#if defined(DEBUG_PIC) || defined(DEBUG_IRQ_COUNT)
45
59
static int irq_level[16];
401
static void pic_init(PICCommonState *s)
415
static void pic_realize(DeviceState *dev, Error **err)
403
DeviceState *dev = DEVICE(s);
417
PICCommonState *s = PIC_COMMON(dev);
418
PICClass *pc = PIC_GET_CLASS(dev);
405
memory_region_init_io(&s->base_io, &pic_base_ioport_ops, s, "pic", 2);
406
memory_region_init_io(&s->elcr_io, &pic_elcr_ioport_ops, s, "elcr", 1);
420
memory_region_init_io(&s->base_io, OBJECT(s), &pic_base_ioport_ops, s,
422
memory_region_init_io(&s->elcr_io, OBJECT(s), &pic_elcr_ioport_ops, s,
408
425
qdev_init_gpio_out(dev, s->int_out, ARRAY_SIZE(s->int_out));
409
426
qdev_init_gpio_in(dev, pic_set_irq, 8);
428
pc->parent_realize(dev, err);
412
431
void pic_info(Monitor *mon, const QDict *qdict)
448
467
qemu_irq *i8259_init(ISABus *bus, qemu_irq parent_irq)
450
469
qemu_irq *irq_set;
454
474
irq_set = g_malloc(ISA_NUM_IRQS * sizeof(qemu_irq));
456
dev = i8259_init_chip("isa-i8259", bus, true);
476
isadev = i8259_init_chip(TYPE_I8259, bus, true);
477
dev = DEVICE(isadev);
458
qdev_connect_gpio_out(&dev->qdev, 0, parent_irq);
479
qdev_connect_gpio_out(dev, 0, parent_irq);
459
480
for (i = 0 ; i < 8; i++) {
460
irq_set[i] = qdev_get_gpio_in(&dev->qdev, i);
481
irq_set[i] = qdev_get_gpio_in(dev, i);
463
isa_pic = &dev->qdev;
465
dev = i8259_init_chip("isa-i8259", bus, false);
467
qdev_connect_gpio_out(&dev->qdev, 0, irq_set[2]);
486
isadev = i8259_init_chip(TYPE_I8259, bus, false);
487
dev = DEVICE(isadev);
489
qdev_connect_gpio_out(dev, 0, irq_set[2]);
468
490
for (i = 0 ; i < 8; i++) {
469
irq_set[i + 8] = qdev_get_gpio_in(&dev->qdev, i);
491
irq_set[i + 8] = qdev_get_gpio_in(dev, i);
472
494
slave_pic = PIC_COMMON(dev);
477
499
static void i8259_class_init(ObjectClass *klass, void *data)
479
PICCommonClass *k = PIC_COMMON_CLASS(klass);
501
PICClass *k = PIC_CLASS(klass);
480
502
DeviceClass *dc = DEVICE_CLASS(klass);
504
k->parent_realize = dc->realize;
505
dc->realize = pic_realize;
483
506
dc->reset = pic_reset;
486
509
static const TypeInfo i8259_info = {
488
511
.instance_size = sizeof(PICCommonState),
489
512
.parent = TYPE_PIC_COMMON,
490
513
.class_init = i8259_class_init,
514
.class_size = sizeof(PICClass),
493
517
static void pic_register_types(void)