drivers: pci: Fix dm_pci_map_bar() to support 64b BARs

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>
This commit is contained in:
Moritz Fischer 2024-01-10 04:59:02 +00:00 committed by Tom Rini
parent 21a2c129ad
commit 0408347034
2 changed files with 12 additions and 0 deletions

View 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); dm_pci_read_config32(udev, bar, &bar_response);
pci_bus_addr = (pci_addr_t)(bar_response & ~0xf); 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) if (~((pci_addr_t)0) - pci_bus_addr < offset)
return NULL; return NULL;

View 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. * type 1 functions.
* Can also be used on type 0 functions that support Enhanced Allocation for * Can also be used on type 0 functions that support Enhanced Allocation for
* 32b/64b BARs. Note that duplicate BEI entries are not supported. * 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 * @dev: Device to check
* @bar: Bar register offset (PCI_BASE_ADDRESS_...) * @bar: Bar register offset (PCI_BASE_ADDRESS_...)