Subversion Repositories Kolibri OS

Rev

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: 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