From 2c42641994ca2bef1592231f4a67489c9099b472 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Roberto=20de=20Souza?= Date: Thu, 4 Aug 2022 13:21:05 -0700 Subject: [PATCH] intel/dev: Detect what is the kernel mode driver loaded MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Intel GPUs will have a new kernel mode driver, support for some platforms will overlap so we will need to detect in runtime what is the kernel mode driver loaded for each device. Reviewed-by: Marcin Ślusarz Signed-off-by: José Roberto de Souza Part-of: --- src/intel/dev/intel_device_info.c | 6 +++++ src/intel/dev/intel_device_info.h | 3 +++ src/intel/dev/intel_kmd.c | 43 +++++++++++++++++++++++++++++++ src/intel/dev/intel_kmd.h | 32 +++++++++++++++++++++++ src/intel/dev/meson.build | 2 ++ 5 files changed, 86 insertions(+) create mode 100644 src/intel/dev/intel_kmd.c create mode 100644 src/intel/dev/intel_kmd.h diff --git a/src/intel/dev/intel_device_info.c b/src/intel/dev/intel_device_info.c index 4c6da5e0939..0798046fb02 100644 --- a/src/intel/dev/intel_device_info.c +++ b/src/intel/dev/intel_device_info.c @@ -1518,6 +1518,12 @@ intel_get_device_info_from_fd(int fd, struct intel_device_info *devinfo) return false; } + devinfo->kmd_type = intel_get_kmd_type(fd); + if (devinfo->kmd_type == INTEL_KMD_TYPE_INVALID) { + mesa_loge("Unknown kernel mode driver"); + return false; + } + /* remaining initializion queries the kernel for device info */ if (devinfo->no_hw) { /* Provide some sensible values for NO_HW. */ diff --git a/src/intel/dev/intel_device_info.h b/src/intel/dev/intel_device_info.h index 68df625da63..e2f497cef0f 100644 --- a/src/intel/dev/intel_device_info.h +++ b/src/intel/dev/intel_device_info.h @@ -30,6 +30,7 @@ #include "util/macros.h" #include "compiler/shader_enums.h" +#include "intel_kmd.h" #include "intel/common/intel_engine.h" @@ -96,6 +97,8 @@ enum intel_platform { */ struct intel_device_info { + enum intel_kmd_type kmd_type; + /* Driver internal numbers used to differentiate platforms. */ int ver; int verx10; diff --git a/src/intel/dev/intel_kmd.c b/src/intel/dev/intel_kmd.c new file mode 100644 index 00000000000..91b7f176095 --- /dev/null +++ b/src/intel/dev/intel_kmd.c @@ -0,0 +1,43 @@ +/* + * Copyright © 2023 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include + +#include "intel_kmd.h" + +enum intel_kmd_type +intel_get_kmd_type(int fd) +{ + enum intel_kmd_type type = INTEL_KMD_TYPE_INVALID; + drmVersionPtr version = drmGetVersion(fd); + + if (!version) + return type; + + if (strcmp(version->name, "i915") == 0) + type = INTEL_KMD_TYPE_I915; + + drmFreeVersion(version); + return type; +} diff --git a/src/intel/dev/intel_kmd.h b/src/intel/dev/intel_kmd.h new file mode 100644 index 00000000000..d30cf819163 --- /dev/null +++ b/src/intel/dev/intel_kmd.h @@ -0,0 +1,32 @@ +/* + * Copyright © 2023 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#pragma once + +enum intel_kmd_type { + INTEL_KMD_TYPE_INVALID = 0, + INTEL_KMD_TYPE_I915, + INTEL_KMD_TYPE_LAST +}; + +enum intel_kmd_type intel_get_kmd_type(int fd); diff --git a/src/intel/dev/meson.build b/src/intel/dev/meson.build index 0adfd7e8eb9..724c747b103 100644 --- a/src/intel/dev/meson.build +++ b/src/intel/dev/meson.build @@ -29,6 +29,8 @@ files_libintel_dev = files( 'intel_device_info.h', 'intel_hwconfig.c', 'intel_hwconfig.h', + 'intel_kmd.c', + 'intel_kmd.h', ) libintel_dev = static_library(