1,6 → 1,6 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; ;; |
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;; |
;; Copyright (C) KolibriOS team 2004-2020. All rights reserved. ;; |
;; Distributed under terms of the GNU General Public License ;; |
;; ;; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
7,14 → 7,15 |
|
$Revision$ |
|
MAX_IOAPICS = 2 |
|
iglobal |
IRQ_COUNT dd 24 |
endg |
|
uglobal |
irq_mode rd 1 |
IOAPIC_base rd 1 |
IRQ_COUNT rd MAX_IOAPICS |
irq_mode rd 1 ; PIC/(IO)APIC |
IOAPIC_base rd MAX_IOAPICS |
ioapic_gsi_base rd MAX_IOAPICS ; zero-based, i.e. not vector |
ioapic_cnt dd ? ; from MADT aka APIC table |
ioapic_cur dd ? |
LAPIC_BASE rd 1 |
endg |
|
45,6 → 46,7 |
|
align 4 |
APIC_init: |
push ebx |
mov [irq_mode], IRQ_PIC |
|
cmp [acpi_ioapic_base], 0 |
60,39 → 62,51 |
mov [acpi_dev_data], eax |
mov [acpi_dev_size], ebx |
|
call IRQ_mask_all |
|
; IOAPIC init |
stdcall map_io_mem, [acpi_ioapic_base], 0x20, PG_GLOBAL+PG_NOCACHE+PG_SWR |
mov [IOAPIC_base], eax |
xor ebx, ebx |
@@: |
stdcall map_io_mem, [acpi_ioapic_base+ebx*4], 0x20, PG_GLOBAL+PG_NOCACHE+PG_SWR |
mov [IOAPIC_base+ebx*4], eax |
inc ebx |
cmp ebx, [ioapic_cnt] |
jnz @b |
|
call IRQ_mask_all |
mov [ioapic_cur], 0 |
.next_ioapic: |
mov edx, [ioapic_cur] |
mov eax, IOAPIC_VER |
call IOAPIC_read |
shr eax, 16 |
inc al |
movzx eax, al |
cmp al, IRQ_RESERVED |
mov ecx, [ioapic_gsi_base+edx*4] |
cmp ecx, IRQ_RESERVED |
jae .lapic_init |
add ecx, eax |
sub ecx, IRQ_RESERVED |
jbe @f |
|
mov al, IRQ_RESERVED |
sub eax, ecx |
@@: |
mov [IRQ_COUNT], eax |
mov [IRQ_COUNT+edx*4], eax |
|
; Reroute IOAPIC & mask all interrupts |
xor ecx, ecx |
mov eax, IOAPIC_REDTBL |
@@: |
.next_irq: |
mov ebx, eax |
call IOAPIC_read |
mov ah, 0x08; Delivery Mode: Fixed, Destination Mode: Logical |
mov al, cl |
add al, 0x20; vector |
or eax, 0x10000; Mask Interrupt |
add eax, [ioapic_gsi_base+edx*4] |
or eax, 0x1a000; Mask Interrupt, level-triggered active-low |
cmp [ioapic_cur], 0 |
jnz @f |
cmp ecx, 16 |
jb .set |
|
or eax, 0xa000;<<< level-triggered active-low for IRQ16+ |
.set: |
jae @f |
and eax, NOT 0xa000 ; edge-triggered active-high for IRQ0-15 |
@@: |
xchg eax, ebx |
call IOAPIC_write |
inc eax |
103,9 → 117,15 |
call IOAPIC_write |
inc eax |
inc ecx |
cmp ecx, [IRQ_COUNT] |
jb @b |
cmp ecx, [IRQ_COUNT+edx*4] |
jb .next_irq |
|
inc [ioapic_cur] |
inc edx |
cmp edx, [ioapic_cnt] |
jnz .next_ioapic |
|
.lapic_init: |
call LAPIC_init |
|
mov [irq_mode], IRQ_APIC |
117,7 → 137,7 |
|
call pci_irq_fixup |
.no_apic: |
|
pop ebx |
ret |
|
;=========================================================== |
210,7 → 230,8 |
; in : EAX - IOAPIC register |
; out: EAX - readed value |
push esi |
mov esi, [IOAPIC_base] |
mov esi, [ioapic_cur] |
mov esi, [IOAPIC_base+esi*4] |
mov [esi], eax |
mov eax, [esi + 0x10] |
pop esi |
222,7 → 243,8 |
; EBX - value |
; out: none |
push esi |
mov esi, [IOAPIC_base] |
mov esi, [ioapic_cur] |
mov esi, [IOAPIC_base+esi*4] |
mov [esi], eax |
mov [esi + 0x10], ebx |
pop esi |
232,6 → 254,7 |
; IRQ0 to vector 0x20, IRQ1 to vector 0x21.... |
align 4 |
PIC_init: |
mov [IRQ_COUNT], 16 |
cli |
mov al, 0x11 ; icw4, edge triggered |
out 0x20, al |
252,7 → 275,6 |
out 0xA1, al |
|
call IRQ_mask_all |
; mov dword[irq_type_to_set], IRQ_TYPE_PIC |
ret |
|
; ----------------------------------------- |
309,7 → 331,12 |
mov ecx, 0x1000 |
ret |
.APIC: |
mov ecx, [IRQ_COUNT] |
cmp [IOAPIC_base], 0 |
jz .done |
mov [ioapic_cur], 0 |
.next_ioapic: |
mov edx, [ioapic_cur] |
mov ecx, [IRQ_COUNT+edx*4] |
mov eax, 0x10 |
@@: |
mov ebx, eax |
320,6 → 347,12 |
inc eax |
inc eax |
loop @b |
|
inc [ioapic_cur] |
inc edx |
cmp edx, [ioapic_cnt] |
jnz .next_ioapic |
.done: |
ret |
|
; ----------------------------------------- |
363,6 → 396,20 |
out dx, al |
ret |
.APIC: |
push [ioapic_cur] |
xor eax, eax |
.next_ioapic: |
mov ecx, [ioapic_gsi_base+eax*4] |
add ecx, [IRQ_COUNT+eax*4] |
cmp ebx, ecx |
jb .found |
inc eax |
cmp eax, [ioapic_cnt] |
jnz .next_ioapic |
jmp .done |
.found: |
mov [ioapic_cur], eax |
sub ebx, [ioapic_gsi_base+eax*4] |
shl ebx, 1 |
add ebx, 0x10 |
mov eax, ebx |
370,6 → 417,8 |
and eax, 0xfffeffff; bit 16 |
xchg eax, ebx |
call IOAPIC_write |
.done: |
pop [ioapic_cur] |
ret |
endp |
|
390,6 → 439,20 |
out dx, al |
ret |
.APIC: |
push [ioapic_cur] |
xor eax, eax |
.next_ioapic: |
mov ecx, [ioapic_gsi_base+eax*4] |
add ecx, [IRQ_COUNT+eax*4] |
cmp ebx, ecx |
jae .found |
inc eax |
cmp eax, [ioapic_cnt] |
jnz .next_ioapic |
jmp .done |
.found: |
mov [ioapic_cur], eax |
sub ebx, [ioapic_gsi_base+eax*4] |
shl ebx, 1 |
add ebx, 0x10 |
mov eax, ebx |
397,6 → 460,8 |
or eax, 0x10000; bit 16 |
xchg eax, ebx |
call IOAPIC_write |
.done: |
pop [ioapic_cur] |
ret |
endp |
|