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