|  | /* 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); |