diff options
Diffstat (limited to 'src/soc/amd/common/block/pci')
-rw-r--r-- | src/soc/amd/common/block/pci/pci_routing_info.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/soc/amd/common/block/pci/pci_routing_info.c b/src/soc/amd/common/block/pci/pci_routing_info.c index e0a696442e..ac7255348e 100644 --- a/src/soc/amd/common/block/pci/pci_routing_info.c +++ b/src/soc/amd/common/block/pci/pci_routing_info.c @@ -3,6 +3,7 @@ #include <amdblocks/amd_pci_util.h> #include <console/console.h> #include <device/pci_def.h> +#include <stdlib.h> #include <types.h> enum pcie_swizzle_pin { @@ -55,3 +56,37 @@ unsigned int pci_calculate_irq(const struct pci_routing_info *routing_info, return irq; } + +void populate_pirq_data(void) +{ + const struct pci_routing_info *routing_table, *routing_entry; + size_t entries = 0; + struct pirq_struct *pirq; + unsigned int irq; + + routing_table = get_pci_routing_table(&entries); + + if (!routing_table || !entries) + return; + + pirq = calloc(entries, sizeof(*pirq)); + + if (!pirq) { + printk(BIOS_ERR, "%s: Allocation failed\n", __func__); + return; + } + + for (size_t i = 0; i < entries; ++i) { + routing_entry = &routing_table[i]; + + pirq[i].devfn = routing_entry->devfn; + for (size_t j = 0; j < 4; ++j) { + irq = pci_calculate_irq(routing_entry, j); + + pirq[i].PIN[j] = irq % 8; + } + } + + pirq_data_ptr = pirq; + pirq_data_size = entries; +} |