drivers/gpu/drm/Kconfig | 19 ++ drivers/gpu/drm/Makefile | 3 + drivers/gpu/drm/drm_draw.c | 216 ++++++++++++++++++++ drivers/gpu/drm/drm_draw.h | 56 ++++++ drivers/gpu/drm/drm_drv.c | 2 + drivers/gpu/drm/drm_log.c | 391 ++++++++++++++++++++++++++++++++++++ drivers/gpu/drm/drm_log.h | 11 + drivers/gpu/drm/drm_panic.c | 247 +++-------------------- 8 files changed, 721 insertions(+), 224 deletions(-) create mode 100644 drivers/gpu/drm/drm_draw.c create mode 100644 drivers/gpu/drm/drm_draw.h create mode 100644 drivers/gpu/drm/drm_log.c create mode 100644 drivers/gpu/drm/drm_log.h
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 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. * drm_log can only be built-in (and drm must be built-in too). The reason is that, if you build it as a module, then a userspace application will be more appropriate than this module. * 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. Thanks and best regards, Jocelyn Falempe (4): 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 drivers/gpu/drm/Kconfig | 19 ++ drivers/gpu/drm/Makefile | 3 + drivers/gpu/drm/drm_draw.c | 216 ++++++++++++++++++++ drivers/gpu/drm/drm_draw.h | 56 ++++++ drivers/gpu/drm/drm_drv.c | 2 + drivers/gpu/drm/drm_log.c | 391 ++++++++++++++++++++++++++++++++++++ drivers/gpu/drm/drm_log.h | 11 + drivers/gpu/drm/drm_panic.c | 247 +++-------------------- 8 files changed, 721 insertions(+), 224 deletions(-) create mode 100644 drivers/gpu/drm/drm_draw.c create mode 100644 drivers/gpu/drm/drm_draw.h create mode 100644 drivers/gpu/drm/drm_log.c create mode 100644 drivers/gpu/drm/drm_log.h base-commit: 9aaeb87ce1e966169a57f53a02ba05b30880ffb8 -- 2.46.0
Hi Jocelyn, On 10/09/2024 08:56, 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. I tried this out on the OnePlus 6 (Qualcomm SDM845/freedreno) and it looks great :D Here's a demo for kicks: https://people.linaro.org/~caleb.connolly/drm_log_oneplus6.mp4 Tested-by: Caleb Connolly <caleb.connolly@linaro.org> # freedreno/dsi Kind regards, > > 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 > > 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. > * drm_log can only be built-in (and drm must be built-in too). > The reason is that, if you build it as a module, then a userspace application will be more appropriate than this module. > * 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. > > Thanks and best regards, > > Jocelyn Falempe (4): > 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 > > drivers/gpu/drm/Kconfig | 19 ++ > drivers/gpu/drm/Makefile | 3 + > drivers/gpu/drm/drm_draw.c | 216 ++++++++++++++++++++ > drivers/gpu/drm/drm_draw.h | 56 ++++++ > drivers/gpu/drm/drm_drv.c | 2 + > drivers/gpu/drm/drm_log.c | 391 ++++++++++++++++++++++++++++++++++++ > drivers/gpu/drm/drm_log.h | 11 + > drivers/gpu/drm/drm_panic.c | 247 +++-------------------- > 8 files changed, 721 insertions(+), 224 deletions(-) > create mode 100644 drivers/gpu/drm/drm_draw.c > create mode 100644 drivers/gpu/drm/drm_draw.h > create mode 100644 drivers/gpu/drm/drm_log.c > create mode 100644 drivers/gpu/drm/drm_log.h > > > base-commit: 9aaeb87ce1e966169a57f53a02ba05b30880ffb8 -- // Caleb (they/them)
On 05/10/2024 00:40, Caleb Connolly wrote: > Hi Jocelyn, > > On 10/09/2024 08:56, 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. > > > I tried this out on the OnePlus 6 (Qualcomm SDM845/freedreno) and it > looks great :D > > Here's a demo for kicks: > > https://people.linaro.org/~caleb.connolly/drm_log_oneplus6.mp4 Thanks, it's a really nice demo! For high-resolution screen, I will add integer scaling soon, so that should be a bit easier to read, without requiring huge fonts. -- Jocelyn > > Tested-by: Caleb Connolly <caleb.connolly@linaro.org> # freedreno/dsi > > Kind regards, >> >> 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 >> >> 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. >> * drm_log can only be built-in (and drm must be built-in too). >> The reason is that, if you build it as a module, then a userspace >> application will be more appropriate than this module. >> * 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. >> >> Thanks and best regards, >> >> Jocelyn Falempe (4): >> 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 >> >> drivers/gpu/drm/Kconfig | 19 ++ >> drivers/gpu/drm/Makefile | 3 + >> drivers/gpu/drm/drm_draw.c | 216 ++++++++++++++++++++ >> drivers/gpu/drm/drm_draw.h | 56 ++++++ >> drivers/gpu/drm/drm_drv.c | 2 + >> drivers/gpu/drm/drm_log.c | 391 ++++++++++++++++++++++++++++++++++++ >> drivers/gpu/drm/drm_log.h | 11 + >> drivers/gpu/drm/drm_panic.c | 247 +++-------------------- >> 8 files changed, 721 insertions(+), 224 deletions(-) >> create mode 100644 drivers/gpu/drm/drm_draw.c >> create mode 100644 drivers/gpu/drm/drm_draw.h >> create mode 100644 drivers/gpu/drm/drm_log.c >> create mode 100644 drivers/gpu/drm/drm_log.h >> >> >> base-commit: 9aaeb87ce1e966169a57f53a02ba05b30880ffb8 >
© 2016 - 2024 Red Hat, Inc.