Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 3909 → Rev 3910

/kernel/branches/Kolibri-acpi/bus/pci/pci32.inc
857,14 → 857,7
in eax, dx
ret
 
;proc pci_read8 stdcall, bus:dword, devfn:dword, reg:dword
;proc pci_read16 stdcall, bus:dword, devfn:dword, reg:dword
;proc pci_read32 stdcall, bus:dword, devfn:dword, reg:dword
 
;proc pci_write8 stdcall, bus:dword, devfn:dword, reg:dword, val:dword
;proc pci_write16 stdcall, bus:dword, devfn:dword, reg:dword, val:dword
;proc pci_write32 stdcall, bus:dword, devfn:dword, reg:dword, val:dword
 
PCI_R8 equ 0
PCI_R16 equ 4
PCI_R32 equ 8
873,81 → 866,207
PCI_W16 equ 16
PCI_W32 equ 20
 
align 8
pci_fn_table:
pci_bus_read8 dd pci_bus.conf1_read8 ;0
pci_bus_read16 dd pci_bus.conf1_read16 ;4
pci_bus_read32 dd pci_bus.conf1_read32 ;8
pci_bus_write8 dd pci_bus.conf1_write8 ;12
pci_bus_write16 dd pci_bus.conf1_write16 ;16
pci_bus_write32 dd pci_bus.conf1_write32 ;20
 
align 4
pci_read8:
mov eax, PCI_R8
jmp @F
pci_conf1_rw:
;internal function
;eax accessor
;ecx (bus << 8)|devfn
 
.val equ esp+4
 
; dword CF8 = (0x80000000 | ((reg & 0xF00) << 16) | (bus << 16) | (devfn << 8) | (reg & 0xFC))
 
pushfd
cli
 
push edx
push eax
mov eax, edx ; eax = reg
shl eax, 16 ; eax = reg << 16
shl ecx, 8 ; ecx = (bus << 16)|(devfn<<8)
mov al, dl ; eax = (reg << 16)|reg
and eax, 0x0F0000FC ; eax = ((reg & 0xF00) << 16)|(reg & 0xFC)
lea eax, [0x80000000+eax+ecx]
mov dx, 0xCF8
out dx, eax
pop eax
pop edx
jmp dword [.fntab+eax]
.r32:
mov dx, 0xCFC
in eax, dx
.rdone:
popfd
ret
.r16:
and dx, 2
add dx, 0xCFC
in al, dx
jmp .rdone
.r8:
and dx, 3
add dx, 0xCFC
in al, dx
jmp .rdone
.w32:
mov eax, [esp+8]
mov dx, 0xCFC
out dx, eax
.wdone:
popfd
ret 4
.w16:
mov eax, [esp+8]
and dx, 2
add dx, 0xCFC
out dx, ax
jmp .wdone
.w8:
mov eax, [esp+8]
and dx, 3
add dx, 0xCFC
out dx, al
jmp .wdone
 
align 4
pci_read16:
.fntab:
dd .r8
dd .r16
dd .r32
dd .w8
dd .w16
dd .w32
 
align 4
pci_fn_rw dd pci_conf1_rw
 
;proc pci_bus_read8 fastcall, busaddr:dword, reg:dword
;proc pci_bus_read16 fastcall, busaddr:dword, reg:dword
;proc pci_bus_read32 fastcall, busaddr:dword, reg:dword
 
align 4
pci_bus_read8:
xor eax, eax
jmp dword [pci_fn_rw]
 
align 4
pci_bus_read16:
mov eax, PCI_R16
jmp @F
jmp dword [pci_fn_rw]
 
align 4
pci_read32:
pci_bus_read32:
mov eax, PCI_R32
jmp dword [pci_fn_rw]
 
;proc pci_bus_write8 fastcall, busaddr:dword, reg:dword, val: dword
;proc pci_bus_write16 fastcall, busaddr:dword, reg:dword, val: dword
;proc pci_bus_write32 fastcall, busaddr:dword, reg:dword, val: dword
 
align 4
@@:
pci_bus_write8:
mov eax, PCI_W8
jmp dword [pci_fn_rw]
 
align 4
pci_bus_write16:
mov eax, PCI_W16
jmp dword [pci_fn_rw]
 
align 4
pci_bus_write32:
mov eax, PCI_W32
jmp dword [pci_fn_rw]
 
;deprecated proc pci_read8 stdcall, bus:dword, devfn:dword, reg:dword
;deprecated proc pci_read16 stdcall, bus:dword, devfn:dword, reg:dword
;deprecated proc pci_read32 stdcall, bus:dword, devfn:dword, reg:dword
 
align 4
pci_read8:
.bus equ esp+4
.devfn equ esp+8
.pci_reg equ esp+12
.val equ esp+16
 
xor ecx, ecx
movzx ecx, byte [.devfn]
mov ch, [.bus]
mov cl, [.devfn]
movzx edx, word [.pci_reg]
call pci_bus_read8
ret 12
 
pushfd
cli
align 4
pci_read16:
.bus equ esp+4
.devfn equ esp+8
.pci_reg equ esp+12
.val equ esp+16
 
call dword [pci_fn_table+eax]
movzx ecx, byte [.devfn]
mov ch, [.bus]
movzx edx, word [.pci_reg]
call pci_bus_read16
ret 12
 
popfd
align 4
pci_read32:
.bus equ esp+4
.devfn equ esp+8
.pci_reg equ esp+12
.val equ esp+16
 
movzx ecx, byte [.devfn]
mov ch, [.bus]
movzx edx, word [.pci_reg]
call pci_bus_read32
ret 12
 
;deprecated proc pci_write8 stdcall, bus:dword, devfn:dword, reg:dword, val:dword
;deprecated proc pci_write16 stdcall, bus:dword, devfn:dword, reg:dword, val:dword
;deprecated proc pci_write32 stdcall, bus:dword, devfn:dword, reg:dword, val:dword
 
align 4
pci_write8:
mov eax, PCI_W8
jmp @F
.bus equ esp+4
.devfn equ esp+8
.pci_reg equ esp+12
.val equ esp+16
 
movzx ecx, byte [.devfn]
mov ch, [.bus]
movzx edx, word [.pci_reg]
push dword [esp+16]
call pci_bus_write8
ret 16
 
align 4
pci_write16:
mov eax, PCI_W16
jmp @F
.bus equ esp+4
.devfn equ esp+8
.pci_reg equ esp+12
.val equ esp+16
 
movzx ecx, byte [.devfn]
mov ch, [.bus]
movzx edx, word [.pci_reg]
push dword [esp+16]
call pci_bus_write16
ret 16
 
align 4
pci_write32:
mov eax, PCI_W32
 
align 4
@@:
.bus equ esp+4
.devfn equ esp+8
.pci_reg equ esp+12
.val equ esp+16
 
xor ecx, ecx
movzx ecx, byte [.devfn]
mov ch, [.bus]
mov cl, [.devfn]
movzx edx, word [.pci_reg]
push dword [esp+16]
call pci_bus_write32
ret 16
 
pushfd
cli
 
push dword [esp+20]
call dword [pci_fn_table+eax]
 
popfd
 
ret 16