From nobody Fri Sep 25 06:01:07 2026 Received: from mail-pj2-f43.google.com (mail-pj2-f43.google.com [74.125.227.171]) (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 AFC0C387359 for ; Wed, 16 Sep 2026 03:33:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.227.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789529623; cv=none; b=h1LmHpt0lD8ssKMd9yMp8ydB5Mg11vvLxg+QIec9Y9Vwhx+gCG10LONcO9e+MSI5uJ692QtpkUft1IK0P5p0Zq3iPNSs/92VYxDOq9GUTAx/TUI7anPpn0uX9bPTDJEhys4DROoSDLLI5C50sbC+X23E42PorIw9QpQX4oPPelg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789529623; c=relaxed/simple; bh=es80KIPm6d34RQhtEPnuboKLoKRoUcyHS9QbOTgsSi8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=biUYWbaCUEikznJWRl4yX2/2c1DIMNgaZ0AQlNSkENjOg+w0fWk5/CGyrAbjkuC36Rik1LShp0Hb5YO8FDIhTJHcU0Idlz3/l+Xn6MZBcavjy/ZrK0AKZN6n6/2KUgVthhuEjiMZMHD7H6TlZU/ivnJG7hhC8+521vG8FSp/P+s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=h+cj7Ioh; arc=none smtp.client-ip=74.125.227.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="h+cj7Ioh" Received: by mail-pj2-f43.google.com with SMTP id 98e67ed59e1d1-396ccb1a98fso345479a91.1 for ; Tue, 15 Sep 2026 20:33:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1789529621; x=1790134421; 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:content-type; bh=JETOMAWav2dfMHsWYPyuoNMSTDJN0FsRCfFHE94te6U=; b=h+cj7IohmiY5dt0xckNsQXn1L/xnMTAYDxkkQ4gVp+ZpKfQixS4xuc1ebN5XyzQlbN YmiM99fN8N00RVQtHFo3RwcY3Ir8y3eUQMSPobAIgX8+cY2nvHXo0vOtykh9eQVFK88d 2PmE/t5xv/qW4N1PXiMMsj1nU0knL4ogt/1PQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789529621; x=1790134421; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=JETOMAWav2dfMHsWYPyuoNMSTDJN0FsRCfFHE94te6U=; b=Q2VehOkyZkL+sNfgAP9r3C8EK219yfcdZh/6AmAJG9yZpV4pO7Tu5ZI/kL10hD/MFB kSEHAlBPtmJYZ2THd5JbSMWSp8N6VMWKzSzGGQ0btyYOc7it9ZFHstZ+cH4pM9XaNXMY 4WNZifmI1VlDNddzA5txaIw+2dKZL3KUFGGOrIUksKfUgqD7QHmwY/EB5tOW8J259Zpt Y1fUsGwYq4pkY3r9ILnsMYsSUs4Xw1jskTHD8UyddR9VoD1rVuVz0NkB/+AvYM/D54iM N7qh14YUBRkCTjbgKXdHhleyf0ayOvxgKbCEhvu+tnccy+OMvN9bRWN/J54xJwRn9Ola ME0Q== X-Forwarded-Encrypted: i=1; AKwUvBxL1PNAk5EO3iRvws6Dhp8ovsfHOa94NcyXs/ID4adYzub7dc7413xMX+6M6ko0S7SfjfIfh6hWc6vsiws=@vger.kernel.org X-Gm-Message-State: AFuF++l1LZADHET/3X/+H/KuLMDyc99tSYokFDeMZHrav3VyCP5dn7mD YwRVqL7zCG3KXZ5ebTznEj7mPX/3qNgRxBRmwNd+DFwZQ9JHFCL7JpU2yBX+7h3m4A== X-Gm-Gg: AYBFou0c4bm/uIvS5LY29LEdvx5qeebnkzO0h0A3PfaqrROr+YVKYbTGypK8ZOUwSUv 5sLZsb1+VICBE7ELAPdZH9UGNobgE+zX/2G3/lXx475uEmg18tg1oILMc/IjRIZ/t+JT0VKSfod ttSoyHJcbo6zkNf6U2Ht8UpJ5Xb+p7mixzUix9Pt/p8yLhAETytnfVHiv8PKWzYQSF3Qi13EDgc mqamqLZaTHHr6GvjCIaPq7pq32HUqfoIVq8npCk9OdJG+RxdYrOeEdQTvow+g4JdooJRQqSU4mw 3HSNZ1AufPzSZuFimcNPQvAGxMzFOquzlcPM1toSYYAV24ErR2/C7+pOCpBfXdqA73y6pTHm50H 0iTMFilJuG2OmABCKXdk10JmBbhdXeduq9/5Wzh469syzEsPw1GDlS+ojMVUc5Q+NvfglxUzOdk T3/L8tHUt82ezFJ/ONno57kbzsBi3RUKhRBueq4ClMNSbliegGijRg0e7CfuOmQkpoX8vN2+Ya5 skJutEYgEsELmasEn2AlwmuUZe6fJDerXrD7TKaRiH69sV165O0YO3qiA== X-Received: by 2002:a17:90b:2604:b0:38e:659b:f366 with SMTP id 98e67ed59e1d1-39e1df6c05dmr2364892a91.0.1789529621075; Tue, 15 Sep 2026 20:33:41 -0700 (PDT) Received: from wenst-7875.tpe.corp.google.com ([2a00:79e0:203d:7:1f62:7622:5d61:2578]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-39e1bbe3e62sm1833477a91.10.2026.09.15.20.33.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 20:33:40 -0700 (PDT) From: Chen-Yu Tsai To: Liu Ying , Laurentiu Palcu , Lucas Stach , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann Cc: Chen-Yu Tsai , David Airlie , Simona Vetter , linux-sunxi@lists.linux.dev, imx@lists.linux.dev, dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH RFT v2 1/5] drm: Split framebuffer pixel offset calculation from drm_fb_dma_get_gem_addr() Date: Wed, 16 Sep 2026 11:33:22 +0800 Message-ID: <20260916033327.3054126-2-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.1032.g73a4cd73de-goog In-Reply-To: <20260916033327.3054126-1-wenst@chromium.org> References: <20260916033327.3054126-1-wenst@chromium.org> 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" Currently drm_fb_dma_get_gem_addr() calculates the offset into the framebuffer memory for the framebuffer's unclipped source coordinates, adds that to the framebuffer's backing storage, and returns the result. We are about to add a variant that uses the clipped source coordinates, so there is already some reuse of code. However, calculating the data offset for a given pixel is not specific to the DMA FB helpers. The offset is only related to the framebuffer. Split out the offset calculation into a new framebuffer helper so that non-DMA users can also reuse the same code. Suggested-by: Thomas Zimmermann Cc: # dependency for next patch Signed-off-by: Chen-Yu Tsai --- Changes since v1: - New patch --- drivers/gpu/drm/drm_fb_dma_helper.c | 28 ++---------------- drivers/gpu/drm/drm_framebuffer.c | 45 +++++++++++++++++++++++++++++ include/drm/drm_framebuffer.h | 3 ++ 3 files changed, 51 insertions(+), 25 deletions(-) diff --git a/drivers/gpu/drm/drm_fb_dma_helper.c b/drivers/gpu/drm/drm_fb_d= ma_helper.c index fd71969d2fb1..ab0f37d8a5ff 100644 --- a/drivers/gpu/drm/drm_fb_dma_helper.c +++ b/drivers/gpu/drm/drm_fb_dma_helper.c @@ -75,36 +75,14 @@ dma_addr_t drm_fb_dma_get_gem_addr(struct drm_framebuff= er *fb, unsigned int plane) { struct drm_gem_dma_object *obj; - dma_addr_t dma_addr; - u8 h_div =3D 1, v_div =3D 1; - u32 block_w =3D drm_format_info_block_width(fb->format, plane); - u32 block_h =3D drm_format_info_block_height(fb->format, plane); - u32 block_size =3D fb->format->char_per_block[plane]; - u32 sample_x; - u32 sample_y; - u32 block_start_y; - u32 num_hblocks; =20 obj =3D drm_fb_dma_get_gem_obj(fb, plane); if (!obj) return 0; =20 - dma_addr =3D obj->dma_addr + fb->offsets[plane]; - - if (plane > 0) { - h_div =3D fb->format->hsub; - v_div =3D fb->format->vsub; - } - - sample_x =3D (state->src_x >> 16) / h_div; - sample_y =3D (state->src_y >> 16) / v_div; - block_start_y =3D (sample_y / block_h) * block_h; - num_hblocks =3D sample_x / block_w; - - dma_addr +=3D fb->pitches[plane] * block_start_y; - dma_addr +=3D block_size * num_hblocks; - - return dma_addr; + return obj->dma_addr + drm_framebuffer_get_block_offset(fb, plane, + state->src_x >> 16, + state->src_y >> 16); } EXPORT_SYMBOL_GPL(drm_fb_dma_get_gem_addr); =20 diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_frameb= uffer.c index d32aceb6ca9b..9e1231162047 100644 --- a/drivers/gpu/drm/drm_framebuffer.c +++ b/drivers/gpu/drm/drm_framebuffer.c @@ -1208,6 +1208,51 @@ void drm_framebuffer_print_info(struct drm_printer *= p, unsigned int indent, } } =20 +/** + * drm_framebuffer_get_block_offset() - Get offset to start of pixel block= for + * the given framebuffer and coordinates. + * @fb: The framebuffer + * @plane: Which plane + * @x: x coordinate for pixel + * @y: y coordinate for pixel + * + * This function will usually be called from the PLANE callback functions, + * or from one of the helpers that calculates the framebuffer's DMA addres= s. + * + * Return: offset from start of framebuffer to start of pixel block + */ +u32 drm_framebuffer_get_block_offset(struct drm_framebuffer *fb, unsigned = int plane, + unsigned int x, unsigned int y) +{ + u8 h_div =3D 1, v_div =3D 1; + u32 block_w =3D drm_format_info_block_width(fb->format, plane); + u32 block_h =3D drm_format_info_block_height(fb->format, plane); + u32 block_size =3D fb->format->char_per_block[plane]; + u32 sample_x; + u32 sample_y; + u32 block_start_y; + u32 num_hblocks; + u32 offset; + + offset =3D fb->offsets[plane]; + + if (plane > 0) { + h_div =3D fb->format->hsub; + v_div =3D fb->format->vsub; + } + + sample_x =3D x / h_div; + sample_y =3D y / v_div; + block_start_y =3D (sample_y / block_h) * block_h; + num_hblocks =3D sample_x / block_w; + + offset +=3D fb->pitches[plane] * block_start_y; + offset +=3D block_size * num_hblocks; + + return offset; +} +EXPORT_SYMBOL(drm_framebuffer_get_block_offset); + #ifdef CONFIG_DEBUG_FS static int drm_framebuffer_info(struct seq_file *m, void *data) { diff --git a/include/drm/drm_framebuffer.h b/include/drm/drm_framebuffer.h index 38b24fc8978d..c07aea1cc59f 100644 --- a/include/drm/drm_framebuffer.h +++ b/include/drm/drm_framebuffer.h @@ -220,6 +220,9 @@ void drm_framebuffer_remove(struct drm_framebuffer *fb); void drm_framebuffer_cleanup(struct drm_framebuffer *fb); void drm_framebuffer_unregister_private(struct drm_framebuffer *fb); =20 +u32 drm_framebuffer_get_block_offset(struct drm_framebuffer *fb, unsigned = int plane, + unsigned int x, unsigned int y); + /** * drm_framebuffer_get - acquire a framebuffer reference * @fb: DRM framebuffer --=20 2.55.0.1032.g73a4cd73de-goog From nobody Fri Sep 25 06:01:07 2026 Received: from mail-pj2-f12.google.com (mail-pj2-f12.google.com [74.125.227.140]) (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 BC7331E5B9F for ; Wed, 16 Sep 2026 03:33:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.227.140 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789529627; cv=none; b=SGrPQA2R7AHye2kVXyUQwVkoXUw7wb5UsO4s6do2CShANzxp8j2oQkJIjN32ZucyNthVJHq5eynaIFJkZCNZKqLIMqWEoUX8VH2zgT5HHm2wfVyWUUoeHLQ5gOQ+ysH3bjiy9nUdnXwk3LPy3dh7GogghCJvOs9oR6FfYTpMmqw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789529627; c=relaxed/simple; bh=4OYvQ72/SKMSJjpx0h+y2ofjW3s/V32EvXQ/gsEJdiM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pKhqu9uRc87JUA5VuinRSJMDblLzeK3hnrYx97wHFS0ZD3JxbOD5ZJfBxGw4uRNCysAhJEteEoyAw95cnMgqU+CHLESFk+MwgI4/Q7Kvmm5lOKuqJK8ZHtMJrq/HyQ+DcXdDjNu3l59GJ7Tmrx+65jyw31UEn19gaxM+dznIeSU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=a7fq152z; arc=none smtp.client-ip=74.125.227.140 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="a7fq152z" Received: by mail-pj2-f12.google.com with SMTP id 98e67ed59e1d1-398cb5615deso433663a91.3 for ; Tue, 15 Sep 2026 20:33:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1789529625; x=1790134425; 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:content-type; bh=tuWaqYdx3lVj9cpjPj9FHjq5qpjsbWLYsj0P75i5UJE=; b=a7fq152zP8aYiI5n15olZFPi/PajX7CBlgeB4LV+MKi309Hu9PPvvXwbht15cYVkVZ p9AD+/ElEd4IAOUdt5o5x3J8mVbaUlhDctW7H+M+98uUIqij1mWaxX9LI5isXVsalWIP UsKgB3miFfULylQopZo6db5LoOZt8jF41TBFw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789529625; x=1790134425; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=tuWaqYdx3lVj9cpjPj9FHjq5qpjsbWLYsj0P75i5UJE=; b=xur6QycaiRhxkzaM0tBcS0cd79TN0E6CckqJeiSET6w8C5F3MwWfTRV+1AGLqeiijM UYwF9g0FPUq0DqwFAU9Y5q89O2OGWr6pfF51DznAY5yi4G5uuNXv6urbslENiakx+Q7R U1aSAWs0UzvcjpuASe9GTBbYx1W1VgotI1xsFj9/NqSGFxsMYH9iiq2Gc0QOet0rNxU2 pnad075o7gXov1U6EU9MNy5CA+FiC3XvveAOOGC9LzE6vGOYcYGKnzX8MsF4jPKpY3LB zWoYKM9qYue0xHLpgff3wm7qenmeWStoexkYzgktSY0L4itRLLWJunVON96Nch4Di2iq eYng== X-Forwarded-Encrypted: i=1; AKwUvBzhr86GNZIsKjO6swdpfejS1g2a2uUUT36EVQ41fM0YXL7at8Tq2n7PFL0g3A1TMyVXMRofUqNkRITM840=@vger.kernel.org X-Gm-Message-State: AFuF++nuV3gv96XQJ53ZEPZrt1zt0YcnOpSLfLZDpUC3bRFl4yhYnKpF d3I3Zlr00bVrKysgci4IjGmxj4l2kNYP29KivnDvygiuQgZPG7XNx6Lc0ZYpyGMtFQ== X-Gm-Gg: AYBFou3w5NxYChun9j/BJ+aqHrk+mxTLLaL7qRIobt/FRjwB5S32/i6WMNjdunq4y1B i9b/RPRuMU9Kbu1dGRD/MjNhUvd7GdIn4TOll6MQCYlZk8H3F4JlWQUXumf/GEX2unoPpQ4o31C 4hhQz9Im2rbvu3LldHAXrBYhYYSgMDJf4/Ns7k6EWJz4rRSJ02YYmV13koKz03mfvoFIemPdd4F 14nDiyBYc3K3sQHT/AL/xipY4HnTwcKwcULqk8uNGsNx+iEoRoVvfkkMhDpc2RY7g2A/2mfYhNe OhlJPfQWBiKtvztptpGH/Vc+T0KnSQbswzS9mENeesqN5lyJpVI0sUtg8kqA68Omo1F//3zrmJQ LQ9aWZISRA7QhKPzB1efKTlfxh5B+SNkfY2giQDlJOzT4uWouFFIy4lXX1KiESrwaT9iOp1/xgy GdCRb0Gg2XrN+iT8cG5mjGyyBIe5D8UYi8J9/SWu8Xww1WUu2u0T1LdWtyobV8sgirMQcFIzanv rso7VVSHClaQ9Nwu7s9uoefjD4u2FtI4ww7gaKY8iR7etHSO6TsuszHCQ== X-Received: by 2002:a17:90b:2604:b0:39d:f114:8f7d with SMTP id 98e67ed59e1d1-39e1e27ad34mr2355684a91.3.1789529625104; Tue, 15 Sep 2026 20:33:45 -0700 (PDT) Received: from wenst-7875.tpe.corp.google.com ([2a00:79e0:203d:7:1f62:7622:5d61:2578]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-39e1bbe3e62sm1833477a91.10.2026.09.15.20.33.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 20:33:44 -0700 (PDT) From: Chen-Yu Tsai To: Liu Ying , Laurentiu Palcu , Lucas Stach , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann Cc: Chen-Yu Tsai , David Airlie , Simona Vetter , linux-sunxi@lists.linux.dev, imx@lists.linux.dev, dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH RFT v2 2/5] drm/fb-dma-helper: Add drm_fb_dma_get_gem_clipped_addr() Date: Wed, 16 Sep 2026 11:33:23 +0800 Message-ID: <20260916033327.3054126-3-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.1032.g73a4cd73de-goog In-Reply-To: <20260916033327.3054126-1-wenst@chromium.org> References: <20260916033327.3054126-1-wenst@chromium.org> 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" drm_fb_dma_get_gem_addr() returns the DMA address to the "unclipped" framebuffer. However some display drivers want the "clipped" framebuffer instead, as they are also using the clipped coordinates to program the hardware. Some of these drivers are open-coding drm_fb_dma_get_gem_addr() with the source coordinates replaced, while others have been incorrectly converted to using drm_fb_dma_get_gem_addr(), which would end up causing incorrect parts of the framebuffer to be displayed if it were somehow clipped. Add drm_fb_dma_get_gem_clipped_addr(), a "clipped" version of drm_fb_dma_get_gem_addr() for these drivers to use. Cc: # dependency for next patch Signed-off-by: Chen-Yu Tsai --- Changes since v1: - Use new drm_framebuffer_get_block_offset() helper --- drivers/gpu/drm/drm_fb_dma_helper.c | 37 +++++++++++++++++++++++++---- include/drm/drm_fb_dma_helper.h | 4 ++++ 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/drm_fb_dma_helper.c b/drivers/gpu/drm/drm_fb_d= ma_helper.c index ab0f37d8a5ff..0aaf4926db4e 100644 --- a/drivers/gpu/drm/drm_fb_dma_helper.c +++ b/drivers/gpu/drm/drm_fb_dma_helper.c @@ -60,15 +60,16 @@ struct drm_gem_dma_object *drm_fb_dma_get_gem_obj(struc= t drm_framebuffer *fb, EXPORT_SYMBOL_GPL(drm_fb_dma_get_gem_obj); =20 /** - * drm_fb_dma_get_gem_addr() - Get DMA (bus) address for framebuffer, for = pixel - * formats where values are grouped in blocks this will get you the beginn= ing of - * the block + * drm_fb_dma_get_gem_addr() - Get DMA (bus) address for unclipped framebu= ffer, + * for pixel formats where values are grouped in blocks this will get you = the + * beginning of the block * @fb: The framebuffer * @state: Which state of drm plane * @plane: Which plane - * Return the DMA GEM address for given framebuffer. * * This function will usually be called from the PLANE callback functions. + * + * Return: GEM DMA address for given framebuffer, unclipped. */ dma_addr_t drm_fb_dma_get_gem_addr(struct drm_framebuffer *fb, struct drm_plane_state *state, @@ -86,6 +87,34 @@ dma_addr_t drm_fb_dma_get_gem_addr(struct drm_framebuffe= r *fb, } EXPORT_SYMBOL_GPL(drm_fb_dma_get_gem_addr); =20 +/** + * drm_fb_dma_get_gem_clipped_addr() - Get DMA (bus) address for clipped + * framebuffer, for pixel formats where values are grouped in blocks this + * will get you the beginning of the block + * @fb: The framebuffer + * @state: Which state of drm plane + * @plane: Which plane + * + * This function will usually be called from the PLANE callback functions. + * + * Return: GEM DMA address for given framebuffer, clipped. + */ +dma_addr_t drm_fb_dma_get_gem_clipped_addr(struct drm_framebuffer *fb, + struct drm_plane_state *state, + unsigned int plane) +{ + struct drm_gem_dma_object *obj; + + obj =3D drm_fb_dma_get_gem_obj(fb, plane); + if (!obj) + return 0; + + return obj->dma_addr + drm_framebuffer_get_block_offset(fb, plane, + state->src.x1 >> 16, + state->src.y1 >> 16); +} +EXPORT_SYMBOL_GPL(drm_fb_dma_get_gem_clipped_addr); + /** * drm_fb_dma_sync_non_coherent - Sync GEM object to non-coherent backing * memory diff --git a/include/drm/drm_fb_dma_helper.h b/include/drm/drm_fb_dma_helpe= r.h index c950732c6d36..b2a0bd7ef9d0 100644 --- a/include/drm/drm_fb_dma_helper.h +++ b/include/drm/drm_fb_dma_helper.h @@ -17,6 +17,10 @@ dma_addr_t drm_fb_dma_get_gem_addr(struct drm_framebuffe= r *fb, struct drm_plane_state *state, unsigned int plane); =20 +dma_addr_t drm_fb_dma_get_gem_clipped_addr(struct drm_framebuffer *fb, + struct drm_plane_state *state, + unsigned int plane); + void drm_fb_dma_sync_non_coherent(struct drm_device *drm, struct drm_plane_state *old_state, struct drm_plane_state *state); --=20 2.55.0.1032.g73a4cd73de-goog From nobody Fri Sep 25 06:01:07 2026 Received: from mail-pz2-f27.google.com (mail-pz2-f27.google.com [74.125.228.27]) (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 EA68A23A99F for ; Wed, 16 Sep 2026 03:33:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.228.27 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789529631; cv=none; b=I3fMbiTQFS6bgGt4mB/tNLOU97HcUbLNH1716y9d2zNrHIyMjIgi3vn8fbXPf3aaaYkWN/Q02iscu7BeepfKpuLcJDQefp4BQK6ubfK0bMDiXggkfXwYxcOfbM9xezXohvBbwwfMvSO48LyNjaNcjSSrxTCJEaL1afXWhwCN/gw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789529631; c=relaxed/simple; bh=TbBricvTVGAwifGX896eoMTqhERlhv8wQE0G/lmRl+8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Movlv/CWctsaAwsZtMraZtIm+D+BmvwbxOcFEGeeqZXrtFacoOlGUkvyJq6vQ2xyLFI5D0TBiqTNX+ZjNUrgQccbcE/DJ/r9KqG/MOv8+N4zO3kCVTRjbbgTlPdAKJZv8Peg2qrt78sWYgXflg9M0NXXzySpeaxCSr4Y46WxPzk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=MKcbk4LR; arc=none smtp.client-ip=74.125.228.27 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="MKcbk4LR" Received: by mail-pz2-f27.google.com with SMTP id 41be03b00d2f7-cc1cea50dc3so371850a12.3 for ; Tue, 15 Sep 2026 20:33:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1789529629; x=1790134429; 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:content-type; bh=B3+7MkmB6aG1HjinH/gRhRGDcVk6ogklV5sjoZ/OmL4=; b=MKcbk4LRq1vLBbvN8HsdYuQBofInYAVcQxlAr9t+UoSM7BsFxmSQZRlDYZmOXEb/pU B0vpe8DQjXWaIF3cV4wnif9EnDuGKrIVKbbgMA8OnKGoWs8ezBbZdsjX+aU/YOjcgNqu Rhexf9E5qY3q+VSD7QkVmGfzG01ZbP06FeVGU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789529629; x=1790134429; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=B3+7MkmB6aG1HjinH/gRhRGDcVk6ogklV5sjoZ/OmL4=; b=QlKV6Lkkw/Fd+s4d5na8mNP3q8BXJbKY8f2nkNNsLovkxHbAQaCHCrQ84YVmyAFal6 qmks4FxKbe1RUSaTl2yj5NK6/Rj43KgwOYbmQFFx6hGolHETeVWfd3dfKZarzvDeLjIn QiEVHWycjo3BsU7brtwzHA8ytxI+gVnsO3BNDQxPcBhkuxA2YqBdebipubFTnEftZXSe ywS0v6Agknfh3kYYZMBHBxC6JhaJUXPrFvP1vwlXBPK3u8fSUtMNyHf8p82ETKO0DwY7 IW/2DGNlQYY+SgElWvM8KV9jRGUO6q2ANCbk0ArLCJwtt/OQI6f38BAQnV2EqyFTY5Qo xGgw== X-Forwarded-Encrypted: i=1; AKwUvBxl+S0WR2y+QSifeb7390UiFHg+DmMGU5JHn6vQ2d05U+CWRTT8f52r05acOJhVnqO/pRc2mY78yRBO6Vc=@vger.kernel.org X-Gm-Message-State: AFuF++mvbb0F2nZqVHqJ/r1RZ4rqX1NB8QULM8qvGGFlJWcmBFOcrVzj ARNvZKp0kjyr1b34bbLtIo6S6eQkd8p2teKZC4Vo3RPllgMZap7+dtpyZ9cyS/G+IQ== X-Gm-Gg: AYBFou2ZwkGHvQ/9sdo3h1Abj6wiuXUYNP3TkFWyAR5DGKx58Mh4Pu60YKQPrPFlN/O ZyKsWKSL8F6N/c8UAshVP+wyEOFtO/maiDvcHYTX04cyHmPmiEdWehzJjVo6nscwi2wlwUMHThw zxUYs+gGEvAJYuv64qMWpFLO6zUYBANWgrWrmpwpwP/EHXp3It3camR7TOfwWF8THrT6LZ9PfCr OXFjHknVCKOjdL0yZkqRyTpBF2KNYVoidMCMzqLZTt8HQEGwBuH+yplm7nVGVq1CD2MjMN3zfUv pxgwARw2JnsMw31rYfYbECQ6MvdHPJeIPDCBPvpZ7Q6aJX3hPBW5WK3/ZIFs3EADglMkm7cNcua ZpB1CLUBp2DYulH+UtDh9z0rfXq2YhvpyJvKPxtJ1cJ5jSAdhmm/DQQEI7yrMqBvNf8U9EKVfW3 5EE9alv+Eiv5pegrwp6LTBFE8LLXbBzTZg/w6QtXVefV1ugwgXKpjvwWM1m0Fwhv6RGUvUUrx2S eVapJSZlhNWBEy2KkHMZnp0uwahnt/fKqDmPZQWdWlOrj0KwnJhiSgvjw== X-Received: by 2002:a17:90b:3b41:b0:38c:a59b:5189 with SMTP id 98e67ed59e1d1-39e1e48a416mr2215669a91.15.1789529629173; Tue, 15 Sep 2026 20:33:49 -0700 (PDT) Received: from wenst-7875.tpe.corp.google.com ([2a00:79e0:203d:7:1f62:7622:5d61:2578]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-39e1bbe3e62sm1833477a91.10.2026.09.15.20.33.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 20:33:48 -0700 (PDT) From: Chen-Yu Tsai To: Liu Ying , Laurentiu Palcu , Lucas Stach , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann Cc: Chen-Yu Tsai , David Airlie , Simona Vetter , linux-sunxi@lists.linux.dev, imx@lists.linux.dev, dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH RFT v2 3/5] drm/sun4i: layers: Fix VI buffer address for clipped offsets Date: Wed, 16 Sep 2026 11:33:24 +0800 Message-ID: <20260916033327.3054126-4-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.1032.g73a4cd73de-goog In-Reply-To: <20260916033327.3054126-1-wenst@chromium.org> References: <20260916033327.3054126-1-wenst@chromium.org> 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" Commit 79ac1c945ab8 ("drm/sun4i: layers: Use drm_fb_dma_get_gem_addr() to get display memory") dropped the code to calculate the framebuffer's DMA address in favor of drm_fb_dma_get_gem_addr(). This turned out to be wrong in a couple ways. The hardware is programmed with clipped dimensions, so it needs the buffer address to start at the clipped boundary. Moving to the helper negated the clipping. Also, when clipping on the left, the buffer address needs to start at the first pixel in the sub-sampling group even for the luma plane. The hardware handles the interpolation internally. Switch to the new drm_fb_dma_get_gem_clipped_addr(), which provides the buffer address starting at the clipped boundary. Calculate the intra-group offset and adjust the luma plane buffer address so that it points to the start of the sub-sampling group. Fixes: 79ac1c945ab8 ("drm/sun4i: layers: Use drm_fb_dma_get_gem_addr() to g= et display memory") Cc: # v7.1+, needs drm_fb_dma_get_gem_clipped_addr= () Signed-off-by: Chen-Yu Tsai --- This is an alternative to Jernej's original revert: https://lore.kernel.org/all/3980ea1aeb3f7fe8b4700e36560deeba3d050664.178577= 2659.git.jernej.skrabec@gmail.com/ --- drivers/gpu/drm/sun4i/sun8i_ui_layer.c | 2 +- drivers/gpu/drm/sun4i/sun8i_vi_layer.c | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/sun4i/sun8i_ui_layer.c b/drivers/gpu/drm/sun4i= /sun8i_ui_layer.c index bad102134726..530efae7e13c 100644 --- a/drivers/gpu/drm/sun4i/sun8i_ui_layer.c +++ b/drivers/gpu/drm/sun4i/sun8i_ui_layer.c @@ -130,7 +130,7 @@ static void sun8i_ui_layer_update_buffer(struct sun8i_l= ayer *layer, ch_base =3D sun8i_channel_base(layer); =20 /* Get the start of the displayed memory */ - dma_addr =3D drm_fb_dma_get_gem_addr(fb, state, 0); + dma_addr =3D drm_fb_dma_get_gem_clipped_addr(fb, state, 0); =20 /* Set the line width */ DRM_DEBUG_DRIVER("Layer line width: %d bytes\n", fb->pitches[0]); diff --git a/drivers/gpu/drm/sun4i/sun8i_vi_layer.c b/drivers/gpu/drm/sun4i= /sun8i_vi_layer.c index 2e9cda45c04e..7a1d5f1db037 100644 --- a/drivers/gpu/drm/sun4i/sun8i_vi_layer.c +++ b/drivers/gpu/drm/sun4i/sun8i_vi_layer.c @@ -205,7 +205,21 @@ static void sun8i_vi_layer_update_buffer(struct sun8i_= layer *layer, =20 for (i =3D 0; i < format->num_planes; i++) { /* Get the start of the displayed memory */ - dma_addr =3D drm_fb_dma_get_gem_addr(fb, state, i); + dma_addr =3D drm_fb_dma_get_gem_clipped_addr(fb, state, i); + + /* + * The mixer can handle odd offsets into sub-sampled YUV + * planes, but needs the address of the first pixel in each + * sub-sampled block. Adjust the luma buffer address backwards. + */ + if (i =3D=3D 0) { + u32 x_diff, y_diff; + + x_diff =3D (state->src.x1 >> 16) & (format->hsub - 1); + y_diff =3D (state->src.y1 >> 16) & (format->vsub - 1); + dma_addr -=3D y_diff * fb->pitches[i]; + dma_addr -=3D x_diff * format->cpp[i]; + } =20 /* Set the line width */ DRM_DEBUG_DRIVER("Layer %d. line width: %d bytes\n", --=20 2.55.0.1032.g73a4cd73de-goog From nobody Fri Sep 25 06:01:07 2026 Received: from mail-pj2-f42.google.com (mail-pj2-f42.google.com [74.125.227.170]) (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 2CBAD3ADBA4 for ; Wed, 16 Sep 2026 03:33:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.227.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789529635; cv=none; b=pb5LqsPla6fH4iWh+a+FaxhPZOJYoVIx2XP0Q7n154ydK5zYstHaG1vip6PW6NebTfD1f8x9xPs4Y5FJDDT7edFz9Ib8ts6ZXac0xHsJW+KIkzBeLlffhsJiuQOk5nt747bq6/GXB1lmpv2BKS5hnaNsD5PzA16Qkz5SFgwRgSY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789529635; c=relaxed/simple; bh=qbPaYJBirbvT7ihHw211bCHk6KPsVXJrTqNHUfJUxcw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UXXzzU4pXeJsmf4qWo5dLswq3InX9hQI1sevYPRg5wcXGs6vMEAM3mt2SJ1oSVaiylHhai67JI6mDifkffedPQu4uuQhSbrk4pkSi4BQLTbkFXyHy6yaXCshfBk8pk81m72Jk1uLtUzr1sljBdtYTTHlil0s0LXXbeOy5qOragA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=kvIesZli; arc=none smtp.client-ip=74.125.227.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="kvIesZli" Received: by mail-pj2-f42.google.com with SMTP id 98e67ed59e1d1-398cb5615deso433749a91.3 for ; Tue, 15 Sep 2026 20:33:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1789529633; x=1790134433; 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:content-type; bh=nb71HvzDE3B3FVkEVJ/TFE9xXljAPx+xdoqH1xLqTX8=; b=kvIesZliLjWNXzHIbikndyYWX6AZIuvM9NpRYKinjzwsZC1mYu3mREPcgUBO/ObfAa oQMpf0EvItVU3xxVhnwYmy+sJgq3lHONVft3CiuSptIMv8w/UeWjqxxqHY7EFNeN6q1b evBmEbb2uHhMvpclthnhlIz8Zg9Ae2/B5l5Yc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789529633; x=1790134433; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=nb71HvzDE3B3FVkEVJ/TFE9xXljAPx+xdoqH1xLqTX8=; b=uqOPLP7K5ChE5U/RaH+nq1fs06fNis+zk+mTVo8dyVn6iSjtvayRnE4nDz8HgnTdvB 0dgKvWfXx9C8VupN3faHBwHoZRTYV3PDCjrWIO+AcysXxsBxT58eiuG50a+3jCHzdC3w BLtJRTAGaeYDM+/MaNNvIikIqsY+v+58K/42KPJ0ckRDtyafXv4e9UbClufBOgvmjOWI DE5Cc6rtQBZmivV0/QrsepuDmVgT8kLvNU62/cOXeqRtimLIuam/y6NHig+JesrqGvVD awQsYNhN6O8uTh06k+c9iRUKneRnr2sKsBWaE9qNngNP1wy/eV/Cu6yDbqtC1Lt0GJNa s2dA== X-Forwarded-Encrypted: i=1; AKwUvBx7o3U+m6n3dU9gCGdW+hKXjzTl7DbZc6Q++6Rl0x3CpfVJwJsIqMBYcU5zyAsggw3Gm+dMh9YJbnIGHu8=@vger.kernel.org X-Gm-Message-State: AFuF++lJTLVIsr1Ea7rUdQqwWQR5f8b+Goo9Me6qtjt9zxUPebppDrFX sQOBYTVm+MKxOjdnBJGcLec1jzu6wSmxXpOeLyBYVhRUuXCWrKE+OfcZP9APFX7HvA== X-Gm-Gg: AYBFou3jgqq00FQglWjYQ5dWi9JeadLQb+Y7oHwQfphflJ1FUSoIPtqdvnvSO0Dd1o/ JJOAEzcI8+TdEmDy4gydrCkNDpibhJQc5xMOeFIVbC8DzftSx6WzrE5CNzzccJCX1nWp3HHPXzv xcGlFKetCAVaB2JHDY80EpJeBbxEJpsn4hudi582okoQtwqGRs3C3floZFbW4kMN4nzsSO8MmIl u5t3gbINRuCgz5eRNF2VSq1Bph2ZEakWFb+cxQpm9IidZIEoI7WFwySO3h2YviZWsPn8Dwf9wWK F2if9Lh0XSZgFT3tlB9ek2zlIkyLP0wGPdXV1dxfLPfOWLw9+WYe3b7SFr9NJddUAhMVqNuZwzq nXkNhQPKYAgDijxBt69xyoNm5jAX/Mbn3vS/c7vS2oIV259+Kpnga2x49FHeEK0TmxO8V6VIEzh 4WMwLCwt+uXbS8CFCvhQz/LdJvkm90ELl5zJYBE7f3nzfqYckOVMQnII8v9UQTCes1gVCTR/ume kH+YFA3Gy5nmkxerIon2/NzAmbAEac9LKQNeCm1O5liKuOMxyjO6dNOqA== X-Received: by 2002:a17:90b:582b:b0:39e:f1:b2de with SMTP id 98e67ed59e1d1-39e1e4c54fcmr2477670a91.20.1789529633211; Tue, 15 Sep 2026 20:33:53 -0700 (PDT) Received: from wenst-7875.tpe.corp.google.com ([2a00:79e0:203d:7:1f62:7622:5d61:2578]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-39e1bbe3e62sm1833477a91.10.2026.09.15.20.33.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 20:33:52 -0700 (PDT) From: Chen-Yu Tsai To: Liu Ying , Laurentiu Palcu , Lucas Stach , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann Cc: Chen-Yu Tsai , David Airlie , Simona Vetter , linux-sunxi@lists.linux.dev, imx@lists.linux.dev, dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH RFT v2 4/5] drm/imx/dc: plane: Switch to drm_fb_dma_get_gem_clipped_addr() Date: Wed, 16 Sep 2026 11:33:25 +0800 Message-ID: <20260916033327.3054126-5-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.1032.g73a4cd73de-goog In-Reply-To: <20260916033327.3054126-1-wenst@chromium.org> References: <20260916033327.3054126-1-wenst@chromium.org> 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" The hardware is programmed with clipped source and destination dimensions, but the framebuffer address is calculated using drm_fb_dma_get_gem_addr(), which uses the full source dimensions. This will not match the source offset if the top and/or left sides are clipped. Switch to the new drm_fb_dma_get_gem_clipped_addr(), which provides the buffer address starting at the clipped boundary. Fixes: 711a3b878366 ("drm/imx: Add i.MX8qxp Display Controller KMS") Cc: # Needs drm_fb_dma_get_gem_clipped_addr() Signed-off-by: Chen-Yu Tsai --- drivers/gpu/drm/imx/dc/dc-plane.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/imx/dc/dc-plane.c b/drivers/gpu/drm/imx/dc/dc-= plane.c index 62dd0576fadc..35eb5039f5ac 100644 --- a/drivers/gpu/drm/imx/dc/dc-plane.c +++ b/drivers/gpu/drm/imx/dc/dc-plane.c @@ -65,7 +65,7 @@ static int dc_plane_check_max_source_resolution(struct dr= m_plane_state *state) static int dc_plane_check_fb(struct drm_plane_state *state) { struct drm_framebuffer *fb =3D state->fb; - dma_addr_t baseaddr =3D drm_fb_dma_get_gem_addr(fb, state, 0); + dma_addr_t baseaddr =3D drm_fb_dma_get_gem_clipped_addr(fb, state, 0); =20 /* base address alignment */ if (baseaddr & 0x3) { @@ -146,7 +146,7 @@ dc_plane_atomic_update(struct drm_plane *plane, struct = drm_atomic_commit *state) src_w =3D drm_rect_width(&new_state->src) >> 16; src_h =3D drm_rect_height(&new_state->src) >> 16; =20 - baseaddr =3D drm_fb_dma_get_gem_addr(fb, new_state, 0); + baseaddr =3D drm_fb_dma_get_gem_clipped_addr(fb, new_state, 0); =20 fu_ops =3D dc_fu_get_ops(dplane->fu); =20 --=20 2.55.0.1032.g73a4cd73de-goog From nobody Fri Sep 25 06:01:07 2026 Received: from mail-pj2-f12.google.com (mail-pj2-f12.google.com [74.125.227.140]) (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 C94E93B19B9 for ; Wed, 16 Sep 2026 03:33:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.227.140 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789529639; cv=none; b=PVQhmJ6DcUxAv+aafvW83XbpEafxz7scITs2LJRMTuSOJN5DF1yeFB3/EDD1owHwKUFJZjh1DN+1s2oSSqmvJSPrqstAtQP+Ix06Ho4g602nVKWH/sT0nzHROAqr2K6CZ+ibNVDP7uggZYb2fpAesTW02BySKhow+vrn8Lqm8XY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789529639; c=relaxed/simple; bh=XSW9igf1s/bJdUF9oLEzsVWFCgbqu1FOjjmLMSk9d1c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sdOy9AyLPEXqrgvdUr+94RAenZnI9UIRdBIKNwnCsbU0VcFhZ49oM3TjCm4NixkO3Zf7ny2yw9PtRJiIaF5yqIMrCOVVBzHrwi3henQwHTefYBkNOFG4ob0K9a+jod2TQhFqN3EPJ12Q2Fe60ebYfO+5rtI6e/0VwlYFFkByExY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=ktpLK7lj; arc=none smtp.client-ip=74.125.227.140 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="ktpLK7lj" Received: by mail-pj2-f12.google.com with SMTP id d9443c01a7336-2d8fbef5018so5082145ad.0 for ; Tue, 15 Sep 2026 20:33:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1789529637; x=1790134437; 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:content-type; bh=kBFRPVKNIBD0KQtZ9pcxiREtmRb8PGXwbQL+UCfrWrI=; b=ktpLK7lj8sPrUXdQkdDMXfqONRmX/I0dGvYQ0aovXakXJZEXWn59gJhDYuPtoQuPoE /DSaZObWybgdZYgQVN2hyjc+4HHPNUPaxbkQkVZuLxB6IFjkgAvfKpS3jZgXCHLHU3kt B/rR51I6jfmH40k1mLCo4hpYf2fbnwlcAdSOc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789529637; x=1790134437; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=kBFRPVKNIBD0KQtZ9pcxiREtmRb8PGXwbQL+UCfrWrI=; b=LRHNvKZzNhl9KvQE2IcXoW4w9w1/TAIrj0eZy3C0s+HLs+A+WO0ds5xABVHLju9OpH OChRCSGuFEhDUySU5kk0pusJSxTGhTjlXHWd5h+v2mC47YpE0yCkbeAazRQseGn04UiI lrv+mQYfvNMDN+R5VCJm+knk97eoNcLe86ptLalNJLIeHps9iwQl5Q5cbB/P/LJbp8nZ AD/Lxa+wGAjKDVohH9Ccs8uH71TOLlcvxhWdvA4hJ2QdmKJw+/YPaFbeogxM4sOplBX8 FP3SABV1PLDV8LcKE8hMy9+Dv/bAaw9JKdk3Ssbx7U4ZIrgd/nqhfSUVW9XLdJB1v4Dj M3VQ== X-Forwarded-Encrypted: i=1; AKwUvBxIYRvWnc6iD0QN3SM4PuP/T8QNf9ER+E0sGTOGy23cD/M5+HSM3/GX1Z7fBX4EKKfWLqUCwy3AmeCtEwg=@vger.kernel.org X-Gm-Message-State: AFuF++mL+4kw352GlHqgnj4BQHYt3GliBljwvoVahwpspZIOF4c9ApRB 5eGg/mHHFpk1JCNUOw9Q9TZUQIxc2Xn7/DIVG6LTfvIgR62578+vA26mJA6Kf9+wEw== X-Gm-Gg: AYBFou3X05mBRV9o7qneD14/qTT7OIDPWTZXCVk1zEQna36TPi9HIqKD6WMB7IVcMcB R90QrpqQtJdJGHr7XtgbUttuqNoMWPhjmRoT52L45V1kVFnjGA5b4NYb7lhGiZB4Y35rAB05cxT MtJY2ti3w/ZlcxrlL8TlBzZRkAUUzDm34snWKDJzK+xRqQgWCu5n5wP2M64dbGuw94ut+Tc+rSJ fqP6IE0RGyh18/idE4v7Aj1xgqBQY9GvOJtyGKNkrdLdnwiMMSIcvVLZu+6h1tcL72ipmxG2OwG Iet4V/ADfXxNaZZfURtWr8y/hwEydwrlRDyJR/ZmtDCw6PKowbl9IgqASbWw2dR6kuIJzCXmR1s 0AcEFvvj+m2bmnvRiQo1AY0X6pZ9euwqNYNbRJm7hdLJbyVHrVgg3vy9RwTgw4M5oTL5tw6pFfc AAeKyrNyqqRrEcNAfcwXiSF1+q/XSOdewQAnl7x42IPc1K9hf5QOrYd0cJ5rttedj6C9Y73V2mv d4DSUcaJn/O23Ed1qH1URJ+CU/E87BOl9HDiCpoJ/qlu6cFUZSWEXuErg== X-Received: by 2002:a17:90b:4c49:b0:39d:fd60:caba with SMTP id 98e67ed59e1d1-39e1e485dddmr2368694a91.14.1789529637188; Tue, 15 Sep 2026 20:33:57 -0700 (PDT) Received: from wenst-7875.tpe.corp.google.com ([2a00:79e0:203d:7:1f62:7622:5d61:2578]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-39e1bbe3e62sm1833477a91.10.2026.09.15.20.33.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 20:33:56 -0700 (PDT) From: Chen-Yu Tsai To: Liu Ying , Laurentiu Palcu , Lucas Stach , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann Cc: Chen-Yu Tsai , David Airlie , Simona Vetter , linux-sunxi@lists.linux.dev, imx@lists.linux.dev, dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH RFT v2 5/5] drm/imx/dcss: plane: Switch to drm_fb_dma_get_gem_clipped_addr() Date: Wed, 16 Sep 2026 11:33:26 +0800 Message-ID: <20260916033327.3054126-6-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.1032.g73a4cd73de-goog In-Reply-To: <20260916033327.3054126-1-wenst@chromium.org> References: <20260916033327.3054126-1-wenst@chromium.org> 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" The i.MX DCSS driver is open coding drm_fb_dma_get_gem_clipped_addr(), with only a slight difference of rounding down the X offset for the first plane if the format is packed, sub-sampled YUV. This is likely to correct the buffer address to the first pixel of the 2-pixel group. Otherwise the hardware will start the scan-out from the second pixel, which leads to the U/V components getting swapped around, and the chroma component of the next pixel group being used. Switch to drm_fb_dma_get_gem_clipped_addr(), and offset the address by a pixel if the X offset is odd. Signed-off-by: Chen-Yu Tsai --- drivers/gpu/drm/imx/dcss/dcss-plane.c | 34 +++++++++++---------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/drivers/gpu/drm/imx/dcss/dcss-plane.c b/drivers/gpu/drm/imx/dc= ss/dcss-plane.c index 303e93fd036c..580d9cfb4053 100644 --- a/drivers/gpu/drm/imx/dcss/dcss-plane.c +++ b/drivers/gpu/drm/imx/dcss/dcss-plane.c @@ -219,28 +219,22 @@ static void dcss_plane_atomic_set_base(struct dcss_pl= ane *dcss_plane) struct dcss_dev *dcss =3D plane->dev->dev_private; struct drm_framebuffer *fb =3D state->fb; const struct drm_format_info *format =3D fb->format; - struct drm_gem_dma_object *dma_obj =3D drm_fb_dma_get_gem_obj(fb, 0); unsigned long p1_ba =3D 0, p2_ba =3D 0; =20 - if (!format->is_yuv || - format->format =3D=3D DRM_FORMAT_NV12 || - format->format =3D=3D DRM_FORMAT_NV21) - p1_ba =3D dma_obj->dma_addr + fb->offsets[0] + - fb->pitches[0] * (state->src.y1 >> 16) + - format->char_per_block[0] * (state->src.x1 >> 16); - else if (format->format =3D=3D DRM_FORMAT_UYVY || - format->format =3D=3D DRM_FORMAT_VYUY || - format->format =3D=3D DRM_FORMAT_YUYV || - format->format =3D=3D DRM_FORMAT_YVYU) - p1_ba =3D dma_obj->dma_addr + fb->offsets[0] + - fb->pitches[0] * (state->src.y1 >> 16) + - 2 * format->char_per_block[0] * (state->src.x1 >> 17); - - if (format->format =3D=3D DRM_FORMAT_NV12 || - format->format =3D=3D DRM_FORMAT_NV21) - p2_ba =3D dma_obj->dma_addr + fb->offsets[1] + - (((fb->pitches[1] >> 1) * (state->src.y1 >> 17) + - (state->src.x1 >> 17)) << 1); + p1_ba =3D drm_fb_dma_get_gem_clipped_addr(fb, state, 0); + + /* + * TODO fix address until helpers know packed, sub-sampled YUV format blo= ck size + * + * The buffer address for packed, sub-sampled YUV formats such as DRM_FOR= MAT_UYVY + * need to be on the first pixel of each pixel group or block. Otherwise = the first + * pixel of the next pixel group is read and the U/V values get swapped a= round. + */ + if (drm_format_info_is_yuv_packed(format)) + p1_ba -=3D ((state->src.x1 >> 16) & 1) * format->cpp[0]; + + if (format->num_planes > 1) + p2_ba =3D drm_fb_dma_get_gem_clipped_addr(fb, state, 1); =20 dcss_dpr_addr_set(dcss->dpr, dcss_plane->ch_num, p1_ba, p2_ba, fb->pitches[0]); --=20 2.55.0.1032.g73a4cd73de-goog