From: "Noralf Trønnes" <noralf@tronnes.org>
To: dri-devel@lists.freedesktop.org
Cc: intel-gfx@lists.freedesktop.org, "Noralf Trønnes" <noralf@tronnes.org>
Subject: [RFC v4 00/25] drm: Add generic fbdev emulation
Date: Sat, 14 Apr 2018 13:52:53 +0200 [thread overview]
Message-ID: <20180414115318.14500-1-noralf@tronnes.org> (raw)
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
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next reply other threads:[~2018-04-14 11:52 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-04-14 11:52 Noralf Trønnes [this message]
2018-04-14 11:52 ` [RFC v4 01/25] drm: provide management functions for drm_file Noralf Trønnes
2018-04-14 11:52 ` [RFC v4 02/25] drm/file: Don't set master on in-kernel clients Noralf Trønnes
2018-04-14 11:52 ` [RFC v4 03/25] drm/fb-helper: No need to cache rotation and sw_rotations Noralf Trønnes
2018-04-14 11:52 ` [RFC v4 04/25] drm/fb-helper: Remove drm_fb_helper_debug_enter/leave() Noralf Trønnes
2018-04-14 11:52 ` [RFC v4 05/25] drm/fb-helper: dpms_legacy(): Only set on connectors in use Noralf Trønnes
2018-04-14 11:52 ` [RFC v4 06/25] drm/atomic: Move __drm_atomic_helper_disable_plane/set_config() Noralf Trønnes
2018-04-16 8:30 ` Daniel Vetter
2018-04-14 11:53 ` [RFC v4 07/25] drm: Begin an API for in-kernel clients Noralf Trønnes
2018-04-14 11:53 ` [RFC v4 08/25] drm/fb-helper: Use struct drm_client_display Noralf Trønnes
2018-04-14 11:53 ` [RFC v4 09/25] drm/fb-helper: Move modeset commit code to drm_client Noralf Trønnes
2018-04-14 11:53 ` [RFC v4 10/25] drm/connector: Add drm_connector_has_preferred_mode/pick_cmdline_mode() Noralf Trønnes
2018-04-14 11:53 ` [RFC v4 11/25] drm/connector: Add connector array functions Noralf Trønnes
2018-04-16 8:33 ` Daniel Vetter
2018-04-14 11:53 ` [RFC v4 12/25] drm/i915: Add drm_driver->initial_client_display callback Noralf Trønnes
2018-04-16 8:38 ` Daniel Vetter
2019-03-01 11:46 ` [Intel-gfx] " Noralf Trønnes
2019-03-01 11:51 ` Daniel Vetter
2018-04-14 11:53 ` [RFC v4 13/25] drm/fb-helper: Remove struct drm_fb_helper_crtc Noralf Trønnes
2018-04-14 11:53 ` [RFC v4 14/25] drm/fb-helper: Remove struct drm_fb_helper_connector Noralf Trønnes
2018-04-14 11:53 ` [RFC v4 15/25] drm/fb-helper: Move modeset config code to drm_client Noralf Trønnes
2018-04-14 11:53 ` [RFC v4 16/25] drm: Make ioctls available for in-kernel clients Noralf Trønnes
2018-04-16 9:04 ` Daniel Vetter
2018-04-14 11:53 ` [RFC v4 17/25] drm/client: Bail out if there's a DRM master Noralf Trønnes
2018-04-16 8:45 ` Daniel Vetter
2018-04-14 11:53 ` [RFC v4 18/25] drm/client: Make the display modes available to clients Noralf Trønnes
2018-04-14 11:53 ` [RFC v4 19/25] drm/client: Finish the in-kernel client API Noralf Trønnes
2018-04-16 8:27 ` [Intel-gfx] " Daniel Vetter
2018-04-16 15:58 ` Noralf Trønnes
2018-04-17 8:08 ` Daniel Vetter
2018-04-14 11:53 ` [RFC v4 20/25] drm/prime: Don't pin module on export for in-kernel clients Noralf Trønnes
2018-04-14 11:53 ` [RFC v4 21/25] drm/fb-helper: Add drm_fb_helper_fb_open/release() Noralf Trønnes
2018-04-16 8:46 ` Daniel Vetter
2018-04-16 16:10 ` Noralf Trønnes
2018-04-17 8:14 ` [Intel-gfx] " Daniel Vetter
2018-04-14 11:53 ` [RFC v4 22/25] drm/fb-helper: Add generic fbdev emulation Noralf Trønnes
2018-04-16 8:52 ` Daniel Vetter
2018-04-14 11:53 ` [RFC v4 23/25] drm: Add DRM device registered notifier Noralf Trønnes
2018-04-17 10:16 ` Daniel Vetter
2018-04-14 11:53 ` [RFC v4 24/25] drm/client: Hack: Add bootsplash Noralf Trønnes
2018-04-14 11:53 ` [RFC v4 25/25] drm/client: Hack: Add DRM VT console client Noralf Trønnes
2018-04-16 8:21 ` [RFC v4 00/25] drm: Add generic fbdev emulation Daniel Vetter
2018-04-16 18:49 ` Noralf Trønnes
2018-04-17 8:10 ` [Intel-gfx] " Daniel Vetter
-- strict thread matches above, loose matches on Subject: below --
2018-04-13 16:53 Noralf Trønnes
2018-04-13 17:06 ` Noralf Trønnes
2018-04-12 13:17 Noralf Trønnes
2018-04-12 16:34 ` Noralf Trønnes
2018-04-16 7:47 ` Daniel Vetter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180414115318.14500-1-noralf@tronnes.org \
--to=noralf@tronnes.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=intel-gfx@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).