From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mgamail.intel.com (mgamail.intel.com [192.55.52.115]) by gabe.freedesktop.org (Postfix) with ESMTPS id 4037C10E49D for ; Tue, 5 Dec 2023 08:16:31 +0000 (UTC) From: Lukasz Laguna To: igt-dev@lists.freedesktop.org Date: Tue, 5 Dec 2023 09:16:13 +0100 Message-Id: <20231205081618.18143-3-lukasz.laguna@intel.com> In-Reply-To: <20231205081618.18143-1-lukasz.laguna@intel.com> References: <20231205081618.18143-1-lukasz.laguna@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [igt-dev] [PATCH i-g-t v7 2/7] lib/igt_sriov_device: add helper for opening VF device List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" List-ID: From: Katarzyna Dec Helper opens DRM device node and returns its file descriptor. v2: - s/drm_open_device/__drm_open_device (Kamil) - combine string with one go (Kamil) v3: - change description of __drm_open_device() (Kamil) v4: - return error on wrong input (!vf_num) instead of assert (Kamil) Cc: Marcin Bernatowicz Cc: Michal Wajdeczko Signed-off-by: Katarzyna Dec Signed-off-by: Lukasz Laguna Reviewed-by: Kamil Konieczny --- lib/drmtest.c | 22 ++++++++++++++++---- lib/drmtest.h | 1 + lib/igt_sriov_device.c | 47 ++++++++++++++++++++++++++++++++++++++++++ lib/igt_sriov_device.h | 1 + 4 files changed, 67 insertions(+), 4 deletions(-) diff --git a/lib/drmtest.c b/lib/drmtest.c index f0b97e362..c98754798 100644 --- a/lib/drmtest.c +++ b/lib/drmtest.c @@ -245,7 +245,21 @@ static void log_opened_device_path(const char *device_path) igt_info("Opened device: %s\n", item->path); } -static int open_device(const char *name, unsigned int chipset) +/** + * __drm_open_device: + * @name: DRM node name + * @chipset: OR'd flags for chipset to be opened + * + * Open a drm legacy device node with given @name and compatible with given + * @chipset flag. + * + * A special case is the use of the IGT_FORCE_DRIVER environment variable. In + * such case, even if opened device is compatible with given @chipset flag, the + * function returns error if forced driver is not compatible with @chipset. + * + * Returns: DRM file descriptor or -1 on error + */ +int __drm_open_device(const char *name, unsigned int chipset) { const char *forced; char dev_name[16] = ""; @@ -350,7 +364,7 @@ static int __search_and_open(const char *base, int offset, unsigned int chipset, if (_is_already_opened(name, as_idx)) continue; - fd = open_device(name, chipset); + fd = __drm_open_device(name, chipset); if (fd != -1) return fd; } @@ -392,13 +406,13 @@ static int __open_driver_exact(const char *name, unsigned int chipset) { int fd; - fd = open_device(name, chipset); + fd = __drm_open_device(name, chipset); if (fd != -1) return fd; drm_load_module(chipset); - return open_device(name, chipset); + return __drm_open_device(name, chipset); } /* diff --git a/lib/drmtest.h b/lib/drmtest.h index 909a0c12c..271a93e8b 100644 --- a/lib/drmtest.h +++ b/lib/drmtest.h @@ -98,6 +98,7 @@ void __set_forced_driver(const char *name); */ #define ALIGN_DOWN(x, a) ALIGN((x) - ((a) - 1), (a)) +int __drm_open_device(const char *name, unsigned int chipset); void drm_load_module(unsigned int chipset); int drm_open_driver(int chipset); int drm_open_driver_master(int chipset); diff --git a/lib/igt_sriov_device.c b/lib/igt_sriov_device.c index c5c594c2c..36116058a 100644 --- a/lib/igt_sriov_device.c +++ b/lib/igt_sriov_device.c @@ -3,8 +3,10 @@ * Copyright(c) 2023 Intel Corporation. All rights reserved. */ +#include #include +#include "drmtest.h" #include "igt_core.h" #include "igt_sriov_device.h" #include "igt_sysfs.h" @@ -211,3 +213,48 @@ void igt_sriov_disable_driver_autoprobe(int pf) { pf_attr_set_u32(pf, "device/sriov_drivers_autoprobe", false); } + +/** + * igt_sriov_open_vf_drm_device - Open VF DRM device node + * @pf: PF device file descriptor + * @vf_num: VF number (1-based to identify single VF) + * + * Open DRM device node for given VF. + * + * Return: + * VF file descriptor or -1 on error. + */ +int igt_sriov_open_vf_drm_device(int pf, unsigned int vf_num) +{ + char dir_path[PATH_MAX], path[256], dev_name[16]; + DIR *dir; + struct dirent *de; + bool found = false; + + if (!vf_num) + return -1; + + if (!igt_sysfs_path(pf, path, sizeof(path))) + return -1; + /* vf_num is 1-based, but virtfn is 0-based */ + snprintf(dir_path, sizeof(dir_path), "%s/device/virtfn%u/drm", path, vf_num - 1); + + dir = opendir(dir_path); + if (!dir) + return -1; + while ((de = readdir(dir))) { + unsigned int card_num; + + if (sscanf(de->d_name, "card%d", &card_num) == 1) { + snprintf(dev_name, sizeof(dev_name), "/dev/dri/card%u", card_num); + found = true; + break; + } + } + closedir(dir); + + if (!found) + return -1; + + return __drm_open_device(dev_name, DRIVER_ANY); +} diff --git a/lib/igt_sriov_device.h b/lib/igt_sriov_device.h index 63359d57c..2baf183fb 100644 --- a/lib/igt_sriov_device.h +++ b/lib/igt_sriov_device.h @@ -23,5 +23,6 @@ void igt_sriov_disable_vfs(int pf); bool igt_sriov_is_driver_autoprobe_enabled(int pf); void igt_sriov_enable_driver_autoprobe(int pf); void igt_sriov_disable_driver_autoprobe(int pf); +int igt_sriov_open_vf_drm_device(int pf, unsigned int vf_num); #endif /* __IGT_SRIOV_DEVICE_H__ */ -- 2.40.0