/** @file @copyright Copyright 2018 - 2021 Intel Corporation.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "PeiBoardInit.h" #include #include #include #include #include #include #include #include #define GPIO_SKL_H_GPP_B20 0x01010014 VOID TypeWilsonCityRPPlatformUpdateVrIdAddress (VOID); /** Update WilsonCity IMON SVID Information retval N/A **/ VOID TypeWilsonCityRPPlatformUpdateImonAddress ( VOID ) { VCC_IMON *VccImon = NULL; UINTN Size = 0; Size = sizeof (VCC_IMON); VccImon = (VCC_IMON *) PcdGetPtr (PcdImonAddr); if (VccImon == NULL) { DEBUG ((EFI_D_ERROR, "UpdateImonAddress() - PcdImonAddr == NULL\n")); return; } VccImon->VrSvid[0] = PcdGet8 (PcdWilsonCitySvidVrP1V8); VccImon->VrSvid[1] = PcdGet8 (PcdWilsonCitySvidVrVccAna); VccImon->VrSvid[2] = IMON_ADDR_LIST_END; // End array with 0xFF PcdSetPtrS (PcdImonAddr, &Size, (VOID *) VccImon); } /** Update WilsonCity VR ID SVID Information retval N/A **/ VOID TypeWilsonCityRPPlatformUpdateVrIdAddress ( 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). Those are typically shared such that MC0/MC2 share the same DDR VR (as they are on the same side of the CPU) and MC1/MC3 share the other. Depending on motherboard layout and other design constraints, this could change BIT 4 => 0 or 1, SVID BUS\Interface 0 or 1 respectively BIT 0:3 => SVID ADDRESS */ 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 TypeWilsonCityRPPlatformPcdUpdateCallback ( VOID ) { CHAR8 FamilyName[] = "Whitley"; CHAR8 BoardName[] = "EPRP"; UINT32 Data32; UINTN Size; UINTN PlatformFeatureFlag = 0; CHAR16 PlatformName[] = L"TypeWilsonCityRP"; UINTN PlatformNameSize = 0; EFI_STATUS Status; //#Integer for BoardID, must match the SKU number and be unique. Status = PcdSet16S (PcdOemSkuBoardID , TypeWilsonCityRP); ASSERT_EFI_ERROR(Status); if (EFI_ERROR(Status)) { return Status; } Status = PcdSet16S (PcdOemSkuBoardFamily , 0x30); ASSERT_EFI_ERROR(Status); if (EFI_ERROR(Status)) { return Status; } // Number of Sockets on Board. Status = PcdSet32S (PcdOemSkuBoardSocketCount, 2); ASSERT_EFI_ERROR(Status); if (EFI_ERROR(Status)) { return Status; } // Max channel and max DIMM Status = PcdSet32S (PcdOemSkuMaxChannel , 8); 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 = TypeWilsonCityRPPlatformUpdateAcpiTablePcds (); //# BMC Pcie Port Number PcdSet8S (PcdOemSkuBmcPciePortNumber, 5); ASSERT_EFI_ERROR(Status); //# Board Type Bit Mask PcdSet32S (PcdBoardTypeBitmask, CPU_TYPE_F_MASK | (CPU_TYPE_F_MASK << 4)); ASSERT_EFI_ERROR(Status); //Update IMON Address TypeWilsonCityRPPlatformUpdateImonAddress (); return Status; } PLATFORM_PCD_UPDATE_TABLE TypeWilsonCityRPPcdUpdateTable = { PLATFORM_PCD_UPDATE_SIGNATURE, PLATFORM_PCD_UPDATE_VERSION, TypeWilsonCityRPPlatformPcdUpdateCallback }; EFI_STATUS TypeWilsonCityRPInstallPcdData ( IN UBA_CONFIG_DATABASE_PPI *UbaConfigPpi ) { EFI_STATUS Status; Status = UbaConfigPpi->AddData ( UbaConfigPpi, &gPlatformPcdConfigDataGuid, &TypeWilsonCityRPPcdUpdateTable, sizeof(TypeWilsonCityRPPcdUpdateTable) ); return Status; }