> -----Original Message-----
> From: Intel-gfx <intel-gfx-boun...@lists.freedesktop.org> On Behalf Of Ville 
> Syrjälä
> Sent: Friday, January 31, 2020 5:28 PM
> To: Laxminarayan Bharadiya, Pankaj <pankaj.laxminarayan.bharad...@intel.com>
> Cc: intel-gfx@lists.freedesktop.org
> Subject: Re: [Intel-gfx] RFC: pipe writeback design for i915
> 
> On Fri, Jan 31, 2020 at 12:00:39PM +0530, Bharadiya,Pankaj wrote:
> > I am exploring the way of implementing the pipe writeback feature in 
> > i915 and would like to get early feedback on design.

[snip]

> > 
> > 1# Extend the intel_connector to support writeback
> > --------------------------------------------------
> > 
> > drm_writeback connector is of drm_connector type and intel_connector 
> > is also of drm_connector type.
> > 
> >   
> > +-----------------------------------------------------------------------------+
> >   |                                     |                                   
> >     |
> >   | struct drm_writeback_connector {    |    struct intel_connector {       
> >     |
> >   |         struct drm_connector base;  |            struct drm_connector 
> > base; |
> >   |         .                           |            .                      
> >     |
> >   |         .                           |            .                      
> >     |
> >   |         .                           |            .                      
> >     |
> >   | };                                  |    };                             
> >     |
> >   |                                     |                                   
> >     |
> >   
> > +---------------------------------------------------------------------
> > --------+
> 
> That's a bit unfortunate. We like to use intel_connector quite a bit in
> i915 so having two different types is going to be a pita. Ideally I guess the 
> writeback connector shouldn't be a drm_connector at all and instead it would 
> just provide some kind of thing to embed into the driver's connector struct. 
> But that would mean the writeback helpers would need some other way to get at 
> that data rather than just container_of().

I am thinking of the following -

- Modify the struct drm_writeback_connector accept drm_connector pointer (*base)
- Add new member in struct drm_connector to save struct drm_writeback_connector
  pointer so that drm_writeback_connector can be found using given a 
drm_connector.
- Modify existing drivers (rcar_du, arm/malidp, arm/komeda, vc4) which are
  implementing drm_writeback to adapt to this new change.

Here is the example patch I came with -

----------------------

diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
index 43d9e3bb3a94..cb4434baa2eb 100644
--- a/drivers/gpu/drm/drm_writeback.c
+++ b/drivers/gpu/drm/drm_writeback.c
@@ -87,7 +87,7 @@ static const char *drm_writeback_fence_get_driver_name(struct 
dma_fence *fence)
        struct drm_writeback_connector *wb_connector =
                fence_to_wb_connector(fence);
 
-       return wb_connector->base.dev->driver->name;
+       return wb_connector->base->dev->driver->name;
 }
 
 static const char *
@@ -178,7 +178,7 @@ int drm_writeback_connector_init(struct drm_device *dev,
                                 const u32 *formats, int n_formats)
 {
        struct drm_property_blob *blob;
-       struct drm_connector *connector = &wb_connector->base;
+       struct drm_connector *connector = wb_connector->base;
        struct drm_mode_config *config = &dev->mode_config;
        int ret = create_writeback_properties(dev);
 
@@ -198,6 +198,7 @@ int drm_writeback_connector_init(struct drm_device *dev,
                goto fail;
 
        connector->interlace_allowed = 0;
+       connector->wb_connector = wb_connector;
 
        ret = drm_connector_init(dev, connector, con_funcs,
                                 DRM_MODE_CONNECTOR_WRITEBACK);
@@ -264,7 +265,7 @@ int drm_writeback_prepare_job(struct drm_writeback_job *job)
 {
        struct drm_writeback_connector *connector = job->connector;
        const struct drm_connector_helper_funcs *funcs =
-               connector->base.helper_private;
+               connector->base->helper_private;
        int ret;
 
        if (funcs->prepare_writeback_job) {
@@ -316,7 +317,7 @@ void drm_writeback_cleanup_job(struct drm_writeback_job 
*job)
 {
        struct drm_writeback_connector *connector = job->connector;
        const struct drm_connector_helper_funcs *funcs =
-               connector->base.helper_private;
+               connector->base->helper_private;
 
        if (job->prepared && funcs->cleanup_writeback_job)
                funcs->cleanup_writeback_job(connector, job);
@@ -402,7 +403,7 @@ drm_writeback_get_out_fence(struct drm_writeback_connector 
*wb_connector)
 {
        struct dma_fence *fence;
 
-       if (WARN_ON(wb_connector->base.connector_type !=
+       if (WARN_ON(wb_connector->base->connector_type !=
                    DRM_MODE_CONNECTOR_WRITEBACK))
                return NULL;
 
diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
index 2113500b4075..edd153f1815e 100644
--- a/include/drm/drm_connector.h
+++ b/include/drm/drm_connector.h
@@ -42,6 +42,7 @@ struct drm_property_blob;
 struct drm_printer;
 struct edid;
 struct i2c_adapter;
+struct drm_writeback_connector;
 
 enum drm_connector_force {
        DRM_FORCE_UNSPECIFIED,
@@ -1315,6 +1316,8 @@ struct drm_connector {
         */
        struct drm_encoder *encoder;
 
+       struct drm_writeback_connector  *wb_connector;
+
 #define MAX_ELD_BYTES  128
        /** @eld: EDID-like data, if present */
        uint8_t eld[MAX_ELD_BYTES];
diff --git a/include/drm/drm_writeback.h b/include/drm/drm_writeback.h
index 777c14c847f0..51a94c6a4ae3 100644
--- a/include/drm/drm_writeback.h
+++ b/include/drm/drm_writeback.h
@@ -16,7 +16,7 @@
 #include <linux/workqueue.h>
 
 struct drm_writeback_connector {
-       struct drm_connector base;
+       struct drm_connector *base;
 
        /**
         * @encoder: Internal encoder used by the connector to fulfill
@@ -134,7 +134,7 @@ struct drm_writeback_job {
 static inline struct drm_writeback_connector *
 drm_connector_to_writeback(struct drm_connector *connector)
 {
-       return container_of(connector, struct drm_writeback_connector, base);
+       return connector->wb_connector;
 }
 
 int drm_writeback_connector_init(struct drm_device *dev,

---------------------


With this, we should be able to extend intel_connector to support writeback.

struct intel_connector {
        struct drm_connector base;
+       struct drm_writeback_connector wb_conn;
.
.
.
}

Example usage:
        struct intel_connector *intel_connector;
        intel_connector = intel_connector_alloc();

        intel_connector->wb_conn.base = &intel_connector->base;

        /* Initialize writeback connector */
        drm_writeback_connector_init(...,&intel_connector->wb_conn, ...);


What do you think?

Thanks,
Pankaj 

> 
> --
> Ville Syrjälä
> Intel
> ---------------------------------------------------------------------
> Intel Finland Oy
> Registered Address: PL 281, 00181 Helsinki Business Identity Code: 0357606 - 
> 4 Domiciled in Helsinki 
> 
> This e-mail and any attachments may contain confidential material for the 
> sole use of the intended recipient(s). Any review or distribution by others 
> is strictly prohibited. If you are not the intended recipient, please contact 
> the sender and delete all copies.
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to