1) Dynamic setting interrupts for IDE controller

2) Fixed problems with some hardware (eBox IDE Native mode and similar)


git-svn-id: svn://kolibrios.org@3762 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Marat Zakiyanov (Mario79) 2013-07-05 06:43:56 +00:00
parent 4db18bd0de
commit 8a0dae3f14
7 changed files with 135 additions and 48 deletions

View File

@ -704,6 +704,9 @@ buf_wait_ok:
pop edx eax pop edx eax
ret ret
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
irq14_num equ byte 14
irq15_num equ byte 15
;-----------------------------------------------------------------------------
align 4 align 4
wait_for_sector_dma_ide0: wait_for_sector_dma_ide0:
push eax push eax
@ -713,12 +716,14 @@ wait_for_sector_dma_ide0:
align 4 align 4
.wait: .wait:
call change_task call change_task
cmp [irq14_func], hdd_irq14 cmp [IDE_common_irq_param], irq14_num
jnz .done jnz .done
call check_hd_wait_timeout call check_hd_wait_timeout
cmp [hd_error], 0 cmp [hd_error], 0
jz .wait jz .wait
mov [irq14_func], hdd_irq_null
mov [IDE_common_irq_param], 0
mov dx, [IDEContrRegsBaseAddr] mov dx, [IDEContrRegsBaseAddr]
mov al, 0 mov al, 0
out dx, al out dx, al
@ -736,12 +741,14 @@ wait_for_sector_dma_ide1:
align 4 align 4
.wait: .wait:
call change_task call change_task
cmp [irq15_func], hdd_irq15 cmp [IDE_common_irq_param], irq15_num
jnz .done jnz .done
call check_hd_wait_timeout call check_hd_wait_timeout
cmp [hd_error], 0 cmp [hd_error], 0
jz .wait jz .wait
mov [irq15_func], hdd_irq_null
mov [IDE_common_irq_param], 0
mov dx, [IDEContrRegsBaseAddr] mov dx, [IDEContrRegsBaseAddr]
add dx, 8 add dx, 8
mov al, 0 mov al, 0
@ -761,8 +768,7 @@ IDE_descriptor_table:
dma_cur_sector dd not 40h dma_cur_sector dd not 40h
dma_hdpos dd 0 dma_hdpos dd 0
irq14_func dd hdd_irq_null IDE_common_irq_param db 0
irq15_func dd hdd_irq_null
endg endg
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
uglobal uglobal
@ -779,32 +785,34 @@ allow_dma_access db 0
endg endg
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
align 4 align 4
hdd_irq14: IDE_common_irq_handler:
pushfd pushfd
cli cli
pushad pushad
mov [irq14_func], hdd_irq_null
xor ebx, ebx
mov eax, IDE_common_irq_param
cmp [eax], irq15_num
mov [eax], ebx
je @f
;--------------------------------------
mov dx, [IDEContrRegsBaseAddr] mov dx, [IDEContrRegsBaseAddr]
mov al, 0 mov al, 0
out dx, al out dx, al
popad jmp .end
popfd ;--------------------------------------
align 4 align 4
hdd_irq_null: @@:
ret
;-----------------------------------------------------------------------------
align 4
hdd_irq15:
pushfd
cli
pushad
mov [irq15_func], hdd_irq_null
mov dx, [IDEContrRegsBaseAddr] mov dx, [IDEContrRegsBaseAddr]
add dx, 8 add dx, 8
mov al, 0 mov al, 0
out dx, al out dx, al
;--------------------------------------
align 4
.end:
popad popad
popfd popfd
mov al, 1
ret ret
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
align 4 align 4
@ -956,10 +964,11 @@ hd_read_dma:
mov eax, [hd_address_table] mov eax, [hd_address_table]
cmp [hdbase], eax ; 0x1F0 cmp [hdbase], eax ; 0x1F0
jnz .ide1 jnz .ide1
mov [irq14_func], hdd_irq14
mov [IDE_common_irq_param], irq14_num
jmp @f jmp @f
.ide1: .ide1:
mov [irq15_func], hdd_irq15 mov [IDE_common_irq_param], irq15_num
@@: @@:
popfd popfd
mov eax, [hd_address_table] mov eax, [hd_address_table]
@ -1113,10 +1122,11 @@ cache_write_dma:
mov eax, [hd_address_table] mov eax, [hd_address_table]
cmp [hdbase], eax ; 0x1F0 cmp [hdbase], eax ; 0x1F0
jnz .ide1 jnz .ide1
mov [irq14_func], hdd_irq14
mov [IDE_common_irq_param], irq14_num
jmp @f jmp @f
.ide1: .ide1:
mov [irq15_func], hdd_irq15 mov [IDE_common_irq_param], irq15_num
@@: @@:
popfd popfd
mov [dma_cur_sector], not 0x40 mov [dma_cur_sector], not 0x40
@ -1134,6 +1144,7 @@ cache_write_dma:
ret ret
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
uglobal uglobal
IDE_Interrupt dw ?
IDEContrRegsBaseAddr dw ? IDEContrRegsBaseAddr dw ?
IDEContrProgrammingInterface dw ? IDEContrProgrammingInterface dw ?
IDE_BAR0_val dw ? IDE_BAR0_val dw ?

View File

@ -448,6 +448,16 @@ sayerr:
.no_BAR4: .no_BAR4:
pop cx pop cx
.found: .found:
; get Interrupt Line
mov ax, 0xB10A
mov di, 0x3c ; memory base is config register at 0x3c
push cx
int 0x1A
jc .no_Interrupt ;.nopci
; and cx, 0xFFF0 ; clear address decode type
mov [es:BOOT_IDE_INTERR_16], cx
.no_Interrupt:
pop cx
; get memory base BAR0 ; get memory base BAR0
mov ax, 0xB10A mov ax, 0xB10A
mov di, 0x10 ; memory base is config register at 0x10 mov di, 0x10 ; memory base is config register at 0x10

View File

@ -314,6 +314,7 @@ BOOT_IDE_BAR1_16 equ 0x9058
BOOT_IDE_BAR2_16 equ 0x905A BOOT_IDE_BAR2_16 equ 0x905A
BOOT_IDE_BAR3_16 equ 0x905C BOOT_IDE_BAR3_16 equ 0x905C
BOOT_IDE_PI_16 equ 0x905E BOOT_IDE_PI_16 equ 0x905E
BOOT_IDE_INTERR_16 equ 0x9060
TMP_FILE_NAME equ 0 TMP_FILE_NAME equ 0
TMP_CMD_LINE equ 1024 TMP_CMD_LINE equ 1024

View File

@ -160,19 +160,6 @@ align 16
call [fdc_irq_func] call [fdc_irq_func]
pop ebp pop ebp
@@: @@:
cmp bp, 14
jnz @f
push ebp
call [irq14_func]
pop ebp
@@:
cmp bp, 15
jnz @f
push ebp
call [irq15_func]
pop ebp
@@:
bts [irq_active_set], ebp bts [irq_active_set], ebp
lea esi, [irqh_tab+ebp*8] ; esi= list head lea esi, [irqh_tab+ebp*8] ; esi= list head
@ -234,6 +221,10 @@ align 16
jz .try_next_irq jz .try_next_irq
cmp ebp, 12 cmp ebp, 12
jz .try_next_irq jz .try_next_irq
cmp ebp, 14
jz .try_next_irq
cmp ebp, 15
jz .try_next_irq
lea esi, [irqh_tab+ebp*8] lea esi, [irqh_tab+ebp*8]
mov ebx, esi mov ebx, esi
.try_next_handler: .try_next_handler:

View File

@ -55,7 +55,9 @@ if lang eq ru
boot_inittimer: cp866 'Инициализация системного таймера (IRQ0)',0 boot_inittimer: cp866 'Инициализация системного таймера (IRQ0)',0
boot_initapic: cp866 'Попытка инициализации APIC',0 boot_initapic: cp866 'Попытка инициализации APIC',0
boot_enableirq: cp866 'Включить прерывания 2, 6, 13, 14, 15',0 boot_enableirq: cp866 'Включить прерывания 2, 6, 13, 14, 15',0
boot_enablint_ide:cp866 'Разрешение прерываний в контроллере IDE',0 boot_disabling_ide:cp866 'Запрещение прерываний в контроллере IDE',0
boot_enabling_ide:cp866 'Разрешение прерываний в контроллере IDE',0
boot_set_int_IDE: cp866 'Установка обработчиков прерываний для контроллера IDE',0
boot_detectfloppy:cp866 'Поиск floppy дисководов',0 boot_detectfloppy:cp866 'Поиск floppy дисководов',0
boot_detecthdcd: cp866 'Поиск жестких дисков и ATAPI приводов',0 boot_detecthdcd: cp866 'Поиск жестких дисков и ATAPI приводов',0
boot_getcache: cp866 'Получение памяти для кэша',0 boot_getcache: cp866 'Получение памяти для кэша',0
@ -96,7 +98,9 @@ else
boot_inittimer db 'Initialize system timer (IRQ0)',0 boot_inittimer db 'Initialize system timer (IRQ0)',0
boot_initapic db 'Try to initialize APIC',0 boot_initapic db 'Try to initialize APIC',0
boot_enableirq db 'Enable interrupts 2, 6, 13, 14, 15',0 boot_enableirq db 'Enable interrupts 2, 6, 13, 14, 15',0
boot_enablint_ide db 'Enable interrupts in IDE controller',0 boot_disabling_ide db 'Disable interrupts in IDE controller',0
boot_enabling_ide db 'Enable interrupts in IDE controller',0
boot_set_int_IDE db 'Set handler of interrupts for IDE controller',0
boot_detectfloppy db 'Search floppy drives',0 boot_detectfloppy db 'Search floppy drives',0
boot_detecthdcd db 'Search hard drives and ATAPI drives',0 boot_detecthdcd db 'Search hard drives and ATAPI drives',0
boot_getcache db 'Get memory for cache',0 boot_getcache db 'Get memory for cache',0

View File

@ -4,7 +4,9 @@
boot_inittimer: cp850 'Inicializar reloj del sistema (IRQ0)',0 boot_inittimer: cp850 'Inicializar reloj del sistema (IRQ0)',0
boot_initapic: cp850 'Prueba inicializar APIC',0 boot_initapic: cp850 'Prueba inicializar APIC',0
boot_enableirq: cp850 'Habilitar interrupciones 2, 6, 13, 14, 15',0 boot_enableirq: cp850 'Habilitar interrupciones 2, 6, 13, 14, 15',0
boot_enablint_ide:cp850 'Habiliar interrupciones en controladores IDE',0 boot_disabling_ide:cp850 'Habiliar interrupciones en controladores IDE',0
boot_enabling_ide:cp850 'Habilitar interrupciones en controladores IDE',0
boot_set_int_IDE: cp850 'Configuración del controlador de interrupciones para el controlador IDE',0
boot_detectfloppy:cp850 'Buscar unidades de disquete',0 boot_detectfloppy:cp850 'Buscar unidades de disquete',0
boot_detecthdcd: cp850 'Buscar discos duros y unidades ATAPI',0 boot_detecthdcd: cp850 'Buscar discos duros y unidades ATAPI',0
boot_getcache: cp850 'Tomar memoria para caché',0 boot_getcache: cp850 'Tomar memoria para caché',0

View File

@ -365,6 +365,8 @@ high_code:
; SAVE REAL MODE VARIABLES ; SAVE REAL MODE VARIABLES
xor eax, eax xor eax, eax
mov ax, [BOOT_VARS + BOOT_IDE_INTERR_16]
mov [IDE_Interrupt], ax
mov ax, [BOOT_VARS + BOOT_IDE_PI_16] mov ax, [BOOT_VARS + BOOT_IDE_PI_16]
mov [IDEContrProgrammingInterface], ax mov [IDEContrProgrammingInterface], ax
mov ax, [BOOT_VARS + BOOT_IDE_BASE_ADDR] mov ax, [BOOT_VARS + BOOT_IDE_BASE_ADDR]
@ -717,18 +719,23 @@ no_mode_0x12:
stdcall enable_irq, 2 ; @#$%! PIC stdcall enable_irq, 2 ; @#$%! PIC
stdcall enable_irq, 6 ; FDD stdcall enable_irq, 6 ; FDD
stdcall enable_irq, 13 ; co-processor stdcall enable_irq, 13 ; co-processor
stdcall enable_irq, 14
stdcall enable_irq, 15
mov esi, boot_enablint_ide mov esi, boot_disabling_ide
call boot_log call boot_log
; Enable interrupts in IDE controller ;--------------------------------------
mov al, 0 ; Disable IDE interrupts, because the search
mov dx, 0x3F6 ; for IDE partitions is in the PIO mode.
;--------------------------------------
.disable_IDE_interrupt:
; Disable interrupts in IDE controller for PIO
mov al, 2
mov dx, [IDE_BAR1_val] ;0x3F6
add dx, 2
out dx, al out dx, al
mov dl, 0x76 mov dx, [IDE_BAR3_val] ;0x76
add dx, 2
out dx, al out dx, al
;-----------------------------------------------------------------------------
;!!!!!!!!!!!!!!!!!!!!!!!!!! ;!!!!!!!!!!!!!!!!!!!!!!!!!!
; mov esi, boot_detectdisks ; mov esi, boot_detectdisks
; call boot_log ; call boot_log
@ -977,6 +984,7 @@ endg
call set_lights call set_lights
;// mike.dld ] ;// mike.dld ]
stdcall attach_int_handler, 1, irq1, 0 stdcall attach_int_handler, 1, irq1, 0
DEBUGF 1, "K : IRQ0 error code %x\n", eax
.no_keyboard: .no_keyboard:
; SET MOUSE ; SET MOUSE
@ -1044,6 +1052,7 @@ end if
DEBUGF 1, "K : BAR3 %x \n", [IDE_BAR3_val]:4 DEBUGF 1, "K : BAR3 %x \n", [IDE_BAR3_val]:4
DEBUGF 1, "K : BAR4 %x \n", [IDEContrRegsBaseAddr]:4 DEBUGF 1, "K : BAR4 %x \n", [IDEContrRegsBaseAddr]:4
DEBUGF 1, "K : IDEContrProgrammingInterface %x \n", [IDEContrProgrammingInterface]:4 DEBUGF 1, "K : IDEContrProgrammingInterface %x \n", [IDEContrProgrammingInterface]:4
DEBUGF 1, "K : IDE_Interrupt %x \n", [IDE_Interrupt]:4
; START MULTITASKING ; START MULTITASKING
; A 'All set - press ESC to start' messages if need ; A 'All set - press ESC to start' messages if need
@ -1059,6 +1068,65 @@ end if
cmp [IDEContrRegsBaseAddr], 0 cmp [IDEContrRegsBaseAddr], 0
setnz [dma_hdd] setnz [dma_hdd]
;-----------------------------------------------------------------------------
; set interrupts for IDE Controller
;-----------------------------------------------------------------------------
mov esi, boot_set_int_IDE
call boot_log
set_interrupts_for_IDE_controllers:
mov ax, [IDEContrProgrammingInterface]
cmp ax, 0x0180
je .pata_ide
cmp ax, 0x018a
jne .sata_ide
;--------------------------------------
.pata_ide:
cmp [IDEContrRegsBaseAddr], 0
je .end_set_interrupts
stdcall attach_int_handler, 14, IDE_common_irq_handler, 0
DEBUGF 1, "K : Set IDE IRQ14 return code %x\n", eax
stdcall attach_int_handler, 15, IDE_common_irq_handler, 0
DEBUGF 1, "K : Set IDE IRQ15 return code %x\n", eax
stdcall enable_irq, 14
stdcall enable_irq, 15
jmp .enable_IDE_interrupt
;--------------------------------------
.sata_ide:
cmp ax, 0x0185
je .sata_ide_1
cmp ax, 0x018f
jne .end_set_interrupts
;--------------------------------------
.sata_ide_1:
cmp [IDEContrRegsBaseAddr], 0
je .end_set_interrupts
mov ax, [IDE_Interrupt]
movzx eax, al
stdcall attach_int_handler, eax, IDE_common_irq_handler, 0
DEBUGF 1, "K : Set IDE IRQ%d return code %x\n", [IDE_Interrupt]:2, eax
stdcall enable_irq, eax
;--------------------------------------
.enable_IDE_interrupt:
mov esi, boot_enabling_ide
call boot_log
; Enable interrupts in IDE controller for DMA
mov al, 0
mov dx, [IDE_BAR1_val] ;0x3F6
add dx, 2
out dx, al
mov dx, [IDE_BAR3_val] ;0x76
add dx, 2
out dx, al
;--------------------------------------
.end_set_interrupts:
;-----------------------------------------------------------------------------
cmp [dma_hdd], 0 cmp [dma_hdd], 0
je .print_pio je .print_pio
.print_dma: .print_dma: