Maximilian Brune has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/85019?usp=email )
Change subject: soc/amd/glinda/pcie_gpp.c: Add PCI routing table ......................................................................
soc/amd/glinda/pcie_gpp.c: Add PCI routing table
This patch adds the PCI interrupt routing table. It also adds the missing PCI devices in the header files accordingly.
source: PPR 57254 Rev 1.59 Table "Recommended interrupt Routing and Swizzling"
tested: boot Linux with pci=nomsi kernel parameter and check /proc/interrupts
Change-Id: I44c11205ecc1554451a5e9d8f05102fd0d4d25ad Signed-off-by: Maximilian Brune maximilian.brune@9elements.com --- M src/soc/amd/glinda/include/soc/pci_devs.h A src/soc/amd/glinda/pcie_gpp.c 2 files changed, 88 insertions(+), 10 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/19/85019/1
diff --git a/src/soc/amd/glinda/include/soc/pci_devs.h b/src/soc/amd/glinda/include/soc/pci_devs.h index e85a6e3..01907e8 100644 --- a/src/soc/amd/glinda/include/soc/pci_devs.h +++ b/src/soc/amd/glinda/include/soc/pci_devs.h @@ -20,36 +20,75 @@ #define IOMMU_DEVFN PCI_DEVFN(IOMMU_DEV, IOMMU_FUNC) #define SOC_IOMMU_DEV _SOC_DEV(IOMMU_DEV, IOMMU_FUNC)
-/* PCIe GFX/GPP Bridge device 1 with no ports */ +/* PCIe USB4 Bridge device 1 with 3 ports */ #define PCIE_GPP_BRIDGE_1_DEV 0x1
+#define PCIE_GPP_1_1_FUNC 1 +#define PCIE_GPP_1_1_DEVFN PCI_DEVFN(PCIE_GPP_BRIDGE_1_DEV, PCIE_GPP_1_1_FUNC) +#define SOC_GPP_1_1_DEV _SOC_DEV(PCIE_GPP_BRIDGE_1_DEV, PCIE_GPP_1_1_FUNC) + +#define PCIE_GPP_1_2_FUNC 2 +#define PCIE_GPP_1_2_DEVFN PCI_DEVFN(PCIE_GPP_BRIDGE_1_DEV, PCIE_GPP_1_2_FUNC) +#define SOC_GPP_1_2_DEV _SOC_DEV(PCIE_GPP_BRIDGE_1_DEV, PCIE_GPP_1_2_FUNC) + +#define PCIE_GPP_1_3_FUNC 3 +#define PCIE_GPP_1_3_DEVFN PCI_DEVFN(PCIE_GPP_BRIDGE_1_DEV, PCIE_GPP_1_3_FUNC) +#define SOC_GPP_1_3_DEV _SOC_DEV(PCIE_GPP_BRIDGE_1_DEV, PCIE_GPP_1_3_FUNC) + /* PCIe GPP Bridge device 2 with up to 6 ports */ #define PCIE_GPP_BRIDGE_2_DEV 0x2
-#define PCIE_GPP_2_0_FUNC 1 -#define PCIE_GPP_2_0_DEVFN PCI_DEVFN(PCIE_GPP_BRIDGE_2_DEV, PCIE_GPP_2_0_FUNC) -#define SOC_GPP_2_0_DEV _SOC_DEV(PCIE_GPP_BRIDGE_2_DEV, PCIE_GPP_2_0_FUNC) - -#define PCIE_GPP_2_1_FUNC 2 +#define PCIE_GPP_2_1_FUNC 1 #define PCIE_GPP_2_1_DEVFN PCI_DEVFN(PCIE_GPP_BRIDGE_2_DEV, PCIE_GPP_2_1_FUNC) #define SOC_GPP_2_1_DEV _SOC_DEV(PCIE_GPP_BRIDGE_2_DEV, PCIE_GPP_2_1_FUNC)
-#define PCIE_GPP_2_2_FUNC 3 +#define PCIE_GPP_2_2_FUNC 2 #define PCIE_GPP_2_2_DEVFN PCI_DEVFN(PCIE_GPP_BRIDGE_2_DEV, PCIE_GPP_2_2_FUNC) #define SOC_GPP_2_2_DEV _SOC_DEV(PCIE_GPP_BRIDGE_2_DEV, PCIE_GPP_2_2_FUNC)
-#define PCIE_GPP_2_3_FUNC 4 +#define PCIE_GPP_2_3_FUNC 3 #define PCIE_GPP_2_3_DEVFN PCI_DEVFN(PCIE_GPP_BRIDGE_2_DEV, PCIE_GPP_2_3_FUNC) #define SOC_GPP_2_3_DEV _SOC_DEV(PCIE_GPP_BRIDGE_2_DEV, PCIE_GPP_2_3_FUNC)
-#define PCIE_GPP_2_4_FUNC 5 +#define PCIE_GPP_2_4_FUNC 4 #define PCIE_GPP_2_4_DEVFN PCI_DEVFN(PCIE_GPP_BRIDGE_2_DEV, PCIE_GPP_2_4_FUNC) #define SOC_GPP_2_4_DEV _SOC_DEV(PCIE_GPP_BRIDGE_2_DEV, PCIE_GPP_2_4_FUNC)
-#define PCIE_GPP_2_5_FUNC 6 +#define PCIE_GPP_2_5_FUNC 5 #define PCIE_GPP_2_5_DEVFN PCI_DEVFN(PCIE_GPP_BRIDGE_2_DEV, PCIE_GPP_2_5_FUNC) #define SOC_GPP_2_5_DEV _SOC_DEV(PCIE_GPP_BRIDGE_2_DEV, PCIE_GPP_2_5_FUNC)
+#define PCIE_GPP_2_6_FUNC 6 +#define PCIE_GPP_2_6_DEVFN PCI_DEVFN(PCIE_GPP_BRIDGE_2_DEV, PCIE_GPP_2_6_FUNC) +#define SOC_GPP_2_6_DEV _SOC_DEV(PCIE_GPP_BRIDGE_2_DEV, PCIE_GPP_2_6_FUNC) + +/* PCIe GPP Bridge device 3 with up to 6 ports */ +#define PCIE_GPP_BRIDGE_3_DEV 0x3 + +#define PCIE_GPP_3_1_FUNC 1 +#define PCIE_GPP_3_1_DEVFN PCI_DEVFN(PCIE_GPP_BRIDGE_3_DEV, PCIE_GPP_3_1_FUNC) +#define SOC_GPP_3_1_DEV _SOC_DEV(PCIE_GPP_BRIDGE_3_DEV, PCIE_GPP_3_1_FUNC) + +#define PCIE_GPP_3_2_FUNC 2 +#define PCIE_GPP_3_2_DEVFN PCI_DEVFN(PCIE_GPP_BRIDGE_3_DEV, PCIE_GPP_3_2_FUNC) +#define SOC_GPP_3_2_DEV _SOC_DEV(PCIE_GPP_BRIDGE_3_DEV, PCIE_GPP_3_2_FUNC) + +#define PCIE_GPP_3_3_FUNC 3 +#define PCIE_GPP_3_3_DEVFN PCI_DEVFN(PCIE_GPP_BRIDGE_3_DEV, PCIE_GPP_3_3_FUNC) +#define SOC_GPP_3_3_DEV _SOC_DEV(PCIE_GPP_BRIDGE_3_DEV, PCIE_GPP_3_3_FUNC) + +#define PCIE_GPP_3_4_FUNC 4 +#define PCIE_GPP_3_4_DEVFN PCI_DEVFN(PCIE_GPP_BRIDGE_3_DEV, PCIE_GPP_3_4_FUNC) +#define SOC_GPP_3_4_DEV _SOC_DEV(PCIE_GPP_BRIDGE_3_DEV, PCIE_GPP_3_4_FUNC) + +#define PCIE_GPP_3_5_FUNC 5 +#define PCIE_GPP_3_5_DEVFN PCI_DEVFN(PCIE_GPP_BRIDGE_3_DEV, PCIE_GPP_3_5_FUNC) +#define SOC_GPP_3_5_DEV _SOC_DEV(PCIE_GPP_BRIDGE_3_DEV, PCIE_GPP_3_5_FUNC) + +#define PCIE_GPP_3_6_FUNC 6 +#define PCIE_GPP_3_6_DEVFN PCI_DEVFN(PCIE_GPP_BRIDGE_3_DEV, PCIE_GPP_3_6_FUNC) +#define SOC_GPP_3_6_DEV _SOC_DEV(PCIE_GPP_BRIDGE_3_DEV, PCIE_GPP_3_6_FUNC) + /* PCIe Bridges to Bus A, Bus B and Bus C devices */ #define PCIE_ABC_BRIDGE_DEV 0x8
diff --git a/src/soc/amd/glinda/pcie_gpp.c b/src/soc/amd/glinda/pcie_gpp.c new file mode 100644 index 0000000..5ebf4f6 --- /dev/null +++ b/src/soc/amd/glinda/pcie_gpp.c @@ -0,0 +1,39 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +#include <amdblocks/amd_pci_util.h> +#include <commonlib/bsd/helpers.h> +#include <soc/pci_devs.h> +#include <stddef.h> + +/* See AMD PPR 55570 - IOAPIC Initialization for the table that AGESA sets up */ + +const struct pci_routing_info pci_routing_table[] = { + {PCIE_GPP_1_1_DEVFN, 0, PCI_SWIZZLE_ABCD, 0}, + {PCIE_GPP_1_2_DEVFN, 1, PCI_SWIZZLE_ABCD, 0}, + {PCIE_GPP_1_3_DEVFN, 2, PCI_SWIZZLE_ABCD, 0}, + + {PCIE_GPP_2_1_DEVFN, 3, PCI_SWIZZLE_ABCD, 1}, + {PCIE_GPP_2_2_DEVFN, 4, PCI_SWIZZLE_ABCD, 1}, + {PCIE_GPP_2_3_DEVFN, 5, PCI_SWIZZLE_ABCD, 1}, + {PCIE_GPP_2_4_DEVFN, 5, PCI_SWIZZLE_CDAB, 1}, + {PCIE_GPP_2_5_DEVFN, 4, PCI_SWIZZLE_CDAB, 1}, + {PCIE_GPP_2_6_DEVFN, 3, PCI_SWIZZLE_CDAB, 1}, + + {PCIE_GPP_3_1_DEVFN, 2, PCI_SWIZZLE_CDAB, 2}, + {PCIE_GPP_3_2_DEVFN, 1, PCI_SWIZZLE_CDAB, 2}, + {PCIE_GPP_3_3_DEVFN, 0, PCI_SWIZZLE_CDAB, 2}, + {PCIE_GPP_3_4_DEVFN, 0, PCI_SWIZZLE_DABC, 2}, + {PCIE_GPP_3_5_DEVFN, 1, PCI_SWIZZLE_BCDA, 2}, + {PCIE_GPP_3_6_DEVFN, 2, PCI_SWIZZLE_DABC, 2}, + + {PCIE_ABC_A_DEVFN, 3, PCI_SWIZZLE_DABC, 3}, + {PCIE_GPP_B_DEVFN, 4, PCI_SWIZZLE_DABC, 3}, + {PCIE_ABC_C_DEVFN, 5, PCI_SWIZZLE_DABC, 3}, +}; + +const struct pci_routing_info *get_pci_routing_table(size_t *entries) +{ + *entries = ARRAY_SIZE(pci_routing_table); + return pci_routing_table; + +}