mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: michal.camacho.romero@linux.intel.com
To: Baolu Lu <baolu.lu@linux.intel.com>,
	Ning Sun <ning.sun@intel.com>, Thomas Gleixner <tglx@kernel.org>
Cc: Michal Camacho Romero <michal.camacho.romero@intel.com>,
	x86@kernel.org, iommu@lists.linux.dev,
	tboot-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org,
	Mateusz Mowka <mateusz.mowka@intel.com>,
	Adam Pawlicki <adamx.pawlicki@intel.com>,
	Pawel Randzio <pawel.randzio@intel.com>,
	Michal Camacho Romero <michal.camacho.romero@linux.intel.com>
Subject: [PATCH v4 2/2] iommu/vt-d: Disable PMRs and skip force-IOMMU when TXT TPRs are active
Date: Thu,  1 Oct 2026 14:12:29 +0200	[thread overview]
Message-ID: <20261001121229.1486711-1-michal.camacho.romero@linux.intel.com> (raw)
In-Reply-To: <c88f7c82-1b48-4ab2-95d6-73f920879f76@linux.intel.com>

From: Michal Camacho Romero <michal.camacho.romero@linux.intel.com>

When Intel TXT Protection Regions (TPRs) are present in the DTPR table,
hardware-level DMA protection is already enforced by the SINIT ACM.
In this case:

- Skip forcing IOMMU enablement in tboot_force_iommu(), since TPRs
  already provide DMA protection.
- Tear down PMRs during intel_iommu_init() when TPRs are active,
  while PMRs are redundant with TPR-based protection.
- Call tboot_disable_tprs() from parse_dmar_table() to disable
  TPR regions early, allowing the kernel to manage DMA protection
  prior to the OS boot.

Link: https://uefi.org/sites/default/files/resources/633933_Intel_TXT_DMA_Protection_Ranges_rev_0p73.pdf
Link: https://cdrdv2-public.intel.com/315168/315168_TXT_MLE_DG_rev_017_7.pdf
Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>
Signed-off-by: Michal Camacho Romero <michal.camacho.romero@linux.intel.com>
---
Thanks for the careful review. Summary of how each point is handled:

Answer for Question No.1:
   The DTPR handling is now invoked only after dmar_walk_dmar_table()
   returns success. If DMAR parsing fails, parse_dmar_table() returns the error
   and IOMMU initialization aborts before any TPR teardown, so the TPRs stay
   active and DMA protection is retained. They are disabled only, if DMAR parse
   succeeds.

Answer for Question No.2:
   I've replaced tboot_parse_dtpr_table function with the tboot_disable_tprs(),
   which is defined in the Kernel patch
   "[PATCH v5 1/2] x86/tboot: Add support for parsing DTPR table and disabling TPRs".
   It is void type function. It verifies now, both if the DTPR Table is
   present and if TXT Heap exists. If not then function prints a proper warning
   message and returns.

The rest of your suggestions (including the stale txt_heap = NULL cleanup) have
been applied in the current patch version.

Regards,
Michal Camacho Romero

 drivers/iommu/intel/dmar.c  | 18 ++++++++++++++++--
 drivers/iommu/intel/iommu.c |  9 ++++++++-
 2 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/drivers/iommu/intel/dmar.c b/drivers/iommu/intel/dmar.c
index ba675b08cd20..e8ec2dfe3e33 100644
--- a/drivers/iommu/intel/dmar.c
+++ b/drivers/iommu/intel/dmar.c
@@ -672,8 +672,22 @@ parse_dmar_table(void)
 
 	pr_info("Host address width %d\n", dmar->width + 1);
 	ret = dmar_walk_dmar_table(dmar, &cb);
-	if (ret == 0 && drhd_count == 0)
-		pr_warn(FW_BUG "No DRHD structure found in DMAR table\n");
+	if (ret == 0) {
+		/* After DMAR Table successful parsing disable TPRs if necessary */
+		void __iomem           *txt_heap;
+		struct acpi_table_dtpr *dtpr = tboot_get_dtpr_table(&txt_heap);
+
+		if (dtpr) {
+			/*
+			 * TPRs are enabled. This will also tell not to establish IOMMU
+			 * PMRs. It is necessary to parse DTPR Table and disable active TPRs.
+			 */
+			tboot_disable_tprs(dtpr, &txt_heap);
+		}
+
+		if (drhd_count == 0)
+			pr_warn(FW_BUG "No DRHD structure found in DMAR table\n");
+	}
 
 	return ret;
 }
diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
index 2e3b3ab216f8..ce40b1bf0296 100644
--- a/drivers/iommu/intel/iommu.c
+++ b/drivers/iommu/intel/iommu.c
@@ -2563,6 +2563,13 @@ static __init void tboot_force_iommu(void)
 	if (!tboot_enabled() || intel_iommu_tboot_noforce)
 		return;
 
+	/*
+	 * If TPR is enabled we don't need to force IOMMU, TPR set by SINIT
+	 * ACM will take care of DMA protection.
+	 */
+	if (tboot_is_tpr_enabled())
+		return;
+
 	if (!dmar_can_force_on(DMAR_FORCEON_TBOOT))
 		panic("tboot: Failed to force IOMMU on\n");
 
@@ -2623,7 +2630,7 @@ int __init intel_iommu_init(void)
 		 * calling SENTER, but the kernel is expected to reset/tear
 		 * down the PMRs.
 		 */
-		if (intel_iommu_tboot_noforce) {
+		if (intel_iommu_tboot_noforce || tboot_is_tpr_enabled()) {
 			for_each_iommu(iommu, drhd)
 				iommu_disable_protect_mem_regions(iommu);
 		}
-- 
2.55.0


  reply	other threads:[~2026-10-01 12:12 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-03 11:44 [PATCH v1 0/2] x86/tboot: Add Intel TXT Protection Regions (TPR) support Michal Camacho Romero
2026-06-03 11:44 ` [PATCH v1 1/2] x86/tboot: Add support for parsing DTPR table and disabling TPRs Michal Camacho Romero
2026-09-14 13:19   ` [PATCH v2 " Michal Camacho Romero
2026-09-15 23:23     ` Sun, Ning
2026-09-17  9:41       ` [PATCH 1/1] " Michal Camacho Romero
2026-09-18  6:45         ` kernel test robot
2026-09-18  7:35         ` kernel test robot
2026-09-17  9:43       ` [PATCH v3 1/2] " Michal Camacho Romero
2026-09-22 10:00         ` [PATCH v4 " michal.camacho.romero
2026-09-23 22:21           ` Sun, Ning
2026-09-30 12:30             ` [PATCH v5 " Michal Camacho Romero
2026-10-05 18:37               ` Sun, Ning
2026-10-12  9:35                 ` [PATCH v6 " Michal Camacho Romero
2026-10-27 16:13                   ` Sun, Ning
2026-10-29 13:40                     ` [PATCH v7 " Michal Camacho Romero
2026-10-30 11:18                       ` [PATCH v8 " Michal Camacho Romero
2026-10-30 14:32                         ` [PATCH v9] " Michal Camacho Romero
2026-06-03 11:45 ` [PATCH v1 2/2] iommu/vt-d: Disable PMRs and skip force-IOMMU when TXT TPRs are active Michal Camacho Romero
2026-06-11  8:49   ` Baolu Lu
2026-08-07  9:16   ` [PATCH v2 " Michal Camacho Romero
2026-08-07 10:14   ` Michal Camacho Romero
2026-08-20  3:28     ` Baolu Lu
2026-09-03  9:33       ` [PATCH v3 " Michal Camacho Romero
2026-09-04  2:19         ` Baolu Lu
2026-10-01 12:12           ` michal.camacho.romero [this message]
2026-10-07  7:11             ` [PATCH v4 " Baolu Lu
2026-10-12 10:22               ` [PATCH v5 " Michal Camacho Romero
2026-10-19  1:30                 ` Baolu Lu
2026-10-29 13:41                   ` [PATCH v7 2/2] iommu/vt-d: Disable TXT TPRs before enabling queued invalidation Michal Camacho Romero
2026-10-30 11:20                     ` [PATCH v8 " Michal Camacho Romero

Reply instructions:

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

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

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

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

  git send-email \
    --in-reply-to=20261001121229.1486711-1-michal.camacho.romero@linux.intel.com \
    --to=michal.camacho.romero@linux.intel.com \
    --cc=adamx.pawlicki@intel.com \
    --cc=baolu.lu@linux.intel.com \
    --cc=iommu@lists.linux.dev \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mateusz.mowka@intel.com \
    --cc=michal.camacho.romero@intel.com \
    --cc=ning.sun@intel.com \
    --cc=pawel.randzio@intel.com \
    --cc=tboot-devel@lists.sourceforge.net \
    --cc=tglx@kernel.org \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

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

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

all inboxes | Powered by JetHome®