Now that we can initialize a drm_writeback_connector without having to initialize the drm_connector within it and leaving the responsibility of initialising the drm_connector and maintaining the association with drm_writeback_connector to it. This helper hooks lets drivers return the drm_writeback_connector associated with the give drm_connector.
Signed-off-by: Suraj Kandpal <suraj.kand...@intel.com> --- drivers/gpu/drm/drm_writeback.c | 14 ++++++ include/drm/drm_modeset_helper_vtables.h | 59 ++++++++++++++++++++++++ include/drm/drm_writeback.h | 14 ++++-- 3 files changed, 82 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c index fa58eb0dc7bf..e9f7123270d6 100644 --- a/drivers/gpu/drm/drm_writeback.c +++ b/drivers/gpu/drm/drm_writeback.c @@ -107,6 +107,19 @@ static const struct dma_fence_ops drm_writeback_fence_ops = { .get_timeline_name = drm_writeback_fence_get_timeline_name, }; +struct drm_writeback_connector * +drm_connector_to_writeback(struct drm_connector *connector) +{ + const struct drm_connector_helper_funcs *funcs = + connector->helper_private; + + if (funcs->get_writeback_connector) + return funcs->get_writeback_connector(connector); + + return container_of(connector, struct drm_writeback_connector, base); +} +EXPORT_SYMBOL(drm_connector_to_writeback); + static int create_writeback_properties(struct drm_device *dev) { struct drm_property *prop; @@ -443,6 +456,7 @@ drm_writeback_connector_init_with_conn(struct drm_device *dev, struct drm_connec struct drm_writeback_connector *wb_connector, struct drm_encoder *enc, const struct drm_connector_funcs *con_funcs, + const struct drm_writeback_connector_helper_funcs *wb_funcs, const u32 *formats, int n_formats) { struct drm_property_blob *blob; diff --git a/include/drm/drm_modeset_helper_vtables.h b/include/drm/drm_modeset_helper_vtables.h index ce7c7aeac887..6b89b33d2304 100644 --- a/include/drm/drm_modeset_helper_vtables.h +++ b/include/drm/drm_modeset_helper_vtables.h @@ -31,6 +31,7 @@ #include <drm/drm_crtc.h> #include <drm/drm_encoder.h> +#include <drm/drm_writeback.h> /** * DOC: overview @@ -1179,6 +1180,25 @@ struct drm_connector_helper_funcs { * */ void (*disable_hpd)(struct drm_connector *connector); + + /** + * @get_writeback_connector: + * + * This callback is used by drivers to get the writeback connector in + * case the init is done via drm_writeback_init_with_conn. Which means + * the drivers don't have drm_connector embedded in drm_writeback_connector + * so they need to send the associated writeback connector with this + * function. + * + * This operation is optional. + * + * This is mainly called from drm_writeback_set_gb. + * + * RETURNS: + * + * drm_writeback_connector assoiciated with the drm connector. + */ + struct drm_writeback_connector *(*get_writeback_connector)(struct drm_connector *connector); }; /** @@ -1192,6 +1212,45 @@ static inline void drm_connector_helper_add(struct drm_connector *connector, connector->helper_private = funcs; } +/** + * struct drm_writeback_connector_helper_funcs - helper operations for writeback + * connectors. + * + * These functions are used by the atomic and legacy modeset helpers and by the + * probe helpers. + */ +struct drm_writeback_connector_helper_funcs { + /** + * @get_connector_from_writeback: + * + * This callback is used by drivers to get the drm_connector in + * case the init is done via drm_writeback_init_with_conn. Which means + * the drivers don't have drm_connector embedded in drm_writeback_connector + * so they need to send the associated drm_connector with this + * function. + * + * This operation is optional. + * + * RETURNS: + * + * drm_connector assoiciated with the drm_writeback_connector. + */ + struct drm_connector + *(*get_connector_from_writeback)(struct drm_writeback_connector *wbconnector); +}; + +/** + * drm_writeback_connector_helper_add - sets the helper vtable for a connector + * @wb_connector: DRM writeback connector + * @funcs: helper vtable to set for @wb_connector + */ +static inline void +drm_writeback_connector_helper_add(struct drm_writeback_connector *wb_connector, + const struct drm_writeback_connector_helper_funcs *funcs) +{ + wb_connector->helper_private = funcs; +} + /** * struct drm_plane_helper_funcs - helper operations for planes * diff --git a/include/drm/drm_writeback.h b/include/drm/drm_writeback.h index 149744dbeef0..77c3c64c132d 100644 --- a/include/drm/drm_writeback.h +++ b/include/drm/drm_writeback.h @@ -84,6 +84,13 @@ struct drm_writeback_connector { * The name of the connector's fence timeline. */ char timeline_name[32]; + + /** + * @helper_private: + * + * helper private funcs for writeback_connector + */ + const struct drm_writeback_connector_helper_funcs *helper_private; }; /** @@ -142,11 +149,7 @@ struct drm_writeback_job { void *priv; }; -static inline struct drm_writeback_connector * -drm_connector_to_writeback(struct drm_connector *connector) -{ - return container_of(connector, struct drm_writeback_connector, base); -} +struct drm_writeback_connector *drm_connector_to_writeback(struct drm_connector *connector); int drm_writeback_connector_init(struct drm_device *dev, struct drm_writeback_connector *wb_connector, @@ -172,6 +175,7 @@ drm_writeback_connector_init_with_conn(struct drm_device *dev, struct drm_connec struct drm_writeback_connector *wb_connector, struct drm_encoder *enc, const struct drm_connector_funcs *con_funcs, + const struct drm_writeback_connector_helper_funcs *wb_funcs, const u32 *formats, int n_formats); int drm_writeback_set_fb(struct drm_connector_state *conn_state, -- 2.34.1