On Fri, Jul 25, 2025 at 10:33:44AM +0530, Suraj Kandpal wrote: > Now that drm_connector may not always be embedded within > drm_writeback_connector, let's define a function which either uses > the writeback helper hook that returns the drm_connector associated > with the drm_writeback_connector or just return the drm_connector > embedded inside drm_writeback_connector if the helper hook is not > present. Lets use this function and call it whenever > drm_connector is required mostly when connector helper private funcs > need to be fetched. > > Signed-off-by: Suraj Kandpal <suraj.kand...@intel.com> > --- > drivers/gpu/drm/drm_writeback.c | 33 ++++++++++++++++++++++++++------- > 1 file changed, 26 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c > index e9f7123270d6..d610cb827975 100644 > --- a/drivers/gpu/drm/drm_writeback.c > +++ b/drivers/gpu/drm/drm_writeback.c > @@ -120,6 +120,18 @@ drm_connector_to_writeback(struct drm_connector > *connector) > } > EXPORT_SYMBOL(drm_connector_to_writeback); > > +static struct drm_connector * > +drm_connector_from_writeback(struct drm_writeback_connector *wb_connector) > +{ > + const struct drm_writeback_connector_helper_funcs *funcs = > + wb_connector->helper_private; > + > + if (funcs && funcs->get_connector_from_writeback) > + return funcs->get_connector_from_writeback(wb_connector);
The get_connector_from_writeback() and drm_writeback_connector_helper_funcs should be moved to this patch. However it feels really awkward to make drm_writeback_connector, which is a wrapper around the drm_connector, to use some external DRM connector. A quick grepping reveals API (which you missed) that expects drm_writeback_connector.base to be a valid connector. And it would be very hard to catch sunch an API later on. If you want to use DRM framwework, while retaining intel_connector for writeback connectors, I'd suggest following slightly different path: extract common parts of drm_writeback_connector into a common structure, and use it within the DRM core. Then provide functions to fetch drm_connector from that struct or fetch it from drm_connector. > + > + return &wb_connector->base; > +} > + > static int create_writeback_properties(struct drm_device *dev) > { > struct drm_property *prop; > @@ -478,6 +490,7 @@ drm_writeback_connector_init_with_conn(struct drm_device > *dev, struct drm_connec > if (ret) > goto connector_fail; > > + drm_writeback_connector_helper_add(wb_connector, wb_funcs); > INIT_LIST_HEAD(&wb_connector->job_queue); > spin_lock_init(&wb_connector->job_lock); > > @@ -527,13 +540,15 @@ int drm_writeback_set_fb(struct drm_connector_state > *conn_state, > > int drm_writeback_prepare_job(struct drm_writeback_job *job) > { > - struct drm_writeback_connector *connector = job->connector; > + struct drm_writeback_connector *wb_connector = job->connector; > + struct drm_connector *connector = > + drm_connector_from_writeback(wb_connector); > const struct drm_connector_helper_funcs *funcs = > - connector->base.helper_private; > + connector->helper_private; > int ret; > > if (funcs->prepare_writeback_job) { > - ret = funcs->prepare_writeback_job(connector, job); > + ret = funcs->prepare_writeback_job(wb_connector, job); > if (ret < 0) > return ret; > } > @@ -579,12 +594,14 @@ EXPORT_SYMBOL(drm_writeback_queue_job); > > void drm_writeback_cleanup_job(struct drm_writeback_job *job) > { > - struct drm_writeback_connector *connector = job->connector; > + struct drm_writeback_connector *wb_connector = job->connector; > + struct drm_connector *connector = > + drm_connector_from_writeback(wb_connector); > const struct drm_connector_helper_funcs *funcs = > - connector->base.helper_private; > + connector->helper_private; > > if (job->prepared && funcs->cleanup_writeback_job) > - funcs->cleanup_writeback_job(connector, job); > + funcs->cleanup_writeback_job(wb_connector, job); > > if (job->fb) > drm_framebuffer_put(job->fb); > @@ -665,9 +682,11 @@ EXPORT_SYMBOL(drm_writeback_signal_completion); > struct dma_fence * > drm_writeback_get_out_fence(struct drm_writeback_connector *wb_connector) > { > + struct drm_connector *connector = > + drm_connector_from_writeback(wb_connector); > struct dma_fence *fence; > > - if (WARN_ON(wb_connector->base.connector_type != > + if (WARN_ON(connector->connector_type != > DRM_MODE_CONNECTOR_WRITEBACK)) > return NULL; > > -- > 2.34.1 > -- With best wishes Dmitry