[RFC v4 00/25] drm: Add generic fbdev emulation
Noralf Trønnes
noralf at tronnes.org
Thu Apr 12 16:34:46 UTC 2018
I hit a 'Sending rate exceeded' error with this patchset, so it didn't
go out as it should.
I will resend the patchset when I find out how to avoid this problem.
Noralf.
Den 12.04.2018 15.17, 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