#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"
 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,
        },
 };
 
+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;
                }
        }
        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);