* [PATCH] drm/vmwgfx: Add drm_panic support
@ 2025-10-23 20:04 Ian Forbes
2025-10-27 13:56 ` Jocelyn Falempe
2025-11-07 20:46 ` [PATCH v2] " Ian Forbes
0 siblings, 2 replies; 9+ messages in thread
From: Ian Forbes @ 2025-10-23 20:04 UTC (permalink / raw)
To: dri-devel
Cc: bcm-kernel-feedback-list, zack.rusin, maaz.mombasawala,
Ian Forbes, Ryosuke Yasuoka
Sets up VRAM as the scanout buffer then switches to legacy mode.
Suggested-by: Ryosuke Yasuoka <ryasuoka@redhat.com>
Signed-off-by: Ian Forbes <ian.forbes@broadcom.com>
---
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 33 ++++++++++++++++++++++++++++
drivers/gpu/drm/vmwgfx/vmwgfx_kms.h | 5 +++++
drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c | 2 ++
3 files changed, 40 insertions(+)
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
index 54ea1b513950..4ff4ae041236 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
@@ -20,6 +20,7 @@
#include <drm/drm_rect.h>
#include <drm/drm_sysfs.h>
#include <drm/drm_edid.h>
+#include <drm/drm_panic.h>
void vmw_du_init(struct vmw_display_unit *du)
{
@@ -2022,3 +2023,35 @@ bool vmw_user_object_is_null(struct vmw_user_object *uo)
{
return !uo->buffer && !uo->surface;
}
+
+int
+vmw_get_scanout_buffer(struct drm_plane *plane, struct drm_scanout_buffer *sb)
+{
+ void *vram;
+ struct vmw_private *vmw_priv = container_of(plane->dev, struct vmw_private, drm);
+
+ // Only call on the primary display
+ if (container_of(plane, struct vmw_display_unit, primary)->unit != 0)
+ return -EINVAL;
+
+ vram = memremap(vmw_priv->vram_start, vmw_priv->vram_size,
+ MEMREMAP_WB | MEMREMAP_DEC);
+ if (!vram)
+ return -ENOMEM;
+
+ sb->map[0].vaddr = vram;
+ sb->format = drm_format_info(DRM_FORMAT_RGB565);
+ sb->width = vmw_priv->initial_width;
+ sb->height = vmw_priv->initial_height;
+ sb->pitch[0] = sb->width * 2;
+ return 0;
+}
+
+void vmw_panic_flush(struct drm_plane *plane)
+{
+ struct vmw_private *vmw_priv = container_of(plane->dev, struct vmw_private, drm);
+
+ vmw_kms_write_svga(vmw_priv,
+ vmw_priv->initial_width, vmw_priv->initial_height,
+ vmw_priv->initial_width * 2, 16, 16);
+}
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
index 445471fe9be6..8e37561cd527 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
@@ -500,6 +500,11 @@ int vmw_kms_stdu_readback(struct vmw_private *dev_priv,
int vmw_du_helper_plane_update(struct vmw_du_update_plane *update);
+struct drm_scanout_buffer;
+
+int vmw_get_scanout_buffer(struct drm_plane *pl, struct drm_scanout_buffer *sb);
+void vmw_panic_flush(struct drm_plane *plane);
+
/**
* vmw_du_translate_to_crtc - Translate a rect from framebuffer to crtc
* @state: Plane state.
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
index 20aab725e53a..37cb742ba1d9 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
@@ -1506,6 +1506,8 @@ drm_plane_helper_funcs vmw_stdu_primary_plane_helper_funcs = {
.atomic_update = vmw_stdu_primary_plane_atomic_update,
.prepare_fb = vmw_stdu_primary_plane_prepare_fb,
.cleanup_fb = vmw_stdu_primary_plane_cleanup_fb,
+ .get_scanout_buffer = vmw_get_scanout_buffer,
+ .panic_flush = vmw_panic_flush,
};
static const struct drm_crtc_helper_funcs vmw_stdu_crtc_helper_funcs = {
--
2.51.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH] drm/vmwgfx: Add drm_panic support
2025-10-23 20:04 [PATCH] drm/vmwgfx: Add drm_panic support Ian Forbes
@ 2025-10-27 13:56 ` Jocelyn Falempe
2025-10-28 11:51 ` Ryosuke Yasuoka
2025-11-07 20:46 ` [PATCH v2] " Ian Forbes
1 sibling, 1 reply; 9+ messages in thread
From: Jocelyn Falempe @ 2025-10-27 13:56 UTC (permalink / raw)
To: Ian Forbes, dri-devel
Cc: bcm-kernel-feedback-list, zack.rusin, maaz.mombasawala,
Ryosuke Yasuoka
On 23/10/2025 22:04, Ian Forbes wrote:
> Sets up VRAM as the scanout buffer then switches to legacy mode.
Thank you and Ryosuke for working on drm_panic support on vmwgfx.
For the use of the drm_panic API, it looks good to me.
Acked-by: Jocelyn Falempe <jfalempe@redhat.com>
>
> Suggested-by: Ryosuke Yasuoka <ryasuoka@redhat.com>
> Signed-off-by: Ian Forbes <ian.forbes@broadcom.com>
> ---
> drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 33 ++++++++++++++++++++++++++++
> drivers/gpu/drm/vmwgfx/vmwgfx_kms.h | 5 +++++
> drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c | 2 ++
> 3 files changed, 40 insertions(+)
>
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> index 54ea1b513950..4ff4ae041236 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> @@ -20,6 +20,7 @@
> #include <drm/drm_rect.h>
> #include <drm/drm_sysfs.h>
> #include <drm/drm_edid.h>
> +#include <drm/drm_panic.h>
>
> void vmw_du_init(struct vmw_display_unit *du)
> {
> @@ -2022,3 +2023,35 @@ bool vmw_user_object_is_null(struct vmw_user_object *uo)
> {
> return !uo->buffer && !uo->surface;
> }
> +
> +int
> +vmw_get_scanout_buffer(struct drm_plane *plane, struct drm_scanout_buffer *sb)
> +{
> + void *vram;
> + struct vmw_private *vmw_priv = container_of(plane->dev, struct vmw_private, drm);
> +
> + // Only call on the primary display
> + if (container_of(plane, struct vmw_display_unit, primary)->unit != 0)
> + return -EINVAL;
> +
> + vram = memremap(vmw_priv->vram_start, vmw_priv->vram_size,
> + MEMREMAP_WB | MEMREMAP_DEC);
> + if (!vram)
> + return -ENOMEM;
> +
> + sb->map[0].vaddr = vram;
> + sb->format = drm_format_info(DRM_FORMAT_RGB565);
> + sb->width = vmw_priv->initial_width;
> + sb->height = vmw_priv->initial_height;
> + sb->pitch[0] = sb->width * 2;
> + return 0;
> +}
> +
> +void vmw_panic_flush(struct drm_plane *plane)
> +{
> + struct vmw_private *vmw_priv = container_of(plane->dev, struct vmw_private, drm);
> +
> + vmw_kms_write_svga(vmw_priv,
> + vmw_priv->initial_width, vmw_priv->initial_height,
> + vmw_priv->initial_width * 2, 16, 16);
> +}
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
> index 445471fe9be6..8e37561cd527 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
> @@ -500,6 +500,11 @@ int vmw_kms_stdu_readback(struct vmw_private *dev_priv,
>
> int vmw_du_helper_plane_update(struct vmw_du_update_plane *update);
>
> +struct drm_scanout_buffer;
> +
> +int vmw_get_scanout_buffer(struct drm_plane *pl, struct drm_scanout_buffer *sb);
> +void vmw_panic_flush(struct drm_plane *plane);
> +
> /**
> * vmw_du_translate_to_crtc - Translate a rect from framebuffer to crtc
> * @state: Plane state.
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
> index 20aab725e53a..37cb742ba1d9 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
> @@ -1506,6 +1506,8 @@ drm_plane_helper_funcs vmw_stdu_primary_plane_helper_funcs = {
> .atomic_update = vmw_stdu_primary_plane_atomic_update,
> .prepare_fb = vmw_stdu_primary_plane_prepare_fb,
> .cleanup_fb = vmw_stdu_primary_plane_cleanup_fb,
> + .get_scanout_buffer = vmw_get_scanout_buffer,
> + .panic_flush = vmw_panic_flush,
> };
>
> static const struct drm_crtc_helper_funcs vmw_stdu_crtc_helper_funcs = {
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] drm/vmwgfx: Add drm_panic support
2025-10-27 13:56 ` Jocelyn Falempe
@ 2025-10-28 11:51 ` Ryosuke Yasuoka
2025-10-28 13:55 ` Jocelyn Falempe
0 siblings, 1 reply; 9+ messages in thread
From: Ryosuke Yasuoka @ 2025-10-28 11:51 UTC (permalink / raw)
To: Ian Forbes
Cc: dri-devel, bcm-kernel-feedback-list, zack.rusin, maaz.mombasawala,
jfalempe
On Mon, Oct 27, 2025 at 02:56:21PM +0100, Jocelyn Falempe wrote:
> On 23/10/2025 22:04, Ian Forbes wrote:
> > Sets up VRAM as the scanout buffer then switches to legacy mode.
>
> Thank you and Ryosuke for working on drm_panic support on vmwgfx.
> For the use of the drm_panic API, it looks good to me.
>
> Acked-by: Jocelyn Falempe <jfalempe@redhat.com>
> >
> > Suggested-by: Ryosuke Yasuoka <ryasuoka@redhat.com>
> > Signed-off-by: Ian Forbes <ian.forbes@broadcom.com>
> > ---
> > drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 33 ++++++++++++++++++++++++++++
> > drivers/gpu/drm/vmwgfx/vmwgfx_kms.h | 5 +++++
> > drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c | 2 ++
> > 3 files changed, 40 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> > index 54ea1b513950..4ff4ae041236 100644
> > --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> > +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> > @@ -20,6 +20,7 @@
> > #include <drm/drm_rect.h>
> > #include <drm/drm_sysfs.h>
> > #include <drm/drm_edid.h>
> > +#include <drm/drm_panic.h>
> > void vmw_du_init(struct vmw_display_unit *du)
> > {
> > @@ -2022,3 +2023,35 @@ bool vmw_user_object_is_null(struct vmw_user_object *uo)
> > {
> > return !uo->buffer && !uo->surface;
> > }
> > +
> > +int
> > +vmw_get_scanout_buffer(struct drm_plane *plane, struct drm_scanout_buffer *sb)
> > +{
> > + void *vram;
> > + struct vmw_private *vmw_priv = container_of(plane->dev, struct vmw_private, drm);
> > +
> > + // Only call on the primary display
> > + if (container_of(plane, struct vmw_display_unit, primary)->unit != 0)
> > + return -EINVAL;
> > +
> > + vram = memremap(vmw_priv->vram_start, vmw_priv->vram_size,
> > + MEMREMAP_WB | MEMREMAP_DEC);
> > + if (!vram)
> > + return -ENOMEM;
> > +
> > + sb->map[0].vaddr = vram;
> > + sb->format = drm_format_info(DRM_FORMAT_RGB565);
Let me confirm whether debugfs feature works correctly. As I mentioned
in my original patch [1], modifying this format will allow to display
the panic screen by debugfs only one time. In your environment, can you
trigger panic screen by debugfs multiple times?
> > + sb->width = vmw_priv->initial_width;
> > + sb->height = vmw_priv->initial_height;
> > + sb->pitch[0] = sb->width * 2;
> > + return 0;
> > +}
> > +
> > +void vmw_panic_flush(struct drm_plane *plane)
> > +{
> > + struct vmw_private *vmw_priv = container_of(plane->dev, struct vmw_private, drm);
> > +
> > + vmw_kms_write_svga(vmw_priv,
> > + vmw_priv->initial_width, vmw_priv->initial_height,
> > + vmw_priv->initial_width * 2, 16, 16);
vmw_kms_write_svga() calls vmw_write() which locks spin lock. Since
these functions are called in panic handler, we should avoid them. You
can find some idea in my original patch [1]!
[1] https://lore.kernel.org/all/20250919032936.2267240-1-ryasuoka@redhat.com/
Thank you
Ryosuke
> > +}
> > diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
> > index 445471fe9be6..8e37561cd527 100644
> > --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
> > +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
> > @@ -500,6 +500,11 @@ int vmw_kms_stdu_readback(struct vmw_private *dev_priv,
> > int vmw_du_helper_plane_update(struct vmw_du_update_plane *update);
> > +struct drm_scanout_buffer;
> > +
> > +int vmw_get_scanout_buffer(struct drm_plane *pl, struct drm_scanout_buffer *sb);
> > +void vmw_panic_flush(struct drm_plane *plane);
> > +
> > /**
> > * vmw_du_translate_to_crtc - Translate a rect from framebuffer to crtc
> > * @state: Plane state.
> > diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
> > index 20aab725e53a..37cb742ba1d9 100644
> > --- a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
> > +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
> > @@ -1506,6 +1506,8 @@ drm_plane_helper_funcs vmw_stdu_primary_plane_helper_funcs = {
> > .atomic_update = vmw_stdu_primary_plane_atomic_update,
> > .prepare_fb = vmw_stdu_primary_plane_prepare_fb,
> > .cleanup_fb = vmw_stdu_primary_plane_cleanup_fb,
> > + .get_scanout_buffer = vmw_get_scanout_buffer,
> > + .panic_flush = vmw_panic_flush,
> > };
> > static const struct drm_crtc_helper_funcs vmw_stdu_crtc_helper_funcs = {
>
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] drm/vmwgfx: Add drm_panic support
2025-10-28 11:51 ` Ryosuke Yasuoka
@ 2025-10-28 13:55 ` Jocelyn Falempe
0 siblings, 0 replies; 9+ messages in thread
From: Jocelyn Falempe @ 2025-10-28 13:55 UTC (permalink / raw)
To: Ryosuke Yasuoka, Ian Forbes
Cc: dri-devel, bcm-kernel-feedback-list, zack.rusin, maaz.mombasawala
On 28/10/2025 12:51, Ryosuke Yasuoka wrote:
> On Mon, Oct 27, 2025 at 02:56:21PM +0100, Jocelyn Falempe wrote:
>> On 23/10/2025 22:04, Ian Forbes wrote:
>>> Sets up VRAM as the scanout buffer then switches to legacy mode.
>>
>> Thank you and Ryosuke for working on drm_panic support on vmwgfx.
>> For the use of the drm_panic API, it looks good to me.
>>
>> Acked-by: Jocelyn Falempe <jfalempe@redhat.com>
>>>
>>> Suggested-by: Ryosuke Yasuoka <ryasuoka@redhat.com>
>>> Signed-off-by: Ian Forbes <ian.forbes@broadcom.com>
>>> ---
>>> drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 33 ++++++++++++++++++++++++++++
>>> drivers/gpu/drm/vmwgfx/vmwgfx_kms.h | 5 +++++
>>> drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c | 2 ++
>>> 3 files changed, 40 insertions(+)
>>>
>>> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
>>> index 54ea1b513950..4ff4ae041236 100644
>>> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
>>> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
>>> @@ -20,6 +20,7 @@
>>> #include <drm/drm_rect.h>
>>> #include <drm/drm_sysfs.h>
>>> #include <drm/drm_edid.h>
>>> +#include <drm/drm_panic.h>
>>> void vmw_du_init(struct vmw_display_unit *du)
>>> {
>>> @@ -2022,3 +2023,35 @@ bool vmw_user_object_is_null(struct vmw_user_object *uo)
>>> {
>>> return !uo->buffer && !uo->surface;
>>> }
>>> +
>>> +int
>>> +vmw_get_scanout_buffer(struct drm_plane *plane, struct drm_scanout_buffer *sb)
>>> +{
>>> + void *vram;
>>> + struct vmw_private *vmw_priv = container_of(plane->dev, struct vmw_private, drm);
>>> +
>>> + // Only call on the primary display
>>> + if (container_of(plane, struct vmw_display_unit, primary)->unit != 0)
>>> + return -EINVAL;
>>> +
>>> + vram = memremap(vmw_priv->vram_start, vmw_priv->vram_size,
>>> + MEMREMAP_WB | MEMREMAP_DEC);
>>> + if (!vram)
>>> + return -ENOMEM;
>>> +
>>> + sb->map[0].vaddr = vram;
>>> + sb->format = drm_format_info(DRM_FORMAT_RGB565);
>
> Let me confirm whether debugfs feature works correctly. As I mentioned
> in my original patch [1], modifying this format will allow to display
> the panic screen by debugfs only one time. In your environment, can you
> trigger panic screen by debugfs multiple times?
The debugfs interface is broken by design, it's just here to help adding
new device support to drm_panic, so not a problem if there are garbage
after you trigger it. (it's the case on most driver anyway).
>
>>> + sb->width = vmw_priv->initial_width;
>>> + sb->height = vmw_priv->initial_height;
>>> + sb->pitch[0] = sb->width * 2;
>>> + return 0;
>>> +}
>>> +
>>> +void vmw_panic_flush(struct drm_plane *plane)
>>> +{
>>> + struct vmw_private *vmw_priv = container_of(plane->dev, struct vmw_private, drm);
>>> +
>>> + vmw_kms_write_svga(vmw_priv,
>>> + vmw_priv->initial_width, vmw_priv->initial_height,
>>> + vmw_priv->initial_width * 2, 16, 16);
>
> vmw_kms_write_svga() calls vmw_write() which locks spin lock. Since
> these functions are called in panic handler, we should avoid them. You
> can find some idea in my original patch [1]!
Maybe another solution is to restrict the panic handler to
VMWGFX_PCI_ID_SVGA3, that doesn't need locks in vmw_write().
I don't know if there are still a lot of hosts with VMWGFX_PCI_ID_SVGA2
in the open, and if we want to add drm_panic support for them.
Best regards,
--
Jocelyn
>
> [1] https://lore.kernel.org/all/20250919032936.2267240-1-ryasuoka@redhat.com/
>
> Thank you
> Ryosuke
>
>>> +}
>>> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
>>> index 445471fe9be6..8e37561cd527 100644
>>> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
>>> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
>>> @@ -500,6 +500,11 @@ int vmw_kms_stdu_readback(struct vmw_private *dev_priv,
>>> int vmw_du_helper_plane_update(struct vmw_du_update_plane *update);
>>> +struct drm_scanout_buffer;
>>> +
>>> +int vmw_get_scanout_buffer(struct drm_plane *pl, struct drm_scanout_buffer *sb);
>>> +void vmw_panic_flush(struct drm_plane *plane);
>>> +
>>> /**
>>> * vmw_du_translate_to_crtc - Translate a rect from framebuffer to crtc
>>> * @state: Plane state.
>>> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
>>> index 20aab725e53a..37cb742ba1d9 100644
>>> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
>>> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
>>> @@ -1506,6 +1506,8 @@ drm_plane_helper_funcs vmw_stdu_primary_plane_helper_funcs = {
>>> .atomic_update = vmw_stdu_primary_plane_atomic_update,
>>> .prepare_fb = vmw_stdu_primary_plane_prepare_fb,
>>> .cleanup_fb = vmw_stdu_primary_plane_cleanup_fb,
>>> + .get_scanout_buffer = vmw_get_scanout_buffer,
>>> + .panic_flush = vmw_panic_flush,
>>> };
>>> static const struct drm_crtc_helper_funcs vmw_stdu_crtc_helper_funcs = {
>>
>>
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2] drm/vmwgfx: Add drm_panic support
2025-10-23 20:04 [PATCH] drm/vmwgfx: Add drm_panic support Ian Forbes
2025-10-27 13:56 ` Jocelyn Falempe
@ 2025-11-07 20:46 ` Ian Forbes
2025-11-12 9:14 ` Thomas Zimmermann
2025-11-12 9:23 ` Thomas Zimmermann
1 sibling, 2 replies; 9+ messages in thread
From: Ian Forbes @ 2025-11-07 20:46 UTC (permalink / raw)
To: dri-devel
Cc: bcm-kernel-feedback-list, zack.rusin, maaz.mombasawala,
Ian Forbes, Ryosuke Yasuoka
Sets up VRAM as the scanout buffer then switches to legacy mode.
Suggested-by: Ryosuke Yasuoka <ryasuoka@redhat.com>
Signed-off-by: Ian Forbes <ian.forbes@broadcom.com>
---
v2:
- Set SVGA_REG_CONFIG_DONE=false so that SVGA3 works correctly
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 35 ++++++++++++++++++++++++++++
drivers/gpu/drm/vmwgfx/vmwgfx_kms.h | 5 ++++
drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c | 2 ++
3 files changed, 42 insertions(+)
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
index efdbb67a4966..87448e86d3b3 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
@@ -20,6 +20,7 @@
#include <drm/drm_rect.h>
#include <drm/drm_sysfs.h>
#include <drm/drm_edid.h>
+#include <drm/drm_panic.h>
void vmw_du_init(struct vmw_display_unit *du)
{
@@ -2025,3 +2026,37 @@ bool vmw_user_object_is_null(struct vmw_user_object *uo)
{
return !uo->buffer && !uo->surface;
}
+
+int
+vmw_get_scanout_buffer(struct drm_plane *plane, struct drm_scanout_buffer *sb)
+{
+ void *vram;
+ struct vmw_private *vmw_priv = container_of(plane->dev, struct vmw_private, drm);
+
+ // Only call on the primary display
+ if (container_of(plane, struct vmw_display_unit, primary)->unit != 0)
+ return -EINVAL;
+
+ vmw_write(vmw_priv, SVGA_REG_CONFIG_DONE, false);
+
+ vram = memremap(vmw_priv->vram_start, vmw_priv->vram_size,
+ MEMREMAP_WB | MEMREMAP_DEC);
+ if (!vram)
+ return -ENOMEM;
+
+ sb->map[0].vaddr = vram;
+ sb->format = drm_format_info(DRM_FORMAT_RGB565);
+ sb->width = vmw_priv->initial_width;
+ sb->height = vmw_priv->initial_height;
+ sb->pitch[0] = sb->width * 2;
+ return 0;
+}
+
+void vmw_panic_flush(struct drm_plane *plane)
+{
+ struct vmw_private *vmw_priv = container_of(plane->dev, struct vmw_private, drm);
+
+ vmw_kms_write_svga(vmw_priv,
+ vmw_priv->initial_width, vmw_priv->initial_height,
+ vmw_priv->initial_width * 2, 16, 16);
+}
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
index 445471fe9be6..8e37561cd527 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
@@ -500,6 +500,11 @@ int vmw_kms_stdu_readback(struct vmw_private *dev_priv,
int vmw_du_helper_plane_update(struct vmw_du_update_plane *update);
+struct drm_scanout_buffer;
+
+int vmw_get_scanout_buffer(struct drm_plane *pl, struct drm_scanout_buffer *sb);
+void vmw_panic_flush(struct drm_plane *plane);
+
/**
* vmw_du_translate_to_crtc - Translate a rect from framebuffer to crtc
* @state: Plane state.
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
index add13294fb7c..faacfef7baa5 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
@@ -1506,6 +1506,8 @@ drm_plane_helper_funcs vmw_stdu_primary_plane_helper_funcs = {
.atomic_update = vmw_stdu_primary_plane_atomic_update,
.prepare_fb = vmw_stdu_primary_plane_prepare_fb,
.cleanup_fb = vmw_stdu_primary_plane_cleanup_fb,
+ .get_scanout_buffer = vmw_get_scanout_buffer,
+ .panic_flush = vmw_panic_flush,
};
static const struct drm_crtc_helper_funcs vmw_stdu_crtc_helper_funcs = {
--
2.51.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v2] drm/vmwgfx: Add drm_panic support
2025-11-07 20:46 ` [PATCH v2] " Ian Forbes
@ 2025-11-12 9:14 ` Thomas Zimmermann
2025-11-12 9:23 ` Thomas Zimmermann
1 sibling, 0 replies; 9+ messages in thread
From: Thomas Zimmermann @ 2025-11-12 9:14 UTC (permalink / raw)
To: Ian Forbes, dri-devel
Cc: bcm-kernel-feedback-list, zack.rusin, maaz.mombasawala,
Ryosuke Yasuoka
Hi
Am 07.11.25 um 21:46 schrieb Ian Forbes:
> Sets up VRAM as the scanout buffer then switches to legacy mode.
>
> Suggested-by: Ryosuke Yasuoka <ryasuoka@redhat.com>
> Signed-off-by: Ian Forbes <ian.forbes@broadcom.com>
> ---
>
> v2:
> - Set SVGA_REG_CONFIG_DONE=false so that SVGA3 works correctly
>
> drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 35 ++++++++++++++++++++++++++++
> drivers/gpu/drm/vmwgfx/vmwgfx_kms.h | 5 ++++
> drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c | 2 ++
> 3 files changed, 42 insertions(+)
>
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> index efdbb67a4966..87448e86d3b3 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> @@ -20,6 +20,7 @@
> #include <drm/drm_rect.h>
> #include <drm/drm_sysfs.h>
> #include <drm/drm_edid.h>
> +#include <drm/drm_panic.h>
>
> void vmw_du_init(struct vmw_display_unit *du)
> {
> @@ -2025,3 +2026,37 @@ bool vmw_user_object_is_null(struct vmw_user_object *uo)
> {
> return !uo->buffer && !uo->surface;
> }
> +
> +int
> +vmw_get_scanout_buffer(struct drm_plane *plane, struct drm_scanout_buffer *sb)
> +{
> + void *vram;
> + struct vmw_private *vmw_priv = container_of(plane->dev, struct vmw_private, drm);
> +
> + // Only call on the primary display
> + if (container_of(plane, struct vmw_display_unit, primary)->unit != 0)
> + return -EINVAL;
> +
> + vmw_write(vmw_priv, SVGA_REG_CONFIG_DONE, false);
> +
> + vram = memremap(vmw_priv->vram_start, vmw_priv->vram_size,
> + MEMREMAP_WB | MEMREMAP_DEC);
Does that really work? We just had a kernel panic, so remapping might be
difficult.
> + if (!vram)
> + return -ENOMEM;
> +
> + sb->map[0].vaddr = vram;
> + sb->format = drm_format_info(DRM_FORMAT_RGB565);
> + sb->width = vmw_priv->initial_width;
> + sb->height = vmw_priv->initial_height;
> + sb->pitch[0] = sb->width * 2;
> + return 0;
> +}
> +
> +void vmw_panic_flush(struct drm_plane *plane)
> +{
> + struct vmw_private *vmw_priv = container_of(plane->dev, struct vmw_private, drm);
> +
> + vmw_kms_write_svga(vmw_priv,
> + vmw_priv->initial_width, vmw_priv->initial_height,
> + vmw_priv->initial_width * 2, 16, 16);
> +}
I think we should consider adding a callback table for these operations.
There's flush here and the vmap above is another possible candidate.
Best regards
Thomas
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
> index 445471fe9be6..8e37561cd527 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
> @@ -500,6 +500,11 @@ int vmw_kms_stdu_readback(struct vmw_private *dev_priv,
>
> int vmw_du_helper_plane_update(struct vmw_du_update_plane *update);
>
> +struct drm_scanout_buffer;
> +
> +int vmw_get_scanout_buffer(struct drm_plane *pl, struct drm_scanout_buffer *sb);
> +void vmw_panic_flush(struct drm_plane *plane);
> +
> /**
> * vmw_du_translate_to_crtc - Translate a rect from framebuffer to crtc
> * @state: Plane state.
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
> index add13294fb7c..faacfef7baa5 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
> @@ -1506,6 +1506,8 @@ drm_plane_helper_funcs vmw_stdu_primary_plane_helper_funcs = {
> .atomic_update = vmw_stdu_primary_plane_atomic_update,
> .prepare_fb = vmw_stdu_primary_plane_prepare_fb,
> .cleanup_fb = vmw_stdu_primary_plane_cleanup_fb,
> + .get_scanout_buffer = vmw_get_scanout_buffer,
> + .panic_flush = vmw_panic_flush,
> };
>
> static const struct drm_crtc_helper_funcs vmw_stdu_crtc_helper_funcs = {
--
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstr. 146, 90461 Nürnberg, Germany, www.suse.com
GF: Jochen Jaser, Andrew McDonald, Werner Knoblich, (HRB 36809, AG Nürnberg)
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2] drm/vmwgfx: Add drm_panic support
2025-11-07 20:46 ` [PATCH v2] " Ian Forbes
2025-11-12 9:14 ` Thomas Zimmermann
@ 2025-11-12 9:23 ` Thomas Zimmermann
2025-11-13 15:49 ` Ian Forbes
1 sibling, 1 reply; 9+ messages in thread
From: Thomas Zimmermann @ 2025-11-12 9:23 UTC (permalink / raw)
To: Ian Forbes, dri-devel
Cc: bcm-kernel-feedback-list, zack.rusin, maaz.mombasawala,
Ryosuke Yasuoka
Hi
Am 07.11.25 um 21:46 schrieb Ian Forbes:
> Sets up VRAM as the scanout buffer then switches to legacy mode.
Please use make this a bit more elaborate.
Please also note that you don't set up VRAM, but return the scanout
information for the given plane. That could be a difference if there are
multiple planes.
>
> Suggested-by: Ryosuke Yasuoka <ryasuoka@redhat.com>
> Signed-off-by: Ian Forbes <ian.forbes@broadcom.com>
> ---
>
> v2:
> - Set SVGA_REG_CONFIG_DONE=false so that SVGA3 works correctly
>
> drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 35 ++++++++++++++++++++++++++++
> drivers/gpu/drm/vmwgfx/vmwgfx_kms.h | 5 ++++
> drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c | 2 ++
> 3 files changed, 42 insertions(+)
>
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> index efdbb67a4966..87448e86d3b3 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> @@ -20,6 +20,7 @@
> #include <drm/drm_rect.h>
> #include <drm/drm_sysfs.h>
> #include <drm/drm_edid.h>
> +#include <drm/drm_panic.h>
>
> void vmw_du_init(struct vmw_display_unit *du)
> {
> @@ -2025,3 +2026,37 @@ bool vmw_user_object_is_null(struct vmw_user_object *uo)
> {
> return !uo->buffer && !uo->surface;
> }
> +
> +int
> +vmw_get_scanout_buffer(struct drm_plane *plane, struct drm_scanout_buffer *sb)
> +{
> + void *vram;
> + struct vmw_private *vmw_priv = container_of(plane->dev, struct vmw_private, drm);
> +
> + // Only call on the primary display
> + if (container_of(plane, struct vmw_display_unit, primary)->unit != 0)
> + return -EINVAL;
> +
> + vmw_write(vmw_priv, SVGA_REG_CONFIG_DONE, false);
> +
> + vram = memremap(vmw_priv->vram_start, vmw_priv->vram_size,
> + MEMREMAP_WB | MEMREMAP_DEC);
> + if (!vram)
> + return -ENOMEM;
> +
> + sb->map[0].vaddr = vram;
Please use iosys_map_set_vaddr() to initialize this field.
> + sb->format = drm_format_info(DRM_FORMAT_RGB565);
> + sb->width = vmw_priv->initial_width;
> + sb->height = vmw_priv->initial_height;
Usually, you want to look at the plane's current framebuffer for this
information.
> + sb->pitch[0] = sb->width * 2;
Please use drm_format_info_min_pitch() to compute this value or set
whatever has been programmed to the hardware already.
Best regards
Thomas
> + return 0;
> +}
> +
> +void vmw_panic_flush(struct drm_plane *plane)
> +{
> + struct vmw_private *vmw_priv = container_of(plane->dev, struct vmw_private, drm);
> +
> + vmw_kms_write_svga(vmw_priv,
> + vmw_priv->initial_width, vmw_priv->initial_height,
> + vmw_priv->initial_width * 2, 16, 16);
> +}
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
> index 445471fe9be6..8e37561cd527 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
> @@ -500,6 +500,11 @@ int vmw_kms_stdu_readback(struct vmw_private *dev_priv,
>
> int vmw_du_helper_plane_update(struct vmw_du_update_plane *update);
>
> +struct drm_scanout_buffer;
> +
> +int vmw_get_scanout_buffer(struct drm_plane *pl, struct drm_scanout_buffer *sb);
> +void vmw_panic_flush(struct drm_plane *plane);
> +
> /**
> * vmw_du_translate_to_crtc - Translate a rect from framebuffer to crtc
> * @state: Plane state.
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
> index add13294fb7c..faacfef7baa5 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
> @@ -1506,6 +1506,8 @@ drm_plane_helper_funcs vmw_stdu_primary_plane_helper_funcs = {
> .atomic_update = vmw_stdu_primary_plane_atomic_update,
> .prepare_fb = vmw_stdu_primary_plane_prepare_fb,
> .cleanup_fb = vmw_stdu_primary_plane_cleanup_fb,
> + .get_scanout_buffer = vmw_get_scanout_buffer,
> + .panic_flush = vmw_panic_flush,
> };
>
> static const struct drm_crtc_helper_funcs vmw_stdu_crtc_helper_funcs = {
--
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstr. 146, 90461 Nürnberg, Germany, www.suse.com
GF: Jochen Jaser, Andrew McDonald, Werner Knoblich, (HRB 36809, AG Nürnberg)
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2] drm/vmwgfx: Add drm_panic support
2025-11-12 9:23 ` Thomas Zimmermann
@ 2025-11-13 15:49 ` Ian Forbes
2025-11-14 7:04 ` Thomas Zimmermann
0 siblings, 1 reply; 9+ messages in thread
From: Ian Forbes @ 2025-11-13 15:49 UTC (permalink / raw)
To: Thomas Zimmermann
Cc: dri-devel, bcm-kernel-feedback-list, zack.rusin, maaz.mombasawala,
Ryosuke Yasuoka
[-- Attachment #1: Type: text/plain, Size: 955 bytes --]
On Wed, Nov 12, 2025 at 3:23 AM Thomas Zimmermann <tzimmermann@suse.de> wrote:
>
> Hi
>
> Am 07.11.25 um 21:46 schrieb Ian Forbes:
> > Sets up VRAM as the scanout buffer then switches to legacy mode.
>
> Please use make this a bit more elaborate.
>
> Please also note that you don't set up VRAM, but return the scanout
> information for the given plane. That could be a difference if there are
> multiple planes.
>
"VRAM" is a per device. It's not tied to a plane which is why we check
the display
unit ID to call this only once. It requires setup by mapping the mmio
region and poking
a register (CONFIG_DONE = false). I'm not sure how else to describe it
other than
"setup".
>
> Usually, you want to look at the plane's current framebuffer for this
> information.
>
The Screen Target (default) mode allows resolutions larger than
legacy/register mode can handle.
These sizes are guaranteed to be safe for legacy mode.
[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 5414 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2] drm/vmwgfx: Add drm_panic support
2025-11-13 15:49 ` Ian Forbes
@ 2025-11-14 7:04 ` Thomas Zimmermann
0 siblings, 0 replies; 9+ messages in thread
From: Thomas Zimmermann @ 2025-11-14 7:04 UTC (permalink / raw)
To: Ian Forbes
Cc: dri-devel, bcm-kernel-feedback-list, zack.rusin, maaz.mombasawala,
Ryosuke Yasuoka
Hi
Am 13.11.25 um 16:49 schrieb Ian Forbes:
> On Wed, Nov 12, 2025 at 3:23 AM Thomas Zimmermann <tzimmermann@suse.de> wrote:
>> Hi
>>
>> Am 07.11.25 um 21:46 schrieb Ian Forbes:
>>> Sets up VRAM as the scanout buffer then switches to legacy mode.
>> Please use make this a bit more elaborate.
>>
>> Please also note that you don't set up VRAM, but return the scanout
>> information for the given plane. That could be a difference if there are
>> multiple planes.
>>
> "VRAM" is a per device. It's not tied to a plane which is why we check
> the display
> unit ID to call this only once. It requires setup by mapping the mmio
> region and poking
> a register (CONFIG_DONE = false). I'm not sure how else to describe it
> other than
> "setup".
Yeah, sure. The question was: does it still work if you run this code
for multiple planes? The DRM core will try to find multiple scanout
buffers, if necessary.
>
>> Usually, you want to look at the plane's current framebuffer for this
>> information.
>>
> The Screen Target (default) mode allows resolutions larger than
> legacy/register mode can handle.
> These sizes are guaranteed to be safe for legacy mode.
Ok.
Best regards
Thomas
--
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstr. 146, 90461 Nürnberg, Germany, www.suse.com
GF: Jochen Jaser, Andrew McDonald, Werner Knoblich, (HRB 36809, AG Nürnberg)
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2025-11-14 7:04 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-23 20:04 [PATCH] drm/vmwgfx: Add drm_panic support Ian Forbes
2025-10-27 13:56 ` Jocelyn Falempe
2025-10-28 11:51 ` Ryosuke Yasuoka
2025-10-28 13:55 ` Jocelyn Falempe
2025-11-07 20:46 ` [PATCH v2] " Ian Forbes
2025-11-12 9:14 ` Thomas Zimmermann
2025-11-12 9:23 ` Thomas Zimmermann
2025-11-13 15:49 ` Ian Forbes
2025-11-14 7:04 ` Thomas Zimmermann
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.