From: Marcin Bernatowicz <marcin.bernatowicz@linux.intel.com>
To: igt-dev@lists.freedesktop.org
Cc: kamil.konieczny@linux.intel.com, adam.miszczak@linux.intel.com,
jakub1.kolakowski@intel.com, lukasz.laguna@intel.com,
michal.wajdeczko@intel.com, michal.winiarski@intel.com,
narasimha.c.v@intel.com, piotr.piorkowski@intel.com,
satyanarayana.k.v.p@intel.com, tomasz.lis@intel.com,
Marcin Bernatowicz <marcin.bernatowicz@linux.intel.com>
Subject: [PATCH v2 i-g-t 3/5] lib/xe/xe_sriov_debugfs: Add function to read provisioned ranges
Date: Wed, 13 Nov 2024 12:59:46 +0100 [thread overview]
Message-ID: <20241113115948.287709-4-marcin.bernatowicz@linux.intel.com> (raw)
In-Reply-To: <20241113115948.287709-1-marcin.bernatowicz@linux.intel.com>
Implement xe_sriov_pf_debugfs_read_provisioned_ranges() to read and
parse VFs provisioned ranges from the debug filesystem. Introduce
xe_sriov_debugfs_provisioned_attr_name() to get the debugfs attribute
name for a given shared resource type.
v2: Correct function description (Adam)
Signed-off-by: Marcin Bernatowicz <marcin.bernatowicz@linux.intel.com>
Reviewed-by: Adam Miszczak <adam.miszczak@linux.intel.com>
Cc: Adam Miszczak <adam.miszczak@linux.intel.com>
Cc: Jakub Kolakowski <jakub1.kolakowski@intel.com>
Cc: Marcin Bernatowicz <marcin.bernatowicz@linux.intel.com>
Cc: Michał Wajdeczko <michal.wajdeczko@intel.com>
Cc: Michał Winiarski <michal.winiarski@intel.com>
Cc: Narasimha C V <narasimha.c.v@intel.com>
Cc: Piotr Piórkowski <piotr.piorkowski@intel.com>
Cc: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
Cc: Tomasz Lis <tomasz.lis@intel.com>
---
lib/xe/xe_sriov_debugfs.c | 139 +++++++++++++++++++++++++++++++++++++-
lib/xe/xe_sriov_debugfs.h | 8 +++
2 files changed, 146 insertions(+), 1 deletion(-)
diff --git a/lib/xe/xe_sriov_debugfs.c b/lib/xe/xe_sriov_debugfs.c
index dc6ef9da3..c87f91492 100644
--- a/lib/xe/xe_sriov_debugfs.c
+++ b/lib/xe/xe_sriov_debugfs.c
@@ -9,8 +9,9 @@
#include "drmtest.h"
#include "igt_debugfs.h"
#include "igt_sriov_device.h"
-#include "xe/xe_sriov_debugfs.h"
#include "xe/xe_query.h"
+#include "xe/xe_sriov_debugfs.h"
+#include "xe/xe_sriov_provisioning.h"
#define SRIOV_DEBUGFS_PATH_MAX 96
@@ -67,3 +68,139 @@ int xe_sriov_pf_debugfs_attr_open(int pf, unsigned int vf_num, unsigned int gt_n
return debugfs;
}
+
+/**
+ * xe_sriov_debugfs_provisioned_attr_name:
+ * @res: The shared resource type
+ *
+ * Returns the name of the debugfs provisioned attribute corresponding
+ * to the given shared resource type.
+ *
+ * Return: A string representing the debugfs provisioned attribute name if the
+ * resource type is valid, otherwise NULL.
+ */
+const char *xe_sriov_debugfs_provisioned_attr_name(enum xe_sriov_shared_res res)
+{
+ switch (res) {
+ case XE_SRIOV_SHARED_RES_CONTEXTS:
+ return "contexts_provisioned";
+ case XE_SRIOV_SHARED_RES_DOORBELLS:
+ return "doorbells_provisioned";
+ case XE_SRIOV_SHARED_RES_GGTT:
+ return "ggtt_provisioned";
+ case XE_SRIOV_SHARED_RES_LMEM:
+ return "lmem_provisioned";
+ }
+
+ return NULL;
+}
+
+static int parse_provisioned_range(const char *line,
+ struct xe_sriov_provisioned_range *range,
+ enum xe_sriov_shared_res res)
+{
+ int ret = -1;
+
+ switch (res) {
+ case XE_SRIOV_SHARED_RES_CONTEXTS:
+ case XE_SRIOV_SHARED_RES_DOORBELLS:
+ if (sscanf(line, "VF%u: %lu-%lu", &range->vf_id, &range->start, &range->end) == 3)
+ ret = 0;
+ break;
+ case XE_SRIOV_SHARED_RES_GGTT:
+ if (sscanf(line, "VF%u: %lx-%lx", &range->vf_id, &range->start, &range->end) == 3)
+ ret = 0;
+ break;
+ case XE_SRIOV_SHARED_RES_LMEM:
+ /* Convert to an inclusive range as is the case for other resources.
+ * The start is always 0 and the end is the value read - 1.
+ */
+ if (sscanf(line, "VF%u: %lu", &range->vf_id, &range->end) == 2)
+ ret = 0;
+ if (!range->end)
+ return -1;
+ range->end -= 1;
+ range->start = 0;
+ break;
+ }
+
+ return ret;
+}
+
+/**
+ * xe_sriov_debugfs_pf_read_provisioned_ranges:
+ * @pf_fd: PF device file descriptor
+ * @res: resource
+ * @gt_id: GT number
+ * @ranges: pointer to array of provisioned ranges
+ * @nr_ranges: pointer to number of read provisioned VFs
+ *
+ * Reads provisioned ranges of shared resources.
+ * Allocates the space for ranges and updates
+ * the nr_ranges to the number of read ranges.
+ * The caller should free the allocated space.
+ *
+ * Return: 0 if successful in reading ranges, otherwise negative error code.
+ */
+int xe_sriov_pf_debugfs_read_provisioned_ranges(int pf_fd, enum xe_sriov_shared_res res,
+ unsigned int gt_id,
+ struct xe_sriov_provisioned_range **ranges,
+ unsigned int *nr_ranges)
+{
+ struct xe_sriov_provisioned_range *new_ranges;
+ struct xe_sriov_provisioned_range range;
+ FILE *file;
+ size_t n = 0;
+ const char *fname;
+ char *line = NULL;
+ int fd, ret = 0;
+ ssize_t nread;
+
+ *nr_ranges = 0;
+ *ranges = NULL;
+
+ fname = xe_sriov_debugfs_provisioned_attr_name(res);
+ if (!fname)
+ return -EINVAL;
+
+ fd = xe_sriov_pf_debugfs_attr_open(pf_fd, 0, gt_id, fname, O_RDONLY);
+ if (fd < 0)
+ return -ENOENT;
+ file = fdopen(fd, "r");
+ if (!file) {
+ close(fd);
+ return -errno;
+ }
+
+ while ((nread = getline(&line, &n, file)) != -1) {
+ ret = parse_provisioned_range(line, &range, res);
+ if (ret) {
+ igt_debug("Failed to parse line: %s\n", line);
+ goto cleanup;
+ }
+
+ new_ranges = realloc(*ranges, sizeof(range) * (*nr_ranges + 1));
+ if (!new_ranges) {
+ ret = -ENOMEM;
+ goto cleanup;
+ }
+ *ranges = new_ranges;
+ memcpy(&(*ranges)[*nr_ranges], &range, sizeof(range));
+ (*nr_ranges)++;
+ }
+
+ if (ferror(file))
+ ret = -EIO;
+
+cleanup:
+ free(line);
+ fclose(file);
+
+ if (ret < 0) {
+ free(*ranges);
+ *ranges = NULL;
+ *nr_ranges = 0;
+ }
+
+ return ret;
+}
diff --git a/lib/xe/xe_sriov_debugfs.h b/lib/xe/xe_sriov_debugfs.h
index 9f4ba8f43..856445e76 100644
--- a/lib/xe/xe_sriov_debugfs.h
+++ b/lib/xe/xe_sriov_debugfs.h
@@ -6,7 +6,15 @@
#ifndef __XE_SRIOV_DEBUGFS_H__
#define __XE_SRIOV_DEBUGFS_H__
+enum xe_sriov_shared_res;
+struct xe_sriov_provisioned_range;
+
int xe_sriov_pf_debugfs_attr_open(int pf, unsigned int vf_num, unsigned int gt_num,
const char *attr, int mode);
+const char *xe_sriov_debugfs_provisioned_attr_name(enum xe_sriov_shared_res res);
+int xe_sriov_pf_debugfs_read_provisioned_ranges(int pf_fd, enum xe_sriov_shared_res res,
+ unsigned int gt_id,
+ struct xe_sriov_provisioned_range **ranges,
+ unsigned int *nr_ranges);
#endif /* __XE_SRIOV_DEBUGFS_H__ */
--
2.31.1
next prev parent reply other threads:[~2024-11-13 12:00 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-13 11:59 [PATCH v2 i-g-t 0/5] Add debugfs SR-IOV helpers; Improve clear-lmem check Marcin Bernatowicz
2024-11-13 11:59 ` [PATCH v2 i-g-t 1/5] lib/xe_sriov_debugfs: Add helper for opening attributes Marcin Bernatowicz
2024-11-13 11:59 ` [PATCH v2 i-g-t 2/5] lib/xe/xe_sriov_provisioning: Define resource types and provisioned range structure Marcin Bernatowicz
2024-11-13 11:59 ` Marcin Bernatowicz [this message]
2024-11-13 11:59 ` [PATCH v2 i-g-t 4/5] tests/intel/xe_sriov_flr: Verify full LMEM range Marcin Bernatowicz
2024-11-13 11:59 ` [PATCH v2 i-g-t 5/5] lib/xe/xe_sriov_provisioning: Extract function to search provisioned PTE ranges Marcin Bernatowicz
2024-11-13 15:27 ` ✓ Fi.CI.BAT: success for Add debugfs SR-IOV helpers; Improve clear-lmem check (rev2) Patchwork
2024-11-13 15:32 ` ✓ CI.xeBAT: " Patchwork
2024-11-13 18:08 ` ✗ Fi.CI.IGT: failure " Patchwork
2024-11-13 22:13 ` ✗ CI.xeFULL: " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20241113115948.287709-4-marcin.bernatowicz@linux.intel.com \
--to=marcin.bernatowicz@linux.intel.com \
--cc=adam.miszczak@linux.intel.com \
--cc=igt-dev@lists.freedesktop.org \
--cc=jakub1.kolakowski@intel.com \
--cc=kamil.konieczny@linux.intel.com \
--cc=lukasz.laguna@intel.com \
--cc=michal.wajdeczko@intel.com \
--cc=michal.winiarski@intel.com \
--cc=narasimha.c.v@intel.com \
--cc=piotr.piorkowski@intel.com \
--cc=satyanarayana.k.v.p@intel.com \
--cc=tomasz.lis@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox