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