/** @file
@copyright
Copyright 2018 - 2021 Intel Corporation.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include "PeiBoardInit.h"
#include
#include
#include
#include
#include
#include
#include
#define GPIO_SKL_H_GPP_B20 0x01010014
VOID TypeCooperCityRPPlatformUpdateVrIdAddress (VOID);
/**
Update CooperCity VR ID SVID Information
retval N/A
**/
VOID
TypeCooperCityRPPlatformUpdateVrIdAddress (
VOID
)
{
MEM_SVID_MAP *MemSvidMap = NULL;
UINTN Size = 0;
Size = sizeof (MEM_SVID_MAP);
MemSvidMap = (MEM_SVID_MAP *) PcdGetPtr (PcdMemSrvidMap);
if (MemSvidMap == NULL) {
DEBUG ((EFI_D_ERROR, "UpdateVrIdAddress() - PcdMemSrvidMap == NULL\n"));
return;
}
/*
Map VR ID Address to Memory controller
The mailbox command can support up to 4 DDR VR ID's, 0x10, 0x12, 0x14, and 0x16.
Whitley PHAS indicates that Whitley (like Purley) only connects 2 VRs (VR ID's 0x10 and 0x12).
*/
MemSvidMap->Socket[0].Mc[0] = 0x10; //SVID BUS 1, ADDR 0
MemSvidMap->Socket[0].Mc[1] = 0x12; //SVID BUS 1, ADDR 2
MemSvidMap->Socket[1].Mc[0] = 0x10; //SVID BUS 1, ADDR 0
MemSvidMap->Socket[1].Mc[1] = 0x12; //SVID BUS 1, ADDR 2
MemSvidMap->Socket[2].Mc[0] = 0x10; //SVID BUS 1, ADDR 0
MemSvidMap->Socket[2].Mc[1] = 0x12; //SVID BUS 1, ADDR 2
MemSvidMap->Socket[3].Mc[0] = 0x10; //SVID BUS 1, ADDR 0
MemSvidMap->Socket[3].Mc[1] = 0x12; //SVID BUS 1, ADDR 2
MemSvidMap->Socket[4].Mc[0] = 0x10; //SVID BUS 1, ADDR 0
MemSvidMap->Socket[4].Mc[1] = 0x12; //SVID BUS 1, ADDR 2
MemSvidMap->Socket[5].Mc[0] = 0x10; //SVID BUS 1, ADDR 0
MemSvidMap->Socket[5].Mc[1] = 0x12; //SVID BUS 1, ADDR 2
MemSvidMap->Socket[6].Mc[0] = 0x10; //SVID BUS 1, ADDR 0
MemSvidMap->Socket[6].Mc[1] = 0x12; //SVID BUS 1, ADDR 2
MemSvidMap->Socket[7].Mc[0] = 0x10; //SVID BUS 1, ADDR 0
MemSvidMap->Socket[7].Mc[1] = 0x12; //SVID BUS 1, ADDR 2
PcdSetPtrS (PcdMemSrvidMap, &Size, (VOID *) MemSvidMap);
}
EFI_STATUS
TypeCooperCityRPPlatformPcdUpdateCallback (
VOID
)
{
CHAR8 FamilyName[] = "WildcatPass";
CHAR8 BoardName[] = "S2600WT ";
UINTN Size;
UINT32 Data32;
CHAR16 PlatformName[] = L"TypeCooperCityRP";
UINTN PlatformNameSize = 0;
UINTN PlatformFeatureFlag = 0;
UINT8 SKUType = 0;
UINT8 SKUTypeSockets = 0;
DYNAMIC_SI_LIBARY_PPI *DynamicSiLibraryPpi = NULL;
EFI_STATUS Status;
//#Integer for BoardID, must match the SKU number and be unique.
Status = PcdSet16S (PcdOemSkuBoardID , TypeCooperCityRP);
ASSERT_EFI_ERROR(Status);
if (EFI_ERROR(Status)) {
return Status;
}
Status = PcdSet16S (PcdOemSkuBoardFamily , 0x30);
ASSERT_EFI_ERROR(Status);
if (EFI_ERROR(Status)) {
return Status;
}
Status = PeiServicesLocatePpi (&gDynamicSiLibraryPpiGuid, 0, NULL, &DynamicSiLibraryPpi);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return Status;
}
GetPlatformCapabilitiesInfo(&SKUType, DynamicSiLibraryPpi);
DEBUG ((DEBUG_INFO, " PcdOemSkuBoardSocketCount sku type %d\n", SKUType));
if (SKUType == PLATFORM_CAPABILITY_2_SOCKET) {
SKUTypeSockets = 2;
} else {
SKUTypeSockets = (SKUType == PLATFORM_CAPABILITY_4_SOCKET) ? 4: 8;
}
//# Number of Sockets on Board.
Status = PcdSet32S (PcdOemSkuBoardSocketCount , SKUTypeSockets);
ASSERT_EFI_ERROR(Status);
if (EFI_ERROR(Status)) {
return Status;
}
// Max channel and max DIMM
Status = PcdSet32S (PcdOemSkuMaxChannel , 6);
ASSERT_EFI_ERROR(Status);
if (EFI_ERROR(Status)) {
return Status;
}
Status = PcdSet32S (PcdOemSkuMaxDimmPerChannel , 2);
ASSERT_EFI_ERROR(Status);
if (EFI_ERROR(Status)) {
return Status;
}
Status = PcdSetBoolS (PcdOemSkuDimmLayout, TRUE);
ASSERT_EFI_ERROR(Status);
if (EFI_ERROR(Status)) {
return Status;
}
//Update Onboard Video Controller PCI Ven_id, Dev_id
Status = PcdSet16S (PcdOnboardVideoPciVendorId, 0x1A03);
ASSERT_EFI_ERROR(Status);
if (EFI_ERROR(Status)) {
return Status;
}
Status = PcdSet16S (PcdOnboardVideoPciDeviceId, 0x2000);
ASSERT_EFI_ERROR(Status);
if (EFI_ERROR(Status)) {
return Status;
}
//#
//# Misc.
//#
//# V_PCIE_PORT_PXPSLOTCTRL_ATNLED_OFF
Status = PcdSet16S (PcdOemSkuMrlAttnLed , 0xc0);
ASSERT_EFI_ERROR(Status);
if (EFI_ERROR(Status)) {
return Status;
}
//SDP Active Flag
Status = PcdSet8S (PcdOemSkuSdpActiveFlag , 0x0);
ASSERT_EFI_ERROR(Status);
if (EFI_ERROR(Status)) {
return Status;
}
//# Zero terminated string to ID family
Size = AsciiStrSize (FamilyName);
Status = PcdSetPtrS (PcdOemSkuFamilyName , &Size, FamilyName);
ASSERT_EFI_ERROR(Status);
if (EFI_ERROR(Status)) {
return Status;
}
//# Zero terminated string to Board Name
Size = AsciiStrSize (BoardName);
Status = PcdSetPtrS (PcdOemSkuBoardName , &Size, BoardName);
ASSERT_EFI_ERROR(Status);
if (EFI_ERROR(Status)) {
return Status;
}
PlatformNameSize = sizeof (PlatformName);
Status = PcdSet32S (PcdOemSkuPlatformNameSize , (UINT32)PlatformNameSize);
ASSERT_EFI_ERROR(Status);
if (EFI_ERROR(Status)) {
return Status;
}
Status = PcdSetPtrS (PcdOemSkuPlatformName , &PlatformNameSize, PlatformName);
ASSERT_EFI_ERROR(Status);
if (EFI_ERROR(Status)) {
return Status;
}
//# FeaturesBasedOnPlatform
Status = PcdSet32S (PcdOemSkuPlatformFeatureFlag , (UINT32)PlatformFeatureFlag);
ASSERT_EFI_ERROR(Status);
if (EFI_ERROR(Status)) {
return Status;
}
//# Assert GPIO
Data32 = 0;
Status = PcdSet32S (PcdOemSkuAssertPostGPIOValue, Data32);
ASSERT_EFI_ERROR(Status);
if (EFI_ERROR(Status)) {
return Status;
}
Status = PcdSet32S (PcdOemSkuAssertPostGPIO, GPIO_SKL_H_GPP_B20);
ASSERT_EFI_ERROR(Status);
if (EFI_ERROR(Status)) {
return Status;
}
//# UplinkPortIndex
Status = PcdSet8S (PcdOemSkuUplinkPortIndex, 5);
if (EFI_ERROR(Status)) {
return Status;
}
DEBUG ((EFI_D_INFO, "Uba Callback: PlatformPcdUpdateCallback is called!\n"));
Status = TypeCooperCityRPPlatformUpdateAcpiTablePcds ();
//# Board Type Bit Mask
PcdSet32S (PcdBoardTypeBitmask, 0);
ASSERT_EFI_ERROR(Status);
if (DynamicSiLibraryPpi->IsCpuAndRevision (CPU_CPX, REV_ALL)) {
// Update VR ID Address
TypeCooperCityRPPlatformUpdateVrIdAddress ();
}
return Status;
}
PLATFORM_PCD_UPDATE_TABLE TypeCooperCityRPPcdUpdateTable =
{
PLATFORM_PCD_UPDATE_SIGNATURE,
PLATFORM_PCD_UPDATE_VERSION,
TypeCooperCityRPPlatformPcdUpdateCallback
};
EFI_STATUS
TypeCooperCityRPInstallPcdData (
IN UBA_CONFIG_DATABASE_PPI *UbaConfigPpi
)
{
EFI_STATUS Status;
Status = UbaConfigPpi->AddData (
UbaConfigPpi,
&gPlatformPcdConfigDataGuid,
&TypeCooperCityRPPcdUpdateTable,
sizeof(TypeCooperCityRPPcdUpdateTable)
);
return Status;
}