From 354e32e7f3708b3acdc85aafae9dfa6098fd5f01 Mon Sep 17 00:00:00 2001 From: "Marat Zakiyanov (Mario79)" Date: Sat, 5 Apr 2014 21:36:10 +0000 Subject: [PATCH] Fix for IDE devices: 1) Restore broken HD load for ramdisk image 2) Check of support UDMA mode for disk devices before initialization channel of IDE controller git-svn-id: svn://kolibrios.org@4772 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/trunk/boot/rdload.inc | 20 ++++-- kernel/trunk/detect/dev_hdcd.inc | 54 +++++++++++++--- kernel/trunk/detect/init_ata.inc | 106 ++++++++++++++++++++++++++++--- kernel/trunk/kernel.asm | 21 ++---- kernel/trunk/kernel32.inc | 5 ++ 5 files changed, 170 insertions(+), 36 deletions(-) diff --git a/kernel/trunk/boot/rdload.inc b/kernel/trunk/boot/rdload.inc index d906729190..98bf07a117 100644 --- a/kernel/trunk/boot/rdload.inc +++ b/kernel/trunk/boot/rdload.inc @@ -9,10 +9,10 @@ $Revision$ read_ramdisk: -; READ RAMDISK IMAGE FROM HD +; READ RAMDISK IMAGE FROM HD (only for IDE0, IDE1, IDE2, IDE3) cmp [boot_dev+OS_BASE+0x10000], 1 - jne no_sys_on_hd + jne no_sys_on_hd.1 xor ebp, ebp .hd_loop: @@ -69,9 +69,19 @@ read_ramdisk: jb .hd_loop jmp no_sys_on_hd .yes: + DEBUGF 1, "K : RD found: %s\n", read_image_fsinfo.name pop edi esi eax - jmp yes_sys_on_hd + call register_ramdisk + jmp yes_sys_on_hd +;----------------------------------------------------------------------------- +; Register ramdisk file system +register_ramdisk: + mov esi, boot_initramdisk + call boot_log + call ramdisk_init + ret +;----------------------------------------------------------------------------- iglobal align 4 read_image_fsinfo: @@ -79,7 +89,7 @@ read_image_fsinfo: dq 0 ; offset: zero dd 1474560 ; size dd RAMDISK ; buffer - db '/hd' +.name db '/hd' .name_digit db '0' db '/' .partition: @@ -99,6 +109,8 @@ read_image: ret no_sys_on_hd: + DEBUGF 1, "K : RD not found\n" +.1: ; test_to_format_ram_disk (need if not using ram disk) cmp [boot_dev+OS_BASE+0x10000], 3 jne not_format_ram_disk diff --git a/kernel/trunk/detect/dev_hdcd.inc b/kernel/trunk/detect/dev_hdcd.inc index 990f362434..573eebbca5 100644 --- a/kernel/trunk/detect/dev_hdcd.inc +++ b/kernel/trunk/detect/dev_hdcd.inc @@ -65,9 +65,9 @@ FindHDD_2: FindHDD_1: DEBUGF 1, "K : Channel %d ",[ChannelNumber]:2 DEBUGF 1, "Disk %d\n",[DiskNumber]:1 - push ebx + push ebx ecx call ReadHDD_ID - pop ebx + pop ecx ebx cmp [DevErrorCode], 0 jne .FindCD @@ -81,15 +81,15 @@ FindHDD_1: jmp .Print_Device_Name ;-------------------------------------- .FindCD: - push ebx + push ebx ecx call DeviceReset - pop ebx + pop ecx ebx cmp [DevErrorCode], 0 jne .end - push ebx + push ebx ecx call ReadCD_ID - pop ebx + pop ecx ebx cmp [DevErrorCode], 0 jne .end @@ -98,10 +98,22 @@ FindHDD_1: .Print_Device_Name: pushad pushfd + + xor ebx, ebx + mov bx, [ChannelNumber] + dec ebx + shl ebx, 1 + add bl, [DiskNumber] + shl ebx, 1 + + call calculate_IDE_device_values_storage +;-------------------------------------- +.copy_dev_name: mov esi, Sector512+27*2 mov edi, dev_name mov ecx, 20 cld +;-------------------------------------- @@: lodsw xchg ah, al @@ -112,12 +124,12 @@ FindHDD_1: xor eax, eax mov ax, [Sector512+64*2] - DEBUGF 1, "K : PIO mode possible modes %x\n", al + DEBUGF 1, "K : PIO possible modes %x\n", al mov ax, [Sector512+51*2] mov al, ah call convert_Sector512_value - DEBUGF 1, "K : PIO mode set mode %x\n", ah + DEBUGF 1, "K : PIO set mode %x\n", ah mov ax, [Sector512+63*2] DEBUGF 1, "K : Multiword DMA possible modes %x\n", al @@ -129,10 +141,14 @@ FindHDD_1: mov ax, [Sector512+88*2] DEBUGF 1, "K : Ultra DMA possible modes %x\n", al + mov [ebx+IDE_DEVICE.UDMA_possible_modes], al + mov al, ah call convert_Sector512_value DEBUGF 1, "K : Ultra DMA set mode %x\n", ah + mov [ebx+IDE_DEVICE.UDMA_set_mode], ah + popfd popad ret @@ -141,9 +157,30 @@ FindHDD_1: DEBUGF 1, "K : Device not found\n" ret ;----------------------------------------------------------------------------- +calculate_IDE_device_values_storage: + cmp ecx, IDE_controller_1 + jne @f + + add ebx, IDE_device_1 + jmp .exit +;-------------------------------------- +@@: + cmp ecx, IDE_controller_2 + jne @f + + add ebx, IDE_device_2 + jmp .exit +;-------------------------------------- +@@: + add ebx, IDE_device_3 +;-------------------------------------- +.exit: + ret +;----------------------------------------------------------------------------- convert_Sector512_value: mov ecx, 8 xor ah, ah +;-------------------------------------- @@: test al, 1b jnz .end @@ -153,6 +190,7 @@ convert_Sector512_value: loop @b xor ah, ah +;-------------------------------------- .end: ret ;----------------------------------------------------------------------------- diff --git a/kernel/trunk/detect/init_ata.inc b/kernel/trunk/detect/init_ata.inc index f73ec0c2f1..682d2fc3d8 100644 --- a/kernel/trunk/detect/init_ata.inc +++ b/kernel/trunk/detect/init_ata.inc @@ -140,6 +140,10 @@ cache_ide9 IDE_CACHE cache_ide10 IDE_CACHE cache_ide11 IDE_CACHE ;-------------------------------------- +IDE_device_1 rd 2 +IDE_device_2 rd 2 +IDE_device_3 rd 2 +;-------------------------------------- endg ;----------------------------------------------------------------------------- ; START of initialisation IDE ATA code @@ -295,13 +299,51 @@ Init_IDE_ATA_controller_2: .check_DRIVE_DATA: mov al, 0 mov ah, [ebx+DRIVE_DATA+1] - test ah, 10100000b + test ah, 10100000b ; check for ATAPI devices + jz @f +;-------------------------------------- +.ch1_pio_set_ATAPI: + DEBUGF 1, "K : IDE CH1 PIO, because ATAPI drive present\n" + jmp .ch1_pio_set_for_all +;-------------------------------------- +.ch1_pio_set_no_devices: + DEBUGF 1, "K : IDE CH1 PIO because no devices\n" + jmp .ch1_pio_set_for_all +;------------------------------------- +.ch1_pio_set: + DEBUGF 1, "K : IDE CH1 PIO because device not support UDMA\n" +;------------------------------------- +.ch1_pio_set_for_all: + mov [ecx+IDE_DATA.dma_hdd_channel_1], al + jmp .ch2_check +;-------------------------------------- +@@: + xor ebx, ebx + call calculate_IDE_device_values_storage + + test ah, 1010000b + jz .ch1_pio_set_no_devices + + test ah, 1000000b jz @f - DEBUGF 1, "K : IDE CH1 PIO, because ATAPI drive present\n" - mov [ecx+IDE_DATA.dma_hdd_channel_1], byte 0 + cmp [ebx+IDE_DEVICE.UDMA_possible_modes], al + je .ch1_pio_set - jmp .ch2_check + cmp [ebx+IDE_DEVICE.UDMA_set_mode], al + je .ch1_pio_set +;-------------------------------------- +@@: + test ah, 10000b + jz @f + + add ebx, 2 + + cmp [ebx+IDE_DEVICE.UDMA_possible_modes], al + je .ch1_pio_set + + cmp [ebx+IDE_DEVICE.UDMA_set_mode], al + je .ch1_pio_set ;-------------------------------------- @@: mov dx, [ecx+IDE_DATA.BAR1_val] ;0x3F4 @@ -311,13 +353,51 @@ Init_IDE_ATA_controller_2: mov [ecx+IDE_DATA.dma_hdd_channel_1], byte 1 ;-------------------------------------- .ch2_check: - test ah, 1010b + test ah, 1010b ; check for ATAPI devices + jz @f +;-------------------------------------- +.ch2_pio_set_ATAPI: + DEBUGF 1, "K : IDE CH2 PIO, because ATAPI drive present\n" + jmp .ch2_pio_set_for_all +;-------------------------------------- +.ch2_pio_set_no_devices: + DEBUGF 1, "K : IDE CH2 PIO because no devices\n" + jmp .ch2_pio_set_for_all +;-------------------------------------- +.ch2_pio_set: + DEBUGF 1, "K : IDE CH2 PIO because device not support UDMA\n" +;-------------------------------------- +.ch2_pio_set_for_all: + mov [ecx+IDE_DATA.dma_hdd_channel_2], al + jmp .end_set_interrupts +;-------------------------------------- +@@: + mov ebx, 4 + call calculate_IDE_device_values_storage + + test ah, 101b + jz .ch2_pio_set_no_devices + + test ah, 100b jz @f - DEBUGF 1, "K : IDE CH2 PIO, because ATAPI drive present\n" - mov [ecx+IDE_DATA.dma_hdd_channel_2], byte 0 + cmp [ebx+IDE_DEVICE.UDMA_possible_modes], al + je .ch2_pio_set - jmp .end_set_interrupts + cmp [ebx+IDE_DEVICE.UDMA_set_mode], al + je .ch2_pio_set +;-------------------------------------- +@@: + test ah, 1b + jz @f + + add ebx, 2 + + cmp [ebx+IDE_DEVICE.UDMA_possible_modes], al + je .ch2_pio_set + + cmp [ebx+IDE_DEVICE.UDMA_set_mode], al + je .ch2_pio_set ;-------------------------------------- @@: mov dx, [ecx+IDE_DATA.BAR3_val] ;0x374 @@ -349,6 +429,16 @@ include 'getcache.inc' mov esi, boot_detectpart call boot_log include 'sear_par.inc' +;----------------------------------------------------------------------------- + mov esi, boot_init_sys + call boot_log + call Parser_params + +if ~ defined extended_primary_loader +; ramdisk image should be loaded by extended primary loader if it exists +; READ RAMDISK IMAGE FROM HD +include '../boot/rdload.inc' +end if ;----------------------------------------------------------------------------- mov ecx, IDE_controller_1 mov [IDE_controller_pointer], ecx diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index dd58f2b803..439ee02360 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -699,10 +699,12 @@ no_mode_0x12: call PIT_init ; Register ramdisk file system - mov esi, boot_initramdisk - call boot_log - call ramdisk_init + cmp [boot_dev+OS_BASE+0x10000], 1 + je @f + call register_ramdisk +;-------------------------------------- +@@: mov esi, boot_initapic call boot_log ; Try to Initialize APIC @@ -787,19 +789,6 @@ include 'detect/dev_fd.inc' ;----------------------------------------------------------------------------- include 'detect/init_ata.inc' ;----------------------------------------------------------------------------- - mov esi, boot_init_sys - call boot_log - call Parser_params - -if ~ defined extended_primary_loader -; ramdisk image should be loaded by extended primary loader if it exists -; READ RAMDISK IMAGE FROM HD - -;!!!!!!!!!!!!!!!!!!!!!!! -include 'boot/rdload.inc' -;!!!!!!!!!!!!!!!!!!!!!!! -end if - if 0 mov ax, [OS_BASE+0x10000+bx_from_load] cmp ax, 'r1'; if using not ram disk, then load librares and parameters {SPraid.simba} diff --git a/kernel/trunk/kernel32.inc b/kernel/trunk/kernel32.inc index 6575e570f0..bfab3affbb 100644 --- a/kernel/trunk/kernel32.inc +++ b/kernel/trunk/kernel32.inc @@ -178,6 +178,11 @@ struct IDE_CACHE appl_search_start dd ? ends +struct IDE_DEVICE + UDMA_possible_modes db ? + UDMA_set_mode db ? +ends + ; Core functions include "core/sync.inc" ; macros for synhronization objects include "core/sys32.inc" ; process management