Subversion Repositories Kolibri OS

Rev

Rev 8111 | Rev 8130 | Go to most recent revision | 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$
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
163
acpi_get_root_ptr:
164
        mov     eax, [acpi_rsdp_base]
165
        ret
166
 
167
align 4
168
rsdt_find:           ;ecx= rsdt edx= SIG
169
        push    ebx
170
        push    esi
171
 
172
        lea     ebx, [ecx+ACPI_RSDT.Entry]
173
        mov     esi, [ecx+ACPI_RSDT.Length]
174
        add     esi, ecx
175
align 4
176
.next:
177
        mov     eax, [ebx]
178
        cmp     [eax], edx
179
        je      .done
180
 
181
        add     ebx, 4
182
        cmp     ebx, esi
183
        jb      .next
184
 
185
        xor     eax, eax
186
        pop     esi
187
        pop     ebx
188
        ret
189
 
190
.done:
191
        mov     eax, [ebx]
192
        pop     esi
193
        pop     ebx
194
        ret
195
 
196
align 4
197
check_acpi:
198
        cmp     [acpi_rsdp_base], 0
199
        jz      .done
200
        stdcall map_io_mem, [acpi_rsdp_base], sizeof.ACPI_RSDP, \
201
                PG_GLOBAL+PAT_WB+PG_READ
202
        mov     [acpi_rsdp_base], eax
203
.rsdp_done:
204
        cmp     [acpi_rsdt_base], 0
205
        jz      .rsdt_done
206
        stdcall map_io_mem, [acpi_rsdt_base], [acpi_rsdt_size], \
207
                PG_GLOBAL+PAT_WB+PG_READ
208
        mov     [acpi_rsdt_base], eax
209
.rsdt_done:
210
        cmp     [acpi_fadt_base], 0
211
        jz      .fadt_done
212
        stdcall map_io_mem, [acpi_fadt_base], [acpi_fadt_size], \
213
                PG_GLOBAL+PAT_WB+PG_READ
214
        mov     [acpi_fadt_base], eax
215
.fadt_done:
216
        cmp     [acpi_hpet_base], 0
217
        jz      .hpet_done
218
        stdcall map_io_mem, [acpi_hpet_base], [acpi_hpet_size], \
219
                PG_GLOBAL+PAT_WB+PG_READ
220
        mov     [acpi_hpet_base], eax
221
        mov     eax, [eax+ACPI_HPET.Base.Address.lo]
222
        mov     [hpet_base], eax
223
.hpet_done:
224
        cmp     [acpi_madt_base], 0
225
        jz      .madt_done
226
        stdcall map_io_mem, [acpi_madt_base], [acpi_madt_size], \
227
                PG_GLOBAL+PAT_WB+PG_READ
228
        mov     [acpi_madt_base], eax
229
 
230
        mov     ecx, [eax+ACPI_MADT.Local_IC_Addr]
231
        mov     [acpi_lapic_base], ecx
8119 dunkaist 232
        push    eax
233
        stdcall map_io_mem, ecx, 0x1000, PG_GLOBAL+PG_NOCACHE+PG_SWR
234
        mov     [LAPIC_BASE], eax
235
        mov     ecx, eax
236
        pop     eax
8111 dunkaist 237
 
238
        mov     edi, smpt
239
        mov     ebx, [ecx+APIC_ID]
240
        shr     ebx, 24              ; read APIC ID
241
 
242
        mov     [edi], ebx           ; bootstrap always first
243
        inc     [cpu_count]
244
        add     edi, 4
245
 
246
        mov     [ioapic_cnt], 0
247
        lea     edx, [eax+ACPI_MADT.IntController]
248
        mov     ecx, [eax+ACPI_MADT.Length]
249
        add     ecx, eax
250
.check:
251
        mov     eax, [edx]
252
        cmp     al, 0
253
        je      .lapic
254
        cmp     al, 1
255
        je      .io_apic
256
        jmp     .next
257
.lapic:
258
        shr     eax, 24              ; get APIC ID
259
        cmp     eax, ebx             ; skip self
260
        je      .next
261
 
262
        test    [edx+4], byte 1      ; is enabled ?
263
        jz      .next
264
 
265
        cmp     [cpu_count], 16
266
        jae     .next
267
 
268
        stosd                        ; store APIC ID
269
        inc     [cpu_count]
270
        jmp     .next
271
 
272
.io_apic:
273
        mov     eax, [ioapic_cnt]
274
        push    dword[edx+4]
275
        pop     [acpi_ioapic_base+eax*4]
276
        push    dword[edx+8]
277
        pop     [ioapic_gsi_base+eax*4]
278
        inc     [ioapic_cnt]
279
        jmp     .next
280
 
281
.next:
282
        mov     eax, [edx]
283
        movzx   eax, ah
284
        add     edx, eax
285
        cmp     edx, ecx
286
        jb      .check
287
.madt_done:
288
 
289
        xor     ecx, ecx
290
.next_ssdt:
291
        cmp     ecx, [acpi_ssdt_cnt]
292
        jz      .ssdt_done
293
        push    ecx
294
        stdcall map_io_mem, [acpi_ssdt_base+ecx*4], [acpi_ssdt_size+ecx*4], \
295
                PG_GLOBAL+PAT_WB+PG_READ
296
        pop     ecx
297
        mov     [acpi_ssdt_base+ecx*4], eax
298
        inc     ecx
299
        jmp     .next_ssdt
300
.ssdt_done:
301
 
302
.done:
303
        ret