From d7d5ddef074f3d1295370deaef52aad43ed95dab Mon Sep 17 00:00:00 2001 From: Yeoreum Yun Date: Sun, 5 Jul 2026 18:55:10 +0100 Subject: [PATCH] DynamicTablesPkg: add SMBIOS type 44 for risc-v Add Smbios Type 44 generator for the risc-v processor specific block support. Signed-off-by: Yeoreum Yun --- .../Include/RiscVNameSpaceObjects.h | 23 +++ .../SmbiosType44Lib/SmbiosType44Generator.c | 150 ++++++++++++++++-- .../SmbiosType44Lib/SmbiosType44Generator.h | 6 + 3 files changed, 167 insertions(+), 12 deletions(-) diff --git a/DynamicTablesPkg/Include/RiscVNameSpaceObjects.h b/DynamicTablesPkg/Include/RiscVNameSpaceObjects.h index 48a3b31b2d..0685dba1c4 100644 --- a/DynamicTablesPkg/Include/RiscVNameSpaceObjects.h +++ b/DynamicTablesPkg/Include/RiscVNameSpaceObjects.h @@ -39,6 +39,7 @@ typedef enum RiscVObjectID { ERiscVObjCmoInfo, ///< 6 - RISC-V CMO Info ERiscVObjMmuInfo, ///< 7 - RISC-V MMU Type Info ERiscVObjTimerInfo, ///< 8 - RISC-V Timer Type Info + ERiscVObjProcessorSpecificBlockInfo, ///< 9 - RISC-V Processor Specific Block Info ERiscVObjMax } ERISCV_OBJECT_ID; @@ -262,4 +263,26 @@ typedef struct CmRiscVTimerInfo { UINT64 TimeBaseFrequency; } CM_RISCV_TIMER_INFO; +/** A structure that describes the + Processor Specific Block for Smbios type 44 record. + + ID: ERiscVObjProcessorSpecificBlockInfo +*/ +typedef struct CmRiscVProcessorSpecificBlockInfo { + /// Revision + UINT16 Revision; + + /// The ID of this RISC-V hart. + UINT64 HartId; + + /// Vendor ID. + UINT64 VendorId; + + /// Machine Architecture ID. + UINT64 ArchId; + + /// Machine Implementation ID. + UINT64 ImplId; +} CM_RISCV_PROCESSOR_SPECIFIC_BLOCK_INFO; + #pragma pack() diff --git a/DynamicTablesPkg/Library/Smbios/SmbiosType44Lib/SmbiosType44Generator.c b/DynamicTablesPkg/Library/Smbios/SmbiosType44Lib/SmbiosType44Generator.c index f617928e58..f130ef5f0f 100644 --- a/DynamicTablesPkg/Library/Smbios/SmbiosType44Lib/SmbiosType44Generator.c +++ b/DynamicTablesPkg/Library/Smbios/SmbiosType44Lib/SmbiosType44Generator.c @@ -61,6 +61,12 @@ GET_OBJECT_LIST ( CM_X64_PROCESSOR_SPECIFIC_BLOCK_INFO ); +GET_OBJECT_LIST ( + EObjNameSpaceRiscV, + ERiscVObjProcessorSpecificBlockInfo, + CM_RISCV_PROCESSOR_SPECIFIC_BLOCK_INFO + ); + /** Get Arm Processor Specific sub-data CM objects. @param [in] CfgMgrProtocol Pointer to the Configuration Manager @@ -309,6 +315,51 @@ GetX64ProcBlockCmObj ( return EFI_SUCCESS; } +/** Get RiscV Processor Specific Block CM objects. + + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in] Token Processor Specific Block Token. + @param [out] ProcBlockOps Process Specific Block Operation. + + @retval EFI_SUCCESS + @retval Others Failed to initialise +**/ +STATIC +EFI_STATUS +EFIAPI +GetRiscVProcBlockCmObj ( + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN CM_OBJECT_TOKEN Token, + OUT PROCESSOR_SPECIFIC_BLOCK_OPS *ProcBlockOps + ) +{ + EFI_STATUS Status; + CM_RISCV_PROCESSOR_SPECIFIC_BLOCK_INFO *Block; + UINT32 BlockCount; + + Status = GetERiscVObjProcessorSpecificBlockInfo ( + CfgMgrProtocol, + Token, + &Block, + &BlockCount + ); + + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: Failed to get risc-v processor data info. Status = %r\n", + __func__, + Status + )); + return Status; + } + + ProcBlockOps->CmObject = Block; + + return EFI_SUCCESS; +} + /** Get size of Arm Processor Specific Block. @param [in] CfgMgrProtocol Pointer to the Configuration Manager @@ -450,6 +501,47 @@ GetSizeofX64ProcBlock ( return EFI_SUCCESS; } +/** Get size of RiscV Processor Specific Block. + + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in] CmObject CM object of Processor Specific Block. + @param [out] Size Size of Processor Specific Block. + + @retval EFI_SUCCESS + @retval EFI_INVALID_PARAMETER A parameter is invalid. +**/ +STATIC +EFI_STATUS +EFIAPI +GetSizeofRiscVProcBlock ( + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN CONST VOID *CmObject, + OUT UINT32 *Size + ) +{ + CONST CM_RISCV_PROCESSOR_SPECIFIC_BLOCK_INFO *Block; + + Block = CmObject; + *Size = 0; + + switch (Block->Revision) { + case PROCESSOR_SPECIFIC_VERSION_INFO (1, 0): + *Size = sizeof (RISCV_PROCESSOR_SPECIFIC_BLOCK); + break; + default: + DEBUG (( + DEBUG_ERROR, + "%a: Invalid revision for risc-v block.: 0x%x\n", + __func__, + Block->Revision + )); + return EFI_INVALID_PARAMETER; + } + + return EFI_SUCCESS; +} + /** Add Arm Processor Specific Block into SMBIOS record. @param [in] CfgMgrProtocol Pointer to the Configuration Manager @@ -539,6 +631,40 @@ AddX64ProcBlock ( return EFI_SUCCESS; } +/** Add risc-v Processor Specific Block into SMBIOS record. + + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in] CmObject CM object of Processor Specific Block. + @param [out] SmbiosRecord Type 44 Smbios Record. + + @retval EFI_SUCCESS + @retval EFI_INVALID_PARAMETER A parameter is invalid. +**/ +STATIC +EFI_STATUS +EFIAPI +AddRiscVProcBlock ( + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN CONST VOID *CmObject, + OUT SMBIOS_TABLE_TYPE44 *SmbiosRecord + ) +{ + RISCV_PROCESSOR_SPECIFIC_BLOCK *ProcBlock; + CONST CM_RISCV_PROCESSOR_SPECIFIC_BLOCK_INFO *Block; + + Block = CmObject; + ProcBlock = (RISCV_PROCESSOR_SPECIFIC_BLOCK *)(SmbiosRecord + 1); + + ProcBlock->Revision = Block->Revision; + ProcBlock->HartId = Block->HartId; + ProcBlock->VendorId = Block->VendorId; + ProcBlock->ArchId = Block->ArchId; + ProcBlock->ImplId = Block->ImplId; + + return EFI_SUCCESS; +} + /** Operation table to handle Processor Specific Block to generate Smbios Type 44 record. **/ @@ -587,24 +713,24 @@ STATIC PROCESSOR_SPECIFIC_BLOCK_OPS mProcSpecificBlockOps[] = { }, { ProcessorSpecificBlockArchTypeRiscVRV32, - NULL, - NULL, - NULL, - TRUE, + GetRiscVProcBlockCmObj, + GetSizeofRiscVProcBlock, + AddRiscVProcBlock, + RISCV_SMBIOS_TYPE44_RECORD_UNSUPPORTED, }, { ProcessorSpecificBlockArchTypeRiscVRV64, - NULL, - NULL, - NULL, - TRUE, + GetRiscVProcBlockCmObj, + GetSizeofRiscVProcBlock, + AddRiscVProcBlock, + RISCV_SMBIOS_TYPE44_RECORD_UNSUPPORTED, }, { ProcessorSpecificBlockArchTypeRiscVRV128, - NULL, - NULL, - NULL, - TRUE, + GetRiscVProcBlockCmObj, + GetSizeofRiscVProcBlock, + AddRiscVProcBlock, + RISCV_SMBIOS_TYPE44_RECORD_UNSUPPORTED, }, }; diff --git a/DynamicTablesPkg/Library/Smbios/SmbiosType44Lib/SmbiosType44Generator.h b/DynamicTablesPkg/Library/Smbios/SmbiosType44Lib/SmbiosType44Generator.h index 3a54dbdf04..05a654a9f2 100644 --- a/DynamicTablesPkg/Library/Smbios/SmbiosType44Lib/SmbiosType44Generator.h +++ b/DynamicTablesPkg/Library/Smbios/SmbiosType44Lib/SmbiosType44Generator.h @@ -24,6 +24,12 @@ #define X86_SMBIOS_TYPE44_RECORD_UNSUPPORTED FALSE #endif +#if !defined (MDE_CPU_RISCV64) +#define RISCV_SMBIOS_TYPE44_RECORD_UNSUPPORTED TRUE +#else +#define RISCV_SMBIOS_TYPE44_RECORD_UNSUPPORTED FALSE +#endif + typedef struct ArmProcessorSubDataOps ARM_PROCESSOR_SUB_DATA_OPS; typedef struct ProcessorSpecificBlockOps PROCESSOR_SPECIFIC_BLOCK_OPS;