From: Wasim Khan <wasim.k...@nxp.com> Implement SerDesHelperLib to provide helper functions which can be used for SoC specific serdes configuration.
Signed-off-by: Wasim Khan <wasim.k...@nxp.com> --- 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 | 165 ++++++++++++++++++++ 4 files changed, 258 insertions(+) diff --git a/Silicon/NXP/NxpQoriqLs.dec b/Silicon/NXP/NxpQoriqLs.dec index d4d3057af509..720bb5794960 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..05814c986393 --- /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 = SocHelperLib + 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..ef08c3edc30a --- /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 SrdsLane[FixedPcdGet8 (PcdSerdesLanes)]; +} SERDES_CONFIG; + +typedef enum { + SRDS_1 = 0, + SRDS_2, + SRDS_3, + SRDS_MAX_NUM +} SERDES_NUMBER; + +UINT32 +GetSerDesPrtcl ( + IN INTN SerDes, + IN INTN Cfg, + IN INTN Lane, + IN UINT32 SerdesMaxProtocol, + IN SERDES_CONFIG *Config + ); + +EFI_STATUS +CheckSerDesPrtclValid ( + IN INTN SerDes, + IN UINT32 Prtcl, + IN UINT8 SerdesLanes, + IN SERDES_CONFIG *Config + ); + +EFI_STATUS +GetSerDesMap ( + IN UINT32 Srds, + IN UINT32 SrdsProt, + IN UINT8 SerdesLanes, + IN UINT32 SerdesMaxProtocol, + IN SERDES_CONFIG *Config, + OUT UINT64 *SerDesPrtclMap + ); + +VOID +SerDesInstanceProbeLanes ( + IN UINT32 Srds, + IN UINT32 SrdsProt, + IN UINT8 SerdesLanes, + 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..54d0a6181707 --- /dev/null +++ b/Silicon/NXP/Library/SerDesHelperLib/SerDesHelperLib.c @@ -0,0 +1,165 @@ +/** 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 Cfg Serdes Protocol. + @param Lane Serdes Lane number. + @param SerdesMaxProtocol Max Serdes protocol number. + @param Config Serdes Configuration. + + @return Serdes Lane protocol. + +**/ +UINT32 +GetSerDesPrtcl ( + IN INTN SerDes, + IN INTN Cfg, + IN INTN Lane, + IN UINT32 SerdesMaxProtocol, + IN SERDES_CONFIG *Config + ) +{ + while (Config->Protocol) { + if (Config->Protocol == Cfg) { + return Config->SrdsLane[Lane]; + } + Config++; + } + + return SerdesMaxProtocol; +} + +/** + Function to validate input serdes protocol. + + @param SerDes Serdes number. + @param Prtcl Serdes Protocol to be verified. + @param SerdesLanes 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 +CheckSerDesPrtclValid ( + IN INTN SerDes, + IN UINT32 Prtcl, + IN UINT8 SerdesLanes, + IN SERDES_CONFIG *Config + ) +{ + UINT8 Cnt; + + while (Config->Protocol) { + if (Config->Protocol == Prtcl) { + DEBUG ((DEBUG_INFO, "Protocol: %x Matched with the one in Table\n", Prtcl)); + break; + } + Config++; + } + + if (!Config->Protocol) { + return EFI_NOT_FOUND; + } + + for (Cnt = 0; Cnt < SerdesLanes; Cnt++) { + if (Config->SrdsLane[Cnt] != 0) { + return EFI_SUCCESS; + } + } + + return EFI_NOT_FOUND; +} + +/** + Get lane protocol on provided serdes lane and execute callback function. + + @param Srds Serdes number. + @param SrdsProt Serdes protocol number. + @param SerdesLanes 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 Srds, + IN UINT32 SrdsProt, + IN UINT8 SerdesLanes, + IN UINT32 SerdesMaxProtocol, + IN SERDES_CONFIG *Config, + IN SERDES_PROBE_LANES_CALLBACK SerDesLaneProbeCallback, + IN VOID *Arg + ) +{ + INT8 Lane; + UINT32 LanePrtcl; + + // Invoke callback for all lanes in the SerDes instance: + for (Lane = 0; Lane < SerdesLanes; Lane++) { + LanePrtcl = GetSerDesPrtcl (Srds, SrdsProt, Lane, SerdesMaxProtocol, Config); + ASSERT (LanePrtcl < SerdesMaxProtocol); + if (LanePrtcl != 0x0) { + SerDesLaneProbeCallback (LanePrtcl, Arg); + } + } +} + +/** + Function to fill serdes map information. + + @param Srds Serdes number. + @param SrdsProt Serdes protocol number. + @param SerdesLanes Number of Serdes Lanes. + @param SerdesMaxProtocol Max Serdes protocol number. + @param Config Serdes Configuration. + @param SerDesPrtclMap Output Serdes protocol map of enabled devices. + +**/ +EFI_STATUS +GetSerDesMap ( + IN UINT32 Srds, + IN UINT32 SrdsProt, + IN UINT8 SerdesLanes, + IN UINT32 SerdesMaxProtocol, + IN SERDES_CONFIG *Config, + OUT UINT64 *SerDesPrtclMap + ) +{ + INTN Lane; + EFI_STATUS Status; + UINT32 LanePrtcl; + + Status = CheckSerDesPrtclValid (Srds, SrdsProt, SerdesLanes, Config); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: SERDES%d[PRTCL] = 0x%x is not valid, Status = %r \n", + __FUNCTION__, Srds + 1, SrdsProt, Status)); + return Status; + } + + for (Lane = 0; Lane < SerdesLanes; Lane++) { + LanePrtcl = GetSerDesPrtcl (Srds, SrdsProt, Lane, SerdesMaxProtocol, Config); + if (LanePrtcl >= SerdesMaxProtocol) { + DEBUG ((DEBUG_ERROR, "Unknown SerDes lane protocol %d\n", LanePrtcl)); + return EFI_NO_MAPPING; + } + *SerDesPrtclMap |= (0x1u << (LanePrtcl)); + } + + return EFI_SUCCESS; +} -- 2.7.4 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#60543): https://edk2.groups.io/g/devel/message/60543 Mute This Topic: https://groups.io/mt/74612743/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-