Rev 2167 | Rev 2288 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2167 | Rev 2231 | ||
---|---|---|---|
Line 3... | Line 3... | ||
3 | ;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2011. 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 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line -... | Line 7... | ||
- | 7 | ||
- | 8 | ||
- | 9 | iglobal |
|
- | 10 | IRQ_COUNT dd 24 |
|
- | 11 | endg |
|
- | 12 | ||
- | 13 | uglobal |
|
- | 14 | irq_mode rd 1 |
|
- | 15 | IOAPIC_base rd 1 |
|
- | 16 | LAPIC_BASE rd 1 |
|
- | 17 | endg |
|
- | 18 | ||
- | 19 | APIC_ID equ 0x20 |
|
- | 20 | APIC_TPR equ 0x80 |
|
- | 21 | APIC_EOI equ 0xb0 |
|
- | 22 | APIC_LDR equ 0xd0 |
|
- | 23 | APIC_DFR equ 0xe0 |
|
- | 24 | APIC_SVR equ 0xf0 |
|
- | 25 | APIC_ISR equ 0x100 |
|
- | 26 | APIC_ESR equ 0x280 |
|
- | 27 | APIC_ICRL equ 0x300 |
|
- | 28 | APIC_ICRH equ 0x310 |
|
- | 29 | APIC_LVT_LINT0 equ 0x350 |
|
- | 30 | APIC_LVT_LINT1 equ 0x360 |
|
- | 31 | APIC_LVT_err equ 0x370 |
|
- | 32 | ||
- | 33 | ; APIC timer |
|
- | 34 | APIC_LVT_timer equ 0x320 |
|
- | 35 | APIC_timer_div equ 0x3e0 |
|
- | 36 | APIC_timer_init equ 0x380 |
|
- | 37 | APIC_timer_cur equ 0x390 |
|
- | 38 | ; IOAPIC |
|
- | 39 | IOAPIC_ID equ 0x0 |
|
- | 40 | IOAPIC_VER equ 0x1 |
|
- | 41 | IOAPIC_ARB equ 0x2 |
|
- | 42 | IOAPIC_REDTBL equ 0x10 |
|
- | 43 | ||
- | 44 | align 4 |
|
- | 45 | APIC_init: |
|
- | 46 | mov [irq_mode], IRQ_PIC |
|
- | 47 | ||
- | 48 | cmp [acpi_ioapic_base], 0 |
|
- | 49 | jz .no_apic |
|
- | 50 | ||
- | 51 | cmp [acpi_lapic_base], 0 |
|
- | 52 | jz .no_apic |
|
- | 53 | ||
- | 54 | stdcall load_file, dev_data_path |
|
- | 55 | test eax, eax |
|
- | 56 | jz .no_apic |
|
- | 57 | ||
- | 58 | mov [acpi_dev_data], eax |
|
- | 59 | mov [acpi_dev_size], ebx |
|
- | 60 | ||
- | 61 | call IRQ_mask_all |
|
- | 62 | ||
- | 63 | ; IOAPIC init |
|
- | 64 | stdcall map_io_mem, [acpi_ioapic_base], 0x20, PG_SW |
|
- | 65 | mov [IOAPIC_base], eax |
|
- | 66 | ||
- | 67 | mov eax, IOAPIC_VER |
|
- | 68 | call IOAPIC_read |
|
- | 69 | shr eax, 16 |
|
- | 70 | inc al |
|
- | 71 | movzx eax, al |
|
- | 72 | cmp al, IRQ_RESERVED |
|
- | 73 | jbe @f |
|
- | 74 | ||
- | 75 | mov al, IRQ_RESERVED |
|
- | 76 | @@: |
|
- | 77 | mov [IRQ_COUNT], eax |
|
- | 78 | ||
- | 79 | ; Reroute IOAPIC & mask all interrupts |
|
- | 80 | xor ecx, ecx |
|
- | 81 | mov eax, IOAPIC_REDTBL |
|
- | 82 | @@: |
|
- | 83 | mov ebx, eax |
|
- | 84 | call IOAPIC_read |
|
- | 85 | mov ah, 0x09 ; Delivery Mode: Lowest Priority, Destination Mode: Logical |
|
- | 86 | mov al, cl |
|
- | 87 | add al, 0x20 ; vector |
|
- | 88 | or eax, 0x10000 ; Mask Interrupt |
|
- | 89 | cmp ecx, 16 |
|
- | 90 | jb .set |
|
- | 91 | ||
- | 92 | or eax, 0xa000 ;<<< level-triggered active-low for IRQ16+ |
|
- | 93 | .set: |
|
- | 94 | xchg eax, ebx |
|
- | 95 | call IOAPIC_write |
|
- | 96 | inc eax |
|
- | 97 | mov ebx, eax |
|
- | 98 | call IOAPIC_read |
|
- | 99 | or eax, 0xff000000 ; Destination Field |
|
- | 100 | xchg eax, ebx |
|
- | 101 | call IOAPIC_write |
|
- | 102 | inc eax |
|
- | 103 | inc ecx |
|
- | 104 | cmp ecx, [IRQ_COUNT] |
|
- | 105 | jb @b |
|
- | 106 | ||
- | 107 | call LAPIC_init |
|
- | 108 | ||
- | 109 | mov [irq_mode], IRQ_APIC |
|
- | 110 | ||
- | 111 | mov al, 0x70 |
|
- | 112 | out 0x22, al |
|
- | 113 | mov al, 1 |
|
- | 114 | out 0x23, al |
|
- | 115 | ||
- | 116 | call pci_irq_fixup |
|
- | 117 | .no_apic: |
|
- | 118 | ||
- | 119 | ret |
|
- | 120 | ||
- | 121 | ;=========================================================== |
|
- | 122 | align 4 |
|
- | 123 | LAPIC_init: |
|
- | 124 | ; Check MSR support |
|
- | 125 | ;.... |
|
- | 126 | ; Get LAPIC base address |
|
- | 127 | ; mov ecx, 0x1b |
|
- | 128 | ; rdmsr ; it may be replaced to |
|
- | 129 | ; and ax, 0xf000 ; mov eax, 0xfee00000 |
|
- | 130 | ||
- | 131 | stdcall map_io_mem, [acpi_lapic_base], 0x1000, PG_SW |
|
- | 132 | mov [LAPIC_BASE], eax |
|
- | 133 | mov esi, eax |
|
- | 134 | ||
- | 135 | ; Program Destination Format Register for Flat mode. |
|
- | 136 | mov eax, [esi + APIC_DFR] |
|
- | 137 | or eax, 0xf0000000 |
|
- | 138 | mov [esi + APIC_DFR], eax |
|
- | 139 | ||
- | 140 | ; Program Logical Destination Register. |
|
- | 141 | mov eax, [esi + APIC_LDR] |
|
- | 142 | ;and eax, 0xff000000 |
|
- | 143 | and eax, 0x00ffffff |
|
- | 144 | or eax, 0x01000000 ;!!!!!!!!!!!! |
|
- | 145 | mov [esi + APIC_LDR], eax |
|
- | 146 | ||
- | 147 | ; Task Priority Register initialization. |
|
- | 148 | mov eax, [esi + APIC_TPR] |
|
- | 149 | and eax, 0xffffff00 |
|
- | 150 | mov [esi + APIC_TPR], eax |
|
- | 151 | ||
- | 152 | ; Flush the queue |
|
- | 153 | mov edx, 0 |
|
- | 154 | .nxt2: |
|
- | 155 | mov ecx, 32 |
|
- | 156 | mov eax, [esi + APIC_ISR + edx] |
|
- | 157 | .nxt: |
|
- | 158 | shr eax, 1 |
|
- | 159 | jnc @f |
|
- | 160 | mov dword [esi + APIC_EOI], 0 ; EOI |
|
- | 161 | @@: |
|
- | 162 | loop .nxt |
|
- | 163 | ||
- | 164 | add edx, 0x10 |
|
- | 165 | cmp edx, 0x170 |
|
- | 166 | jbe .nxt2 |
|
- | 167 | ||
- | 168 | ; Spurious-Interrupt Vector Register initialization. |
|
- | 169 | mov eax, [esi + APIC_SVR] |
|
- | 170 | or eax, 0x1ff |
|
- | 171 | and eax, 0xfffffdff |
|
- | 172 | mov [esi + APIC_SVR], eax |
|
- | 173 | ||
- | 174 | ; Initialize LVT LINT0 register. (INTR) |
|
- | 175 | mov eax, 0x00700 |
|
- | 176 | ; mov eax, 0x10700 |
|
- | 177 | mov [esi + APIC_LVT_LINT0], eax |
|
- | 178 | ||
- | 179 | ; Initialize LVT LINT1 register. (NMI) |
|
- | 180 | mov eax, 0x00400 |
|
- | 181 | mov [esi + APIC_LVT_LINT1], eax |
|
- | 182 | ||
- | 183 | ; Initialize LVT Error register. |
|
- | 184 | mov eax, [esi + APIC_LVT_err] |
|
- | 185 | or eax, 0x10000 ; bit 16 |
|
- | 186 | mov [esi + APIC_LVT_err], eax |
|
- | 187 | ||
- | 188 | ; LAPIC timer |
|
- | 189 | ; pre init |
|
- | 190 | mov dword[esi + APIC_timer_div], 1011b ; 1 |
|
- | 191 | mov dword[esi + APIC_timer_init], 0xffffffff ; max val |
|
- | 192 | push esi |
|
- | 193 | mov esi, 640 ; wait 0.64 sec |
|
- | 194 | call delay_ms |
|
- | 195 | pop esi |
|
- | 196 | mov eax, [esi + APIC_timer_cur] ; read current tick couner |
|
- | 197 | xor eax, 0xffffffff ; eax = 0xffffffff - eax |
|
- | 198 | shr eax, 6 ; eax /= 64; APIC ticks per 0.01 sec |
|
- | 199 | ||
- | 200 | ; Start (every 0.01 sec) |
|
- | 201 | mov dword[esi + APIC_LVT_timer], 0x30020 ; periodic int 0x20 |
|
- | 202 | mov dword[esi + APIC_timer_init], eax |
|
- | 203 | ret |
|
- | 204 | ||
- | 205 | ;=========================================================== |
|
7 | 206 | ; IOAPIC implementation |
|
8 | align 4 |
207 | align 4 |
- | 208 | IOAPIC_read: |
|
- | 209 | ; in : EAX - IOAPIC register |
|
- | 210 | ; out: EAX - readed value |
|
- | 211 | push esi |
|
- | 212 | mov esi, [IOAPIC_base] |
|
- | 213 | mov [esi], eax |
|
- | 214 | mov eax, [esi + 0x10] |
|
- | 215 | pop esi |
|
Line -... | Line 216... | ||
- | 216 | ret |
|
- | 217 | ||
- | 218 | align 4 |
|
- | 219 | IOAPIC_write: |
|
- | 220 | ; in : EAX - IOAPIC register |
|
- | 221 | ; EBX - value |
|
- | 222 | ; out: none |
|
- | 223 | push esi |
|
- | 224 | mov esi, [IOAPIC_base] |
|
- | 225 | mov [esi], eax |
|
- | 226 | mov [esi + 0x10], ebx |
|
- | 227 | pop esi |
|
- | 228 | ret |
|
- | 229 | ;=========================================================== |
|
- | 230 | ; Remap all IRQ to 0x20+ Vectors |
|
- | 231 | ; IRQ0 to vector 0x20, IRQ1 to vector 0x21.... |
|
9 | rerouteirqs: |
232 | align 4 |
10 | 233 | PIC_init: |
|
11 | cli |
234 | cli |
12 | mov al,0x11 ; icw4, edge triggered |
235 | mov al,0x11 ; icw4, edge triggered |
Line 25... | Line 248... | ||
25 | 248 | ||
26 | mov al,0x01 ; 8086 mode |
249 | mov al,0x01 ; 8086 mode |
27 | out 0x21,al |
250 | out 0x21,al |
Line 28... | Line 251... | ||
28 | out 0xA1,al |
251 | out 0xA1,al |
29 | 252 | ||
30 | mov al,255 ; mask all irq's |
253 | call IRQ_mask_all |
Line -... | Line 254... | ||
- | 254 | ; mov dword[irq_type_to_set], IRQ_TYPE_PIC |
|
- | 255 | ret |
|
- | 256 | ||
- | 257 | ; ----------------------------------------- |
|
31 | out 0xA1,al |
258 | ; TIMER SET TO 1/100 S |
- | 259 | align 4 |
|
- | 260 | PIT_init: |
|
- | 261 | mov al,0x34 ; set to 100Hz |
|
- | 262 | out 0x43,al |
|
32 | out 0x21,al |
263 | mov al,0x9b ; lsb 1193180 / 1193 |
- | 264 | out 0x40,al |
|
- | 265 | mov al,0x2e ; msb |
|
- | 266 | out 0x40,al |
|
- | 267 | ret |
|
- | 268 | ||
- | 269 | ; ----------------------------------------- |
|
- | 270 | align 4 |
|
- | 271 | unmask_timer: |
|
- | 272 | cmp [irq_mode], IRQ_APIC |
|
- | 273 | je @f |
|
- | 274 | ||
- | 275 | stdcall enable_irq, 0 |
|
- | 276 | ret |
|
- | 277 | @@: |
|
- | 278 | ; use PIT |
|
- | 279 | ; in some systems PIT no connected to IOAPIC |
|
- | 280 | ; mov eax, 0x14 |
|
- | 281 | ; call IOAPIC_read |
|
- | 282 | ; mov ah, 0x09 ; Delivery Mode: Lowest Priority, Destination Mode: Logical |
|
- | 283 | ; mov al, 0x20 |
|
- | 284 | ; or eax, 0x10000 ; Mask Interrupt |
|
- | 285 | ; mov ebx, eax |
|
- | 286 | ; mov eax, 0x14 |
|
- | 287 | ; call IOAPIC_write |
|
- | 288 | ; stdcall enable_irq, 2 |
|
- | 289 | ; ret |
|
- | 290 | ||
- | 291 | ; use LAPIC timer |
|
- | 292 | mov esi, [LAPIC_BASE] |
|
- | 293 | mov eax, [esi + APIC_LVT_timer] |
|
- | 294 | and eax, 0xfffeffff |
|
- | 295 | mov [esi + APIC_LVT_timer], eax |
|
- | 296 | ret |
|
- | 297 | ||
- | 298 | ; ----------------------------------------- |
|
- | 299 | ; Disable all IRQ |
|
- | 300 | align 4 |
|
- | 301 | IRQ_mask_all: |
|
- | 302 | cmp [irq_mode], IRQ_APIC |
|
33 | 303 | je .APIC |
|
- | 304 | ||
- | 305 | mov al, 0xFF |
|
- | 306 | out 0x21, al |
|
- | 307 | out 0xA1, al |
|
- | 308 | mov ecx,0x1000 |
|
- | 309 | ret |
|
- | 310 | .APIC: |
|
- | 311 | mov ecx, [IRQ_COUNT] |
|
- | 312 | mov eax, 0x10 |
|
- | 313 | @@: |
|
- | 314 | mov ebx, eax |
|
- | 315 | call IOAPIC_read |
|
- | 316 | or eax, 0x10000 ; bit 16 |
|
- | 317 | xchg eax, ebx |
|
- | 318 | call IOAPIC_write |
|
34 | mov al,255 ; mask all irq's |
319 | inc eax |
Line -... | Line 320... | ||
- | 320 | inc eax |
|
- | 321 | loop @b |
|
- | 322 | ret |
|
- | 323 | ||
- | 324 | ; ----------------------------------------- |
|
- | 325 | ; End Of Interrupt |
|
- | 326 | ; cl - IRQ number |
|
Line -... | Line 327... | ||
- | 327 | align 4 |
|
- | 328 | irq_eoi: ; __fastcall |
|
- | 329 | cmp [irq_mode], IRQ_APIC |
|
- | 330 | je .APIC |
|
- | 331 | ||
- | 332 | cmp cl, 8 |
|
- | 333 | mov al, 0x20 |
|
- | 334 | jb @f |
|
- | 335 | out 0xa0, al |
|
- | 336 | @@: |
|
- | 337 | out 0x20, al |
|
- | 338 | ret |
|
- | 339 | ||
- | 340 | .APIC: |
|
- | 341 | mov eax, [LAPIC_BASE] |
|
35 | out 0xA1,al |
342 | mov dword [eax + APIC_EOI], 0 ; EOI |
36 | out 0x21,al |
343 | ret |
37 | ret |
344 | |
38 | 345 | ; ----------------------------------------- |
|
- | 346 | ; from dll.inc |
|
- | 347 | align 4 |
|
39 | 348 | proc enable_irq stdcall, irq_line:dword |
|
40 | align 4 |
349 | mov ebx, [irq_line] |
41 | ;proc enable_irq stdcall, irq_line:dword |
350 | cmp [irq_mode], IRQ_APIC |
- | 351 | je .APIC |
|
42 | enable_irq: ; FIXME make fastcall |
352 | |
43 | mov ebx, [esp+4] ;irq_line |
353 | mov edx, 0x21 |
44 | mov edx, 0x21 |
354 | cmp ebx, 8 |
45 | cmp ebx, 8 |
355 | jb @F |
46 | jb @F |
356 | |
47 | mov edx, 0xA1 |
357 | mov edx, 0xA1 |
48 | sub ebx,8 |
358 | sub ebx,8 |
- | 359 | @@: |
|
- | 360 | in al,dx |
|
- | 361 | btr eax, ebx |
|
- | 362 | out dx, al |
|
- | 363 | ret |
|
- | 364 | .APIC: |
|
- | 365 | shl ebx, 1 |
|
- | 366 | add ebx, 0x10 |
|
- | 367 | mov eax, ebx |
|
49 | @@: |
368 | call IOAPIC_read |
Line 50... | Line 369... | ||
50 | in al,dx |
369 | and eax, 0xfffeffff ; bit 16 |
- | 370 | xchg eax, ebx |
|
- | 371 | call IOAPIC_write |
|
- | 372 | ret |
|
- | 373 | endp |
|
51 | btr eax, ebx |
374 | |
- | 375 | align 4 |
|
- | 376 | pci_irq_fixup: |
|
- | 377 | ||
- | 378 | push ebp |
|
52 | out dx, al |
379 | |
- | 380 | mov esi, [acpi_dev_data] |
|
53 | ret 4 |
381 | mov ebx, [acpi_dev_size] |
- | 382 | ||
- | 383 | lea edi, [esi+ebx] |
|
54 | 384 | ||
- | 385 | .iterate: |
|
- | 386 | ||
55 | 387 | cmp esi, edi |
|
- | 388 | jae .done |
|
56 | align 4 |
389 | |
- | 390 | mov eax, [esi] |
|
- | 391 | ||
- | 392 | cmp eax, -1 |
|
- | 393 | je .done |
|
- | 394 | ||
- | 395 | movzx ebx, al |
|
- | 396 | movzx ebp, ah |
|
- | 397 | ||
- | 398 | stdcall pci_read32, ebp, ebx, 0 |
|
57 | ;proc irq_eoi fastcall, irq_line:dword |
399 | |
58 | irq_eoi: |
400 | cmp eax, [esi+4] |
- | 401 | jne .skip |
|
- | 402 | ||
- | 403 | mov eax, [esi+8] |
|
- | 404 | stdcall pci_write8, ebp, ebx, 0x3C, eax |
|
- | 405 | .skip: |
|
59 | cmp cl, 8 |
406 | add esi, 16 |
- | 407 | jmp .iterate |
|
- | 408 | ||
- | 409 | .done: |
|
- | 410 | .fail: |
|
- | 411 | pop ebp |