From nobody Sat Jun 20 07:11:38 2026 Received: from mail-qv1-f49.google.com (mail-qv1-f49.google.com [209.85.219.49]) (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 CB43C3AE712 for ; Tue, 5 May 2026 04:28:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777955290; cv=none; b=WPAWWaayzIEE1sW24hqtacP4WBlyXd8aLKFKDuyYMYvGgXqtwImPKpncj68SsSobNPD+L4wo5wktWI67VKxQyEj6SE1ew4aXU5CgRyVc6YCrBAUjv6y2tl5PHjpTkNaW2gqFq6gOEwYqyzAi5JKp2s/3BtGe/TWOEiVqFfkP/6I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777955290; c=relaxed/simple; bh=bSWaS1SZKIwjF7pnVqKWMfvxY1UVAxbcBCgWegJVVmk=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=LZGsVU62kCRWZyj5oEigu/DpB8H0/sZ0SIlIH1kzsqVWYI+As+AVejYSaN25n1MfGk5ief9BAE8LB52an3E2mxhGacT3XYDGKDHunQrurad9bAWzHMQLixbSENRBzo4Cg6IyYGmcxhIXHLjj3nfkKQ4Qm5fukzacybBkbAijqLs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=fail (p=none dis=none) header.from=debian.org; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=NU0Ojpuc; arc=none smtp.client-ip=209.85.219.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=fail (p=none dis=none) header.from=debian.org 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="NU0Ojpuc" Received: by mail-qv1-f49.google.com with SMTP id 6a1803df08f44-8b4aeddfacaso51958356d6.0 for ; Mon, 04 May 2026 21:28:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777955288; x=1778560088; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:sender:from:to:cc:subject:date:message-id:reply-to; bh=mWoD3Hi1a+L1RGrGj0FkLyIqbiSOhVi2o2xdns78woA=; b=NU0OjpucsJByygzOCmRBQ4MZEZn+VWyaJQGRZNRdESXWN8xivisV2rw++SB5xMKkuS 8ux0v6+Lr/CsDTwmklUy/230/L3iVW8D7CpMfy4gY1BE/iOhbl/Y74DWDlAhuB2LFhUv IqKAXncITH9glpPB1eX39VzD45dO25rb10/velodQtvwg2PYG0KuL3Jfyjr8liPVSE7h Owj71dqGzpHIIxh5Xwc5RiT/OnTDQLNGHVjJlWrpKQe4w//kw5qrXx0CG5yycnYfrL+9 T/cdb3ArXMSWzhREGqy6qJdHBV2hzLTkXGQRskKkD8qc50Pe6lABDun90hsmlX0hDj1v hL4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777955288; x=1778560088; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:sender:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=mWoD3Hi1a+L1RGrGj0FkLyIqbiSOhVi2o2xdns78woA=; b=JFHnpol577TQ6KB6RyU3q9ulvbTfGFL/cXvZgS+XAYYElJvRa3HZdQrJX1Xxl92UOn 18W3gxTGFuTJueAJKTwECzBWH3mqdcaUevR4udGwYOOYFqJ5u4X1puaitIGEWztCcdAo WTX1Ojue75Fgqx/ZKnAV1cgQhZtE5jMEL3vtns8VSlRvxvIAQ8zFqRS7gjuJmQg2/6VC R4xPSJ8ddN0qTUQByT0ahpAv6XBMs/imShfyp+CuzFgXyiK4GU6A0NieB+QtruW0AafH aReUL6HFrNl7zEo7Hc6+XRA58BQ59SqGi20V1QL7obkVEN1pArAkH6SSlmegeRDjomyY 4LlQ== X-Forwarded-Encrypted: i=1; AFNElJ+btAcvCUyURvRuAnWXUvCZDNMmfmz3tOUiF10xrOIUR6p+ZbUmx4sAgbu+AbzHd+7s+O9lGV8ZcR4lfpg=@vger.kernel.org X-Gm-Message-State: AOJu0YzkygcYM9k5VNO938XYqLKiT/oYazhYjZaK0cGUqkW9Ta/SMlLt 7koqYkLcmD1tjFj9IZJfPFc/cDwmGqYntMK/EfkRa16T4yuZ8dvn9iFs X-Gm-Gg: AeBDiety08gB6iIzYjhOPDOJNc30RGU8ECcNPFnlExmep/VPTHcnx4n1OuODVXIAm8f cs4fReQhWasNf2S+ngo39gF9GapeXnRbJGklud2anLfzh/VRgRVUxedj2rsiiD0DeKiVfKZ79hh LRMDBYyBEBDDDNn/jmAXJMm7O9RSspy/76dRUmVtqFL5R9q9JjuwUYfKyLWojHCz1jPaanEG04b vYKvEc7Vf3fUQGWHEcwxoN6v7bnuIPH0ZdirrKpDgBqEoz2bVhndassG7Zk4m8YFMAieHof4E4G c8QpRE4maBC8HknCPZHyweT1P8vXHj/OEDlcAyzuFhhW36DP3akdSQUZCbWJ6naOq3iOjVAQBY2 l/ANQn2eEfYfEGc5z+KywfjRSoaopBMyW4mu39nJ8N0ooe+z4fLaP8Ih0tJQUW1Qjn3mT8NM5Tg Z70ULPbLB/3DtD7wpxMhLO5VLFrluui+Hhe+riPYEpk1RoRdjn18jIidBZqg== X-Received: by 2002:a05:6214:4e81:b0:89c:d931:62ee with SMTP id 6a1803df08f44-8b668922e33mr181752006d6.34.1777955287738; Mon, 04 May 2026 21:28:07 -0700 (PDT) Received: from 96364762d92a.hsd1.ct.comcast.net ([73.100.172.13]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-8b53d83114fsm135811266d6.48.2026.05.04.21.28.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 May 2026 21:28:07 -0700 (PDT) Sender: Dominique Belhachemi From: Dominique Belhachemi To: Icenowy Zheng Cc: Maxime Ripard , Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter , Paul Cercueil , Michal Wilczynski , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: [PATCH] drm: verisilicon: support non-coherent DMA framebuffers Date: Tue, 5 May 2026 04:26:31 +0000 Message-ID: <20260505042631.1916555-1-domibel@debian.org> X-Mailer: git-send-email 2.53.0 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" Wire up the standard non-coherent path matching the ingenic DRM driver. Tested on StarFive JH7110 (VisionFive 2 v1.3B). Signed-off-by: Dominique Belhachemi --- drivers/gpu/drm/verisilicon/vs_drm.c | 31 +++++++++++++++++-- drivers/gpu/drm/verisilicon/vs_drm.h | 7 +++++ .../gpu/drm/verisilicon/vs_primary_plane.c | 11 ++++++- 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/verisilicon/vs_drm.c b/drivers/gpu/drm/verisil= icon/vs_drm.c index fd259d53f49f..52d8749445df 100644 --- a/drivers/gpu/drm/verisilicon/vs_drm.c +++ b/drivers/gpu/drm/verisilicon/vs_drm.c @@ -4,7 +4,7 @@ */ =20 #include -#include +#include #include #include #include @@ -49,6 +49,31 @@ static int vs_gem_dumb_create(struct drm_file *file_priv, =20 DEFINE_DRM_GEM_FOPS(vs_drm_driver_fops); =20 +static struct drm_gem_object *vs_gem_create_object(struct drm_device *drm, + size_t size) +{ + struct drm_gem_dma_object *obj; + + obj =3D kzalloc_obj(*obj); + if (!obj) + return ERR_PTR(-ENOMEM); + + obj->map_noncoherent =3D to_vs_drm_dev(drm)->noncoherent; + + return &obj->base; +} + +static struct drm_framebuffer * +vs_gem_fb_create(struct drm_device *drm, struct drm_file *file, + const struct drm_format_info *info, + const struct drm_mode_fb_cmd2 *mode_cmd) +{ + if (to_vs_drm_dev(drm)->noncoherent) + return drm_gem_fb_create_with_dirty(drm, file, info, mode_cmd); + + return drm_gem_fb_create(drm, file, info, mode_cmd); +} + static const struct drm_driver vs_drm_driver =3D { .driver_features =3D DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC, .fops =3D &vs_drm_driver_fops, @@ -58,12 +83,13 @@ static const struct drm_driver vs_drm_driver =3D { .minor =3D DRIVER_MINOR, =20 /* GEM Operations */ + .gem_create_object =3D vs_gem_create_object, DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(vs_gem_dumb_create), DRM_FBDEV_DMA_DRIVER_OPS, }; =20 static const struct drm_mode_config_funcs vs_mode_config_funcs =3D { - .fb_create =3D drm_gem_fb_create, + .fb_create =3D vs_gem_fb_create, .atomic_check =3D drm_atomic_helper_check, .atomic_commit =3D drm_atomic_helper_commit, }; @@ -98,6 +124,7 @@ int vs_drm_initialize(struct vs_dc *dc, struct platform_= device *pdev) =20 drm =3D &vdrm->base; vdrm->dc =3D dc; + vdrm->noncoherent =3D !of_dma_is_coherent(dev->of_node); dc->drm_dev =3D vdrm; =20 ret =3D drmm_mode_config_init(drm); diff --git a/drivers/gpu/drm/verisilicon/vs_drm.h b/drivers/gpu/drm/verisil= icon/vs_drm.h index 606338206a42..17704cd0df1d 100644 --- a/drivers/gpu/drm/verisilicon/vs_drm.h +++ b/drivers/gpu/drm/verisilicon/vs_drm.h @@ -18,8 +18,15 @@ struct vs_drm_dev { =20 struct vs_dc *dc; struct vs_crtc *crtcs[VSDC_MAX_OUTPUTS]; + + bool noncoherent; }; =20 +static inline struct vs_drm_dev *to_vs_drm_dev(struct drm_device *drm) +{ + return container_of(drm, struct vs_drm_dev, base); +} + int vs_drm_initialize(struct vs_dc *dc, struct platform_device *pdev); void vs_drm_finalize(struct vs_dc *dc); void vs_drm_shutdown_handler(struct vs_dc *dc); diff --git a/drivers/gpu/drm/verisilicon/vs_primary_plane.c b/drivers/gpu/d= rm/verisilicon/vs_primary_plane.c index e8fcb5958615..0049737f492b 100644 --- a/drivers/gpu/drm/verisilicon/vs_primary_plane.c +++ b/drivers/gpu/drm/verisilicon/vs_primary_plane.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -16,8 +17,9 @@ #include =20 #include "vs_crtc.h" -#include "vs_plane.h" #include "vs_dc.h" +#include "vs_drm.h" +#include "vs_plane.h" #include "vs_primary_plane_regs.h" =20 static int vs_primary_plane_atomic_check(struct drm_plane *plane, @@ -86,6 +88,8 @@ static void vs_primary_plane_atomic_disable(struct drm_pl= ane *plane, static void vs_primary_plane_atomic_update(struct drm_plane *plane, struct drm_atomic_state *atomic_state) { + struct drm_plane_state *old_state =3D drm_atomic_get_old_plane_state(atom= ic_state, + plane); struct drm_plane_state *state =3D drm_atomic_get_new_plane_state(atomic_s= tate, plane); struct drm_framebuffer *fb =3D state->fb; @@ -101,6 +105,8 @@ static void vs_primary_plane_atomic_update(struct drm_p= lane *plane, return; } =20 + drm_fb_dma_sync_non_coherent(plane->dev, old_state, state); + vcrtc =3D drm_crtc_to_vs_crtc(crtc); output =3D vcrtc->id; dc =3D vcrtc->dc; @@ -169,5 +175,8 @@ struct drm_plane *vs_primary_plane_init(struct drm_devi= ce *drm_dev, struct vs_dc =20 drm_plane_helper_add(plane, &vs_primary_plane_helper_funcs); =20 + if (to_vs_drm_dev(drm_dev)->noncoherent) + drm_plane_enable_fb_damage_clips(plane); + return plane; } --=20 2.53.0