/**@file Build up platform processor information. Copyright (c) 2019, Hewlett Packard Enterprise Development LP. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ // // The package level header files this module uses // #include // // The Library classes this module consumes // #include #include #include #include #include #include #include /** Build up processor-specific HOB for U5MC Coreplex @param UniqueId Unique ID of this U5MC Coreplex processor @return EFI_SUCCESS The PEIM initialized successfully. **/ EFI_STATUS EFIAPI CreateU5MCCoreplexProcessorSpecificDataHob ( IN UINTN UniqueId ) { EFI_STATUS Status; UINT32 HartIdNumber; RISC_V_PROCESSOR_SPECIFIC_HOB_DATA *GuidHobData; EFI_GUID *ParentCoreGuid; BOOLEAN MCSupport; DEBUG ((DEBUG_INFO, "Building U5 Coreplex processor information HOB\n")); HartIdNumber = 0; ParentCoreGuid = PcdGetPtr(PcdSiFiveU5MCCoreplexGuid); MCSupport = PcdGetBool (PcdE5MCSupported); if (MCSupport == TRUE) { Status = CreateU54E51CoreProcessorSpecificDataHob (ParentCoreGuid, UniqueId, HartIdNumber, FALSE, TRUE, &GuidHobData); if (EFI_ERROR (Status) && Status != EFI_UNSUPPORTED) { DEBUG ((DEBUG_ERROR, "Faile to build U5MC processor informatino HOB\n")); ASSERT (FALSE); } else { if (!EFI_ERROR (Status)) { DEBUG((DEBUG_INFO, "Support E5 Monitor core on U5 platform, HOB at address 0x%x\n", GuidHobData)); } } HartIdNumber ++; } for (; HartIdNumber < (FixedPcdGet32 (PcdNumberofU5Cores) + (UINT32)MCSupport); HartIdNumber ++) { Status = CreateU54E51CoreProcessorSpecificDataHob (ParentCoreGuid, UniqueId, HartIdNumber, (HartIdNumber == FixedPcdGet32 (PcdBootHartId)), FALSE, &GuidHobData); if (EFI_ERROR (Status) && Status != EFI_UNSUPPORTED) { DEBUG ((DEBUG_ERROR, "Faile to build U5MC processor informatino HOB\n")); ASSERT (FALSE); } else { if (!EFI_ERROR (Status)) { DEBUG ((DEBUG_INFO, "Support U5 application core on U5 platform, HOB Data at address 0x%x\n", GuidHobData)); } } } DEBUG ((DEBUG_INFO, "Support %d U5 application cores on U5 platform\n", HartIdNumber - (UINT32)MCSupport)); if (HartIdNumber != FixedPcdGet32 (PcdHartCount)) { DEBUG ((DEBUG_ERROR, "Improper core settings...\n")); DEBUG ((DEBUG_ERROR, " PcdHartCount\n")); DEBUG ((DEBUG_ERROR, " PcdNumberofU5Cores\n")); DEBUG ((DEBUG_ERROR, " PcdE5MCSupported\n\n")); ASSERT (FALSE); } return Status; } /** Function to build processor related SMBIOS information. RISC-V SMBIOS DXE driver collect this information and build SMBIOS Type4 and Type7 record. @param ProcessorUid Unique ID of physical processor which owns this core. @param SmbiosHobPtr Pointer to receive RISC_V_PROCESSOR_SMBIOS_HOB_DATA. The pointers maintained in this structure is only valid before memory is discovered. Access to those pointers after memory is installed will cause unexpected issues. @return EFI_SUCCESS The SMBIOS Hobs were created successfully. **/ EFI_STATUS EFIAPI CreateU5MCProcessorSmbiosDataHob ( IN UINTN ProcessorUid, OUT RISC_V_PROCESSOR_SMBIOS_HOB_DATA **SmbiosHobPtr ) { EFI_GUID *GuidPtr; RISC_V_PROCESSOR_TYPE7_HOB_DATA L2CacheDataHob; RISC_V_PROCESSOR_SMBIOS_HOB_DATA SmbiosDataHob; RISC_V_PROCESSOR_TYPE4_HOB_DATA *ProcessorDataHobPtr; RISC_V_PROCESSOR_TYPE7_HOB_DATA *L1CacheDataHobPtr; RISC_V_PROCESSOR_TYPE7_HOB_DATA *L2CacheDataHobPtr; RISC_V_PROCESSOR_SMBIOS_HOB_DATA *SmbiosDataHobPtr; DEBUG ((DEBUG_INFO, "%a: Entry\n", __FUNCTION__)); if (SmbiosHobPtr == NULL) { return EFI_INVALID_PARAMETER; } CreateU54SmbiosType7L1DataHob (ProcessorUid, &L1CacheDataHobPtr); CreateU54SmbiosType4DataHob (ProcessorUid, &ProcessorDataHobPtr); // // Build up SMBIOS type 7 L2 cache record. // ZeroMem((VOID *)&L2CacheDataHob, sizeof (RISC_V_PROCESSOR_TYPE7_HOB_DATA)); L2CacheDataHob.PrcessorGuid = *((EFI_GUID *)PcdGetPtr (PcdSiFiveU5MCCoreplexGuid)); L2CacheDataHob.ProcessorUid = ProcessorUid; L2CacheDataHob.SmbiosType7Cache.SocketDesignation = TO_BE_FILLED_BY_VENDOR; L2CacheDataHob.SmbiosType7Cache.CacheConfiguration = RISC_V_CACHE_CONFIGURATION_CACHE_LEVEL_2 | \ RISC_V_CACHE_CONFIGURATION_LOCATION_EXTERNAL | \ RISC_V_CACHE_CONFIGURATION_ENABLED | \ RISC_V_CACHE_CONFIGURATION_MODE_UNKNOWN; L2CacheDataHob.SmbiosType7Cache.MaximumCacheSize = TO_BE_FILLED_BY_VENDOR; L2CacheDataHob.SmbiosType7Cache.InstalledSize = TO_BE_FILLED_BY_VENDOR; L2CacheDataHob.SmbiosType7Cache.SupportedSRAMType.Unknown = 1; L2CacheDataHob.SmbiosType7Cache.CurrentSRAMType.Unknown = 1; L2CacheDataHob.SmbiosType7Cache.CacheSpeed = TO_BE_FILLED_BY_VENDOR; L2CacheDataHob.SmbiosType7Cache.ErrorCorrectionType = TO_BE_FILLED_BY_VENDOR; L2CacheDataHob.SmbiosType7Cache.SystemCacheType = CacheTypeUnified; L2CacheDataHob.SmbiosType7Cache.Associativity = TO_BE_FILLED_BY_VENDOR; GuidPtr = (EFI_GUID *)PcdGetPtr (PcdProcessorSmbiosType7GuidHobGuid); L2CacheDataHobPtr = (RISC_V_PROCESSOR_TYPE7_HOB_DATA *)BuildGuidDataHob (GuidPtr, (VOID *)&L2CacheDataHob, sizeof (RISC_V_PROCESSOR_TYPE7_HOB_DATA)); if (L2CacheDataHobPtr == NULL) { DEBUG ((DEBUG_ERROR, "Fail to create GUID HOB of SiFive U5 MC Coreplex L2 cache RISC_V_PROCESSOR_TYPE7_HOB_DATA.\n")); ASSERT (FALSE); } ZeroMem((VOID *)&SmbiosDataHob, sizeof (RISC_V_PROCESSOR_SMBIOS_HOB_DATA)); SmbiosDataHob.Processor = ProcessorDataHobPtr; SmbiosDataHob.L1Cache = L1CacheDataHobPtr; SmbiosDataHob.L2Cache = L2CacheDataHobPtr; SmbiosDataHob.L3Cache = NULL; GuidPtr = (EFI_GUID *)PcdGetPtr (PcdProcessorSmbiosGuidHobGuid); SmbiosDataHobPtr = (RISC_V_PROCESSOR_SMBIOS_HOB_DATA *)BuildGuidDataHob (GuidPtr, (VOID *)&SmbiosDataHob, sizeof (RISC_V_PROCESSOR_SMBIOS_HOB_DATA)); if (SmbiosDataHobPtr == NULL) { DEBUG ((DEBUG_ERROR, "Fail to create GUID HOB of SiFive U5MC Coreplex RISC_V_PROCESSOR_SMBIOS_HOB_DATA.\n")); ASSERT (FALSE); } *SmbiosHobPtr = SmbiosDataHobPtr; DEBUG ((DEBUG_INFO, "%a: Exit\n", __FUNCTION__)); return EFI_SUCCESS; }