On Wed, Jun 10, 2020 at 02:38:54 +0530, Wasim Khan wrote:
> From: Wasim Khan <wasim.k...@nxp.com>
> 
> Based on SerDes protocol value in reset configuration word (RCW)
> different IP blocks gets enabled in HW.
> Add SoC specific SerDes configuration for LX2160A, which can be
> used by different IPs to know the enabled interfaces and perform
> the required initialization.
> 
> Signed-off-by: Wasim Khan <wasim.k...@nxp.com>
> ---
>  Silicon/NXP/LX2160A/LX2160A.dsc.inc           |   2 +
>  Silicon/NXP/LX2160A/Library/SocLib/SocLib.inf |   6 +
>  Silicon/NXP/LX2160A/Include/SocSerDes.h       |  74 +++++++
>  Silicon/NXP/LX2160A/Library/SocLib/SerDes.c   | 211 ++++++++++++++++++++
>  4 files changed, 293 insertions(+)
> 
> diff --git a/Silicon/NXP/LX2160A/LX2160A.dsc.inc 
> b/Silicon/NXP/LX2160A/LX2160A.dsc.inc
> index af22b4dd973c..fe8ed402fc4e 100644
> --- a/Silicon/NXP/LX2160A/LX2160A.dsc.inc
> +++ b/Silicon/NXP/LX2160A/LX2160A.dsc.inc
> @@ -15,6 +15,7 @@ [LibraryClasses.common]
>    PL011UartLib|ArmPlatformPkg/Library/PL011UartLib/PL011UartLib.inf
>    
> SerialPortLib|ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.inf
>    
> PL011UartClockLib|Silicon/NXP/Library/PL011UartClockLib/PL011UartClockLib.inf
> +  SerDesHelperLib|Silicon/NXP/Library/SerDesHelperLib/SerDesHelperLib.inf
>  
>  
> ################################################################################
>  #
> @@ -32,6 +33,7 @@ [PcdsFixedAtBuild.common]
>    gArmTokenSpaceGuid.PcdGenericWatchdogControlBase|0x23A0000
>    gArmTokenSpaceGuid.PcdGenericWatchdogRefreshBase|0x2390000
>    gArmTokenSpaceGuid.PcdGenericWatchdogEl2IntrNum|91
> +  gNxpQoriqLsTokenSpaceGuid.PcdSerDesLanes|0x8
>  
>    gEfiMdePkgTokenSpaceGuid.PcdUartDefaultReceiveFifoDepth|0
>    gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase|0x21C0000
> diff --git a/Silicon/NXP/LX2160A/Library/SocLib/SocLib.inf 
> b/Silicon/NXP/LX2160A/Library/SocLib/SocLib.inf
> index 421072b88019..54bcb82e6877 100644
> --- a/Silicon/NXP/LX2160A/Library/SocLib/SocLib.inf
> +++ b/Silicon/NXP/LX2160A/Library/SocLib/SocLib.inf
> @@ -22,6 +22,12 @@ [Packages]
>  [LibraryClasses]
>    ChassisLib
>    DebugLib
> +  PcdLib
> +  SerDesHelperLib
>  
>  [Sources.common]
> +  SerDes.c
>    SocLib.c
> +
> +[FixedPcd]
> +  gNxpQoriqLsTokenSpaceGuid.PcdSerDesLanes
> diff --git a/Silicon/NXP/LX2160A/Include/SocSerDes.h 
> b/Silicon/NXP/LX2160A/Include/SocSerDes.h
> new file mode 100644
> index 000000000000..02000622d89a
> --- /dev/null
> +++ b/Silicon/NXP/LX2160A/Include/SocSerDes.h
> @@ -0,0 +1,74 @@
> +/** SocSerDes.h
> +  SoC Specific header file for SerDes
> +
> +  Copyright 2017-2020 NXP
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#ifndef SOC_SERDES_H
> +#define SOC_SERDES_H
> +
> +typedef enum {
> +  NONE = 0,
> +  PCIE1,
> +  PCIE2,
> +  PCIE3,
> +  PCIE4,
> +  PCIE5,
> +  PCIE6,
> +  SATA1,
> +  SATA2,
> +  SATA3,
> +  SATA4,
> +  XFI1,
> +  XFI2,
> +  XFI3,
> +  XFI4,
> +  XFI5,
> +  XFI6,
> +  XFI7,
> +  XFI8,
> +  XFI9,
> +  XFI10,
> +  XFI11,
> +  XFI12,
> +  XFI13,
> +  XFI14,
> +  SGMII1,
> +  SGMII2,
> +  SGMII3,
> +  SGMII4,
> +  SGMII5,
> +  SGMII6,
> +  SGMII7,
> +  SGMII8,
> +  SGMII9,
> +  SGMII10,
> +  SGMII11,
> +  SGMII12,
> +  SGMII13,
> +  SGMII14,
> +  SGMII15,
> +  SGMII16,
> +  SGMII17,
> +  SGMII18,
> +  GE100_1,
> +  GE100_2,
> +  GE50_1,
> +  GE50_2,
> +  GE40_1,
> +  GE40_2,
> +  GE25_1,
> +  GE25_2,
> +  GE25_3,
> +  GE25_4,
> +  GE25_5,
> +  GE25_6,
> +  GE25_7,
> +  GE25_8,
> +  GE25_9,
> +  GE25_10,
> +  SERDES_PROTOCOL_COUNT
> +} SERDES_PROTOCOL;
> +#endif
> diff --git a/Silicon/NXP/LX2160A/Library/SocLib/SerDes.c 
> b/Silicon/NXP/LX2160A/Library/SocLib/SerDes.c
> new file mode 100644
> index 000000000000..58f2b3df3600
> --- /dev/null
> +++ b/Silicon/NXP/LX2160A/Library/SocLib/SerDes.c
> @@ -0,0 +1,211 @@
> +/** SerDes.c
> +  Provides SoC specific SerDes interface
> +
> +  Copyright 2017-2020 NXP
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <Library/ChassisLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/SerDesHelperLib.h>
> +#include <SocSerDes.h>
> +#include <Soc.h>
> +#include <Uefi.h>
> +
> +// SerDes Protocol Mask and Shift in Reset Configuration Word (RCW) Status 
> Register
> +#define SERDES1_PROTOCOL_MASK       0x001f0000
> +#define SERDES1_PROTOCOL_SHIFT      16
> +#define SERDES2_PROTOCOL_MASK       0x03E00000
> +#define SERDES2_PROTOCOL_SHIFT      21
> +#define SERDES3_PROTOCOL_MASK       0x7C000000
> +#define SERDES3_PROTOCOL_SHIFT      26
> +
> +SERDES_CONFIG gSerDes1ConfigTable[] = {

Are these intended to be directly externally accessed (as opposed to
through gSerDesConfig[])? If not, could they be STATIC? (And if so,
they should probably have an 'm' (module) prefix rather than a 'g'
(global) one.

/
    Leif

> +  {  1, { PCIE2, PCIE2, PCIE2, PCIE2, PCIE1, PCIE1, PCIE1, PCIE1 } },
> +  {  2, { PCIE2, PCIE2, PCIE2, PCIE2, SGMII6, SGMII5, SGMII4, SGMII3 } },
> +  {  3, { PCIE2, PCIE2, PCIE2, PCIE2, XFI6, XFI5, XFI4, XFI3 } },
> +  {  4, { SGMII10, SGMII9, SGMII8, SGMII7, SGMII6, SGMII5, SGMII4, SGMII3 } 
> },
> +  {  5, { XFI10, XFI9, XFI8, XFI7, PCIE1, PCIE1, PCIE1, PCIE1} },
> +  {  6, { SGMII10, SGMII9, SGMII8, SGMII7, SGMII6, SGMII5, XFI4, XFI3 } },
> +  {  7, { SGMII10, SGMII9, SGMII8, SGMII7, XFI6, XFI5, XFI4, XFI3  } },
> +  {  8, { XFI10, XFI9, XFI8, XFI7, XFI6, XFI5, XFI4, XFI3 } },
> +  {  9, { SGMII10, SGMII9, SGMII8, PCIE2, SGMII6, SGMII5, SGMII4, PCIE1 } },
> +  { 10, { XFI10, XFI9, XFI8, PCIE2, XFI6, XFI5, XFI4, PCIE1 } },
> +  { 11, { SGMII10, SGMII9, PCIE2, PCIE2, SGMII6, SGMII5, PCIE1, PCIE1 } },
> +  { 12, { SGMII10, SGMII9, PCIE2, PCIE2, PCIE1, PCIE1, PCIE1, PCIE1 } },
> +  { 13, { GE100_2, GE100_2, GE100_2, GE100_2, GE100_1, GE100_1, GE100_1, 
> GE100_1 } },
> +  { 14, { PCIE2, PCIE2, PCIE2, PCIE2, GE100_1, GE100_1, GE100_1, GE100_1 } },
> +  { 15, { PCIE2, PCIE2, PCIE2, PCIE2, GE50_2, GE50_2, GE50_1, GE50_1 } },
> +  { 16, { PCIE2, PCIE2, PCIE2, PCIE2, GE25_6, GE25_5, GE50_1, GE50_1 } },
> +  { 17, { PCIE2, PCIE2, PCIE2, PCIE2, GE25_6, GE25_5, GE25_4, GE25_3 } },
> +  { 18, { XFI10, XFI9, XFI8, XFI7, GE25_6, GE25_5, XFI4, XFI3 } },
> +  { 19, { GE40_2, GE40_2, GE40_2, GE40_2, GE25_6, GE25_5, XFI4, XFI3 } },
> +  { 20, { GE40_2, GE40_2, GE40_2, GE40_2, GE40_1, GE40_1, GE40_1, GE40_1 } },
> +  { 21, { GE25_10, GE25_9, PCIE2, PCIE2, GE25_6, GE25_5, GE25_4, GE25_3 } },
> +  { 22, { XFI10, XFI9, PCIE2, PCIE2, XFI6, XFI5, XFI4, XFI3 } },
> +  {}
> +};
> +
> +SERDES_CONFIG gSerDes2ConfigTable[] = {
> +  {  1, { PCIE3, PCIE3, SATA1, SATA2, PCIE4, PCIE4, PCIE4, PCIE4 } },
> +  {  2, { PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3 } },
> +  {  3, { PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, PCIE4, PCIE4 } },
> +  {  4, { PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, SATA1, SATA2 } },
> +  {  5, { PCIE3, PCIE3, PCIE3, PCIE3, SATA3, SATA4, SATA1, SATA2 } },
> +  {  6, { PCIE3, PCIE3, PCIE3, PCIE3, SGMII15, SGMII16, XFI13, XFI14} },
> +  {  7, { PCIE3, SGMII12, SGMII17, SGMII18, PCIE4, SGMII16, XFI13, XFI14} },
> +  {  8, { 0, 0, SATA1, SATA2, SATA3, SATA4, XFI13, XFI14} },
> +  {  9, { SGMII11, SGMII12, SGMII17, SGMII18, SGMII15, SGMII16, SGMII13, 
> SGMII14 } },
> +  { 10, { SGMII11, SGMII12, SGMII17, SGMII18, PCIE4, PCIE4, PCIE4, PCIE4 } },
> +  { 11, { PCIE3, SGMII12, SGMII17, SGMII18, PCIE4, SGMII16, SGMII13, SGMII14 
> } },
> +  { 12, { SGMII11, SGMII12, SGMII17, SGMII18, PCIE4, PCIE4, SATA1, SATA2 } },
> +  { 13, { PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, SGMII13, SGMII14 } },
> +  { 14, { PCIE3, PCIE3, SGMII17, SGMII18, PCIE4, PCIE4, SGMII13, SGMII14 } },
> +  {}
> +};
> +
> +SERDES_CONFIG gSerDes3ConfigTable[] = {
> +  { 2, { PCIE5, PCIE5, PCIE5, PCIE5, PCIE5, PCIE5, PCIE5, PCIE5 } },
> +  { 3, { PCIE5, PCIE5, PCIE5, PCIE5, PCIE6, PCIE6, PCIE6, PCIE6 } },
> +  {}
> +};
> +
> +SERDES_CONFIG *gSerDesConfig[] = {
> +  gSerDes1ConfigTable,
> +  gSerDes2ConfigTable,
> +  gSerDes3ConfigTable
> +};
> +
> +/**
> +  Probe all SerDes for lane protocol and execute provided callback function.
> +
> +  @param  SerDesLaneProbeCallback Pointer Callback function to be called for 
> Lane protocol
> +  @param  Arg                     Pointer to Arguments to be passed to 
> callback function.
> +
> +**/
> +VOID
> +SerDesProbeLanes (
> +  IN SERDES_PROBE_LANES_CALLBACK SerDesLaneProbeCallback,
> +  IN VOID                        *Arg
> +  )
> +{
> +  UINT32                 SerDes1Protocol;
> +  UINT32                 SerDes2Protocol;
> +  UINT32                 SerDes3Protocol;
> +  LX2160A_DEVICE_CONFIG  *DeviceConfig;
> +
> +  DeviceConfig = (LX2160A_DEVICE_CONFIG  *)LX2160A_DCFG_ADDRESS;
> +  SerDes1Protocol = DcfgRead32 ((UINTN)&DeviceConfig->RcwSr[28]) & 
> SERDES1_PROTOCOL_MASK;
> +  SerDes1Protocol >>= SERDES1_PROTOCOL_SHIFT;
> +  SerDes2Protocol = DcfgRead32 ((UINTN)&DeviceConfig->RcwSr[28]) & 
> SERDES2_PROTOCOL_MASK;
> +  SerDes2Protocol >>= SERDES2_PROTOCOL_SHIFT;
> +  SerDes3Protocol = DcfgRead32 ((UINTN)&DeviceConfig->RcwSr[28]) & 
> SERDES3_PROTOCOL_MASK;
> +  SerDes3Protocol >>= SERDES3_PROTOCOL_SHIFT;
> +
> +  // SerDes1
> +  SerDesInstanceProbeLanes (
> +    SERDES_1,
> +    SerDes1Protocol,
> +    FixedPcdGet8 (PcdSerDesLanes),
> +    SERDES_PROTOCOL_COUNT,
> +    gSerDesConfig[SERDES_1],
> +    SerDesLaneProbeCallback,
> +    Arg
> +    );
> +
> +  // SerDes2
> +  SerDesInstanceProbeLanes (
> +    SERDES_2,
> +    SerDes2Protocol,
> +    FixedPcdGet8 (PcdSerDesLanes),
> +    SERDES_PROTOCOL_COUNT,
> +    gSerDesConfig[SERDES_2],
> +    SerDesLaneProbeCallback,
> +    Arg
> +    );
> +
> +  // SerDes3
> +  SerDesInstanceProbeLanes (
> +    SERDES_3,
> +    SerDes3Protocol,
> +    FixedPcdGet8 (PcdSerDesLanes),
> +    SERDES_PROTOCOL_COUNT,
> +    gSerDesConfig[SERDES_3],
> +    SerDesLaneProbeCallback,
> +    Arg
> +    );
> +}
> +
> +/**
> +  Function to return SerDes protocol map for all SerDes available on board.
> +
> +  @param  SerDesProtocolMap   Pointer to SerDes protocl map.
> +
> +**/
> +VOID
> +GetSerDesProtocolMap (
> +  OUT UINT64   *SerDesProtocolMap
> +  )
> +{
> +  UINT32                 SerDes1Protocol;
> +  UINT32                 SerDes2Protocol;
> +  UINT32                 SerDes3Protocol;
> +  LX2160A_DEVICE_CONFIG  *DeviceConfig;
> +  EFI_STATUS             Status;
> +
> +  DeviceConfig = (LX2160A_DEVICE_CONFIG  *)LX2160A_DCFG_ADDRESS;
> +  SerDes1Protocol = DcfgRead32 ((UINTN)&DeviceConfig->RcwSr[28]) & 
> SERDES1_PROTOCOL_MASK;
> +  SerDes1Protocol >>= SERDES1_PROTOCOL_SHIFT;
> +  SerDes2Protocol = DcfgRead32 ((UINTN)&DeviceConfig->RcwSr[28]) & 
> SERDES2_PROTOCOL_MASK;
> +  SerDes2Protocol >>= SERDES2_PROTOCOL_SHIFT;
> +  SerDes3Protocol = DcfgRead32 ((UINTN)&DeviceConfig->RcwSr[28]) & 
> SERDES3_PROTOCOL_MASK;
> +  SerDes3Protocol >>= SERDES3_PROTOCOL_SHIFT;
> +
> +  *SerDesProtocolMap = 0;
> +
> +  // SerDes1
> +  Status = GetSerDesMap (
> +             SERDES_1,
> +             SerDes1Protocol,
> +             FixedPcdGet8 (PcdSerDesLanes),
> +             SERDES_PROTOCOL_COUNT,
> +             gSerDesConfig[SERDES_1],
> +             SerDesProtocolMap
> +             );
> +
> +  if (Status != EFI_SUCCESS) {
> +    DEBUG ((DEBUG_ERROR, "%a: failed for SerDes1 \n",__FUNCTION__));
> +    *SerDesProtocolMap = 0;
> +  }
> +
> +  // SerDes2
> +  Status = GetSerDesMap (
> +             SERDES_2,
> +             SerDes2Protocol,
> +             FixedPcdGet8 (PcdSerDesLanes),
> +             SERDES_PROTOCOL_COUNT,
> +             gSerDesConfig[SERDES_2],
> +             SerDesProtocolMap
> +             );
> +
> +  if (Status != EFI_SUCCESS) {
> +    DEBUG ((DEBUG_ERROR, "%a: failed for SerDes2 \n",__FUNCTION__));
> +    *SerDesProtocolMap = 0;
> +  }
> +
> +  // SerDes3
> +  Status = GetSerDesMap (
> +             SERDES_3,
> +             SerDes3Protocol,
> +             FixedPcdGet8 (PcdSerDesLanes),
> +             SERDES_PROTOCOL_COUNT,
> +             gSerDesConfig[SERDES_3],
> +             SerDesProtocolMap
> +             );
> +
> +  if (Status != EFI_SUCCESS) {
> +    DEBUG ((DEBUG_ERROR, "%a: failed for SerDes3 \n",__FUNCTION__));
> +    *SerDesProtocolMap = 0;
> +  }
> +}
> -- 
> 2.7.4
> 

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

View/Reply Online (#61340): https://edk2.groups.io/g/devel/message/61340
Mute This Topic: https://groups.io/mt/74793008/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to