Rev 8991 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
8111 | dunkaist | 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
||
3 | ;; Copyright (C) KolibriOS team 2004-2020. All rights reserved. ;; |
||
4 | ;; Distributed under terms of the GNU General Public License ;; |
||
5 | ;; ;; |
||
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
7 | |||
8 | $Revision: 8991 $ |
||
9 | |||
10 | ; ACPI Generic Address Structure |
||
11 | struct GAS |
||
12 | ASID db ? ; address space id |
||
13 | BitWidth db ? |
||
14 | BitOffset db ? |
||
15 | AccessSize db ? |
||
16 | Address DQ ? |
||
17 | ends |
||
18 | |||
19 | ASID.SYSTEM_MEMORY = 0 |
||
20 | ASID.SYSTEM_IO = 1 |
||
21 | ASID.PCI_CONFIG = 2 |
||
22 | ASID.PCI_EC = 3 |
||
23 | ASID.PCI_SMBUS = 4 |
||
24 | |||
25 | ACCESS_SIZE.UNDEFINED = 0 |
||
26 | ACCESS_SIZE.BYTE = 1 |
||
27 | ACCESS_SIZE.WORD = 2 |
||
28 | ACCESS_SIZE.DWORD = 3 |
||
29 | ACCESS_SIZE.QWORD = 4 |
||
30 | |||
31 | |||
32 | struct ACPI_RSDP |
||
33 | Signature DQ ? |
||
34 | Checksum db ? |
||
35 | OEMID rb 6 |
||
36 | Revision db ? |
||
37 | RsdtAddress dd ? |
||
38 | ; for Revision >= 2 |
||
39 | Length dd ? |
||
40 | XsdtAddress DQ ? |
||
41 | ExtChecksum db ? |
||
42 | Reserved rb 3 |
||
43 | ends |
||
44 | |||
45 | struct ACPI_TABLE ; DESCRIPTION_HEADER |
||
46 | Signature dd ? |
||
47 | Length dd ? |
||
48 | Revision db ? |
||
49 | Checksum db ? |
||
50 | OEMID rb 6 |
||
51 | OEMTableID rb 8 |
||
52 | OEMRevision rb 4 |
||
53 | CreatorID rb 4 |
||
54 | CreatorRevision rb 4 |
||
55 | ends |
||
56 | |||
57 | struct ACPI_RSDT ACPI_TABLE |
||
58 | Entry rd (0x1000-sizeof.ACPI_TABLE)/4 |
||
59 | ends |
||
60 | |||
61 | struct ACPI_HPET ACPI_TABLE |
||
62 | ID dd ? |
||
63 | Base GAS |
||
64 | SeqNumber db ? |
||
65 | MainCounterMinimum dw ? |
||
66 | PageProtectionOEM db ? |
||
67 | ends |
||
68 | |||
69 | struct ACPI_MADT ACPI_TABLE |
||
70 | Local_IC_Addr dd ? |
||
71 | Flags dd ? |
||
72 | IntController rb 0x1000-sizeof.ACPI_TABLE-ACPI_MADT.IntController |
||
73 | ends |
||
74 | |||
75 | struct ACPI_FADT ACPI_TABLE |
||
76 | FirmwareCtrl dd ? |
||
77 | DSDT dd ? |
||
78 | db ? |
||
79 | PreferredPMProfile db ? |
||
80 | SCI_INT dw ? |
||
81 | SMI_CMD dd ? |
||
82 | ACPI_ENABLE db ? |
||
83 | ACPI_DISABLE db ? |
||
84 | S4BIOS_REQ db ? |
||
85 | PSTATE_CNT db ? |
||
86 | PM1a_EVT_BLK dd ? |
||
87 | PM1b_EVT_BLK dd ? |
||
88 | PM1a_CNT_BLK dd ? |
||
89 | PM1b_CNT_BLK dd ? |
||
90 | PM2_CNT_BLK dd ? |
||
91 | PM_TMR_BLK dd ? |
||
92 | GPE0_BLK dd ? |
||
93 | GPE1_BLK dd ? |
||
94 | PM1_EVT_LEN db ? |
||
95 | PM1_CNT_LEN db ? |
||
96 | PM2_CNT_LEN db ? |
||
97 | PM_TMR_LEN db ? |
||
98 | GPE0_BLK_LEN db ? |
||
99 | GPE1_BLK_LEN db ? |
||
100 | GPE1_BASE db ? |
||
101 | CST_CNT db ? |
||
102 | P_LVL2_LAT dw ? |
||
103 | P_LVL3_LAT dw ? |
||
104 | FLUSH_SIZE dw ? |
||
105 | FLUSH_STRIDE dw ? |
||
106 | DUTY_OFFSET db ? |
||
107 | DUTY_WIDTH db ? |
||
108 | DAY_ALRM db ? |
||
109 | MON_ALRM db ? |
||
110 | CENTURY db ? |
||
111 | IAPC_BOOT_ARCH dw ? |
||
112 | db ? |
||
113 | Flags dd ? |
||
114 | RESET_REG GAS |
||
115 | RESET_VALUE db ? |
||
116 | ARM_BOOT_ARCH dw ? |
||
117 | FADT_Minor_Version db ? |
||
118 | X_FIRMWARE_CTRL DQ ? |
||
119 | X_DSDT DQ ? |
||
120 | X_PM1a_EVT_BLK GAS |
||
121 | X_PM1b_EVT_BLK GAS |
||
122 | X_PM1a_CNT_BLK GAS |
||
123 | X_PM1b_CNT_BLK GAS |
||
124 | X_PM2_CNT_BLK GAS |
||
125 | X_PM_TMR_BLK GAS |
||
126 | X_GPE0_BLK GAS |
||
127 | X_GPE1_BLK GAS |
||
128 | SLEEP_CONTROL_REG GAS |
||
129 | SLEEP_STATUS_REG GAS |
||
130 | HypervisorVendorID rb 8 |
||
131 | ends |
||
132 | |||
133 | MAX_SSDTS = 32 |
||
134 | |||
135 | iglobal |
||
136 | align 4 |
||
137 | acpi_lapic_base dd 0xfee00000 ; default local apic base |
||
138 | endg |
||
139 | |||
140 | uglobal |
||
141 | align 4 |
||
142 | acpi_dev_data rd 1 |
||
143 | acpi_dev_size rd 1 |
||
144 | |||
145 | acpi_rsdp_base rd 1 |
||
146 | acpi_rsdt_base rd 1 |
||
147 | acpi_rsdt_size rd 1 |
||
148 | acpi_fadt_base rd 1 |
||
149 | acpi_fadt_size rd 1 |
||
150 | acpi_ssdt_base rd MAX_SSDTS |
||
151 | acpi_ssdt_size rd MAX_SSDTS |
||
152 | acpi_ssdt_cnt rd 1 |
||
153 | acpi_madt_base rd 1 |
||
154 | acpi_madt_size rd 1 |
||
155 | acpi_ioapic_base rd MAX_IOAPICS |
||
156 | acpi_hpet_base rd 1 |
||
157 | acpi_hpet_size rd 1 |
||
158 | cpu_count rd 1 |
||
159 | smpt rd 16 |
||
160 | endg |
||
161 | |||
162 | align 4 |
||
8991 | Boppan | 163 | ; @returns ACPI Root System Description Pointer |
8111 | dunkaist | 164 | acpi_get_root_ptr: |
165 | mov eax, [acpi_rsdp_base] |
||
166 | ret |
||
167 | |||
168 | align 4 |
||
169 | rsdt_find: ;ecx= rsdt edx= SIG |
||
170 | push ebx |
||
171 | push esi |
||
172 | |||
173 | lea ebx, [ecx+ACPI_RSDT.Entry] |
||
174 | mov esi, [ecx+ACPI_RSDT.Length] |
||
175 | add esi, ecx |
||
176 | align 4 |
||
177 | .next: |
||
178 | mov eax, [ebx] |
||
179 | cmp [eax], edx |
||
180 | je .done |
||
181 | |||
182 | add ebx, 4 |
||
183 | cmp ebx, esi |
||
184 | jb .next |
||
185 | |||
186 | xor eax, eax |
||
187 | pop esi |
||
188 | pop ebx |
||
189 | ret |
||
190 | |||
191 | .done: |
||
192 | mov eax, [ebx] |
||
193 | pop esi |
||
194 | pop ebx |
||
195 | ret |
||
196 | |||
197 | align 4 |
||
198 | check_acpi: |
||
199 | cmp [acpi_rsdp_base], 0 |
||
200 | jz .done |
||
201 | stdcall map_io_mem, [acpi_rsdp_base], sizeof.ACPI_RSDP, \ |
||
202 | PG_GLOBAL+PAT_WB+PG_READ |
||
203 | mov [acpi_rsdp_base], eax |
||
204 | .rsdp_done: |
||
205 | cmp [acpi_rsdt_base], 0 |
||
206 | jz .rsdt_done |
||
207 | stdcall map_io_mem, [acpi_rsdt_base], [acpi_rsdt_size], \ |
||
208 | PG_GLOBAL+PAT_WB+PG_READ |
||
209 | mov [acpi_rsdt_base], eax |
||
210 | .rsdt_done: |
||
211 | cmp [acpi_fadt_base], 0 |
||
212 | jz .fadt_done |
||
213 | stdcall map_io_mem, [acpi_fadt_base], [acpi_fadt_size], \ |
||
214 | PG_GLOBAL+PAT_WB+PG_READ |
||
215 | mov [acpi_fadt_base], eax |
||
216 | .fadt_done: |
||
217 | cmp [acpi_hpet_base], 0 |
||
218 | jz .hpet_done |
||
219 | stdcall map_io_mem, [acpi_hpet_base], [acpi_hpet_size], \ |
||
220 | PG_GLOBAL+PAT_WB+PG_READ |
||
221 | mov [acpi_hpet_base], eax |
||
222 | mov eax, [eax+ACPI_HPET.Base.Address.lo] |
||
223 | mov [hpet_base], eax |
||
224 | .hpet_done: |
||
225 | cmp [acpi_madt_base], 0 |
||
226 | jz .madt_done |
||
227 | stdcall map_io_mem, [acpi_madt_base], [acpi_madt_size], \ |
||
228 | PG_GLOBAL+PAT_WB+PG_READ |
||
229 | mov [acpi_madt_base], eax |
||
230 | |||
231 | mov ecx, [eax+ACPI_MADT.Local_IC_Addr] |
||
232 | mov [acpi_lapic_base], ecx |
||
8119 | dunkaist | 233 | push eax |
234 | stdcall map_io_mem, ecx, 0x1000, PG_GLOBAL+PG_NOCACHE+PG_SWR |
||
235 | mov [LAPIC_BASE], eax |
||
236 | mov ecx, eax |
||
237 | pop eax |
||
8111 | dunkaist | 238 | |
239 | mov edi, smpt |
||
240 | mov ebx, [ecx+APIC_ID] |
||
241 | shr ebx, 24 ; read APIC ID |
||
242 | |||
243 | mov [edi], ebx ; bootstrap always first |
||
244 | inc [cpu_count] |
||
245 | add edi, 4 |
||
246 | |||
247 | mov [ioapic_cnt], 0 |
||
248 | lea edx, [eax+ACPI_MADT.IntController] |
||
249 | mov ecx, [eax+ACPI_MADT.Length] |
||
250 | add ecx, eax |
||
251 | .check: |
||
252 | mov eax, [edx] |
||
253 | cmp al, 0 |
||
254 | je .lapic |
||
255 | cmp al, 1 |
||
256 | je .io_apic |
||
257 | jmp .next |
||
258 | .lapic: |
||
259 | shr eax, 24 ; get APIC ID |
||
260 | cmp eax, ebx ; skip self |
||
261 | je .next |
||
262 | |||
263 | test [edx+4], byte 1 ; is enabled ? |
||
264 | jz .next |
||
265 | |||
266 | cmp [cpu_count], 16 |
||
267 | jae .next |
||
268 | |||
269 | stosd ; store APIC ID |
||
270 | inc [cpu_count] |
||
271 | jmp .next |
||
272 | |||
273 | .io_apic: |
||
274 | mov eax, [ioapic_cnt] |
||
275 | push dword[edx+4] |
||
276 | pop [acpi_ioapic_base+eax*4] |
||
277 | push dword[edx+8] |
||
278 | pop [ioapic_gsi_base+eax*4] |
||
279 | inc [ioapic_cnt] |
||
280 | jmp .next |
||
281 | |||
282 | .next: |
||
283 | mov eax, [edx] |
||
284 | movzx eax, ah |
||
285 | add edx, eax |
||
286 | cmp edx, ecx |
||
287 | jb .check |
||
288 | .madt_done: |
||
289 | |||
290 | xor ecx, ecx |
||
291 | .next_ssdt: |
||
292 | cmp ecx, [acpi_ssdt_cnt] |
||
293 | jz .ssdt_done |
||
294 | push ecx |
||
295 | stdcall map_io_mem, [acpi_ssdt_base+ecx*4], [acpi_ssdt_size+ecx*4], \ |
||
296 | PG_GLOBAL+PAT_WB+PG_READ |
||
297 | pop ecx |
||
298 | mov [acpi_ssdt_base+ecx*4], eax |
||
299 | inc ecx |
||
300 | jmp .next_ssdt |
||
301 | .ssdt_done: |
||
302 | |||
303 | .done: |
||
304 | ret |