blob: 8df1725f467dc7ac416f65648b657c43dc2828b3 [file] [log] [blame]
/* Copyright (c) 2009, 2014 The Regents of the University of California
* Barret Rhoden <brho@cs.berkeley.edu>
* See LICENSE for details.
*
* PIC: 8259 interrupt controller */
#pragma once
#include <ros/common.h>
/* PIC (8259A)
* When looking at the specs, A0 is our CMD line, and A1 is the DATA line. This
* means that blindly writing to PIC1_DATA is an OCW1 (interrupt masks). When
* writing to CMD (A0), the chip can determine betweeb OCW2 and OCW3 by the
* setting of a few specific bits (OCW2 has bit 3 unset, OCW3 has it set). */
#define PIC1_CMD 0x20
#define PIC1_DATA 0x21
#define PIC2_CMD 0xA0
#define PIC2_DATA 0xA1
// These are also hardcoded into the IRQ_HANDLERs of kern/trapentry.S
#define PIC1_OFFSET 0x20
#define PIC2_OFFSET 0x28
#define PIC1_SPURIOUS (7 + PIC1_OFFSET)
#define PIC2_SPURIOUS (7 + PIC2_OFFSET)
#define PIC_EOI 0x20 /* OCW2 EOI */
/* These set the next CMD read to return specific values. Note that the chip
* remembers what setting we had before (IRR or ISR), if you do other reads of
* CMD. (not tested, written in the spec sheet) */
#define PIC_READ_IRR 0x0a /* OCW3 irq ready next CMD read */
#define PIC_READ_ISR 0x0b /* OCW3 irq service next CMD read */
struct irq_handler; /* include loops */
void pic_remap(void);
void pic_mask_irq(struct irq_handler *unused, int trap_nr);
void pic_unmask_irq(struct irq_handler *unused, int trap_nr);
void pic_mask_all(void);
uint16_t pic_get_mask(void);
uint16_t pic_get_irr(void);
uint16_t pic_get_isr(void);
bool pic_check_spurious(int trap_nr);
void pic_send_eoi(int trap_nr);