From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-qk1-f180.google.com (mail-qk1-f180.google.com [209.85.222.180]) (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 574903DB65C for ; Fri, 20 Mar 2026 17:59:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.180 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774029547; cv=none; b=D3ajYrQyE5KBs/9YOhO2oasMy/UolU+czHvrf9i3RIIsUsbK6NvTjFyw2fxvxHlCASEi6adVUsTDwecpyZS8QzCTtJ92QsOL5Qgxdfx6MJSPoSVtF9vFZgcSDN0c5qaCOotzqsxgVOZ/QMDj1dqotEfvLpbqnjnjLQ1b3wE1P6w= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774029547; c=relaxed/simple; bh=mknhkPtyofLdqd31WD43VR1SdxPjV76bX0yeTgSZ4VE=; h=Message-ID:Subject:From:To:Cc:Date:In-Reply-To:References: Content-Type:MIME-Version; b=N3HPeEIkgXDIUr9/rHuFk1zJ+Or55XLQjIOz6hNJUlWpVojzDnaz75Q1cH+hOQ4CxRggl9xDvCRtv3jMrhTbAzVU/J9ahE/nV/KKkVQk2xDBSfzEPdpVlweTNDzWajaLRWZJxQKGz52mxeCxYyip7vgplg0+FG8Zdmb01/5R1GQ= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ndufresne.ca; spf=pass smtp.mailfrom=ndufresne.ca; dkim=pass (2048-bit key) header.d=ndufresne-ca.20230601.gappssmtp.com header.i=@ndufresne-ca.20230601.gappssmtp.com header.b=lGuqGKRl; arc=none smtp.client-ip=209.85.222.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ndufresne.ca Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ndufresne.ca Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ndufresne-ca.20230601.gappssmtp.com header.i=@ndufresne-ca.20230601.gappssmtp.com header.b="lGuqGKRl" Received: by mail-qk1-f180.google.com with SMTP id af79cd13be357-8cd77786e97so228008185a.3 for ; Fri, 20 Mar 2026 10:59:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ndufresne-ca.20230601.gappssmtp.com; s=20230601; t=1774029544; x=1774634344; darn=vger.kernel.org; h=mime-version:user-agent:references:in-reply-to:date:cc:to:from :subject:message-id:from:to:cc:subject:date:message-id:reply-to; bh=DWkKoVAEpPTbhlQcGao02ZYKop/ZGqIz8O7PUwO5+Xk=; b=lGuqGKRlLtf7kijeXTwsEt2Vf7TyglLo+qlXKOwsvMthyobT/nRDPILwlsCrkkyzSx Ue9qMv9oIR73iCQCTPhDMIPXAc+xN5dPDoYfLwvzrTlai/WiWEFnRZcvVFKbfAXDaGe/ c0BHIQj4D/DyzajmbpL8xgYN+PgCDkBKwT1redhukH+rSvbPcbJPHH/XkEE6yLz2LfBU c13+IOM9rWTaKTGxNA5pCB0FAIrkDndRw2w8w+y7HOlYtLSa2eK7bliZPg9OWJAE8U/D LDJ2mImGGGKDnc5TKGCuAebbmIxQSOnw7D6ypOtzXf4dpoQpPkpHQ29GnbVbBFcr+L8J cI4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774029544; x=1774634344; h=mime-version:user-agent:references:in-reply-to:date:cc:to:from :subject:message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=DWkKoVAEpPTbhlQcGao02ZYKop/ZGqIz8O7PUwO5+Xk=; b=mO5JdczLxC7/s8NcaY/SJlCdjoo2LwcznpLgeBrTKcOuh7nuTb8o5ivdzA8p+EIF6W K4PQ3eLY9gafMmZQXN0NjhQEFXZisELLjO6SmR669ZRuYB/YEpdmpXkXwhO6hgAZWQhQ m/7KC2ktmUsdRUAJ6praqF6tpgiRt1mi5b/XfnGu1Ep2YOL0BUDqO4FoUln6ablRT7+o ade6mY2LLkyDS8kqpE+yvTYnSq6jyef4+eXBWyRt7anO1WVx1tdDowp3VMj8Ooo2y3jP Gl3+P4nw8qUIdKPMjH+xYbdBmM5/BolZiODZa6oTsL2sAwkTcYNE5fr1S1lQTRep5Vcz fEEA== X-Forwarded-Encrypted: i=1; AJvYcCX3vISB/bVfjFW9Tpc82ZjkAmPIj5TI6C31iCDXI0973QFChmbk8GliVqLQtxyx2e4zFKCF5EPiH9HCTqM=@vger.kernel.org X-Gm-Message-State: AOJu0YytHoFwow3mUA3WKOob/L9A0xlRGvxyrLdSwuiRYZuvWIQH7h6M EZbCs2Kl/wtPLvbgweF2FzIz4NZgqU7FEFxRdvH/aofxxLMfWNZYu+1R6KTQl3WynUU= X-Gm-Gg: ATEYQzxyR3t2YdzNae6uPCjMrKXC6K+MHVsCYD1FkDcGyfcQPe8o7RT6EddBozT2tgt oR+Q4DbWqrg/PPIprtBmt4RfqcNi221BvliOMOmNNj4g5svY/ZIiRx8g4HDdj/Z3p3OS8YmfCbD tTZj2WfAEqEtZQ0A4T+eXhUB+ASaXt662lGJg9uOmpvf1KnS7FjuC81gx3Wb3RsqlFdGcKOrwFJ HDqKx7t/3I/drrZFXQalxbE+laQiYO+wZoEf5gVb0hiKi6wTghOOC6isYIsK+pk5PWPKvfD0pCJ +VAiXXEaXpvYkX19HfkoMbXVbE4nhNNLAKL0XTYjxTnEj17dunhhXTfWqiUAGXWJd0jy0vWhjyQ WqkqODvD1iIDCvS9oDkSUa0CMePlM/4orPpifaCthTubrLQjD/4zfrqUdpz4PEo8gxLjuy+ptMd C5l2ik+or8/y6c6/gGb/gisAHATCth X-Received: by 2002:a05:620a:4110:b0:8cf:c77f:f4e2 with SMTP id af79cd13be357-8cfc7f86b0cmr579713085a.67.1774029544140; Fri, 20 Mar 2026 10:59:04 -0700 (PDT) Received: from ?IPv6:2606:6d00:11:b76d::5ac? ([2606:6d00:11:b76d::5ac]) by smtp.gmail.com with ESMTPSA id af79cd13be357-8cfc90e2d27sm233119785a.43.2026.03.20.10.59.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Mar 2026 10:59:03 -0700 (PDT) Message-ID: <46d7ccd7500771bf66f830040b3e306785866ea8.camel@ndufresne.ca> Subject: Re: [PATCH v3 19/27] media: rockchip: rga: support external iommus From: Nicolas Dufresne To: Sven =?ISO-8859-1?Q?P=FCschel?= , Jacob Chen , Ezequiel Garcia , Mauro Carvalho Chehab , Heiko Stuebner , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@pengutronix.de Date: Fri, 20 Mar 2026 13:59:02 -0400 In-Reply-To: <20260127-spu-rga3-v3-19-77b273067beb@pengutronix.de> References: <20260127-spu-rga3-v3-0-77b273067beb@pengutronix.de> <20260127-spu-rga3-v3-19-77b273067beb@pengutronix.de> Content-Type: multipart/signed; micalg="pgp-sha512"; protocol="application/pgp-signature"; boundary="=-GSvc32jDQd071V5aC8lf" User-Agent: Evolution 3.58.3 (3.58.3-1.fc43) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 --=-GSvc32jDQd071V5aC8lf Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Le mardi 27 janvier 2026 =C3=A0 15:39 +0100, Sven P=C3=BCschel a =C3=A9crit= =C2=A0: > In preparation for the RGA3 add support for external iommus. This is a > transition step to just disable the RGA2 specific mmu table setup code. >=20 > Currently a simple rga_hw struct field is used to set the internal iommu. > But to handle the case of more sophisticated detection mechanisms > (e.g. check for an iommu property in the device tree), it is abstracted > by an inline function. >=20 > Signed-off-by: Sven P=C3=BCschel Reviewed-by: Nicolas Dufresne > --- > =C2=A0drivers/media/platform/rockchip/rga/rga-buf.c | 31 ++++++++++++++++= ++-------- > - > =C2=A0drivers/media/platform/rockchip/rga/rga-hw.c=C2=A0 |=C2=A0 1 + > =C2=A0drivers/media/platform/rockchip/rga/rga.c=C2=A0=C2=A0=C2=A0=C2=A0 |= 11 ++++++++-- > =C2=A0drivers/media/platform/rockchip/rga/rga.h=C2=A0=C2=A0=C2=A0=C2=A0 |= =C2=A0 6 ++++++ > =C2=A04 files changed, 37 insertions(+), 12 deletions(-) >=20 > diff --git a/drivers/media/platform/rockchip/rga/rga-buf.c > b/drivers/media/platform/rockchip/rga/rga-buf.c > index bc349d0a46365..4e82ca1a5e8d9 100644 > --- a/drivers/media/platform/rockchip/rga/rga-buf.c > +++ b/drivers/media/platform/rockchip/rga/rga-buf.c > @@ -12,6 +12,7 @@ > =C2=A0#include > =C2=A0#include > =C2=A0#include > +#include > =C2=A0#include > =C2=A0 > =C2=A0#include "rga.h" > @@ -82,6 +83,9 @@ static int rga_buf_init(struct vb2_buffer *vb) > =C2=A0 if (IS_ERR(f)) > =C2=A0 return PTR_ERR(f); > =C2=A0 > + if (!rga_has_internal_iommu(rga)) > + return 0; > + > =C2=A0 n_desc =3D DIV_ROUND_UP(f->size, PAGE_SIZE); > =C2=A0 > =C2=A0 rbuf->n_desc =3D n_desc; > @@ -136,17 +140,21 @@ static int rga_buf_prepare(struct vb2_buffer *vb) > =C2=A0 for (i =3D 0; i < vb->num_planes; i++) { > =C2=A0 vb2_set_plane_payload(vb, i, f->pix.plane_fmt[i].sizeimage); > =C2=A0 > - /* Create local MMU table for RGA */ > - n_desc =3D fill_descriptors(&rbuf->dma_desc[curr_desc], > - =C2=A0 rbuf->n_desc - curr_desc, > - =C2=A0 vb2_dma_sg_plane_desc(vb, i)); > - if (n_desc < 0) { > - v4l2_err(&ctx->rga->v4l2_dev, > - "Failed to map video buffer to RGA\n"); > - return n_desc; > + if (rga_has_internal_iommu(ctx->rga)) { > + /* Create local MMU table for RGA */ > + n_desc =3D fill_descriptors(&rbuf->dma_desc[curr_desc], > + =C2=A0 rbuf->n_desc - curr_desc, > + =C2=A0 vb2_dma_sg_plane_desc(vb, > i)); > + if (n_desc < 0) { > + v4l2_err(&ctx->rga->v4l2_dev, > + "Failed to map video buffer to > RGA\n"); > + return n_desc; > + } > + dma_addrs[i] =3D curr_desc << PAGE_SHIFT; > + curr_desc +=3D n_desc; > + } else { > + dma_addrs[i] =3D vb2_dma_contig_plane_dma_addr(vb, i); > =C2=A0 } > - dma_addrs[i] =3D curr_desc << PAGE_SHIFT; > - curr_desc +=3D n_desc; > =C2=A0 } > =C2=A0 > =C2=A0 /* Fill the remaining planes */ > @@ -176,6 +184,9 @@ static void rga_buf_cleanup(struct vb2_buffer *vb) > =C2=A0 struct rga_ctx *ctx =3D vb2_get_drv_priv(vb->vb2_queue); > =C2=A0 struct rockchip_rga *rga =3D ctx->rga; > =C2=A0 > + if (!rga_has_internal_iommu(rga)) > + return; > + > =C2=A0 dma_free_coherent(rga->dev, rbuf->n_desc * sizeof(*rbuf->dma_desc)= , > =C2=A0 =C2=A0 rbuf->dma_desc, rbuf->dma_desc_pa); > =C2=A0} > diff --git a/drivers/media/platform/rockchip/rga/rga-hw.c > b/drivers/media/platform/rockchip/rga/rga-hw.c > index bf4a86a640ec5..2013b59701d12 100644 > --- a/drivers/media/platform/rockchip/rga/rga-hw.c > +++ b/drivers/media/platform/rockchip/rga/rga-hw.c > @@ -577,6 +577,7 @@ static struct rga_fmt formats[] =3D { > =C2=A0 > =C2=A0const struct rga_hw rga2_hw =3D { > =C2=A0 .card_type =3D "rga2", > + .has_internal_iommu =3D true, > =C2=A0 .formats =3D formats, > =C2=A0 .num_formats =3D ARRAY_SIZE(formats), > =C2=A0 .cmdbuf_size =3D RGA_CMDBUF_SIZE, > diff --git a/drivers/media/platform/rockchip/rga/rga.c > b/drivers/media/platform/rockchip/rga/rga.c > index f33e2288dab6f..b13ff8d7c572c 100644 > --- a/drivers/media/platform/rockchip/rga/rga.c > +++ b/drivers/media/platform/rockchip/rga/rga.c > @@ -23,6 +23,7 @@ > =C2=A0#include > =C2=A0#include > =C2=A0#include > +#include > =C2=A0#include > =C2=A0 > =C2=A0#include "rga.h" > @@ -95,7 +96,10 @@ queue_init(void *priv, struct vb2_queue *src_vq, struc= t > vb2_queue *dst_vq) > =C2=A0 src_vq->io_modes =3D VB2_MMAP | VB2_DMABUF; > =C2=A0 src_vq->drv_priv =3D ctx; > =C2=A0 src_vq->ops =3D &rga_qops; > - src_vq->mem_ops =3D &vb2_dma_sg_memops; > + if (rga_has_internal_iommu(ctx->rga)) > + src_vq->mem_ops =3D &vb2_dma_sg_memops; > + else > + src_vq->mem_ops =3D &vb2_dma_contig_memops; > =C2=A0 src_vq->gfp_flags =3D __GFP_DMA32; > =C2=A0 src_vq->buf_struct_size =3D sizeof(struct rga_vb_buffer); > =C2=A0 src_vq->timestamp_flags =3D V4L2_BUF_FLAG_TIMESTAMP_COPY; > @@ -110,7 +114,10 @@ queue_init(void *priv, struct vb2_queue *src_vq, str= uct > vb2_queue *dst_vq) > =C2=A0 dst_vq->io_modes =3D VB2_MMAP | VB2_DMABUF; > =C2=A0 dst_vq->drv_priv =3D ctx; > =C2=A0 dst_vq->ops =3D &rga_qops; > - dst_vq->mem_ops =3D &vb2_dma_sg_memops; > + if (rga_has_internal_iommu(ctx->rga)) > + dst_vq->mem_ops =3D &vb2_dma_sg_memops; > + else > + dst_vq->mem_ops =3D &vb2_dma_contig_memops; > =C2=A0 dst_vq->gfp_flags =3D __GFP_DMA32; > =C2=A0 dst_vq->buf_struct_size =3D sizeof(struct rga_vb_buffer); > =C2=A0 dst_vq->timestamp_flags =3D V4L2_BUF_FLAG_TIMESTAMP_COPY; > diff --git a/drivers/media/platform/rockchip/rga/rga.h > b/drivers/media/platform/rockchip/rga/rga.h > index 025b1df594e9a..95fa7fd1c509a 100644 > --- a/drivers/media/platform/rockchip/rga/rga.h > +++ b/drivers/media/platform/rockchip/rga/rga.h > @@ -146,6 +146,7 @@ static inline void rga_mod(struct rockchip_rga *rga, = u32 > reg, u32 val, u32 mask) > =C2=A0 > =C2=A0struct rga_hw { > =C2=A0 const char *card_type; > + bool has_internal_iommu; > =C2=A0 struct rga_fmt *formats; > =C2=A0 u32 num_formats; > =C2=A0 size_t cmdbuf_size; > @@ -161,6 +162,11 @@ struct rga_hw { > =C2=A0 void (*get_version)(struct rockchip_rga *rga); > =C2=A0}; > =C2=A0 > +static inline bool rga_has_internal_iommu(const struct rockchip_rga *rga= ) > +{ > + return rga->hw->has_internal_iommu; > +} > + > =C2=A0extern const struct rga_hw rga2_hw; > =C2=A0 > =C2=A0#endif --=-GSvc32jDQd071V5aC8lf Content-Type: application/pgp-signature; name="signature.asc" Content-Description: This is a digitally signed message part -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQTvDVKBFcTDwhoEbxLZQZRRKWBy9AUCab2K5gAKCRDZQZRRKWBy 9BfxAP9HitbV0tE91+TsUII6EawZfO2n00kNhSwOcuYpTi+2HgD/YMHoY2wU9gZ2 za+IWdj6j8GuSEbo6yXP/lEI/rjmEgk= =xHfo -----END PGP SIGNATURE----- --=-GSvc32jDQd071V5aC8lf--