From nobody Thu Sep 24 13:41:52 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6FCB83E7625 for ; Thu, 24 Sep 2026 04:10:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.14 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223051; cv=none; b=BDG9mgJAAHKaUB3D+fqN5LGok9UVFx4pKj41z5WOE2vrxt93s4XJ+aRA2llBQpDBalRugl9oqcSXTengBylL3E4Vv6sEnnGwpPia1HgDeElIMrQ+9ch1DV8wuU4E8445QTWiqA3N2d8QSzCb6fNq0ivMz92WtyeD1Fs34nBk2cA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223051; c=relaxed/simple; bh=Ub9M8W0igL+Wh+cmM97paJ6vkhusw5V4SKPrJ1aKoqI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=V4ZU1xdv8tjFSa8R3nMh923lDmDFzQXlJeSTZZIJ5qmh65J46McBTN0Tr9y3Yn8yCgeUpg9l0N4LeiYvx1g6tJRWyEHKXrFhDYI6J4n3spCmdZOAULkF7GHgxtzaCyxHSEFUork55D5wRI2ZAE20qVof2Y3umKwVOWQYapOKvoU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=CuTPnHi2; arc=none smtp.client-ip=192.198.163.14 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="CuTPnHi2" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790223050; x=1821759050; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=Ub9M8W0igL+Wh+cmM97paJ6vkhusw5V4SKPrJ1aKoqI=; b=CuTPnHi2b4sNLTShh0CmbB3JoQxYTiaSuEjYDx9yFJ2HN/TN267Z6X1d AYFFe/zVyfnzI3qQBrL49Uaan5AhH0U6BBKBuEKtU6TjLEkqZFAm+Mk+q P9mih+7rEEQMDgnBYUNK6zUSFs6swMHxBnXUibeFLhhVqzbUNkqgFsGRk slEg8Bw7YtcEuZvikqJFjyXTlDrSQ2tWA7O8cnziNYZ2gbBHR+0kpvsjF DVLO2r36hoOctPn8kVBvJV1AtGszn5JeJU+tssPJKmLWZKJi5rhxllaAz 3t+Buq9wxoMxJU2Vw9afkPiAnKhyzi0hVvQLcQf27uIlIVHjE2Bz9rY4j w==; X-CSE-ConnectionGUID: SJ6rkuRGSfqLj9k0Gw2h9A== X-CSE-MsgGUID: i+NTpQXPQpebzfXovGY4OA== X-IronPort-AV: E=McAfee;i="6800,10657,11914"; a="91002433" X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="91002433" Received: from fmviesa011.fm.intel.com ([10.60.135.151]) by fmvoesa108.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:10:50 -0700 X-CSE-ConnectionGUID: qPKthj/+TBu3LrPKEemGUQ== X-CSE-MsgGUID: V/8OCflnRWCIvkp3wb2CdA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="5009290" Received: from unknown (HELO gnr-sp-2s-612.sh.intel.com) ([10.112.229.148]) by smtpauth.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:10:46 -0700 From: Zhenzhong Duan To: 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: [RFC PATCH 01/15] x86/tdx: Export tdg_vm_rd() for tdx-guest module Date: Thu, 24 Sep 2026 12:10:18 +0800 Message-ID: <20260924041032.1096569-2-zhenzhong.duan@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260924041032.1096569-1-zhenzhong.duan@intel.com> References: <20260924041032.1096569-1-zhenzhong.duan@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Export tdg_vm_rd() to allow the tdx-guest driver module to directly read TD-scoped metadata fields from the Trust Domain Control Structure (TDCS) via TDG.VM.RD TDCALL. Since tdg_vm_rd() is read-only and cannot cause harm, exporting it directly is simpler and more flexible. This allows the tdx-guest driver to read any TDCS field it needs. In a following patch, the tdx-guest driver will use tdg_vm_rd() to read TDCS_CONFIG_FLAGS field directly. Signed-off-by: Zhenzhong Duan --- arch/x86/coco/tdx/tdx.c | 3 ++- arch/x86/include/asm/tdx.h | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/arch/x86/coco/tdx/tdx.c b/arch/x86/coco/tdx/tdx.c index f904a636d449..22cc177a6db4 100644 --- a/arch/x86/coco/tdx/tdx.c +++ b/arch/x86/coco/tdx/tdx.c @@ -79,7 +79,7 @@ static inline void tdcall(u64 fn, struct tdx_module_args = *args) } =20 /* Read TD-scoped metadata */ -static inline u64 tdg_vm_rd(u64 field, u64 *value) +u64 tdg_vm_rd(u64 field, u64 *value) { struct tdx_module_args args =3D { .rdx =3D field, @@ -91,6 +91,7 @@ static inline u64 tdg_vm_rd(u64 field, u64 *value) =20 return ret; } +EXPORT_SYMBOL_FOR_MODULES(tdg_vm_rd, "tdx-guest"); =20 /* Write TD-scoped metadata */ static inline u64 tdg_vm_wr(u64 field, u64 value, u64 mask) diff --git a/arch/x86/include/asm/tdx.h b/arch/x86/include/asm/tdx.h index 89e97d5761d8..884bb8067521 100644 --- a/arch/x86/include/asm/tdx.h +++ b/arch/x86/include/asm/tdx.h @@ -77,6 +77,8 @@ void tdx_halt(void); =20 bool tdx_early_handle_ve(struct pt_regs *regs); =20 +u64 tdg_vm_rd(u64 field, u64 *value); + int tdx_mcall_get_report0(u8 *reportdata, u8 *tdreport); =20 int tdx_mcall_extend_rtmr(u8 index, u8 *data); --=20 2.52.0 From nobody Thu Sep 24 13:41:52 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 998D33DC84C for ; Thu, 24 Sep 2026 04:10:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.14 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223057; cv=none; b=PAKJ10DaANE4exg77I+i+Lc1xkAmV9DfXlPclDHkob+n5rFlzQjnXV8TCeuO2MgXheIN+JoIpPFch0JhSVp5Y9DXw8S3Q6cFPiMn+0+lFvN406xcSNoj6ZhgbS2155x298cwrko40sAD/ii6vbOnmUACWzzB7Lf7PZ5AvH7vNhM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223057; c=relaxed/simple; bh=ToHFhBDHTE6AwHTKPJtG4GWq2W0Bi8+sWPzXCcjZPR8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SuDAenzEu4bRlYttJ1LTFuCi23buNWVIpdeziPEeLkltGsT1UOboDs3mkny1qFs9QX1YgfbUE7EU35wZb3aGjsjMUFNmkh7Xz44TjksY9UM3Oco2YkCr08y8FgVtvjI39cjSa6nH+k3kRy1jFNLFaReZOo2/pvt32KTOoQtlMMw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=PVFRdn7D; arc=none smtp.client-ip=192.198.163.14 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="PVFRdn7D" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790223056; x=1821759056; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=ToHFhBDHTE6AwHTKPJtG4GWq2W0Bi8+sWPzXCcjZPR8=; b=PVFRdn7DQ9EkY5CbyvVX9w5hhr8r6I20nx3PpGUv/rD+1A3DNUrW+tpx 33hyypOeo0wmEP7ozhvsLiifWGIipDUNy6dP7/NqjR4Uov6RcDhzLcLbm ifIgSE/43F68pERNp8sIkj3DsvVwou5MI7KnvyctpldN/tpoNSDPBAL2L D0s7H6Iwt+YPek/ghHmvJ5eSDHf/dnCkUTLAex5QluhL8mll7GSHh1smT RTVOJ04UnPc05S7R3FwPPxszsgvpHsCedD7eo6MlGiaxWP1/oBxT1mGVZ nk27OKj9nFh7CnaRIeKeZInyBwarEBbn9qCEHw8uTcJfdJ/UPLWYEN28n Q==; X-CSE-ConnectionGUID: ZpWs9hnuQEKKIAzAqJHuEA== X-CSE-MsgGUID: xUG9AMY0R4ulAHwzke6otw== X-IronPort-AV: E=McAfee;i="6800,10657,11914"; a="91002447" X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="91002447" Received: from fmviesa011.fm.intel.com ([10.60.135.151]) by fmvoesa108.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:10:55 -0700 X-CSE-ConnectionGUID: uTDBxn4BRyq0p+ty1gM2Iw== X-CSE-MsgGUID: FrowoSzrQn+MYNDQsFiwrw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="5009332" Received: from unknown (HELO gnr-sp-2s-612.sh.intel.com) ([10.112.229.148]) by smtpauth.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:10:51 -0700 From: Zhenzhong Duan To: 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: [RFC PATCH 02/15] x86/tdx: Add TDCM hypercall wrapper for TDX Connect Date: Thu, 24 Sep 2026 12:10:19 +0800 Message-ID: <20260924041032.1096569-3-zhenzhong.duan@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260924041032.1096569-1-zhenzhong.duan@intel.com> References: <20260924041032.1096569-1-zhenzhong.duan@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" TDX Connect is a TDX feature that enables secure device assignment, allowing a TDX guest to directly interact with TEE-IO capable devices. The TEE-IO Device Control and Management (TDCM) hypercall (TDG.VP.VMCALL, defined in TDX GHCI v2.0 specification) is the primary interface through which a TDX guest issues device management commands to the host. The host processes these commands and returns responses via a shared memory buffer. Abstract the underlying leaf call and pass the shared buffer physical address as a decrypted mapping. Add a runtime page alignment check for the buffer to enforce correct usage. Place the implementation in a separate tdx_connect.c file to keep TDX Connect specific code isolated from core tdx.c. CONFIG_TDX_CONNECT_GUEST referenced in the header guard will be introduced in a later patch in this series. Signed-off-by: Zhenzhong Duan --- arch/x86/coco/tdx/Makefile | 2 ++ arch/x86/coco/tdx/tdx_connect.c | 32 +++++++++++++++++++++++++++++++ arch/x86/include/asm/shared/tdx.h | 1 + arch/x86/include/asm/tdx.h | 4 ++++ 4 files changed, 39 insertions(+) create mode 100644 arch/x86/coco/tdx/tdx_connect.c diff --git a/arch/x86/coco/tdx/Makefile b/arch/x86/coco/tdx/Makefile index b3c47d3700e2..2ab2dbbdd3d2 100644 --- a/arch/x86/coco/tdx/Makefile +++ b/arch/x86/coco/tdx/Makefile @@ -1,3 +1,5 @@ # SPDX-License-Identifier: GPL-2.0 =20 obj-y +=3D debug.o tdcall.o tdx.o tdx-shared.o + +obj-$(CONFIG_TDX_CONNECT_GUEST) +=3D tdx_connect.o diff --git a/arch/x86/coco/tdx/tdx_connect.c b/arch/x86/coco/tdx/tdx_connec= t.c new file mode 100644 index 000000000000..0c6ca650771a --- /dev/null +++ b/arch/x86/coco/tdx/tdx_connect.c @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (C) 2026 Intel Corporation */ + +#undef pr_fmt +#define pr_fmt(fmt) "tdx_connect: " fmt + +#include +#include +#include + +/* + * tdx_hcall_tdcm - Send a TDCM command to the host via TDG.VP.VMCALL. + * + * @devid: Device identifier of the target TEE-IO device. + * @buf: Shared, directly mapped buffer containing the TDCM command on + * input and the host response on output. + * @size: Size of @buf in bytes. + * @vector: Event notification interrupt vector, or 0 for synchronous oper= ation. + * + * The buffer physical address is passed to the host with decrypted/shared + * mark. + * + * Returns 0 on success or a TDX VMCALL status code on failure. See + * TDG.VP.VMCALL in the TDX GHCI v2.0 specification for status codes. + */ +u64 tdx_hcall_tdcm(u16 devid, void *buf, size_t size, u8 vector) +{ + WARN_ON_ONCE(!PAGE_ALIGNED(buf) || !PAGE_ALIGNED(size)); + + return _tdx_hypercall(TDVMCALL_TDCM, devid, cc_mkdec(virt_to_phys(buf)), = size, vector); +} +EXPORT_SYMBOL_FOR_MODULES(tdx_hcall_tdcm, "tdx-guest"); diff --git a/arch/x86/include/asm/shared/tdx.h b/arch/x86/include/asm/share= d/tdx.h index f20e91d7ac35..f46a3171a512 100644 --- a/arch/x86/include/asm/shared/tdx.h +++ b/arch/x86/include/asm/shared/tdx.h @@ -74,6 +74,7 @@ #define TDVMCALL_GET_QUOTE 0x10002 #define TDVMCALL_REPORT_FATAL_ERROR 0x10003 #define TDVMCALL_SETUP_EVENT_NOTIFY_INTERRUPT 0x10004ULL +#define TDVMCALL_TDCM 0x10007 =20 /* * TDG.VP.VMCALL Status Codes (returned in R10) diff --git a/arch/x86/include/asm/tdx.h b/arch/x86/include/asm/tdx.h index 884bb8067521..df4496ef8a6a 100644 --- a/arch/x86/include/asm/tdx.h +++ b/arch/x86/include/asm/tdx.h @@ -85,6 +85,10 @@ int tdx_mcall_extend_rtmr(u8 index, u8 *data); =20 u64 tdx_hcall_get_quote(u8 *buf, size_t size); =20 +#ifdef CONFIG_TDX_CONNECT_GUEST +u64 tdx_hcall_tdcm(u16 devid, void *buf, size_t size, u8 vector); +#endif + void __init tdx_dump_attributes(u64 td_attr); void __init tdx_dump_td_ctls(u64 td_ctls); =20 --=20 2.52.0 From nobody Thu Sep 24 13:41:52 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A96E32D592C for ; Thu, 24 Sep 2026 04:11:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.14 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223062; cv=none; b=ZkVGZQ7qD/IK9TPT8VCS5PEcPMD53GZLWvC2r8KJsm8XCS5wZkukpP5kn4NnU/pxbduADZU9nCsy4OdViFqv0a2fx57uyegCqoJarLNrYnybubxUYxhru/3hicgtTXtP0FReIEnl+4VrgDE6P0YmGixSmNcHE/qqB0f/Ue0+t98= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223062; c=relaxed/simple; bh=4sx7o0haKcc2O3BFsbD7nGJ25YTyf25BqpiUaHrC46I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kGjOio3Nwsr289HIBSSEvJJYOLr42VK+i60F9ZDXFNyHqQuTgXze0ehGM5sqHgWij1K5SjcZ8+l/64SfyTMgOB6sO1iL9E0z+kEHv6kMEWvDtUmYnK5TYTD18JYrInAiDkxtQ2mDW6dKVzm9pRm+0m1iqwXf9f7FlgOM284bi7g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=WVEkPKd5; arc=none smtp.client-ip=192.198.163.14 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="WVEkPKd5" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790223061; x=1821759061; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=4sx7o0haKcc2O3BFsbD7nGJ25YTyf25BqpiUaHrC46I=; b=WVEkPKd5c+m5A24mM412mluuwtV2BbzqNiXw/tsiuUQJPoulYXnLQOea jqUq/RPkciRuDrSENUj7FkonBwUcysNFb/HvK+SQ2A3yqLwWBHaFErrsy UXPVHLkomz34b/3ik5NOC56gMdGEHO74I03+6+sEMQUor1ab+wxdWrlw4 6lCkIppoFL/qLZRtpsJHuWwsaDuuhAAylNNbcxpmvtJSm+RLJPOQzo9SY Vl8QJLKgJnIk5IWbsznf8UKkcEFVQ8roUbUDFVu6bGGLDauxMBEdXt1u/ ikcYFzpnM5iRNQ1kZrnE63br4hS/9EbxsnbZV9Pts8FbEEwkLP2cFEL/W A==; X-CSE-ConnectionGUID: LF5UqbbtRHuKlyy50x0nYw== X-CSE-MsgGUID: t6sPewthQZ6kUV57sIJewg== X-IronPort-AV: E=McAfee;i="6800,10657,11914"; a="91002458" X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="91002458" Received: from fmviesa011.fm.intel.com ([10.60.135.151]) by fmvoesa108.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:11:00 -0700 X-CSE-ConnectionGUID: vwAHavzmSvOmiyzEXul6qg== X-CSE-MsgGUID: rc9UK2VmRjuGvfZliS6z5w== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="5009348" Received: from unknown (HELO gnr-sp-2s-612.sh.intel.com) ([10.112.229.148]) by smtpauth.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:10:56 -0700 From: Zhenzhong Duan To: 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: [RFC PATCH 03/15] x86/tdx: Add TDG.TDI.RD module call wrapper for TDX Connect Date: Thu, 24 Sep 2026 12:10:20 +0800 Message-ID: <20260924041032.1096569-4-zhenzhong.duan@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260924041032.1096569-1-zhenzhong.duan@intel.com> References: <20260924041032.1096569-1-zhenzhong.duan@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Introduce wrapper tdx_mcall_tdi_read() to provide tdx-guest driver with a standard interface for querying specific metadata fields from a target Trust Device Interface Control Structure (TDI_CS). Explicitly mapping architectural TDX error codes into Linux POSIX errno with two helpers, introducing tdx_mcall_to_errno() to handle general module calls, while introducing tdx_mcall_tdi_to_errno() specifically for TDI related module calls. Unlike TDG.VP.VMCALL based hypercalls which communicate with the host, TDG.TDI.RD is a module call (mcall) that communicates directly with the TDX module. This distinction is reflected in the tdx_mcall_ naming prefix, as opposed to tdx_hcall_ used for host-directed hypercalls. Note that while host-bound hypercalls (such as tdx_hcall_tdcm()) pass a platform-specific Device Identifier (devid), the func_id parameter used here is defined by the TDISP standard (refer to Section 11.2 "TDISP rules"). Although these values result in the same underlying bit format when the PCI segment is zero, they represent separate structural abstractions in their respective specifications. Signed-off-by: Zhenzhong Duan --- arch/x86/coco/tdx/tdx.c | 5 ---- arch/x86/coco/tdx/tdx_connect.c | 41 +++++++++++++++++++++++++++++++ arch/x86/include/asm/shared/tdx.h | 1 + arch/x86/include/asm/tdx.h | 20 +++++++++++++++ 4 files changed, 62 insertions(+), 5 deletions(-) diff --git a/arch/x86/coco/tdx/tdx.c b/arch/x86/coco/tdx/tdx.c index 22cc177a6db4..c3db2451c078 100644 --- a/arch/x86/coco/tdx/tdx.c +++ b/arch/x86/coco/tdx/tdx.c @@ -34,11 +34,6 @@ #define VE_GET_PORT_NUM(e) ((e) >> 16) #define VE_IS_IO_STRING(e) ((e) & BIT(4)) =20 -/* TDX Module call error codes */ -#define TDCALL_RETURN_CODE(a) ((a) >> 32) -#define TDCALL_INVALID_OPERAND 0xc0000100 -#define TDCALL_OPERAND_BUSY 0x80000200 - #define TDREPORT_SUBTYPE_0 0 =20 static atomic_long_t nr_shared; diff --git a/arch/x86/coco/tdx/tdx_connect.c b/arch/x86/coco/tdx/tdx_connec= t.c index 0c6ca650771a..1409b1a30cc6 100644 --- a/arch/x86/coco/tdx/tdx_connect.c +++ b/arch/x86/coco/tdx/tdx_connect.c @@ -8,6 +8,17 @@ #include #include =20 +static inline int tdx_mcall_tdi_to_errno(u64 ret) +{ + switch (TDCALL_RETURN_CODE(ret)) { + case TDCALL_TDI_NOT_PRESENT: + case TDCALL_TDI_INVALID_METADATA: + return -ENODEV; + default: + return tdx_mcall_to_errno(ret); + } +} + /* * tdx_hcall_tdcm - Send a TDCM command to the host via TDG.VP.VMCALL. * @@ -30,3 +41,33 @@ u64 tdx_hcall_tdcm(u16 devid, void *buf, size_t size, u8= vector) return _tdx_hypercall(TDVMCALL_TDCM, devid, cc_mkdec(virt_to_phys(buf)), = size, vector); } EXPORT_SYMBOL_FOR_MODULES(tdx_hcall_tdcm, "tdx-guest"); + +/** + * tdx_mcall_tdi_read() - Read field from a Trust Device Interface Control= Structure (TDI_CS) + * @func_id: Function identifier specifying the TDI_CS + * @field: Field identifier within the specified TDI_CS + * @value: Storage for the successfully retrieved field value + * + * Invokes the TDG.TDI.RD TDCALL to read the value of @field within the TD= I_CS specified + * by @func_id. + * + * Return 0 on success, -ENXIO for invalid operands, -EBUSY for busy opera= tion, + * -ENODEV for TDI not present or invalid metadata, or -EIO on other TDCAL= L failures. + */ +int tdx_mcall_tdi_read(u64 func_id, u64 field, u64 *value) +{ + struct tdx_module_args args =3D { + .rcx =3D func_id, + .rdx =3D field, + }; + u64 ret; + + ret =3D __tdcall_ret(TDG_TDI_READ, &args); + if (!ret) { + *value =3D args.rcx; + return 0; + } + + return tdx_mcall_tdi_to_errno(ret); +} +EXPORT_SYMBOL_FOR_MODULES(tdx_mcall_tdi_read, "tdx-guest"); diff --git a/arch/x86/include/asm/shared/tdx.h b/arch/x86/include/asm/share= d/tdx.h index f46a3171a512..665c12925ff6 100644 --- a/arch/x86/include/asm/shared/tdx.h +++ b/arch/x86/include/asm/shared/tdx.h @@ -20,6 +20,7 @@ #define TDG_MEM_PAGE_ACCEPT 6 #define TDG_VM_RD 7 #define TDG_VM_WR 8 +#define TDG_TDI_READ 67 =20 /* TDX TD attributes */ #define TDX_TD_ATTR_DEBUG_BIT 0 diff --git a/arch/x86/include/asm/tdx.h b/arch/x86/include/asm/tdx.h index df4496ef8a6a..4937e23d5483 100644 --- a/arch/x86/include/asm/tdx.h +++ b/arch/x86/include/asm/tdx.h @@ -77,6 +77,25 @@ void tdx_halt(void); =20 bool tdx_early_handle_ve(struct pt_regs *regs); =20 +/* TDX Module call error codes */ +#define TDCALL_RETURN_CODE(a) ((a) >> 32) +#define TDCALL_INVALID_OPERAND 0xc0000100 +#define TDCALL_OPERAND_BUSY 0x80000200 +#define TDCALL_TDI_NOT_PRESENT 0xc0000f40 +#define TDCALL_TDI_INVALID_METADATA 0xc0000f41 + +static inline int tdx_mcall_to_errno(u64 ret) +{ + switch (TDCALL_RETURN_CODE(ret)) { + case TDCALL_INVALID_OPERAND: + return -ENXIO; + case TDCALL_OPERAND_BUSY: + return -EBUSY; + default: + return -EIO; + } +} + u64 tdg_vm_rd(u64 field, u64 *value); =20 int tdx_mcall_get_report0(u8 *reportdata, u8 *tdreport); @@ -87,6 +106,7 @@ u64 tdx_hcall_get_quote(u8 *buf, size_t size); =20 #ifdef CONFIG_TDX_CONNECT_GUEST 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 =20 void __init tdx_dump_attributes(u64 td_attr); --=20 2.52.0 From nobody Thu Sep 24 13:41:52 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D57A639CCEA for ; Thu, 24 Sep 2026 04:11:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.14 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223067; cv=none; b=cGVWapLUdKP6Ba0/HWGwD5c4uiRL/6DH5JLdqtkmgi7QGcj14Hq+OBDOCRhMyMrk7jkU9ro4ro9rF38/bRjaq3XYWGZh3p1bCu+kzvNljndBnH+8UNyOx16XxcnrF/0N8aaSqwoTyPPtY09Qtiy6Db9K43nkZAuvPw8Q7nzJgdA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223067; c=relaxed/simple; bh=vh60lwNUTqm2NDx/4Wmw1q4SymoPtPA4avzKSoQnPpU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=E6yzjAlpivV1Hl3c/okD+km9G0T7dN7gbY0ZNMHCb1vmyWRWSZAFVL1CORtD1HQAVxW+jrQjQjr3uU4fm3EwUriQ2tgU2Q0GtLzRwAZRZRkYGTHJY7SvdTIAEhHjSmzKvCme8e1op4lE5YHNv2sBmq6QSUI1ZSTOhb2q2i8iFCE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=dQpSx2Hf; arc=none smtp.client-ip=192.198.163.14 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="dQpSx2Hf" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790223066; x=1821759066; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=vh60lwNUTqm2NDx/4Wmw1q4SymoPtPA4avzKSoQnPpU=; b=dQpSx2HfDWsBXPVVDX7sEKuZCdwZGjDw+W8NrvWjHanytqr8Wiw3Hzpv jnrfig1Vjoo+aoPbePHx/++cIZkm5Yd4mMQmdcknXgTQWPXy9+1vO35FC huiquiWNROhUcXgJZ+K39L0ilDO12B6JyP7eU+pnQjqBmfP3c/xe6UGb5 HqXMtD0skOYmG+F+6OIAbYA5NK6wy/0cyZPe8t7WvoNu/iYD0wzXSOtC/ /uck/NNJBJqW114ryEi1ZL8dS/f1LxQkJFVS9TQrR9AXby9x9KdjieZUs ntDDYTXTqNDQp+D7cYlL9YkzEmKKtU1x6rwpLKtBLptNA7YR41ATqaMhG A==; X-CSE-ConnectionGUID: mL2QO42nToqUVICe/57T+A== X-CSE-MsgGUID: EaifZkNnQCWpTaJRlizt1w== X-IronPort-AV: E=McAfee;i="6800,10657,11914"; a="91002470" X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="91002470" Received: from fmviesa011.fm.intel.com ([10.60.135.151]) by fmvoesa108.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:11:06 -0700 X-CSE-ConnectionGUID: vmskSoJrQvS+ifTVrgz0Jw== X-CSE-MsgGUID: Q4f0lYpaQlCTKIj2/Bo3Bg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="5009358" Received: from unknown (HELO gnr-sp-2s-612.sh.intel.com) ([10.112.229.148]) by smtpauth.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:11:01 -0700 From: Zhenzhong Duan To: 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: [RFC PATCH 04/15] virt: tdx-guest: Support devsec TSM for secure devices Date: Thu, 24 Sep 2026 12:10:21 +0800 Message-ID: <20260924041032.1096569-5-zhenzhong.duan@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260924041032.1096569-1-zhenzhong.duan@intel.com> References: <20260924041032.1096569-1-zhenzhong.duan@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Register Intel TDX secure device (devsec TSM) to the TSM framework and supply the tdx_devsec_ops callback operations. This enables control and management of the Trust Device Interface (TDI) through those hooks in accordance with the TDISP protocol. Check the TDCS configuration flags during driver initialization to ensure the hardware interface is supported before attempting device registration. Signed-off-by: Zhenzhong Duan --- arch/x86/include/asm/shared/tdx.h | 1 + drivers/virt/coco/tdx-guest/Kconfig | 15 ++++ drivers/virt/coco/tdx-guest/Makefile | 3 + drivers/virt/coco/tdx-guest/connect.c | 81 +++++++++++++++++++ .../coco/tdx-guest/{tdx-guest.c =3D> main.c} | 6 ++ drivers/virt/coco/tdx-guest/tdx-guest.h | 20 +++++ 6 files changed, 126 insertions(+) create mode 100644 drivers/virt/coco/tdx-guest/connect.c rename drivers/virt/coco/tdx-guest/{tdx-guest.c =3D> main.c} (98%) create mode 100644 drivers/virt/coco/tdx-guest/tdx-guest.h diff --git a/arch/x86/include/asm/shared/tdx.h b/arch/x86/include/asm/share= d/tdx.h index 665c12925ff6..499103f7a01b 100644 --- a/arch/x86/include/asm/shared/tdx.h +++ b/arch/x86/include/asm/shared/tdx.h @@ -56,6 +56,7 @@ =20 /* TDCS_CONFIG_FLAGS bits */ #define TDCS_CONFIG_FLEXIBLE_PENDING_VE BIT_ULL(1) +#define TDCS_CONFIG_TDX_CONNECT BIT_ULL(5) =20 /* TDCS_TD_CTLS bits */ #define TD_CTLS_PENDING_VE_DISABLE_BIT 0 diff --git a/drivers/virt/coco/tdx-guest/Kconfig b/drivers/virt/coco/tdx-gu= est/Kconfig index dbbdc14383b1..2e9407f8bc70 100644 --- a/drivers/virt/coco/tdx-guest/Kconfig +++ b/drivers/virt/coco/tdx-guest/Kconfig @@ -10,3 +10,18 @@ config TDX_GUEST_DRIVER =20 To compile this driver as module, choose M here. The module will be called tdx-guest. + +config TDX_CONNECT_GUEST + bool "Intel TDX Connect Guest Support" + depends on TDX_GUEST_DRIVER + depends on PCI_TSM + default y + help + Support Trust Device Interface (TDI) feature enumeration, + validation, and activation within an Intel TDX guest. + + This option enables the guest kernel to establish secure, + isolated connections with trusted devices assigned to the TD, + validating MMIO maps and authorizing DMA remapping tables. + + If unsure, say Y. diff --git a/drivers/virt/coco/tdx-guest/Makefile b/drivers/virt/coco/tdx-g= uest/Makefile index 775cb463f9c8..cfa991c7aeb5 100644 --- a/drivers/virt/coco/tdx-guest/Makefile +++ b/drivers/virt/coco/tdx-guest/Makefile @@ -1,2 +1,5 @@ # SPDX-License-Identifier: GPL-2.0 obj-$(CONFIG_TDX_GUEST_DRIVER) +=3D tdx-guest.o + +tdx-guest-y :=3D main.o +tdx-guest-$(CONFIG_TDX_CONNECT_GUEST) +=3D connect.o diff --git a/drivers/virt/coco/tdx-guest/connect.c b/drivers/virt/coco/tdx-= guest/connect.c new file mode 100644 index 000000000000..80ae7c19e179 --- /dev/null +++ b/drivers/virt/coco/tdx-guest/connect.c @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * TDX Connect guest driver + * + * Copyright (C) 2026 Intel Corporation + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": tdx_connect: " fmt + +#include +#include +#include +#include + +#include "tdx-guest.h" + +struct tdx_devsec { + struct pci_tsm_devsec pci; +}; + +static struct tdx_devsec *to_tdx_devsec(struct pci_tsm *tsm) +{ + return container_of(tsm, struct tdx_devsec, pci.base_tsm); +} + +static struct pci_tsm *tdx_devsec_lock(struct tsm_dev *tsm_dev, struct pci= _dev *pdev) +{ + int ret; + + struct tdx_devsec *tdevsec __free(kfree) =3D kzalloc(sizeof(*tdevsec), GF= P_KERNEL); + if (!tdevsec) + return ERR_PTR(-ENOMEM); + + ret =3D pci_tsm_devsec_constructor(pdev, &tdevsec->pci, tsm_dev); + if (ret) + return ERR_PTR(ret); + + return &no_free_ptr(tdevsec)->pci.base_tsm; +} + +static void tdx_devsec_unlock(struct pci_tsm *tsm) +{ + struct tdx_devsec *tdevsec =3D to_tdx_devsec(tsm); + + kfree(tdevsec); +} + +static int tdx_devsec_run(struct pci_dev *pdev) +{ + return -EOPNOTSUPP; +} + +static struct pci_tsm_ops tdx_devsec_ops =3D { + .lock =3D tdx_devsec_lock, + .unlock =3D tdx_devsec_unlock, + .run =3D tdx_devsec_run, +}; + +static void devsec_tsm_remove(void *tsm_dev) +{ + tsm_unregister(tsm_dev); +} + +int tdx_connect_init(struct device *dev) +{ + struct tsm_dev *tsm_dev; + u64 config, ret; + + ret =3D tdg_vm_rd(TDCS_CONFIG_FLAGS, &config); + if (ret) + return -EIO; + + if (!(config & TDCS_CONFIG_TDX_CONNECT)) + return 0; + + tsm_dev =3D tsm_register(dev, &tdx_devsec_ops); + if (IS_ERR(tsm_dev)) + return PTR_ERR(tsm_dev); + + return devm_add_action_or_reset(dev, devsec_tsm_remove, tsm_dev); +} diff --git a/drivers/virt/coco/tdx-guest/tdx-guest.c b/drivers/virt/coco/td= x-guest/main.c similarity index 98% rename from drivers/virt/coco/tdx-guest/tdx-guest.c rename to drivers/virt/coco/tdx-guest/main.c index d0303e31e816..801a1f2b5f3d 100644 --- a/drivers/virt/coco/tdx-guest/tdx-guest.c +++ b/drivers/virt/coco/tdx-guest/main.c @@ -25,6 +25,8 @@ #include #include =20 +#include "tdx-guest.h" + /* TDREPORT buffer */ static u8 *tdx_report_buf; =20 @@ -428,6 +430,10 @@ static int __init tdx_guest_init(void) if (ret) goto free_quote; =20 + ret =3D tdx_connect_init(tdx_misc_dev.this_device); + if (ret) + pr_warn("Failed to enable TDX Connect: %d\n", ret); + return 0; =20 free_quote: diff --git a/drivers/virt/coco/tdx-guest/tdx-guest.h b/drivers/virt/coco/td= x-guest/tdx-guest.h new file mode 100644 index 000000000000..4218541c7f3b --- /dev/null +++ b/drivers/virt/coco/tdx-guest/tdx-guest.h @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * TDX guest driver private declarations + * + * Copyright (C) 2026 Intel Corporation + */ + +#ifndef __TDX_GUEST_H +#define __TDX_GUEST_H + +#include +#include + +#ifdef CONFIG_TDX_CONNECT_GUEST +extern int tdx_connect_init(struct device *dev); +#else +static inline int tdx_connect_init(struct device *dev) { return 0; } +#endif /* CONFIG_TDX_CONNECT_GUEST */ + +#endif /* __TDX_GUEST_H */ --=20 2.52.0 From nobody Thu Sep 24 13:41:52 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1E569381E92 for ; Thu, 24 Sep 2026 04:11:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.14 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223073; cv=none; b=LsF5zABbHuD4Ifsa4uJ/kolRjSeQVaknU8SznjfsQ2QPpKu8NyXzJHPFKxhCzLGPDR9PSBlawXhUsW4lR1WKRbfoaO1sydMjIJAOL/VO1DCfcX65061owfaI3ZTvly1ijCZgYEFKoxG83GaoSoreJbHKal0uBwrfzmNGx0h/M50= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223073; c=relaxed/simple; bh=0T18OoCOMHVjohB+Bo7M221XR7tFQdFCwwrIBDlyGhY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jFzhV/tIf4kFomxvWFF/0uVSumtTEbGgT1FqoVCvxPopIDO+nUa7CDzJ/t4FkRxJ0IMq8T5zk/TVv+xmZgIDSe0aq6kJAlMiCTva8doUXhY0IiZzGLs0t+zyDYQYrLUHHxWXNdBjbpmhEAAoCCU/WzMv0mzeFGLuoYLVdysRmzY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=g53ATk97; arc=none smtp.client-ip=192.198.163.14 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="g53ATk97" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790223071; x=1821759071; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=0T18OoCOMHVjohB+Bo7M221XR7tFQdFCwwrIBDlyGhY=; b=g53ATk97vWkElMGfRtuOPpIjeM91yewv79e+Ym5Xs1yV1JavandcpV9n +43kJ+nCGdUNYqBaWFRN8z+4jd1vDV7zhJ4WSjlPl+76xdi4WY0hN77OX s2k2emtbjwCZe5NBAyiTfDhYKSTvNlZsOko+USO69L9E1GSAFy2wh6nkt JQ+HmTC9m0XtKUbqc+2gPEhTIJWNEdJYhNM9Wury0DZD1eiY973XjKlTT zJPmZkUb70dYJDNmL67KzpmyIiovjcof2JBXtsJCl1qt8SYi4xPOMKztF o4QKMSF4znAunoeXasLMXkTDQ2CxRkCNBTlJZ4xgeslJyblmit6Hwbuzo Q==; X-CSE-ConnectionGUID: x16oVt83Qp2Fpm9yLFFKGg== X-CSE-MsgGUID: x/aP3mkXSIOrT00Vj97c6g== X-IronPort-AV: E=McAfee;i="6800,10657,11914"; a="91002482" X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="91002482" Received: from fmviesa011.fm.intel.com ([10.60.135.151]) by fmvoesa108.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:11:11 -0700 X-CSE-ConnectionGUID: 8rzRJ5BXRI+E0eh/60mrsQ== X-CSE-MsgGUID: XqidyVTYTmK9/DZUtz4GLQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="5009366" Received: from unknown (HELO gnr-sp-2s-612.sh.intel.com) ([10.112.229.148]) by smtpauth.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:11:06 -0700 From: Zhenzhong Duan To: 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: [RFC PATCH 05/15] virt: tdx-guest: Add TDCM helpers and TEE-IO support check Date: Thu, 24 Sep 2026 12:10:22 +0800 Message-ID: <20260924041032.1096569-6-zhenzhong.duan@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260924041032.1096569-1-zhenzhong.duan@intel.com> References: <20260924041032.1096569-1-zhenzhong.duan@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 --- 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); =20 #ifdef CONFIG_TDX_CONNECT_GUEST +enum tdcm_operation { + TDCM_OP_CHECK_TEEIO_SUPP =3D 1, + TDCM_OP_BIND =3D 2, + TDCM_OP_GET_DEV_INFO =3D 3, + TDCM_OP_GET_TDI_REPORT =3D 4, + TDCM_OP_START_TDI =3D 5, + TDCM_OP_GET_TDI_STATE =3D 6, + TDCM_OP_UNBIND =3D 7, +}; + +enum tdcm_status { + TDCM_STATUS_WAIT =3D 0, + TDCM_STATUS_COMPLETED =3D 1, + TDCM_STATUS_ERROR =3D 2, +}; + +enum tdcm_error { + TDCM_ERROR_TDX_MODULE =3D 10, + TDCM_ERROR_TDXIO_DEVICE =3D 11, + TDCM_ERROR_SPDM_MESSAGE =3D 12, + TDCM_ERROR_IDE_KM_MESSAGE =3D 13, + TDCM_ERROR_TDISP_MESSAGE =3D 14, + TDCM_ERROR_INVALID_STATE =3D 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) + 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 @@ =20 #define pr_fmt(fmt) KBUILD_MODNAME ": tdx_connect: " fmt =20 +#include #include #include +#include #include #include =20 #include "tdx-guest.h" =20 +/** + * struct tdcm_ctx - TEE-IO Device Configuration and Management (TDCM) con= text + * @buf: Pointer to 4KB-aligned shared memory (>=3D 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) + +static int tdx_tdcm_run(struct tdcm_ctx *tdcm) +{ + struct tdvmcall_tdcm *buf =3D tdcm->buf; + u8 status; + int ret; + u64 r; + + r =3D tdx_hcall_tdcm(tdcm->devid, buf, tdcm->buf_size, 0); + if (r) + return -EFAULT; + + ret =3D read_poll_timeout(READ_ONCE, status, status !=3D 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; + } + + /* 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 =3D READ_ONCE(buf->data_length); + + if (status !=3D TDCM_STATUS_COMPLETED || tdcm->rsp_data_sz > tdcm->max_rs= p_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; +} + +static struct tdcm_ctx *tdx_tdcm_alloc(struct pci_dev *pdev, u8 operation, + size_t cmd_data_sz, size_t rsp_data_sz) +{ + struct tdvmcall_tdcm *buf; + size_t buf_size; + int ret; + + buf_size =3D max(cmd_data_sz, rsp_data_sz); + buf_size =3D struct_size_t(struct tdvmcall_tdcm, data, buf_size); + buf_size =3D PAGE_ALIGN(buf_size); + + struct tdcm_ctx *tdcm __free(kfree) =3D kzalloc(sizeof(*tdcm), GFP_KERNEL= ); + if (!tdcm) + return ERR_PTR(-ENOMEM); + + buf =3D alloc_pages_exact(buf_size, GFP_KERNEL); + if (!buf) + return ERR_PTR(-ENOMEM); + + ret =3D set_memory_decrypted((unsigned long)buf, PHYS_PFN(buf_size)); + if (ret) { + free_pages_exact(buf, buf_size); + return ERR_PTR(ret); + } + + memset(buf, 0, buf_size); + buf->operation =3D operation; + buf->status =3D TDCM_STATUS_WAIT; + buf->data_length =3D cmd_data_sz; + + tdcm->buf =3D buf; + tdcm->buf_size =3D buf_size; + tdcm->max_rsp_data_sz =3D rsp_data_sz; + tdcm->devid =3D pci_dev_id(pdev); + + return_ptr(tdcm); +} + +static void tdx_tdcm_free(struct tdcm_ctx *tdcm) +{ + if (set_memory_encrypted((unsigned long)tdcm->buf, PHYS_PFN(tdcm->buf_siz= e))) + pr_err("Failed to encrypt TDCM buf, leak it\n"); + else + free_pages_exact(tdcm->buf, tdcm->buf_size); + + kfree(tdcm); +} + +DEFINE_FREE(tdx_tdcm_free, struct tdcm_ctx *, + if (!IS_ERR_OR_NULL(_T)) tdx_tdcm_free(_T)) + struct tdx_devsec { struct pci_tsm_devsec pci; }; @@ -23,6 +137,28 @@ static struct tdx_devsec *to_tdx_devsec(struct pci_tsm = *tsm) return container_of(tsm, struct tdx_devsec, pci.base_tsm); } =20 +static bool tdx_is_dev_teeio_support(struct tdx_devsec *tdevsec) +{ + struct pci_dev *pdev =3D tdevsec->pci.base_tsm.pdev; + struct tdcm_rsp_check_teeio_supp *rsp; + int ret; + + struct tdcm_ctx *tdcm __free(tdx_tdcm_free) =3D + tdx_tdcm_alloc(pdev, TDCM_OP_CHECK_TEEIO_SUPP, 0, sizeof(*rsp)); + if (IS_ERR(tdcm)) + return false; + + ret =3D tdx_tdcm_run(tdcm); + if (ret) + return false; + + if (tdcm->rsp_data_sz !=3D sizeof(*rsp)) + return false; + + rsp =3D (struct tdcm_rsp_check_teeio_supp *)to_tdcm_rsp_data(tdcm); + return !!rsp->is_supported; +} + static struct pci_tsm *tdx_devsec_lock(struct tsm_dev *tsm_dev, struct pci= _dev *pdev) { int ret; @@ -35,6 +171,9 @@ static struct pci_tsm *tdx_devsec_lock(struct tsm_dev *t= sm_dev, struct pci_dev * if (ret) return ERR_PTR(ret); =20 + if (!tdx_is_dev_teeio_support(tdevsec)) + return ERR_PTR(-EOPNOTSUPP); + return &no_free_ptr(tdevsec)->pci.base_tsm; } =20 --=20 2.52.0 From nobody Thu Sep 24 13:41:52 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1B277412BF1 for ; Thu, 24 Sep 2026 04:11:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.14 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223079; cv=none; b=bnEPye+mXmlz4cHfDwL4qY37oi5GiwWJslt/UAdatLBvtrLsZcTH2FdDAnaapEZTmwLBBb19lGEKoAO3vt9+w7jy8CEpq2j00aeaW835CB0AaAPwdu0W2WjC7tlN4Xe+S1SJf1OrFgV9FVBQAj2G34IXhAv8jBFFvIFbSmaLTw0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223079; c=relaxed/simple; bh=9Og2FHsTmhhiwP8cJp+XngD7DpsKEKwOSBk9kuEjHoI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tKHCD/OHsVbc+lvIMfCo1S9aLw1w3x1r8IBpeWJ9zAKFmZOlaaOCo6lc8WYwDB+0/OwJPjGHLuU4tyyDSUQL2ML+xvHTfn1enEgjfWwikIgAIfUm2MbnfC+DK4kzGaegE59a2syYXadKIG46A0ZsyXofJ9iC/w+mvlcampY/ddY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=AzKs5EDs; arc=none smtp.client-ip=192.198.163.14 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="AzKs5EDs" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790223076; x=1821759076; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=9Og2FHsTmhhiwP8cJp+XngD7DpsKEKwOSBk9kuEjHoI=; b=AzKs5EDshB+BCC3rE8lWj+e/hpsXoAa0urE8WcSuph56vYngq03JCEmv V95v2y8TlYOVr7jOkeht8vgTSeRTGX1Qhq+rvGmX+5goeiLP5fhCS0Kg4 G1oKvPJrTY8H+U5BOtV4CzsO3pq1Rs2mP2tFjm3jyodK8olDCzX0/jqzQ iAAGSe8uxLS0SMRR5e/xRRMTq5hyq2FEDsAz3YNcNk4tGGDyuPCikmkxA g1i4QWFNjQa1FolGQtZUhW+y5IN28XP7cAjhn70TNHOk/x0Z9XNsx7kL0 D6PlaH3Q9AgQvdsmL6TQUkKoJXTIDOTww7SJaQRHRin57YBDdxwIgJbQQ g==; X-CSE-ConnectionGUID: mVzwF41WTSWSovwobDkrSQ== X-CSE-MsgGUID: fai0FqyWTz+9apgCqO9KhA== X-IronPort-AV: E=McAfee;i="6800,10657,11914"; a="91002489" X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="91002489" Received: from fmviesa011.fm.intel.com ([10.60.135.151]) by fmvoesa108.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:11:16 -0700 X-CSE-ConnectionGUID: 6ZfsxLeVRnqn1uV9b+9IuQ== X-CSE-MsgGUID: /PA5H6B2RDmhtYDgyuSPOQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="5009370" Received: from unknown (HELO gnr-sp-2s-612.sh.intel.com) ([10.112.229.148]) by smtpauth.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:11:11 -0700 From: Zhenzhong Duan To: 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: [RFC PATCH 06/15] virt: tdx-guest: Support TDI bind and unbind operations Date: Thu, 24 Sep 2026 12:10:23 +0800 Message-ID: <20260924041032.1096569-7-zhenzhong.duan@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260924041032.1096569-1-zhenzhong.duan@intel.com> References: <20260924041032.1096569-1-zhenzhong.duan@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Introduce support for binding and unbinding the Trust Device Interface (TDI) using the TDCM_OP_BIND and TDCM_OP_UNBIND commands. Executing TDCM_OP_BIND transitions the TDI state to a locked state (TDI_STATE_CONFIG_LOCKED). Add a sanity check following the bind operation to verify this state transition succeeded before finalizing device locking. Signed-off-by: Zhenzhong Duan --- drivers/virt/coco/tdx-guest/connect.c | 75 +++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/drivers/virt/coco/tdx-guest/connect.c b/drivers/virt/coco/tdx-= guest/connect.c index 1f52a187b30f..e36515fc43ef 100644 --- a/drivers/virt/coco/tdx-guest/connect.c +++ b/drivers/virt/coco/tdx-guest/connect.c @@ -159,8 +159,67 @@ static bool tdx_is_dev_teeio_support(struct tdx_devsec= *tdevsec) return !!rsp->is_supported; } =20 +static struct tdx_devsec *tdx_tdi_bind_dev(struct tdx_devsec *tdevsec) +{ + struct pci_dev *pdev =3D tdevsec->pci.base_tsm.pdev; + int ret; + + struct tdcm_ctx *tdcm __free(tdx_tdcm_free) =3D tdx_tdcm_alloc(pdev, TDCM= _OP_BIND, 0, 0); + if (IS_ERR(tdcm)) + return ERR_CAST(tdcm); + + ret =3D tdx_tdcm_run(tdcm); + if (ret) + return ERR_PTR(ret); + + return tdevsec; +} + +static int tdx_tdi_unbind_dev(struct tdx_devsec *tdevsec) +{ + struct pci_dev *pdev =3D tdevsec->pci.base_tsm.pdev; + + struct tdcm_ctx *tdcm __free(tdx_tdcm_free) =3D tdx_tdcm_alloc(pdev, TDCM= _OP_UNBIND, 0, 0); + if (IS_ERR(tdcm)) + return PTR_ERR(tdcm); + + return tdx_tdcm_run(tdcm); +} + +DEFINE_FREE(tdx_tdi_unbind_dev, struct tdx_devsec *, + if (!IS_ERR_OR_NULL(_T)) tdx_tdi_unbind_dev(_T)) + +/* + * TDI State value returned by TDG.TDI.RD. + * Refer to section "TDG.TDI.RD leaf" in the TDX Connect ABI Specification. + */ +enum tdi_state { + TDI_STATE_CONFIG_UNLOCKED =3D 0x0, + TDI_STATE_CONFIG_LOCKED =3D 0x1, + TDI_STATE_RUN =3D 0x2, + TDI_STATE_ERROR =3D 0x3, +}; + +enum tdi_field_code { + TDI_GET_TDISP_STATE =3D 2, +}; + +static int tdx_tdi_read_state(struct tdx_devsec *tdevsec, u8 *state) +{ + struct pci_dev *pdev =3D tdevsec->pci.base_tsm.pdev; + u64 value; + int ret; + + ret =3D tdx_mcall_tdi_read(pci_dev_id(pdev), TDI_GET_TDISP_STATE, &value); + if (!ret) + *state =3D value; + + return ret; +} + static struct pci_tsm *tdx_devsec_lock(struct tsm_dev *tsm_dev, struct pci= _dev *pdev) { + u8 state; int ret; =20 struct tdx_devsec *tdevsec __free(kfree) =3D kzalloc(sizeof(*tdevsec), GF= P_KERNEL); @@ -174,6 +233,19 @@ static struct pci_tsm *tdx_devsec_lock(struct tsm_dev = *tsm_dev, struct pci_dev * if (!tdx_is_dev_teeio_support(tdevsec)) return ERR_PTR(-EOPNOTSUPP); =20 + struct tdx_devsec *tdevsec_bind __free(tdx_tdi_unbind_dev) =3D tdx_tdi_bi= nd_dev(tdevsec); + if (IS_ERR(tdevsec_bind)) + return ERR_CAST(tdevsec_bind); + + ret =3D tdx_tdi_read_state(tdevsec, &state); + if (ret) + return ERR_PTR(ret); + + if (state !=3D TDI_STATE_CONFIG_LOCKED) + return ERR_PTR(-EIO); + + retain_and_null_ptr(tdevsec_bind); + return &no_free_ptr(tdevsec)->pci.base_tsm; } =20 @@ -181,6 +253,9 @@ static void tdx_devsec_unlock(struct pci_tsm *tsm) { struct tdx_devsec *tdevsec =3D to_tdx_devsec(tsm); =20 + if (WARN_ON(tdx_tdi_unbind_dev(tdevsec))) + return; + kfree(tdevsec); } =20 --=20 2.52.0 From nobody Thu Sep 24 13:41:52 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3649C411A08 for ; Thu, 24 Sep 2026 04:11:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.14 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223083; cv=none; b=JoyQIR6kxClNci7+cU2ntolfPrzjNdvDM4LDkiYyXUI1UBawF7OrUuFw7Bc3asjb4fvbP5xlYEHbRoItZWuNpSrwG8KwqBmbkARJo2JynyfOOnVKgw+VZam/AqBHQQnpyM+KGTCzGSkbPahmGZ3Pud5LZPR8bI4UHXSeMU119rY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223083; c=relaxed/simple; bh=4SPSOTFTGnUrHAWx0mAUBUztII+y1AMpCB1yG6ndk40=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZN3gFQ0X2/GggqPxWHDAkO/3aIaZLYvH2eLbOvemf+auxwZBXYDRD/jKmGlsSOi/dyfNRuR3aEH81k8Htt7PAKx80pjCvuAttefFvYZK+v0FU2LbyOOrVYnZW7cKCUr4Oh6ZGbjrj2vhHkVNmFNkgWlRd6HciaRH3SWOlFzlvHw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=bDYy55fQ; arc=none smtp.client-ip=192.198.163.14 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="bDYy55fQ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790223081; x=1821759081; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=4SPSOTFTGnUrHAWx0mAUBUztII+y1AMpCB1yG6ndk40=; b=bDYy55fQqWqzpAVd0+revhL3aguTeAcHQ33WIbXMHbA9KqgBbfHqibkM Wejf4PA3WKXF+KIQ25T4QNuPYKoCHM363mjooHJLo/ejFkP+EFc4Nzf3t xnCHREhqUQpcohjIAkdSw5AOitAVaQ313dY+9Ex/H+MVqcuZxToOk2dCV ZSwBXR/AmbGc46mgiEPJz5R0H2/6Bu/WzfdDavFyxSft1MKYVpu/eSDpi A6UkXUtANjN20wBFUY1yb8qtNnDJgr1L7qOEQf+1iQ1yrNieFS4oIdWXX K8V4slLPPIUB6iWlD2rzodgRnV4DDd9+ooJ3NyHq9qHMNBwW0C4zHgi1y A==; X-CSE-ConnectionGUID: EDGO7mf9Sr6lJ+WnRbJphA== X-CSE-MsgGUID: wMhgG+DMRxeNCk4fpmUI4g== X-IronPort-AV: E=McAfee;i="6800,10657,11914"; a="91002501" X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="91002501" Received: from fmviesa011.fm.intel.com ([10.60.135.151]) by fmvoesa108.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:11:21 -0700 X-CSE-ConnectionGUID: 78qXy5V9R2GXT1IVO9sxRQ== X-CSE-MsgGUID: MXIAFNVdSOWcwm/+8W3PYA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="5009383" Received: from unknown (HELO gnr-sp-2s-612.sh.intel.com) ([10.112.229.148]) by smtpauth.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:11:17 -0700 From: Zhenzhong Duan To: 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: [RFC PATCH 07/15] PCI/TSM: Track Device Interface Report MMIO range index Date: Thu, 24 Sep 2026 12:10:24 +0800 Message-ID: <20260924041032.1096569-8-zhenzhong.duan@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260924041032.1096569-1-zhenzhong.duan@intel.com> References: <20260924041032.1096569-1-zhenzhong.duan@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" TDX Connect's TDG.MMIO.ACCEPT interface identifies an MMIO range by its index in the Device Interface Report. Preserve this report index when building pci_tsm_mmio entries. Signed-off-by: Zhenzhong Duan --- drivers/pci/tsm/core.c | 1 + include/linux/pci-tsm.h | 1 + 2 files changed, 2 insertions(+) diff --git a/drivers/pci/tsm/core.c b/drivers/pci/tsm/core.c index 19ad35f2da4a..3efb9c10d44b 100644 --- a/drivers/pci/tsm/core.c +++ b/drivers/pci/tsm/core.c @@ -754,6 +754,7 @@ struct pci_tsm_mmio *pci_tsm_mmio_alloc(struct pci_dev = *pdev, entry->res.start =3D range.start; entry->res.end =3D range.end; entry->tsm_offset =3D tsm_offset; + entry->index =3D i; mmio->nr++; } =20 diff --git a/include/linux/pci-tsm.h b/include/linux/pci-tsm.h index be9f78ca2c1a..e5d9d7af2701 100644 --- a/include/linux/pci-tsm.h +++ b/include/linux/pci-tsm.h @@ -165,6 +165,7 @@ struct pci_tsm_pf0 { struct pci_tsm_mmio_entry { struct resource res; u64 tsm_offset; + int index; }; =20 struct pci_tsm_mmio { --=20 2.52.0 From nobody Thu Sep 24 13:41:52 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4D31D411A0A for ; Thu, 24 Sep 2026 04:11:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.14 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223088; cv=none; b=D91Q4mMhAy7fH0jApF6kTCGyZAG3EZKEwBmaTd5NFO5SbkgY8YDtXWridVLDM7KX3F/S+LFgaS21Z0eROl/svyXxMMfyLBWmQAo2AofbFJ/i63/x5drko/iLUFN7nwe7Bm14sph0IoL0/6IqNEO+1rKveR1Ltl/4aJvg1EocrI8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223088; c=relaxed/simple; bh=aOLJYCqiStgOVgGJWcOTh3xf1AAjNf63OcXCuuBYa/U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=a5jEcdouiY0+ySlP1ysF1GMRW4h2nVfbdvyBZbVvgermoZ6TwS+StCA6SScxNCArxjbf9ZKpdNdJrJFvxmU0t/H52h7zdYXP3fXxEmE+HwbTRbn26JlImwROx/kl0UPk9V7oXrZWboZoN/1K0A8Qil1RloJgULOA3/ZLqQ/BOpo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=cnBKjVx1; arc=none smtp.client-ip=192.198.163.14 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="cnBKjVx1" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790223086; x=1821759086; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=aOLJYCqiStgOVgGJWcOTh3xf1AAjNf63OcXCuuBYa/U=; b=cnBKjVx1U8gQcAuawqdfjBRW7mSgLx+Ihx1TtmRjl3iEY+uXek0aqHMm LfUYGI27lh62Yc2vq8suEhci9ltf3PR2szLnId2iri25QY2fHlW4VjO1J gWhLlp/uEulmxSYrdfiS7bWpL4DqjOXYI7N3pKn+6qoOtUvCs4WVsTLzc ka/Wce4ItgLJS/F2QbYdqQ5hCpj2/zwjB01VGdm10NAj8oGLHC+AqKjgs Kg8p2stiHfATJxv7/4iz75fbQCMsh9xzWdW1jjDTSTshq3VDLbbxAwP6/ uBOiQAjBABL3AavJVMX2AvCgyKakUd+MGJRihay/R+gMSNpyQILN4Ai2q A==; X-CSE-ConnectionGUID: A7tBW8nmQBqNjOvANyKKHw== X-CSE-MsgGUID: JkUTt/PVQ9mqIqHx0GzNHw== X-IronPort-AV: E=McAfee;i="6800,10657,11914"; a="91002512" X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="91002512" Received: from fmviesa011.fm.intel.com ([10.60.135.151]) by fmvoesa108.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:11:26 -0700 X-CSE-ConnectionGUID: TOqSnP9PQUa4j/83KVbUUg== X-CSE-MsgGUID: 6Z6uerqqS4S9+jROsn4AjQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="5009391" Received: from unknown (HELO gnr-sp-2s-612.sh.intel.com) ([10.112.229.148]) by smtpauth.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:11:22 -0700 From: Zhenzhong Duan To: 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: [RFC PATCH 08/15] x86/tdx: Add TDG.MMIO.ACCEPT module call wrapper for TDX Connect Date: Thu, 24 Sep 2026 12:10:25 +0800 Message-ID: <20260924041032.1096569-9-zhenzhong.duan@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260924041032.1096569-1-zhenzhong.duan@intel.com> References: <20260924041032.1096569-1-zhenzhong.duan@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" TDG.MMIO.ACCEPT verifies and accepts a pending private MMIO range for a trusted device. The MMIO range to be accepted can be a sub-range of the MMIO ranges originally defined in the Device Interface Report. Because the TDX module caches these ranges from the Device Interface Report, the guest does not need to pass the explicit physical start and end addresses of the MMIO range. Instead, it only needs to provide the target MMIO range index, the offset within that range, and the size to be accepted. Translate TDX module return codes into Linux errno values. Signed-off-by: Zhenzhong Duan --- arch/x86/coco/tdx/tdx_connect.c | 38 +++++++++++++++++++++++++++++++ arch/x86/include/asm/shared/tdx.h | 1 + arch/x86/include/asm/tdx.h | 1 + 3 files changed, 40 insertions(+) diff --git a/arch/x86/coco/tdx/tdx_connect.c b/arch/x86/coco/tdx/tdx_connec= t.c index 1409b1a30cc6..09a92fe23357 100644 --- a/arch/x86/coco/tdx/tdx_connect.c +++ b/arch/x86/coco/tdx/tdx_connect.c @@ -71,3 +71,41 @@ int tdx_mcall_tdi_read(u64 func_id, u64 field, u64 *valu= e) return tdx_mcall_tdi_to_errno(ret); } EXPORT_SYMBOL_FOR_MODULES(tdx_mcall_tdi_read, "tdx-guest"); + +/** + * tdx_mcall_mmio_accept() - Accept a pending private MMIO mapping of a + * Trust Device Interface (TDI) instance + * @func_id: Function identifier specifying the TDI instance + * @index: MMIO range index from the Device Interface Report + * @pg_offset: Range offset to start accepting the subrange from, in pages + * @page_cnt: Count of pages to accept + * @gpa: GPA base address the subrange mapped to + * + * Verify and accept a pending private MMIO mapping. Upon success, the MMIO + * pages are set as mapped in the TDX module. + * + * Return 0 on success, -EINVAL for unaligned GPA, -ENXIO for invalid oper= ands, + * -EBUSY for busy operation, -ENODEV for TDI not present or invalid metad= ata, + * or -EIO on other TDCALL failures. + * + */ +int tdx_mcall_mmio_accept(u64 func_id, u64 index, u32 pg_offset, u32 page_= cnt, phys_addr_t gpa) +{ + struct tdx_module_args args =3D { + .rcx =3D gpa | TDX_PS_4K, + .rdx =3D index, + .r8 =3D func_id, + .r9 =3D (u64)pg_offset << 32 | page_cnt, + }; + u64 ret; + + if (!IS_ALIGNED(gpa, PAGE_SIZE)) + return -EINVAL; + + ret =3D __tdcall_ret(TDG_MMIO_ACCEPT, &args); + if (!ret) + return 0; + + return tdx_mcall_tdi_to_errno(ret); +} +EXPORT_SYMBOL_FOR_MODULES(tdx_mcall_mmio_accept, "tdx-guest"); diff --git a/arch/x86/include/asm/shared/tdx.h b/arch/x86/include/asm/share= d/tdx.h index 499103f7a01b..ce80fb2116fb 100644 --- a/arch/x86/include/asm/shared/tdx.h +++ b/arch/x86/include/asm/shared/tdx.h @@ -21,6 +21,7 @@ #define TDG_VM_RD 7 #define TDG_VM_WR 8 #define TDG_TDI_READ 67 +#define TDG_MMIO_ACCEPT 71 =20 /* TDX TD attributes */ #define TDX_TD_ATTR_DEBUG_BIT 0 diff --git a/arch/x86/include/asm/tdx.h b/arch/x86/include/asm/tdx.h index 71cd701d346f..e6493f3bc0d1 100644 --- a/arch/x86/include/asm/tdx.h +++ b/arch/x86/include/asm/tdx.h @@ -155,6 +155,7 @@ struct tdcm_rsp_check_teeio_supp { =20 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); +int tdx_mcall_mmio_accept(u64 func_id, u64 index, u32 pg_offset, u32 page_= cnt, phys_addr_t gpa); #endif =20 void __init tdx_dump_attributes(u64 td_attr); --=20 2.52.0 From nobody Thu Sep 24 13:41:52 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6F31B3E7625 for ; Thu, 24 Sep 2026 04:11:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.14 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223093; cv=none; b=ZJlAG2+GpFg2JBh3kx5tlPy2jQH4iyfcyRr7S1nFIBYMuBa5Ft61WIG58DkxQF+GIYpCCCVdEcB0WNhswc4CkZy9GyIiji0sAVGx70GoQmzN5FLj/iHu98YnGzKuhJo2TbFecekH+ECVvOIJ1zZJ1aRDtxzV0OZ3YO4udlGH3qA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223093; c=relaxed/simple; bh=PZSyZslskXLdPIcjgU7Rl+dNTg85CfPOP8ufd252HGQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UkqnKHLdk+QXTpBYaI449OeazlGH7ccAkWr2iU2Da7gwmBeMWm+2AMBzFYqk8eZUzsS+l9TwoHakr7gvI1kwzXzCy3oarpo7U+QRiCqSRa06dg0dSNHZ/dJYJSWmgLqHRqqqNdG/mU38rxxBRWhSs5Ik0w+bS4cVNpQaro2FtJg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=DtbqF9xw; arc=none smtp.client-ip=192.198.163.14 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="DtbqF9xw" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790223091; x=1821759091; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=PZSyZslskXLdPIcjgU7Rl+dNTg85CfPOP8ufd252HGQ=; b=DtbqF9xw9kzHzABGk0TmdCoAAewPmK6ManEGm460P4I4GRbNoJxn6mS6 7uBOR2fQM7lVdKg2fsFsnX+OZiRZvQexmspQ0URMJy9aGpp7fBe1aHfTl Dkxx24Wp7y15U9UXrqkqLzYWoGhWyR97/RWmMTUBOx2kjG7B5TsBtdWsH dW4KVBOitf7bEecr5BJIIYAhOv5gLG4Pdbk/DwBJaWPH6Lq4VDD5PH9Ds nFQt7IcuY8inS8j+0gCBQXiBSsYNzN2DNYYnuxLI1/dptsd1b3bR1owpm bWgWqulhWt/3TJr+ua0cAVZmLb6z7fA8KP2fx5c0TN8MpNME544I8uuXq w==; X-CSE-ConnectionGUID: 8RIWM268TuO3vHzeWGtfZA== X-CSE-MsgGUID: dMZnWUZvRs+xAU/+of+VjQ== X-IronPort-AV: E=McAfee;i="6800,10657,11914"; a="91002522" X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="91002522" Received: from fmviesa011.fm.intel.com ([10.60.135.151]) by fmvoesa108.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:11:31 -0700 X-CSE-ConnectionGUID: 11Ah0424SMOhoDZILmQl6Q== X-CSE-MsgGUID: R8uFckbDRuSuf4LWWrtV5A== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="5009395" Received: from unknown (HELO gnr-sp-2s-612.sh.intel.com) ([10.112.229.148]) by smtpauth.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:11:27 -0700 From: Zhenzhong Duan To: 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: [RFC PATCH 09/15] virt: tdx-guest: Capture the TDI report during device lock Date: Thu, 24 Sep 2026 12:10:26 +0800 Message-ID: <20260924041032.1096569-10-zhenzhong.duan@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260924041032.1096569-1-zhenzhong.duan@intel.com> References: <20260924041032.1096569-1-zhenzhong.duan@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Retrieve the Trusted Device Interface report through TDCM_OP_GET_TDI_REPORT after binding the device. Store the report in the PCI TSM device evidence object and free it during device unlock. Signed-off-by: Zhenzhong Duan --- drivers/virt/coco/tdx-guest/connect.c | 45 +++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/drivers/virt/coco/tdx-guest/connect.c b/drivers/virt/coco/tdx-= guest/connect.c index e36515fc43ef..d5934e8c0089 100644 --- a/drivers/virt/coco/tdx-guest/connect.c +++ b/drivers/virt/coco/tdx-guest/connect.c @@ -217,8 +217,35 @@ static int tdx_tdi_read_state(struct tdx_devsec *tdevs= ec, u8 *state) return ret; } =20 +static u8 *tdx_tdi_get_report(struct tdx_devsec *tdevsec, u32 *report_sz) +{ + struct pci_dev *pdev =3D tdevsec->pci.base_tsm.pdev; + u8 *report; + int ret; + + struct tdcm_ctx *tdcm __free(tdx_tdcm_free) =3D + tdx_tdcm_alloc(pdev, TDCM_OP_GET_TDI_REPORT, 0, MAX_TDI_REPORT_SIZE); + if (IS_ERR(tdcm)) + return ERR_CAST(tdcm); + + ret =3D tdx_tdcm_run(tdcm); + if (ret) + return ERR_PTR(ret); + + report =3D kmemdup(to_tdcm_rsp_data(tdcm), tdcm->rsp_data_sz, GFP_KERNEL); + if (!report) + return ERR_PTR(-ENOMEM); + + *report_sz =3D tdcm->rsp_data_sz; + print_hex_dump_debug("tdi_report: ", DUMP_PREFIX_OFFSET, 16, 1, report, *= report_sz, false); + return report; +} + static struct pci_tsm *tdx_devsec_lock(struct tsm_dev *tsm_dev, struct pci= _dev *pdev) { + struct device_evidence_object *tsm_report; + struct device_evidence *evidence; + u32 report_sz; u8 state; int ret; =20 @@ -237,6 +264,10 @@ static struct pci_tsm *tdx_devsec_lock(struct tsm_dev = *tsm_dev, struct pci_dev * if (IS_ERR(tdevsec_bind)) return ERR_CAST(tdevsec_bind); =20 + u8 *report __free(kfree) =3D tdx_tdi_get_report(tdevsec, &report_sz); + if (IS_ERR(report)) + return ERR_CAST(report); + ret =3D tdx_tdi_read_state(tdevsec, &state); if (ret) return ERR_PTR(ret); @@ -244,6 +275,17 @@ static struct pci_tsm *tdx_devsec_lock(struct tsm_dev = *tsm_dev, struct pci_dev * if (state !=3D TDI_STATE_CONFIG_LOCKED) return ERR_PTR(-EIO); =20 + evidence =3D device_evidence_create(0, HASH_ALGO_SHA384); + + if (!evidence) + return ERR_PTR(-ENOMEM); + + tsm_report =3D &evidence->obj[DEVICE_EVIDENCE_TYPE_REPORT]; + tsm_report->data =3D no_free_ptr(report); + tsm_report->len =3D report_sz; + + tdevsec->pci.base_tsm.evidence =3D evidence; + retain_and_null_ptr(tdevsec_bind); =20 return &no_free_ptr(tdevsec)->pci.base_tsm; @@ -252,10 +294,13 @@ static struct pci_tsm *tdx_devsec_lock(struct tsm_dev= *tsm_dev, struct pci_dev * static void tdx_devsec_unlock(struct pci_tsm *tsm) { struct tdx_devsec *tdevsec =3D to_tdx_devsec(tsm); + struct device_evidence *evidence =3D tsm->evidence; =20 if (WARN_ON(tdx_tdi_unbind_dev(tdevsec))) return; =20 + kfree(evidence->obj[DEVICE_EVIDENCE_TYPE_REPORT].data); + kfree(evidence); kfree(tdevsec); } =20 --=20 2.52.0 From nobody Thu Sep 24 13:41:52 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 99BE62DECA3 for ; Thu, 24 Sep 2026 04:11:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.14 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223098; cv=none; b=pI4/w+lDXfQHGE/+hyy1R6g0+77eURxgakQTbP1U84IWpgvIjxALtAIQFVm8SHFT6ADrnK+YjMrPdTi9qg2y9BzUQOHv5foXkcnIY5i/gN0yc+DFN4pH1w1P/KC0Ugh5Pqnxcv4xv3Fa2iujiAeeM/aAcdTtqFddFS62D2fQ5QU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223098; c=relaxed/simple; bh=QlbJZvIDoVeDS9GGzvd8732KHMCJKcpgwdQDfUwtoGc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kDZxTVC+WbB2VvqQXscl769ChyoOfi6EFc052g73vfzKuPofHXVpVnKf4TBtmRySPCJRmf4Z7Pxnd8bIfg+etgf5irLlhxDpYBZR1pmZ8PFqUM/qv69I6oIBCksagJOynLLhzbnvvtExqVQAztSIK9TJo2DsFlxSPmRecOdiV1Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=dv8eXXeB; arc=none smtp.client-ip=192.198.163.14 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="dv8eXXeB" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790223097; x=1821759097; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=QlbJZvIDoVeDS9GGzvd8732KHMCJKcpgwdQDfUwtoGc=; b=dv8eXXeBJGHCo1q9W9DC6rOtG2RbS+6MZnkDW/jKpNMm72cG2vayZSKY kMUsP7MJ2dipJPWdpBh6i3zWwAxz1l3yG5jO2wRYhxka+X2uhrQbz2tyR AxLERAKlzqByv52OuiKQBbWtqRxSswVqW+uF6eQ1okKKvEcIz/eSO3VQj M2AU0DkjXzpcJr6k9r1USL0Cwo/qm9e2xt7fSvYwMcKlFk0WA2XAbnlfP Lt4Qpjaghk9mf2B2KZwX5BMUmRrIh1BPlFum7gRQwThTAC0zW+ZmpDXce UkiHPQoTpAozRX5DdB3t7AKnh4bbPmZo9Vk+VZrVJ+26QCcT3K9p9ftA+ w==; X-CSE-ConnectionGUID: 633FZx8KQj6DMSDxwb0w+A== X-CSE-MsgGUID: 8B23Kv6ITzCPkHgQ/xAHBg== X-IronPort-AV: E=McAfee;i="6800,10657,11914"; a="91002538" X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="91002538" Received: from fmviesa011.fm.intel.com ([10.60.135.151]) by fmvoesa108.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:11:36 -0700 X-CSE-ConnectionGUID: HPxhouQjRSGS2w0h1q8vnw== X-CSE-MsgGUID: WJx5yBuUTxy1Q5vhK1DDKw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="5009401" Received: from unknown (HELO gnr-sp-2s-612.sh.intel.com) ([10.112.229.148]) by smtpauth.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:11:32 -0700 From: Zhenzhong Duan To: 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: [RFC PATCH 10/15] virt: tdx-guest: Set up and accept private MMIO ranges Date: Thu, 24 Sep 2026 12:10:27 +0800 Message-ID: <20260924041032.1096569-11-zhenzhong.duan@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260924041032.1096569-1-zhenzhong.duan@intel.com> References: <20260924041032.1096569-1-zhenzhong.duan@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Build private MMIO descriptors from the TDI report using the PCI TSM MMIO helpers and accept each private range through TDG.MMIO.ACCEPT. Keep the descriptors while the device remains locked and tear them down on acceptance failure and during unlock. Signed-off-by: Zhenzhong Duan --- drivers/virt/coco/tdx-guest/connect.c | 75 +++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/drivers/virt/coco/tdx-guest/connect.c b/drivers/virt/coco/tdx-= guest/connect.c index d5934e8c0089..fe8d76ba6f81 100644 --- a/drivers/virt/coco/tdx-guest/connect.c +++ b/drivers/virt/coco/tdx-guest/connect.c @@ -241,6 +241,67 @@ static u8 *tdx_tdi_get_report(struct tdx_devsec *tdevs= ec, u32 *report_sz) return report; } =20 +static struct tdx_devsec *tdx_tdi_mmio_setup(struct tdx_devsec *tdevsec) +{ + struct pci_tsm_devsec *devsec_tsm =3D &tdevsec->pci; + struct pci_dev *pdev =3D devsec_tsm->base_tsm.pdev; + int rc; + + struct pci_tsm_mmio *mmio __free(kfree) =3D pci_tsm_mmio_alloc(pdev, TDIS= P_OFFSET_RELATIVE); + if (!mmio) + return ERR_PTR(-EINVAL); + + rc =3D pci_tsm_mmio_setup(pdev, mmio); + if (rc) + return ERR_PTR(rc); + + devsec_tsm->mmio =3D no_free_ptr(mmio); + return tdevsec; +} + +static void tdx_tdi_mmio_teardown(struct tdx_devsec *tdevsec) +{ + struct pci_tsm_devsec *devsec_tsm =3D &tdevsec->pci; + + if (!devsec_tsm->mmio) + return; + + pci_tsm_mmio_teardown(devsec_tsm->mmio); + kfree(devsec_tsm->mmio); + devsec_tsm->mmio =3D NULL; +} +DEFINE_FREE(tdx_tdi_mmio_teardown, struct tdx_devsec *, + if (!IS_ERR_OR_NULL(_T)) tdx_tdi_mmio_teardown(_T)) + +static int tdx_tdi_mmio_accept(struct tdx_devsec *tdevsec) +{ + struct pci_dev *pdev =3D tdevsec->pci.base_tsm.pdev; + const struct pci_tsm_mmio *mmio; + u32 i; + + mmio =3D tdevsec->pci.mmio; + + for (i =3D 0; i < mmio->nr; i++) { + const struct pci_tsm_mmio_entry *entry =3D &mmio->mmio[i]; + u32 pages =3D resource_size(&entry->res) >> PAGE_SHIFT; + phys_addr_t gpa =3D entry->res.start; + int ret; + + pci_dbg(pdev, "accept MMIO entry %d %pR gpa=3D0x%llx\n", + entry->index, &entry->res, gpa); + + /* Accept the whole range */ + ret =3D tdx_mcall_mmio_accept(pci_dev_id(pdev), entry->index, 0, pages, = gpa); + if (ret) { + pci_err(pdev, "Failed to accept MMIO entry %d (gpa=3D0x%llx), ret=3D%d\= n", + entry->index, gpa, ret); + return ret; + } + } + + return 0; +} + static struct pci_tsm *tdx_devsec_lock(struct tsm_dev *tsm_dev, struct pci= _dev *pdev) { struct device_evidence_object *tsm_report; @@ -299,6 +360,8 @@ static void tdx_devsec_unlock(struct pci_tsm *tsm) if (WARN_ON(tdx_tdi_unbind_dev(tdevsec))) return; =20 + tdx_tdi_mmio_teardown(tdevsec); + kfree(evidence->obj[DEVICE_EVIDENCE_TYPE_REPORT].data); kfree(evidence); kfree(tdevsec); @@ -306,6 +369,18 @@ static void tdx_devsec_unlock(struct pci_tsm *tsm) =20 static int tdx_devsec_run(struct pci_dev *pdev) { + struct tdx_devsec *tdevsec =3D to_tdx_devsec(pdev->tsm); + int ret; + + struct tdx_devsec *tdevsec_mmio __free(tdx_tdi_mmio_teardown) =3D + tdx_tdi_mmio_setup(tdevsec); + if (IS_ERR(tdevsec_mmio)) + return PTR_ERR(tdevsec_mmio); + + ret =3D tdx_tdi_mmio_accept(tdevsec); + if (ret) + return ret; + return -EOPNOTSUPP; } =20 --=20 2.52.0 From nobody Thu Sep 24 13:41:52 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6AF983FE64A for ; Thu, 24 Sep 2026 04:11:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.14 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223112; cv=none; b=SSzOMou/ocqQYIFpGMd/owWjaCgfQ9HG1BpqYBi7d9Yv5/PrK8H1F4D34lw0iRXgEho9zMBjrkY0VH+NJ/sa7An2sB7Ams9UwwJYUil1PFIOUB8dJaGoR0VgZH2keGQLGq+ATS3pdkM3EcaTqwmsk4Bon/pkZihUbC1ml7rAVHI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223112; c=relaxed/simple; bh=pPKq92HbRkxKZZOuHzLkxeV2WmkDXvV4+1Sz1TqyCUM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EtaynBt3TU6Ne50IOzKkJzqp3JmV/NMwiR9L1CQnLelnX42VqMpW5t43ky/yxMEZWFqKmx5iIg/Sdex/z6gGLyAjrn7nxZfdHwCrO1RClyu5qEprtu0dnpyhbgsQXkutE9KBOGlgsvaPw79hyRT4ZDMfgk8Jymi4uI3mMNIkQ9M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=ei3ZvfAE; arc=none smtp.client-ip=192.198.163.14 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="ei3ZvfAE" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790223110; x=1821759110; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=pPKq92HbRkxKZZOuHzLkxeV2WmkDXvV4+1Sz1TqyCUM=; b=ei3ZvfAEgmIA0zot6atZdAIASt6nLg0v7fCwoSMRD8eu6zbIsJECcS6e LP5Ik6SlYpmxebWgnG3287lOFjvpMm23yRBJNXlrtx72aFdIPy26hSlpu +cHX6fUMXGnHvcT81FgP1HoCW0gEwFCijYTBTxOQJolr8Kyc+RKRBTH01 u2aIaiOXU+pER6unZWTSX08HboaPUVYBjwXDUJImX28+m3HNQ4rErfcOH wA9eY0ek3YucMikHn6fRsakARYQrOi9pnY6E6qWALQCEea1YI/yZN9URt awLKxkH33JZU3wDXeNFhbRq2x4oZG80QBL4QUlHYOHPQ+efa7FfXEYyqP A==; X-CSE-ConnectionGUID: PrjLtevUSHqu+V7ED69kHA== X-CSE-MsgGUID: QHGgjA/ST5OuObH6zWEalA== X-IronPort-AV: E=McAfee;i="6800,10657,11914"; a="91002556" X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="91002556" Received: from fmviesa011.fm.intel.com ([10.60.135.151]) by fmvoesa108.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:11:48 -0700 X-CSE-ConnectionGUID: Ueufu4a7SyW1k5Z+Xm56Kw== X-CSE-MsgGUID: 4vh1aFv3RV6UapMnkpgs5w== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="5009413" Received: from unknown (HELO gnr-sp-2s-612.sh.intel.com) ([10.112.229.148]) by smtpauth.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:11:37 -0700 From: Zhenzhong Duan To: 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: [RFC PATCH 11/15] x86/tdx: Add TDG.TDI.START module call wrapper for TDX Connect Date: Thu, 24 Sep 2026 12:10:28 +0800 Message-ID: <20260924041032.1096569-12-zhenzhong.duan@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260924041032.1096569-1-zhenzhong.duan@intel.com> References: <20260924041032.1096569-1-zhenzhong.duan@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add tdx_mcall_tdi_start() to signal that the TD is ready to start a TDI instance. After a successful module call, the TDX module authorizes the host to start the TDI with the TDH.TDI.START seamcall. Translate TDX module return codes into Linux errno values. Signed-off-by: Zhenzhong Duan --- arch/x86/coco/tdx/tdx_connect.c | 27 +++++++++++++++++++++++++++ arch/x86/include/asm/shared/tdx.h | 1 + arch/x86/include/asm/tdx.h | 1 + 3 files changed, 29 insertions(+) diff --git a/arch/x86/coco/tdx/tdx_connect.c b/arch/x86/coco/tdx/tdx_connec= t.c index 09a92fe23357..3ef10b1df401 100644 --- a/arch/x86/coco/tdx/tdx_connect.c +++ b/arch/x86/coco/tdx/tdx_connect.c @@ -109,3 +109,30 @@ int tdx_mcall_mmio_accept(u64 func_id, u64 index, u32 = pg_offset, u32 page_cnt, p return tdx_mcall_tdi_to_errno(ret); } EXPORT_SYMBOL_FOR_MODULES(tdx_mcall_mmio_accept, "tdx-guest"); + +/** + * tdx_mcall_tdi_start() - Authorize TDX module to start the TDI instance + * @func_id: Function identifier specifying the TDI instance + * @exp_bind_session: Expected bind session ID + * + * Signal TDX module that TD is ready to start TDI. Upon success, TDX modu= le + * allows host to initiate TDI via TDH.TDI.START seamcall. + * + * Return 0 on success, -ENXIO for invalid operands, -EBUSY for busy opera= tion, + * -ENODEV for TDI not present or invalid metadata, or -EIO on other TDCAL= L failures. + */ +int tdx_mcall_tdi_start(u64 func_id, u64 exp_bind_session) +{ + struct tdx_module_args args =3D { + .rcx =3D func_id, + .rdx =3D exp_bind_session, + }; + u64 ret; + + ret =3D __tdcall(TDG_TDI_START, &args); + if (!ret) + return 0; + + return tdx_mcall_tdi_to_errno(ret); +} +EXPORT_SYMBOL_FOR_MODULES(tdx_mcall_tdi_start, "tdx-guest"); diff --git a/arch/x86/include/asm/shared/tdx.h b/arch/x86/include/asm/share= d/tdx.h index ce80fb2116fb..72520f09ef3f 100644 --- a/arch/x86/include/asm/shared/tdx.h +++ b/arch/x86/include/asm/shared/tdx.h @@ -21,6 +21,7 @@ #define TDG_VM_RD 7 #define TDG_VM_WR 8 #define TDG_TDI_READ 67 +#define TDG_TDI_START 68 #define TDG_MMIO_ACCEPT 71 =20 /* TDX TD attributes */ diff --git a/arch/x86/include/asm/tdx.h b/arch/x86/include/asm/tdx.h index e6493f3bc0d1..787b3039ef5a 100644 --- a/arch/x86/include/asm/tdx.h +++ b/arch/x86/include/asm/tdx.h @@ -156,6 +156,7 @@ struct tdcm_rsp_check_teeio_supp { 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); int tdx_mcall_mmio_accept(u64 func_id, u64 index, u32 pg_offset, u32 page_= cnt, phys_addr_t gpa); +int tdx_mcall_tdi_start(u64 func_id, u64 exp_bind_session); #endif =20 void __init tdx_dump_attributes(u64 td_attr); --=20 2.52.0 From nobody Thu Sep 24 13:41:52 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9772A32A3D7 for ; Thu, 24 Sep 2026 04:11:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.14 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223110; cv=none; b=ceRdlHcDuKyem7D+69HNQQlOIG18iKeoSmT7376RxnoKGlO15FuYq35YnQdTbUZlbRxNrFJeZUXhb/XSXJzRyUsreIWdui0CNXVi2iqxTSS621BIcdmA6ZC76ZIK830dP7v98dfs7rbJSpJQoZRG83lAgthzIZpinK9Z5PlcARw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223110; c=relaxed/simple; bh=kL9skJ4gJ9Od7x1Y8ZIaXRKi3CJdApVxWMuLWYoxhaU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZQZEDbXTq0jlE48Ra3+7mySwXeuNc6io+P3qV1hvuCoAB2Ht2TrsZlrQDmP86qPNq+ug+gpQD8FkDpwKYGTTUYY4tCdAskdAbYqK4FzHmRYQP504oQUzaApy7nfCe4wG8HDKehfYmeXId3OBBElCzd34ldUA3Zx85rHQa8jBYo4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=Jd+9QBSe; arc=none smtp.client-ip=192.198.163.14 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="Jd+9QBSe" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790223109; x=1821759109; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=kL9skJ4gJ9Od7x1Y8ZIaXRKi3CJdApVxWMuLWYoxhaU=; b=Jd+9QBSey5hHfZx+xqCBD2SE/i0TJ1hk8vN7FdqK6CfbyuvO7hRwGRJk /Vs4NuBkQWG271hQyD9oDDGEh9fMzQ49nc258O1rgRWhoUf7i1gKHvt6j gWk2yauhdencOsJyl4J1tu92vV079DcrwjDh9Y79igjVFTYPjnwKVJ9cy srPztiJ0wsJY8AOkcOD5Qlk4qFRcsyDESx6dPUa8CbuCFbGd/dYwHLciW j8Iy9YaN2jvGPRqI0u7WkhGrAzTYa0b5lyDZKc2XwYpTe0abZP6jDT77+ 9/PVc9Jz1B0rpQl6ynT3ad3zdlU9xVYi1GTbKyvo43k7nQfqO3uU5wob6 w==; X-CSE-ConnectionGUID: KwFN1nPITdWzhEZmP2MfmA== X-CSE-MsgGUID: RXGwoFz6QKSQvUUGacLlhg== X-IronPort-AV: E=McAfee;i="6800,10657,11914"; a="91002565" X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="91002565" Received: from fmviesa011.fm.intel.com ([10.60.135.151]) by fmvoesa108.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:11:48 -0700 X-CSE-ConnectionGUID: IGlRE99KQuGb10f10ePVaQ== X-CSE-MsgGUID: ZM8bsu59TCeqgjHs9g3Gqg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="5009439" Received: from unknown (HELO gnr-sp-2s-612.sh.intel.com) ([10.112.229.148]) by smtpauth.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:11:43 -0700 From: Zhenzhong Duan To: 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: [RFC PATCH 12/15] virt: tdx-guest: Support Trust Device Interface (TDI) activation Date: Thu, 24 Sep 2026 12:10:29 +0800 Message-ID: <20260924041032.1096569-13-zhenzhong.duan@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260924041032.1096569-1-zhenzhong.duan@intel.com> References: <20260924041032.1096569-1-zhenzhong.duan@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Store the bind session ID obtained after binding the TDI which is used by TDG.TDI.START to verify same bind session established by host before activation. Add tdx_tdi_start_dev() to signal guest readiness to the TDX module and issue the TDCM_OP_START_TDI hypercall for the host to complete activation. The run callback accepts private MMIO ranges, starts the TDI, and verifies that it reaches TDI_STATE_RUN, finally notifies DMA sub-system device's ready to DMA to private memory. Note that private DMA is enabled separately during driver attach by accepting the default DMAR entry. Signed-off-by: Zhenzhong Duan --- drivers/virt/coco/tdx-guest/connect.c | 45 ++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/drivers/virt/coco/tdx-guest/connect.c b/drivers/virt/coco/tdx-= guest/connect.c index fe8d76ba6f81..a9d41fd38b64 100644 --- a/drivers/virt/coco/tdx-guest/connect.c +++ b/drivers/virt/coco/tdx-guest/connect.c @@ -130,6 +130,8 @@ DEFINE_FREE(tdx_tdcm_free, struct tdcm_ctx *, =20 struct tdx_devsec { struct pci_tsm_devsec pci; + + u64 bind_session_id; }; =20 static struct tdx_devsec *to_tdx_devsec(struct pci_tsm *tsm) @@ -202,6 +204,7 @@ enum tdi_state { =20 enum tdi_field_code { TDI_GET_TDISP_STATE =3D 2, + TDI_GET_BIND_SESSION_ID =3D 5, }; =20 static int tdx_tdi_read_state(struct tdx_devsec *tdevsec, u8 *state) @@ -302,10 +305,27 @@ static int tdx_tdi_mmio_accept(struct tdx_devsec *tde= vsec) return 0; } =20 +static int tdx_tdi_start_dev(struct tdx_devsec *tdevsec) +{ + struct pci_dev *pdev =3D tdevsec->pci.base_tsm.pdev; + int ret; + + ret =3D tdx_mcall_tdi_start(pci_dev_id(pdev), tdevsec->bind_session_id); + if (ret) + return ret; + + struct tdcm_ctx *tdcm __free(tdx_tdcm_free) =3D tdx_tdcm_alloc(pdev, TDCM= _OP_START_TDI, 0, 0); + if (IS_ERR(tdcm)) + return PTR_ERR(tdcm); + + return tdx_tdcm_run(tdcm); +} + static struct pci_tsm *tdx_devsec_lock(struct tsm_dev *tsm_dev, struct pci= _dev *pdev) { struct device_evidence_object *tsm_report; struct device_evidence *evidence; + u64 session_id; u32 report_sz; u8 state; int ret; @@ -325,6 +345,12 @@ static struct pci_tsm *tdx_devsec_lock(struct tsm_dev = *tsm_dev, struct pci_dev * if (IS_ERR(tdevsec_bind)) return ERR_CAST(tdevsec_bind); =20 + ret =3D tdx_mcall_tdi_read(pci_dev_id(pdev), TDI_GET_BIND_SESSION_ID, &se= ssion_id); + if (ret) + return ERR_PTR(ret); + + tdevsec->bind_session_id =3D session_id; + u8 *report __free(kfree) =3D tdx_tdi_get_report(tdevsec, &report_sz); if (IS_ERR(report)) return ERR_CAST(report); @@ -362,6 +388,7 @@ static void tdx_devsec_unlock(struct pci_tsm *tsm) =20 tdx_tdi_mmio_teardown(tdevsec); =20 + dma_set_cc_private(&tsm->pdev->dev, false); kfree(evidence->obj[DEVICE_EVIDENCE_TYPE_REPORT].data); kfree(evidence); kfree(tdevsec); @@ -370,6 +397,7 @@ static void tdx_devsec_unlock(struct pci_tsm *tsm) static int tdx_devsec_run(struct pci_dev *pdev) { struct tdx_devsec *tdevsec =3D to_tdx_devsec(pdev->tsm); + u8 state; int ret; =20 struct tdx_devsec *tdevsec_mmio __free(tdx_tdi_mmio_teardown) =3D @@ -381,7 +409,22 @@ static int tdx_devsec_run(struct pci_dev *pdev) if (ret) return ret; =20 - return -EOPNOTSUPP; + ret =3D tdx_tdi_start_dev(tdevsec); + if (ret) + return ret; + + ret =3D tdx_tdi_read_state(tdevsec, &state); + if (ret) + return ret; + + if (state !=3D TDI_STATE_RUN) { + pci_err(pdev, "TDI failed to reach RUN state, current state: 0x%x\n", st= ate); + return -EIO; + } + + dma_set_cc_private(&pdev->dev, true); + retain_and_null_ptr(tdevsec_mmio); + return 0; } =20 static struct pci_tsm_ops tdx_devsec_ops =3D { --=20 2.52.0 From nobody Thu Sep 24 13:41:52 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8D1173E5EDB for ; Thu, 24 Sep 2026 04:11:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.14 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223115; cv=none; b=nRMR+oVEqiHZuBRRKZ+pi/MiZ2ClGZkveXZF1MkNvrfGoZPpnoyVnqPP5IK5O6CuAQvdydACuwtLifGWHEJFRtdc1XbCuxWZRb0B/t/48VnJEj17T3RVVXAaYQareTuYoejeZlshKgRBm4SWsRs4uNYbxW219w/o9wVMU6+8jM0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223115; c=relaxed/simple; bh=XY+nQdyJ+KyuA8zd1GBySyql0bYa0v2fGuh6+8Hbmos=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=O0tC04CcT7zsFMhSzxsnMl3QOVTYA7MPHn3m+e6XLrOvWlrZzofrcFJziH5kRCVGTLKEPwBDp6ULazOhW3X8Mr9wkSO3UaFFPuNMISlLOOLlLixCF6q+YUiZHp1QX77yOU3N8GNQdh6wkCcUTDfB3hDCa8mZjw2BCvJ3vBUpUhw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=SiVkh65f; arc=none smtp.client-ip=192.198.163.14 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="SiVkh65f" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790223113; x=1821759113; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=XY+nQdyJ+KyuA8zd1GBySyql0bYa0v2fGuh6+8Hbmos=; b=SiVkh65faMP7VHUPozNpZZ2owX+ehEFc3PPpOKVrG84E7awybnbvsO39 6mSruXXBMg4hBZC6csrnPFHgE6Fb40Dgb6aiI4F0GQYcys5DGrLtjXgFY fAeL41Bz7p8EKel+/KcPvwsz017r0F0KLhdODcq2Q5r6Jhoo4r0EgEi2p R4AICfKnELBWK/9QTSTyTh5PZZzJ/6JpA+BkWRRZvbEQMGesVvet0Z3A+ /0H4BDirHJDq0Db7z0jnASWPKT99EWusHqTMNBVVSG6AVVRZBSSqB9N21 MPNQqu6jVYW6d/q34+1/5O7CDNP7BnwZ0W97ZgDF0k7LX9k44yLYsc5YQ A==; X-CSE-ConnectionGUID: uSXqESD8S3ejxfBrQpsLxg== X-CSE-MsgGUID: m3iOHgLhSISCnd600P58Zw== X-IronPort-AV: E=McAfee;i="6800,10657,11914"; a="91002569" X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="91002569" Received: from fmviesa011.fm.intel.com ([10.60.135.151]) by fmvoesa108.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:11:52 -0700 X-CSE-ConnectionGUID: 4JCttB7tR8+Y1s1ofoKjKA== X-CSE-MsgGUID: Gx7bc6xfQ9CmJonBLlat0g== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="5009482" Received: from unknown (HELO gnr-sp-2s-612.sh.intel.com) ([10.112.229.148]) by smtpauth.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:11:48 -0700 From: Zhenzhong Duan To: 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: [RFC PATCH 13/15] x86/tdx: Add __tdcall_saved() helper Date: Thu, 24 Sep 2026 12:10:30 +0800 Message-ID: <20260924041032.1096569-14-zhenzhong.duan@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260924041032.1096569-1-zhenzhong.duan@intel.com> References: <20260924041032.1096569-1-zhenzhong.duan@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The TDX Connect ABI defines TDCALL leaves that use registers up to r15 in struct tdx_module_args as input, without returning output arguments. Add __tdcall_saved() for these leaves. Signed-off-by: Zhenzhong Duan --- arch/x86/coco/tdx/tdcall.S | 17 +++++++++++++++++ arch/x86/include/asm/shared/tdx.h | 1 + 2 files changed, 18 insertions(+) diff --git a/arch/x86/coco/tdx/tdcall.S b/arch/x86/coco/tdx/tdcall.S index 52d9786da308..1dca01909dee 100644 --- a/arch/x86/coco/tdx/tdcall.S +++ b/arch/x86/coco/tdx/tdcall.S @@ -44,6 +44,23 @@ SYM_FUNC_START(__tdcall_ret) TDX_MODULE_CALL host=3D0 ret=3D1 SYM_FUNC_END(__tdcall_ret) =20 +/* + * __tdcall_saved() - Used by TDX guests to request services from the TDX + * module (does not include VMM services) using TDCALL instruction. + * + * __tdcall_saved() function ABI: + * + * @fn (RDI) - TDCALL Leaf ID, moved to RAX + * @args (RSI) - struct tdx_module_args for input + * + * All registers in @args are used as input registers. + * + * Return status of TDCALL via RAX. + */ +SYM_FUNC_START(__tdcall_saved) + TDX_MODULE_CALL host=3D0 saved=3D1 +SYM_FUNC_END(__tdcall_saved) + /* * __tdcall_saved_ret() - Used by TDX guests to request services from the * TDX module (including VMM services) using TDCALL instruction, with diff --git a/arch/x86/include/asm/shared/tdx.h b/arch/x86/include/asm/share= d/tdx.h index 72520f09ef3f..90f2842f4253 100644 --- a/arch/x86/include/asm/shared/tdx.h +++ b/arch/x86/include/asm/shared/tdx.h @@ -153,6 +153,7 @@ struct tdx_module_args { /* Used to communicate with the TDX module */ u64 __tdcall(u64 fn, struct tdx_module_args *args); u64 __tdcall_ret(u64 fn, struct tdx_module_args *args); +u64 __tdcall_saved(u64 fn, struct tdx_module_args *args); u64 __tdcall_saved_ret(u64 fn, struct tdx_module_args *args); =20 /* Used to request services from the VMM */ --=20 2.52.0 From nobody Thu Sep 24 13:41:52 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B9D1C381E92 for ; Thu, 24 Sep 2026 04:11:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.14 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223119; cv=none; b=X7P6hC8yaXJZdITRhY8GN6Azn9zmu3Q5CNEsw7ACO5lIMT9zmsLIlmT2QUlj/QGx+jW9DOJTAFwNjj1Y0uhkazBX+Cz6wel/OOVAxiieDdqwWujhlsHa/dpID6Un+XAht5XulFcK9//pRck6KLZ1oRsEWQOVjlBvKerER3rkIPw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223119; c=relaxed/simple; bh=KxGOgO/oHuKBzXRk20V8hJ+nLCjV1WKJz0A4Gosb6W4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZEY1RN3/FeBnLIAxbcfX9rq0Qb18dBreprDNpJboksXlp+oJGMFsMS+tWSQF7GoCak+0Zq1f7IVZJkhO/3XztUrVbazSHpyV13DcmUOA/UFUl7/+/FSgvw3vftUFDjjR6rJK6sa5nATg0FmZ+c87kfQzJsIlPqIeuihn8m1bCfg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=LYeAbULP; arc=none smtp.client-ip=192.198.163.14 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="LYeAbULP" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790223118; x=1821759118; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=KxGOgO/oHuKBzXRk20V8hJ+nLCjV1WKJz0A4Gosb6W4=; b=LYeAbULPYONfuLs+GSanCALrQOYkrCe7r/Aiec/wxNPfpawBf3TUCY9n IATxMhp8I6GvpRLtHnq8dnh1MFVAehFFYv9Mfz7280amQJgRaZ1Mnr56v uQxEAKhvkiRDZxj9agc4un+CYNqCUtBfwPvb9UqUH+dV+wRYXViC1krNj IR1OzgJwt/g0t9Rh7KftJ9LgxKRCcHtFScZYwZ9x8n73QOPi2g3JvfOJC YlDFIDBfNYOXhnulb8CtVQEz+BX8bpCrPKnkgm2JFBhfGcKyxF0raDNnu GmWVvwxHNIyfDC4zafL6GXwiVj9PHEwTLgamC6DHHC50U5170Kme7TnT4 w==; X-CSE-ConnectionGUID: syeIaNB2T9awodI2hWCZgg== X-CSE-MsgGUID: Bl4vjq7IQFqiSScmjtjr/g== X-IronPort-AV: E=McAfee;i="6800,10657,11914"; a="91002581" X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="91002581" Received: from fmviesa011.fm.intel.com ([10.60.135.151]) by fmvoesa108.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:11:57 -0700 X-CSE-ConnectionGUID: SJ7MdlvOSkCH8/zje2YpIQ== X-CSE-MsgGUID: NGj2BS5pS9afVwhmjQdi7A== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="5009495" Received: from unknown (HELO gnr-sp-2s-612.sh.intel.com) ([10.112.229.148]) by smtpauth.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:11:53 -0700 From: Zhenzhong Duan To: 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: [RFC PATCH 14/15] x86/tdx: Add TDG.DMAR.ACCEPT module call wrapper for TDX Connect Date: Thu, 24 Sep 2026 12:10:31 +0800 Message-ID: <20260924041032.1096569-15-zhenzhong.duan@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260924041032.1096569-1-zhenzhong.duan@intel.com> References: <20260924041032.1096569-1-zhenzhong.duan@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" TDG.DMAR.ACCEPT updates the PASID table entry of the TDI as present to allow DMA access to the TD private memory. For TDG.DMAR.ACCEPT, the R8-R15 input registers are reserved and must be zero. Use a zero-initialized argument structure with __tdcall_saved() so the complete TDCALL input register set is loaded with the required values. Translate TDX module return codes into Linux errno values. Signed-off-by: Zhenzhong Duan --- arch/x86/coco/tdx/tdx_connect.c | 28 ++++++++++++++++++++++++++++ arch/x86/include/asm/shared/tdx.h | 1 + arch/x86/include/asm/tdx.h | 1 + 3 files changed, 30 insertions(+) diff --git a/arch/x86/coco/tdx/tdx_connect.c b/arch/x86/coco/tdx/tdx_connec= t.c index 3ef10b1df401..a03b1da9a52a 100644 --- a/arch/x86/coco/tdx/tdx_connect.c +++ b/arch/x86/coco/tdx/tdx_connect.c @@ -136,3 +136,31 @@ int tdx_mcall_tdi_start(u64 func_id, u64 exp_bind_sess= ion) return tdx_mcall_tdi_to_errno(ret); } EXPORT_SYMBOL_FOR_MODULES(tdx_mcall_tdi_start, "tdx-guest"); + +/** + * tdx_mcall_dmar_accept() - Accept PASID table entry of a TDI instance + * @func_id: Function identifier specifying the TDI instance + * @target: DMAR target, 0 for non-partitioned TD or L1, 1-3 for L2 VM1-VM= 3, + * other value reserved + * + * Update the PASID table entry of the TDI to mark the DMA Remapping (DMAR) + * state as present, allowing DMA access to the TD private memory. + * + * Return 0 on success, -ENXIO for invalid operands, -EBUSY for busy opera= tion, + * -ENODEV for TDI not present or invalid metadata, or -EIO on other TDCAL= L failures. + */ +int tdx_mcall_dmar_accept(u64 func_id, u64 target) +{ + struct tdx_module_args args =3D { + .rcx =3D func_id, + .rdx =3D target, + }; + u64 ret; + + ret =3D __tdcall_saved(TDG_DMAR_ACCEPT, &args); + if (!ret) + return 0; + + return tdx_mcall_tdi_to_errno(ret); +} +EXPORT_SYMBOL_FOR_MODULES(tdx_mcall_dmar_accept, "tdx-guest"); diff --git a/arch/x86/include/asm/shared/tdx.h b/arch/x86/include/asm/share= d/tdx.h index 90f2842f4253..01387f6b24b3 100644 --- a/arch/x86/include/asm/shared/tdx.h +++ b/arch/x86/include/asm/shared/tdx.h @@ -22,6 +22,7 @@ #define TDG_VM_WR 8 #define TDG_TDI_READ 67 #define TDG_TDI_START 68 +#define TDG_DMAR_ACCEPT 70 #define TDG_MMIO_ACCEPT 71 =20 /* TDX TD attributes */ diff --git a/arch/x86/include/asm/tdx.h b/arch/x86/include/asm/tdx.h index 787b3039ef5a..118cc58cc909 100644 --- a/arch/x86/include/asm/tdx.h +++ b/arch/x86/include/asm/tdx.h @@ -157,6 +157,7 @@ u64 tdx_hcall_tdcm(u16 devid, void *buf, size_t size, u= 8 vector); int tdx_mcall_tdi_read(u64 func_id, u64 field, u64 *value); int tdx_mcall_mmio_accept(u64 func_id, u64 index, u32 pg_offset, u32 page_= cnt, phys_addr_t gpa); int tdx_mcall_tdi_start(u64 func_id, u64 exp_bind_session); +int tdx_mcall_dmar_accept(u64 func_id, u64 target); #endif =20 void __init tdx_dump_attributes(u64 td_attr); --=20 2.52.0 From nobody Thu Sep 24 13:41:52 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D8CFC4137AE for ; Thu, 24 Sep 2026 04:12:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.14 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223124; cv=none; b=dGXYT2xOMO5g/ogGM5QoMP4A6Bq2IrYduXuMScZ+XnmMPKgS0Er8VFn0SrzNEB6MjWWpHBYhp8odyHklsSYmS3M+6v0iQPQvFYK8/Ya7yb308Z9xrbrISGWePFLVSJ09Gjpvv+N5+u/uWp5C1tQ4xsSj87e0MTEF+ferG3r0Seo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790223124; c=relaxed/simple; bh=ECLhm6sCglNuE+1p5FlpbPxobLSh1HSDPmI9OUlXDOs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JCQlGn4URLCwzbahWITxUM4W0s6c8u7RcWYs815bB6UXCQoYowxsJ71suuTpUBZgAvr2Y0oZ8rIXriZtayPDwHjFZpi7FTKZWdlFRVJWXaV+DN90FzueaLnn/O5PdQrcTF3l+5RjMm5eAjLVQg00nFkB0mdsFsuR2iUxHze7ul4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=SyKzNg7I; arc=none smtp.client-ip=192.198.163.14 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="SyKzNg7I" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790223123; x=1821759123; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=ECLhm6sCglNuE+1p5FlpbPxobLSh1HSDPmI9OUlXDOs=; b=SyKzNg7IEWGLemyaitfPV6bm6jnn6cyKyt8y+JRdpjozZnL5/Jr47PHo TEzCbNYU68ZF1ncEHNKgWOhWomOL6kBq7xsoobLKjzREV3Fye7mJNzVNO 7A96Ai3QBubwHFcFBHjCFxBjWern3HTWHR0FpBbR5NOBjE3uIPOFYeaz6 EBerHIlwpijcf0wSByWpa20nULrO6Wosto9zjLRJEjL3tZ1xPTGvXrBLr nbjddKTXFZTVi7Xwd/gaugUkZ/F1azJBH/a48Ee+l5XzYNQkLU+PNiQsR 7XGetsKWMgAdWN7j3cUjQ0PZqryyrMWpPGkYqOlrJwtei4FuMaptVNE5p w==; X-CSE-ConnectionGUID: P/kCQNBpQ264x45w46N7Lw== X-CSE-MsgGUID: iNm6nEpeTfyf1f0Bpp0dow== X-IronPort-AV: E=McAfee;i="6800,10657,11914"; a="91002593" X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="91002593" Received: from fmviesa011.fm.intel.com ([10.60.135.151]) by fmvoesa108.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:12:03 -0700 X-CSE-ConnectionGUID: C7tfZNhqRr2dhGOChfEyRw== X-CSE-MsgGUID: 2gp6Kz6/Qvq4Apghrw9sTg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,119,1787036400"; d="scan'208";a="5009503" Received: from unknown (HELO gnr-sp-2s-612.sh.intel.com) ([10.112.229.148]) by smtpauth.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2026 21:11:58 -0700 From: Zhenzhong Duan To: 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: [RFC PATCH 15/15] virt: tdx-guest: Accept default DMAR entry during PCI driver attach Date: Thu, 24 Sep 2026 12:10:32 +0800 Message-ID: <20260924041032.1096569-16-zhenzhong.duan@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260924041032.1096569-1-zhenzhong.duan@intel.com> References: <20260924041032.1096569-1-zhenzhong.duan@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Before a TDI can perform DMA to guest private memory, its secure DMA mapping must be accepted. This happens during driver load stage after MMIO acceptance and TDI activation. The enable_dma callback issues TDG.DMAR.ACCEPT to set secure PASID table entry to present state and target non-partitioned TD. The secure PASID table entry is cleared in unlock stage implicitly so disable_dma is a no-op currently. Signed-off-by: Zhenzhong Duan --- drivers/virt/coco/tdx-guest/connect.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/drivers/virt/coco/tdx-guest/connect.c b/drivers/virt/coco/tdx-= guest/connect.c index a9d41fd38b64..b328caac0a49 100644 --- a/drivers/virt/coco/tdx-guest/connect.c +++ b/drivers/virt/coco/tdx-guest/connect.c @@ -427,10 +427,26 @@ static int tdx_devsec_run(struct pci_dev *pdev) return 0; } =20 +static int tdx_devsec_enable_dma(struct pci_dev *pdev) +{ + int ret =3D tdx_mcall_dmar_accept(pci_dev_id(pdev), 0); + + if (ret) + pci_err(pdev, "Failed to accept DMAR, ret=3D%d\n", ret); + + return ret; +} + +static void tdx_devsec_disable_dma(struct pci_dev *pdev) +{ +} + static struct pci_tsm_ops tdx_devsec_ops =3D { .lock =3D tdx_devsec_lock, .unlock =3D tdx_devsec_unlock, .run =3D tdx_devsec_run, + .enable_dma =3D tdx_devsec_enable_dma, + .disable_dma =3D tdx_devsec_disable_dma, }; =20 static void devsec_tsm_remove(void *tsm_dev) --=20 2.52.0