Subversion Repositories Kolibri OS

Rev

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