i915_module.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /*
  2. * SPDX-License-Identifier: MIT
  3. *
  4. * Copyright © 2021 Intel Corporation
  5. */
  6. #include <drm/drm_drv.h>
  7. #include "gem/i915_gem_context.h"
  8. #include "gem/i915_gem_object.h"
  9. #include "i915_active.h"
  10. #include "i915_driver.h"
  11. #include "i915_params.h"
  12. #include "i915_pci.h"
  13. #include "i915_perf.h"
  14. #include "i915_request.h"
  15. #include "i915_scheduler.h"
  16. #include "i915_selftest.h"
  17. #include "i915_vma.h"
  18. #include "i915_vma_resource.h"
  19. static int i915_check_nomodeset(void)
  20. {
  21. bool use_kms = true;
  22. /*
  23. * Enable KMS by default, unless explicitly overriden by
  24. * either the i915.modeset parameter or by the
  25. * nomodeset boot option.
  26. */
  27. if (i915_modparams.modeset == 0)
  28. use_kms = false;
  29. if (drm_firmware_drivers_only() && i915_modparams.modeset == -1)
  30. use_kms = false;
  31. if (!use_kms) {
  32. /* Silently fail loading to not upset userspace. */
  33. DRM_DEBUG_DRIVER("KMS disabled.\n");
  34. return 1;
  35. }
  36. return 0;
  37. }
  38. static const struct {
  39. int (*init)(void);
  40. void (*exit)(void);
  41. } init_funcs[] = {
  42. { .init = i915_check_nomodeset },
  43. { .init = i915_active_module_init,
  44. .exit = i915_active_module_exit },
  45. { .init = i915_context_module_init,
  46. .exit = i915_context_module_exit },
  47. { .init = i915_gem_context_module_init,
  48. .exit = i915_gem_context_module_exit },
  49. { .init = i915_objects_module_init,
  50. .exit = i915_objects_module_exit },
  51. { .init = i915_request_module_init,
  52. .exit = i915_request_module_exit },
  53. { .init = i915_scheduler_module_init,
  54. .exit = i915_scheduler_module_exit },
  55. { .init = i915_vma_module_init,
  56. .exit = i915_vma_module_exit },
  57. { .init = i915_vma_resource_module_init,
  58. .exit = i915_vma_resource_module_exit },
  59. { .init = i915_mock_selftests },
  60. { .init = i915_pmu_init,
  61. .exit = i915_pmu_exit },
  62. { .init = i915_pci_register_driver,
  63. .exit = i915_pci_unregister_driver },
  64. { .init = i915_perf_sysctl_register,
  65. .exit = i915_perf_sysctl_unregister },
  66. };
  67. static int init_progress;
  68. static int __init i915_init(void)
  69. {
  70. int err, i;
  71. for (i = 0; i < ARRAY_SIZE(init_funcs); i++) {
  72. err = init_funcs[i].init();
  73. if (err < 0) {
  74. while (i--) {
  75. if (init_funcs[i].exit)
  76. init_funcs[i].exit();
  77. }
  78. return err;
  79. } else if (err > 0) {
  80. /*
  81. * Early-exit success is reserved for things which
  82. * don't have an exit() function because we have no
  83. * idea how far they got or how to partially tear
  84. * them down.
  85. */
  86. WARN_ON(init_funcs[i].exit);
  87. break;
  88. }
  89. }
  90. init_progress = i;
  91. return 0;
  92. }
  93. static void __exit i915_exit(void)
  94. {
  95. int i;
  96. for (i = init_progress - 1; i >= 0; i--) {
  97. GEM_BUG_ON(i >= ARRAY_SIZE(init_funcs));
  98. if (init_funcs[i].exit)
  99. init_funcs[i].exit();
  100. }
  101. }
  102. module_init(i915_init);
  103. module_exit(i915_exit);
  104. MODULE_AUTHOR("Tungsten Graphics, Inc.");
  105. MODULE_AUTHOR("Intel Corporation");
  106. MODULE_DESCRIPTION(DRIVER_DESC);
  107. MODULE_LICENSE("GPL and additional rights");