On Wed, Jun 17, 2026 at 07:35:00PM -0400, [email protected] wrote:
> >Synopsis:    Kernel Panic with wsconsctl screen blanking
> >Category:    Kernel Panic wsconsctl
> >Environment:
>       System      : OpenBSD 7.9
>       Details     : OpenBSD 7.9 (GENERIC) #329: Wed May  6 14:56:46 MDT 2026
>                        
> [email protected]:/usr/src/sys/arch/i386/compile/GENERIC
> 
>       Architecture: OpenBSD.i386
>       Machine     : i386
> >Description:
>       After upgrade to 7.9, i386 system panics when wsconsctl enables
>           display.screen_off=60000
>           display.kbdact=on
>           display.vblank=on
>         All worked well on past 10 or 20 versions of OpenBSD
> >How-To-Repeat:
>       enable wsconsctl with above configuration
>         panicing system is a Thinkpad T40
>         note: does not affect my Thinkpad X40
> >Fix:
>       disable wsconsctl screen blanking

thanks, fix committed to -current

Index: sys/dev/pci/drm/radeon/radeon_drv.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/radeon/radeon_drv.c,v
diff -u -p -r1.22 radeon_drv.c
--- sys/dev/pci/drm/radeon/radeon_drv.c 9 Mar 2026 23:58:03 -0000       1.22
+++ sys/dev/pci/drm/radeon/radeon_drv.c 20 Jun 2026 13:18:12 -0000
@@ -733,6 +733,7 @@ radeondrm_detach_kms(struct device *self
 }
 
 void radeondrm_burner(void *, u_int, u_int);
+void radeondrm_burner_cb(void *);
 int radeondrm_wsioctl(void *, u_long, caddr_t, int, struct proc *);
 paddr_t radeondrm_wsmmap(void *, off_t, int);
 int radeondrm_alloc_screen(void *, const struct wsscreen_descr *,
@@ -1265,6 +1266,7 @@ radeondrm_attachhook(struct device *self
        const struct drm_format_info *format;
 
        task_set(&rdev->switchtask, radeondrm_doswitch, ri);
+       task_set(&rdev->burner_task, radeondrm_burner_cb, rdev);
 
        /* from linux radeon_pci_probe() */
 
@@ -1358,4 +1360,37 @@ radeondrm_activate_kms(struct device *se
        }
 
        return (rv);
+}
+
+void
+radeondrm_burner(void *v, u_int on, u_int flags)
+{
+       struct rasops_info *ri = v;
+       struct radeon_device *rdev = ri->ri_hw;
+
+       task_del(systq, &rdev->burner_task);
+
+       if (on)
+               rdev->burner_fblank = FB_BLANK_UNBLANK;
+       else {
+               if (flags & WSDISPLAY_BURN_VBLANK)
+                       rdev->burner_fblank = FB_BLANK_VSYNC_SUSPEND;
+               else
+                       rdev->burner_fblank = FB_BLANK_NORMAL;
+       }
+
+       /*
+        * Setting the DPMS mode may sleep while waiting for vblank so
+        * hand things off to a taskq.
+        */
+       task_add(systq, &rdev->burner_task);
+}
+
+void
+radeondrm_burner_cb(void *arg1)
+{
+       struct radeon_device *rdev = arg1;
+       struct drm_fb_helper *helper = rdev_to_drm(rdev)->fb_helper;
+
+       drm_fb_helper_blank(rdev->burner_fblank, helper->info);
 }
Index: sys/dev/pci/drm/radeon/radeon_fbdev.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/radeon/radeon_fbdev.c,v
diff -u -p -r1.5 radeon_fbdev.c
--- sys/dev/pci/drm/radeon/radeon_fbdev.c       9 Mar 2026 23:58:03 -0000       
1.5
+++ sys/dev/pci/drm/radeon/radeon_fbdev.c       20 Jun 2026 13:04:58 -0000
@@ -338,36 +338,3 @@ bool radeon_fbdev_robj_is_fb(struct rade
 
        return true;
 }
-
-void
-radeondrm_burner(void *v, u_int on, u_int flags)
-{
-       struct rasops_info *ri = v;
-       struct radeon_device *rdev = ri->ri_hw;
-
-       task_del(systq, &rdev->burner_task);
-
-       if (on)
-               rdev->burner_fblank = FB_BLANK_UNBLANK;
-       else {
-               if (flags & WSDISPLAY_BURN_VBLANK)
-                       rdev->burner_fblank = FB_BLANK_VSYNC_SUSPEND;
-               else
-                       rdev->burner_fblank = FB_BLANK_NORMAL;
-       }
-
-       /*
-        * Setting the DPMS mode may sleep while waiting for vblank so
-        * hand things off to a taskq.
-        */
-       task_add(systq, &rdev->burner_task);
-}
-
-void
-radeondrm_burner_cb(void *arg1)
-{
-       struct radeon_device *rdev = arg1;
-       struct drm_fb_helper *helper = rdev_to_drm(rdev)->fb_helper;
-
-       drm_fb_helper_blank(rdev->burner_fblank, helper->info);
-}

Reply via email to