Add several global metadata fields for TDX Connect. These metadata field specify the number of metadata pages needed for IOMMU/IDE/SPDM setup. Signed-off-by: Xu Yilun Signed-off-by: Dan Williams --- arch/x86/include/asm/tdx_global_metadata.h | 8 ++++++++ arch/x86/virt/vmx/tdx/tdx_global_metadata.c | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/arch/x86/include/asm/tdx_global_metadata.h b/arch/x86/include/asm/tdx_global_metadata.h index 2aa741190b93..e7948bca671a 100644 --- a/arch/x86/include/asm/tdx_global_metadata.h +++ b/arch/x86/include/asm/tdx_global_metadata.h @@ -39,12 +39,20 @@ struct tdx_sys_info_ext { u8 ext_required; }; +struct tdx_sys_info_connect { + u16 ide_mt_page_count; + u16 spdm_mt_page_count; + u16 iommu_mt_page_count; + u16 spdm_max_dev_info_pages; +}; + struct tdx_sys_info { struct tdx_sys_info_features features; struct tdx_sys_info_tdmr tdmr; struct tdx_sys_info_td_ctrl td_ctrl; struct tdx_sys_info_td_conf td_conf; struct tdx_sys_info_ext ext; + struct tdx_sys_info_connect connect; }; #endif diff --git a/arch/x86/virt/vmx/tdx/tdx_global_metadata.c b/arch/x86/virt/vmx/tdx/tdx_global_metadata.c index c3b2e2748b3e..b9029c3f9b32 100644 --- a/arch/x86/virt/vmx/tdx/tdx_global_metadata.c +++ b/arch/x86/virt/vmx/tdx/tdx_global_metadata.c @@ -98,6 +98,23 @@ static __init int get_tdx_sys_info_ext(struct tdx_sys_info_ext *sysinfo_ext) return ret; } +static __init int get_tdx_sys_info_connect(struct tdx_sys_info_connect *sysinfo_connect) +{ + int ret = 0; + u64 val; + + if (!ret && !(ret = read_sys_metadata_field(0x3000000100000001, &val))) + sysinfo_connect->ide_mt_page_count = val; + if (!ret && !(ret = read_sys_metadata_field(0x3000000100000002, &val))) + sysinfo_connect->spdm_mt_page_count = val; + if (!ret && !(ret = read_sys_metadata_field(0x3000000100000003, &val))) + sysinfo_connect->iommu_mt_page_count = val; + if (!ret && !(ret = read_sys_metadata_field(0x3000000100000007, &val))) + sysinfo_connect->spdm_max_dev_info_pages = val; + + return ret; +} + static __init int get_tdx_sys_info(struct tdx_sys_info *sysinfo) { int ret = 0; @@ -107,6 +124,7 @@ static __init int get_tdx_sys_info(struct tdx_sys_info *sysinfo) ret = ret ?: get_tdx_sys_info_td_ctrl(&sysinfo->td_ctrl); ret = ret ?: get_tdx_sys_info_td_conf(&sysinfo->td_conf); ret = ret ?: get_tdx_sys_info_ext(&sysinfo->ext); + ret = ret ?: get_tdx_sys_info_connect(&sysinfo->connect); return ret; } -- 2.25.1