/** @file
Pch information library.
All function in this library is available for PEI, DXE, and SMM,
But do not support UEFI RUNTIME environment call.
Copyright (c) 2019 - 2020 Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include "PchInfoLibPrivate.h"
#include
#include
/**
Determine Pch Series based on Device Id
@param[in] LpcDeviceId Lpc Device Id
@retval PCH_SERIES Pch Series
**/
PCH_SERIES
PchSeriesFromLpcDid (
IN UINT16 LpcDeviceId
)
{
switch (LpcDeviceId & B_LPC_CFG_DID) {
case V_LPC_CFG_DID_CNL_H:
return PCH_H;
case V_LPC_CFG_DID_CNL_LP:
return PCH_LP;
case V_LPC_CFG_DID_CML_LP:
return PCH_LP;
default:
return PCH_UNKNOWN_SERIES;
}
}
/**
Return Pch Generation
@retval PCH_GENERATION Pch Generation
**/
PCH_GENERATION
PchGeneration (
VOID
)
{
return CNL_PCH;
}
/**
Check if this is Server PCH
@retval TRUE It's a Server PCH
@retval FALSE It's not a Server PCH
**/
BOOLEAN
IsPchServer (
VOID
)
{
return FALSE;
}
/**
Get RST mode supported by the silicon
@retval RST_MODE RST mode supported by silicon
**/
RST_MODE
PchGetSupportedRstMode (
VOID
)
{
switch (PchGetLpcDid ()) {
case V_CNL_PCH_LP_LPC_CFG_DEVICE_ID_MB_4:
case V_CNL_PCH_H_LPC_CFG_DEVICE_ID_A303_SKU:
return RstUnsupported;
break;
default:
return RstPremium;
break;
}
}
/**
Check if this is Server SKU
@retval TRUE It's PCH Server SKU
@retval FALSE It's not PCH Server SKU
**/
BOOLEAN
IsPchServerSku (
VOID
)
{
UINT16 LpcDid;
LpcDid = PchGetLpcDid ();
if (LpcDid == V_CNL_PCH_H_LPC_CFG_DEVICE_ID_A309_SKU) {
return TRUE;
} else {
return FALSE;
}
}
/**
Get PCH series ASCII string.
@retval PCH Series string
**/
CHAR8*
PchGetSeriesStr (
VOID
)
{
switch (PchSeries ()) {
case PCH_LP:
return "CNL PCH-LP";
case PCH_H:
return "CNL PCH-H";
default:
return NULL;
}
}
GLOBAL_REMOVE_IF_UNREFERENCED
struct PCH_SKU_STRING mSkuStrs[] = {
//
// PCH LP Mobile LPC Device IDs
//
{V_CNL_PCH_LP_LPC_CFG_DEVICE_ID_MB_SUPER_SKU, "Super SKU"},
{V_CNL_PCH_LP_LPC_CFG_DEVICE_ID_MB_0, "(U) Super SKU"},
{V_CNL_PCH_LP_LPC_CFG_DEVICE_ID_MB_1, "Super SKU (locked)"},
{V_CNL_PCH_LP_LPC_CFG_DEVICE_ID_MB_2, "(Y) Premium SKU"},
{V_CNL_PCH_LP_LPC_CFG_DEVICE_ID_MB_3, "(U) Premium SKU"},
{V_CNL_PCH_LP_LPC_CFG_DEVICE_ID_MB_4, "(U) Base/Mainstream SKU"},
{V_CNL_PCH_LP_LPC_CFG_DEVICE_ID_MB_5, "(Y) Super SKU"},
//
// PCH H LPC Device IDs
//
{V_CNL_PCH_H_LPC_CFG_DEVICE_ID_A300_SKU, "CNL PCH-H SKU A300"},
{V_CNL_PCH_H_LPC_CFG_DEVICE_ID_A303_SKU, "H310"},
{V_CNL_PCH_H_LPC_CFG_DEVICE_ID_A304_SKU, "H370"},
{V_CNL_PCH_H_LPC_CFG_DEVICE_ID_A305_SKU, "Z390"},
{V_CNL_PCH_H_LPC_CFG_DEVICE_ID_A306_SKU, "Q370"},
{V_CNL_PCH_H_LPC_CFG_DEVICE_ID_A309_SKU, "C246"},
{V_CNL_PCH_H_LPC_CFG_DEVICE_ID_A30A_SKU, "C242"},
{V_CNL_PCH_H_LPC_CFG_DEVICE_ID_A30B_SKU, "X399"},
{V_CNL_PCH_H_LPC_CFG_DEVICE_ID_A30C_SKU, "QM370"},
{V_CNL_PCH_H_LPC_CFG_DEVICE_ID_A30D_SKU, "HM370"},
{V_CNL_PCH_H_LPC_CFG_DEVICE_ID_A30E_SKU, "CM246"},
{0xFFFF, NULL}
};
/**
Check whether integrated LAN controller is supported by PCH Series.
@retval TRUE GbE is supported in current PCH
@retval FALSE GbE is not supported on current PCH
**/
BOOLEAN
PchIsGbeSupported (
VOID
)
{
return TRUE;
}
/**
Get Pch Maximum Pcie Root Port Number
@retval Pch Maximum Pcie Root Port Number
**/
UINT8
GetPchMaxPciePortNum (
VOID
)
{
if (IsPchLp ()) {
return 16;
} else {
return 24;
}
}
/**
Get Pch Usb2 Maximum Physical Port Number
@retval Pch Usb2 Maximum Physical Port Number
**/
UINT8
GetPchUsb2MaxPhysicalPortNum (
VOID
)
{
if (IsPchLp ()) {
return 10;
} else {
return 14;
}
}
/**
Get Pch Maximum Usb2 Port Number of XHCI Controller
@retval Pch Maximum Usb2 Port Number of XHCI Controller
**/
UINT8
GetPchXhciMaxUsb2PortNum (
VOID
)
{
if (IsPchLp ()) {
return 12;
} else {
return 16;
}
}
/**
Get Pch Maximum Usb3 Port Number of XHCI Controller
@retval Pch Maximum Usb3 Port Number of XHCI Controller
**/
UINT8
GetPchXhciMaxUsb3PortNum (
VOID
)
{
if (IsPchLp ()) {
return 6;
} else {
return 10;
}
}
/**
Check if given Display Audio Link T-Mode is supported
@param[in] Tmode T-mode support to be checked
@retval TRUE T-mode supported
@retval FALSE T-mode not supported
**/
BOOLEAN
IsAudioIDispTmodeSupported (
IN PCH_HDAUDIO_IDISP_TMODE Tmode
)
{
//
// iDisplay Audio Link T-mode support per PCH Generation/Series:
// 1. 1T - CNP-LP
// 2. 2T - CNP-LP/H (default)
//
switch (Tmode) {
case PchHdaIDispMode1T:
return IsPchLp ();
case PchHdaIDispMode2T:
return TRUE;
case PchHdaIDispMode4T:
case PchHdaIDispMode8T:
case PchHdaIDispMode16T:
default:
return FALSE;
}
}
/**
Gets the maximum number of UFS controller supported by this chipset.
@return Number of supported UFS controllers
**/
UINT8
PchGetMaxUfsNum (
VOID
)
{
if (IsPchLp ()) {
return 1;
} else {
return 0;
}
}
/**
Check if this chipset supports eMMC controller
@retval BOOLEAN TRUE if supported, FALSE otherwise
**/
BOOLEAN
IsPchEmmcSupported (
VOID
)
{
if (IsPchLp ()) {
return TRUE;
}
return FALSE;
}
/**
Check if this chipset supports SD controller
@retval BOOLEAN TRUE if supported, FALSE otherwise
**/
BOOLEAN
IsPchSdCardSupported (
VOID
)
{
return TRUE;
}
/**
Check if this chipset supports UFS controller
@retval BOOLEAN TRUE if supported, FALSE otherwise
**/
BOOLEAN
IsPchUfsSupported (
VOID
)
{
if (IsPchLp ()) {
return TRUE;
}
return FALSE;
}
/**
Check if link between PCH and CPU is an P-DMI
@retval TRUE P-DMI link
@retval FALSE Not an P-DMI link
**/
BOOLEAN
IsPchWithPdmi (
VOID
)
{
return IsPchH ();
}
/**
Check if link between PCH and CPU is an OP-DMI
@retval TRUE OP-DMI link
@retval FALSE Not an OP-DMI link
**/
BOOLEAN
IsPchWithOpdmi (
VOID
)
{
return !IsPchH ();
}
/**
Check if link between PCH and CPU is an F-DMI
@retval TRUE F-DMI link
@retval FALSE Not an F-DMI link
**/
BOOLEAN
IsPchWithFdmi (
VOID
)
{
return FALSE;
}