]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
drivers: pci: Fix dm_pci_map_bar() to support 64b BARs
authorMoritz Fischer <moritzf@google.com>
Wed, 10 Jan 2024 04:59:02 +0000 (04:59 +0000)
committerTom Rini <trini@konsulko.com>
Fri, 19 Jan 2024 01:24:13 +0000 (20:24 -0500)
This enables 64b BARs if CONFIG_SYS_PCI_64BIT is enabled.

Reviewed-by: Philip Oberfichtner <pro@denx.de>
Reviewed-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Moritz Fischer <moritzf@google.com>
drivers/pci/pci-uclass.c
include/pci.h

index e0d01f6a85db8cc6fa40fe9370863ac48a2b6b73..1a48256de036edc25412cfbbc67465a56a2842d0 100644 (file)
@@ -1611,6 +1611,17 @@ void *dm_pci_map_bar(struct udevice *dev, int bar, size_t offset, size_t len,
        dm_pci_read_config32(udev, bar, &bar_response);
        pci_bus_addr = (pci_addr_t)(bar_response & ~0xf);
 
+       /* This has a lot of baked in assumptions, but essentially tries
+        * to mirror the behavior of BAR assignment for 64 Bit enabled
+        * hosts and 64 bit placeable BARs in the auto assign code.
+        */
+#if defined(CONFIG_SYS_PCI_64BIT)
+       if (bar_response & PCI_BASE_ADDRESS_MEM_TYPE_64) {
+               dm_pci_read_config32(udev, bar + 4, &bar_response);
+               pci_bus_addr |= (pci_addr_t)bar_response << 32;
+       }
+#endif /* CONFIG_SYS_PCI_64BIT */
+
        if (~((pci_addr_t)0) - pci_bus_addr < offset)
                return NULL;
 
index 2f5eb30b83c735225ac5d6017c4e66ab38d88df1..aad233769a3508d8e48323d31513f6014ebc6f98 100644 (file)
@@ -1354,6 +1354,7 @@ pci_addr_t dm_pci_phys_to_bus(struct udevice *dev, phys_addr_t addr, size_t len,
  * type 1 functions.
  * Can also be used on type 0 functions that support Enhanced Allocation for
  * 32b/64b BARs.  Note that duplicate BEI entries are not supported.
+ * Can also be used on 64b bars on type 0 functions.
  *
  * @dev:       Device to check
  * @bar:       Bar register offset (PCI_BASE_ADDRESS_...)