drm: Move nomodeset kernel parameter to the DRM subsystem
authorJavier Martinez Canillas <javierm@redhat.com>
Fri, 12 Nov 2021 13:32:27 +0000 (14:32 +0100)
committerJavier Martinez Canillas <javierm@redhat.com>
Sat, 27 Nov 2021 12:52:22 +0000 (13:52 +0100)
The "nomodeset" kernel cmdline parameter is handled by the vgacon driver
but the exported vgacon_text_force() symbol is only used by DRM drivers.

It makes much more sense for the parameter logic to be in the subsystem
of the drivers that are making use of it.

Let's move the vgacon_text_force() function and related logic to the DRM
subsystem. While doing that, rename it to drm_firmware_drivers_only() and
make it return true if "nomodeset" was used and false otherwise. This is
a better description of the condition that the drivers are testing for.

Suggested-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
Acked-by: Jani Nikula <jani.nikula@intel.com>
Acked-by: Pekka Paalanen <pekka.paalanen@collabora.com>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20211112133230.1595307-4-javierm@redhat.com
17 files changed:
drivers/gpu/drm/Makefile
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
drivers/gpu/drm/ast/ast_drv.c
drivers/gpu/drm/i915/i915_module.c
drivers/gpu/drm/mgag200/mgag200_drv.c
drivers/gpu/drm/nouveau/nouveau_drm.c
drivers/gpu/drm/qxl/qxl_drv.c
drivers/gpu/drm/radeon/radeon_drv.c
drivers/gpu/drm/tiny/bochs.c
drivers/gpu/drm/tiny/cirrus.c
drivers/gpu/drm/vboxvideo/vbox_drv.c
drivers/gpu/drm/virtio/virtgpu_drv.c
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
drivers/video/console/vgacon.c
gpu/drm/drm_nomodeset.c [new file with mode: 0644]
include/drm/drm_drv.h
include/linux/console.h

index 1c41156deb5f9e5638407864850020541dbe0bac..c74810c285afdab990347c6168cf7daa41f8c972 100644 (file)
@@ -33,6 +33,8 @@ drm-$(CONFIG_DRM_PRIVACY_SCREEN) += drm_privacy_screen.o drm_privacy_screen_x86.
 
 obj-$(CONFIG_DRM_DP_AUX_BUS) += drm_dp_aux_bus.o
 
+obj-$(CONFIG_VGA_CONSOLE) += drm_nomodeset.o
+
 drm_cma_helper-y := drm_gem_cma_helper.o
 obj-$(CONFIG_DRM_GEM_CMA_HELPER) += drm_cma_helper.o
 
index e8c23e37c83cbb97553b22645e8eb395e85fc3c3..438468b82eb63aee7ac3acb2bd6607cec977ff96 100644 (file)
@@ -31,7 +31,6 @@
 #include "amdgpu_drv.h"
 
 #include <drm/drm_pciids.h>
-#include <linux/console.h>
 #include <linux/module.h>
 #include <linux/pm_runtime.h>
 #include <linux/vga_switcheroo.h>
@@ -2516,7 +2515,7 @@ static int __init amdgpu_init(void)
 {
        int r;
 
-       if (vgacon_text_force())
+       if (drm_firmware_drivers_only())
                return -EINVAL;
 
        r = amdgpu_sync_init();
index 86d5cd7b6318ca1eaeee08f25e69619b6a07d3a4..6d8613f6fe1cd4f08384815c7a8f4c1fcf8ad289 100644 (file)
@@ -26,7 +26,6 @@
  * Authors: Dave Airlie <airlied@redhat.com>
  */
 
-#include <linux/console.h>
 #include <linux/module.h>
 #include <linux/pci.h>
 
@@ -233,7 +232,7 @@ static struct pci_driver ast_pci_driver = {
 
 static int __init ast_init(void)
 {
-       if (vgacon_text_force() && ast_modeset == -1)
+       if (drm_firmware_drivers_only() && ast_modeset == -1)
                return -EINVAL;
 
        if (ast_modeset == 0)
index ab2295dd450018562635d5a8fb2aab79b9611e71..1df66bf276cef4b39568fc3b152f6ae2d4e4d062 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright © 2021 Intel Corporation
  */
 
-#include <linux/console.h>
+#include <drm/drm_drv.h>
 
 #include "gem/i915_gem_context.h"
 #include "gem/i915_gem_object.h"
@@ -31,7 +31,7 @@ static int i915_check_nomodeset(void)
        if (i915_modparams.modeset == 0)
                use_kms = false;
 
-       if (vgacon_text_force() && i915_modparams.modeset == -1)
+       if (drm_firmware_drivers_only() && i915_modparams.modeset == -1)
                use_kms = false;
 
        if (!use_kms) {
index 6b9243713b3c66e94ffa685750d5949aa668ae79..740108a006ba5c301a1e74883b47a9c726badcdf 100644 (file)
@@ -6,7 +6,6 @@
  *          Dave Airlie
  */
 
-#include <linux/console.h>
 #include <linux/module.h>
 #include <linux/pci.h>
 #include <linux/vmalloc.h>
@@ -378,7 +377,7 @@ static struct pci_driver mgag200_pci_driver = {
 
 static int __init mgag200_init(void)
 {
-       if (vgacon_text_force() && mgag200_modeset == -1)
+       if (drm_firmware_drivers_only() && mgag200_modeset == -1)
                return -EINVAL;
 
        if (mgag200_modeset == 0)
index e7efd9ede8e4be0cb91ba7363b95d0e32e2b2354..561309d447e0278bc2a010ba4b5aa969f43128f0 100644 (file)
@@ -22,7 +22,6 @@
  * Authors: Ben Skeggs
  */
 
-#include <linux/console.h>
 #include <linux/delay.h>
 #include <linux/module.h>
 #include <linux/pci.h>
@@ -32,6 +31,7 @@
 
 #include <drm/drm_aperture.h>
 #include <drm/drm_crtc_helper.h>
+#include <drm/drm_drv.h>
 #include <drm/drm_gem_ttm_helper.h>
 #include <drm/drm_ioctl.h>
 #include <drm/drm_vblank.h>
@@ -1358,7 +1358,7 @@ nouveau_drm_init(void)
        nouveau_display_options();
 
        if (nouveau_modeset == -1) {
-               if (vgacon_text_force())
+               if (drm_firmware_drivers_only())
                        nouveau_modeset = 0;
        }
 
index fc47b0deb021da4f0ddeaa5169e434cb085a0539..e4b16421500b49aa675eb9feba36abf7eea49098 100644 (file)
@@ -29,7 +29,6 @@
 
 #include "qxl_drv.h"
 
-#include <linux/console.h>
 #include <linux/module.h>
 #include <linux/pci.h>
 #include <linux/vgaarb.h>
@@ -295,7 +294,7 @@ static struct drm_driver qxl_driver = {
 
 static int __init qxl_init(void)
 {
-       if (vgacon_text_force() && qxl_modeset == -1)
+       if (drm_firmware_drivers_only() && qxl_modeset == -1)
                return -EINVAL;
 
        if (qxl_modeset == 0)
index 380adc61e71c7a4b98ea1d8ceeca08ae774a511c..956c72b5aa332fb30aad08cb52591d263deb8f43 100644 (file)
@@ -31,7 +31,6 @@
 
 
 #include <linux/compat.h>
-#include <linux/console.h>
 #include <linux/module.h>
 #include <linux/pm_runtime.h>
 #include <linux/vga_switcheroo.h>
@@ -637,7 +636,7 @@ static struct pci_driver radeon_kms_pci_driver = {
 
 static int __init radeon_module_init(void)
 {
-       if (vgacon_text_force() && radeon_modeset == -1)
+       if (drm_firmware_drivers_only() && radeon_modeset == -1)
                radeon_modeset = 0;
 
        if (radeon_modeset == 0)
index 2ce3bd903b702e1eb14e8d18bc84aac8eb10d8d9..fc26a1ce11ee48e366fa4561b398c71365adb2c4 100644 (file)
@@ -1,6 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0-or-later
 
-#include <linux/console.h>
 #include <linux/pci.h>
 
 #include <drm/drm_aperture.h>
@@ -719,7 +718,7 @@ static struct pci_driver bochs_pci_driver = {
 
 static int __init bochs_init(void)
 {
-       if (vgacon_text_force() && bochs_modeset == -1)
+       if (drm_firmware_drivers_only() && bochs_modeset == -1)
                return -EINVAL;
 
        if (bochs_modeset == 0)
index 9327001d35dd3b0a277fef3ffcfd82e223d7a74b..c95d9ff7d600659323bf6a772e22da47bd3fbba2 100644 (file)
@@ -16,7 +16,6 @@
  * Copyright 1999-2001 Jeff Garzik <jgarzik@pobox.com>
  */
 
-#include <linux/console.h>
 #include <linux/dma-buf-map.h>
 #include <linux/module.h>
 #include <linux/pci.h>
@@ -636,8 +635,9 @@ static struct pci_driver cirrus_pci_driver = {
 
 static int __init cirrus_init(void)
 {
-       if (vgacon_text_force())
+       if (drm_firmware_drivers_only())
                return -EINVAL;
+
        return pci_register_driver(&cirrus_pci_driver);
 }
 
index fd7abb029c6551e149c990cc587ca2d9f5a18a39..f35d9e44c6b72a69ee44109aaa9a006468455443 100644 (file)
@@ -7,7 +7,6 @@
  *          Michael Thayer <michael.thayer@oracle.com,
  *          Hans de Goede <hdegoede@redhat.com>
  */
-#include <linux/console.h>
 #include <linux/module.h>
 #include <linux/pci.h>
 #include <linux/vt_kern.h>
@@ -193,7 +192,7 @@ static const struct drm_driver driver = {
 
 static int __init vbox_init(void)
 {
-       if (vgacon_text_force() && vbox_modeset == -1)
+       if (drm_firmware_drivers_only() && vbox_modeset == -1)
                return -EINVAL;
 
        if (vbox_modeset == 0)
index d86e1ad4a97260b82895d98bbb2feef93ef2ca7f..c20c96a97a6ca1ff280dad6ea31f0c9e6511f341 100644 (file)
@@ -27,7 +27,6 @@
  */
 
 #include <linux/module.h>
-#include <linux/console.h>
 #include <linux/pci.h>
 #include <linux/poll.h>
 #include <linux/wait.h>
@@ -104,7 +103,7 @@ static int virtio_gpu_probe(struct virtio_device *vdev)
        struct drm_device *dev;
        int ret;
 
-       if (vgacon_text_force() && virtio_gpu_modeset == -1)
+       if (drm_firmware_drivers_only() && virtio_gpu_modeset == -1)
                return -EINVAL;
 
        if (virtio_gpu_modeset == 0)
index bfd71c86faa5878a1d004533b12541501fcec35d..75d1e032cf16d843fbf06ea369e1f5ed538d6378 100644 (file)
@@ -25,7 +25,6 @@
  *
  **************************************************************************/
 
-#include <linux/console.h>
 #include <linux/dma-mapping.h>
 #include <linux/module.h>
 #include <linux/pci.h>
@@ -1651,7 +1650,7 @@ static int __init vmwgfx_init(void)
 {
        int ret;
 
-       if (vgacon_text_force())
+       if (drm_firmware_drivers_only())
                return -EINVAL;
 
        ret = pci_register_driver(&vmw_pci_driver);
index ef9c57ce090663d5f35c0f80dd425edcaa9a4c44..d4320b147956050f3b387fd31f9060ac6a537262 100644 (file)
@@ -97,30 +97,9 @@ static int           vga_video_font_height;
 static int             vga_scan_lines          __read_mostly;
 static unsigned int    vga_rolled_over; /* last vc_origin offset before wrap */
 
-static bool vgacon_text_mode_force;
 static bool vga_hardscroll_enabled;
 static bool vga_hardscroll_user_enable = true;
 
-bool vgacon_text_force(void)
-{
-       return vgacon_text_mode_force;
-}
-EXPORT_SYMBOL(vgacon_text_force);
-
-static int __init text_mode(char *str)
-{
-       vgacon_text_mode_force = true;
-
-       pr_warn("You have booted with nomodeset. This means your GPU drivers are DISABLED\n");
-       pr_warn("Any video related functionality will be severely degraded, and you may not even be able to suspend the system properly\n");
-       pr_warn("Unless you actually understand what nomodeset does, you should reboot without enabling it\n");
-
-       return 1;
-}
-
-/* force text mode - used by kernel modesetting */
-__setup("nomodeset", text_mode);
-
 static int __init no_scroll(char *str)
 {
        /*
diff --git a/gpu/drm/drm_nomodeset.c b/gpu/drm/drm_nomodeset.c
new file mode 100644 (file)
index 0000000..287edfb
--- /dev/null
@@ -0,0 +1,26 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <linux/module.h>
+#include <linux/types.h>
+
+static bool drm_nomodeset;
+
+bool drm_firmware_drivers_only(void)
+{
+       return drm_nomodeset;
+}
+EXPORT_SYMBOL(drm_firmware_drivers_only);
+
+static int __init disable_modeset(char *str)
+{
+       drm_nomodeset = true;
+
+       pr_warn("You have booted with nomodeset. This means your GPU drivers are DISABLED\n");
+       pr_warn("Any video related functionality will be severely degraded, and you may not even be able to suspend the system properly\n");
+       pr_warn("Unless you actually understand what nomodeset does, you should reboot without enabling it\n");
+
+       return 1;
+}
+
+/* Disable kernel modesetting */
+__setup("nomodeset", disable_modeset);
index a84eb4028e5b1f3209d056ed7359ff79674018b5..89e26a732175b0370d41b81b2302c6a2727be901 100644 (file)
@@ -601,5 +601,10 @@ static inline bool drm_drv_uses_atomic_modeset(struct drm_device *dev)
 
 int drm_dev_set_unique(struct drm_device *dev, const char *name);
 
+#ifdef CONFIG_VGA_CONSOLE
+extern bool drm_firmware_drivers_only(void);
+#else
+static inline bool drm_firmware_drivers_only(void) { return false; }
+#endif
 
 #endif
index a97f277cfdfa36cced9954edc19f47224e75b3cc..7cd758a4f44ed45bfd4b2a9fd7b6629901e3fa3e 100644 (file)
@@ -219,12 +219,6 @@ extern atomic_t ignore_console_lock_warning;
 #define VESA_HSYNC_SUSPEND      2
 #define VESA_POWERDOWN          3
 
-#ifdef CONFIG_VGA_CONSOLE
-extern bool vgacon_text_force(void);
-#else
-static inline bool vgacon_text_force(void) { return false; }
-#endif
-
 extern void console_init(void);
 
 /* For deferred console takeover */