xref: /aosp_15_r20/external/coreboot/src/soc/amd/common/block/data_fabric/pci_segment_multi.c (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
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)9 enum 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