From nobody Sun Feb 8 04:34:15 2026 Received: from mail-pj1-f43.google.com (mail-pj1-f43.google.com [209.85.216.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9F519209F22 for ; Fri, 10 Jan 2025 13:08:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736514503; cv=none; b=d7+4liWN58MZGBLe9CmwTGeHw24Xu+RNdFyAPtPxSBQjG6HiFjjggKhS4IX4qIuIUSZpqplspO4yMq+cFMocql3bSJB52Yjkv2h+24lsxfK93BYvDrpAAk8o9CHW3LiNfUQ8ph2aPbRL/0mi6XZ56hUReksrTg6IBx/olpMkCF0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736514503; c=relaxed/simple; bh=JsrZeCaQVws/kN74M+/NHZMiMZ6c+wWQ4TuRJScgEVY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HKeAQLNYraVCiCCbcNP4VMrbHicO8ift7JBNXII7LzMM5OdI3vAeT4GhbHtwyaQxre1pK2a6o3AchalN+LSwEqPbDshfP3QSn8svoE3MbNFewPveT9uClHFf0a489vkvoyRrgmAAbRb9jAwdKq+QMt5ez1VK1kgyCTGHJVARh20= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=bm49wvOC; arc=none smtp.client-ip=209.85.216.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="bm49wvOC" Received: by mail-pj1-f43.google.com with SMTP id 98e67ed59e1d1-2f43da61ba9so2720371a91.2 for ; Fri, 10 Jan 2025 05:08:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1736514501; x=1737119301; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=bgih/EBtfLFxrdcl1A6l0hBJazS5MO7S7hSeQH4Z6XE=; b=bm49wvOCKfNmTPN+tTcVSBy/HraV7O2CSlI5e1DyGP2Rr4h+VyFihXBk7dkViKYWTe /dan7GYESzpTzjGc/GLg0ycRWjawsovssJYcF8dOPUzYU5qt2OKcGFsOST/FPGVbXEjJ s/zey7mXV5+Yim6QBjeLKz5dgQkBoEiXHpUyIsMBax3qL2nu3PTdvpfOylV5kT6cxzbP EZb7aa4j06SJj3pP0+Qot+hAbayVFDjQvgPJSJp0R0VqBcFOV0yI/3MZCcaaff/vYBsC 3VjQ0igSi/Fm/uwrh2/DvtTymjH2KLsTKlNIFUwXUlPfcjmu3gIKs5Q57GWD3inrGyK5 yAFg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736514501; x=1737119301; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=bgih/EBtfLFxrdcl1A6l0hBJazS5MO7S7hSeQH4Z6XE=; b=fUhBn97XTn3eoZZ57t2A0oMoUZhxrZJPEv1M3V5ZECqJ1UhhPVICOcgjsYnLw0Ppin e8wq/XGnuAp3aDo4X+YPUHAocjrqRi+xRA5NnlYP+3cflKVgBubofhBOmulsqZmgd0KB hsNSaXWI+DdbGwJqOv0hj0L1qUxhfVUd7nvY1EPAIEgpn07l11osY1JkCstnvW/wQEGo AKfKDNCxv7jocOYqnrTkkPlKEC2dasVwWri5lZDdm2bz1IH8D02Ft+IHaBnDqrEMp5/O UgFSGxKPm16JtH5S+Ll8bTVUIfG7aoJsJciAjP/LUVYFlkpfW2lUOvtxviKbOzSGOkUT HR6Q== X-Forwarded-Encrypted: i=1; AJvYcCW4dOXHMH0rzLv+2XKSc6Bq2I+o2M7fWA/LVIiCObBHuhloB55d1uXGXMQdR5XZQNnIz3IzaFf/ba8q/F8=@vger.kernel.org X-Gm-Message-State: AOJu0Yys/rEuBNW5ctoX75dAmrl/7qp8J8tZoCcc9ZmfL39CIQ102xp5 ziy0mLOgR6xci9CK60pV5TlmnwO4E3Jr351brfwj7s4ln8SUgNz7 X-Gm-Gg: ASbGnctpp1l9cbD1YP2LBUwOzLUqOf8EL2JZXp0oXFdFIFycfe4FnKfXIudxL13trmx BXbnD+No1/xTojEx1sNT3txN/aEW+3VCOpJln8gLg98eunrAvdfpVsF4f3AEyOeuoRQB0ec286h wQA54p5wcl3r6T9TnIOPUhfALqpwilvpgdXtBbKzL8pBLmoU50OZSCIjlPfX6cWwzSXzg/YvKS4 UHFEIDbYshLXjseQ4p1Pg5riM7/N4ChcBYuu2hXgQcK3dSATizmn6jWe26AbUSd0h6U7dI= X-Google-Smtp-Source: AGHT+IFkr+n8d73G3zWz2Bg14lU+1QRZhpo2LfDVF0mrFi/lS/dIhRADbnJh3ATz66EUei6eRNSvIg== X-Received: by 2002:a17:90b:2c84:b0:2ee:8430:b831 with SMTP id 98e67ed59e1d1-2f548f1628fmr16429682a91.2.1736514500972; Fri, 10 Jan 2025 05:08:20 -0800 (PST) Received: from tiger.hygon.cn ([112.64.138.194]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f5593fead5sm3209069a91.11.2025.01.10.05.08.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 10 Jan 2025 05:08:20 -0800 (PST) From: Wencheng Yang To: Cc: Wencheng Yang , Joerg Roedel , Suravee Suthikulpanit , Will Deacon , Robin Murphy , iommu@lists.linux.dev, linux-kernel@vger.kernel.org Subject: [PATCH] drviers/iommu/amd: support P2P access through IOMMU when SME is enabled Date: Fri, 10 Jan 2025 21:07:25 +0800 Message-ID: <20250110130756.333265-1-east.moutain.yang@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: 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" When SME is enabled, SME bit is set in IOMMU page table pte entry, it works fine if the pfn of the pte entry is memory. However, if the pfn is MMIO address, for example, map other device's mmio space to its io page table, in such situation, setting SME bit in pte would cause P2P failure. Clear SME bit in io page table if the mapping is MMIO rather than memory. Signed-off-by: Wencheng Yang --- drivers/iommu/amd/amd_iommu_types.h | 7 ++++--- drivers/iommu/amd/io_pgtable.c | 2 ++ drivers/iommu/amd/io_pgtable_v2.c | 4 +++- drivers/iommu/amd/iommu.c | 2 ++ 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_io= mmu_types.h index fdb0357e0bb9..b0f055200cf3 100644 --- a/drivers/iommu/amd/amd_iommu_types.h +++ b/drivers/iommu/amd/amd_iommu_types.h @@ -434,9 +434,10 @@ #define IOMMU_PTE_PAGE(pte) (iommu_phys_to_virt((pte) & IOMMU_PAGE_MASK)) #define IOMMU_PTE_MODE(pte) (((pte) >> 9) & 0x07) =20 -#define IOMMU_PROT_MASK 0x03 -#define IOMMU_PROT_IR 0x01 -#define IOMMU_PROT_IW 0x02 +#define IOMMU_PROT_MASK 0x07 +#define IOMMU_PROT_IR 0x01 +#define IOMMU_PROT_IW 0x02 +#define IOMMU_PROT_MMIO 0x04 =20 #define IOMMU_UNITY_MAP_FLAG_EXCL_RANGE (1 << 2) =20 diff --git a/drivers/iommu/amd/io_pgtable.c b/drivers/iommu/amd/io_pgtable.c index f3399087859f..204f497f0b88 100644 --- a/drivers/iommu/amd/io_pgtable.c +++ b/drivers/iommu/amd/io_pgtable.c @@ -373,6 +373,8 @@ static int iommu_v1_map_pages(struct io_pgtable_ops *op= s, unsigned long iova, __pte |=3D IOMMU_PTE_IR; if (prot & IOMMU_PROT_IW) __pte |=3D IOMMU_PTE_IW; + if (prot & IOMMU_PROT_MMIO) + __pte |=3D __sme_clr(__pte); =20 for (i =3D 0; i < count; ++i) pte[i] =3D __pte; diff --git a/drivers/iommu/amd/io_pgtable_v2.c b/drivers/iommu/amd/io_pgtab= le_v2.c index c616de2c5926..a03db2d2390e 100644 --- a/drivers/iommu/amd/io_pgtable_v2.c +++ b/drivers/iommu/amd/io_pgtable_v2.c @@ -65,7 +65,9 @@ static u64 set_pte_attr(u64 paddr, u64 pg_size, int prot) { u64 pte; =20 - pte =3D __sme_set(paddr & PM_ADDR_MASK); + if (!(prot & IOMMU_PROT_MMIO)) + pte =3D __sme_set(paddr & PM_ADDR_MASK); + pte |=3D IOMMU_PAGE_PRESENT | IOMMU_PAGE_USER; pte |=3D IOMMU_PAGE_ACCESS | IOMMU_PAGE_DIRTY; =20 diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c index 16f40b8000d7..9194ad681504 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -2578,6 +2578,8 @@ static int amd_iommu_map_pages(struct iommu_domain *d= om, unsigned long iova, prot |=3D IOMMU_PROT_IR; if (iommu_prot & IOMMU_WRITE) prot |=3D IOMMU_PROT_IW; + if (iommu_prot & IOMMU_MMIO) + prot |=3D IOMMU_PROT_MMIO; =20 if (ops->map_pages) { ret =3D ops->map_pages(ops, iova, paddr, pgsize, --=20 2.43.0