[edk2-devel] [PATCH edk2-platforms v3 1/3] Silicon/NXP/Library: Implement SerDesHelperLib

Wasim Khan wasim.khan at oss.nxp.com
Mon Jun 8 17:28:15 UTC 2020


From: Wasim Khan <wasim.khan at nxp.com>

Implement SerDesHelperLib to provide helper functions which
can be used for SoC specific SerDes configuration.

Signed-off-by: Wasim Khan <wasim.khan at nxp.com>
---

Notes:
    Changes in V3:
    - Change variable name LanePrtc to LaneProtocol
    
    Changes in V2:
    - Addressed review comments for structure, variable and function names
    - Using BIT0 instead of 0x1u

 Silicon/NXP/NxpQoriqLs.dec                              |   1 +
 Silicon/NXP/Library/SerDesHelperLib/SerDesHelperLib.inf |  28 ++++
 Silicon/NXP/Include/Library/SerDesHelperLib.h           |  64 ++++++++
 Silicon/NXP/Library/SerDesHelperLib/SerDesHelperLib.c   | 164 ++++++++++++++++++++
 4 files changed, 257 insertions(+)

diff --git a/Silicon/NXP/NxpQoriqLs.dec b/Silicon/NXP/NxpQoriqLs.dec
index d4d3057af509..d09a1ae194be 100644
--- a/Silicon/NXP/NxpQoriqLs.dec
+++ b/Silicon/NXP/NxpQoriqLs.dec
@@ -35,6 +35,7 @@ [PcdsFixedAtBuild.common]
   gNxpQoriqLsTokenSpaceGuid.PcdNumPciController|0|UINT32|0x00000501
   gNxpQoriqLsTokenSpaceGuid.PcdPcieLutBase|0x0|UINT32|0x00000502
   gNxpQoriqLsTokenSpaceGuid.PcdPcieLutDbg|0x0|UINT32|0x00000503
+  gNxpQoriqLsTokenSpaceGuid.PcdSerDesLanes|0x0|UINT8|0x00000504
 
 [PcdsDynamic.common]
   gNxpQoriqLsTokenSpaceGuid.PcdPciCfgShiftEnable|FALSE|BOOLEAN|0x00000600
diff --git a/Silicon/NXP/Library/SerDesHelperLib/SerDesHelperLib.inf b/Silicon/NXP/Library/SerDesHelperLib/SerDesHelperLib.inf
new file mode 100644
index 000000000000..7a781620e449
--- /dev/null
+++ b/Silicon/NXP/Library/SerDesHelperLib/SerDesHelperLib.inf
@@ -0,0 +1,28 @@
+## @file
+#
+#  Copyright 2020 NXP
+#
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+##
+
+[Defines]
+  INF_VERSION                    = 0x0001001A
+  BASE_NAME                      = SerDesHelperLib
+  FILE_GUID                      = 2930e932-a700-41e8-80f9-f1a2dedd2c4f
+  MODULE_TYPE                    = BASE
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = SerDesHelperLib
+
+[Packages]
+  MdePkg/MdePkg.dec
+  Silicon/NXP/NxpQoriqLs.dec
+
+[LibraryClasses]
+  DebugLib
+  PcdLib
+
+[Sources.common]
+  SerDesHelperLib.c
+
+[FixedPcd]
+  gNxpQoriqLsTokenSpaceGuid.PcdSerDesLanes
diff --git a/Silicon/NXP/Include/Library/SerDesHelperLib.h b/Silicon/NXP/Include/Library/SerDesHelperLib.h
new file mode 100644
index 000000000000..377f020e0b3a
--- /dev/null
+++ b/Silicon/NXP/Include/Library/SerDesHelperLib.h
@@ -0,0 +1,64 @@
+/** SerDesHelperLib.h
+  The Header file for SerDesHelperLib
+
+  Copyright 2020 NXP
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#ifndef SERDES_HELPER_LIB_H
+#define SERDES_HELPER_LIB_H
+
+#include <Uefi.h>
+#include <Library/SerDes.h>
+
+typedef struct {
+  UINT16 Protocol;
+  UINT8  SerDesLane[FixedPcdGet8 (PcdSerDesLanes)];
+} SERDES_CONFIG;
+
+typedef enum {
+  SERDES_1  = 0,
+  SERDES_2,
+  SERDES_3,
+  SERDES_MAX
+} SERDES_NUMBER;
+
+UINT32
+GetSerDesProtocol (
+  IN  INTN            SerDes,
+  IN  INTN            SerDesProtocol,
+  IN  INTN            Lane,
+  IN  UINT32          SerDesMaxProtocol,
+  IN  SERDES_CONFIG   *Config
+  );
+
+EFI_STATUS
+IsSerDesProtocolValid (
+  IN  INTN           SerDes,
+  IN  UINT32         SerDesProtocol,
+  IN  UINT8          SerDesNumLanes,
+  IN  SERDES_CONFIG  *Config
+  );
+
+EFI_STATUS
+GetSerDesMap (
+  IN  UINT32                    SerDes,
+  IN  UINT32                    SerDesProtocol,
+  IN  UINT8                     SerDesNumLanes,
+  IN  UINT32                    SerDesMaxProtocol,
+  IN  SERDES_CONFIG             *Config,
+  OUT UINT64                    *SerDesProtocolMap
+  );
+
+VOID
+SerDesInstanceProbeLanes (
+  IN  UINT32                      SerDes,
+  IN  UINT32                      SerDesProtocol,
+  IN  UINT8                       SerDesNumLanes,
+  IN  UINT32                      SerDesMaxProtocol,
+  IN  SERDES_CONFIG               *Config,
+  IN  SERDES_PROBE_LANES_CALLBACK SerDesLaneProbeCallback,
+  IN  VOID                        *Arg
+  );
+#endif
diff --git a/Silicon/NXP/Library/SerDesHelperLib/SerDesHelperLib.c b/Silicon/NXP/Library/SerDesHelperLib/SerDesHelperLib.c
new file mode 100644
index 000000000000..ddefcc2fac98
--- /dev/null
+++ b/Silicon/NXP/Library/SerDesHelperLib/SerDesHelperLib.c
@@ -0,0 +1,164 @@
+/** SerDes.c
+  Provides SoC specific SerDes interface
+
+  Copyright 2020 NXP
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include <Library/DebugLib.h>
+#include <Library/SerDesHelperLib.h>
+
+/**
+  Function to get SerDes Lane protocol corresponding to
+  SerDes protocol.
+
+  @param  SerDes              SerDes number.
+  @param  SerDesProtocol      SerDes protocol number.
+  @param  Lane                SerDes Lane number.
+  @param  SerDesMaxProtocol   Max SerDes protocol number.
+  @param  Config              SerDes Configuration.
+
+  @return SerDes Lane protocol.
+
+**/
+UINT32
+GetSerDesProtocol (
+  IN  INTN            SerDes,
+  IN  INTN            SerDesProtocol,
+  IN  INTN            Lane,
+  IN  UINT32          SerDesMaxProtocol,
+  IN  SERDES_CONFIG   *Config
+  )
+{
+  while (Config->Protocol) {
+    if (Config->Protocol == SerDesProtocol) {
+      return Config->SerDesLane[Lane];
+    }
+    Config++;
+  }
+
+  return SerDesMaxProtocol;
+}
+
+/**
+  Function to validate input SerDes protocol.
+
+  @param  SerDes              SerDes number.
+  @param  SerDesProtocol      SerDes protocol number.
+  @param  SerDesNumLanes      Number of SerDes Lanes.
+  @param  Config              SerDes Configuration.
+
+  @return EFI_NOT_FOUND     SerDes Protocol not a valid protocol.
+  @return EFI_SUCCESS       SerDes Protocol is a valid protocol.
+
+**/
+EFI_STATUS
+IsSerDesProtocolValid (
+  IN  INTN           SerDes,
+  IN  UINT32         SerDesProtocol,
+  IN  UINT8          SerDesNumLanes,
+  IN  SERDES_CONFIG  *Config
+  )
+{
+  UINT8 Count;
+
+  while (Config->Protocol) {
+    if (Config->Protocol == SerDesProtocol) {
+      DEBUG ((DEBUG_INFO, "Protocol: %x Matched with the one in Table\n", SerDesProtocol));
+      break;
+    }
+    Config++;
+  }
+
+  if (!Config->Protocol) {
+    return EFI_NOT_FOUND;
+  }
+
+  for (Count = 0; Count < SerDesNumLanes; Count++) {
+    if (Config->SerDesLane[Count] != 0) {
+      return EFI_SUCCESS;
+    }
+  }
+
+  return EFI_NOT_FOUND;
+}
+
+/**
+  Get Lane protocol on provided SerDes Lane and execute callback function.
+
+  @param  SerDes                  SerDes number.
+  @param  SerDesProtocol          SerDes protocol number.
+  @param  SerDesNumLanes          Number of SerDes Lanes.
+  @param  SerDesMaxProtocol       Max SerDes protocol number.
+  @param  Config                  SerDes Configuration.
+  @param  SerDesLaneProbeCallback Pointer Callback function to be called for Lane protocol
+  @param  Arg                     Pointer to Arguments to be passed to callback function.
+**/
+VOID
+SerDesInstanceProbeLanes (
+  IN  UINT32                      SerDes,
+  IN  UINT32                      SerDesProtocol,
+  IN  UINT8                       SerDesNumLanes,
+  IN  UINT32                      SerDesMaxProtocol,
+  IN  SERDES_CONFIG               *Config,
+  IN  SERDES_PROBE_LANES_CALLBACK SerDesLaneProbeCallback,
+  IN  VOID                        *Arg
+  )
+{
+  INT8    Lane;
+  UINT32  LaneProtocol;
+
+  // Invoke callback for all lanes in the SerDes instance:
+  for (Lane = 0; Lane < SerDesNumLanes; Lane++) {
+    LaneProtocol = GetSerDesProtocol (SerDes, SerDesProtocol, Lane, SerDesMaxProtocol, Config);
+    ASSERT (LaneProtocol < SerDesMaxProtocol);
+    if (LaneProtocol != 0x0) {
+      SerDesLaneProbeCallback (LaneProtocol, Arg);
+    }
+  }
+}
+
+/**
+  Function to fill SerDes map information.
+
+  @param  SerDes              SerDes number.
+  @param  SerDesProtocol      SerDes protocol number.
+  @param  SerDesNumLanes      Number of SerDes Lanes.
+  @param  SerDesMaxProtocol   Max SerDes protocol number.
+  @param  Config              SerDes Configuration.
+  @param  SerDesProtocolMap   Output SerDes protocol map of enabled devices.
+
+**/
+EFI_STATUS
+GetSerDesMap (
+  IN  UINT32                    SerDes,
+  IN  UINT32                    SerDesProtocol,
+  IN  UINT8                     SerDesNumLanes,
+  IN  UINT32                    SerDesMaxProtocol,
+  IN  SERDES_CONFIG             *Config,
+  OUT UINT64                    *SerDesProtocolMap
+  )
+{
+  INTN                   Lane;
+  EFI_STATUS             Status;
+  UINT32                 LaneProtocol;
+
+  Status = IsSerDesProtocolValid (SerDes, SerDesProtocol, SerDesNumLanes, Config);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "%a: SERDES%d[PRTCL] = 0x%x is not valid, Status = %r \n",
+            __FUNCTION__, SerDes + 1, SerDesProtocol, Status));
+    return Status;
+  }
+
+  for (Lane = 0; Lane < SerDesNumLanes; Lane++) {
+    LaneProtocol = GetSerDesProtocol (SerDes, SerDesProtocol, Lane, SerDesMaxProtocol, Config);
+    if (LaneProtocol >= SerDesMaxProtocol) {
+      DEBUG ((DEBUG_ERROR, "Unknown SerDes lane protocol %d\n", LaneProtocol));
+      return EFI_NO_MAPPING;
+    }
+    *SerDesProtocolMap |= (BIT0 << (LaneProtocol));
+  }
+
+  return EFI_SUCCESS;
+}
-- 
2.7.4


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#60897): https://edk2.groups.io/g/devel/message/60897
Mute This Topic: https://groups.io/mt/74757671/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-





More information about the edk2-devel-archive mailing list