[PATCH 1/3] drm: add writeback pointers to drm_connector

Abhinav Kumar quic_abhinavk at quicinc.com
Thu Jan 27 18:17:05 UTC 2022


Hi Suraj

Thanks for the response.

I was not too worried about the intel driver as I am sure you must have 
validated this change with that :)

My question was more for the other vendor writeback drivers.

Thanks for looking into the others and providing the snippets.
After looking at those, yes I also think it should work.

So, if others do not have any concern with this change,

Reviewed-by: Abhinav Kumar <quic_abhinavk at quicinc.com>

On 1/27/2022 1:33 AM, Kandpal, Suraj wrote:
>>
>> + laurent on this
>>
>> Hi Suraj
>> Jani pointed me to this thread as i had posted something similar here :
>> https://patchwork.freedesktop.org/patch/470296/ but since this thread was
>> posted earlier, we can discuss further here.
>>
>> Overall, its similar to what I had posted in the RFC and your commit text also
>> covers my concerns too.
>>
>> One question I have about your change is since you have changed
>> wb_connector::encoder to be a pointer, i saw the other changes in the series
>> but they do not allocate an encoder. Would this not affect the other drivers
>> which are assuming that the encoder in wb_connector is struct drm_encoder
>> encoder and not struct drm_encoder* encoder.
>>
>> Your changes fix the compilation issue but wouldnt this crash as encoder
>> wasnt allocated for other drivers.
>>
> 
> Hi Abhinav,
> That shouldn't be an issue as normally drivers tend to have their own output
> structure which has drm_connector and drm_encoder embedded in it depending
> on the level of binding they have decided to give the connector and encoder in
> their respective output and the addresses of these are passed to the
> drm_connector* and drm_encoder* in drm_writeback_connector structure
> which then gets initialized in drm_writeback_connector_init().
> 
> In our i915 code we have intel_connector structure with drm_connector base
> field and intel_wd with a intel_encoder base which in turn has drm_encoder
> field and both intel_connector and intel_wd are initialized not requiring explicit
> alloc and dealloc for drm_encoder
> intel_wd = kzalloc(sizeof(*intel_wd), GFP_KERNEL);
> 
> intel_connector = intel_connector_alloc();
> wb_conn = &intel_connector->wb_conn;
> wb_conn->base = &intel_connector->base;
> wb_conn->encoder = &intel_wd->base.base;
> 
> Similary for komeda driver has
> struct komeda_wb_connector {
>          struct drm_connector conn;
>          /** @base: &drm_writeback_connector */
>          struct drm_writeback_connector base;
> 
>          /** @wb_layer: represents associated writeback pipeline of komeda */
>          struct komeda_layer *wb_layer;
> };
> 
> static int komeda_wb_connector_add(struct komeda_kms_dev *kms,
>                                     struct komeda_crtc *kcrtc)
> {
> 	struct komeda_wb_connector *kwb_conn;
> 	struct drm_writeback_connector *wb_conn;
> 	
> 	kwb_conn = kzalloc(sizeof(*kwb_conn), GFP_KERNEL);
> 
> 	wb_conn = &kwb_conn->base;
>          	wb_conn->base = &kwb_conn->conn;
>        
> and they do not depend on the encoder binding so changes will work for them
> Also in vkms driver we have the
> struct vkms_output {
>          struct drm_crtc crtc;
>          struct drm_encoder encoder;
>          struct drm_connector connector;
>          struct drm_writeback_connector wb_connector;
>          struct hrtimer vblank_hrtimer;
>          ktime_t period_ns;
>          struct drm_pending_vblank_event *event;
>          /* ordered wq for composer_work */
>          struct workqueue_struct *composer_workq;
>          /* protects concurrent access to composer */
>          spinlock_t lock;
> 
>          /* protected by @lock */
>          bool composer_enabled;
>          struct vkms_crtc_state *composer_state;
> 
>          spinlock_t composer_lock;
> };
> 
> Which gets allocated covering for the drm_encoder alloc and dealloc
> 
> Regards,
> Suraj Kandpal
> 


More information about the dri-devel mailing list