/* SPDX-License-Identifier: GPL-2.0 */ #ifndef _X86_VIRT_TDX_H #define _X86_VIRT_TDX_H #include #include "tdx_global_metadata.h" /* * This file contains both macros and data structures defined by the TDX * architecture and Linux defined software data structures and functions. * The two should not be mixed together for better readability. The * architectural definitions come first. */ /* * TDX module SEAMCALL leaf functions */ #define TDH_PHYMEM_PAGE_RDMD 24 #define TDH_SYS_KEY_CONFIG 31 #define TDH_SYS_INIT 33 #define TDH_SYS_RD 34 #define TDH_SYS_LP_INIT 35 #define TDH_SYS_TDMR_INIT 36 #define TDH_SYS_CONFIG 45 /* TDX page types */ #define PT_NDA 0x0 #define PT_RSVD 0x1 struct tdmr_reserved_area { u64 offset; u64 size; } __packed; #define TDMR_INFO_ALIGNMENT 512 #define TDMR_INFO_PA_ARRAY_ALIGNMENT 512 struct tdmr_info { u64 base; u64 size; u64 pamt_1g_base; u64 pamt_1g_size; u64 pamt_2m_base; u64 pamt_2m_size; u64 pamt_4k_base; u64 pamt_4k_size; /* * The actual number of reserved areas depends on the value of * field MD_FIELD_ID_MAX_RESERVED_PER_TDMR in the TDX module * global metadata. */ DECLARE_FLEX_ARRAY(struct tdmr_reserved_area, reserved_areas); } __packed __aligned(TDMR_INFO_ALIGNMENT); /* Bit definitions of TDX_FEATURES0 metadata field */ #define TDX_FEATURES0_NO_RBP_MOD BIT(18) /* * Do not put any hardware-defined TDX structure representations below * this comment! */ /* Kernel defined TDX module status during module initialization. */ enum tdx_module_status_t { TDX_MODULE_UNINITIALIZED, TDX_MODULE_INITIALIZED, TDX_MODULE_ERROR }; struct tdx_memblock { struct list_head list; unsigned long start_pfn; unsigned long end_pfn; int nid; }; /* Warn if kernel has less than TDMR_NR_WARN TDMRs after allocation */ #define TDMR_NR_WARN 4 struct tdmr_info_list { void *tdmrs; /* Flexible array to hold 'tdmr_info's */ int nr_consumed_tdmrs; /* How many 'tdmr_info's are in use */ /* Metadata for finding target 'tdmr_info' and freeing @tdmrs */ int tdmr_sz; /* Size of one 'tdmr_info' */ int max_tdmrs; /* How many 'tdmr_info's are allocated */ }; #endif