/** @file
Copyright (c) 2018, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
#include
/**
Structure for PCH stepping string mapping
**/
struct PCH_STEPPING_STRING {
PCH_STEPPING Stepping;
CHAR8 *String;
};
GLOBAL_REMOVE_IF_UNREFERENCED
struct PCH_STEPPING_STRING mSteppingStrs[] = {
{PchHA0, "A0"},
{PchHB0, "B0"},
{PchHC0, "C0"},
{PchHD0, "D0"},
{PchHD1, "D1"},
#ifdef SIMICS_FLAG
{PchLpA0, "A0"},
#endif
{PchLpB0, "B0"},
{PchLpB1, "B1"},
{PchLpC0, "C0"},
{PchLpC1, "C1"},
{LbgA0, "A0"},
{LbgB0, "B0"},
{LbgB1, "B1"},
{LbgB2, "B2"},
{LbgS0, "S0"},
{LbgS1, "S1"},
{PchSteppingMax, NULL}
};
/**
Structure for PCH series string mapping
**/
struct PCH_SERIES_STRING {
PCH_SERIES Series;
CHAR8 *String;
};
GLOBAL_REMOVE_IF_UNREFERENCED
struct PCH_SERIES_STRING mSeriesStrs[] = {
{PchH, "SKL PCH-H"},
{PchLp, "SKL PCH-LP"},
{PchUnknownSeries, NULL}
};
/**
Structure for PCH sku string mapping
**/
struct PCH_SKU_STRING {
UINT16 Id;
CHAR8 *String;
};
GLOBAL_REMOVE_IF_UNREFERENCED
struct PCH_SKU_STRING mSkuStrs[] = {
//
// SKL PCH H Desktop LPC Device IDs
//
{V_PCH_H_LPC_DEVICE_ID_DT_SUPER_SKU, "Super SKU"},
{V_PCH_H_LPC_DEVICE_ID_DT_0, "Super SKU (locked)"},
{V_PCH_H_LPC_DEVICE_ID_DT_1, "H110"},
{V_PCH_H_LPC_DEVICE_ID_DT_2, "H170"},
{V_PCH_H_LPC_DEVICE_ID_DT_3, "Z170"},
{V_PCH_H_LPC_DEVICE_ID_DT_4, "Q170"},
{V_PCH_H_LPC_DEVICE_ID_DT_5, "Q150"},
{V_PCH_H_LPC_DEVICE_ID_DT_6, "B150"},
{V_PCH_H_LPC_DEVICE_ID_UNFUSE, "Unfused SKU"},
//
// SKL PCH H Server/WS LPC Device IDs
//
{V_PCH_H_LPC_DEVICE_ID_SVR_0, "C236"},
{V_PCH_H_LPC_DEVICE_ID_SVR_1, "C232"},
{V_PCH_H_LPC_DEVICE_ID_SVR_2, "CM236"},
{V_PCH_H_LPC_DEVICE_ID_A14B, "Super SKU (Unlocked)"},
{V_PCH_LBG_LPC_DEVICE_ID_UNFUSED, "LBG Unfused SKU"},
{V_PCH_LBG_LPC_DEVICE_ID_SS_0, "LBG SuperSKU - 0"},
{V_PCH_LBG_LPC_DEVICE_ID_SS_4_SD, "LBG SuperSKU - 4/SD"},
{V_PCH_LBG_LPC_DEVICE_ID_SS_T80_NS, "LBG SuperSKU - T80/SD"},
{V_PCH_LBG_LPC_DEVICE_ID_SS_1G, "LBG SuperSKU - 1G"},
{V_PCH_LBG_LPC_DEVICE_ID_SS_T, "LBG SuperSKU - T"},
{V_PCH_LBG_LPC_DEVICE_ID_SS_L, "LBG SuperSKU - L"},
{V_PCH_LBG_PROD_LPC_DEVICE_ID_0, "LBG QS/PRQ - 0"},
{V_PCH_LBG_PROD_LPC_DEVICE_ID_1G, "LBG QS/PRQ - 1G"},
{V_PCH_LBG_PROD_LPC_DEVICE_ID_2, "LBG QS/PRQ - 2"},
{V_PCH_LBG_PROD_LPC_DEVICE_ID_4, "LBG QS/PRQ - 4"},
{V_PCH_LBG_PROD_LPC_DEVICE_ID_E, "LBG QS/PRQ - E"},
{V_PCH_LBG_PROD_LPC_DEVICE_ID_M, "LBG QS/PRQ - M"},
{V_PCH_LBG_PROD_LPC_DEVICE_ID_T, "LBG QS/PRQ - T"},
{V_PCH_LBG_PROD_LPC_DEVICE_ID_LP, "LBG QS/PRQ - LP"},
//
// SKL PCH H Mobile LPC Device IDs
//
{V_PCH_H_LPC_DEVICE_ID_MB_0, "QM170"},
{V_PCH_H_LPC_DEVICE_ID_MB_1, "HM170"},
{V_PCH_H_LPC_DEVICE_ID_MB_2, "QMS170"},
{V_PCH_H_LPC_DEVICE_ID_MB_SUPER_SKU, "Super SKU"},
//
// SKL PCH LP Mobile LPC Device IDs
//
{V_PCH_LP_LPC_DEVICE_ID_UNFUSE, "Unfused SKU"},
{V_PCH_LP_LPC_DEVICE_ID_MB_SUPER_SKU, "Super SKU"},
{V_PCH_LP_LPC_DEVICE_ID_MB_0, "Super SKU (locked)"},
{V_PCH_LP_LPC_DEVICE_ID_MB_1, "(U) Base SKU"},
{V_PCH_LP_LPC_DEVICE_ID_MB_2, "(Y) Premium SKU"},
{V_PCH_LP_LPC_DEVICE_ID_MB_3, "(U) Premium SKU"},
{0xFFFF, NULL}
};
/**
Get PCH stepping ASCII string
The return string is zero terminated.
@param [in] PchStep Pch stepping
@param [out] Buffer Output buffer of string
@param [in,out] BufferSize Size of input buffer,
and return required string size when buffer is too small.
@retval EFI_SUCCESS String copy successfully
@retval EFI_INVALID_PARAMETER The stepping is not supported, or parameters are NULL
@retval EFI_BUFFER_TOO_SMALL Input buffer size is too small
**/
EFI_STATUS
PchGetSteppingStr (
IN PCH_STEPPING PchStep,
OUT CHAR8 *Buffer,
IN OUT UINT32 *BufferSize
)
{
UINTN Index;
UINT32 StrLength;
CHAR8 *Str;
EFI_STATUS Status;
if ((Buffer == NULL) || (BufferSize == NULL)) {
return EFI_INVALID_PARAMETER;
}
if (*BufferSize > 0) {
Buffer[0] = 0;
}
Str = NULL;
StrLength = 0;
for (Index = 0; mSteppingStrs[Index].Stepping != PchSteppingMax; Index++) {
if (PchStep == mSteppingStrs[Index].Stepping) {
StrLength = (UINT32) AsciiStrLen (mSteppingStrs[Index].String);
Str = mSteppingStrs[Index].String;
break;
}
}
if (StrLength == 0) {
// Unsupported Stepping
// ASSERT (FALSE);
return EFI_INVALID_PARAMETER;
}
if (*BufferSize <= StrLength) {
*BufferSize = StrLength + 1;
return EFI_BUFFER_TOO_SMALL;
}
Status = AsciiStrCpyS (Buffer, *BufferSize, Str);
ASSERT_EFI_ERROR(Status);
return Status;
}
/**
Get PCH series ASCII string
The return string is zero terminated.
@param [in] PchSeries Pch series
@param [out] Buffer Output buffer of string
@param [in,out] BufferSize Size of input buffer,
and return required string size when buffer is too small.
@retval EFI_SUCCESS String copy successfully
@retval EFI_INVALID_PARAMETER The series is not supported, or parameters are NULL
@retval EFI_BUFFER_TOO_SMALL Input buffer size is too small
**/
EFI_STATUS
PchGetSeriesStr (
IN PCH_SERIES PchSeries,
OUT CHAR8 *Buffer,
IN OUT UINT32 *BufferSize
)
{
UINTN Index;
UINT32 StrLength;
CHAR8 *Str;
EFI_STATUS Status;
if ((Buffer == NULL) || (BufferSize == NULL)) {
return EFI_INVALID_PARAMETER;
}
if (*BufferSize > 0) {
Buffer[0] = 0;
}
Str = NULL;
StrLength = 0;
for (Index = 0; mSeriesStrs[Index].Series != PchUnknownSeries; Index++) {
if (PchSeries == mSeriesStrs[Index].Series) {
StrLength = (UINT32) AsciiStrLen (mSeriesStrs[Index].String);
Str = mSeriesStrs[Index].String;
break;
}
}
if (StrLength == 0) {
// Unsupported Series
// ASSERT (FALSE);
return EFI_INVALID_PARAMETER;
}
if (*BufferSize <= StrLength) {
*BufferSize = StrLength + 1;
return EFI_BUFFER_TOO_SMALL;
}
Status = AsciiStrCpyS (Buffer, *BufferSize, Str);
ASSERT_EFI_ERROR(Status);
return Status;
}
/**
Get PCH Sku ASCII string
The return string is zero terminated.
@param [in] LpcDid LPC device id
@param [out] Buffer Output buffer of string
@param [in,out] BufferSize Size of input buffer,
and return required string size when buffer is too small.
@retval EFI_SUCCESS String copy successfully
@retval EFI_INVALID_PARAMETER The series is not supported, or parameters are NULL
@retval EFI_BUFFER_TOO_SMALL Input buffer size is too small
**/
EFI_STATUS
PchGetSkuStr (
IN UINT16 LpcDid,
OUT CHAR8 *Buffer,
IN OUT UINT32 *BufferSize
)
{
UINTN Index;
UINT32 StrLength;
CHAR8 *Str;
EFI_STATUS Status;
if ((Buffer == NULL) || (BufferSize == NULL)) {
return EFI_INVALID_PARAMETER;
}
if (*BufferSize > 0) {
Buffer[0] = 0;
}
Str = NULL;
StrLength = 0;
for (Index = 0; mSkuStrs[Index].Id != 0xFFFF; Index++) {
if (LpcDid == mSkuStrs[Index].Id) {
StrLength = (UINT32) AsciiStrLen (mSkuStrs[Index].String);
Str = mSkuStrs[Index].String;
}
}
if (StrLength == 0) {
// Unsupported Sku
// ASSERT (FALSE);
return EFI_INVALID_PARAMETER;
}
if (*BufferSize <= StrLength) {
*BufferSize = StrLength + 1;
return EFI_BUFFER_TOO_SMALL;
}
Status = AsciiStrCpyS (Buffer, *BufferSize, Str);
ASSERT_EFI_ERROR(Status);
return Status;
}