1/* SPDX-License-Identifier: GPL-2.0 */ 2#ifndef _X86_VIRT_TDX_H 3#define _X86_VIRT_TDX_H 4 5#include <linux/bits.h> 6 7/* 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. 12 */ 13 14/* 15 * TDX module SEAMCALL leaf functions 16 */ 17#define TDH_PHYMEM_PAGE_RDMD 24 18#define TDH_SYS_KEY_CONFIG 31 19#define TDH_SYS_INIT 33 20#define TDH_SYS_RD 34 21#define TDH_SYS_LP_INIT 35 22#define TDH_SYS_TDMR_INIT 36 23#define TDH_SYS_CONFIG 45 24 25/* TDX page types */ 26#define PT_NDA 0x0 27#define PT_RSVD 0x1 28 29/* 30 * Global scope metadata field ID. 31 * 32 * See Table "Global Scope Metadata", TDX module 1.5 ABI spec. 33 */ 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 39 40/* 41 * Sub-field definition of metadata field ID. 42 * 43 * See Table "MD_FIELD_ID (Metadata Field Identifier / Sequence Header) 44 * Definition", TDX module 1.5 ABI spec. 45 * 46 * - Bit 33:32: ELEMENT_SIZE_CODE -- size of a single element of metadata 47 * 48 * 0: 8 bits 49 * 1: 16 bits 50 * 2: 32 bits 51 * 3: 64 bits 52 */ 53#define MD_FIELD_ID_ELE_SIZE_CODE(_field_id) \ 54 (((_field_id) & GENMASK_ULL(33, 32)) >> 32) 55 56#define MD_FIELD_ID_ELE_SIZE_16BIT 1 57 58struct tdmr_reserved_area { 59 u64 offset; 60 u64 size; 61} __packed; 62 63#define TDMR_INFO_ALIGNMENT 512 64#define TDMR_INFO_PA_ARRAY_ALIGNMENT 512 65 66struct tdmr_info { 67 u64 base; 68 u64 size; 69 u64 pamt_1g_base; 70 u64 pamt_1g_size; 71 u64 pamt_2m_base; 72 u64 pamt_2m_size; 73 u64 pamt_4k_base; 74 u64 pamt_4k_size; 75 /* 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 78 * global metadata. 79 */ 80 DECLARE_FLEX_ARRAY(struct tdmr_reserved_area, reserved_areas); 81} __packed __aligned(TDMR_INFO_ALIGNMENT); 82 83/* 84 * Do not put any hardware-defined TDX structure representations below 85 * this comment! 86 */ 87 88/* Kernel defined TDX module status during module initialization. */ 89enum tdx_module_status_t { 90 TDX_MODULE_UNINITIALIZED, 91 TDX_MODULE_INITIALIZED, 92 TDX_MODULE_ERROR 93}; 94 95struct tdx_memblock { 96 struct list_head list; 97 unsigned long start_pfn; 98 unsigned long end_pfn; 99 int nid; 100}; 101 102/* "TDMR info" part of "Global Scope Metadata" for constructing TDMRs */ 103struct tdx_tdmr_sysinfo { 104 u16 max_tdmrs; 105 u16 max_reserved_per_tdmr; 106 u16 pamt_entry_size[TDX_PS_NR]; 107}; 108 109/* Warn if kernel has less than TDMR_NR_WARN TDMRs after allocation */ 110#define TDMR_NR_WARN 4 111 112struct 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 */ 115 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 */ 119}; 120 121#endif 122