forked from KolibriOS/kolibrios
Interpret 64-bit PCI BAR's properly.
git-svn-id: svn://kolibrios.org@7250 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
fb667171e2
commit
ade341318e
@ -1,6 +1,6 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
|
;; Copyright (C) KolibriOS team 2004-2018. All rights reserved. ;;
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; RTL8169 driver for KolibriOS ;;
|
;; RTL8169 driver for KolibriOS ;;
|
||||||
@ -251,7 +251,6 @@ struct device ETH_DEVICE
|
|||||||
pci_dev dd ?
|
pci_dev dd ?
|
||||||
irq_line db ?
|
irq_line db ?
|
||||||
rb 3 ; align 4
|
rb 3 ; align 4
|
||||||
mmio_addr dd ? ; memory map physical address
|
|
||||||
pcfg dd ?
|
pcfg dd ?
|
||||||
mcfg dd ?
|
mcfg dd ?
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
|
;; Copyright (C) KolibriOS team 2004-2018. All rights reserved. ;;
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; FORCEDETH.INC ;;
|
;; FORCEDETH.INC ;;
|
||||||
@ -582,7 +582,13 @@ probe:
|
|||||||
@@:
|
@@:
|
||||||
|
|
||||||
; Now, it's time to find the base mmio addres of the PCI device
|
; Now, it's time to find the base mmio addres of the PCI device
|
||||||
stdcall PCI_find_mmio32, [ebx + device.pci_bus], [ebx + device.pci_dev] ; returns in eax
|
stdcall PCI_find_mmio, [ebx + device.pci_bus], [ebx + device.pci_dev] ; returns in eax
|
||||||
|
test eax, eax
|
||||||
|
jnz @f
|
||||||
|
DEBUGF 1, "No useable MMIO addresses found!\n"
|
||||||
|
dec eax
|
||||||
|
ret
|
||||||
|
@@:
|
||||||
DEBUGF 1,"mmio_addr= 0x%x\n", eax
|
DEBUGF 1,"mmio_addr= 0x%x\n", eax
|
||||||
|
|
||||||
; Create virtual mapping of the physical memory
|
; Create virtual mapping of the physical memory
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright (C) KolibriOS team 2004-2017. All rights reserved. ;;
|
;; Copyright (C) KolibriOS team 2004-2018. All rights reserved. ;;
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; i8254x driver for KolibriOS ;;
|
;; i8254x driver for KolibriOS ;;
|
||||||
@ -389,7 +389,9 @@ proc service_proc stdcall, ioctl:dword
|
|||||||
|
|
||||||
; Now, it's time to find the base mmio addres of the PCI device
|
; Now, it's time to find the base mmio addres of the PCI device
|
||||||
|
|
||||||
stdcall PCI_find_mmio32, [ebx + device.pci_bus], [ebx + device.pci_dev] ; returns in eax
|
stdcall PCI_find_mmio, [ebx + device.pci_bus], [ebx + device.pci_dev] ; returns in eax
|
||||||
|
test eax, eax
|
||||||
|
jz .destroy
|
||||||
|
|
||||||
; Create virtual mapping of the physical memory
|
; Create virtual mapping of the physical memory
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
|
;; Copyright (C) KolibriOS team 2004-2018. All rights reserved. ;;
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; GNU GENERAL PUBLIC LICENSE ;;
|
;; GNU GENERAL PUBLIC LICENSE ;;
|
||||||
@ -102,14 +102,20 @@ struct PCI_header02 PCI_header
|
|||||||
ends
|
ends
|
||||||
|
|
||||||
; Base address bits
|
; Base address bits
|
||||||
PCI_BASE_ADDRESS_SPACE_IO = 0x01
|
PCI_BASE_ADDRESS_SPACE_IO = 0x01
|
||||||
PCI_BASE_ADDRESS_IO_MASK = 0xFFFFFFFC
|
PCI_BASE_ADDRESS_IO_MASK = 0xFFFFFFFC
|
||||||
PCI_BASE_ADDRESS_MEM_MASK = 0xFFFFFFF0
|
PCI_BASE_ADDRESS_MEM_MASK = 0xFFFFFFF0
|
||||||
|
PCI_BASE_ADDRESS_MEM_TYPE_MASK = 0x00000006
|
||||||
|
PCI_BASE_ADDRESS_MEM_TYPE_32 = 0x0
|
||||||
|
PCI_BASE_ADDRESS_MEM_TYPE_RESERVED = 0x02
|
||||||
|
PCI_BASE_ADDRESS_MEM_TYPE_64 = 0x4
|
||||||
|
|
||||||
|
|
||||||
; command bits
|
; command bits
|
||||||
PCI_CMD_PIO = 0x01 ; bit0: io space control
|
PCI_CMD_PIO = 0x01 ; bit0: io space control
|
||||||
PCI_CMD_MMIO = 0x02 ; bit1: memory space control
|
PCI_CMD_MMIO = 0x02 ; bit1: memory space control
|
||||||
PCI_CMD_MASTER = 0x04 ; bit2: device acts as a PCI master
|
PCI_CMD_MASTER = 0x04 ; bit2: device acts as a PCI master
|
||||||
|
PCI_CMD_INTX_DISABLE = 0x400 ; INTx emulation disable
|
||||||
|
|
||||||
; status bits
|
; status bits
|
||||||
PCI_STATUS_CAPA = 0x10 ; bit4: new capabilities available
|
PCI_STATUS_CAPA = 0x10 ; bit4: new capabilities available
|
||||||
@ -143,27 +149,51 @@ endp
|
|||||||
end if
|
end if
|
||||||
|
|
||||||
|
|
||||||
if used PCI_find_mmio32
|
if used PCI_find_mmio
|
||||||
proc PCI_find_mmio32 stdcall bus, dev
|
proc PCI_find_mmio stdcall bus, dev
|
||||||
|
|
||||||
push esi
|
push esi ebx
|
||||||
mov esi, PCI_header00.base_addr_0
|
mov esi, PCI_header00.base_addr_0
|
||||||
.check:
|
.check:
|
||||||
invoke PciRead32, [bus], [dev], esi
|
invoke PciRead32, [bus], [dev], esi
|
||||||
test eax, PCI_BASE_ADDRESS_SPACE_IO ; mmio address?
|
DEBUGF 1, "BAR: 0x%x\n", eax
|
||||||
jnz .inc
|
mov ebx, eax
|
||||||
test eax, 100b ; 64 bit?
|
test eax, PCI_BASE_ADDRESS_SPACE_IO ; MMIO address?
|
||||||
jnz .inc
|
jnz .next
|
||||||
and eax, not 1111b
|
and ebx, PCI_BASE_ADDRESS_MEM_TYPE_MASK
|
||||||
pop esi
|
cmp bl, PCI_BASE_ADDRESS_MEM_TYPE_64
|
||||||
|
je .is64
|
||||||
|
cmp bl, PCI_BASE_ADDRESS_MEM_TYPE_32
|
||||||
|
jne .next
|
||||||
|
; Ok, we have a 32-bit BAR.
|
||||||
|
and eax, PCI_BASE_ADDRESS_MEM_MASK
|
||||||
|
pop ebx esi
|
||||||
|
DEBUGF 1, "32-bit MMIO address found: 0x%x\n", eax
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.inc:
|
.is64:
|
||||||
|
; Ok, we have a 64-bit BAR, check if the upper 32-bits are 0, then we can use it..
|
||||||
|
push eax
|
||||||
|
add esi, 4
|
||||||
|
cmp esi, PCI_header00.base_addr_5
|
||||||
|
ja .fail
|
||||||
|
invoke PciRead32, [bus], [dev], esi
|
||||||
|
test eax, eax
|
||||||
|
pop eax
|
||||||
|
jnz .next
|
||||||
|
and eax, PCI_BASE_ADDRESS_MEM_MASK
|
||||||
|
pop ebx esi
|
||||||
|
DEBUGF 1, "64-bit MMIO address found: 0x00000000%x\n", eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
.next:
|
||||||
add esi, 4
|
add esi, 4
|
||||||
cmp esi, PCI_header00.base_addr_5
|
cmp esi, PCI_header00.base_addr_5
|
||||||
jbe .check
|
jbe .check
|
||||||
|
.fail:
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
pop esi
|
pop ebx esi
|
||||||
|
DEBUGF 1, "No usable MMIO addresses found!\n"
|
||||||
ret
|
ret
|
||||||
|
|
||||||
endp
|
endp
|
||||||
|
Loading…
Reference in New Issue
Block a user