From ade341318e3a803d33093228dddd7102776e178b Mon Sep 17 00:00:00 2001 From: hidnplayr Date: Sat, 21 Apr 2018 08:29:06 +0000 Subject: [PATCH] Interpret 64-bit PCI BAR's properly. git-svn-id: svn://kolibrios.org@7250 a494cfbc-eb01-0410-851d-a64ba20cac60 --- drivers/ethernet/RTL8169.asm | 3 +- drivers/ethernet/forcedeth.asm | 10 ++++-- drivers/ethernet/i8254x.asm | 6 ++-- drivers/pci.inc | 60 +++++++++++++++++++++++++--------- 4 files changed, 58 insertions(+), 21 deletions(-) diff --git a/drivers/ethernet/RTL8169.asm b/drivers/ethernet/RTL8169.asm index 0447e39a40..5cf4693c66 100644 --- a/drivers/ethernet/RTL8169.asm +++ b/drivers/ethernet/RTL8169.asm @@ -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 ;; ;; ;; ;; RTL8169 driver for KolibriOS ;; @@ -251,7 +251,6 @@ struct device ETH_DEVICE pci_dev dd ? irq_line db ? rb 3 ; align 4 - mmio_addr dd ? ; memory map physical address pcfg dd ? mcfg dd ? diff --git a/drivers/ethernet/forcedeth.asm b/drivers/ethernet/forcedeth.asm index 644e5d22f6..e340a56f9a 100644 --- a/drivers/ethernet/forcedeth.asm +++ b/drivers/ethernet/forcedeth.asm @@ -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 ;; ;; ;; ;; FORCEDETH.INC ;; @@ -582,7 +582,13 @@ probe: @@: ; 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 ; Create virtual mapping of the physical memory diff --git a/drivers/ethernet/i8254x.asm b/drivers/ethernet/i8254x.asm index afb831f41f..fb43df3f80 100644 --- a/drivers/ethernet/i8254x.asm +++ b/drivers/ethernet/i8254x.asm @@ -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 ;; ;; ;; ;; 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 - 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 diff --git a/drivers/pci.inc b/drivers/pci.inc index 0a31bf6f13..adc58778d9 100644 --- a/drivers/pci.inc +++ b/drivers/pci.inc @@ -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 ;; ;; ;; ;; GNU GENERAL PUBLIC LICENSE ;; @@ -102,14 +102,20 @@ struct PCI_header02 PCI_header ends ; Base address bits - PCI_BASE_ADDRESS_SPACE_IO = 0x01 - PCI_BASE_ADDRESS_IO_MASK = 0xFFFFFFFC - PCI_BASE_ADDRESS_MEM_MASK = 0xFFFFFFF0 + PCI_BASE_ADDRESS_SPACE_IO = 0x01 + PCI_BASE_ADDRESS_IO_MASK = 0xFFFFFFFC + 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 PCI_CMD_PIO = 0x01 ; bit0: io space control PCI_CMD_MMIO = 0x02 ; bit1: memory space control PCI_CMD_MASTER = 0x04 ; bit2: device acts as a PCI master + PCI_CMD_INTX_DISABLE = 0x400 ; INTx emulation disable ; status bits PCI_STATUS_CAPA = 0x10 ; bit4: new capabilities available @@ -143,27 +149,51 @@ endp end if -if used PCI_find_mmio32 -proc PCI_find_mmio32 stdcall bus, dev +if used PCI_find_mmio +proc PCI_find_mmio stdcall bus, dev - push esi + push esi ebx mov esi, PCI_header00.base_addr_0 .check: invoke PciRead32, [bus], [dev], esi - test eax, PCI_BASE_ADDRESS_SPACE_IO ; mmio address? - jnz .inc - test eax, 100b ; 64 bit? - jnz .inc - and eax, not 1111b - pop esi + DEBUGF 1, "BAR: 0x%x\n", eax + mov ebx, eax + test eax, PCI_BASE_ADDRESS_SPACE_IO ; MMIO address? + jnz .next + and ebx, PCI_BASE_ADDRESS_MEM_TYPE_MASK + 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 - .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 cmp esi, PCI_header00.base_addr_5 jbe .check + .fail: xor eax, eax - pop esi + pop ebx esi + DEBUGF 1, "No usable MMIO addresses found!\n" ret endp