<!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>