[RFC v4 00/25] drm: Add generic fbdev emulation

Noralf Trønnes noralf at tronnes.org
Fri Apr 13 17:06:12 UTC 2018


Argh, it didn't go through this time either.
I'll just have to strip off recipients and just send to the lists when 
the cool off period is over.

Sorry about the noise, I'll have to investigate this further.

Noralf.


Den 13.04.2018 18.53, skrev Noralf Trønnes:
> This patchset explores the possibility of having generic fbdev emulation
> in DRM for drivers that supports dumb buffers which they can export. An
> API is added to support in-kernel clients in general.
>
> In this version I was able to reuse the modesetting code from
> drm_fb_helper in the client API. This avoids code duplication, carries
> over lessons learned and the modesetting code is bisectable. The
> downside is that it takes +10 patches to rip drm_fb_helper in two, so
> maybe it's not worth it wrt possible breakage and a challenging review.
>
> Does the Intel CI test the fbdev emulation?
>
> Daniel had this concern with the previous version:
>
>      The register/unregister model needs more thought. Allowing both clients
>      to register whenever they want to, and drm_device instances to come and
>      go is what fbcon has done, and the resulting locking is a horror show.
>
>      I think if we require that all in-kernel drm_clients are registers when
>      loading drm.ko (and enabled/disabled only per module options and
>      Kconfig), then we can throw out all the locking. That avoids a lot of
>      the headaches.
>
> I have solved this by adding a notifier that fires when a new DRM device
> is registered (I've removed the new() callback). Currently only
> bootsplash uses this. The fbdev client needs to be setup from the driver
> since it can't know on device registration if the driver will setup it's
> own fbdev emulation later and the vtcon client hooks up to a user
> provided device id.
>
> Since fbcon can't handle fb_open failing, the buffer has to be
> pre-allocated. Exporting a GEM buffer pins the driver module making it
> impossible to unload it.
> I have included 2 solutions to the problem:
> - sysfs file to remove/close clients: remove_internal_clients
> - Change drm_gem_prime_export() so it doesn't pin on client buffers
>
> If a dumb buffer is exported from a kernel thread (worker) context, the
> file descriptor isn't closed and I leak a reference so the buffer isn't
> freed. Please look at drm_client_buffer_create() in patch
> 'drm/client: Finish the in-kernel client API'.
> This is a blocker that needs a solution.
>
>
> Noralf.
>
> Changes since version 3:
> Client API changes:
> - Drop drm_client_register_funcs() which attached clients indirectly.
>    Let clients attach directly using drm_client_new{_from_id}(). Clients
>    that wants to attach to all devices must be linked into drm.ko and use
>    the DRM device notifier. This is done to avoid the lock/race
>    register/unregister hell we have with fbcon. (Daniel Vetter)
> - drm_client_display_restore() checks if there is a master and if so
>    returns -EBUSY. (Daniel Vetter)
> - Allocate drm_file up front instead of on-demand. Since fbdev can't do
>    on demand buffer allocation because of fbcon, there's no need for this.
> - Add sysfs file to remove clients
> - Don't pin driver module when exporting gem client buffers
> - Dropped page flip support since drm_fb_helper is now used for fbdev
>    emulation.
>
> - The bootsplash client now switches over to fbdev on keypress.
>
> Changes since version 2:
> - Don't set drm master for in-kernel clients. (Daniel Vetter)
> - Add in-kernel client API
>
> Changes since version 1:
> - Don't add drm_fb_helper_fb_open() and drm_fb_helper_fb_release() to
>    DRM_FB_HELPER_DEFAULT_OPS(). (Fi.CI.STATIC)
>    The following uses that macro and sets fb_open/close: udlfb_ops,
>    amdgpufb_ops, drm_fb_helper_generic_fbdev_ops, nouveau_fbcon_ops,
>    nouveau_fbcon_sw_ops, radeonfb_ops.
>    This results in: warning: Initializer entry defined twice
> - Support CONFIG_DRM_KMS_HELPER=m (kbuild test robot)
>    ERROR: <function> [drivers/gpu/drm/drm_kms_helper.ko] undefined!
> - Drop buggy patch: (Chris Wilson)
>    drm/prime: Clear drm_gem_object->dma_buf on release
> - Defer buffer creation until fb_open.
>
>
> David Herrmann (1):
>    drm: provide management functions for drm_file
>
> Noralf Trønnes (24):
>    drm/file: Don't set master on in-kernel clients
>    drm/fb-helper: No need to cache rotation and sw_rotations
>    drm/fb-helper: Remove drm_fb_helper_debug_enter/leave()
>    drm/fb-helper: dpms_legacy(): Only set on connectors in use
>    drm/atomic: Move __drm_atomic_helper_disable_plane/set_config()
>    drm: Begin an API for in-kernel clients
>    drm/fb-helper: Use struct drm_client_display
>    drm/fb-helper: Move modeset commit code to drm_client
>    drm/connector: Add
>      drm_connector_has_preferred_mode/pick_cmdline_mode()
>    drm/connector: Add connector array functions
>    drm/i915: Add drm_driver->initial_client_display callback
>    drm/fb-helper: Remove struct drm_fb_helper_crtc
>    drm/fb-helper: Remove struct drm_fb_helper_connector
>    drm/fb-helper: Move modeset config code to drm_client
>    drm: Make ioctls available for in-kernel clients
>    drm/client: Bail out if there's a DRM master
>    drm/client: Make the display modes available to clients
>    drm/client: Finish the in-kernel client API
>    drm/prime: Don't pin module on export for in-kernel clients
>    drm/fb-helper: Add drm_fb_helper_fb_open/release()
>    drm/fb-helper: Add generic fbdev emulation
>    drm: Add DRM device registered notifier
>    drm/client: Hack: Add bootsplash
>    drm/client: Hack: Add DRM VT console client
>
>   drivers/gpu/drm/Kconfig                 |    2 +
>   drivers/gpu/drm/Makefile                |    4 +-
>   drivers/gpu/drm/client/Kconfig          |   14 +
>   drivers/gpu/drm/client/Makefile         |    3 +
>   drivers/gpu/drm/client/drm_bootsplash.c |  248 ++++++
>   drivers/gpu/drm/client/drm_vtcon.c      |  785 +++++++++++++++++
>   drivers/gpu/drm/client/internal.h       |   19 +
>   drivers/gpu/drm/drm_atomic.c            |  168 ++++
>   drivers/gpu/drm/drm_atomic_helper.c     |  168 +---
>   drivers/gpu/drm/drm_auth.c              |   33 +
>   drivers/gpu/drm/drm_client.c            | 1448 +++++++++++++++++++++++++++++++
>   drivers/gpu/drm/drm_connector.c         |  199 +++++
>   drivers/gpu/drm/drm_crtc_internal.h     |   18 +-
>   drivers/gpu/drm/drm_debugfs.c           |    7 +
>   drivers/gpu/drm/drm_drv.c               |   43 +
>   drivers/gpu/drm/drm_dumb_buffers.c      |   33 +-
>   drivers/gpu/drm/drm_fb_helper.c         | 1420 ++++++++----------------------
>   drivers/gpu/drm/drm_file.c              |  304 ++++---
>   drivers/gpu/drm/drm_framebuffer.c       |   50 +-
>   drivers/gpu/drm/drm_internal.h          |    7 +
>   drivers/gpu/drm/drm_ioc32.c             |    2 +-
>   drivers/gpu/drm/drm_ioctl.c             |    4 +-
>   drivers/gpu/drm/drm_prime.c             |   37 +-
>   drivers/gpu/drm/drm_probe_helper.c      |    3 +
>   drivers/gpu/drm/drm_sysfs.c             |   20 +
>   drivers/gpu/drm/i915/i915_drv.c         |    1 +
>   drivers/gpu/drm/i915/intel_drv.h        |   11 +
>   drivers/gpu/drm/i915/intel_fbdev.c      |  112 +--
>   include/drm/drm_atomic.h                |    5 +
>   include/drm/drm_atomic_helper.h         |    4 -
>   include/drm/drm_client.h                |  182 ++++
>   include/drm/drm_connector.h             |   11 +
>   include/drm/drm_device.h                |    4 +
>   include/drm/drm_drv.h                   |   25 +
>   include/drm/drm_fb_helper.h             |  126 ++-
>   35 files changed, 4007 insertions(+), 1513 deletions(-)
>   create mode 100644 drivers/gpu/drm/client/Kconfig
>   create mode 100644 drivers/gpu/drm/client/Makefile
>   create mode 100644 drivers/gpu/drm/client/drm_bootsplash.c
>   create mode 100644 drivers/gpu/drm/client/drm_vtcon.c
>   create mode 100644 drivers/gpu/drm/client/internal.h
>   create mode 100644 drivers/gpu/drm/drm_client.c
>   create mode 100644 include/drm/drm_client.h
>
> --
> 2.15.1
>



More information about the dri-devel mailing list