Ignore:
Timestamp:
2019-06-09T11:31:38Z (6 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
c48de91
Parents:
b401b33
Message:

Introduce PIC operations indirection mechanism

Some architectures switch from one interrupt controller implementation
to another during runtime. By providing a cleaner indirection mechanism,
it is possible e.g. for the ia32 IRQ 7 handler to distinguish i8259
spurious interrupts from actual IRQ 7 device interrupts, even when the
i8259 interrupt controller is no longer active.

File:
1 edited

Legend:

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

    rb401b33 r2a103b5  
    4343#include <interrupt.h>
    4444
     45static const char *i8259_get_name(void);
     46
     47pic_ops_t i8259_pic_ops = {
     48        .get_name = i8259_get_name,
     49        .enable_irqs = i8259_enable_irqs,
     50        .disable_irqs = i8259_disable_irqs,
     51        .eoi = i8259_eoi,
     52        .is_spurious = i8259_is_spurious,
     53        .handle_spurious = i8259_handle_spurious
     54};
     55
    4556// XXX: need to change pic_* API to get rid of these
    4657static i8259_t *saved_pic0;
     
    7687        pio_write_8(&pic1->port2, 1);
    7788
    78         pic_disable_irqs(0xffff);               /* disable all irq's */
    79         pic_enable_irqs(1 << PIC0_IRQ_PIC1);    /* but enable PIC0_IRQ_PIC1 */
     89        i8259_disable_irqs(0xffff);             /* disable all irq's */
     90        i8259_enable_irqs(1 << PIC0_IRQ_PIC1);  /* but enable PIC0_IRQ_PIC1 */
    8091}
    8192
    82 void pic_enable_irqs(uint16_t irqmask)
     93const char *i8259_get_name(void)
     94{
     95        return "i8259";
     96}
     97
     98void i8259_enable_irqs(uint16_t irqmask)
    8399{
    84100        uint8_t x;
     
    96112}
    97113
    98 void pic_disable_irqs(uint16_t irqmask)
     114void i8259_disable_irqs(uint16_t irqmask)
    99115{
    100116        uint8_t x;
     
    112128}
    113129
    114 void pic_eoi(unsigned int irq)
     130void i8259_eoi(unsigned int irq)
    115131{
    116132        if (irq >= PIC0_IRQ_COUNT)
     
    119135}
    120136
    121 bool pic_is_spurious(unsigned int irq)
     137bool i8259_is_spurious(unsigned int irq)
    122138{
    123139        pio_write_8(&saved_pic0->port1, PIC_OCW3 | PIC_OCW3_READ_ISR);
     
    128144}
    129145
    130 void pic_handle_spurious(unsigned int irq)
     146void i8259_handle_spurious(unsigned int irq)
    131147{
    132148        /* For spurious IRQs from pic1, we need to isssue an EOI to pic0 */
Note: See TracChangeset for help on using the changeset viewer.