]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
x86/virt/tdx: Switch to use auto-generated global metadata reading code
authorKai Huang <kai.huang@intel.com>
Sat, 14 Dec 2024 15:15:46 +0000 (04:15 +1300)
committerDave Hansen <dave.hansen@linux.intel.com>
Wed, 18 Dec 2024 22:36:02 +0000 (14:36 -0800)
Continue the process to have a centralized solution for TDX global
metadata reading.  Now that the new autogenerated solution is ready for
use, switch to it and remove the old one.

Signed-off-by: Kai Huang <kai.huang@intel.com>
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Reviewed-by: Nikolay Borisov <nik.borisov@suse.com>
Reviewed-by: Dan Williams <dan.j.williams@intel.com>
Link: https://lore.kernel.org/all/fc025d1e13b92900323f47cfe9aac3157bf08ee7.1734188033.git.kai.huang%40intel.com
arch/x86/virt/vmx/tdx/tdx.c
arch/x86/virt/vmx/tdx/tdx.h

index 28537a6c47fc87a7eec6bf0aba57a7ae025a591c..43ec56db50840ed108cfaa37d265f71efb40a952 100644 (file)
@@ -270,66 +270,7 @@ static int read_sys_metadata_field(u64 field_id, u64 *data)
        return 0;
 }
 
-static int read_sys_metadata_field16(u64 field_id,
-                                    int offset,
-                                    struct tdx_sys_info_tdmr *ts)
-{
-       u16 *ts_member = ((void *)ts) + offset;
-       u64 tmp;
-       int ret;
-
-       if (WARN_ON_ONCE(MD_FIELD_ID_ELE_SIZE_CODE(field_id) !=
-                       MD_FIELD_ID_ELE_SIZE_16BIT))
-               return -EINVAL;
-
-       ret = read_sys_metadata_field(field_id, &tmp);
-       if (ret)
-               return ret;
-
-       *ts_member = tmp;
-
-       return 0;
-}
-
-struct field_mapping {
-       u64 field_id;
-       int offset;
-};
-
-#define TD_SYSINFO_MAP(_field_id, _offset) \
-       { .field_id = MD_FIELD_ID_##_field_id,     \
-         .offset   = offsetof(struct tdx_sys_info_tdmr, _offset) }
-
-/* Map TD_SYSINFO fields into 'struct tdx_sys_info_tdmr': */
-static const struct field_mapping fields[] = {
-       TD_SYSINFO_MAP(MAX_TDMRS,             max_tdmrs),
-       TD_SYSINFO_MAP(MAX_RESERVED_PER_TDMR, max_reserved_per_tdmr),
-       TD_SYSINFO_MAP(PAMT_4K_ENTRY_SIZE,    pamt_4k_entry_size),
-       TD_SYSINFO_MAP(PAMT_2M_ENTRY_SIZE,    pamt_2m_entry_size),
-       TD_SYSINFO_MAP(PAMT_1G_ENTRY_SIZE,    pamt_1g_entry_size),
-};
-
-static int get_tdx_sys_info_tdmr(struct tdx_sys_info_tdmr *sysinfo_tdmr)
-{
-       int ret;
-       int i;
-
-       /* Populate 'sysinfo_tdmr' fields using the mapping structure above: */
-       for (i = 0; i < ARRAY_SIZE(fields); i++) {
-               ret = read_sys_metadata_field16(fields[i].field_id,
-                                               fields[i].offset,
-                                               sysinfo_tdmr);
-               if (ret)
-                       return ret;
-       }
-
-       return 0;
-}
-
-static int get_tdx_sys_info(struct tdx_sys_info *sysinfo)
-{
-       return get_tdx_sys_info_tdmr(&sysinfo->tdmr);
-}
+#include "tdx_global_metadata.c"
 
 /* Calculate the actual TDMR size */
 static int tdmr_size_single(u16 max_reserved_per_tdmr)
index ec879d54eb5c4192bf73e8d59c4c2413fd4696f5..641beec86e737992b13d2ce54bbbb58c71a8a7ae 100644 (file)
@@ -2,7 +2,7 @@
 #ifndef _X86_VIRT_TDX_H
 #define _X86_VIRT_TDX_H
 
-#include <linux/bits.h>
+#include "tdx_global_metadata.h"
 
 /*
  * This file contains both macros and data structures defined by the TDX
 #define        PT_NDA          0x0
 #define        PT_RSVD         0x1
 
-/*
- * Global scope metadata field ID.
- *
- * See Table "Global Scope Metadata", TDX module 1.5 ABI spec.
- */
-#define MD_FIELD_ID_MAX_TDMRS                  0x9100000100000008ULL
-#define MD_FIELD_ID_MAX_RESERVED_PER_TDMR      0x9100000100000009ULL
-#define MD_FIELD_ID_PAMT_4K_ENTRY_SIZE         0x9100000100000010ULL
-#define MD_FIELD_ID_PAMT_2M_ENTRY_SIZE         0x9100000100000011ULL
-#define MD_FIELD_ID_PAMT_1G_ENTRY_SIZE         0x9100000100000012ULL
-
-/*
- * Sub-field definition of metadata field ID.
- *
- * See Table "MD_FIELD_ID (Metadata Field Identifier / Sequence Header)
- * Definition", TDX module 1.5 ABI spec.
- *
- *  - Bit 33:32: ELEMENT_SIZE_CODE -- size of a single element of metadata
- *
- *     0: 8 bits
- *     1: 16 bits
- *     2: 32 bits
- *     3: 64 bits
- */
-#define MD_FIELD_ID_ELE_SIZE_CODE(_field_id)   \
-               (((_field_id) & GENMASK_ULL(33, 32)) >> 32)
-
-#define MD_FIELD_ID_ELE_SIZE_16BIT     1
-
 struct tdmr_reserved_area {
        u64 offset;
        u64 size;
@@ -80,20 +51,6 @@ struct tdmr_info {
        DECLARE_FLEX_ARRAY(struct tdmr_reserved_area, reserved_areas);
 } __packed __aligned(TDMR_INFO_ALIGNMENT);
 
-/* Class "TDMR info" */
-struct tdx_sys_info_tdmr {
-       u16 max_tdmrs;
-       u16 max_reserved_per_tdmr;
-       u16 pamt_4k_entry_size;
-       u16 pamt_2m_entry_size;
-       u16 pamt_1g_entry_size;
-};
-
-/* Kernel used global metadata fields */
-struct tdx_sys_info {
-       struct tdx_sys_info_tdmr tdmr;
-};
-
 /*
  * Do not put any hardware-defined TDX structure representations below
  * this comment!