1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 3 #include <amdblocks/data_fabric.h> 4 #include <amdblocks/root_complex.h> 5 #include <console/console.h> 6 #include <device/device.h> 7 #include <types.h> 8 data_fabric_get_pci_bus_numbers(struct device * domain,uint8_t * segment_group,uint8_t * first_bus,uint8_t * last_bus)9enum cb_err data_fabric_get_pci_bus_numbers(struct device *domain, uint8_t *segment_group, 10 uint8_t *first_bus, uint8_t *last_bus) 11 { 12 const signed int iohc_dest_fabric_id = get_iohc_fabric_id(domain); 13 union df_pci_cfg_base pci_bus_base; 14 union df_pci_cfg_limit pci_bus_limit; 15 16 for (unsigned int i = 0; i < DF_PCI_CFG_MAP_COUNT; i++) { 17 pci_bus_base.raw = data_fabric_broadcast_read32(DF_PCI_CFG_BASE(i)); 18 pci_bus_limit.raw = data_fabric_broadcast_read32(DF_PCI_CFG_LIMIT(i)); 19 20 if (pci_bus_limit.dst_fabric_id != iohc_dest_fabric_id) 21 continue; 22 23 if (pci_bus_base.we && pci_bus_base.re) { 24 *segment_group = pci_bus_base.segment_num; 25 *first_bus = pci_bus_base.bus_num_base; 26 *last_bus = pci_bus_limit.bus_num_limit; 27 return CB_SUCCESS; 28 } 29 } 30 31 printk(BIOS_ERR, "No valid DF PCI CFG register pair found for domain %x.\n", 32 domain->path.domain.domain); 33 return CB_ERR; 34 } 35