mirror of
https://github.com/tianocore/edk2
synced 2026-08-27 00:23:19 -04:00
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 <yeoreum.yun@arm.com>
This commit is contained in:
parent
be3aeb7c33
commit
d7d5ddef07
3 changed files with 167 additions and 12 deletions
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue