[PATCH] drm/simple-kms: Standardize arguments for callbacks

Thomas Zimmermann tzimmermann at suse.de
Wed Oct 23 06:47:57 UTC 2019


Hi

Am 22.10.19 um 21:03 schrieb Daniel Vetter:
> On Tue, Oct 22, 2019 at 7:16 PM Thomas Zimmermann <tzimmermann at suse.de> wrote:
>>
>> Hi,
>>
>> there are two types of callbacks in struct
>> drm_simple_display_pipe_funcs: functions that are genuine to simple KMS,
>> and functions that are merely forwarded from another structure (crtc,
>> plane, etc).
>>
>> In the former category are enable(), disable(), check(), and update().
>> Those should probably receive a simple display pipe as their first argument.
> 
> mode_valid _very_ much belongs to this category too, since there's
> mode_valid hooks also on other objects. But simple pipe helper
> condenses that down to one mode_valid hook (we could also put the
> mode_valid onto encoder, wouldn't change anything).
> 
>> In the latter category are mode_valid(), prepare_fb(), cleanup_fb(),
>> enable_vblank(), and disable_vblank(). IMHO those functions should
>> receive a pointer to the original structure as their first argument.
>> This type provides the context in which the operations make sense. (Even
>> their documentation already refers to the original structure.)
> 
> Now on those you can maybe make a case that they only exist in one
> object. But the entire point of simple helpers was to condense the zoo
> of drm types down to one. Only reason you don't also get a
> drm_simple_display_pipe_state is that this one would be a bit more
> work to make work correctly. If we full on leak all the underlying
> objects, then you might as well set them up yourself and set up all
> the hooks, it's just a few more lines of code.
> 
> Imo for simple pipe we should go more into that direction, not less.
> 
>> I admit that not all are as shareable as prepare_fb() and enable_fb().
>> But what else than boiler-plate wrappers do we get from simple display
>> pipe here?
> 
> Boiler plate wrappers is pretty much the entire point of simple pipe
> helpers. Anytime you're interested in the things it abstracts away
> (crtc, plane, encoder) you probably want your own atomic
> implementation.

I was speaking of boiler-plate code in drivers and other helpers (e.g.,
drm_gem_fb_simple_display_pipe_prepare_fb() )

TBH I don't think it is possible to build and use simple pipe without
exposing the underlying primitives (crtc, plane, connector). This would
require a completely separate set of atomic helpers. IMHO the current
simple pipe is a mid-layer and comes with typical mid-layer problems.

Anyway, given your rational for the current design, I'll update my
recent patches for prepare_fb() to support simple pipe.

For this patch

  Acked-By: Thomas Zimmermann <tzimmermann at suse.de>

Best regards
Thomas

> conversion is a good fit, it's not meant to be useful for all small
> drivers. Only for the _really_ simple ones.
> 
> Otherwise if we readd all the bells and whistles to simple pipe
> helpers, then we just end back where we started. That's also why I
> personally think explicit simple wrappers would fit better, instead of
> wrestling the prepare/cleanup_fb functions to match full atomic
> helpers.
> -Daniel
> 
>>
>> Best regards
>> Thomas
>>
>> Am 22.10.19 um 17:55 schrieb Daniel Vetter:
>>> Passing the wrong type feels icky, everywhere else we use the pipe as
>>> the first parameter. Spotted while discussing patches with Thomas
>>> Zimmermann.
>>>
>>> Cc: Thomas Zimmermann <tzimmermann at suse.de>
>>> Cc: Noralf Trønnes <noralf at tronnes.org>
>>> Cc: Gerd Hoffmann <kraxel at redhat.com>
>>> Cc: Eric Anholt <eric at anholt.net>
>>> Cc: Emil Velikov <emil.velikov at collabora.com>
>>> Cc: virtualization at lists.linux-foundation.org
>>> Cc: Linus Walleij <linus.walleij at linaro.org>
>>> Signed-off-by: Daniel Vetter <daniel.vetter at intel.com>
>>> ---
>>>  drivers/gpu/drm/cirrus/cirrus.c         | 2 +-
>>>  drivers/gpu/drm/drm_simple_kms_helper.c | 2 +-
>>>  drivers/gpu/drm/pl111/pl111_display.c   | 4 ++--
>>>  include/drm/drm_simple_kms_helper.h     | 2 +-
>>>  4 files changed, 5 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/cirrus/cirrus.c b/drivers/gpu/drm/cirrus/cirrus.c
>>> index 7d08d067e1a4..248c9f765c45 100644
>>> --- a/drivers/gpu/drm/cirrus/cirrus.c
>>> +++ b/drivers/gpu/drm/cirrus/cirrus.c
>>> @@ -390,7 +390,7 @@ static int cirrus_conn_init(struct cirrus_device *cirrus)
>>>  /* ------------------------------------------------------------------ */
>>>  /* cirrus (simple) display pipe                                            */
>>>
>>> -static enum drm_mode_status cirrus_pipe_mode_valid(struct drm_crtc *crtc,
>>> +static enum drm_mode_status cirrus_pipe_mode_valid(struct drm_simple_display_pipe *pipe,
>>>                                                  const struct drm_display_mode *mode)
>>>  {
>>>       if (cirrus_check_size(mode->hdisplay, mode->vdisplay, NULL) < 0)
>>> diff --git a/drivers/gpu/drm/drm_simple_kms_helper.c b/drivers/gpu/drm/drm_simple_kms_helper.c
>>> index 046055719245..15fb516ae2d8 100644
>>> --- a/drivers/gpu/drm/drm_simple_kms_helper.c
>>> +++ b/drivers/gpu/drm/drm_simple_kms_helper.c
>>> @@ -43,7 +43,7 @@ drm_simple_kms_crtc_mode_valid(struct drm_crtc *crtc,
>>>               /* Anything goes */
>>>               return MODE_OK;
>>>
>>> -     return pipe->funcs->mode_valid(crtc, mode);
>>> +     return pipe->funcs->mode_valid(pipe, mode);
>>>  }
>>>
>>>  static int drm_simple_kms_crtc_check(struct drm_crtc *crtc,
>>> diff --git a/drivers/gpu/drm/pl111/pl111_display.c b/drivers/gpu/drm/pl111/pl111_display.c
>>> index 024771a4083e..703ddc803c55 100644
>>> --- a/drivers/gpu/drm/pl111/pl111_display.c
>>> +++ b/drivers/gpu/drm/pl111/pl111_display.c
>>> @@ -48,10 +48,10 @@ irqreturn_t pl111_irq(int irq, void *data)
>>>  }
>>>
>>>  static enum drm_mode_status
>>> -pl111_mode_valid(struct drm_crtc *crtc,
>>> +pl111_mode_valid(struct drm_simple_display_pipe *pipe,
>>>                const struct drm_display_mode *mode)
>>>  {
>>> -     struct drm_device *drm = crtc->dev;
>>> +     struct drm_device *drm = pipe->crtc.dev;
>>>       struct pl111_drm_dev_private *priv = drm->dev_private;
>>>       u32 cpp = priv->variant->fb_bpp / 8;
>>>       u64 bw;
>>> diff --git a/include/drm/drm_simple_kms_helper.h b/include/drm/drm_simple_kms_helper.h
>>> index 4d89cd0a60db..15afee9cf049 100644
>>> --- a/include/drm/drm_simple_kms_helper.h
>>> +++ b/include/drm/drm_simple_kms_helper.h
>>> @@ -49,7 +49,7 @@ struct drm_simple_display_pipe_funcs {
>>>        *
>>>        * drm_mode_status Enum
>>>        */
>>> -     enum drm_mode_status (*mode_valid)(struct drm_crtc *crtc,
>>> +     enum drm_mode_status (*mode_valid)(struct drm_simple_display_pipe *pipe,
>>>                                          const struct drm_display_mode *mode);
>>>
>>>       /**
>>>
>>
>> --
>> Thomas Zimmermann
>> Graphics Driver Developer
>> SUSE Software Solutions Germany GmbH
>> Maxfeldstr. 5, 90409 Nürnberg, Germany
>> (HRB 36809, AG Nürnberg)
>> Geschäftsführer: Felix Imendörffer
>>
> 
> 

-- 
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Maxfeldstr. 5, 90409 Nürnberg, Germany
(HRB 36809, AG Nürnberg)
Geschäftsführer: Felix Imendörffer

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20191023/ebc4a830/attachment-0001.sig>


More information about the dri-devel mailing list