1 // SPDX-License-Identifier: GPL-2.0 2 3 #undef pr_fmt 4 #define pr_fmt(fmt) "tdx: " fmt 5 6 #include <linux/array_size.h> 7 #include <linux/printk.h> 8 #include <asm/tdx.h> 9 10 #define DEF_TDX_ATTR_NAME(_name) [TDX_ATTR_##_name##_BIT] = __stringify(_name) 11 12 static __initdata const char *tdx_attributes[] = { 13 DEF_TDX_ATTR_NAME(DEBUG), 14 DEF_TDX_ATTR_NAME(HGS_PLUS_PROF), 15 DEF_TDX_ATTR_NAME(PERF_PROF), 16 DEF_TDX_ATTR_NAME(PMT_PROF), 17 DEF_TDX_ATTR_NAME(ICSSD), 18 DEF_TDX_ATTR_NAME(LASS), 19 DEF_TDX_ATTR_NAME(SEPT_VE_DISABLE), 20 DEF_TDX_ATTR_NAME(MIGRTABLE), 21 DEF_TDX_ATTR_NAME(PKS), 22 DEF_TDX_ATTR_NAME(KL), 23 DEF_TDX_ATTR_NAME(TPA), 24 DEF_TDX_ATTR_NAME(PERFMON), 25 }; 26 27 #define DEF_TD_CTLS_NAME(_name) [TD_CTLS_##_name##_BIT] = __stringify(_name) 28 29 static __initdata const char *tdcs_td_ctls[] = { 30 DEF_TD_CTLS_NAME(PENDING_VE_DISABLE), 31 DEF_TD_CTLS_NAME(ENUM_TOPOLOGY), 32 DEF_TD_CTLS_NAME(VIRT_CPUID2), 33 DEF_TD_CTLS_NAME(REDUCE_VE), 34 DEF_TD_CTLS_NAME(LOCK), 35 }; 36 37 void __init tdx_dump_attributes(u64 td_attr) 38 { 39 pr_info("Attributes:"); 40 41 for (int i = 0; i < ARRAY_SIZE(tdx_attributes); i++) { 42 if (!tdx_attributes[i]) 43 continue; 44 if (td_attr & BIT(i)) 45 pr_cont(" %s", tdx_attributes[i]); 46 td_attr &= ~BIT(i); 47 } 48 49 if (td_attr) 50 pr_cont(" unknown:%#llx", td_attr); 51 pr_cont("\n"); 52 53 } 54 55 void __init tdx_dump_td_ctls(u64 td_ctls) 56 { 57 pr_info("TD_CTLS:"); 58 59 for (int i = 0; i < ARRAY_SIZE(tdcs_td_ctls); i++) { 60 if (!tdcs_td_ctls[i]) 61 continue; 62 if (td_ctls & BIT(i)) 63 pr_cont(" %s", tdcs_td_ctls[i]); 64 td_ctls &= ~BIT(i); 65 } 66 if (td_ctls) 67 pr_cont(" unknown:%#llx", td_ctls); 68 pr_cont("\n"); 69 } 70