From nobody Fri Dec 19 13:49:44 2025 Received: from relay5-d.mail.gandi.net (relay5-d.mail.gandi.net [217.70.183.197]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D19E319DFA3 for ; Tue, 27 Aug 2024 10:01:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724752922; cv=none; b=YjwwPNI0GZYiF6aejC72X5qU32+YyIOpt8Hzm4gVJ2dGQStlQHowrr4CS0bIE2AraY2tek2HW6P91dlZMq4GERBkTn/+gahGe7rF13k8XJpEqSVWEvG5J+reG7kj4D05zlf/ggvVeRhLZR4QVj0dvHIGj+G5saEg/tRcwCb6xeA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724752922; c=relaxed/simple; bh=b5zfZhgdJRj84RHHwh0TEbI8bfN8VfBp90V91fl07Zo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YOgJvlQ3sIY/Bo20t7AaBWJCbQlUvdIRFvpLQg+4LJHBux4zbZqmCoSFsJqFw7n55z/qYfEID8DuzrTytGAnyYO0UPH90LHscERf14IJ9rmTIKgBd0/umaCPyceulQg2aTN1tcIXuZrxSZLTYy8QNHosREQ7FWUKgdjEn4xR7zY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=nTDuvTTw; arc=none smtp.client-ip=217.70.183.197 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="nTDuvTTw" Received: by mail.gandi.net (Postfix) with ESMTPSA id 7D3271C0012; Tue, 27 Aug 2024 10:01:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1724752918; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=nab9sxyGuNbJf2fwXC6yPovjq0ddYSUOgBR9X9KtRm4=; b=nTDuvTTwoNbNg3wmmrqgX3ZD1O3vmeezJ0k+zGjlDJWHO0ezmi9BqvLFZt7+XamE33qeCU kYPfNprPBPXBKHt8ZjBkG1jTE8SoRnCriHPtvX1rhbuoLNUAySFxkug4b5EzeFW9Lp4jD1 0mrY3OfRbU50vxuOfOzshnifsGkYXHKiR5lCl6Cfk9V/to8eyhUfByWZGmpUAc1qKep5T2 kYqCREYFZzO7nHAeTx8GXCEeDr8jzCl5mC3d42fEvzjZ+DONaZfgvsCz/Idn8C8SQTlvJ7 UU++oJjOc3LKLfuh+8BKQsMyy4wdX48HCiygbFa9bMRpB/nNT4Np5vbfNeqjkA== From: Louis Chauvet Date: Tue, 27 Aug 2024 11:57:40 +0200 Subject: [PATCH v2 5/6] drm/vkms: Switch to managed for CRTC Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20240827-google-vkms-managed-v2-5-f41104553aeb@bootlin.com> References: <20240827-google-vkms-managed-v2-0-f41104553aeb@bootlin.com> In-Reply-To: <20240827-google-vkms-managed-v2-0-f41104553aeb@bootlin.com> To: Rodrigo Siqueira , Melissa Wen , =?utf-8?q?Ma=C3=ADra_Canal?= , Haneen Mohammed , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie Cc: dri-devel@lists.freedesktop.org, arthurgrillo@riseup.net, linux-kernel@vger.kernel.org, jeremie.dautheribes@bootlin.com, miquel.raynal@bootlin.com, thomas.petazzoni@bootlin.com, seanpaul@google.com, nicolejadeyee@google.com, Louis Chauvet X-Mailer: b4 0.15-dev X-Developer-Signature: v=1; a=openpgp-sha256; l=11461; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=b5zfZhgdJRj84RHHwh0TEbI8bfN8VfBp90V91fl07Zo=; b=owEBbQKS/ZANAwAIASCtLsZbECziAcsmYgBmzaQP430g6cQamYKLckg34XmmAfEpSxn3+QXD4 /dBo9spv6iJAjMEAAEIAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCZs2kDwAKCRAgrS7GWxAs 4vDGD/9RVHCp3789th6qbz6hd8Y+12n1amBCApowq8uw6H9VWOxh1KJhcxV/U1a8Wwu8mRSEFYl PGh3m/RQG0eYsY+evQLXed1Tc3T78KFV36f/Oiz1XydM7r4UenTrkG4VP4QmXKwJ32XZ6O2UtQR Le+ddAW2U9edfU3xp+1XkmfTp5EUnF99AJChL435qBvb6Gke69Cm+sl5407esUlBCyrC0HXjEPz vpk3P2JTSdp0W1hCJsrYM71vPyUILyBfl0sKHSTVJQe0VMVdgCPixIeFBHHXk65wkli2l4xvtQ0 AgoxULVWxdXplEesG2RrYVyvRcqWcN093hsKsyRTqjw/N6j8LiFVGjCKD/CcAbzaacArL8dQKLO nWrHDzbUEENfrhc9DEHTzX2zeJn5YrsDcDmbJG7F4uD3HpcYajXePuxJdGNfitDq+Wr3HMHBsn7 /YmoHrfrtRkgXKvZrKVMRuIkD70k/w5vLtwDnw4s3fDtBTJMS3qgyaa+qqYb/jwlwfB0ZWbtubu RvUhDYknjWOAu+DzZUOpE9+EKHrujFDSU8IVEHBsR9N8DPl0vSdNxa8ln1RNgi+p6tAvf7j4Jwx Xwn/Pv4Ev2kGOVo+jgGhTwBFjADhinczioqfBhqZK/KG/rSIFf2JOKvZvOb488M79RibTPwReLt L9kLLpxKgitF9IQ== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-GND-Sasl: louis.chauvet@bootlin.com The current VKMS driver uses non-managed function to create CRTCs. It is not an issue yet, but in order to support multiple devices easily, convert this code to use drm and device managed helpers. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_crtc.c | 40 +++++++++++++------- drivers/gpu/drm/vkms/vkms_drv.c | 9 ----- drivers/gpu/drm/vkms/vkms_drv.h | 7 ++-- drivers/gpu/drm/vkms/vkms_output.c | 69 +++++++++++++++----------------= ---- drivers/gpu/drm/vkms/vkms_writeback.c | 14 +++---- 5 files changed, 65 insertions(+), 74 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_c= rtc.c index 2bf733a1b9f0..ff55099c86ce 100644 --- a/drivers/gpu/drm/vkms/vkms_crtc.c +++ b/drivers/gpu/drm/vkms/vkms_crtc.c @@ -6,6 +6,7 @@ #include #include #include +#include =20 #include "vkms_drv.h" =20 @@ -270,30 +271,41 @@ static const struct drm_crtc_helper_funcs vkms_crtc_h= elper_funcs =3D { .atomic_disable =3D vkms_crtc_atomic_disable, }; =20 -int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc, - struct drm_plane *primary, struct drm_plane *cursor) +static void vkms_crtc_destroy_workqueue(struct drm_device *dev, void *raw_= vkms_crtc) { - struct vkms_crtc *vkms_crtc =3D drm_crtc_to_vkms_crtc(crtc); + struct vkms_crtc *vkms_crtc =3D raw_vkms_crtc; + + destroy_workqueue(vkms_crtc->composer_workq); +} + +struct vkms_crtc *vkms_crtc_init(struct vkms_device *vkmsdev, struct drm_p= lane *primary, + struct drm_plane *cursor) +{ + struct drm_device *dev =3D &vkmsdev->drm; + struct vkms_crtc *vkms_crtc; int ret; =20 - ret =3D drmm_crtc_init_with_planes(dev, crtc, primary, cursor, - &vkms_crtc_funcs, NULL); - if (ret) { - DRM_ERROR("Failed to init CRTC\n"); - return ret; + vkms_crtc =3D drmm_crtc_alloc_with_planes(dev, struct vkms_crtc, base, pr= imary, cursor, + &vkms_crtc_funcs, NULL); + if (IS_ERR(vkms_crtc)) { + DRM_DEV_ERROR(vkmsdev->drm.dev, "Failed to init CRTC\n"); + return vkms_crtc; } + drm_crtc_helper_add(&vkms_crtc->base, &vkms_crtc_helper_funcs); =20 - drm_crtc_helper_add(crtc, &vkms_crtc_helper_funcs); - - drm_mode_crtc_set_gamma_size(crtc, VKMS_LUT_SIZE); - drm_crtc_enable_color_mgmt(crtc, 0, false, VKMS_LUT_SIZE); + drm_mode_crtc_set_gamma_size(&vkms_crtc->base, VKMS_LUT_SIZE); + drm_crtc_enable_color_mgmt(&vkms_crtc->base, 0, false, VKMS_LUT_SIZE); =20 spin_lock_init(&vkms_crtc->lock); spin_lock_init(&vkms_crtc->composer_lock); =20 vkms_crtc->composer_workq =3D alloc_ordered_workqueue("vkms_composer", 0); if (!vkms_crtc->composer_workq) - return -ENOMEM; + return ERR_PTR(-ENOMEM); + + ret =3D drmm_add_action_or_reset(dev, vkms_crtc_destroy_workqueue, vkms_c= rtc); + if (ret) + return ERR_PTR(ret); =20 - return ret; + return vkms_crtc; } diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_dr= v.c index f2818374f5c9..5282f71b50a6 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.c +++ b/drivers/gpu/drm/vkms/vkms_drv.c @@ -53,14 +53,6 @@ MODULE_PARM_DESC(enable_overlay, "Enable/Disable overlay= support"); =20 DEFINE_DRM_GEM_FOPS(vkms_driver_fops); =20 -static void vkms_release(struct drm_device *dev) -{ - struct vkms_device *vkms =3D drm_device_to_vkms_device(dev); - - if (vkms->crtc.composer_workq) - destroy_workqueue(vkms->crtc.composer_workq); -} - static void vkms_atomic_commit_tail(struct drm_atomic_state *old_state) { struct drm_device *dev =3D old_state->dev; @@ -109,7 +101,6 @@ static const struct drm_debugfs_info vkms_config_debugf= s_list[] =3D { =20 static const struct drm_driver vkms_driver =3D { .driver_features =3D DRIVER_MODESET | DRIVER_ATOMIC | DRIVER_GEM, - .release =3D vkms_release, .fops =3D &vkms_driver_fops, DRM_GEM_SHMEM_DRIVER_OPS, =20 diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_dr= v.h index 3501cd9401d5..cff2e0686c04 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.h +++ b/drivers/gpu/drm/vkms/vkms_drv.h @@ -126,7 +126,6 @@ struct vkms_config { struct vkms_device { struct drm_device drm; struct platform_device *platform; - struct vkms_crtc crtc; const struct vkms_config *config; }; =20 @@ -143,8 +142,8 @@ struct vkms_device { container_of(target, struct vkms_plane_state, base.base) =20 /* CRTC */ -int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc, - struct drm_plane *primary, struct drm_plane *cursor); +struct vkms_crtc *vkms_crtc_init(struct vkms_device *vkmsdev, struct drm_p= lane *primary, + struct drm_plane *cursor); =20 int vkms_output_init(struct vkms_device *vkmsdev, int index); =20 @@ -165,6 +164,6 @@ void vkms_compose_row(struct line_buffer *stage_buffer,= struct vkms_plane_state void vkms_writeback_row(struct vkms_writeback_job *wb, const struct line_b= uffer *src_buffer, int y); =20 /* Writeback */ -int vkms_enable_writeback_connector(struct vkms_device *vkmsdev); +int vkms_enable_writeback_connector(struct vkms_device *vkmsdev, struct vk= ms_crtc *vkms_crtc); =20 #endif /* _VKMS_DRV_H_ */ diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms= _output.c index cd506dcfd50f..0c585e48fa01 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -27,42 +27,31 @@ static const struct drm_connector_helper_funcs vkms_con= n_helper_funcs =3D { .get_modes =3D vkms_conn_get_modes, }; =20 -static int vkms_add_overlay_plane(struct vkms_device *vkmsdev, int index, - struct drm_crtc *crtc) -{ - struct vkms_plane *overlay; - - overlay =3D vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_OVERLAY, index); - if (IS_ERR(overlay)) - return PTR_ERR(overlay); - - if (!overlay->base.possible_crtcs) - overlay->base.possible_crtcs =3D drm_crtc_mask(crtc); - - return 0; -} - int vkms_output_init(struct vkms_device *vkmsdev, int index) { - struct vkms_crtc *vkms_crtc =3D &vkmsdev->crtc; + struct vkms_plane *primary, *cursor, *overlay =3D NULL; struct drm_device *dev =3D &vkmsdev->drm; struct drm_connector *connector; struct drm_encoder *encoder; - struct drm_crtc *crtc =3D &vkms_crtc->base; - struct vkms_plane *primary, *cursor =3D NULL; - int ret; - int writeback; + struct vkms_crtc *crtc; unsigned int n; + int ret; =20 + /* + * Initialize used plane. One primary plane is required to perform the co= mposition. + * + * The overlay and cursor planes are not mandatory, but can be used to pe= rform complex + * composition. + */ primary =3D vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_PRIMARY, index); if (IS_ERR(primary)) return PTR_ERR(primary); =20 if (vkmsdev->config->overlay) { for (n =3D 0; n < NUM_OVERLAY_PLANES; n++) { - ret =3D vkms_add_overlay_plane(vkmsdev, index, crtc); - if (ret) - return ret; + overlay =3D vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_OVERLAY, index); + if (IS_ERR(overlay)) + return PTR_ERR(overlay); } } =20 @@ -72,22 +61,24 @@ int vkms_output_init(struct vkms_device *vkmsdev, int i= ndex) return PTR_ERR(cursor); } =20 - ret =3D vkms_crtc_init(dev, crtc, &primary->base, &cursor->base); - if (ret) - return ret; + crtc =3D vkms_crtc_init(vkmsdev, &primary->base, + cursor ? &cursor->base : NULL); + if (IS_ERR(crtc)) { + DRM_ERROR("Failed to allocate CRTC\n"); + return PTR_ERR(crtc); + } =20 connector =3D drmm_kzalloc(dev, sizeof(*connector), GFP_KERNEL); if (!connector) { DRM_ERROR("Failed to allocate connector\n"); - ret =3D -ENOMEM; - goto err_connector; + return -ENOMEM; } =20 ret =3D drmm_connector_init(dev, connector, &vkms_connector_funcs, DRM_MODE_CONNECTOR_VIRTUAL, NULL); if (ret) { DRM_ERROR("Failed to init connector\n"); - goto err_connector; + return ret; } =20 drm_connector_helper_add(connector, &vkms_conn_helper_funcs); @@ -95,34 +86,34 @@ int vkms_output_init(struct vkms_device *vkmsdev, int i= ndex) encoder =3D drmm_kzalloc(dev, sizeof(*encoder), GFP_KERNEL); if (!encoder) { DRM_ERROR("Failed to allocate encoder\n"); - ret =3D -ENOMEM; - goto err_connector; + return -ENOMEM; } =20 ret =3D drmm_encoder_init(dev, encoder, NULL, DRM_MODE_ENCODER_VIRTUAL, N= ULL); if (ret) { DRM_ERROR("Failed to init encoder\n"); - goto err_connector; + return ret; } - encoder->possible_crtcs =3D 1; =20 + encoder->possible_crtcs =3D drm_crtc_mask(&crtc->base); + + /* Attach the encoder and the connector */ ret =3D drm_connector_attach_encoder(connector, encoder); if (ret) { DRM_ERROR("Failed to attach connector to encoder\n"); return ret; } =20 + /* Initialize the writeback component */ if (vkmsdev->config->writeback) { - writeback =3D vkms_enable_writeback_connector(vkmsdev); - if (writeback) + ret =3D vkms_enable_writeback_connector(vkmsdev, crtc); + if (ret) { DRM_ERROR("Failed to init writeback connector\n"); + return ret; + } } =20 drm_mode_config_reset(dev); =20 return 0; - -err_connector: - drm_crtc_cleanup(crtc); - return ret; } diff --git a/drivers/gpu/drm/vkms/vkms_writeback.c b/drivers/gpu/drm/vkms/v= kms_writeback.c index e055ad41241b..18aed20cd733 100644 --- a/drivers/gpu/drm/vkms/vkms_writeback.c +++ b/drivers/gpu/drm/vkms/vkms_writeback.c @@ -106,7 +106,7 @@ static void vkms_wb_cleanup_job(struct drm_writeback_co= nnector *connector, struct drm_writeback_job *job) { struct vkms_writeback_job *vkmsjob =3D job->priv; - struct vkms_device *vkmsdev; + struct vkms_crtc *vkms_crtc =3D container_of(connector, struct vkms_crtc,= wb_connector); =20 if (!job->fb) return; @@ -115,8 +115,7 @@ static void vkms_wb_cleanup_job(struct drm_writeback_co= nnector *connector, =20 drm_framebuffer_put(vkmsjob->wb_frame_info.fb); =20 - vkmsdev =3D drm_device_to_vkms_device(job->fb->dev); - vkms_set_composer(&vkmsdev->crtc, false); + vkms_set_composer(vkms_crtc, false); kfree(vkmsjob); } =20 @@ -125,8 +124,7 @@ static void vkms_wb_atomic_commit(struct drm_connector = *conn, { struct drm_connector_state *connector_state =3D drm_atomic_get_new_connec= tor_state(state, conn); - struct vkms_device *vkmsdev =3D drm_device_to_vkms_device(conn->dev); - struct vkms_crtc *vkms_crtc =3D &vkmsdev->crtc; + struct vkms_crtc *vkms_crtc =3D drm_crtc_to_vkms_crtc(connector_state->cr= tc); struct drm_writeback_connector *wb_conn =3D &vkms_crtc->wb_connector; struct drm_connector_state *conn_state =3D wb_conn->base.state; struct vkms_crtc_state *crtc_state =3D vkms_crtc->composer_state; @@ -140,7 +138,7 @@ static void vkms_wb_atomic_commit(struct drm_connector = *conn, if (!conn_state) return; =20 - vkms_set_composer(&vkmsdev->crtc, true); + vkms_set_composer(vkms_crtc, true); =20 active_wb =3D conn_state->writeback_job->priv; wb_frame_info =3D &active_wb->wb_frame_info; @@ -168,9 +166,9 @@ static const struct drm_connector_helper_funcs vkms_wb_= conn_helper_funcs =3D { .atomic_check =3D vkms_wb_atomic_check, }; =20 -int vkms_enable_writeback_connector(struct vkms_device *vkmsdev) +int vkms_enable_writeback_connector(struct vkms_device *vkmsdev, struct vk= ms_crtc *vkms_crtc) { - struct drm_writeback_connector *wb =3D &vkmsdev->crtc.wb_connector; + struct drm_writeback_connector *wb =3D &vkms_crtc->wb_connector; =20 drm_connector_helper_add(&wb->base, &vkms_wb_conn_helper_funcs); =20 --=20 2.44.2