From: Michal Wajdeczko <michal.wajdeczko@intel.com>
To: intel-xe@lists.freedesktop.org
Cc: "Michal Wajdeczko" <michal.wajdeczko@intel.com>,
"Michał Winiarski" <michal.winiarski@intel.com>
Subject: [PATCH v2 06/13] drm/xe/guc: Add KLV parsing helper
Date: Wed, 8 Jul 2026 00:08:08 +0200 [thread overview]
Message-ID: <20260707220816.677-7-michal.wajdeczko@intel.com> (raw)
In-Reply-To: <20260707220816.677-1-michal.wajdeczko@intel.com>
We have already introduced a helper to encode larger objects. Now
add helper to parse the KLVs buffer. We will use it shortly.
Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Reviewed-by: Michał Winiarski <michal.winiarski@intel.com>
---
drivers/gpu/drm/xe/xe_guc_klv_helpers.c | 38 +++++++++++++++++++++++++
drivers/gpu/drm/xe/xe_guc_klv_helpers.h | 3 ++
2 files changed, 41 insertions(+)
diff --git a/drivers/gpu/drm/xe/xe_guc_klv_helpers.c b/drivers/gpu/drm/xe/xe_guc_klv_helpers.c
index 5ad51a8ff0de..723fc6894c37 100644
--- a/drivers/gpu/drm/xe/xe_guc_klv_helpers.c
+++ b/drivers/gpu/drm/xe/xe_guc_klv_helpers.c
@@ -317,3 +317,41 @@ u32 *xe_guc_klv_encode_object(u32 *klvs, u32 avail, u16 key, const void *obj,
*klvs = PREP_GUC_KLV(key, end - (klvs + GUC_KLV_LEN_MIN));
return end;
}
+
+/**
+ * xe_guc_klv_parser() - Parse and decode stream of KLVs.
+ * @klvs: the buffer with KLVs
+ * @num_dwords: number of dwords (u32) available in the buffer
+ * @obj: opaque pointer to be used by the @decoder function
+ * @decoder: pointer to the decoder function
+ *
+ * Return: The sum of all results returned by the decoder or
+ * an -errno on decoder or buffer failure.
+ */
+int xe_guc_klv_parser(const u32 *klvs, u32 num_dwords, void *obj,
+ int (*decoder)(void *obj, u16 key, u16 len, const u32 *value))
+{
+ int total = 0;
+ int ret;
+
+ while (num_dwords >= GUC_KLV_LEN_MIN) {
+ u16 key = FIELD_GET(GUC_KLV_0_KEY, klvs[0]);
+ u16 len = FIELD_GET(GUC_KLV_0_LEN, klvs[0]);
+
+ klvs += GUC_KLV_LEN_MIN;
+ num_dwords -= GUC_KLV_LEN_MIN;
+
+ if (num_dwords < len)
+ return -ENODATA;
+
+ ret = decoder(obj, key, len, klvs);
+ if (ret < 0)
+ return ret;
+ total += ret;
+
+ klvs += len;
+ num_dwords -= len;
+ }
+
+ return total;
+}
diff --git a/drivers/gpu/drm/xe/xe_guc_klv_helpers.h b/drivers/gpu/drm/xe/xe_guc_klv_helpers.h
index 855805f4463d..cf3b29adc9d6 100644
--- a/drivers/gpu/drm/xe/xe_guc_klv_helpers.h
+++ b/drivers/gpu/drm/xe/xe_guc_klv_helpers.h
@@ -23,6 +23,9 @@ u32 *xe_guc_klv_encode_string(u32 *klvs, u32 avail, u16 key, const char *s);
u32 *xe_guc_klv_encode_object(u32 *klvs, u32 avail, u16 key, const void *obj,
u32 *(*encoder)(u32 *klvs, u32 avail, const void *obj));
+int xe_guc_klv_parser(const u32 *klvs, u32 num_dwords, void *obj,
+ int (*decoder)(void *obj, u16 key, u16 len, const u32 *value));
+
/**
* PREP_GUC_KLV - Prepare KLV header value based on provided key and len.
* @key: KLV key
--
2.47.1
next prev parent reply other threads:[~2026-07-07 22:08 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-07 22:08 [PATCH v2 00/13] drm/xe: Add and use more KLV helpers Michal Wajdeczko
2026-07-07 22:08 ` [PATCH v2 01/13] drm/xe/guc: Allow to print single KLV Michal Wajdeczko
2026-07-07 22:08 ` [PATCH v2 02/13] drm/xe/guc: Prepare to print group KLVs Michal Wajdeczko
2026-07-07 22:08 ` [PATCH v2 03/13] drm/xe/guc: Add basic KLV encoding helpers Michal Wajdeczko
2026-07-07 22:08 ` [PATCH v2 04/13] drm/xe/guc: Add string KLV encoding helper Michal Wajdeczko
2026-07-09 12:51 ` Michał Winiarski
2026-07-07 22:08 ` [PATCH v2 05/13] drm/xe/guc: Add object " Michal Wajdeczko
2026-07-09 12:53 ` Michał Winiarski
2026-07-07 22:08 ` Michal Wajdeczko [this message]
2026-07-07 22:08 ` [PATCH v2 07/13] drm/xe/guc: Formalize Reserved KLVs Michal Wajdeczko
2026-07-10 17:25 ` [PATCH v3 " Michal Wajdeczko
2026-07-07 22:08 ` [PATCH v2 08/13] drm/xe/tests: Add GuC KLV helpers basic tests Michal Wajdeczko
2026-07-07 22:08 ` [PATCH v2 09/13] drm/xe/tests: Add string encoding helper test Michal Wajdeczko
2026-07-08 18:07 ` [PATCH v3 " Michal Wajdeczko
2026-07-07 22:08 ` [PATCH v2 10/13] drm/xe/tests: Add object " Michal Wajdeczko
2026-07-10 19:59 ` [PATCH v3 " Michal Wajdeczko
2026-07-07 22:08 ` [PATCH v2 11/13] drm/xe/tests: Add GuC KLV printer test Michal Wajdeczko
2026-07-11 7:36 ` [PATCH v3 " Michal Wajdeczko
2026-07-07 22:08 ` [PATCH v2 12/13] drm/xe/tests: Add migration packet test Michal Wajdeczko
2026-07-08 18:09 ` [PATCH v3 " Michal Wajdeczko
2026-07-07 22:08 ` [PATCH v2 13/13] drm/xe/pf: Handle migration descriptor using KLV helpers Michal Wajdeczko
2026-07-07 22:16 ` ✗ CI.checkpatch: warning for drm/xe: Add and use more KLV helpers (rev2) Patchwork
2026-07-07 22:18 ` ✓ CI.KUnit: success " Patchwork
2026-07-07 23:04 ` ✓ Xe.CI.BAT: " Patchwork
2026-07-08 0:20 ` ✓ Xe.CI.FULL: " Patchwork
2026-07-08 19:04 ` ✗ CI.checkpatch: warning for drm/xe: Add and use more KLV helpers (rev4) Patchwork
2026-07-08 19:05 ` ✓ CI.KUnit: success " Patchwork
2026-07-08 19:55 ` ✓ Xe.CI.BAT: " Patchwork
2026-07-08 23:56 ` ✓ Xe.CI.FULL: " Patchwork
2026-07-10 17:31 ` ✗ CI.checkpatch: warning for drm/xe: Add and use more KLV helpers (rev5) Patchwork
2026-07-10 17:32 ` ✓ CI.KUnit: success " Patchwork
2026-07-10 18:22 ` ✓ Xe.CI.BAT: " Patchwork
2026-07-11 4:04 ` ✓ Xe.CI.FULL: " Patchwork
2026-07-11 7:42 ` ✗ CI.checkpatch: warning for drm/xe: Add and use more KLV helpers (rev7) Patchwork
2026-07-11 7:43 ` ✓ CI.KUnit: success " Patchwork
2026-07-11 8:18 ` ✓ Xe.CI.BAT: " Patchwork
2026-07-11 11:12 ` ✓ Xe.CI.FULL: " 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=20260707220816.677-7-michal.wajdeczko@intel.com \
--to=michal.wajdeczko@intel.com \
--cc=intel-xe@lists.freedesktop.org \
--cc=michal.winiarski@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