summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWasim Khan <wasim.khan@nxp.com>2020-05-26 14:07:16 +0530
committerArd Biesheuvel <ard.biesheuvel@arm.com>2020-05-26 11:45:54 +0200
commit4513e6a21f842574be26c55234bb3741f0a3a37d (patch)
tree4ec4787080b2a1bf4b9af41b66f086a6532e6092
parent1212c5177a3f15ba0d593b291b2349af6e212121 (diff)
Silicon/NXP: PciSegmentLib: Add support PCIe LsGen4 Controller
PCIe Layerscape Gen4 controller is not ECAM compliant and have different PCI config space region for bus 0 (Controller space) and bus[0x1-0xff] on NXP SoCs. For config transactions for Bus0: - Config transaction address = PCIe controller address + offset For config transactions for Bus[0x1-0xff]: - PCIe IP requires target BDF to be written at bit[31:16] of PCIe outbound configuration window. PCIe LsGen4 controller uses paging mechanism to access registers. To access PCIe CCSR registers which are above 3KB offset, page number must be set in Bridge Control Register. Co-authored-by: Vabhav Sharma <vabhav.sharma@nxp.com> Co-authored-by: Wasim Khan <wasim.khan@nxp.com> Signed-off-by: Wasim Khan <wasim.khan@nxp.com> Reviewed-by: Ard Biesheuvel <ard.biesheuvel@arm.com>
-rwxr-xr-xSilicon/NXP/Library/PciSegmentLib/PciSegmentLib.c68
-rwxr-xr-xSilicon/NXP/Library/PciSegmentLib/PciSegmentLib.inf1
2 files changed, 68 insertions, 1 deletions
diff --git a/Silicon/NXP/Library/PciSegmentLib/PciSegmentLib.c b/Silicon/NXP/Library/PciSegmentLib/PciSegmentLib.c
index 68b6209c..ef147795 100755
--- a/Silicon/NXP/Library/PciSegmentLib/PciSegmentLib.c
+++ b/Silicon/NXP/Library/PciSegmentLib/PciSegmentLib.c
@@ -35,6 +35,66 @@ typedef enum {
ASSERT (((A) & (0xffff0000f0000000ULL | (M))) == 0)
STATIC BOOLEAN CfgShiftEnable;
+STATIC BOOLEAN PciLsGen4Ctrl;
+
+STATIC
+VOID
+PcieCfgSetTarget (
+ IN EFI_PHYSICAL_ADDRESS Dbi,
+ IN UINT32 Target
+ )
+{
+ STATIC_ASSERT (
+ PAB_AXI_AMAP_PEX_WIN_L(0) <= INDIRECT_ADDR_BNDRY,
+ "PcieCfgSetTarget() boundary check error");
+
+ PciLsGen4SetPg (Dbi, 0);
+ MmioWrite32 (Dbi + PAB_AXI_AMAP_PEX_WIN_L(0), Target);
+ MmioWrite32 (Dbi + PAB_AXI_AMAP_PEX_WIN_H(0), 0);
+}
+
+/**
+ Function to return PCIe Physical Address(PCIe view) or Controller
+ Address(CPU view) for NXP Layerscape Gen4 SoC
+
+ @param Address Address passed from bus layer.
+ @param Segment Segment number for Root Complex.
+ @param Offset Config space register offset.
+ @param Bus PCIe Bus number.
+
+ @return Return PCIe CPU or Controller address.
+
+**/
+STATIC
+UINT64
+PciLsGen4GetConfigBase (
+ IN UINT64 Address,
+ IN UINT16 Segment,
+ IN UINT16 Offset,
+ IN UINT8 Bus
+ )
+{
+ UINT32 Target;
+
+ if (Bus > 0) {
+ Target = (((Address >> 20) & 0xFF) << 24) |
+ (((Address >> 15) & 0x1F) << 19) |
+ (((Address >> 12) & 0x7) << 16);
+
+ PcieCfgSetTarget ((PCI_SEG0_DBI_BASE + PCI_DBI_SIZE_DIFF * Segment),
+ Target);
+ return PCI_SEG0_MMIO_MEMBASE + Offset + PCI_BASE_DIFF * Segment;
+ } else {
+ if (Offset < INDIRECT_ADDR_BNDRY) {
+ PciLsGen4SetPg (PCI_SEG0_DBI_BASE + PCI_DBI_SIZE_DIFF * Segment, 0);
+ return (PCI_SEG0_DBI_BASE + PCI_DBI_SIZE_DIFF * Segment + Offset);
+ }
+ PciLsGen4SetPg (PCI_SEG0_DBI_BASE + PCI_DBI_SIZE_DIFF * Segment,
+ OFFSET_TO_PAGE_IDX (Offset));
+ Offset = OFFSET_TO_PAGE_ADDR (Offset);
+ return (PCI_SEG0_DBI_BASE + PCI_DBI_SIZE_DIFF * Segment + Offset);
+ }
+}
STATIC
UINT64
@@ -130,7 +190,12 @@ PciSegmentLibGetConfigBase (
UINT8 Bus;
Bus = ((UINT32)Address >> 20) & 0xff;
- return PciLsGetConfigBase (Address, Segment, Offset, Bus);
+
+ if (PciLsGen4Ctrl) {
+ return PciLsGen4GetConfigBase (Address, Segment, Offset, Bus);
+ } else {
+ return PciLsGetConfigBase (Address, Segment, Offset, Bus);
+ }
}
/**
@@ -621,5 +686,6 @@ PciSegLibInit (
)
{
CfgShiftEnable = CFG_SHIFT_ENABLE;
+ PciLsGen4Ctrl = PCI_LS_GEN4_CTRL;
return EFI_SUCCESS;
}
diff --git a/Silicon/NXP/Library/PciSegmentLib/PciSegmentLib.inf b/Silicon/NXP/Library/PciSegmentLib/PciSegmentLib.inf
index 936213dc..d6d7ea6e 100755
--- a/Silicon/NXP/Library/PciSegmentLib/PciSegmentLib.inf
+++ b/Silicon/NXP/Library/PciSegmentLib/PciSegmentLib.inf
@@ -33,3 +33,4 @@
[Pcd]
gNxpQoriqLsTokenSpaceGuid.PcdPciCfgShiftEnable
+ gNxpQoriqLsTokenSpaceGuid.PcdPciLsGen4Ctrl