Linux Confidential Computing Development
 help / color / mirror / Atom feed
From: Nikolay Borisov <nik.borisov@suse.com>
To: Zhenzhong Duan <zhenzhong.duan@intel.com>,
	x86@kernel.org, linux-coco@lists.linux.dev,
	linux-kernel@vger.kernel.org
Cc: dave.hansen@linux.intel.com, tglx@kernel.org, mingo@redhat.com,
	bp@alien8.de, hpa@zytor.com, dave.hansen@intel.com,
	kas@kernel.org, rick.p.edgecombe@intel.com, jgg@nvidia.com,
	nicolinc@nvidia.com, aik@amd.com, aneesh.kumar@kernel.org,
	seanjc@google.com, pbonzini@redhat.com, yilun.xu@linux.intel.com,
	chao.gao@intel.com, vishal.l.verma@intel.com,
	xiaoyao.li@intel.com, kevin.tian@intel.com,
	chao.p.peng@intel.com
Subject: Re: [RFC PATCH 05/15] virt: tdx-guest: Add TDCM helpers and TEE-IO support check
Date: Tue, 13 Oct 2026 17:31:44 +0300	[thread overview]
Message-ID: <686a2511-1d4b-47cc-abdb-951693cf1771@suse.com> (raw)
In-Reply-To: <20260924041032.1096569-6-zhenzhong.duan@intel.com>



On 24.09.26 г. 7:10 ч., Zhenzhong Duan wrote:
> Implement internal helper wrappers tdx_tdcm_alloc(), tdx_tdcm_run(),
> and tdx_tdcm_free() to manage execution context lifecycle for TDX Connect
> TEE-IO Device Control and Management (TDCM) commands.
> 
> Use these infrastructures to deploy all TDCM commands to orchestrate
> trusted device management, beginning with the first command,
> TDCM_OP_CHECK_TEEIO_SUPP, executed during the secure device locking
> sequence.
> 
> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
> ---
>   arch/x86/include/asm/tdx.h            |  48 +++++++++
>   drivers/virt/coco/tdx-guest/connect.c | 139 ++++++++++++++++++++++++++
>   2 files changed, 187 insertions(+)
> 
> diff --git a/arch/x86/include/asm/tdx.h b/arch/x86/include/asm/tdx.h
> index 4937e23d5483..71cd701d346f 100644
> --- a/arch/x86/include/asm/tdx.h
> +++ b/arch/x86/include/asm/tdx.h
> @@ -105,6 +105,54 @@ int tdx_mcall_extend_rtmr(u8 index, u8 *data);
>   u64 tdx_hcall_get_quote(u8 *buf, size_t size);
>   
>   #ifdef CONFIG_TDX_CONNECT_GUEST
> +enum tdcm_operation {
> +	TDCM_OP_CHECK_TEEIO_SUPP	= 1,
> +	TDCM_OP_BIND			= 2,
> +	TDCM_OP_GET_DEV_INFO		= 3,
> +	TDCM_OP_GET_TDI_REPORT		= 4,
> +	TDCM_OP_START_TDI		= 5,
> +	TDCM_OP_GET_TDI_STATE		= 6,
> +	TDCM_OP_UNBIND			= 7,
> +};
> +
> +enum tdcm_status {
> +	TDCM_STATUS_WAIT		= 0,
> +	TDCM_STATUS_COMPLETED		= 1,
> +	TDCM_STATUS_ERROR		= 2,
> +};
> +
> +enum tdcm_error {
> +	TDCM_ERROR_TDX_MODULE		= 10,
> +	TDCM_ERROR_TDXIO_DEVICE		= 11,
> +	TDCM_ERROR_SPDM_MESSAGE		= 12,
> +	TDCM_ERROR_IDE_KM_MESSAGE	= 13,
> +	TDCM_ERROR_TDISP_MESSAGE	= 14,
> +	TDCM_ERROR_INVALID_STATE	= 15,
> +};
> +
> +struct tdvmcall_tdcm {
> +	__u16 operation;  /* See enum tdcm_operation */
> +	__u8  version;
> +	__u8  rsvd0;
> +	__u32 rsvd1;
> +
> +	__u8  status;     /* See enum tdcm_status */
> +	__u8  error;      /* See enum tdcm_error */
> +	__u16 rsvd2;
> +	__u32 rsvd3;
> +
> +	__u32 data_length;
> +
> +	__u8  data[];
> +} __packed;
> +
> +struct tdcm_rsp_check_teeio_supp {
> +	__u8 is_supported;
> +	__u8  data[];
> +} __packed;
> +
> +#define MAX_TDI_REPORT_SIZE	(16 * PAGE_SIZE)

nit: You can use SZ_64K, no  or the report's size indeed scales with 
whether PAGE_SIZE is 4k or 2m for example?

> +
>   u64 tdx_hcall_tdcm(u16 devid, void *buf, size_t size, u8 vector);
>   int tdx_mcall_tdi_read(u64 func_id, u64 field, u64 *value);
>   #endif
> diff --git a/drivers/virt/coco/tdx-guest/connect.c b/drivers/virt/coco/tdx-guest/connect.c
> index 80ae7c19e179..1f52a187b30f 100644
> --- a/drivers/virt/coco/tdx-guest/connect.c
> +++ b/drivers/virt/coco/tdx-guest/connect.c
> @@ -7,13 +7,127 @@
>   
>   #define pr_fmt(fmt)		KBUILD_MODNAME ": tdx_connect: " fmt
>   
> +#include <linux/iopoll.h>
>   #include <linux/pci.h>
>   #include <linux/pci-tsm.h>
> +#include <linux/set_memory.h>
>   #include <linux/tsm.h>
>   #include <asm/tdx.h>
>   
>   #include "tdx-guest.h"
>   
> +/**
> + * struct tdcm_ctx - TEE-IO Device Configuration and Management (TDCM) context
> + * @buf: Pointer to 4KB-aligned shared memory (>= one page) used as the command
> + *       buffer on input and the response buffer on output.
> + * @buf_size: Total size of the shared memory buffer.
> + * @max_rsp_data_sz: Maximum expected size of the response data.
> + * @rsp_data_sz: Actual size of the response data populated by the VMM.
> + * @devid: Device Identifier.
> + */
> +struct tdcm_ctx {
> +	struct tdvmcall_tdcm *buf;
> +	size_t buf_size;
> +	u32 max_rsp_data_sz;
> +	u32 rsp_data_sz;
> +	u16 devid;
> +};
> +
> +#define to_tdcm_rsp_data(tdcm)	((tdcm)->buf->data)
> +
> +#define TDCM_POLL_DELAY_US	10000
> +#define TDCM_POLL_TIMEOUT_US	(10 * USEC_PER_SEC)

Shouldn't  POLL_TIMEOUT be a multiple of DELAY_US  for the sake of 
simplicity? I.e DELAY_US 1000 (wait for 1k usecs) TIME_OUT 10 * DELAY_US 
(try up to 10 times to get a response?)

> +
> +static int tdx_tdcm_run(struct tdcm_ctx *tdcm)
> +{
> +	struct tdvmcall_tdcm *buf = tdcm->buf;
> +	u8 status;
> +	int ret;
> +	u64 r;
> +
> +	r = tdx_hcall_tdcm(tdcm->devid, buf, tdcm->buf_size, 0);
> +	if (r)
> +		return -EFAULT;
> +
> +	ret = read_poll_timeout(READ_ONCE, status, status != TDCM_STATUS_WAIT,
> +				TDCM_POLL_DELAY_US, TDCM_POLL_TIMEOUT_US, false, buf->status);
> +	if (ret) {
> +		pr_err("TDCM request %d timed out\n", buf->operation);
> +		return ret;
> +	}

It's not entirely clear to me why do we have this asynchronous handling 
of TDCM, we don't have that for any of the other VP.VMCALL leafs? Can 
you explain this in the changelog. According to GHCI 2.0 TDCM is used:

This is used to allow TD guest TEE-IO Device Control and Management 
(TDCM) module to
manage the device. The TDCM leaf functions are defined in the following 
table

Is TDCM module implemented via the NRX facility ?  The TDX Connect spec 
never mentions the TDCM module. A bit more details are required in order 
to better understand why you've implemented this the way you have.



> +
> +	/* Ensure subsequent data reads are ordered after the status observation */
> +	virt_rmb();
> +
> +	/*
> +	 * Cache VMM response data length to avoid referencing buf->data_length
> +	 * directly in case a malicious VMM changes buf->data_length between the
> +	 * validation below and the subsequent reads.
> +	 */
> +	tdcm->rsp_data_sz = READ_ONCE(buf->data_length);
> +
> +	if (status != TDCM_STATUS_COMPLETED || tdcm->rsp_data_sz > tdcm->max_rsp_data_sz ||
> +	    (tdcm->max_rsp_data_sz && !tdcm->rsp_data_sz)) {
> +		pr_err("TDCM request %d failed: status 0x%x, error 0x%x, max_rsp_data_sz 0x%x, returned 0x%x\n",
> +		       buf->operation, status, buf->error, tdcm->max_rsp_data_sz,
> +		       tdcm->rsp_data_sz);
> +		return -EIO;
> +	}
> +
> +	return 0;
> +}

<snip>


  reply	other threads:[~2026-10-13 14:31 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-24  4:10 [RFC PATCH 00/15] PCI/TSM: coco/tdx-guest: Implement TDX-Connect PCIe TDISP (phase2) Zhenzhong Duan
2026-09-24  4:10 ` [RFC PATCH 01/15] x86/tdx: Export tdg_vm_rd() for tdx-guest module Zhenzhong Duan
2026-09-30 22:13   ` Peter Fang
2026-10-01 12:38     ` Xu Yilun
2026-10-08  6:45       ` Duan, Zhenzhong
2026-10-08 16:30         ` Edgecombe, Rick P
2026-09-24  4:10 ` [RFC PATCH 02/15] x86/tdx: Add TDCM hypercall wrapper for TDX Connect Zhenzhong Duan
2026-10-13 14:34   ` Nikolay Borisov
2026-10-14  6:19     ` Duan, Zhenzhong
2026-10-14  6:27       ` Nikolay Borisov
2026-10-14  7:22         ` Duan, Zhenzhong
2026-09-24  4:10 ` [RFC PATCH 03/15] x86/tdx: Add TDG.TDI.RD module call " Zhenzhong Duan
2026-09-25  0:06   ` Edgecombe, Rick P
2026-10-08  6:27     ` Duan, Zhenzhong
2026-10-08 16:42       ` Edgecombe, Rick P
2026-10-09  2:28         ` Duan, Zhenzhong
2026-09-24  4:10 ` [RFC PATCH 04/15] virt: tdx-guest: Support devsec TSM for secure devices Zhenzhong Duan
2026-09-24  4:10 ` [RFC PATCH 05/15] virt: tdx-guest: Add TDCM helpers and TEE-IO support check Zhenzhong Duan
2026-10-13 14:31   ` Nikolay Borisov [this message]
2026-10-14  6:11     ` Duan, Zhenzhong
2026-10-14 12:52   ` Nikolay Borisov
2026-09-24  4:10 ` [RFC PATCH 06/15] virt: tdx-guest: Support TDI bind and unbind operations Zhenzhong Duan
2026-10-13 12:10   ` Nikolay Borisov
2026-10-14  3:06     ` Duan, Zhenzhong
2026-10-14  6:32       ` Nikolay Borisov
2026-10-14  7:33         ` Duan, Zhenzhong
2026-09-24  4:10 ` [RFC PATCH 07/15] PCI/TSM: Track Device Interface Report MMIO range index Zhenzhong Duan
2026-09-24  4:10 ` [RFC PATCH 08/15] x86/tdx: Add TDG.MMIO.ACCEPT module call wrapper for TDX Connect Zhenzhong Duan
2026-09-24 23:41   ` Edgecombe, Rick P
2026-09-25  0:02     ` Edgecombe, Rick P
2026-10-08  6:01       ` Duan, Zhenzhong
2026-10-08 16:47         ` Edgecombe, Rick P
2026-10-08  5:49     ` Duan, Zhenzhong
2026-10-08 16:44       ` Edgecombe, Rick P
2026-10-09  2:16         ` Duan, Zhenzhong
2026-09-24  4:10 ` [RFC PATCH 09/15] virt: tdx-guest: Capture the TDI report during device lock Zhenzhong Duan
2026-09-24  4:10 ` [RFC PATCH 10/15] virt: tdx-guest: Set up and accept private MMIO ranges Zhenzhong Duan
2026-09-24  4:10 ` [RFC PATCH 11/15] x86/tdx: Add TDG.TDI.START module call wrapper for TDX Connect Zhenzhong Duan
2026-09-24  4:10 ` [RFC PATCH 12/15] virt: tdx-guest: Support Trust Device Interface (TDI) activation Zhenzhong Duan
2026-09-24  4:10 ` [RFC PATCH 13/15] x86/tdx: Add __tdcall_saved() helper Zhenzhong Duan
2026-09-24  4:10 ` [RFC PATCH 14/15] x86/tdx: Add TDG.DMAR.ACCEPT module call wrapper for TDX Connect Zhenzhong Duan
2026-09-24  4:10 ` [RFC PATCH 15/15] virt: tdx-guest: Accept default DMAR entry during PCI driver attach Zhenzhong Duan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=686a2511-1d4b-47cc-abdb-951693cf1771@suse.com \
    --to=nik.borisov@suse.com \
    --cc=aik@amd.com \
    --cc=aneesh.kumar@kernel.org \
    --cc=bp@alien8.de \
    --cc=chao.gao@intel.com \
    --cc=chao.p.peng@intel.com \
    --cc=dave.hansen@intel.com \
    --cc=dave.hansen@linux.intel.com \
    --cc=hpa@zytor.com \
    --cc=jgg@nvidia.com \
    --cc=kas@kernel.org \
    --cc=kevin.tian@intel.com \
    --cc=linux-coco@lists.linux.dev \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=nicolinc@nvidia.com \
    --cc=pbonzini@redhat.com \
    --cc=rick.p.edgecombe@intel.com \
    --cc=seanjc@google.com \
    --cc=tglx@kernel.org \
    --cc=vishal.l.verma@intel.com \
    --cc=x86@kernel.org \
    --cc=xiaoyao.li@intel.com \
    --cc=yilun.xu@linux.intel.com \
    --cc=zhenzhong.duan@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox