Ignore:
Timestamp:
2019-04-06T09:27:04Z (5 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
3b81644b, 3d0fd0d
Parents:
534bcdf
Message:

Always chain pic0 and pic1 using IRQ 2

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/genarch/src/drivers/i8259/i8259.c

    r534bcdf r3daba42e  
    4747static i8259_t *saved_pic1;
    4848
    49 void i8259_init(i8259_t *pic0, i8259_t *pic1, inr_t pic1_irq,
    50     unsigned int irq0_vec)
     49void i8259_init(i8259_t *pic0, i8259_t *pic1, unsigned int irq0_vec)
    5150{
    5251        saved_pic0 = pic0;
     
    5958        pio_write_8(&pic0->port2, irq0_vec);
    6059
    61         /* ICW3: pic1 using IRQ IRQ_PIC1 */
    62         pio_write_8(&pic0->port2, 1 << pic1_irq);
     60        /* ICW3: pic1 using IRQ PIC0_IRQ_PIC1 */
     61        pio_write_8(&pic0->port2, 1 << PIC0_IRQ_PIC1);
    6362
    6463        /* ICW4: i8086 mode */
     
    6968
    7069        /* ICW2: IRQ 8 maps to interrupt vector address irq0_vec + 8 */
    71         pio_write_8(&pic1->port2, irq0_vec + PIC_IRQ_COUNT);
     70        pio_write_8(&pic1->port2, irq0_vec + PIC0_IRQ_COUNT);
    7271
    73         /* ICW3: pic1 is known as IRQ_PIC1 */
    74         pio_write_8(&pic1->port2, pic1_irq);
     72        /* ICW3: pic1 is known as PIC0_IRQ_PIC1 */
     73        pio_write_8(&pic1->port2, PIC0_IRQ_PIC1);
    7574
    7675        /* ICW4: i8086 mode */
     
    7877
    7978        pic_disable_irqs(0xffff);               /* disable all irq's */
    80         pic_enable_irqs(1 << pic1_irq);         /* but enable pic1_irq */
     79        pic_enable_irqs(1 << PIC0_IRQ_PIC1);    /* but enable PIC0_IRQ_PIC1 */
    8180}
    8281
     
    9089                    (uint8_t) (x & (~(irqmask & 0xff))));
    9190        }
    92         if (irqmask >> PIC_IRQ_COUNT) {
     91        if (irqmask >> PIC0_IRQ_COUNT) {
    9392                x = pio_read_8(&saved_pic1->port2);
    9493                pio_write_8(&saved_pic1->port2,
    95                     (uint8_t) (x & (~(irqmask >> PIC_IRQ_COUNT))));
     94                    (uint8_t) (x & (~(irqmask >> PIC0_IRQ_COUNT))));
    9695        }
    9796}
     
    106105                    (uint8_t) (x | (irqmask & 0xff)));
    107106        }
    108         if (irqmask >> PIC_IRQ_COUNT) {
     107        if (irqmask >> PIC0_IRQ_COUNT) {
    109108                x = pio_read_8(&saved_pic1->port2);
    110109                pio_write_8(&saved_pic1->port2,
    111                     (uint8_t) (x | (irqmask >> PIC_IRQ_COUNT)));
     110                    (uint8_t) (x | (irqmask >> PIC0_IRQ_COUNT)));
    112111        }
    113112}
     
    115114void pic_eoi(unsigned int irq)
    116115{
    117         if (irq >= PIC_IRQ_COUNT)
     116        if (irq >= PIC0_IRQ_COUNT)
    118117                pio_write_8(&saved_pic1->port1, PIC_OCW4 | PIC_OCW4_NSEOI);
    119118        pio_write_8(&saved_pic0->port1, PIC_OCW4 | PIC_OCW4_NSEOI);
     
    126125        uint8_t isr_lo = pio_read_8(&saved_pic0->port1);
    127126        uint8_t isr_hi = pio_read_8(&saved_pic1->port1);
    128         return !(((isr_hi << PIC_IRQ_COUNT) | isr_lo) & (1 << irq));
     127        return !(((isr_hi << PIC0_IRQ_COUNT) | isr_lo) & (1 << irq));
    129128}
    130129
     
    132131{
    133132        /* For spurious IRQs from pic1, we need to isssue an EOI to pic0 */
    134         if (irq >= PIC_IRQ_COUNT)
     133        if (irq >= PIC0_IRQ_COUNT)
    135134                pio_write_8(&saved_pic0->port1, PIC_OCW4 | PIC_OCW4_NSEOI);
    136135}
Note: See TracChangeset for help on using the changeset viewer.