From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=217.140.110.172 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1792428909; b=1cs0FWBDU1XYLpf4fOKpG8lesmig3n3EX14Z9ZMIEoLcTeb734QAgeRmndGCgxzy9UIE jmZp7duTVP6cI4R6lWYLskZMGNvWTs+W2P+SHHoA/3KBwvJiTbiiu/DjGLocoFnBqN9pQ /rsGTACOiu/85UZEKxIe9oeKaMTVQmii+V8bKdXrugTU2woYm3Pg8F5Y/pwkhrQG8bTtJ +Ps2RuDyw6AGRdhjgAQGM/ZgILbFh+Wmp0+bMcKq0euhv6iMSudaldZZcatGTaOMPpMd+ e1H06xnPQRLeieONJZnYdtVSLyJiM7YQxszaLfPqdFBK+TZoUcV5HdkrAr7Bgiy+yYQ== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1792428909; h=DMARC-Filter:Received:Received:DKIM-Signature:Message-ID:Date: MIME-Version:User-Agent:Subject:To:Cc:References:From: Content-Language:In-Reply-To:Content-Type:Content-Transfer-Encoding; bh=DDvlbAjqIKYcI5YtOv7UdDRsF0j2wGcohxG2sB0GTBM=; b=2OSx6p2RGf5oZuH/EX8v4dtLwxk8cvFqHQmE5rhAX30+VL7D83d7A7+KCOGDs9h8hGci gSj6ruMaFDAX5PYy/nzGCm6CBoDtkD18V5j99ik69ucbuGnadMevmHy3pX4qFl4+BaT2G n81n8TZRpvPI0PsnT0s9p6vPLU/tkSMnOCoed9gHR8UeIz24YEf1GlYbgBGNxbMlHqCdO PwYk/W/KyROKBgn74fsjMn2J9bxVX8covc/Va7qGMVUWnCUKqw0vCqSURKxnpwXlz6U83 g6LdD2ccNbqKK38D9CoFTCP1IOOTRXcfPE6a7Yid1qp1tWVlFVuhFy/e7yQYvVII65A== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass header.from=arm.com; spf=pass smtp.mailfrom=arm.com; dkim=pass header.d=arm.com header.i=@arm.com header.a=rsa-sha256 header.s=foss header.b=sng5j+Zz; arc=none smtp.remote-ip=217.140.110.172 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 9821C606A32C; Mon, 19 Oct 2026 16:55:08 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org 9821C606A32C Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key, unprotected) header.d=arm.com header.i=@arm.com header.a=rsa-sha256 header.s=foss header.b=sng5j+Zz Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 7C869204C; Mon, 19 Oct 2026 09:55:04 -0700 (PDT) Received: from [10.2.212.23] (e121345-lin.cambridge.arm.com [10.2.212.23]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id CD3273F673; Mon, 19 Oct 2026 09:55:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1792428907; bh=g0MCRM90bHOY9xtPWztIDlp+2g+2cg4X+xov3AAv2Po=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=sng5j+ZzFPDKIUj2toxn/TcsqEiuqIvvYLh9Yr5Pwf6ZrnfHiO9wuC1inCAEV3TpQ p7pS065DFJmLupgiAFGyl3YkDf/3uNsTsKqraz3NzjmlCJeBovUBlLUAp/tmllNJd2 sXy+3vjJWuLa0jAC8Y7hKQgSL+h1opd/Ug5uqnsI= Message-ID: <5173dbaa-2a49-420d-bf4e-97c9cc340bd9@arm.com> Date: Mon, 19 Oct 2026 17:55:02 +0100 X-Mailing-List: linux-tegra@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v2 05/11] ARM: dma-mapping: Bypass the legacy path for core-owned DMA API domains To: Mikko Perttunen , Marek Szyprowski , "Joerg Roedel (AMD)" , Will Deacon , Russell King , Heiko Stuebner , Thierry Reding , David Airlie , Simona Vetter , Jonathan Hunter , Krishna Reddy , Krzysztof Kozlowski , Jason Gunthorpe Cc: Peter Griffin , Alim Akhtar , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Yong Wu , Matthias Brugger , AngeloGioacchino Del Regno , Rob Clark , Geert Uytterhoeven , iommu@lists.linux.dev, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, dri-devel@lists.freedesktop.org, linux-tegra@vger.kernel.org References: <20261016-b4-arm32-iommu-dma-cookie-v2-0-b06842a01938@nvidia.com> <20261016-b4-arm32-iommu-dma-cookie-v2-5-b06842a01938@nvidia.com> From: Robin Murphy Content-Language: en-GB In-Reply-To: <20261016-b4-arm32-iommu-dma-cookie-v2-5-b06842a01938@nvidia.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 16/10/2026 7:46 am, Mikko Perttunen wrote: > ARM's arch_setup_dma_ops / arm_setup_iommu_dma_ops creates a custom > IOMMU domain for DMA API usage, and continues to do so when the IOMMU > driver doesn't explicitly request a DMA default domain type. > > When, however, that DMA default domain is requested and the core owns > the domain, we need to skip our own domain management. Add checks to > arm_setup/teardown_iommu_dma_ops for these cases. In such a case IOVAs > can be allocated from anywhere in the domain's geometry, so also add a > check to ensure the device's dma-ranges cover it. Presently, this is the > case for all platforms except some OMAP platforms with a non-zero > dma-ranges base. It's probably worth adding some cleverness to arm_iommu_detach_device() as well - it might work out benign to attempt to detach from a real core-owned default domain, but we'll now want to set dma_ops and to_dma_iommu_mapping according to the default domain itself (since we'll now have the possibility of switching between an explicit unmanaged dma_iommu_mapping and the implicit default one.) Thanks, Robin. > Signed-off-by: Mikko Perttunen > --- > arch/arm/mm/dma-mapping.c | 25 ++++++++++++++++++++++++- > 1 file changed, 24 insertions(+), 1 deletion(-) > > diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c > index f2d3e8ec3487..d6315baeddb9 100644 > --- a/arch/arm/mm/dma-mapping.c > +++ b/arch/arm/mm/dma-mapping.c > @@ -1761,13 +1761,33 @@ EXPORT_SYMBOL_GPL(arm_iommu_detach_device); > > static void arm_setup_iommu_dma_ops(struct device *dev) > { > - struct dma_iommu_mapping *mapping; > + struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); > u64 dma_base = 0, size = 1ULL << 32; > > if (dev->dma_range_map) { > dma_base = dma_range_map_min(dev->dma_range_map); > size = dma_range_map_max(dev->dma_range_map) - dma_base; > } > + > + /* > + * An existing cookie means the core owns the domain. Only set the > + * per-binding DMA ops. IOVAs are allocated from the whole aperture, > + * so the device's dma-ranges must cover it. > + */ > + if (mapping) { > + const struct iommu_domain_geometry *geo = > + &mapping->domain->geometry; > + > + if (dma_base > geo->aperture_start || > + dma_base + size < geo->aperture_end) { > + dev_err(dev, "dma-ranges do not cover the IOMMU aperture\n"); > + return; > + } > + > + set_dma_ops(dev, &iommu_ops); > + return; > + } > + > mapping = arm_iommu_create_mapping(dev, dma_base, size); > if (IS_ERR(mapping)) { > pr_warn("Failed to create %llu-byte IOMMU mapping for device %s\n", > @@ -1792,6 +1812,9 @@ static void arm_teardown_iommu_dma_ops(struct device *dev) > if (!mapping) > return; > > + if (!mapping->owns_domain) > + return; > + > arm_iommu_detach_device(dev); > arm_iommu_release_mapping(mapping); > } >