Subversion Repositories Kolibri OS

Rev

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