More ioapic support, will it ever end.
[akaros.git] / kern / arch / x86 / ioapic.h
1 /* 
2  * This file is part of the UCB release of Plan 9. It is subject to the license
3  * terms in the LICENSE file found in the top-level directory of this
4  * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
5  * part of the UCB release of Plan 9, including this file, may be copied,
6  * modified, propagated, or distributed except according to the terms contained
7  * in the LICENSE file.
8  */
9
10 #ifndef ROS_KERN_IOAPIC_H
11 #define ROS_KERN_IOAPIC_H
12 struct bus {
13         uint8_t type;
14         uint8_t busno;
15         uint8_t po;
16         uint8_t el;
17
18         struct aintr*   aintr;                  /* interrupts tied to this bus */
19         struct bus*     next;
20 };
21
22 struct aintr {
23         // no idea yet. PCMPintr* intr;
24         struct apic*    apic;
25         struct aintr*   next;
26 };
27
28 struct apic {
29         int     useable;
30         int     type;
31         int     apicno;
32         uint32_t*       addr;                   /* register base address */
33         uint32_t        paddr;
34         int     flags;                  /* PcmpBP|PcmpEN */
35
36         //spinlock_t lock;              /* I/O APIC: register access */
37         int     mre;                    /* I/O APIC: maximum redirection entry */
38
39         int     lintr[2];               /* Local APIC */
40         int     machno;
41
42         int     online;
43 };
44
45 enum {
46         MaxAPICNO       = 254,          /* 255 is physical broadcast */
47 };
48
49 enum {                                  /* I/O APIC registers */
50         IoapicID        = 0x00,         /* ID */
51         IoapicVER       = 0x01,         /* version */
52         IoapicARB       = 0x02,         /* arbitration ID */
53         IoapicRDT       = 0x10,         /* redirection table */
54 };
55
56 /*
57  * Common bits for
58  *      I/O APIC Redirection Table Entry;
59  *      Local APIC Local Interrupt Vector Table;
60  *      Local APIC Inter-Processor Interrupt;
61  *      Local APIC Timer Vector Table.
62  */
63 enum {
64         ApicFIXED       = 0x00000000,   /* [10:8] Delivery Mode */
65         ApicLOWEST      = 0x00000100,   /* Lowest priority */
66         ApicSMI         = 0x00000200,   /* System Management Interrupt */
67         ApicRR          = 0x00000300,   /* Remote Read */
68         ApicNMI         = 0x00000400,
69         ApicINIT        = 0x00000500,   /* INIT/RESET */
70         ApicSTARTUP     = 0x00000600,   /* Startup IPI */
71         ApicExtINT      = 0x00000700,
72
73         ApicPHYSICAL    = 0x00000000,   /* [11] Destination Mode (RW) */
74         ApicLOGICAL     = 0x00000800,
75
76         ApicDELIVS      = 0x00001000,   /* [12] Delivery Status (RO) */
77         ApicHIGH        = 0x00000000,   /* [13] Interrupt Input Pin Polarity (RW) */
78         ApicLOW         = 0x00002000,
79         ApicRemoteIRR   = 0x00004000,   /* [14] Remote IRR (RO) */
80         ApicEDGE        = 0x00000000,   /* [15] Trigger Mode (RW) */
81         ApicLEVEL       = 0x00008000,
82         ApicIMASK       = 0x00010000,   /* [16] Interrupt Mask */
83         IOAPIC_PBASE    = 0xfec00000, /* default *physical* address */
84 };
85
86 extern void ioapicinit(struct apic*, int);
87 extern void ioapicrdtr(struct apic*, int unused_int, int*, int*);
88 extern void ioapicrdtw(struct apic*, int unused_int, int, int);
89
90 #endif /* ROS_KERN_IOAPIC_H */