drm/tegra: Remove existing framebuffer only if we support display
authorThierry Reding <treding@nvidia.com>
Fri, 23 Feb 2024 15:03:33 +0000 (16:03 +0100)
committerRobert Foss <rfoss@kernel.org>
Mon, 26 Feb 2024 12:23:46 +0000 (13:23 +0100)
Tegra DRM doesn't support display on Tegra234 and later, so make sure
not to remove any existing framebuffers in that case.

v2: - add comments explaining how this situation can come about
    - clear DRIVER_MODESET and DRIVER_ATOMIC feature bits

Fixes: 6848c291a54f ("drm/aperture: Convert drivers to aperture interfaces")
Signed-off-by: Thierry Reding <treding@nvidia.com>
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Signed-off-by: Robert Foss <rfoss@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20240223150333.1401582-1-thierry.reding@gmail.com
drivers/gpu/drm/tegra/drm.c

index ff36171c8fb700bae9967961220ea7cbb262d193..373bcd79257e0cfbcbe088cdfc9bde8ffc19ff10 100644 (file)
@@ -1242,9 +1242,26 @@ static int host1x_drm_probe(struct host1x_device *dev)
 
        drm_mode_config_reset(drm);
 
-       err = drm_aperture_remove_framebuffers(&tegra_drm_driver);
-       if (err < 0)
-               goto hub;
+       /*
+        * Only take over from a potential firmware framebuffer if any CRTCs
+        * have been registered. This must not be a fatal error because there
+        * are other accelerators that are exposed via this driver.
+        *
+        * Another case where this happens is on Tegra234 where the display
+        * hardware is no longer part of the host1x complex, so this driver
+        * will not expose any modesetting features.
+        */
+       if (drm->mode_config.num_crtc > 0) {
+               err = drm_aperture_remove_framebuffers(&tegra_drm_driver);
+               if (err < 0)
+                       goto hub;
+       } else {
+               /*
+                * Indicate to userspace that this doesn't expose any display
+                * capabilities.
+                */
+               drm->driver_features &= ~(DRIVER_MODESET | DRIVER_ATOMIC);
+       }
 
        err = drm_dev_register(drm, 0);
        if (err < 0)