1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _X86_VIRT_TDX_H
3 #define _X86_VIRT_TDX_H
5 #include <linux/bits.h>
8 * This file contains both macros and data structures defined by the TDX
9 * architecture and Linux defined software data structures and functions.
10 * The two should not be mixed together for better readability. The
11 * architectural definitions come first.
15 * TDX module SEAMCALL leaf functions
17 #define TDH_PHYMEM_PAGE_RDMD 24
18 #define TDH_SYS_KEY_CONFIG 31
19 #define TDH_SYS_INIT 33
21 #define TDH_SYS_LP_INIT 35
22 #define TDH_SYS_TDMR_INIT 36
23 #define TDH_SYS_CONFIG 45
30 * Global scope metadata field ID.
32 * See Table "Global Scope Metadata", TDX module 1.5 ABI spec.
34 #define MD_FIELD_ID_MAX_TDMRS 0x9100000100000008ULL
35 #define MD_FIELD_ID_MAX_RESERVED_PER_TDMR 0x9100000100000009ULL
36 #define MD_FIELD_ID_PAMT_4K_ENTRY_SIZE 0x9100000100000010ULL
37 #define MD_FIELD_ID_PAMT_2M_ENTRY_SIZE 0x9100000100000011ULL
38 #define MD_FIELD_ID_PAMT_1G_ENTRY_SIZE 0x9100000100000012ULL
41 * Sub-field definition of metadata field ID.
43 * See Table "MD_FIELD_ID (Metadata Field Identifier / Sequence Header)
44 * Definition", TDX module 1.5 ABI spec.
46 * - Bit 33:32: ELEMENT_SIZE_CODE -- size of a single element of metadata
53 #define MD_FIELD_ID_ELE_SIZE_CODE(_field_id) \
54 (((_field_id) & GENMASK_ULL(33, 32)) >> 32)
56 #define MD_FIELD_ID_ELE_SIZE_16BIT 1
58 struct tdmr_reserved_area {
63 #define TDMR_INFO_ALIGNMENT 512
64 #define TDMR_INFO_PA_ARRAY_ALIGNMENT 512
76 * The actual number of reserved areas depends on the value of
77 * field MD_FIELD_ID_MAX_RESERVED_PER_TDMR in the TDX module
80 DECLARE_FLEX_ARRAY(struct tdmr_reserved_area, reserved_areas);
81 } __packed __aligned(TDMR_INFO_ALIGNMENT);
84 * Do not put any hardware-defined TDX structure representations below
88 /* Kernel defined TDX module status during module initialization. */
89 enum tdx_module_status_t {
90 TDX_MODULE_UNINITIALIZED,
91 TDX_MODULE_INITIALIZED,
96 struct list_head list;
97 unsigned long start_pfn;
98 unsigned long end_pfn;
102 /* "TDMR info" part of "Global Scope Metadata" for constructing TDMRs */
103 struct tdx_tdmr_sysinfo {
105 u16 max_reserved_per_tdmr;
106 u16 pamt_entry_size[TDX_PS_NR];
109 /* Warn if kernel has less than TDMR_NR_WARN TDMRs after allocation */
110 #define TDMR_NR_WARN 4
112 struct tdmr_info_list {
113 void *tdmrs; /* Flexible array to hold 'tdmr_info's */
114 int nr_consumed_tdmrs; /* How many 'tdmr_info's are in use */
116 /* Metadata for finding target 'tdmr_info' and freeing @tdmrs */
117 int tdmr_sz; /* Size of one 'tdmr_info' */
118 int max_tdmrs; /* How many 'tdmr_info's are allocated */