<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <p><br>
    </p>
    <div class="moz-cite-prefix">On 11/30/2023 14:18, Kamil Konieczny
      wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:20231130131850.14637-1-kamil.konieczny@linux.intel.com">
      <pre class="moz-quote-pre" wrap="">Opening drm card may end up in loading kernel module. Take into
account forced driver set by IGT_FORCE_DRIVER and load that one.
If forced is in known ones, use function for loading it
otherwise load it only when requested was DRIVER_ANY. Special
case is VGEM which should alwayes be loaded as itself. It can</pre>
    </blockquote>
    typo: s/alwayes/always<br>
    <blockquote type="cite" cite="mid:20231130131850.14637-1-kamil.konieczny@linux.intel.com">
      <pre class="moz-quote-pre" wrap="">
end up in not loading any module in case when igt test requested
specific one, for example i915 but forced is different.

Cc: Rob Clark <a class="moz-txt-link-rfc2396E" href="mailto:robdclark@gmail.com"><robdclark@gmail.com></a>
Cc: Rob Clark <a class="moz-txt-link-rfc2396E" href="mailto:robdclark@chromium.org"><robdclark@chromium.org></a>
Cc: Helen Koike <a class="moz-txt-link-rfc2396E" href="mailto:helen.koike@collabora.com"><helen.koike@collabora.com></a>
Cc: Janusz Krzysztofik <a class="moz-txt-link-rfc2396E" href="mailto:janusz.krzysztofik@linux.intel.com"><janusz.krzysztofik@linux.intel.com></a>
Signed-off-by: Kamil Konieczny <a class="moz-txt-link-rfc2396E" href="mailto:kamil.konieczny@linux.intel.com"><kamil.konieczny@linux.intel.com></a>
---
 lib/drmtest.c | 65 ++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 46 insertions(+), 19 deletions(-)

diff --git a/lib/drmtest.c b/lib/drmtest.c
index f0b97e362..b524a9eb3 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -221,6 +221,26 @@ struct _opened_device_path {
        struct igt_list_head link;
 };
 
+static void modulename_to_chipset(const char *name, unsigned int *chip)
+{
+       if (!name)
+               return;
+
+       for (int start = 0, end = ARRAY_SIZE(modules) - 1; start < end; ) {
+               int mid = start + (end - start) / 2;
+               int ret = strcmp(modules[mid].module, name);
+
+               if (ret < 0) {
+                       start = mid + 1;
+               } else if (ret > 0) {
+                       end = mid;
+               } else {
+                       *chip = modules[mid].bit;
+                       break;
+               }
+       }
+}
+
 /*
  * Logs path of opened device. Device path opened for the first time is logged at info level,
  * subsequent opens (if any) are logged at debug level.
@@ -249,7 +269,7 @@ static int open_device(const char *name, unsigned int chipset)
 {
        const char *forced;
        char dev_name[16] = "";
-       int chip = DRIVER_ANY;
+       unsigned int chip = DRIVER_ANY;
        int fd;
 
        fd = open(name, O_RDWR);
@@ -266,18 +286,7 @@ static int open_device(const char *name, unsigned int chipset)
                goto err;
        }
 
-       for (int start = 0, end = ARRAY_SIZE(modules) - 1; start < end; ){
-               int mid = start + (end - start) / 2;
-               int ret = strcmp(modules[mid].module, dev_name);
-               if (ret < 0) {
-                       start = mid + 1;
-               } else if (ret > 0) {
-                       end = mid;
-               } else {
-                       chip = modules[mid].bit;
-                       break;
-               }
-       }
+       modulename_to_chipset(dev_name, &chip);
 
        if ((chipset & chip) == chip) {
                log_opened_device_path(name);
@@ -361,16 +370,34 @@ static int __search_and_open(const char *base, int offset, unsigned int chipset,
 void drm_load_module(unsigned int chipset)
 {
        static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+       const char *forced = forced_driver();
+       unsigned int chip = 0;
+       bool want_any = chipset == DRIVER_ANY;
+
+       if (forced) {
+               if (chipset == DRIVER_VGEM)
+                       chip = DRIVER_VGEM; /* ignore forced */
+               else
+                       modulename_to_chipset(forced, &chip);
+
+               chipset &= chip; /* forced can be in known modules */
+       }
 
        pthread_mutex_lock(&mutex);
-       for (const struct module *m = modules; m->module; m++) {
-               if (chipset & m->bit) {
-                       if (m->modprobe)
-                               m->modprobe(m->module);
-                       else
-                               modprobe(m->module);
+       if (forced && chipset == 0) {
+               if (want_any)
+                       modprobe(forced);
+       } else {
+               for (const struct module *m = modules; m->module; m++) {
+                       if (chipset & m->bit) {
+                               if (m->modprobe)
+                                       m->modprobe(m->module);
+                               else
+                                       modprobe(m->module);
+                       }
                }
        }
+
        pthread_mutex_unlock(&mutex);
        igt_devices_scan(true);
 }</pre>
    </blockquote>
    With typo fixed,<br>
    <span lang="en-US">Reviewed-by: </span><span lang="pl">L</span><span lang="en-US">ukasz </span><span lang="pl">L</span><span lang="en-US">aguna <</span><a href="mailto:lukasz.laguna@intel.com"><span lang="en-US">lukasz.laguna@intel.com</span></a><span lang="en-US">></span><span style="white-space: pre-wrap">
</span>
  </body>
</html>