On Thu, Apr 12, 2018 at 06:34:46PM +0200, Noralf Trønnes wrote: > 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. That's generally an issue with your ISP. gmail works ime for mail bombs, even big ones. -Daniel > > 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 > > > -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx