On 04/12/2024 16:44, Jocelyn Falempe wrote:
drm_log is a simple logger that uses the drm_client API to print the kmsg boot 
log on the screen.
This is not a full replacement to fbcon, as it will only print the kmsg.
It will never handle user input, or a terminal because this is better done in 
userspace.

If you're curious on how it looks like, I've put a small demo here:
https://people.redhat.com/jfalempe/drm_log/drm_log_draft_boot_v2.mp4

I just pushed it to drm-misc-next.

Thanks all for your reviews and comments.

Best regards,

--

Jocelyn

Design decisions:
   * It uses the drm_client API, so it should work on all drm drivers from the 
start.
   * It doesn't scroll the message, that way it doesn't need to redraw the 
whole screen for each new message.
     It also means it doesn't have to keep drawn messages in memory, to redraw 
them when scrolling.
   * It uses the new non-blocking console API, so it should work well with 
PREEMPT_RT
v2:
  * Use vmap_local() api, with that change, I've tested it successfully on 
simpledrm, virtio-gpu, amdgpu, and nouveau.
  * Stop drawing when the drm_master is taken. This avoid wasting CPU cycle if 
the buffer is not visible.
  * Use deferred probe. Only do the probe the first time there is a log to 
draw. With this, if you boot with quiet, drm_log won't do any modeset.
  * Add color support for the timestamp prefix, like what dmesg does.
  * Add build dependency on  disabling the fbdev emulation, as they are both 
drm_client, and there is no way to choose which one gets the focus.

v3:
  * Remove the work thread and circular buffer, and use the new write_thread() 
console API.
  * Register a console for each drm driver.

v4:
  * Can be built as a module, even if that's not really useful.
  * Rebased on top of "drm: Introduce DRM client library" series from Thomas 
Zimmermann.
  * Add a Kconfig menu to choose between drm client.
  * Add suspend/resume callbacks.
  * Add integer scaling support.
v5:
  * Build drm_log in drm_client_lib module, to avoid circular dependency.
  * Export drm_draw symbols, so they can be used if drm_client_lib is built as 
module.
  * Change scale parameter to unsigned int (Jani Nikula)

v6:
  * Use console_stop() and console_start() in the suspend/resume callback (Petr 
Mladek).
  * rebase and solve conflict with "drm/panic: Add ABGR2101010 support"

v7:
  * Add a patch fix a build issue due to missing DRM_CLIENT_LIB, reported by 
kernel test bot.

v8:
  * Rebased after drm client moved to drivers/gpu/drm/clients/
  * Rename DRM_LOG to DRM_CLIENT_LOG (Thomas Zimmermann)
  * Drop "Always select DRM_CLIENT_LIB", and select only if DRM_CLIENT_LOG is 
set
  * Add an info message if no clients are initialized in drm_client_setup()

v9:
  * Rename drm_draw.h to drm_draw_internal.h (Jani Nikula)
  * Add cflags to remove the "../" when including drm internal headers (Jani 
Nikula)
  * Order select alphabetically in KConfig (Thomas Zimmermann)
  * Replace drm_info with drm_dbg, to be less verbose (Thomas Zimmermann)
  * Rename module parameter to drm_client_lib.active (Thomas Zimmermann)
  * Warn if drm_client_lib.active is malformated (Thomas Zimmermann)
Jocelyn Falempe (6):
   drm/panic: Move drawing functions to drm_draw
   drm/log: Introduce a new boot logger to draw the kmsg on the screen
   drm/log: Do not draw if drm_master is taken
   drm/log: Color the timestamp, to improve readability
   drm/log: Implement suspend/resume
   drm/log: Add integer scaling support

  drivers/gpu/drm/Kconfig                       |   5 +
  drivers/gpu/drm/Makefile                      |   1 +
  drivers/gpu/drm/clients/Kconfig               |  48 ++
  drivers/gpu/drm/clients/Makefile              |   3 +
  drivers/gpu/drm/clients/drm_client_internal.h |   6 +
  drivers/gpu/drm/clients/drm_client_setup.c    |  29 +-
  drivers/gpu/drm/clients/drm_log.c             | 420 ++++++++++++++++++
  drivers/gpu/drm/drm_draw.c                    | 233 ++++++++++
  drivers/gpu/drm/drm_draw_internal.h           |  56 +++
  drivers/gpu/drm/drm_panic.c                   | 257 +----------
  10 files changed, 820 insertions(+), 238 deletions(-)
  create mode 100644 drivers/gpu/drm/clients/drm_log.c
  create mode 100644 drivers/gpu/drm/drm_draw.c
  create mode 100644 drivers/gpu/drm/drm_draw_internal.h


base-commit: c6eabbab359c156669e10d5dec3e71e80ff09bd2

Reply via email to