Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 9263 → Rev 9264

/kernel/branches/kolibri-ahci/blkdev/ahci.inc
314,10 → 314,25
 
; --------------------------------------------------
uglobal
 
align 4
 
struct SD_DATA
ahci_controller AHCI_DATA
port_data_arr rb (sizeof.PORT_DATA*AHCI_MAX_PORTS)
ahci_mutex MUTEX
ends
 
sd1_data SD_DATA
sd2_data SD_DATA
sd3_data SD_DATA
sd4_data SD_DATA
sd5_data SD_DATA
sd6_data SD_DATA
sd7_data SD_DATA
sd8_data SD_DATA
 
sd_data dd ?
endg
 
iglobal
332,8 → 347,9
dd 0 ; no flush function
dd 0 ; use default cache size
.end:
hd_name db 'hd', 0, 0, 0
hd_counter dd 0
hd_name db 'sd', 0, 0, 0
sd_counter dd 0
controllers_counter dd 0
endg
 
; -----------------------------------------------------------------------
340,11 → 356,11
; detect ahci controller and initialize
align 4
ahci_init:
mov ecx, ahci_mutex
call mutex_init
 
mov ecx, ahci_controller
mov ecx, sd1_data.ahci_controller
mov esi, pcidev_list
mov [sd_data], sd1_data
mov [sd_counter], 0
.find_ahci_ctr:
mov esi, [esi + PCIDEV.fd]
cmp esi, pcidev_list
361,8 → 377,16
ret
 
.ahci_ctr_found:
mov [ahci_controller + AHCI_DATA.pcidev], esi
push esi
 
mov ecx, [sd_data]
add ecx, SD_DATA.ahci_mutex
call mutex_init
 
mov ecx, [sd_data]
add ecx, SD_DATA.ahci_controller
mov [ecx + AHCI_DATA.pcidev], esi
 
mov eax, [esi+PCIDEV.class]
movzx ebx, byte [esi+PCIDEV.bus]
movzx ecx, byte [esi+PCIDEV.devfn]
387,7 → 411,11
 
; Map MMIO region to virtual memory
stdcall map_io_mem, edi, eax, PG_SWR + PG_NOCACHE
mov [ahci_controller + AHCI_DATA.abar], eax
push ecx
mov ecx, [sd_data]
add ecx, SD_DATA.ahci_controller
mov [ecx + AHCI_DATA.abar], eax
pop ecx
DEBUGF 1, "K: AHCI controller BAR5 mapped to virtual addr %x\n", eax
 
; Restore the original BAR5 value
405,12 → 433,16
stdcall pci_write32, ebx, ebp, PCI_REG_STATUS_COMMAND, eax
 
; ; Print some register values to debug board
; mov esi, [ahci_controller + AHCI_DATA.abar]
; mov esi, [[sd_data].ahci_controller + AHCI_DATA.abar]
; DEBUGF 1, "K: AHCI: HBA.cap = %x, HBA.ghc = %x, HBA_MEM.version = %x\n", [esi + HBA_MEM.cap], [esi + HBA_MEM.ghc], [esi + HBA_MEM.version]
 
;-------------------------------------------------------
; Request BIOS/OS ownership handoff, if supported. (TODO check correctness)
mov esi, [ahci_controller + AHCI_DATA.abar]
push ecx
mov ecx, [sd_data]
add ecx, SD_DATA.ahci_controller
mov esi, [ecx + AHCI_DATA.abar]
pop ecx
;mov ebx, [esi + HBA_MEM.cap2]
;DEBUGF 1, "K: AHCI: HBA_MEM.cap2 = %x\n", ebx
bt [esi + HBA_MEM.cap2], bit_AHCI_HBA_CAP2_BOH
460,7 → 492,6
; IDT::RegisterInterruptHandler(irq, InterruptHandler);
; ahciHBA->is = 0xffffffff;
 
mov [hd_counter], 0
xor ebx, ebx
.detect_drives:
cmp ebx, AHCI_MAX_PORTS
534,7 → 565,8
 
mov ecx, ebx
imul ecx, sizeof.PORT_DATA
add ecx, port_data_arr
mov ecx, [sd_data]
add ecx, SD_DATA.port_data_arr
stdcall ahci_port_rebase, edi, ebx, ecx
 
; DEBUGF 1, "K: AHCI: After REBASING, signature = 0x%x\n", [edi + HBA_PORT.signature]
573,11 → 605,11
;stdcall ahci_read_first_sector, ecx
 
push ecx
mov eax, [hd_counter]
inc [hd_counter]
mov eax, [sd_counter]
inc [sd_counter]
xor edx, edx
mov ecx, 10
div ecx ; eax = hd_counter / 10, edx = hd_counter % 10
div ecx ; eax = sd_counter / 10, edx = sd_counter % 10
test eax, eax
jz .concat_one
add al, '0'
615,8 → 647,12
 
.end_detect_drives:
 
pop esi
add [sd_data], sizeof.SD_DATA
inc [controllers_counter]
cmp [controllers_counter], 8
jnz .find_ahci_ctr
DEBUGF 1, "AHCI: reached controllers number limit\n"
ret
; -------------------------------------------------
 
1023,7 → 1059,7
 
pushad
mov ecx, ahci_mutex
mov ecx, sd1_data.ahci_mutex
call mutex_lock
 
mov eax, [numsectors_ptr]
1061,7 → 1097,7
jmp .read_loop
.read_loop_end:
 
mov ecx, ahci_mutex
mov ecx, sd1_data.ahci_mutex
call mutex_unlock
popad
1078,7 → 1114,7
 
pushad
mov ecx, ahci_mutex
mov ecx, sd1_data.ahci_mutex
call mutex_lock
 
mov eax, [numsectors_ptr]
1107,7 → 1143,7
jmp .write_loop
.write_loop_end:
 
mov ecx, ahci_mutex
mov ecx, sd1_data.ahci_mutex
call mutex_unlock
popad
1341,7 → 1377,7
mov ebx, [eax + HBA_PORT.sata_active]
or ebx, [eax + HBA_PORT.command_issue] ; ebx = slots
 
mov esi, [ahci_controller + AHCI_DATA.abar]
mov esi, [sd1_data.ahci_controller + AHCI_DATA.abar]
mov edx, [esi + HBA_MEM.cap]
shr edx, 8
and edx, 0xf