Skip to content

Commit

Permalink
drm/xe: Support 'nomodeset' kernel command-line option
Browse files Browse the repository at this point in the history
Setting 'nomodeset' on the kernel command line disables all graphics
drivers with modesetting capabilities, leaving only firmware drivers,
such as simpledrm or efifb.

Most DRM drivers automatically support 'nomodeset' via DRM's module
helper macros. In xe, which uses regular module_init(), manually call
drm_firmware_drivers_only() to test for 'nomodeset'. Do not register
the driver if set.

v2:
- use xe's init table (Lucas)
- do NULL test for init/exit functions

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Lucas De Marchi <lucas.demarchi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240827121003.97429-1-tzimmermann@suse.de
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
  • Loading branch information
Thomas Zimmermann authored and Lucas De Marchi committed Aug 27, 2024
1 parent 8a04e34 commit 014125c
Showing 1 changed file with 36 additions and 3 deletions.
39 changes: 36 additions & 3 deletions drivers/gpu/drm/xe/xe_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
#include <linux/init.h>
#include <linux/module.h>

#include <drm/drm_module.h>

#include "xe_drv.h"
#include "xe_hw_fence.h"
#include "xe_pci.h"
Expand Down Expand Up @@ -61,12 +63,23 @@ module_param_named_unsafe(wedged_mode, xe_modparam.wedged_mode, int, 0600);
MODULE_PARM_DESC(wedged_mode,
"Module's default policy for the wedged mode - 0=never, 1=upon-critical-errors[default], 2=upon-any-hang");

static int xe_check_nomodeset(void)
{
if (drm_firmware_drivers_only())
return -ENODEV;

return 0;
}

struct init_funcs {
int (*init)(void);
void (*exit)(void);
};

static const struct init_funcs init_funcs[] = {
{
.init = xe_check_nomodeset,
},
{
.init = xe_hw_fence_module_init,
.exit = xe_hw_fence_module_exit,
Expand All @@ -85,15 +98,35 @@ static const struct init_funcs init_funcs[] = {
},
};

static int __init xe_call_init_func(unsigned int i)
{
if (WARN_ON(i >= ARRAY_SIZE(init_funcs)))
return 0;
if (!init_funcs[i].init)
return 0;

return init_funcs[i].init();
}

static void xe_call_exit_func(unsigned int i)
{
if (WARN_ON(i >= ARRAY_SIZE(init_funcs)))
return;
if (!init_funcs[i].exit)
return;

init_funcs[i].exit();
}

static int __init xe_init(void)
{
int err, i;

for (i = 0; i < ARRAY_SIZE(init_funcs); i++) {
err = init_funcs[i].init();
err = xe_call_init_func(i);
if (err) {
while (i--)
init_funcs[i].exit();
xe_call_exit_func(i);
return err;
}
}
Expand All @@ -106,7 +139,7 @@ static void __exit xe_exit(void)
int i;

for (i = ARRAY_SIZE(init_funcs) - 1; i >= 0; i--)
init_funcs[i].exit();
xe_call_exit_func(i);
}

module_init(xe_init);
Expand Down

0 comments on commit 014125c

Please sign in to comment.