Interpret 64-bit PCI BAR's properly.

git-svn-id: svn://kolibrios.org@7250 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
hidnplayr 2018-04-21 08:29:06 +00:00
parent fb667171e2
commit ade341318e
4 changed files with 58 additions and 21 deletions

View File

@ -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 ?

View File

@ -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

View File

@ -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

View File

@ -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