Commit fae43b24 authored by Kai Huang's avatar Kai Huang Committed by Dave Hansen
Browse files

x86/virt/tdx: Switch to use auto-generated global metadata reading code



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: default avatarKai Huang <kai.huang@intel.com>
Signed-off-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
Reviewed-by: default avatarNikolay Borisov <nik.borisov@suse.com>
Reviewed-by: default avatarDan Williams <dan.j.williams@intel.com>
Link: https://lore.kernel.org/all/fc025d1e13b92900323f47cfe9aac3157bf08ee7.1734188033.git.kai.huang%40intel.com
parent 6bfb77f4
Loading
Loading
Loading
Loading
+1 −60
Original line number Diff line number Diff line
@@ -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)
+1 −44
Original line number Diff line number Diff line
@@ -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
@@ -26,35 +26,6 @@
#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!