blob: bc680f9fff7a06b2394218e451dbdcad79eae964 [file] [log] [blame]
Felix Heldea831392023-08-08 02:55:09 +02001/* SPDX-License-Identifier: GPL-2.0-only */
2
3#include <amdblocks/data_fabric.h>
Felix Held9cbdc8f2023-08-11 22:30:06 +02004#include <amdblocks/root_complex.h>
Felix Heldea831392023-08-08 02:55:09 +02005#include <console/console.h>
6#include <device/device.h>
7#include <types.h>
8
Felix Held6c00a6a2023-12-06 23:40:42 +01009enum cb_err data_fabric_get_pci_bus_numbers(struct device *domain, uint8_t *segment_group,
10 uint8_t *first_bus, uint8_t *last_bus)
Felix Heldea831392023-08-08 02:55:09 +020011{
Felix Held9cbdc8f2023-08-11 22:30:06 +020012 const signed int iohc_dest_fabric_id = get_iohc_fabric_id(domain);
Felix Heldea831392023-08-08 02:55:09 +020013 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
Felix Held9cbdc8f2023-08-11 22:30:06 +020020 if (pci_bus_limit.dst_fabric_id != iohc_dest_fabric_id)
Felix Held55822d92023-08-08 21:38:07 +020021 continue;
22
Felix Heldea831392023-08-08 02:55:09 +020023 if (pci_bus_base.we && pci_bus_base.re) {
Felix Held6c00a6a2023-12-06 23:40:42 +010024 *segment_group = pci_bus_base.segment_num;
Felix Heldea831392023-08-08 02:55:09 +020025 *first_bus = pci_bus_base.bus_num_base;
26 *last_bus = pci_bus_limit.bus_num_limit;
27 return CB_SUCCESS;
28 }
29 }
30
Felix Held55822d92023-08-08 21:38:07 +020031 printk(BIOS_ERR, "No valid DF PCI CFG register pair found for domain %x.\n",
32 domain->path.domain.domain);
Felix Heldea831392023-08-08 02:55:09 +020033 return CB_ERR;
34}