* [RFC PATCH] drm: allow passing a real encoder object for wb connector
@ 2022-01-21 2:29 Abhinav Kumar
2022-01-21 2:43 ` Laurent Pinchart
2022-01-21 9:17 ` Jani Nikula
0 siblings, 2 replies; 5+ messages in thread
From: Abhinav Kumar @ 2022-01-21 2:29 UTC (permalink / raw)
To: dri-devel
Cc: Abhinav Kumar, linux-arm-msm, freedreno, robdclark, seanpaul,
swboyd, nganji, aravindh, khsieh, dmitry.baryshkov,
laurent.pinchart, daniel
Instead of creating an internal encoder for the writeback
connector to satisfy DRM requirements, allow the clients
to pass a real encoder to it by changing the drm_writeback's
encoder to a pointer.
If a real encoder is not passed, drm_writeback_connector_init
will internally allocate one.
This will help the clients to manage the real encoder states
better as they will allocate and maintain the encoder.
Signed-off-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
---
drivers/gpu/drm/drm_writeback.c | 11 +++++++----
include/drm/drm_writeback.h | 2 +-
2 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
index dccf4504..fdb7381 100644
--- a/drivers/gpu/drm/drm_writeback.c
+++ b/drivers/gpu/drm/drm_writeback.c
@@ -189,8 +189,11 @@ int drm_writeback_connector_init(struct drm_device *dev,
if (IS_ERR(blob))
return PTR_ERR(blob);
- drm_encoder_helper_add(&wb_connector->encoder, enc_helper_funcs);
- ret = drm_encoder_init(dev, &wb_connector->encoder,
+ /* allocate the internal drm encoder if a real one wasnt passed */
+ if (!wb_connector->encoder)
+ wb_connector->encoder = devm_kzalloc(dev->dev, sizeof(struct drm_encoder), GFP_KERNEL);
+ drm_encoder_helper_add(wb_connector->encoder, enc_helper_funcs);
+ ret = drm_encoder_init(dev, wb_connector->encoder,
&drm_writeback_encoder_funcs,
DRM_MODE_ENCODER_VIRTUAL, NULL);
if (ret)
@@ -204,7 +207,7 @@ int drm_writeback_connector_init(struct drm_device *dev,
goto connector_fail;
ret = drm_connector_attach_encoder(connector,
- &wb_connector->encoder);
+ wb_connector->encoder);
if (ret)
goto attach_fail;
@@ -233,7 +236,7 @@ int drm_writeback_connector_init(struct drm_device *dev,
attach_fail:
drm_connector_cleanup(connector);
connector_fail:
- drm_encoder_cleanup(&wb_connector->encoder);
+ drm_encoder_cleanup(wb_connector->encoder);
fail:
drm_property_blob_put(blob);
return ret;
diff --git a/include/drm/drm_writeback.h b/include/drm/drm_writeback.h
index 9697d27..f0d8147 100644
--- a/include/drm/drm_writeback.h
+++ b/include/drm/drm_writeback.h
@@ -31,7 +31,7 @@ struct drm_writeback_connector {
* by passing the @enc_funcs parameter to drm_writeback_connector_init()
* function.
*/
- struct drm_encoder encoder;
+ struct drm_encoder *encoder;
/**
* @pixel_formats_blob_ptr:
--
2.7.4
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [RFC PATCH] drm: allow passing a real encoder object for wb connector
2022-01-21 2:29 [RFC PATCH] drm: allow passing a real encoder object for wb connector Abhinav Kumar
@ 2022-01-21 2:43 ` Laurent Pinchart
2022-01-21 3:45 ` [Freedreno] " Abhinav Kumar
2022-01-21 9:17 ` Jani Nikula
1 sibling, 1 reply; 5+ messages in thread
From: Laurent Pinchart @ 2022-01-21 2:43 UTC (permalink / raw)
To: Abhinav Kumar
Cc: dri-devel, linux-arm-msm, freedreno, robdclark, seanpaul, swboyd,
nganji, aravindh, khsieh, dmitry.baryshkov, daniel
Hi Abhinav,
Thank you for the patch.
On Thu, Jan 20, 2022 at 06:29:55PM -0800, Abhinav Kumar wrote:
> Instead of creating an internal encoder for the writeback
> connector to satisfy DRM requirements, allow the clients
> to pass a real encoder to it by changing the drm_writeback's
> encoder to a pointer.
>
> If a real encoder is not passed, drm_writeback_connector_init
> will internally allocate one.
>
> This will help the clients to manage the real encoder states
> better as they will allocate and maintain the encoder.
A writeback connector is a bit of a hack. It was implemented that way to
minimize the extensions to the KMS userspace API for writeback support.
There's no "encoder" there, as there's no real "connector" either. The
only reason we register a drm_encoder in the writeback implementation is
because encoders are exposed to userspace and are thus required (this is
considered a historical mistake that we can't fix anymore). Why do you
thus need to create a "real encoder" ?
> Signed-off-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
> ---
> drivers/gpu/drm/drm_writeback.c | 11 +++++++----
> include/drm/drm_writeback.h | 2 +-
> 2 files changed, 8 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
> index dccf4504..fdb7381 100644
> --- a/drivers/gpu/drm/drm_writeback.c
> +++ b/drivers/gpu/drm/drm_writeback.c
> @@ -189,8 +189,11 @@ int drm_writeback_connector_init(struct drm_device *dev,
> if (IS_ERR(blob))
> return PTR_ERR(blob);
>
> - drm_encoder_helper_add(&wb_connector->encoder, enc_helper_funcs);
> - ret = drm_encoder_init(dev, &wb_connector->encoder,
> + /* allocate the internal drm encoder if a real one wasnt passed */
> + if (!wb_connector->encoder)
> + wb_connector->encoder = devm_kzalloc(dev->dev, sizeof(struct drm_encoder), GFP_KERNEL);
> + drm_encoder_helper_add(wb_connector->encoder, enc_helper_funcs);
> + ret = drm_encoder_init(dev, wb_connector->encoder,
> &drm_writeback_encoder_funcs,
> DRM_MODE_ENCODER_VIRTUAL, NULL);
> if (ret)
> @@ -204,7 +207,7 @@ int drm_writeback_connector_init(struct drm_device *dev,
> goto connector_fail;
>
> ret = drm_connector_attach_encoder(connector,
> - &wb_connector->encoder);
> + wb_connector->encoder);
> if (ret)
> goto attach_fail;
>
> @@ -233,7 +236,7 @@ int drm_writeback_connector_init(struct drm_device *dev,
> attach_fail:
> drm_connector_cleanup(connector);
> connector_fail:
> - drm_encoder_cleanup(&wb_connector->encoder);
> + drm_encoder_cleanup(wb_connector->encoder);
> fail:
> drm_property_blob_put(blob);
> return ret;
> diff --git a/include/drm/drm_writeback.h b/include/drm/drm_writeback.h
> index 9697d27..f0d8147 100644
> --- a/include/drm/drm_writeback.h
> +++ b/include/drm/drm_writeback.h
> @@ -31,7 +31,7 @@ struct drm_writeback_connector {
> * by passing the @enc_funcs parameter to drm_writeback_connector_init()
> * function.
> */
> - struct drm_encoder encoder;
> + struct drm_encoder *encoder;
>
> /**
> * @pixel_formats_blob_ptr:
--
Regards,
Laurent Pinchart
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Freedreno] [RFC PATCH] drm: allow passing a real encoder object for wb connector
2022-01-21 2:43 ` Laurent Pinchart
@ 2022-01-21 3:45 ` Abhinav Kumar
0 siblings, 0 replies; 5+ messages in thread
From: Abhinav Kumar @ 2022-01-21 3:45 UTC (permalink / raw)
To: Laurent Pinchart
Cc: linux-arm-msm, dri-devel, swboyd, khsieh, robdclark, nganji,
seanpaul, daniel, dmitry.baryshkov, aravindh, freedreno
Hi Laurent
Thanks for the response.
On 1/20/2022 6:43 PM, Laurent Pinchart wrote:
> Hi Abhinav,
>
> Thank you for the patch.
>
> On Thu, Jan 20, 2022 at 06:29:55PM -0800, Abhinav Kumar wrote:
>> Instead of creating an internal encoder for the writeback
>> connector to satisfy DRM requirements, allow the clients
>> to pass a real encoder to it by changing the drm_writeback's
>> encoder to a pointer.
>>
>> If a real encoder is not passed, drm_writeback_connector_init
>> will internally allocate one.
>>
>> This will help the clients to manage the real encoder states
>> better as they will allocate and maintain the encoder.
>
> A writeback connector is a bit of a hack. It was implemented that way to
> minimize the extensions to the KMS userspace API for writeback support.
> There's no "encoder" there, as there's no real "connector" either. The
> only reason we register a drm_encoder in the writeback implementation is
> because encoders are exposed to userspace and are thus required (this is
> considered a historical mistake that we can't fix anymore). Why do you
> thus need to create a "real encoder" ?
On some hardware, it is possible that the writeback encoder is shared.
That is, in terms of hardware resources, we can only mutually drive
either the physical interface or the writeback one.
In that case, it would be better that drm_writeback accepts the real
encoder that is being used instead of allocating a dummy one internally.
Moreover, the drm_writeback_connector_init() does already accept passing
our own enc_helper_funcs to perform necessary checks on the internal
encoder.
These hooks are provided to perform various operations on the encoder to
fit the respective needs.
In that case why shouldnt the writeback have its own real encoder?
Thanks
Abhinav
>
>> Signed-off-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
>> ---
>> drivers/gpu/drm/drm_writeback.c | 11 +++++++----
>> include/drm/drm_writeback.h | 2 +-
>> 2 files changed, 8 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
>> index dccf4504..fdb7381 100644
>> --- a/drivers/gpu/drm/drm_writeback.c
>> +++ b/drivers/gpu/drm/drm_writeback.c
>> @@ -189,8 +189,11 @@ int drm_writeback_connector_init(struct drm_device *dev,
>> if (IS_ERR(blob))
>> return PTR_ERR(blob);
>>
>> - drm_encoder_helper_add(&wb_connector->encoder, enc_helper_funcs);
>> - ret = drm_encoder_init(dev, &wb_connector->encoder,
>> + /* allocate the internal drm encoder if a real one wasnt passed */
>> + if (!wb_connector->encoder)
>> + wb_connector->encoder = devm_kzalloc(dev->dev, sizeof(struct drm_encoder), GFP_KERNEL);
>> + drm_encoder_helper_add(wb_connector->encoder, enc_helper_funcs);
>> + ret = drm_encoder_init(dev, wb_connector->encoder,
>> &drm_writeback_encoder_funcs,
>> DRM_MODE_ENCODER_VIRTUAL, NULL);
>> if (ret)
>> @@ -204,7 +207,7 @@ int drm_writeback_connector_init(struct drm_device *dev,
>> goto connector_fail;
>>
>> ret = drm_connector_attach_encoder(connector,
>> - &wb_connector->encoder);
>> + wb_connector->encoder);
>> if (ret)
>> goto attach_fail;
>>
>> @@ -233,7 +236,7 @@ int drm_writeback_connector_init(struct drm_device *dev,
>> attach_fail:
>> drm_connector_cleanup(connector);
>> connector_fail:
>> - drm_encoder_cleanup(&wb_connector->encoder);
>> + drm_encoder_cleanup(wb_connector->encoder);
>> fail:
>> drm_property_blob_put(blob);
>> return ret;
>> diff --git a/include/drm/drm_writeback.h b/include/drm/drm_writeback.h
>> index 9697d27..f0d8147 100644
>> --- a/include/drm/drm_writeback.h
>> +++ b/include/drm/drm_writeback.h
>> @@ -31,7 +31,7 @@ struct drm_writeback_connector {
>> * by passing the @enc_funcs parameter to drm_writeback_connector_init()
>> * function.
>> */
>> - struct drm_encoder encoder;
>> + struct drm_encoder *encoder;
>>
>> /**
>> * @pixel_formats_blob_ptr:
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [RFC PATCH] drm: allow passing a real encoder object for wb connector
2022-01-21 2:29 [RFC PATCH] drm: allow passing a real encoder object for wb connector Abhinav Kumar
2022-01-21 2:43 ` Laurent Pinchart
@ 2022-01-21 9:17 ` Jani Nikula
2022-01-21 16:05 ` Abhinav Kumar
1 sibling, 1 reply; 5+ messages in thread
From: Jani Nikula @ 2022-01-21 9:17 UTC (permalink / raw)
To: Abhinav Kumar, dri-devel
Cc: linux-arm-msm, Abhinav Kumar, swboyd, khsieh, nganji, seanpaul,
laurent.pinchart, dmitry.baryshkov, aravindh, freedreno,
suraj.kandpal
On Thu, 20 Jan 2022, Abhinav Kumar <quic_abhinavk@quicinc.com> wrote:
> Instead of creating an internal encoder for the writeback
> connector to satisfy DRM requirements, allow the clients
> to pass a real encoder to it by changing the drm_writeback's
> encoder to a pointer.
>
> If a real encoder is not passed, drm_writeback_connector_init
> will internally allocate one.
>
> This will help the clients to manage the real encoder states
> better as they will allocate and maintain the encoder.
See also the thread starting at [1], and please try to coordinate.
I don't know what the end result should be like, I'm just saying please
collaborate instead of racing to get one set of changes in.
BR,
Jani.
[1] https://patchwork.freedesktop.org/patch/msgid/20220111101801.28310-1-suraj.kandpal@intel.com
>
> Signed-off-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
> ---
> drivers/gpu/drm/drm_writeback.c | 11 +++++++----
> include/drm/drm_writeback.h | 2 +-
> 2 files changed, 8 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
> index dccf4504..fdb7381 100644
> --- a/drivers/gpu/drm/drm_writeback.c
> +++ b/drivers/gpu/drm/drm_writeback.c
> @@ -189,8 +189,11 @@ int drm_writeback_connector_init(struct drm_device *dev,
> if (IS_ERR(blob))
> return PTR_ERR(blob);
>
> - drm_encoder_helper_add(&wb_connector->encoder, enc_helper_funcs);
> - ret = drm_encoder_init(dev, &wb_connector->encoder,
> + /* allocate the internal drm encoder if a real one wasnt passed */
> + if (!wb_connector->encoder)
> + wb_connector->encoder = devm_kzalloc(dev->dev, sizeof(struct drm_encoder), GFP_KERNEL);
> + drm_encoder_helper_add(wb_connector->encoder, enc_helper_funcs);
> + ret = drm_encoder_init(dev, wb_connector->encoder,
> &drm_writeback_encoder_funcs,
> DRM_MODE_ENCODER_VIRTUAL, NULL);
> if (ret)
> @@ -204,7 +207,7 @@ int drm_writeback_connector_init(struct drm_device *dev,
> goto connector_fail;
>
> ret = drm_connector_attach_encoder(connector,
> - &wb_connector->encoder);
> + wb_connector->encoder);
> if (ret)
> goto attach_fail;
>
> @@ -233,7 +236,7 @@ int drm_writeback_connector_init(struct drm_device *dev,
> attach_fail:
> drm_connector_cleanup(connector);
> connector_fail:
> - drm_encoder_cleanup(&wb_connector->encoder);
> + drm_encoder_cleanup(wb_connector->encoder);
> fail:
> drm_property_blob_put(blob);
> return ret;
> diff --git a/include/drm/drm_writeback.h b/include/drm/drm_writeback.h
> index 9697d27..f0d8147 100644
> --- a/include/drm/drm_writeback.h
> +++ b/include/drm/drm_writeback.h
> @@ -31,7 +31,7 @@ struct drm_writeback_connector {
> * by passing the @enc_funcs parameter to drm_writeback_connector_init()
> * function.
> */
> - struct drm_encoder encoder;
> + struct drm_encoder *encoder;
>
> /**
> * @pixel_formats_blob_ptr:
--
Jani Nikula, Intel Open Source Graphics Center
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [RFC PATCH] drm: allow passing a real encoder object for wb connector
2022-01-21 9:17 ` Jani Nikula
@ 2022-01-21 16:05 ` Abhinav Kumar
0 siblings, 0 replies; 5+ messages in thread
From: Abhinav Kumar @ 2022-01-21 16:05 UTC (permalink / raw)
To: Jani Nikula, dri-devel
Cc: linux-arm-msm, swboyd, khsieh, nganji, seanpaul, laurent.pinchart,
dmitry.baryshkov, aravindh, freedreno, suraj.kandpal
Hi Jani
On 1/21/2022 1:17 AM, Jani Nikula wrote:
> On Thu, 20 Jan 2022, Abhinav Kumar <quic_abhinavk@quicinc.com> wrote:
>> Instead of creating an internal encoder for the writeback
>> connector to satisfy DRM requirements, allow the clients
>> to pass a real encoder to it by changing the drm_writeback's
>> encoder to a pointer.
>>
>> If a real encoder is not passed, drm_writeback_connector_init
>> will internally allocate one.
>>
>> This will help the clients to manage the real encoder states
>> better as they will allocate and maintain the encoder.
>
> See also the thread starting at [1], and please try to coordinate.
>
> I don't know what the end result should be like, I'm just saying please
> collaborate instead of racing to get one set of changes in.
>
> BR,
> Jani.
>
>
> [1] https://patchwork.freedesktop.org/patch/msgid/20220111101801.28310-1-suraj.kandpal@intel.com
>
Thanks for pointing to this thread. Since
https://patchwork.freedesktop.org/patch/469090/ has been posted earlier
and is more complete in terms of handling other vendor changes, we can
continue on that one.
But I dont see any comments on that one yet.
Hi Laurent
In that case can you please check the
https://patchwork.freedesktop.org/patch/469090/ thread , we can continue
our discussion there.
We also have the same issue too. Our encoder also maintains its own
struct drm_encoder.
Thanks
Abhinav
>>
>> Signed-off-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
>> ---
>> drivers/gpu/drm/drm_writeback.c | 11 +++++++----
>> include/drm/drm_writeback.h | 2 +-
>> 2 files changed, 8 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
>> index dccf4504..fdb7381 100644
>> --- a/drivers/gpu/drm/drm_writeback.c
>> +++ b/drivers/gpu/drm/drm_writeback.c
>> @@ -189,8 +189,11 @@ int drm_writeback_connector_init(struct drm_device *dev,
>> if (IS_ERR(blob))
>> return PTR_ERR(blob);
>>
>> - drm_encoder_helper_add(&wb_connector->encoder, enc_helper_funcs);
>> - ret = drm_encoder_init(dev, &wb_connector->encoder,
>> + /* allocate the internal drm encoder if a real one wasnt passed */
>> + if (!wb_connector->encoder)
>> + wb_connector->encoder = devm_kzalloc(dev->dev, sizeof(struct drm_encoder), GFP_KERNEL);
>> + drm_encoder_helper_add(wb_connector->encoder, enc_helper_funcs);
>> + ret = drm_encoder_init(dev, wb_connector->encoder,
>> &drm_writeback_encoder_funcs,
>> DRM_MODE_ENCODER_VIRTUAL, NULL);
>> if (ret)
>> @@ -204,7 +207,7 @@ int drm_writeback_connector_init(struct drm_device *dev,
>> goto connector_fail;
>>
>> ret = drm_connector_attach_encoder(connector,
>> - &wb_connector->encoder);
>> + wb_connector->encoder);
>> if (ret)
>> goto attach_fail;
>>
>> @@ -233,7 +236,7 @@ int drm_writeback_connector_init(struct drm_device *dev,
>> attach_fail:
>> drm_connector_cleanup(connector);
>> connector_fail:
>> - drm_encoder_cleanup(&wb_connector->encoder);
>> + drm_encoder_cleanup(wb_connector->encoder);
>> fail:
>> drm_property_blob_put(blob);
>> return ret;
>> diff --git a/include/drm/drm_writeback.h b/include/drm/drm_writeback.h
>> index 9697d27..f0d8147 100644
>> --- a/include/drm/drm_writeback.h
>> +++ b/include/drm/drm_writeback.h
>> @@ -31,7 +31,7 @@ struct drm_writeback_connector {
>> * by passing the @enc_funcs parameter to drm_writeback_connector_init()
>> * function.
>> */
>> - struct drm_encoder encoder;
>> + struct drm_encoder *encoder;
>>
>> /**
>> * @pixel_formats_blob_ptr:
>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2022-01-21 16:05 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-01-21 2:29 [RFC PATCH] drm: allow passing a real encoder object for wb connector Abhinav Kumar
2022-01-21 2:43 ` Laurent Pinchart
2022-01-21 3:45 ` [Freedreno] " Abhinav Kumar
2022-01-21 9:17 ` Jani Nikula
2022-01-21 16:05 ` Abhinav Kumar
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox