return early from drm activate functions after fatal error
authorjsg <jsg@openbsd.org>
Fri, 11 Nov 2022 02:21:09 +0000 (02:21 +0000)
committerjsg <jsg@openbsd.org>
Fri, 11 Nov 2022 02:21:09 +0000 (02:21 +0000)
avoids a page fault trap trying to take an uninitialised
modeset lock on suspend

reported and tested by Ali Farzanrad on HP ProBook 4530s

radeondrm0 at pci1 dev 0 function 0 "ATI Radeon HD 6400M" rev 0x00
drm1 at radeondrm0
radeondrm0: msi
inteldrm0 at pci0 dev 2 function 0 "Intel HD Graphics 3000" rev 0x09
drm0 at inteldrm0
inteldrm0: msi, SANDYBRIDGE, gen 6
..
radeondrm0: CAICOS
[drm] *ERROR* Unable to locate a BIOS ROM
drm:pid0:radeondrm_attachhook *ERROR* Fatal error during GPU init
inteldrm0: 1366x768, 32bpp

sys/dev/pci/drm/amd/amdgpu/amdgpu_kms.c
sys/dev/pci/drm/i915/i915_drv.c
sys/dev/pci/drm/radeon/radeon_kms.c

index 66e36cd..2766695 100644 (file)
@@ -2283,7 +2283,7 @@ amdgpu_activate(struct device *self, int act)
        struct drm_device *dev = &adev->ddev;
        int rv = 0;
 
-       if (dev->dev == NULL)
+       if (dev->dev == NULL || amdgpu_fatal_error)
                return (0);
 
        switch (act) {
index ad36e5a..5f1ba56 100644 (file)
@@ -2605,7 +2605,7 @@ inteldrm_activate(struct device *self, int act)
        struct drm_device *dev = &dev_priv->drm;
        int rv = 0;
 
-       if (dev->dev == NULL)
+       if (dev->dev == NULL || inteldrm_fatal_error)
                return (0);
 
        /*
index 75702aa..10dca3c 100644 (file)
@@ -874,7 +874,7 @@ radeondrm_activate_kms(struct device *self, int act)
        struct radeon_device *rdev = (struct radeon_device *)self;
        int rv = 0;
 
-       if (rdev->ddev == NULL)
+       if (rdev->ddev == NULL || radeon_fatal_error)
                return (0);
 
        switch (act) {