5562fc871c57ec328c304faccf3cf254aed58ec0
[akaros.git] / kern / include / mptables.h
1 #ifndef ROS_INC_MPTABLES_H
2 #define ROS_INC_MPTABLES_H
3
4 #include <arch/types.h>
5 #include <trap.h>
6 #include <pmap.h>
7
8 #define mptables_info(...)  cprintf(__VA_ARGS__)  
9 #define mptables_dump(...)  //cprintf(__VA_ARGS__)  
10
11
12 #define MP_SIG                  0x5f504d5f      /* _MP_ */
13
14 #define BIOS_ROM_BASE   0xf0000
15 #define BIOS_ROM_BOUND  0xffff0 // Inclusive.
16
17 #define EBDA_POINTER    0x040e // Bound is dynamic. In first KB
18 #define EBDA_SIZE               1024
19
20 #define TOPOFMEM_POINTER        0x0413          /* BIOS: base memory size */
21 #define IMCRP_MASK              0x80
22
23 #define DEFAULT_TOPOFMEM        0xa0000
24
25 #define NUM_ENTRY_TYPES 5
26
27 enum interrupt_modes {
28         PIC, // PIC Mode (Bocsh, KVM)
29         VW,  // Virtural Wire Mode (Dev Boxes)
30         SIO  // Once we fix up the ioapic, shift to this mode, sym io.
31 };
32
33 enum entry_types {
34         PROC =          0,
35         BUS  =          1,
36         IOAPIC =        2,
37         INT =           3,
38         LINT =          4
39 };
40
41 enum busTypes {
42     CBUS = 1,
43     CBUSII = 2,
44     EISA = 3,
45     ISA = 6,
46     PCI = 13,
47     XPRESS = 18,
48     MAX_BUSTYPE = 18,
49     UNKNOWN_BUSTYPE = 0xff
50 };
51
52 typedef struct BUSTYPENAME {
53     uint8_t     type;
54     char        name[ 7 ];
55 } busTypeName;
56
57 static busTypeName busTypeTable[] =
58 {
59     { CBUS,             "CBUS"   },
60     { CBUSII,           "CBUSII" },
61     { EISA,             "EISA"   },
62     { UNKNOWN_BUSTYPE,  "---"    },
63     { UNKNOWN_BUSTYPE,  "---"    },
64     { ISA,              "ISA"    },
65     { UNKNOWN_BUSTYPE,  "---"    },
66     { UNKNOWN_BUSTYPE,  "---"    },
67     { UNKNOWN_BUSTYPE,  "---"    },
68     { UNKNOWN_BUSTYPE,  "---"    },
69     { UNKNOWN_BUSTYPE,  "---"    },
70     { UNKNOWN_BUSTYPE,  "---"    },
71     { PCI,              "PCI"    },
72     { UNKNOWN_BUSTYPE,  "---"    },
73     { UNKNOWN_BUSTYPE,  "---"    },
74     { UNKNOWN_BUSTYPE,  "---"    },
75     { UNKNOWN_BUSTYPE,  "---"    },
76     { UNKNOWN_BUSTYPE,  "---"    },
77     { UNKNOWN_BUSTYPE,  "---"    }
78 };
79
80 typedef struct TABLE_ENTRY {
81     uint8_t     type;
82     uint8_t     length;
83     char        name[ 32 ];
84 } tableEntry;
85
86 /* MP Floating Pointer Structure */
87 typedef struct MPFPS {
88     char        signature[ 4 ];
89     void*       pap;
90     uint8_t     length;
91     uint8_t     spec_rev;
92     uint8_t     checksum;
93     uint8_t     mpfb1;
94     uint8_t     mpfb2;
95     uint8_t     mpfb3;
96     uint8_t     mpfb4;
97     uint8_t     mpfb5;
98 } mpfps_t;
99
100
101 /* MP Configuration Table Header */
102 typedef struct MPCTH {
103     char        signature[ 4 ];
104     uint16_t    base_table_length;
105     uint8_t             spec_rev;
106     uint8_t             checksum;
107     uint8_t             oem_id[ 8 ];
108     uint8_t             product_id[ 12 ];
109     void*               oem_table_pointer;
110     uint16_t    oem_table_size;
111     uint16_t    entry_count;
112     void*               apic_address;
113     uint16_t    extended_table_length;
114     uint8_t             extended_table_checksum;
115     uint8_t             reserved;
116 } mpcth_t;
117
118
119 typedef struct PROCENTRY {
120     uint8_t             type;
121     uint8_t             apicID;
122     uint8_t             apicVersion;
123     uint8_t             cpuFlags;
124     uint32_t    cpuSignature;
125     uint32_t    featureFlags;
126     uint32_t    reserved1;
127     uint32_t    reserved2;
128 } proc_entry;
129
130 typedef struct BUSENTRY {
131     uint8_t     type;
132     uint8_t     busID;
133     char        busType[ 6 ];
134 } bus_entry;
135
136 typedef struct IOAPICENTRY {
137     uint8_t     type;
138     uint8_t     apicID;
139     uint8_t     apicVersion;
140     uint8_t     apicFlags;
141     void*       apicAddress;
142 } ioapic_entry;
143
144 typedef struct INTENTRY {
145     uint8_t             type;
146     uint8_t             intType;
147     uint16_t    intFlags;
148     uint8_t             srcBusID;
149     uint8_t             srcBusIRQ;
150     uint8_t             dstApicID;
151     uint8_t             dstApicINT;
152 } int_entry;
153
154 typedef struct PCIINTENTRY {
155     uint16_t            dstApicID; // A value of 256 or greater means not valid.
156     uint8_t             dstApicINT;
157 } pci_int_entry;
158
159 typedef pci_int_entry isa_int_entry;
160
161 typedef struct PCIINTGROUP {
162         pci_int_entry intn[4];
163 } pci_int_group;
164
165 void mptables_parse();
166 mpfps_t *find_floating_pointer(physaddr_t base, physaddr_t bound);
167 bool checksum(physaddr_t addr, uint32_t len);
168 void configuration_parse(physaddr_t conf_addr);
169
170 void proc_parse(proc_entry* entry, uint32_t count);
171 void bus_parse(bus_entry* entry, uint32_t count);
172 void ioapic_parse(ioapic_entry* entry, uint32_t count);
173 void int_parse(int_entry* entry, uint32_t count);
174 void lint_parse(int_entry* entry, uint32_t count);
175
176 #endif /* !ROS_INC_MPTABLES_H */