Ignore:
File:
1 edited

Legend:

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

    rc48de91 r3daba42e  
    3232/**
    3333 * @file
    34  * @brief i8259 driver.
     34 * @brief PIC driver.
    3535 *
    3636 * Programmable Interrupt Controller for UP systems based on i8259 chip.
     
    4242#include <log.h>
    4343#include <interrupt.h>
    44 
    45 /* ICW1 bits */
    46 #define I8259_ICW1           (1 << 4)
    47 #define I8259_ICW1_NEEDICW4  (1 << 0)
    48 
    49 /* OCW3 bits */
    50 #define I8259_OCW3           (1 << 3)
    51 #define I8259_OCW3_READ_ISR  (3 << 0)
    52 
    53 /* OCW4 bits */
    54 #define I8259_OCW4           (0 << 3)
    55 #define I8259_OCW4_NSEOI     (1 << 5)
    56 
    57 #define I8259_IRQ_COUNT 8
    58 
    59 #define I8259_IRQ_SLAVE 2
    60 
    61 static const char *i8259_get_name(void);
    62 
    63 pic_ops_t i8259_pic_ops = {
    64         .get_name = i8259_get_name,
    65         .enable_irqs = i8259_enable_irqs,
    66         .disable_irqs = i8259_disable_irqs,
    67         .eoi = i8259_eoi,
    68         .is_spurious = i8259_is_spurious,
    69         .handle_spurious = i8259_handle_spurious
    70 };
    7144
    7245// XXX: need to change pic_* API to get rid of these
     
    8053
    8154        /* ICW1: this is ICW1, ICW4 to follow */
    82         pio_write_8(&pic0->port1, I8259_ICW1 | I8259_ICW1_NEEDICW4);
     55        pio_write_8(&pic0->port1, PIC_ICW1 | PIC_ICW1_NEEDICW4);
    8356
    8457        /* ICW2: IRQ 0 maps to interrupt vector address irq0_vec */
    8558        pio_write_8(&pic0->port2, irq0_vec);
    8659
    87         /* ICW3: pic1 using IRQ I8259_IRQ_SLAVE */
    88         pio_write_8(&pic0->port2, 1 << I8259_IRQ_SLAVE);
     60        /* ICW3: pic1 using IRQ PIC0_IRQ_PIC1 */
     61        pio_write_8(&pic0->port2, 1 << PIC0_IRQ_PIC1);
    8962
    9063        /* ICW4: i8086 mode */
     
    9265
    9366        /* ICW1: ICW1, ICW4 to follow */
    94         pio_write_8(&pic1->port1, I8259_ICW1 | I8259_ICW1_NEEDICW4);
     67        pio_write_8(&pic1->port1, PIC_ICW1 | PIC_ICW1_NEEDICW4);
    9568
    9669        /* ICW2: IRQ 8 maps to interrupt vector address irq0_vec + 8 */
    97         pio_write_8(&pic1->port2, irq0_vec + I8259_IRQ_COUNT);
     70        pio_write_8(&pic1->port2, irq0_vec + PIC0_IRQ_COUNT);
    9871
    99         /* ICW3: pic1 is known as I8259_IRQ_SLAVE */
    100         pio_write_8(&pic1->port2, I8259_IRQ_SLAVE);
     72        /* ICW3: pic1 is known as PIC0_IRQ_PIC1 */
     73        pio_write_8(&pic1->port2, PIC0_IRQ_PIC1);
    10174
    10275        /* ICW4: i8086 mode */
    10376        pio_write_8(&pic1->port2, 1);
    10477
    105         /* disable all irq's */
    106         i8259_disable_irqs(0xffff);
    107         /* but enable I8259_IRQ_SLAVE */
    108         i8259_enable_irqs(1 << I8259_IRQ_SLAVE);
     78        pic_disable_irqs(0xffff);               /* disable all irq's */
     79        pic_enable_irqs(1 << PIC0_IRQ_PIC1);    /* but enable PIC0_IRQ_PIC1 */
    10980}
    11081
    111 const char *i8259_get_name(void)
    112 {
    113         return "i8259";
    114 }
    115 
    116 void i8259_enable_irqs(uint16_t irqmask)
     82void pic_enable_irqs(uint16_t irqmask)
    11783{
    11884        uint8_t x;
     
    12389                    (uint8_t) (x & (~(irqmask & 0xff))));
    12490        }
    125         if (irqmask >> I8259_IRQ_COUNT) {
     91        if (irqmask >> PIC0_IRQ_COUNT) {
    12692                x = pio_read_8(&saved_pic1->port2);
    12793                pio_write_8(&saved_pic1->port2,
    128                     (uint8_t) (x & (~(irqmask >> I8259_IRQ_COUNT))));
     94                    (uint8_t) (x & (~(irqmask >> PIC0_IRQ_COUNT))));
    12995        }
    13096}
    13197
    132 void i8259_disable_irqs(uint16_t irqmask)
     98void pic_disable_irqs(uint16_t irqmask)
    13399{
    134100        uint8_t x;
     
    139105                    (uint8_t) (x | (irqmask & 0xff)));
    140106        }
    141         if (irqmask >> I8259_IRQ_COUNT) {
     107        if (irqmask >> PIC0_IRQ_COUNT) {
    142108                x = pio_read_8(&saved_pic1->port2);
    143109                pio_write_8(&saved_pic1->port2,
    144                     (uint8_t) (x | (irqmask >> I8259_IRQ_COUNT)));
     110                    (uint8_t) (x | (irqmask >> PIC0_IRQ_COUNT)));
    145111        }
    146112}
    147113
    148 void i8259_eoi(unsigned int irq)
     114void pic_eoi(unsigned int irq)
    149115{
    150         if (irq >= I8259_IRQ_COUNT)
    151                 pio_write_8(&saved_pic1->port1, I8259_OCW4 | I8259_OCW4_NSEOI);
    152         pio_write_8(&saved_pic0->port1, I8259_OCW4 | I8259_OCW4_NSEOI);
     116        if (irq >= PIC0_IRQ_COUNT)
     117                pio_write_8(&saved_pic1->port1, PIC_OCW4 | PIC_OCW4_NSEOI);
     118        pio_write_8(&saved_pic0->port1, PIC_OCW4 | PIC_OCW4_NSEOI);
    153119}
    154120
    155 bool i8259_is_spurious(unsigned int irq)
     121bool pic_is_spurious(unsigned int irq)
    156122{
    157         pio_write_8(&saved_pic0->port1, I8259_OCW3 | I8259_OCW3_READ_ISR);
    158         pio_write_8(&saved_pic1->port1, I8259_OCW3 | I8259_OCW3_READ_ISR);
     123        pio_write_8(&saved_pic0->port1, PIC_OCW3 | PIC_OCW3_READ_ISR);
     124        pio_write_8(&saved_pic1->port1, PIC_OCW3 | PIC_OCW3_READ_ISR);
    159125        uint8_t isr_lo = pio_read_8(&saved_pic0->port1);
    160126        uint8_t isr_hi = pio_read_8(&saved_pic1->port1);
    161         return !(((isr_hi << I8259_IRQ_COUNT) | isr_lo) & (1 << irq));
     127        return !(((isr_hi << PIC0_IRQ_COUNT) | isr_lo) & (1 << irq));
    162128}
    163129
    164 void i8259_handle_spurious(unsigned int irq)
     130void pic_handle_spurious(unsigned int irq)
    165131{
    166132        /* For spurious IRQs from pic1, we need to isssue an EOI to pic0 */
    167         if (irq >= I8259_IRQ_COUNT)
    168                 pio_write_8(&saved_pic0->port1, I8259_OCW4 | I8259_OCW4_NSEOI);
     133        if (irq >= PIC0_IRQ_COUNT)
     134                pio_write_8(&saved_pic0->port1, PIC_OCW4 | PIC_OCW4_NSEOI);
    169135}
    170136
Note: See TracChangeset for help on using the changeset viewer.