From: Joerg Roedel <joro@8bytes.org>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Will Deacon <will@kernel.org>,
linux-kernel@vger.kernel.org, iommu@lists.linux.dev
Subject: [git pull] IOMMU Updates for Linux v6.4
Date: Sun, 30 Apr 2023 13:13:11 +0200 [thread overview]
Message-ID: <ZE5NR5Ml8I2/Ze0f@8bytes.org> (raw)
[-- Attachment #1: Type: text/plain, Size: 17919 bytes --]
Hi Linus,
this pull-request is somewhat messier than usual because it has a lot of
conflicts with your tree. I resolved them in a test-merge and sorted it out
for you to compare your solution to mine (mine is also mostly similar to
the one in linux-next).
My resolution is attached and also available as a branch here:
git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git pull-test
The resolution branch is compile-tested on x86-64 with defconfig and
allmodconfig, both passed.
With that being said:
The following changes since commit 09a9639e56c01c7a00d6c0ca63f4c7c41abe075d:
Linux 6.3-rc6 (2023-04-09 11:15:57 -0700)
are available in the Git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git tags/iommu-updates-v6.4
for you to fetch changes up to e51b4198396cd715b140c0e8b259680429ff0cfb:
Merge branches 'iommu/fixes', 'arm/allwinner', 'arm/exynos', 'arm/mediatek', 'arm/omap', 'arm/renesas', 'arm/rockchip', 'arm/smmu', 'ppc/pamu', 'unisoc', 'x86/vt-d', 'x86/amd', 'core' and 'platform-remove_new' into next (2023-04-14 13:45:50 +0200)
----------------------------------------------------------------
IOMMU Updates for Linux 6.4
Including:
- Convert to platform remove callback returning void
- Extend changing default domain to normal group
- Intel VT-d updates:
- Remove VT-d virtual command interface and IOASID
- Allow the VT-d driver to support non-PRI IOPF
- Remove PASID supervisor request support
- Various small and misc cleanups
- ARM SMMU updates:
- Device-tree binding updates:
* Allow Qualcomm GPU SMMUs to accept relevant clock properties
* Document Qualcomm 8550 SoC as implementing an MMU-500
* Favour new "qcom,smmu-500" binding for Adreno SMMUs
- Fix S2CR quirk detection on non-architectural Qualcomm SMMU
implementations
- Acknowledge SMMUv3 PRI queue overflow when consuming events
- Document (in a comment) why ATS is disabled for bypass streams
- AMD IOMMU updates:
- 5-level page-table support
- NUMA awareness for memory allocations
- Unisoc driver: Support for reattaching an existing domain
- Rockchip driver: Add missing set_platform_dma_ops callback
- Mediatek driver: Adjust the dma-ranges
- Various other small fixes and cleanups
----------------------------------------------------------------
Abel Vesa (1):
dt-bindings: arm-smmu: Add compatible for SM8550 SoC
Christophe JAILLET (2):
iommu/exynos: Use the devm_clk_get_optional() helper
iommu/vt-d: Do not use GFP_ATOMIC when not needed
Chunyan Zhang (2):
iommu/sprd: Release dma buffer to avoid memory leak
iommu/sprd: Add support for reattaching an existing domain
Geert Uytterhoeven (1):
iommu: Spelling s/cpmxchg64/cmpxchg64/
Jacob Pan (7):
iommu/vt-d: Remove virtual command interface
iommu/sva: Move PASID helpers to sva code
iommu/sva: Remove PASID to mm lookup function
iommu/sva: Use GFP_KERNEL for pasid allocation
iommu/ioasid: Rename INVALID_IOASID
iommu/vt-d: Use non-privileged mode for all PASIDs
iommu/vt-d: Remove PASID supervisor request support
Jason Gunthorpe (4):
iommu/sva: Stop using ioasid_set for SVA
iommu: Remove ioasid infrastructure
iommu: Make iommu_release_device() static
iommu: Remove iommu_group_get_by_id()
Jean-Philippe Brucker (1):
iommu/arm-smmu-v3: Explain why ATS stays disabled with bypass
Jerry Snitselaar (1):
iommu/amd: Set page size bitmap during V2 domain allocation
Joerg Roedel (2):
Merge tag 'arm-smmu-updates' of git://git.kernel.org/pub/scm/linux/kernel/git/will/linux into arm/smmu
Merge branches 'iommu/fixes', 'arm/allwinner', 'arm/exynos', 'arm/mediatek', 'arm/omap', 'arm/renesas', 'arm/rockchip', 'arm/smmu', 'ppc/pamu', 'unisoc', 'x86/vt-d', 'x86/amd', 'core' and 'platform-remove_new' into next
Kishon Vijay Abraham I (1):
iommu/amd: Fix "Guest Virtual APIC Table Root Pointer" configuration in IRTE
Konrad Dybcio (3):
dt-bindings: arm-smmu: Use qcom,smmu compatible for MMU500 adreno SMMUs
dt-bindings: arm-smmu: Add SM8350 Adreno SMMU
dt-bindings: arm-smmu: Document SM61[12]5 GPU SMMU
Lu Baolu (14):
iommu/ipmmu-vmsa: Call arm_iommu_release_mapping() in release path
iommu: Split iommu_group_remove_device() into helpers
iommu: Same critical region for device release and removal
iommu: Move lock from iommu_change_dev_def_domain() to its caller
iommu: Replace device_lock() with group->mutex
iommu: Cleanup iommu_change_dev_def_domain()
iommu: Use sysfs_emit() for sysfs show
dmaengine: idxd: Add enable/disable device IOPF feature
iommu/vt-d: Allow SVA with device-specific IOPF
iommu/vt-d: Move iopf code from SVA to IOPF enabling path
iommu/vt-d: Move pfsid and ats_qdep calculation to device probe path
iommu/vt-d: Move PRI handling to IOPF feature path
iommu/vt-d: Remove unnecessary checks in iopf disabling path
iommu/vt-d: Remove extern from function prototypes
Manivannan Sadhasivam (1):
iommu/arm-smmu-qcom: Limit the SMR groups to 128
Nick Alcock (1):
iommu/sun50i: remove MODULE_LICENSE in non-modules
Randy Dunlap (1):
iommu/fsl: fix all kernel-doc warnings in fsl_pamu.c
Rob Herring (2):
iommu: Use of_property_present() for testing DT property presence
iommu/omap: Use of_property_read_bool() for boolean properties
Steven Price (1):
iommu/rockchip: Add missing set_platform_dma_ops callback
Thomas Weißschuh (1):
iommu: Make kobj_type structure constant
Tina Zhang (7):
iommu/vt-d: Make size of operands same in bitwise operations
iommu/vt-d: Remove BUG_ON on checking valid pfn range
iommu/vt-d: Remove BUG_ON in handling iotlb cache invalidation
iommu/vt-d: Remove BUG_ON when domain->pgd is NULL
iommu/vt-d: Remove BUG_ON in map/unmap()
iommu/vt-d: Remove a useless BUG_ON(dev->is_virtfn)
iommu/vt-d: Remove BUG_ON in dmar_insert_dev_scope()
Tomas Krcka (1):
iommu/arm-smmu-v3: Acknowledge pri/event queue overflow if any
Uwe Kleine-König (10):
iommu/arm-smmu: Drop if with an always false condition
iommu/apple-dart: Convert to platform remove callback returning void
iommu/arm-smmu-v3: Convert to platform remove callback returning void
iommu/arm-smmu: Convert to platform remove callback returning void
iommu/ipmmu-vmsa: Convert to platform remove callback returning void
iommu/msm: Convert to platform remove callback returning void
iommu/mtk: Convert to platform remove callback returning void
iommu/mtk_iommu_v1: Convert to platform remove callback returning void
iommu/omap: Convert to platform remove callback returning void
iommu/sprd: Convert to platform remove callback returning void
Vasant Hegde (3):
iommu/amd: Allocate page table using numa locality info
iommu/amd: Allocate IOMMU irqs using numa locality info
iommu/amd: Add 5 level guest page table support
Will Deacon (1):
Merge branch 'for-joerg/arm-smmu/bindings' into for-joerg/arm-smmu/updates
Wolfram Sang (1):
iommu/ipmmu-vmsa: remove R-Car H3 ES1.* handling
Yong Wu (15):
iommu/mediatek: Set dma_mask for PGTABLE_PA_35_EN
dt-bindings: media: mediatek,vcodec: Remove dma-ranges property
dt-bindings: media: mediatek,jpeg: Remove dma-ranges property
iommu/mediatek: Improve comment for the current region/bank
iommu/mediatek: Get regionid from larb/port id
iommu/mediatek: mt8192: Add iova_region_larb_msk
iommu/mediatek: mt8195: Add iova_region_larb_msk
iommu/mediatek: mt8186: Add iova_region_larb_msk
iommu/mediatek: Add a gap for the iova regions
iommu/mediatek: Set dma_mask for the master devices
media: mtk-jpegdec: Remove the setting for dma_mask
media: mediatek: vcodec: Remove the setting for dma_mask
arm64: dts: mt8195: Remove the unnecessary dma-ranges
arm64: dts: mt8195: Add dma-ranges for the parent "soc" node
arm64: dts: mt8186: Add dma-ranges for the parent "soc" node
Yoshihiro Shimoda (1):
dt-bindings: iommu: renesas, ipmmu-vmsa: Update for R-Car Gen4
.../ABI/testing/sysfs-kernel-iommu_groups | 1 -
.../devicetree/bindings/iommu/arm,smmu.yaml | 45 ++-
.../bindings/iommu/renesas,ipmmu-vmsa.yaml | 32 +-
.../bindings/media/mediatek,mt8195-jpegdec.yaml | 7 -
.../bindings/media/mediatek,mt8195-jpegenc.yaml | 7 -
.../bindings/media/mediatek,vcodec-decoder.yaml | 5 -
.../bindings/media/mediatek,vcodec-encoder.yaml | 5 -
.../bindings/media/mediatek-jpeg-encoder.yaml | 5 -
Documentation/x86/sva.rst | 2 +-
arch/arm64/boot/dts/mediatek/mt8186.dtsi | 1 +
arch/arm64/boot/dts/mediatek/mt8195.dtsi | 4 +-
arch/x86/kernel/traps.c | 2 +-
drivers/dma/idxd/device.c | 8 +-
drivers/dma/idxd/idxd.h | 2 +-
drivers/dma/idxd/init.c | 33 +-
drivers/dma/idxd/irq.c | 2 +-
drivers/iommu/Kconfig | 9 +-
drivers/iommu/Makefile | 1 -
drivers/iommu/amd/amd_iommu.h | 9 +
drivers/iommu/amd/amd_iommu_types.h | 12 +-
drivers/iommu/amd/init.c | 30 +-
drivers/iommu/amd/io_pgtable.c | 4 +-
drivers/iommu/amd/io_pgtable_v2.c | 25 +-
drivers/iommu/amd/iommu.c | 17 +-
drivers/iommu/apple-dart.c | 6 +-
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 32 +-
drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c | 16 +-
drivers/iommu/arm/arm-smmu/arm-smmu.c | 14 +-
drivers/iommu/arm/arm-smmu/qcom_iommu.c | 12 +-
drivers/iommu/exynos-iommu.c | 24 +-
drivers/iommu/fsl_pamu.c | 9 +-
drivers/iommu/intel/cap_audit.c | 2 -
drivers/iommu/intel/dmar.c | 13 +-
drivers/iommu/intel/iommu.c | 277 ++++++--------
drivers/iommu/intel/iommu.h | 35 +-
drivers/iommu/intel/irq_remapping.c | 2 +-
drivers/iommu/intel/pasid.c | 43 ---
drivers/iommu/intel/pasid.h | 7 -
drivers/iommu/intel/svm.c | 3 +-
drivers/iommu/ioasid.c | 422 ---------------------
drivers/iommu/iommu-sva.c | 61 +--
drivers/iommu/iommu-sva.h | 4 -
drivers/iommu/iommu.c | 347 +++++++----------
drivers/iommu/ipmmu-vmsa.c | 23 +-
drivers/iommu/msm_iommu.c | 5 +-
drivers/iommu/mtk_iommu.c | 158 ++++++--
drivers/iommu/mtk_iommu_v1.c | 5 +-
drivers/iommu/omap-iommu.c | 7 +-
drivers/iommu/rockchip-iommu.c | 61 ++-
drivers/iommu/sprd-iommu.c | 60 ++-
drivers/iommu/sun50i-iommu.c | 1 -
.../media/platform/mediatek/jpeg/mtk_jpeg_core.c | 3 -
.../platform/mediatek/vcodec/mtk_vcodec_dec_drv.c | 8 -
.../platform/mediatek/vcodec/mtk_vcodec_enc_drv.c | 3 -
include/linux/ioasid.h | 83 ----
include/linux/iommu.h | 21 +-
include/linux/sched/mm.h | 26 --
kernel/fork.c | 1 +
mm/init-mm.c | 4 +-
59 files changed, 789 insertions(+), 1277 deletions(-)
delete mode 100644 drivers/iommu/ioasid.c
delete mode 100644 include/linux/ioasid.h
Please pull.
Thanks,
Joerg
diff --cc arch/x86/kernel/process_64.c
index 223b223f713f,bb65a68b4b49..3d181c16a2f6
--- a/arch/x86/kernel/process_64.c
+++ b/arch/x86/kernel/process_64.c
@@@ -39,6 -39,6 +39,7 @@@
#include <linux/io.h>
#include <linux/ftrace.h>
#include <linux/syscalls.h>
++#include <linux/iommu.h>
#include <asm/processor.h>
#include <asm/pkru.h>
diff --cc drivers/iommu/iommu-sva.c
index dd76a1a09cf7,c434b95dc8eb..5d4bb11dde01
--- a/drivers/iommu/iommu-sva.c
+++ b/drivers/iommu/iommu-sva.c
@@@ -10,26 -9,14 +10,14 @@@
#include "iommu-sva.h"
static DEFINE_MUTEX(iommu_sva_lock);
- static DECLARE_IOASID_SET(iommu_sva_pasid);
+ static DEFINE_IDA(iommu_global_pasid_ida);
- /**
- * iommu_sva_alloc_pasid - Allocate a PASID for the mm
- * @mm: the mm
- * @min: minimum PASID value (inclusive)
- * @max: maximum PASID value (inclusive)
- *
- * Try to allocate a PASID for this mm, or take a reference to the existing one
- * provided it fits within the [@min, @max] range. On success the PASID is
- * available in mm->pasid and will be available for the lifetime of the mm.
- *
- * Returns 0 on success and < 0 on error.
- */
- int iommu_sva_alloc_pasid(struct mm_struct *mm, ioasid_t min, ioasid_t max)
+ /* Allocate a PASID for the mm within range (inclusive) */
+ static int iommu_sva_alloc_pasid(struct mm_struct *mm, ioasid_t min, ioasid_t max)
{
int ret = 0;
- ioasid_t pasid;
- if (min == INVALID_IOASID || max == INVALID_IOASID ||
- if (!pasid_valid(min) || !pasid_valid(max) ||
++ if (min == IOMMU_PASID_INVALID || max == IOMMU_PASID_INVALID ||
min == 0 || max < min)
return -EINVAL;
@@@ -44,11 -28,11 +32,12 @@@
goto out;
}
- pasid = ioasid_alloc(&iommu_sva_pasid, min, max, mm);
- if (pasid == INVALID_IOASID)
- ret = -ENOMEM;
- else
- mm_pasid_set(mm, pasid);
+ ret = ida_alloc_range(&iommu_global_pasid_ida, min, max, GFP_KERNEL);
+ if (ret < min)
+ goto out;
+ mm->pasid = ret;
+ ret = 0;
++
out:
mutex_unlock(&iommu_sva_lock);
return ret;
@@@ -242,3 -205,11 +210,11 @@@ out_put_mm
return status;
}
+
+ void mm_pasid_drop(struct mm_struct *mm)
+ {
- if (likely(!pasid_valid(mm->pasid)))
++ if (likely(!mm_valid_pasid(mm)))
+ return;
+
+ ida_free(&iommu_global_pasid_ida, mm->pasid);
+ }
diff --cc drivers/iommu/iommu.c
index 807c98de40d4,153a3dab568c..f1dcfa3f1a1b
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@@ -88,9 -87,10 +88,10 @@@ static const char * const iommu_group_r
static int iommu_bus_notifier(struct notifier_block *nb,
unsigned long action, void *data);
+ static void iommu_release_device(struct device *dev);
static int iommu_alloc_default_domain(struct iommu_group *group,
struct device *dev);
-static struct iommu_domain *__iommu_domain_alloc(struct bus_type *bus,
+static struct iommu_domain *__iommu_domain_alloc(const struct bus_type *bus,
unsigned type);
static int __iommu_attach_device(struct iommu_domain *domain,
struct device *dev);
diff --cc include/linux/iommu.h
index 0fd4e6734d5b,7dbdd13d7ce0..e8c9a7da1060
--- a/include/linux/iommu.h
+++ b/include/linux/iommu.h
@@@ -455,12 -455,11 +455,11 @@@ static inline const struct iommu_ops *d
return dev->iommu->iommu_dev->ops;
}
-extern int bus_iommu_probe(struct bus_type *bus);
-extern bool iommu_present(struct bus_type *bus);
+extern int bus_iommu_probe(const struct bus_type *bus);
+extern bool iommu_present(const struct bus_type *bus);
extern bool device_iommu_capable(struct device *dev, enum iommu_cap cap);
extern bool iommu_group_has_isolated_msi(struct iommu_group *group);
-extern struct iommu_domain *iommu_domain_alloc(struct bus_type *bus);
+extern struct iommu_domain *iommu_domain_alloc(const struct bus_type *bus);
- extern struct iommu_group *iommu_group_get_by_id(int id);
extern void iommu_domain_free(struct iommu_domain *domain);
extern int iommu_attach_device(struct iommu_domain *domain,
struct device *dev);
@@@ -1172,7 -1165,17 +1165,16 @@@ static inline bool tegra_dev_iommu_get_
return false;
}
-static inline bool pasid_valid(ioasid_t ioasid)
-{
- return ioasid != IOMMU_PASID_INVALID;
-}
-
#ifdef CONFIG_IOMMU_SVA
+ static inline void mm_pasid_init(struct mm_struct *mm)
+ {
+ mm->pasid = IOMMU_PASID_INVALID;
+ }
++static inline bool mm_valid_pasid(struct mm_struct *mm)
++{
++ return mm->pasid != IOMMU_PASID_INVALID;
++}
+ void mm_pasid_drop(struct mm_struct *mm);
struct iommu_sva *iommu_sva_bind_device(struct device *dev,
struct mm_struct *mm);
void iommu_sva_unbind_device(struct iommu_sva *handle);
@@@ -1192,6 -1195,8 +1194,9 @@@ static inline u32 iommu_sva_get_pasid(s
{
return IOMMU_PASID_INVALID;
}
+ static inline void mm_pasid_init(struct mm_struct *mm) {}
++static inline bool mm_valid_pasid(struct mm_struct *mm) { return false; }
+ static inline void mm_pasid_drop(struct mm_struct *mm) {}
#endif /* CONFIG_IOMMU_SVA */
#endif /* __LINUX_IOMMU_H */
diff --cc kernel/fork.c
index 735d9f4f5acf,e7d10ad98a69..ed4e01daccaa
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@@ -97,7 -97,7 +97,8 @@@
#include <linux/io_uring.h>
#include <linux/bpf.h>
#include <linux/stackprotector.h>
+#include <linux/user_events.h>
+ #include <linux/iommu.h>
#include <asm/pgalloc.h>
#include <linux/uaccess.h>
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next reply other threads:[~2023-04-30 11:20 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-04-30 11:13 Joerg Roedel [this message]
2023-04-30 20:07 ` [git pull] IOMMU Updates for Linux v6.4 Linus Torvalds
2023-04-30 23:06 ` Jason Gunthorpe
2023-05-06 4:09 ` Jacob Pan
2023-05-05 14:02 ` Joerg Roedel
2023-05-05 18:03 ` Linus Torvalds
2023-05-05 19:57 ` Jason Gunthorpe
2023-05-05 20:10 ` Linus Torvalds
2023-05-06 2:58 ` Tian, Kevin
2023-04-30 20:08 ` pr-tracker-bot
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=ZE5NR5Ml8I2/Ze0f@8bytes.org \
--to=joro@8bytes.org \
--cc=iommu@lists.linux.dev \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=will@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.