* [PATCH v6 0/6] drm/xe/guc: Add LFD format output for guc log
@ 2025-07-22 1:35 Zhanjun Dong
2025-07-22 1:35 ` [PATCH v6 1/6] drm/xe/guc: Add log init config abi definitions Zhanjun Dong
` (9 more replies)
0 siblings, 10 replies; 30+ messages in thread
From: Zhanjun Dong @ 2025-07-22 1:35 UTC (permalink / raw)
To: intel-xe; +Cc: Zhanjun Dong, Michal Wajdeczko, Jonathan Cavitt, Matthew Brost
Add new debugfs entry "guc_log_lfd", which supports output guc log
in LFD(Log Format Descriptors) format.
Add GuC crash dump data empty check. LFD will only include crash dump
section when data is not empty.
Signed-off-by: Zhanjun Dong <zhanjun.dong@intel.com>
---
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Jonathan Cavitt <jonathan.cavitt@intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Changes in v6:
Replace log_init_config to lic
Changes in v5:
Cleanup inconsistent macro, type and symbol names (Michal)
Switch to use 1K local stack for buffer usage (Michal)
Changes in v4:
Rebase with debugfs changes (Michal)
Drop "_t" suffix in structures name (Matthew, Michal)
Split log abi header as seperate patch (Michal)
Fix static vaiable multiple instance access issue (Michal)
Switched to fixed size(2M) of lfd buffer, removed buffer size check for KLVs
Removed log event buffer content copy, read from log buffer chunks directly
Changes in v3:
Split ABI header, debugfs and GuC code out as seperate patch
Remove bit fields in structure define, changed to GENMASK
Remove crash_dumped flag, changed to dump data empty check
Changes in v2:
Split GuC init config abi defines out from LFD abi header file
Split crash dump detect as seperate patch
Add size check for LFD functions
Make abi header comments kernel-doc style
Zhanjun Dong (6):
drm/xe/guc: Add log init config abi definitions
drm/xe/guc: Add LFD related abi definitions
drm/xe/guc: Add new debugfs entry for lfd format output
drm/xe/guc: Add GuC log init config in LFD format
drm/xe/guc: Add GuC log event buffer output in LFD format
drm/xe/guc: Only add GuC crash dump if available
drivers/gpu/drm/xe/abi/guc_lfd_abi.h | 282 ++++++++++++++++++++
drivers/gpu/drm/xe/abi/guc_lic_abi.h | 107 ++++++++
drivers/gpu/drm/xe/xe_guc_debugfs.c | 7 +
drivers/gpu/drm/xe/xe_guc_log.c | 382 +++++++++++++++++++++++++++
drivers/gpu/drm/xe/xe_guc_log.h | 1 +
5 files changed, 779 insertions(+)
create mode 100644 drivers/gpu/drm/xe/abi/guc_lfd_abi.h
create mode 100644 drivers/gpu/drm/xe/abi/guc_lic_abi.h
--
2.34.1
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH v6 1/6] drm/xe/guc: Add log init config abi definitions
2025-07-22 1:35 [PATCH v6 0/6] drm/xe/guc: Add LFD format output for guc log Zhanjun Dong
@ 2025-07-22 1:35 ` Zhanjun Dong
2025-07-29 17:40 ` Michal Wajdeczko
2025-07-29 18:34 ` John Harrison
2025-07-22 1:35 ` [PATCH v6 2/6] drm/xe/guc: Add LFD related " Zhanjun Dong
` (8 subsequent siblings)
9 siblings, 2 replies; 30+ messages in thread
From: Zhanjun Dong @ 2025-07-22 1:35 UTC (permalink / raw)
To: intel-xe; +Cc: Zhanjun Dong
Add GuC log init config (LIC) ABI definitions.
Signed-off-by: Zhanjun Dong <zhanjun.dong@intel.com>
---
drivers/gpu/drm/xe/abi/guc_lic_abi.h | 107 +++++++++++++++++++++++++++
1 file changed, 107 insertions(+)
create mode 100644 drivers/gpu/drm/xe/abi/guc_lic_abi.h
diff --git a/drivers/gpu/drm/xe/abi/guc_lic_abi.h b/drivers/gpu/drm/xe/abi/guc_lic_abi.h
new file mode 100644
index 000000000000..a4e27da304cd
--- /dev/null
+++ b/drivers/gpu/drm/xe/abi/guc_lic_abi.h
@@ -0,0 +1,107 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2025 Intel Corporation
+ */
+
+#ifndef _ABI_GUC_LIC_ABI_H_
+#define _ABI_GUC_LIC_ABI_H_
+
+#include <linux/types.h>
+
+/** enum guc_lic_type - Log Init Config TLV IDs. */
+enum guc_lic_type {
+ /**
+ * @GUC_LIC_TYPE_GUC_SW_VERSION: GuC firmware version. Value
+ * is a 32 bit number represented by guc_sw_version.
+ */
+ GUC_LIC_TYPE_GUC_SW_VERSION = 0x1,
+ /**
+ * @GUC_LIC_TYPE_GUC_DEVICE_ID: GuC device id. Value is a 32
+ * bit.
+ */
+ GUC_LIC_TYPE_GUC_DEVICE_ID = 0x2,
+ /**
+ * @GUC_LIC_TYPE_TSC_FREQUENCY: GuC timestamp counter
+ * frequency. Value is a 32 bit number representing frequency in
+ * kHz. This timestamp is utilized in log entries, timer and
+ * for engine utilization tracking.
+ */
+ GUC_LIC_TYPE_TSC_FREQUENCY = 0x3,
+ /**
+ * @GUC_LIC_TYPE_GMD_ID: HW GMD ID. Value is a 32 bit number
+ * representing graphics, media and display HW architecture IDs.
+ */
+ GUC_LIC_TYPE_GMD_ID = 0x4,
+ /**
+ * @GUC_LIC_TYPE_BUILD_PLATFORM_ID: GuC build platform ID.
+ * Value is 32 bits.
+ */
+ GUC_LIC_TYPE_BUILD_PLATFORM_ID = 0x5,
+};
+
+/**
+ * struct guc_sw_version - This structure describes the full version of a
+ * software component.
+ */
+struct guc_sw_version {
+ /** @dw0: A 32 bits dword, contains multiple bit fields */
+ u32 dw0;
+#define GUC_SW_VERSION_PATCH_VERSION GENMASK(7, 0)
+#define GUC_SW_VERSION_MINOR_VERSION GENMASK(15, 8)
+#define GUC_SW_VERSION_MAJOR_VERSION GENMASK(23, 16)
+#define GUC_SW_VERSION_BRANCH_ID GENMASK(31, 24)
+} __packed;
+
+/**
+ * struct guc_lic_format_version - Log Init Config Structure Version.
+ * Major-Minor is not a fractional number (i.e. Ver 1.3 would be older
+ * than 1.12)
+ */
+struct guc_lic_format_version {
+ /** @dw0: A 32 bits dword, contains multiple bit fields */
+ u32 dw0;
+ /*
+ * Log-Init-Config structure minor version. Must be
+ * GUC_LIC_FORMAT_VERSION_MASK_MINOR
+ */
+#define GUC_LIC_FORMAT_VERSION_MASK_MINOR GENMASK(15, 0)
+ /*
+ * Log-Init-Config structure major version. Must be
+ * GUC_LIC_FORMAT_VERSION_MASK_MAJOR
+ */
+#define GUC_LIC_FORMAT_VERSION_MASK_MAJOR GENMASK(31, 16)
+} __packed;
+
+/**
+ * struct guc_lic - GuC lic (Log-Init-Config) structure.
+ * This is populated by the GUC at log init time and is located in the log
+ * buffer as per the Log Buffer Layout (In Memory). The array of guc log
+ * buffer states plus this structure must not exceed 4KB
+ */
+struct guc_lic {
+ /**
+ * @magic: A magic number set by GuC to identify that this
+ * structure contains valid information: magic = GUC_LIC_MAGIC.
+ * Used to verify the information in this structure is valid.
+ */
+ u32 magic;
+#define GUC_LIC_MAGIC 0x8086900D
+
+ /**
+ * @version: The version of the this structure. Represented by
+ * guc_lic_format_version
+ */
+ struct guc_lic_format_version version;
+#define GUC_LIC_FORMAT_VERSION_MAJOR 1u
+#define GUC_LIC_FORMAT_VERSION_MINOR 0u
+
+ /** @dw_size: Number of Dws the `data` array contains. */
+ u32 dw_size;
+ /**
+ * @data: Array of dwords representing a list of LIC KLVs of
+ * type guc_klv_generic with keys represented by guc_lic_type
+ */
+ u32 data[] __counted_by(dw_size);
+} __packed;
+
+#endif
--
2.34.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v6 2/6] drm/xe/guc: Add LFD related abi definitions
2025-07-22 1:35 [PATCH v6 0/6] drm/xe/guc: Add LFD format output for guc log Zhanjun Dong
2025-07-22 1:35 ` [PATCH v6 1/6] drm/xe/guc: Add log init config abi definitions Zhanjun Dong
@ 2025-07-22 1:35 ` Zhanjun Dong
2025-07-29 18:07 ` Michal Wajdeczko
2025-07-29 19:08 ` John Harrison
2025-07-22 1:35 ` [PATCH v6 3/6] drm/xe/guc: Add new debugfs entry for lfd format output Zhanjun Dong
` (7 subsequent siblings)
9 siblings, 2 replies; 30+ messages in thread
From: Zhanjun Dong @ 2025-07-22 1:35 UTC (permalink / raw)
To: intel-xe; +Cc: Zhanjun Dong
Add GuC LFD (Log Format Descriptors) related ABI definitions.
Signed-off-by: Zhanjun Dong <zhanjun.dong@intel.com>
---
drivers/gpu/drm/xe/abi/guc_lfd_abi.h | 282 +++++++++++++++++++++++++++
1 file changed, 282 insertions(+)
create mode 100644 drivers/gpu/drm/xe/abi/guc_lfd_abi.h
diff --git a/drivers/gpu/drm/xe/abi/guc_lfd_abi.h b/drivers/gpu/drm/xe/abi/guc_lfd_abi.h
new file mode 100644
index 000000000000..b6888ab47e25
--- /dev/null
+++ b/drivers/gpu/drm/xe/abi/guc_lfd_abi.h
@@ -0,0 +1,282 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2025 Intel Corporation
+ */
+
+#ifndef _ABI_GUC_LFD_ABI_H_
+#define _ABI_GUC_LFD_ABI_H_
+
+#include <linux/types.h>
+
+#include "guc_lic_abi.h"
+
+/* Magic keys define */
+#define GUC_LFD_DRIVER_KEY_STREAMING 0x8086AAAA474C5346
+#define GUC_LFD_LOG_BUFFER_MARKER_2 0xDEADFEED
+#define GUC_LFD_CRASH_DUMP_BUFFER_MARKER_2 0x8086DEAD
+#define GUC_LFD_STATE_CAPTURE_BUFFER_MARKER_2 0xBEEFFEED
+#define GUC_LFD_LOG_BUFFER_MARKER_1V2 0xCABBA9E6
+#define GUC_LFD_STATE_CAPTURE_BUFFER_MARKER_1V2 0xCABBA9F7
+#define GUC_LFD_DATA_HEADER_MAGIC 0x8086
+
+/* The current major version of GuC-Log-File format. */
+#define GUC_LFD_FORMAT_VERSION_MAJOR 0x0001
+/* The current minor version of GuC-Log-File format. */
+#define GUC_LFD_FORMAT_VERSION_MINOR 0x0000
+
+/** enum guc_lfd_type - Log format descriptor type */
+enum guc_lfd_type {
+ /**
+ * @GUC_LFD_TYPE_FW_REQUIRED_RANGE_START: Start of range for
+ * required LFDs from GuC
+ */
+ GUC_LFD_TYPE_FW_REQUIRED_RANGE_START = 0x1,
+ /**
+ * @GUC_LFD_TYPE_FW_VERSION: GuC Firmware Version structure. LFDs
+ * payload is guc_lfd_data_fw_version
+ */
+ GUC_LFD_TYPE_FW_VERSION = GUC_LIC_TYPE_GUC_SW_VERSION,
+ /**
+ * @GUC_LFD_TYPE_GUC_DEVICE_ID: GuC microcontroller device ID.
+ * LFDs payload is guc_lfd_data_guc_devid
+ */
+ GUC_LFD_TYPE_GUC_DEVICE_ID = GUC_LIC_TYPE_GUC_DEVICE_ID,
+ /**
+ * @GUC_LFD_TYPE_TSC_FREQUENCY: Frequency of GuC timestamps. LFDs
+ * payload is guc_lfd_data_tsc_freq
+ */
+ GUC_LFD_TYPE_TSC_FREQUENCY = GUC_LIC_TYPE_TSC_FREQUENCY,
+ /**
+ * @GUC_LFD_TYPE_GMD_ID: HW GMD ID. LFDs payload is
+ * guc_lfd_data_gmdid
+ */
+ GUC_LFD_TYPE_GMD_ID = GUC_LIC_TYPE_GMD_ID,
+ /**
+ * @GUC_LFD_TYPE_BUILD_PLATFORM_ID: GuC build platform ID. LFDs
+ * payload is guc_lfd_data_build_platformid
+ */
+ GUC_LFD_TYPE_BUILD_PLATFORM_ID = GUC_LIC_TYPE_BUILD_PLATFORM_ID,
+ /** @GUC_LFD_TYPE_FW_REQUIRED_RANGE_END: End of this range */
+ GUC_LFD_TYPE_FW_REQUIRED_RANGE_END = 0x1FFF,
+ /**
+ * @GUC_LFD_TYPE_FW_OPTIONAL_RANGE_START: Start of range for
+ * required LFDs from GuC
+ */
+ GUC_LFD_TYPE_FW_OPTIONAL_RANGE_START = 0x2000,
+ /**
+ * @GUC_LFD_TYPE_LOG_EVENTS_BUFFER: Log-event-entries buffer. LFDs
+ * payload is guc_lfd_data_log_events_buf
+ */
+ GUC_LFD_TYPE_LOG_EVENTS_BUFFER = 0x2000,
+ /**
+ * @GUC_LFD_TYPE_FW_CRASH_DUMP: GuC generated crash-dump blob.
+ * LFDs payload is guc_lfd_data_fw_crashdump
+ */
+ GUC_LFD_TYPE_FW_CRASH_DUMP = 0x2001,
+ /** @GUC_LFD_TYPE_FW_OPTIONAL_RANGE_END: End of this range */
+ GUC_LFD_TYPE_FW_OPTIONAL_RANGE_END = 0x3FFF,
+ /**
+ * @GUC_LFD_TYPE_KMD_REQUIRED_RANGE_START: Start of range for
+ * required KMD LFDs
+ */
+ GUC_LFD_TYPE_KMD_REQUIRED_RANGE_START = 0x4000,
+ /**
+ * @GUC_LFD_TYPE_OS_ID: An identifier for the OS. LFDs payload is
+ * guc_lfd_data_os_id
+ */
+ GUC_LFD_TYPE_OS_ID = 0x4000,
+ /** @GUC_LFD_TYPE_KMD_REQUIRED_RANGE_END: End of this range */
+ GUC_LFD_TYPE_KMD_REQUIRED_RANGE_END = 0x5FFF,
+ /**
+ * @GUC_LFD_TYPE_KMD_OPTIONAL_RANGE_START: Start of range for
+ * optional KMD LFDs
+ */
+ GUC_LFD_TYPE_KMD_OPTIONAL_RANGE_START = 0x6000,
+ /**
+ * @GUC_LFD_TYPE_BINARY_SCHEMA_FORMAT: Binary representation of
+ * GuC log-events schema. LFDs TLV payload is
+ * guc_lfd_data_binary_schema
+ */
+ GUC_LFD_TYPE_BINARY_SCHEMA_FORMAT = 0x6000,
+ /**
+ * @GUC_LFD_TYPE_HOST_COMMENT: ASCII string containing comments
+ * from the host/KMD. LFDs TLV payload is
+ * guc_lfd_data_host_comment
+ */
+ GUC_LFD_TYPE_HOST_COMMENT = 0x6001,
+ /** @GUC_LFD_TYPE_KMD_OPTIONAL_RANGE_END: End of this range */
+ GUC_LFD_TYPE_KMD_OPTIONAL_RANGE_END = 0x7FFF,
+ /** @GUC_LFD_TYPE_RESERVED_RANGE_START: Start of reserved range */
+ GUC_LFD_TYPE_RESERVED_RANGE_START = 0x8000,
+ /** @GUC_LFD_TYPE_RESERVED_RANGE_END: End of this range */
+ GUC_LFD_TYPE_RESERVED_RANGE_END = 0xFFFF,
+};
+
+/** enum guc_lfd_os_type - OS Type LFD-ID */
+enum guc_lfd_os_type {
+ /** @GUC_LFD_OS_TYPE_OSID_WIN: Windows OS */
+ GUC_LFD_OS_TYPE_OSID_WIN = 0x1,
+ /** @GUC_LFD_OS_TYPE_OSID_LIN: Linux OS */
+ GUC_LFD_OS_TYPE_OSID_LIN = 0x2,
+ /** @GUC_LFD_OS_TYPE_OSID_VMW: VMWare OS */
+ GUC_LFD_OS_TYPE_OSID_VMW = 0x3,
+ /** @GUC_LFD_OS_TYPE_OSID_OTHER: Other */
+ GUC_LFD_OS_TYPE_OSID_OTHER = 0x4,
+};
+
+/**
+ * struct guc_lfd_data - Log format descriptor (LFD).
+ * A type of KLV with custom field-sizes + magic numbers.
+ */
+struct guc_lfd_data {
+ /** @dw0: A 32 bits dword, contains multiple bit fields */
+ u32 dw0;
+ /*
+ * Expected value: GUC_LFD_DATA_HEADER_MAGIC.
+ * Helpful in detecting file errors.
+ */
+#define GUC_LFD_DATA_MAGIC GENMASK(15, 0)
+ /*
+ * File descriptor type (the 'T' in TLV) is used to identify how
+ * to interpret `data` below. For the range of types, see
+ * guc_lfd_type
+ */
+#define GUC_LFD_DATA_DESC_TYPE GENMASK(31, 16)
+ /** @dw_size: Number of dwords the `data` field contains. */
+ u32 dw_size;
+ /** @data: Data defined by File descriptor type. */
+ u32 data[] __counted_by(dw_size);
+} __packed;
+
+/**
+ * struct guc_lfd_version - GuC Log File Format Version.
+ * Major-Minor is not a fractional number (i.e. Ver 1.3 would be older
+ * than 1.12)
+ */
+struct guc_lfd_version {
+ /** @dw0: A 32 bits dword, contains multiple bit fields */
+ u32 dw0;
+ /*
+ * Guc-Log-File Format minor version. Must be
+ * GUC_LOG_FILE_FORMAT_VERSION_MINOR
+ */
+#define GUC_LFD_VERSION_MINOR GENMASK(15, 0)
+ /*
+ * Guc-Log-File Format major version. Must be
+ * GUC_LOG_FILE_FORMAT_VERSION_MAJOR
+ */
+#define GUC_LFD_VERSION_MAJOR GENMASK(31, 16)
+} __packed;
+
+/**
+ * struct guc_lfd_data_guc_devid - GuC Device ID.
+ * This is mandatory fw LFD data
+ */
+struct guc_lfd_data_guc_devid {
+ /**
+ * @guc_devid: GuC microcontroller device ID defined as described
+ * in GUC_LIC_TYPE_GUC_DEVICE_ID
+ */
+ u32 guc_devid;
+} __packed;
+
+/**
+ * struct guc_lfd_data_tsc_freq - GuC TSC Fequency.
+ * This is mandatory fw LFD data
+ */
+struct guc_lfd_data_tsc_freq {
+ /**
+ * @tsc_freq: GuC timestamp counter frequency as described in
+ * GUC_LIC_TYPE_TSC_FREQUENCY
+ */
+ u32 tsc_freq;
+} __packed;
+
+/** struct guc_lfd_data_gmdid - GMD ID. */
+struct guc_lfd_data_gmdid {
+ /** @gmd_id: GMD ID as described in GUC_LIC_TYPE_GMD_ID */
+ u32 gmd_id;
+} __packed;
+
+/** struct guc_lfd_data_build_platformid - GuC build platform ID. */
+struct guc_lfd_data_build_platformid {
+ /**
+ * @platform_build_id: GuC build platform ID as described in
+ * GUC_LIC_TYPE_BUILD_PLATFORM_ID
+ */
+ u32 platform_build_id;
+} __packed;
+
+/**
+ * struct guc_lfd_data_log_events_buf - GuC Log Events Buffer.
+ * This is optional fw LFD data
+ */
+struct guc_lfd_data_log_events_buf {
+ /**
+ * @log_events_format_version: version of GuC log format of buffer
+ */
+ u32 log_events_format_version;
+ /**
+ * @log_format_buf: If `log_format_version` == 1, array of
+ * guc_log_format_version_1. If `log_format_version` == 2, array
+ * of guc_log_format_version_2. Dword size determined by
+ * guc_logfile_lfd.`desc_dw_size` - 1
+ */
+ u32 log_format_buf[];
+} __packed;
+
+/**
+ * struct guc_lfd_data_os_info - OS Version Information.
+ * This is mandatory host LFD data
+ */
+struct guc_lfd_data_os_info {
+ /**
+ * @os_id: enum values to identify the OS brand (1=Windows,
+ * 2=Linux, etc..). See guc_lfd_os_type for the range of types
+ */
+ u32 os_id;
+ /**
+ * @build_version: ASCII string containing OS build version
+ * information based on os_id. String is padded with null
+ * characters to ensure its DWORD aligned. Dword size determined
+ * by guc_logfile_lfd.`desc_dw_size` - 1
+ */
+ char build_version[];
+} __packed;
+
+/**
+ * struct guc_lfd_data_fw_version - GuC FW Version.
+ * This is mandatory fw LFD data
+ */
+struct guc_lfd_data_fw_version {
+ /**
+ * @guc_sw_version: The full version of the GuC microkernel that
+ * generated the logs as described in
+ * GUC_LIC_TYPE_GUC_SW_VERSION.
+ */
+ struct guc_sw_version guc_sw_version;
+} __packed;
+
+/**
+ * struct guc_logfile_header - Header of GuC Log Streaming-LFD-File Format.
+ * This structure encapsulates the layout of the guc-log-file format
+ */
+struct guc_lfd_file_header {
+ /**
+ * @magic: A magic number set by producer of a GuC log file to
+ * identify that file is a valid guc-log-file containing a stream
+ * of LFDs: Expected value: GUC_LFD_DRIVER_KEY_STREAMING
+ */
+ u64 magic;
+ /**
+ * @version: Version of this file format layout as per
+ * guc_lfd_version
+ */
+ struct guc_lfd_version version;
+ /**
+ * @lfd_stream: A stream of one or more guc_lfd_data LFD data
+ */
+ struct guc_lfd_data lfd_stream;
+} __packed;
+
+#endif
--
2.34.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v6 3/6] drm/xe/guc: Add new debugfs entry for lfd format output
2025-07-22 1:35 [PATCH v6 0/6] drm/xe/guc: Add LFD format output for guc log Zhanjun Dong
2025-07-22 1:35 ` [PATCH v6 1/6] drm/xe/guc: Add log init config abi definitions Zhanjun Dong
2025-07-22 1:35 ` [PATCH v6 2/6] drm/xe/guc: Add LFD related " Zhanjun Dong
@ 2025-07-22 1:35 ` Zhanjun Dong
2025-07-29 19:19 ` John Harrison
2025-07-22 1:35 ` [PATCH v6 4/6] drm/xe/guc: Add GuC log init config in LFD format Zhanjun Dong
` (6 subsequent siblings)
9 siblings, 1 reply; 30+ messages in thread
From: Zhanjun Dong @ 2025-07-22 1:35 UTC (permalink / raw)
To: intel-xe; +Cc: Zhanjun Dong
Add new debugfs entry "guc_log_lfd", prepared for output guc log
in LFD(Log Format Descriptors) format.
Signed-off-by: Zhanjun Dong <zhanjun.dong@intel.com>
---
drivers/gpu/drm/xe/xe_guc_debugfs.c | 7 +++++++
drivers/gpu/drm/xe/xe_guc_log.c | 32 +++++++++++++++++++++++++++++
drivers/gpu/drm/xe/xe_guc_log.h | 1 +
3 files changed, 40 insertions(+)
diff --git a/drivers/gpu/drm/xe/xe_guc_debugfs.c b/drivers/gpu/drm/xe/xe_guc_debugfs.c
index 0b102ab46c4d..6cbc4240a3bd 100644
--- a/drivers/gpu/drm/xe/xe_guc_debugfs.c
+++ b/drivers/gpu/drm/xe/xe_guc_debugfs.c
@@ -85,6 +85,12 @@ static int guc_log(struct xe_guc *guc, struct drm_printer *p)
return 0;
}
+static int guc_log_lfd(struct xe_guc *guc, struct drm_printer *p)
+{
+ xe_guc_log_print_lfd(&guc->log, p);
+ return 0;
+}
+
static int guc_log_dmesg(struct xe_guc *guc, struct drm_printer *p)
{
xe_guc_log_print_dmesg(&guc->log);
@@ -121,6 +127,7 @@ static const struct drm_info_list slpc_debugfs_list[] = {
/* everything else should be added here */
static const struct drm_info_list pf_only_debugfs_list[] = {
{ "guc_log", .show = guc_debugfs_show, .data = guc_log },
+ { "guc_log_lfd", .show = guc_debugfs_show, .data = guc_log_lfd },
{ "guc_log_dmesg", .show = guc_debugfs_show, .data = guc_log_dmesg },
};
diff --git a/drivers/gpu/drm/xe/xe_guc_log.c b/drivers/gpu/drm/xe/xe_guc_log.c
index c01ccb35dc75..d2256773aaf3 100644
--- a/drivers/gpu/drm/xe/xe_guc_log.c
+++ b/drivers/gpu/drm/xe/xe_guc_log.c
@@ -9,6 +9,7 @@
#include <drm/drm_managed.h>
+#include "abi/guc_lfd_abi.h"
#include "regs/xe_guc_regs.h"
#include "xe_bo.h"
#include "xe_devcoredump.h"
@@ -19,6 +20,12 @@
#include "xe_mmio.h"
#include "xe_module.h"
+static const struct guc_lfd_file_header default_guc_lfd_file_header = {
+ .magic = GUC_LFD_DRIVER_KEY_STREAMING,
+ .version.dw0 = FIELD_PREP_CONST(GUC_LFD_VERSION_MINOR, GUC_LFD_FORMAT_VERSION_MINOR) |
+ FIELD_PREP_CONST(GUC_LFD_VERSION_MAJOR, GUC_LFD_FORMAT_VERSION_MAJOR)
+};
+
static struct xe_guc *
log_to_guc(struct xe_guc_log *log)
{
@@ -216,6 +223,17 @@ void xe_guc_log_snapshot_print(struct xe_guc_log_snapshot *snapshot, struct drm_
}
}
+static void
+xe_guc_log_snapshot_print_lfd(struct xe_guc_log_snapshot *snapshot, struct drm_printer *p)
+{
+ if (!snapshot || !snapshot->size)
+ return;
+
+ /* Output LFD file header */
+ xe_print_blob_ascii85(p, "[LOG].data", 0, &default_guc_lfd_file_header, 0,
+ offsetof(struct guc_lfd_file_header, lfd_stream));
+}
+
/**
* xe_guc_log_print_dmesg - dump a copy of the GuC log to dmesg
* @log: GuC log structure
@@ -251,6 +269,20 @@ void xe_guc_log_print(struct xe_guc_log *log, struct drm_printer *p)
xe_guc_log_snapshot_free(snapshot);
}
+/**
+ * xe_guc_log_print_lfd - dump a copy of the GuC log to some useful location
+ * @log: GuC log structure
+ * @p: the printer object to output to
+ */
+void xe_guc_log_print_lfd(struct xe_guc_log *log, struct drm_printer *p)
+{
+ struct xe_guc_log_snapshot *snapshot;
+
+ snapshot = xe_guc_log_snapshot_capture(log, false);
+ xe_guc_log_snapshot_print_lfd(snapshot, p);
+ xe_guc_log_snapshot_free(snapshot);
+}
+
int xe_guc_log_init(struct xe_guc_log *log)
{
struct xe_device *xe = log_to_xe(log);
diff --git a/drivers/gpu/drm/xe/xe_guc_log.h b/drivers/gpu/drm/xe/xe_guc_log.h
index f1e2b0be90a9..0f6299886010 100644
--- a/drivers/gpu/drm/xe/xe_guc_log.h
+++ b/drivers/gpu/drm/xe/xe_guc_log.h
@@ -40,6 +40,7 @@ struct xe_device;
int xe_guc_log_init(struct xe_guc_log *log);
void xe_guc_log_print(struct xe_guc_log *log, struct drm_printer *p);
+void xe_guc_log_print_lfd(struct xe_guc_log *log, struct drm_printer *p);
void xe_guc_log_print_dmesg(struct xe_guc_log *log);
struct xe_guc_log_snapshot *xe_guc_log_snapshot_capture(struct xe_guc_log *log, bool atomic);
void xe_guc_log_snapshot_print(struct xe_guc_log_snapshot *snapshot, struct drm_printer *p);
--
2.34.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v6 4/6] drm/xe/guc: Add GuC log init config in LFD format
2025-07-22 1:35 [PATCH v6 0/6] drm/xe/guc: Add LFD format output for guc log Zhanjun Dong
` (2 preceding siblings ...)
2025-07-22 1:35 ` [PATCH v6 3/6] drm/xe/guc: Add new debugfs entry for lfd format output Zhanjun Dong
@ 2025-07-22 1:35 ` Zhanjun Dong
2025-07-30 0:27 ` John Harrison
2025-07-22 1:35 ` [PATCH v6 5/6] drm/xe/guc: Add GuC log event buffer output " Zhanjun Dong
` (5 subsequent siblings)
9 siblings, 1 reply; 30+ messages in thread
From: Zhanjun Dong @ 2025-07-22 1:35 UTC (permalink / raw)
To: intel-xe; +Cc: Zhanjun Dong
Add support to output GuC log init config (LIC) in LFD format.
Signed-off-by: Zhanjun Dong <zhanjun.dong@intel.com>
---
drivers/gpu/drm/xe/xe_guc_log.c | 204 ++++++++++++++++++++++++++++++++
1 file changed, 204 insertions(+)
diff --git a/drivers/gpu/drm/xe/xe_guc_log.c b/drivers/gpu/drm/xe/xe_guc_log.c
index d2256773aaf3..609a9fd5ba0c 100644
--- a/drivers/gpu/drm/xe/xe_guc_log.c
+++ b/drivers/gpu/drm/xe/xe_guc_log.c
@@ -7,6 +7,7 @@
#include <linux/fault-inject.h>
+#include <linux/utsname.h>
#include <drm/drm_managed.h>
#include "abi/guc_lfd_abi.h"
@@ -20,12 +21,67 @@
#include "xe_mmio.h"
#include "xe_module.h"
+/* LFD supported LIC type range */
+#define GUC_LOG_LIC_TYPE_FIRST (GUC_LIC_TYPE_GUC_SW_VERSION)
+#define GUC_LOG_LIC_TYPE_LAST (GUC_LIC_TYPE_BUILD_PLATFORM_ID)
+
+#define GUC_LOG_BUFFER_STATE_HEADER_LENGTH 4096
+#define GUC_LOG_BUFFER_STATE_HEADER_ENTRY_LOG 0
+#define GUC_LOG_BUFFER_STATE_HEADER_ENTRY_CRASH 1
+#define GUC_LOG_BUFFER_STATE_HEADER_ENTRY_CAPTURE 2
+#define GUC_LOG_BUFFER_STATE_HEADER_ENTRY_INIT 3
+#define GUC_LOG_BUFFER_STATE_HEADER_ENTRY_COUNT 4
+
+#define GUC_LFD_BUFFER_SIZE SZ_1K
+
+struct guc_log_buffer_entry_list {
+ u32 offset;
+ u32 rd_ptr;
+ u32 wr_ptr;
+ u32 buf_size;
+};
+
+struct guc_lic_save {
+ u32 version;
+ /*
+ * Array of init config KLVs.
+ * Range from GUC_LOG_LIC_TYPE_FIRST to GUC_LOG_LIC_TYPE_LAST
+ */
+ u32 KLV[GUC_LOG_LIC_TYPE_LAST - GUC_LOG_LIC_TYPE_FIRST + 1];
+ struct guc_log_buffer_entry_list entry[GUC_LOG_BUFFER_STATE_HEADER_ENTRY_COUNT];
+};
+
+static const struct guc_lfd_data default_guc_lfd_data = {
+ .dw0 = FIELD_PREP_CONST(GUC_LFD_DATA_MAGIC, GUC_LFD_DATA_HEADER_MAGIC)
+};
+
static const struct guc_lfd_file_header default_guc_lfd_file_header = {
.magic = GUC_LFD_DRIVER_KEY_STREAMING,
.version.dw0 = FIELD_PREP_CONST(GUC_LFD_VERSION_MINOR, GUC_LFD_FORMAT_VERSION_MINOR) |
FIELD_PREP_CONST(GUC_LFD_VERSION_MAJOR, GUC_LFD_FORMAT_VERSION_MAJOR)
};
+static struct guc_log_buffer_entry_markers {
+ u32 key[2];
+} const entry_markers[4] = {
+ {{
+ GUC_LFD_LOG_BUFFER_MARKER_1V2,
+ GUC_LFD_LOG_BUFFER_MARKER_2
+ }},
+ {{
+ GUC_LFD_LOG_BUFFER_MARKER_1V2,
+ GUC_LFD_CRASH_DUMP_BUFFER_MARKER_2
+ }},
+ {{
+ GUC_LFD_STATE_CAPTURE_BUFFER_MARKER_1V2,
+ GUC_LFD_STATE_CAPTURE_BUFFER_MARKER_2
+ }},
+ {{
+ GUC_LIC_MAGIC,
+ ((GUC_LIC_FORMAT_VERSION_MAJOR << 16) | GUC_LIC_FORMAT_VERSION_MINOR)
+ }}
+};
+
static struct xe_guc *
log_to_guc(struct xe_guc_log *log)
{
@@ -223,15 +279,163 @@ void xe_guc_log_snapshot_print(struct xe_guc_log_snapshot *snapshot, struct drm_
}
}
+static int xe_guc_log_add_lfd_header(void *buf, int buf_size)
+{
+ int len = sizeof(default_guc_lfd_data);
+
+ memcpy(buf, &default_guc_lfd_data, len);
+ return len;
+}
+
+static int xe_guc_log_add_payload(void *buf, int buf_size, u32 data_len, void *data)
+{
+ struct guc_lfd_data *lfd = buf;
+
+ /* make length DW aligned */
+ lfd->dw_size = DIV_ROUND_UP(data_len, sizeof(u32));
+ memcpy(lfd->data, data, data_len);
+ return lfd->dw_size * sizeof(u32);
+}
+
+static int xe_guc_log_add_typed_payload(void *buf, int buf_size, u32 type,
+ u32 data_len, void *data)
+{
+ struct guc_lfd_data *lfd = buf;
+ int index;
+
+ index = xe_guc_log_add_lfd_header(buf, buf_size);
+ lfd->dw0 |= FIELD_PREP(GUC_LFD_DATA_DESC_TYPE, type);
+ index += xe_guc_log_add_payload(buf, buf_size, data_len, data);
+
+ return index;
+}
+
+static inline int lic_type_to_KLV_index(u32 lic_type)
+{
+ XE_WARN_ON(lic_type < GUC_LOG_LIC_TYPE_FIRST || lic_type > GUC_LOG_LIC_TYPE_LAST);
+
+ return lic_type - GUC_LOG_LIC_TYPE_FIRST;
+}
+
+static int xe_guc_log_add_klv(void *buf, int size, u32 lic_type,
+ struct guc_lic_save *config)
+{
+ int klv_index = lic_type_to_KLV_index(lic_type);
+
+ return xe_guc_log_add_typed_payload(buf, size, lic_type, sizeof(u32),
+ &config->KLV[klv_index]);
+}
+
+static int xe_guc_log_add_os_id(void *buf, int buf_size, u32 id)
+{
+ struct guc_lfd_data *lfd = buf;
+ struct guc_lfd_data_os_info *os_id;
+ char *version;
+ int info_len;
+
+ os_id = (void *)lfd->data;
+ os_id->os_id = id;
+
+ version = init_utsname()->release;
+ info_len = strnlen(version, buf_size) + 1;
+
+ if (buf_size < sizeof(struct guc_lfd_data) + info_len)
+ return -ENOMEM;
+
+ strscpy(os_id->build_version, version, info_len);
+ return xe_guc_log_add_typed_payload(buf, buf_size, GUC_LFD_TYPE_OS_ID,
+ info_len + sizeof(*os_id), os_id);
+}
+
+static void xe_guc_log_loop_log_init(struct guc_lic *init,
+ struct guc_lic_save *config)
+{
+ struct guc_klv_generic_dw_t *p = (void *)init->data;
+ int i;
+
+ for (i = 0; i < init->dw_size;) {
+ int klv_len = FIELD_GET(GUC_KLV_0_LEN, p->kl) + 1;
+ int key = FIELD_GET(GUC_KLV_0_KEY, p->kl);
+
+ if (key < GUC_LOG_LIC_TYPE_FIRST || key > GUC_LOG_LIC_TYPE_LAST)
+ break;
+ config->KLV[lic_type_to_KLV_index(key)] = p->value;
+ i += klv_len;
+ p = (void *)((u32 *)p + klv_len);
+ }
+}
+
+static void xe_guc_log_load_lic(void *guc_log, struct guc_lic_save *config)
+{
+ u32 offset = GUC_LOG_BUFFER_STATE_HEADER_LENGTH;
+ struct guc_log_buffer_state *p = guc_log;
+ int i = 0;
+
+ config->version = p->version;
+ while (p) {
+ for (i = 0; i < GUC_LOG_BUFFER_STATE_HEADER_ENTRY_COUNT; i++) {
+ if (p->marker[0] == entry_markers[i].key[0] &&
+ p->marker[1] == entry_markers[i].key[1]) {
+ config->entry[i].offset = offset;
+ config->entry[i].rd_ptr = p->read_ptr;
+ config->entry[i].wr_ptr = p->write_ptr;
+ config->entry[i].buf_size = p->size;
+
+ if (i != GUC_LOG_BUFFER_STATE_HEADER_ENTRY_INIT) {
+ offset += p->size;
+ p++;
+ } else {
+ /* Load log init config */
+ xe_guc_log_loop_log_init((void *)p, config);
+
+ /* Init config is the last */
+ return;
+ }
+ }
+ }
+ if (i >= GUC_LOG_BUFFER_STATE_HEADER_ENTRY_COUNT)
+ break;
+ }
+}
+
+static int
+xe_guc_log_output_lfd_init(struct drm_printer *p, struct xe_guc_log_snapshot *snapshot,
+ struct guc_lic_save *config)
+{
+ int type, len;
+ size_t size = 0;
+ char buf[GUC_LFD_BUFFER_SIZE] = {0};
+
+ /* FW required types */
+ for (type = GUC_LOG_LIC_TYPE_FIRST; type <= GUC_LOG_LIC_TYPE_LAST; type++)
+ size += xe_guc_log_add_klv(&buf[size], GUC_LFD_BUFFER_SIZE - size, type, config);
+
+ /* KMD required type(s) */
+ len = xe_guc_log_add_os_id(&buf[size], GUC_LFD_BUFFER_SIZE - size,
+ GUC_LFD_OS_TYPE_OSID_LIN);
+ if (len < 0)
+ return len;
+ size += len;
+
+ xe_print_blob_ascii85(p, NULL, 0, buf, 0, size);
+ return size;
+}
+
static void
xe_guc_log_snapshot_print_lfd(struct xe_guc_log_snapshot *snapshot, struct drm_printer *p)
{
+ struct guc_lic_save config;
+
if (!snapshot || !snapshot->size)
return;
/* Output LFD file header */
xe_print_blob_ascii85(p, "[LOG].data", 0, &default_guc_lfd_file_header, 0,
offsetof(struct guc_lfd_file_header, lfd_stream));
+
+ /* Output LFD stream */
+ xe_guc_log_load_lic(snapshot->copy[0], &config);
+ xe_guc_log_output_lfd_init(p, snapshot, &config);
}
/**
--
2.34.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v6 5/6] drm/xe/guc: Add GuC log event buffer output in LFD format
2025-07-22 1:35 [PATCH v6 0/6] drm/xe/guc: Add LFD format output for guc log Zhanjun Dong
` (3 preceding siblings ...)
2025-07-22 1:35 ` [PATCH v6 4/6] drm/xe/guc: Add GuC log init config in LFD format Zhanjun Dong
@ 2025-07-22 1:35 ` Zhanjun Dong
2025-07-30 17:40 ` John Harrison
2025-07-22 1:35 ` [PATCH v6 6/6] drm/xe/guc: Only add GuC crash dump if available Zhanjun Dong
` (4 subsequent siblings)
9 siblings, 1 reply; 30+ messages in thread
From: Zhanjun Dong @ 2025-07-22 1:35 UTC (permalink / raw)
To: intel-xe; +Cc: Zhanjun Dong
Add GuC log event buffer output in LFD format.
Signed-off-by: Zhanjun Dong <zhanjun.dong@intel.com>
---
drivers/gpu/drm/xe/xe_guc_log.c | 88 ++++++++++++++++++++++++++++++++-
1 file changed, 87 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/xe/xe_guc_log.c b/drivers/gpu/drm/xe/xe_guc_log.c
index 609a9fd5ba0c..a8910211c579 100644
--- a/drivers/gpu/drm/xe/xe_guc_log.c
+++ b/drivers/gpu/drm/xe/xe_guc_log.c
@@ -421,10 +421,92 @@ xe_guc_log_output_lfd_init(struct drm_printer *p, struct xe_guc_log_snapshot *sn
return size;
}
+static void
+xe_guc_log_print_over_chunks(struct drm_printer *p, struct xe_guc_log_snapshot *snapshot,
+ u32 from, u32 to)
+{
+ int chunk_from = from % GUC_LOG_CHUNK_SIZE;
+ int chunk_id = from / GUC_LOG_CHUNK_SIZE;
+ int to_chunk_id = to / GUC_LOG_CHUNK_SIZE;
+ int chunk_to = to % GUC_LOG_CHUNK_SIZE;
+ int pos = from;
+
+ do {
+ size_t size = (to_chunk_id > chunk_id ? GUC_LOG_CHUNK_SIZE : chunk_to) - chunk_from;
+
+ xe_print_blob_ascii85(p, NULL, 0, snapshot->copy[chunk_id], chunk_from, size);
+ pos += size;
+ chunk_id++;
+ chunk_from = 0;
+ } while (pos < to);
+}
+
+static void
+xe_guc_log_lfd_print_from_chunks(struct drm_printer *p, struct xe_guc_log_snapshot *snapshot,
+ struct guc_log_buffer_entry_list *entry)
+{
+ /* Output data from guc log chunks directly */
+ if (entry->rd_ptr < entry->wr_ptr) {
+ xe_guc_log_print_over_chunks(p, snapshot,
+ entry->offset + entry->rd_ptr,
+ entry->offset + entry->wr_ptr);
+ } else {
+ /* print from rd to buf end 1st */
+ xe_guc_log_print_over_chunks(p, snapshot,
+ entry->offset + entry->rd_ptr,
+ entry->offset + entry->buf_size);
+
+ /* print from buf start to wr */
+ xe_guc_log_print_over_chunks(p, snapshot, entry->offset,
+ entry->offset + entry->wr_ptr);
+ }
+}
+
+static inline int
+xe_guc_log_add_log_event(struct drm_printer *p, struct xe_guc_log_snapshot *snapshot,
+ struct guc_lic_save *config)
+{
+ size_t size;
+ u32 data_len;
+ struct guc_lfd_data *lfd;
+ struct guc_log_buffer_entry_list *entry;
+ struct guc_lfd_data_log_events_buf *events_buf;
+ char buf[GUC_LFD_BUFFER_SIZE] = {0};
+
+ lfd = (void *)buf;
+ entry = &config->entry[GUC_LOG_BUFFER_STATE_HEADER_ENTRY_LOG];
+
+ /* Skip empty log */
+ if (entry->rd_ptr == entry->wr_ptr)
+ return 0;
+
+ size = xe_guc_log_add_lfd_header(buf, GUC_LFD_BUFFER_SIZE);
+ lfd->dw0 |= FIELD_PREP(GUC_LFD_DATA_DESC_TYPE, GUC_LFD_TYPE_LOG_EVENTS_BUFFER);
+ events_buf = (void *)&lfd->data;
+ events_buf->log_events_format_version = config->version;
+
+ /* Adjust to log_format_buf */
+ data_len = offsetof(struct guc_lfd_data_log_events_buf, log_format_buf);
+ size += data_len;
+
+ /* Calculate data length */
+ data_len += (entry->wr_ptr + entry->buf_size - entry->rd_ptr) % entry->buf_size;
+ /* make length u32 aligned */
+ lfd->dw_size = DIV_ROUND_UP(data_len, sizeof(u32));
+
+ /* Output GUC_LFD_TYPE_LOG_EVENTS_BUFFER header */
+ xe_print_blob_ascii85(p, NULL, 0, buf, 0, size);
+ xe_guc_log_lfd_print_from_chunks(p, snapshot, entry);
+
+ /* log event buffer content did not use buf, exclude from size count */
+ return size;
+}
+
static void
xe_guc_log_snapshot_print_lfd(struct xe_guc_log_snapshot *snapshot, struct drm_printer *p)
{
struct guc_lic_save config;
+ size_t size;
if (!snapshot || !snapshot->size)
return;
@@ -435,7 +517,11 @@ xe_guc_log_snapshot_print_lfd(struct xe_guc_log_snapshot *snapshot, struct drm_p
/* Output LFD stream */
xe_guc_log_load_lic(snapshot->copy[0], &config);
- xe_guc_log_output_lfd_init(p, snapshot, &config);
+ size = xe_guc_log_output_lfd_init(p, snapshot, &config);
+ if (size < 0)
+ return;
+
+ xe_guc_log_add_log_event(p, snapshot, &config);
}
/**
--
2.34.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v6 6/6] drm/xe/guc: Only add GuC crash dump if available
2025-07-22 1:35 [PATCH v6 0/6] drm/xe/guc: Add LFD format output for guc log Zhanjun Dong
` (4 preceding siblings ...)
2025-07-22 1:35 ` [PATCH v6 5/6] drm/xe/guc: Add GuC log event buffer output " Zhanjun Dong
@ 2025-07-22 1:35 ` Zhanjun Dong
2025-08-04 20:14 ` John Harrison
2025-07-22 2:47 ` ✗ CI.checkpatch: warning for drm/xe/guc: Add LFD format output for guc log (rev6) Patchwork
` (3 subsequent siblings)
9 siblings, 1 reply; 30+ messages in thread
From: Zhanjun Dong @ 2025-07-22 1:35 UTC (permalink / raw)
To: intel-xe; +Cc: Zhanjun Dong
Add GuC crash dump data empty check. LFD will only include crash dump
section when data is not empty.
Signed-off-by: Zhanjun Dong <zhanjun.dong@intel.com>
---
drivers/gpu/drm/xe/xe_guc_log.c | 60 +++++++++++++++++++++++++++++++++
1 file changed, 60 insertions(+)
diff --git a/drivers/gpu/drm/xe/xe_guc_log.c b/drivers/gpu/drm/xe/xe_guc_log.c
index a8910211c579..f5f31f15e7e3 100644
--- a/drivers/gpu/drm/xe/xe_guc_log.c
+++ b/drivers/gpu/drm/xe/xe_guc_log.c
@@ -502,6 +502,65 @@ xe_guc_log_add_log_event(struct drm_printer *p, struct xe_guc_log_snapshot *snap
return size;
}
+static int
+xe_guc_log_add_crash_dump(struct drm_printer *p, struct xe_guc_log_snapshot *snapshot,
+ struct guc_lic_save *config)
+{
+ struct guc_log_buffer_entry_list *entry;
+ int chunk_from, chunk_id, to_chunk_id;
+ int pos, from, to;
+ size_t size = 0;
+ char buf[GUC_LFD_BUFFER_SIZE] = {0};
+
+ entry = &config->entry[GUC_LOG_BUFFER_STATE_HEADER_ENTRY_CRASH];
+
+ /* Skip zero sized crash dump */
+ if (!entry->buf_size)
+ return 0;
+
+ /* Check if crash dump section are all zero */
+ from = entry->offset;
+ to = entry->offset + entry->buf_size;
+ chunk_from = from % GUC_LOG_CHUNK_SIZE;
+ chunk_id = from / GUC_LOG_CHUNK_SIZE;
+ to_chunk_id = to / GUC_LOG_CHUNK_SIZE;
+ pos = from;
+
+ do {
+ size_t size = (to_chunk_id > chunk_id ? GUC_LOG_CHUNK_SIZE : to) - chunk_from;
+ u32 *buf32 = snapshot->copy[chunk_id] + chunk_from;
+ int i;
+
+ for (i = 0; i < size / sizeof(u32); i++)
+ if (buf32[i])
+ break;
+ if (i < size / sizeof(u32)) {
+ pos += i * sizeof(u32) - chunk_from;
+ break;
+ }
+ pos += size;
+ chunk_id++;
+ chunk_from = 0;
+ } while (pos < to);
+
+ /* Buffer has non-zero data? */
+ if (pos < to) {
+ struct guc_lfd_data *lfd = (void *)buf;
+
+ size = xe_guc_log_add_lfd_header(buf, GUC_LFD_BUFFER_SIZE);
+ lfd->dw0 |= FIELD_PREP(GUC_LFD_DATA_DESC_TYPE, GUC_LFD_TYPE_FW_CRASH_DUMP);
+ /* Calculate data length */
+ lfd->dw_size = DIV_ROUND_UP(entry->buf_size, sizeof(u32));
+ /* Output GUC_LFD_TYPE_FW_CRASH_DUMP header */
+ xe_print_blob_ascii85(p, NULL, 0, buf, 0, size);
+
+ /* rd/wr ptr is not used for crash dump */
+ xe_guc_log_print_over_chunks(p, snapshot, entry->offset,
+ entry->offset + entry->buf_size);
+ }
+ return size;
+}
+
static void
xe_guc_log_snapshot_print_lfd(struct xe_guc_log_snapshot *snapshot, struct drm_printer *p)
{
@@ -522,6 +581,7 @@ xe_guc_log_snapshot_print_lfd(struct xe_guc_log_snapshot *snapshot, struct drm_p
return;
xe_guc_log_add_log_event(p, snapshot, &config);
+ xe_guc_log_add_crash_dump(p, snapshot, &config);
}
/**
--
2.34.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* ✗ CI.checkpatch: warning for drm/xe/guc: Add LFD format output for guc log (rev6)
2025-07-22 1:35 [PATCH v6 0/6] drm/xe/guc: Add LFD format output for guc log Zhanjun Dong
` (5 preceding siblings ...)
2025-07-22 1:35 ` [PATCH v6 6/6] drm/xe/guc: Only add GuC crash dump if available Zhanjun Dong
@ 2025-07-22 2:47 ` Patchwork
2025-07-22 2:49 ` ✓ CI.KUnit: success " Patchwork
` (2 subsequent siblings)
9 siblings, 0 replies; 30+ messages in thread
From: Patchwork @ 2025-07-22 2:47 UTC (permalink / raw)
To: Zhanjun Dong; +Cc: intel-xe
== Series Details ==
Series: drm/xe/guc: Add LFD format output for guc log (rev6)
URL : https://patchwork.freedesktop.org/series/146541/
State : warning
== Summary ==
+ KERNEL=/kernel
+ git clone https://gitlab.freedesktop.org/drm/maintainer-tools mt
Cloning into 'mt'...
warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/
+ git -C mt rev-list -n1 origin/master
63535c743231a7497a612c53f6edbb8a7d14412d
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit 6c5551e53e08652473533c7529a5498000927153
Author: Zhanjun Dong <zhanjun.dong@intel.com>
Date: Mon Jul 21 21:35:53 2025 -0400
drm/xe/guc: Only add GuC crash dump if available
Add GuC crash dump data empty check. LFD will only include crash dump
section when data is not empty.
Signed-off-by: Zhanjun Dong <zhanjun.dong@intel.com>
+ /mt/dim checkpatch 617f6e11e288a649addc9471911d29947c0996c8 drm-intel
5dfd41974ae4 drm/xe/guc: Add log init config abi definitions
-:11: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#11:
new file mode 100644
total: 0 errors, 1 warnings, 0 checks, 107 lines checked
6d7de5755ee8 drm/xe/guc: Add LFD related abi definitions
-:11: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#11:
new file mode 100644
total: 0 errors, 1 warnings, 0 checks, 282 lines checked
c5911f56b53f drm/xe/guc: Add new debugfs entry for lfd format output
0af8f8537bec drm/xe/guc: Add GuC log init config in LFD format
e9451021ed7a drm/xe/guc: Add GuC log event buffer output in LFD format
6c5551e53e08 drm/xe/guc: Only add GuC crash dump if available
^ permalink raw reply [flat|nested] 30+ messages in thread
* ✓ CI.KUnit: success for drm/xe/guc: Add LFD format output for guc log (rev6)
2025-07-22 1:35 [PATCH v6 0/6] drm/xe/guc: Add LFD format output for guc log Zhanjun Dong
` (6 preceding siblings ...)
2025-07-22 2:47 ` ✗ CI.checkpatch: warning for drm/xe/guc: Add LFD format output for guc log (rev6) Patchwork
@ 2025-07-22 2:49 ` Patchwork
2025-07-22 3:54 ` ✓ Xe.CI.BAT: " Patchwork
2025-07-22 7:48 ` ✗ Xe.CI.Full: failure " Patchwork
9 siblings, 0 replies; 30+ messages in thread
From: Patchwork @ 2025-07-22 2:49 UTC (permalink / raw)
To: Zhanjun Dong; +Cc: intel-xe
== Series Details ==
Series: drm/xe/guc: Add LFD format output for guc log (rev6)
URL : https://patchwork.freedesktop.org/series/146541/
State : success
== Summary ==
+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[02:47:53] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[02:47:57] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[02:48:24] Starting KUnit Kernel (1/1)...
[02:48:24] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[02:48:24] ================== guc_buf (11 subtests) ===================
[02:48:24] [PASSED] test_smallest
[02:48:24] [PASSED] test_largest
[02:48:24] [PASSED] test_granular
[02:48:24] [PASSED] test_unique
[02:48:24] [PASSED] test_overlap
[02:48:24] [PASSED] test_reusable
[02:48:24] [PASSED] test_too_big
[02:48:24] [PASSED] test_flush
[02:48:24] [PASSED] test_lookup
[02:48:24] [PASSED] test_data
[02:48:24] [PASSED] test_class
[02:48:24] ===================== [PASSED] guc_buf =====================
[02:48:24] =================== guc_dbm (7 subtests) ===================
[02:48:24] [PASSED] test_empty
[02:48:24] [PASSED] test_default
[02:48:24] ======================== test_size ========================
[02:48:24] [PASSED] 4
[02:48:24] [PASSED] 8
[02:48:24] [PASSED] 32
[02:48:24] [PASSED] 256
[02:48:24] ==================== [PASSED] test_size ====================
[02:48:24] ======================= test_reuse ========================
[02:48:24] [PASSED] 4
[02:48:24] [PASSED] 8
[02:48:24] [PASSED] 32
[02:48:24] [PASSED] 256
[02:48:24] =================== [PASSED] test_reuse ====================
[02:48:24] =================== test_range_overlap ====================
[02:48:24] [PASSED] 4
[02:48:24] [PASSED] 8
[02:48:24] [PASSED] 32
[02:48:24] [PASSED] 256
[02:48:24] =============== [PASSED] test_range_overlap ================
[02:48:24] =================== test_range_compact ====================
[02:48:24] [PASSED] 4
[02:48:24] [PASSED] 8
[02:48:24] [PASSED] 32
[02:48:24] [PASSED] 256
[02:48:24] =============== [PASSED] test_range_compact ================
[02:48:24] ==================== test_range_spare =====================
[02:48:24] [PASSED] 4
[02:48:24] [PASSED] 8
[02:48:24] [PASSED] 32
[02:48:24] [PASSED] 256
[02:48:24] ================ [PASSED] test_range_spare =================
[02:48:24] ===================== [PASSED] guc_dbm =====================
[02:48:24] =================== guc_idm (6 subtests) ===================
[02:48:24] [PASSED] bad_init
[02:48:24] [PASSED] no_init
[02:48:24] [PASSED] init_fini
[02:48:24] [PASSED] check_used
[02:48:24] [PASSED] check_quota
[02:48:24] [PASSED] check_all
[02:48:24] ===================== [PASSED] guc_idm =====================
[02:48:24] ================== no_relay (3 subtests) ===================
[02:48:24] [PASSED] xe_drops_guc2pf_if_not_ready
[02:48:24] [PASSED] xe_drops_guc2vf_if_not_ready
[02:48:24] [PASSED] xe_rejects_send_if_not_ready
[02:48:24] ==================== [PASSED] no_relay =====================
[02:48:24] ================== pf_relay (14 subtests) ==================
[02:48:24] [PASSED] pf_rejects_guc2pf_too_short
[02:48:24] [PASSED] pf_rejects_guc2pf_too_long
[02:48:24] [PASSED] pf_rejects_guc2pf_no_payload
[02:48:24] [PASSED] pf_fails_no_payload
[02:48:24] [PASSED] pf_fails_bad_origin
[02:48:24] [PASSED] pf_fails_bad_type
[02:48:24] [PASSED] pf_txn_reports_error
[02:48:24] [PASSED] pf_txn_sends_pf2guc
[02:48:24] [PASSED] pf_sends_pf2guc
[02:48:24] [SKIPPED] pf_loopback_nop
[02:48:24] [SKIPPED] pf_loopback_echo
[02:48:24] [SKIPPED] pf_loopback_fail
[02:48:24] [SKIPPED] pf_loopback_busy
[02:48:24] [SKIPPED] pf_loopback_retry
[02:48:24] ==================== [PASSED] pf_relay =====================
[02:48:24] ================== vf_relay (3 subtests) ===================
[02:48:24] [PASSED] vf_rejects_guc2vf_too_short
[02:48:24] [PASSED] vf_rejects_guc2vf_too_long
[02:48:24] [PASSED] vf_rejects_guc2vf_no_payload
[02:48:24] ==================== [PASSED] vf_relay =====================
[02:48:24] ===================== lmtt (1 subtest) =====================
[02:48:24] ======================== test_ops =========================
[02:48:24] [PASSED] 2-level
[02:48:24] [PASSED] multi-level
[02:48:24] ==================== [PASSED] test_ops =====================
[02:48:24] ====================== [PASSED] lmtt =======================
[02:48:24] ================= pf_service (11 subtests) =================
[02:48:24] [PASSED] pf_negotiate_any
[02:48:24] [PASSED] pf_negotiate_base_match
[02:48:24] [PASSED] pf_negotiate_base_newer
[02:48:24] [PASSED] pf_negotiate_base_next
[02:48:24] [SKIPPED] pf_negotiate_base_older
[02:48:24] [PASSED] pf_negotiate_base_prev
[02:48:24] [PASSED] pf_negotiate_latest_match
[02:48:24] [PASSED] pf_negotiate_latest_newer
[02:48:24] [PASSED] pf_negotiate_latest_next
[02:48:24] [SKIPPED] pf_negotiate_latest_older
[02:48:24] [SKIPPED] pf_negotiate_latest_prev
[02:48:24] =================== [PASSED] pf_service ====================
[02:48:24] =================== xe_mocs (2 subtests) ===================
[02:48:24] ================ xe_live_mocs_kernel_kunit ================
[02:48:24] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[02:48:24] ================ xe_live_mocs_reset_kunit =================
[02:48:24] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[02:48:24] ==================== [SKIPPED] xe_mocs =====================
[02:48:24] ================= xe_migrate (2 subtests) ==================
[02:48:24] ================= xe_migrate_sanity_kunit =================
[02:48:24] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[02:48:24] ================== xe_validate_ccs_kunit ==================
[02:48:24] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[02:48:24] =================== [SKIPPED] xe_migrate ===================
[02:48:24] ================== xe_dma_buf (1 subtest) ==================
[02:48:24] ==================== xe_dma_buf_kunit =====================
[02:48:24] ================ [SKIPPED] xe_dma_buf_kunit ================
[02:48:24] =================== [SKIPPED] xe_dma_buf ===================
[02:48:24] ================= xe_bo_shrink (1 subtest) =================
[02:48:24] =================== xe_bo_shrink_kunit ====================
[02:48:24] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[02:48:24] ================== [SKIPPED] xe_bo_shrink ==================
[02:48:24] ==================== xe_bo (2 subtests) ====================
[02:48:24] ================== xe_ccs_migrate_kunit ===================
[02:48:24] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[02:48:24] ==================== xe_bo_evict_kunit ====================
[02:48:24] =============== [SKIPPED] xe_bo_evict_kunit ================
[02:48:24] ===================== [SKIPPED] xe_bo ======================
[02:48:24] ==================== args (11 subtests) ====================
[02:48:24] [PASSED] count_args_test
[02:48:24] [PASSED] call_args_example
[02:48:24] [PASSED] call_args_test
[02:48:24] [PASSED] drop_first_arg_example
[02:48:24] [PASSED] drop_first_arg_test
[02:48:24] [PASSED] first_arg_example
[02:48:24] [PASSED] first_arg_test
[02:48:24] [PASSED] last_arg_example
[02:48:24] [PASSED] last_arg_test
[02:48:24] [PASSED] pick_arg_example
[02:48:24] [PASSED] sep_comma_example
[02:48:24] ====================== [PASSED] args =======================
[02:48:24] =================== xe_pci (3 subtests) ====================
[02:48:24] ==================== check_graphics_ip ====================
[02:48:24] [PASSED] 12.70 Xe_LPG
[02:48:24] [PASSED] 12.71 Xe_LPG
[02:48:24] [PASSED] 12.74 Xe_LPG+
[02:48:24] [PASSED] 20.01 Xe2_HPG
[02:48:24] [PASSED] 20.02 Xe2_HPG
[02:48:24] [PASSED] 20.04 Xe2_LPG
[02:48:24] [PASSED] 30.00 Xe3_LPG
[02:48:24] [PASSED] 30.01 Xe3_LPG
[02:48:24] [PASSED] 30.03 Xe3_LPG
[02:48:24] ================ [PASSED] check_graphics_ip ================
[02:48:24] ===================== check_media_ip ======================
[02:48:24] [PASSED] 13.00 Xe_LPM+
[02:48:24] [PASSED] 13.01 Xe2_HPM
[02:48:24] [PASSED] 20.00 Xe2_LPM
[02:48:24] [PASSED] 30.00 Xe3_LPM
[02:48:24] [PASSED] 30.02 Xe3_LPM
[02:48:24] ================= [PASSED] check_media_ip ==================
[02:48:24] ================= check_platform_gt_count =================
[02:48:24] [PASSED] 0x9A60 (TIGERLAKE)
[02:48:24] [PASSED] 0x9A68 (TIGERLAKE)
[02:48:24] [PASSED] 0x9A70 (TIGERLAKE)
[02:48:24] [PASSED] 0x9A40 (TIGERLAKE)
[02:48:24] [PASSED] 0x9A49 (TIGERLAKE)
[02:48:24] [PASSED] 0x9A59 (TIGERLAKE)
[02:48:24] [PASSED] 0x9A78 (TIGERLAKE)
[02:48:24] [PASSED] 0x9AC0 (TIGERLAKE)
[02:48:24] [PASSED] 0x9AC9 (TIGERLAKE)
[02:48:24] [PASSED] 0x9AD9 (TIGERLAKE)
[02:48:24] [PASSED] 0x9AF8 (TIGERLAKE)
[02:48:24] [PASSED] 0x4C80 (ROCKETLAKE)
[02:48:24] [PASSED] 0x4C8A (ROCKETLAKE)
[02:48:24] [PASSED] 0x4C8B (ROCKETLAKE)
[02:48:24] [PASSED] 0x4C8C (ROCKETLAKE)
[02:48:24] [PASSED] 0x4C90 (ROCKETLAKE)
[02:48:24] [PASSED] 0x4C9A (ROCKETLAKE)
[02:48:24] [PASSED] 0x4680 (ALDERLAKE_S)
[02:48:24] [PASSED] 0x4682 (ALDERLAKE_S)
[02:48:24] [PASSED] 0x4688 (ALDERLAKE_S)
[02:48:24] [PASSED] 0x468A (ALDERLAKE_S)
[02:48:24] [PASSED] 0x468B (ALDERLAKE_S)
[02:48:24] [PASSED] 0x4690 (ALDERLAKE_S)
[02:48:24] [PASSED] 0x4692 (ALDERLAKE_S)
[02:48:24] [PASSED] 0x4693 (ALDERLAKE_S)
[02:48:24] [PASSED] 0x46A0 (ALDERLAKE_P)
[02:48:24] [PASSED] 0x46A1 (ALDERLAKE_P)
[02:48:24] [PASSED] 0x46A2 (ALDERLAKE_P)
[02:48:24] [PASSED] 0x46A3 (ALDERLAKE_P)
[02:48:24] [PASSED] 0x46A6 (ALDERLAKE_P)
[02:48:24] [PASSED] 0x46A8 (ALDERLAKE_P)
[02:48:24] [PASSED] 0x46AA (ALDERLAKE_P)
[02:48:24] [PASSED] 0x462A (ALDERLAKE_P)
[02:48:24] [PASSED] 0x4626 (ALDERLAKE_P)
[02:48:24] [PASSED] 0x4628 (ALDERLAKE_P)
[02:48:24] [PASSED] 0x46B0 (ALDERLAKE_P)
[02:48:24] [PASSED] 0x46B1 (ALDERLAKE_P)
[02:48:24] [PASSED] 0x46B2 (ALDERLAKE_P)
[02:48:24] [PASSED] 0x46B3 (ALDERLAKE_P)
[02:48:24] [PASSED] 0x46C0 (ALDERLAKE_P)
[02:48:24] [PASSED] 0x46C1 (ALDERLAKE_P)
[02:48:24] [PASSED] 0x46C2 (ALDERLAKE_P)
[02:48:24] [PASSED] 0x46C3 (ALDERLAKE_P)
[02:48:24] [PASSED] 0x46D0 (ALDERLAKE_N)
[02:48:24] [PASSED] 0x46D1 (ALDERLAKE_N)
[02:48:24] [PASSED] 0x46D2 (ALDERLAKE_N)
[02:48:24] [PASSED] 0x46D3 (ALDERLAKE_N)
[02:48:24] [PASSED] 0x46D4 (ALDERLAKE_N)
[02:48:24] [PASSED] 0xA721 (ALDERLAKE_P)
[02:48:24] [PASSED] 0xA7A1 (ALDERLAKE_P)
[02:48:24] [PASSED] 0xA7A9 (ALDERLAKE_P)
[02:48:24] [PASSED] 0xA7AC (ALDERLAKE_P)
[02:48:24] [PASSED] 0xA7AD (ALDERLAKE_P)
[02:48:24] [PASSED] 0xA720 (ALDERLAKE_P)
[02:48:24] [PASSED] 0xA7A0 (ALDERLAKE_P)
[02:48:24] [PASSED] 0xA7A8 (ALDERLAKE_P)
[02:48:24] [PASSED] 0xA7AA (ALDERLAKE_P)
[02:48:24] [PASSED] 0xA7AB (ALDERLAKE_P)
[02:48:24] [PASSED] 0xA780 (ALDERLAKE_S)
[02:48:24] [PASSED] 0xA781 (ALDERLAKE_S)
[02:48:24] [PASSED] 0xA782 (ALDERLAKE_S)
[02:48:24] [PASSED] 0xA783 (ALDERLAKE_S)
[02:48:24] [PASSED] 0xA788 (ALDERLAKE_S)
[02:48:24] [PASSED] 0xA789 (ALDERLAKE_S)
[02:48:24] [PASSED] 0xA78A (ALDERLAKE_S)
[02:48:24] [PASSED] 0xA78B (ALDERLAKE_S)
[02:48:24] [PASSED] 0x4905 (DG1)
[02:48:24] [PASSED] 0x4906 (DG1)
[02:48:24] [PASSED] 0x4907 (DG1)
[02:48:24] [PASSED] 0x4908 (DG1)
[02:48:24] [PASSED] 0x4909 (DG1)
[02:48:24] [PASSED] 0x56C0 (DG2)
[02:48:24] [PASSED] 0x56C2 (DG2)
[02:48:24] [PASSED] 0x56C1 (DG2)
[02:48:24] [PASSED] 0x7D51 (METEORLAKE)
[02:48:24] [PASSED] 0x7DD1 (METEORLAKE)
[02:48:24] [PASSED] 0x7D41 (METEORLAKE)
[02:48:24] [PASSED] 0x7D67 (METEORLAKE)
[02:48:24] [PASSED] 0xB640 (METEORLAKE)
[02:48:24] [PASSED] 0x56A0 (DG2)
[02:48:24] [PASSED] 0x56A1 (DG2)
[02:48:24] [PASSED] 0x56A2 (DG2)
[02:48:24] [PASSED] 0x56BE (DG2)
[02:48:24] [PASSED] 0x56BF (DG2)
[02:48:24] [PASSED] 0x5690 (DG2)
[02:48:24] [PASSED] 0x5691 (DG2)
[02:48:24] [PASSED] 0x5692 (DG2)
[02:48:24] [PASSED] 0x56A5 (DG2)
[02:48:24] [PASSED] 0x56A6 (DG2)
[02:48:24] [PASSED] 0x56B0 (DG2)
[02:48:24] [PASSED] 0x56B1 (DG2)
[02:48:24] [PASSED] 0x56BA (DG2)
[02:48:24] [PASSED] 0x56BB (DG2)
[02:48:24] [PASSED] 0x56BC (DG2)
[02:48:24] [PASSED] 0x56BD (DG2)
[02:48:24] [PASSED] 0x5693 (DG2)
[02:48:24] [PASSED] 0x5694 (DG2)
[02:48:24] [PASSED] 0x5695 (DG2)
[02:48:24] [PASSED] 0x56A3 (DG2)
[02:48:24] [PASSED] 0x56A4 (DG2)
[02:48:24] [PASSED] 0x56B2 (DG2)
[02:48:24] [PASSED] 0x56B3 (DG2)
[02:48:24] [PASSED] 0x5696 (DG2)
[02:48:24] [PASSED] 0x5697 (DG2)
[02:48:24] [PASSED] 0xB69 (PVC)
[02:48:24] [PASSED] 0xB6E (PVC)
[02:48:24] [PASSED] 0xBD4 (PVC)
[02:48:24] [PASSED] 0xBD5 (PVC)
[02:48:24] [PASSED] 0xBD6 (PVC)
[02:48:24] [PASSED] 0xBD7 (PVC)
[02:48:24] [PASSED] 0xBD8 (PVC)
[02:48:24] [PASSED] 0xBD9 (PVC)
[02:48:24] [PASSED] 0xBDA (PVC)
[02:48:24] [PASSED] 0xBDB (PVC)
[02:48:24] [PASSED] 0xBE0 (PVC)
[02:48:24] [PASSED] 0xBE1 (PVC)
[02:48:24] [PASSED] 0xBE5 (PVC)
[02:48:24] [PASSED] 0x7D40 (METEORLAKE)
[02:48:24] [PASSED] 0x7D45 (METEORLAKE)
[02:48:24] [PASSED] 0x7D55 (METEORLAKE)
[02:48:24] [PASSED] 0x7D60 (METEORLAKE)
[02:48:24] [PASSED] 0x7DD5 (METEORLAKE)
[02:48:24] [PASSED] 0x6420 (LUNARLAKE)
[02:48:24] [PASSED] 0x64A0 (LUNARLAKE)
[02:48:24] [PASSED] 0x64B0 (LUNARLAKE)
[02:48:24] [PASSED] 0xE202 (BATTLEMAGE)
[02:48:24] [PASSED] 0xE209 (BATTLEMAGE)
[02:48:24] [PASSED] 0xE20B (BATTLEMAGE)
[02:48:24] [PASSED] 0xE20C (BATTLEMAGE)
[02:48:24] [PASSED] 0xE20D (BATTLEMAGE)
[02:48:24] [PASSED] 0xE210 (BATTLEMAGE)
[02:48:24] [PASSED] 0xE211 (BATTLEMAGE)
[02:48:24] [PASSED] 0xE212 (BATTLEMAGE)
[02:48:24] [PASSED] 0xE216 (BATTLEMAGE)
[02:48:24] [PASSED] 0xE220 (BATTLEMAGE)
[02:48:24] [PASSED] 0xE221 (BATTLEMAGE)
[02:48:24] [PASSED] 0xE222 (BATTLEMAGE)
[02:48:24] [PASSED] 0xE223 (BATTLEMAGE)
[02:48:24] [PASSED] 0xB080 (PANTHERLAKE)
[02:48:24] [PASSED] 0xB081 (PANTHERLAKE)
[02:48:24] [PASSED] 0xB082 (PANTHERLAKE)
[02:48:24] [PASSED] 0xB083 (PANTHERLAKE)
[02:48:24] [PASSED] 0xB084 (PANTHERLAKE)
[02:48:24] [PASSED] 0xB085 (PANTHERLAKE)
[02:48:24] [PASSED] 0xB086 (PANTHERLAKE)
[02:48:24] [PASSED] 0xB087 (PANTHERLAKE)
[02:48:24] [PASSED] 0xB08F (PANTHERLAKE)
[02:48:24] [PASSED] 0xB090 (PANTHERLAKE)
[02:48:24] [PASSED] 0xB0A0 (PANTHERLAKE)
[02:48:24] [PASSED] 0xB0B0 (PANTHERLAKE)
[02:48:24] [PASSED] 0xFD80 (PANTHERLAKE)
[02:48:24] [PASSED] 0xFD81 (PANTHERLAKE)
[02:48:24] ============= [PASSED] check_platform_gt_count =============
[02:48:24] ===================== [PASSED] xe_pci ======================
[02:48:24] =================== xe_rtp (2 subtests) ====================
[02:48:24] =============== xe_rtp_process_to_sr_tests ================
[02:48:24] [PASSED] coalesce-same-reg
[02:48:24] [PASSED] no-match-no-add
[02:48:24] [PASSED] match-or
[02:48:24] [PASSED] match-or-xfail
[02:48:24] [PASSED] no-match-no-add-multiple-rules
[02:48:24] [PASSED] two-regs-two-entries
[02:48:24] [PASSED] clr-one-set-other
[02:48:24] [PASSED] set-field
[02:48:24] [PASSED] conflict-duplicate
[02:48:24] [PASSED] conflict-not-disjoint
[02:48:24] [PASSED] conflict-reg-type
[02:48:24] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[02:48:24] ================== xe_rtp_process_tests ===================
[02:48:24] [PASSED] active1
[02:48:24] [PASSED] active2
[02:48:24] [PASSED] active-inactive
[02:48:24] [PASSED] inactive-active
[02:48:24] [PASSED] inactive-1st_or_active-inactive
[02:48:24] [PASSED] inactive-2nd_or_active-inactive
[02:48:24] [PASSED] inactive-last_or_active-inactive
[02:48:24] [PASSED] inactive-no_or_active-inactive
[02:48:24] ============== [PASSED] xe_rtp_process_tests ===============
[02:48:24] ===================== [PASSED] xe_rtp ======================
[02:48:24] ==================== xe_wa (1 subtest) =====================
[02:48:24] ======================== xe_wa_gt =========================
[02:48:24] [PASSED] TIGERLAKE (B0)
[02:48:24] [PASSED] DG1 (A0)
[02:48:24] [PASSED] DG1 (B0)
[02:48:24] [PASSED] ALDERLAKE_S (A0)
[02:48:24] [PASSED] ALDERLAKE_S (B0)
[02:48:24] [PASSED] ALDERLAKE_S (C0)
[02:48:24] [PASSED] ALDERLAKE_S (D0)
[02:48:24] [PASSED] ALDERLAKE_P (A0)
[02:48:24] [PASSED] ALDERLAKE_P (B0)
[02:48:24] [PASSED] ALDERLAKE_P (C0)
[02:48:24] [PASSED] ALDERLAKE_S_RPLS (D0)
[02:48:24] [PASSED] ALDERLAKE_P_RPLU (E0)
[02:48:24] [PASSED] DG2_G10 (C0)
[02:48:24] [PASSED] DG2_G11 (B1)
[02:48:24] [PASSED] DG2_G12 (A1)
[02:48:24] [PASSED] METEORLAKE (g:A0, m:A0)
[02:48:24] [PASSED] METEORLAKE (g:A0, m:A0)
[02:48:24] [PASSED] METEORLAKE (g:A0, m:A0)
[02:48:24] [PASSED] LUNARLAKE (g:A0, m:A0)
[02:48:24] [PASSED] LUNARLAKE (g:B0, m:A0)
stty: 'standard input': Inappropriate ioctl for device
[02:48:24] [PASSED] BATTLEMAGE (g:A0, m:A1)
[02:48:24] ==================== [PASSED] xe_wa_gt =====================
[02:48:24] ====================== [PASSED] xe_wa ======================
[02:48:24] ============================================================
[02:48:24] Testing complete. Ran 297 tests: passed: 281, skipped: 16
[02:48:24] Elapsed time: 31.679s total, 4.150s configuring, 27.212s building, 0.308s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[02:48:24] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[02:48:26] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[02:48:48] Starting KUnit Kernel (1/1)...
[02:48:48] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[02:48:48] == drm_test_atomic_get_connector_for_encoder (1 subtest) ===
[02:48:48] [PASSED] drm_test_drm_atomic_get_connector_for_encoder
[02:48:48] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ====
[02:48:48] =========== drm_validate_clone_mode (2 subtests) ===========
[02:48:48] ============== drm_test_check_in_clone_mode ===============
[02:48:48] [PASSED] in_clone_mode
[02:48:48] [PASSED] not_in_clone_mode
[02:48:48] ========== [PASSED] drm_test_check_in_clone_mode ===========
[02:48:48] =============== drm_test_check_valid_clones ===============
[02:48:48] [PASSED] not_in_clone_mode
[02:48:48] [PASSED] valid_clone
[02:48:48] [PASSED] invalid_clone
[02:48:48] =========== [PASSED] drm_test_check_valid_clones ===========
[02:48:48] ============= [PASSED] drm_validate_clone_mode =============
[02:48:48] ============= drm_validate_modeset (1 subtest) =============
[02:48:48] [PASSED] drm_test_check_connector_changed_modeset
[02:48:48] ============== [PASSED] drm_validate_modeset ===============
[02:48:48] ====== drm_test_bridge_get_current_state (2 subtests) ======
[02:48:48] [PASSED] drm_test_drm_bridge_get_current_state_atomic
[02:48:48] [PASSED] drm_test_drm_bridge_get_current_state_legacy
[02:48:48] ======== [PASSED] drm_test_bridge_get_current_state ========
[02:48:48] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ======
[02:48:48] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic
[02:48:48] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled
[02:48:48] [PASSED] drm_test_drm_bridge_helper_reset_crtc_legacy
[02:48:48] ======== [PASSED] drm_test_bridge_helper_reset_crtc ========
[02:48:48] ============== drm_bridge_alloc (2 subtests) ===============
[02:48:48] [PASSED] drm_test_drm_bridge_alloc_basic
[02:48:48] [PASSED] drm_test_drm_bridge_alloc_get_put
[02:48:48] ================ [PASSED] drm_bridge_alloc =================
[02:48:48] ================== drm_buddy (7 subtests) ==================
[02:48:48] [PASSED] drm_test_buddy_alloc_limit
[02:48:48] [PASSED] drm_test_buddy_alloc_optimistic
[02:48:48] [PASSED] drm_test_buddy_alloc_pessimistic
[02:48:48] [PASSED] drm_test_buddy_alloc_pathological
[02:48:48] [PASSED] drm_test_buddy_alloc_contiguous
[02:48:48] [PASSED] drm_test_buddy_alloc_clear
[02:48:48] [PASSED] drm_test_buddy_alloc_range_bias
[02:48:48] ==================== [PASSED] drm_buddy ====================
[02:48:48] ============= drm_cmdline_parser (40 subtests) =============
[02:48:48] [PASSED] drm_test_cmdline_force_d_only
[02:48:48] [PASSED] drm_test_cmdline_force_D_only_dvi
[02:48:48] [PASSED] drm_test_cmdline_force_D_only_hdmi
[02:48:48] [PASSED] drm_test_cmdline_force_D_only_not_digital
[02:48:48] [PASSED] drm_test_cmdline_force_e_only
[02:48:48] [PASSED] drm_test_cmdline_res
[02:48:48] [PASSED] drm_test_cmdline_res_vesa
[02:48:48] [PASSED] drm_test_cmdline_res_vesa_rblank
[02:48:48] [PASSED] drm_test_cmdline_res_rblank
[02:48:48] [PASSED] drm_test_cmdline_res_bpp
[02:48:48] [PASSED] drm_test_cmdline_res_refresh
[02:48:48] [PASSED] drm_test_cmdline_res_bpp_refresh
[02:48:48] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[02:48:48] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[02:48:48] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[02:48:48] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[02:48:48] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[02:48:48] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[02:48:48] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[02:48:48] [PASSED] drm_test_cmdline_res_margins_force_on
[02:48:48] [PASSED] drm_test_cmdline_res_vesa_margins
[02:48:48] [PASSED] drm_test_cmdline_name
[02:48:48] [PASSED] drm_test_cmdline_name_bpp
[02:48:48] [PASSED] drm_test_cmdline_name_option
[02:48:48] [PASSED] drm_test_cmdline_name_bpp_option
[02:48:48] [PASSED] drm_test_cmdline_rotate_0
[02:48:48] [PASSED] drm_test_cmdline_rotate_90
[02:48:48] [PASSED] drm_test_cmdline_rotate_180
[02:48:48] [PASSED] drm_test_cmdline_rotate_270
[02:48:48] [PASSED] drm_test_cmdline_hmirror
[02:48:48] [PASSED] drm_test_cmdline_vmirror
[02:48:48] [PASSED] drm_test_cmdline_margin_options
[02:48:48] [PASSED] drm_test_cmdline_multiple_options
[02:48:48] [PASSED] drm_test_cmdline_bpp_extra_and_option
[02:48:48] [PASSED] drm_test_cmdline_extra_and_option
[02:48:48] [PASSED] drm_test_cmdline_freestanding_options
[02:48:48] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[02:48:48] [PASSED] drm_test_cmdline_panel_orientation
[02:48:48] ================ drm_test_cmdline_invalid =================
[02:48:48] [PASSED] margin_only
[02:48:48] [PASSED] interlace_only
[02:48:48] [PASSED] res_missing_x
[02:48:48] [PASSED] res_missing_y
[02:48:48] [PASSED] res_bad_y
[02:48:48] [PASSED] res_missing_y_bpp
[02:48:48] [PASSED] res_bad_bpp
[02:48:48] [PASSED] res_bad_refresh
[02:48:48] [PASSED] res_bpp_refresh_force_on_off
[02:48:48] [PASSED] res_invalid_mode
[02:48:48] [PASSED] res_bpp_wrong_place_mode
[02:48:48] [PASSED] name_bpp_refresh
[02:48:48] [PASSED] name_refresh
[02:48:48] [PASSED] name_refresh_wrong_mode
[02:48:48] [PASSED] name_refresh_invalid_mode
[02:48:48] [PASSED] rotate_multiple
[02:48:48] [PASSED] rotate_invalid_val
[02:48:48] [PASSED] rotate_truncated
[02:48:48] [PASSED] invalid_option
[02:48:48] [PASSED] invalid_tv_option
[02:48:48] [PASSED] truncated_tv_option
[02:48:48] ============ [PASSED] drm_test_cmdline_invalid =============
[02:48:48] =============== drm_test_cmdline_tv_options ===============
[02:48:48] [PASSED] NTSC
[02:48:48] [PASSED] NTSC_443
[02:48:48] [PASSED] NTSC_J
[02:48:48] [PASSED] PAL
[02:48:48] [PASSED] PAL_M
[02:48:48] [PASSED] PAL_N
[02:48:48] [PASSED] SECAM
[02:48:48] [PASSED] MONO_525
[02:48:48] [PASSED] MONO_625
[02:48:48] =========== [PASSED] drm_test_cmdline_tv_options ===========
[02:48:48] =============== [PASSED] drm_cmdline_parser ================
[02:48:48] ========== drmm_connector_hdmi_init (20 subtests) ==========
[02:48:48] [PASSED] drm_test_connector_hdmi_init_valid
[02:48:48] [PASSED] drm_test_connector_hdmi_init_bpc_8
[02:48:48] [PASSED] drm_test_connector_hdmi_init_bpc_10
[02:48:48] [PASSED] drm_test_connector_hdmi_init_bpc_12
[02:48:48] [PASSED] drm_test_connector_hdmi_init_bpc_invalid
[02:48:48] [PASSED] drm_test_connector_hdmi_init_bpc_null
[02:48:48] [PASSED] drm_test_connector_hdmi_init_formats_empty
[02:48:48] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb
[02:48:48] === drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[02:48:48] [PASSED] supported_formats=0x9 yuv420_allowed=1
[02:48:48] [PASSED] supported_formats=0x9 yuv420_allowed=0
[02:48:48] [PASSED] supported_formats=0x3 yuv420_allowed=1
[02:48:48] [PASSED] supported_formats=0x3 yuv420_allowed=0
[02:48:48] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[02:48:48] [PASSED] drm_test_connector_hdmi_init_null_ddc
[02:48:48] [PASSED] drm_test_connector_hdmi_init_null_product
[02:48:48] [PASSED] drm_test_connector_hdmi_init_null_vendor
[02:48:48] [PASSED] drm_test_connector_hdmi_init_product_length_exact
[02:48:48] [PASSED] drm_test_connector_hdmi_init_product_length_too_long
[02:48:48] [PASSED] drm_test_connector_hdmi_init_product_valid
[02:48:48] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact
[02:48:48] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long
[02:48:48] [PASSED] drm_test_connector_hdmi_init_vendor_valid
[02:48:48] ========= drm_test_connector_hdmi_init_type_valid =========
[02:48:48] [PASSED] HDMI-A
[02:48:48] [PASSED] HDMI-B
[02:48:48] ===== [PASSED] drm_test_connector_hdmi_init_type_valid =====
[02:48:48] ======== drm_test_connector_hdmi_init_type_invalid ========
[02:48:48] [PASSED] Unknown
[02:48:48] [PASSED] VGA
[02:48:48] [PASSED] DVI-I
[02:48:48] [PASSED] DVI-D
[02:48:48] [PASSED] DVI-A
[02:48:48] [PASSED] Composite
[02:48:48] [PASSED] SVIDEO
[02:48:48] [PASSED] LVDS
[02:48:48] [PASSED] Component
[02:48:48] [PASSED] DIN
[02:48:48] [PASSED] DP
[02:48:48] [PASSED] TV
[02:48:48] [PASSED] eDP
[02:48:48] [PASSED] Virtual
[02:48:48] [PASSED] DSI
[02:48:48] [PASSED] DPI
[02:48:48] [PASSED] Writeback
[02:48:48] [PASSED] SPI
[02:48:48] [PASSED] USB
[02:48:48] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ====
[02:48:48] ============ [PASSED] drmm_connector_hdmi_init =============
[02:48:48] ============= drmm_connector_init (3 subtests) =============
[02:48:48] [PASSED] drm_test_drmm_connector_init
[02:48:48] [PASSED] drm_test_drmm_connector_init_null_ddc
[02:48:48] ========= drm_test_drmm_connector_init_type_valid =========
[02:48:48] [PASSED] Unknown
[02:48:48] [PASSED] VGA
[02:48:48] [PASSED] DVI-I
[02:48:48] [PASSED] DVI-D
[02:48:48] [PASSED] DVI-A
[02:48:48] [PASSED] Composite
[02:48:48] [PASSED] SVIDEO
[02:48:48] [PASSED] LVDS
[02:48:48] [PASSED] Component
[02:48:48] [PASSED] DIN
[02:48:48] [PASSED] DP
[02:48:48] [PASSED] HDMI-A
[02:48:48] [PASSED] HDMI-B
[02:48:48] [PASSED] TV
[02:48:48] [PASSED] eDP
[02:48:48] [PASSED] Virtual
[02:48:48] [PASSED] DSI
[02:48:48] [PASSED] DPI
[02:48:48] [PASSED] Writeback
[02:48:48] [PASSED] SPI
[02:48:48] [PASSED] USB
[02:48:48] ===== [PASSED] drm_test_drmm_connector_init_type_valid =====
[02:48:48] =============== [PASSED] drmm_connector_init ===============
[02:48:48] ========= drm_connector_dynamic_init (6 subtests) ==========
[02:48:48] [PASSED] drm_test_drm_connector_dynamic_init
[02:48:48] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc
[02:48:48] [PASSED] drm_test_drm_connector_dynamic_init_not_added
[02:48:48] [PASSED] drm_test_drm_connector_dynamic_init_properties
[02:48:48] ===== drm_test_drm_connector_dynamic_init_type_valid ======
[02:48:48] [PASSED] Unknown
[02:48:48] [PASSED] VGA
[02:48:48] [PASSED] DVI-I
[02:48:48] [PASSED] DVI-D
[02:48:48] [PASSED] DVI-A
[02:48:48] [PASSED] Composite
[02:48:48] [PASSED] SVIDEO
[02:48:48] [PASSED] LVDS
[02:48:48] [PASSED] Component
[02:48:48] [PASSED] DIN
[02:48:48] [PASSED] DP
[02:48:48] [PASSED] HDMI-A
[02:48:48] [PASSED] HDMI-B
[02:48:48] [PASSED] TV
[02:48:48] [PASSED] eDP
[02:48:48] [PASSED] Virtual
[02:48:48] [PASSED] DSI
[02:48:48] [PASSED] DPI
[02:48:48] [PASSED] Writeback
[02:48:48] [PASSED] SPI
[02:48:48] [PASSED] USB
[02:48:48] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid ==
[02:48:48] ======== drm_test_drm_connector_dynamic_init_name =========
[02:48:48] [PASSED] Unknown
[02:48:48] [PASSED] VGA
[02:48:48] [PASSED] DVI-I
[02:48:48] [PASSED] DVI-D
[02:48:48] [PASSED] DVI-A
[02:48:48] [PASSED] Composite
[02:48:48] [PASSED] SVIDEO
[02:48:48] [PASSED] LVDS
[02:48:48] [PASSED] Component
[02:48:48] [PASSED] DIN
[02:48:48] [PASSED] DP
[02:48:48] [PASSED] HDMI-A
[02:48:48] [PASSED] HDMI-B
[02:48:48] [PASSED] TV
[02:48:48] [PASSED] eDP
[02:48:48] [PASSED] Virtual
[02:48:48] [PASSED] DSI
[02:48:48] [PASSED] DPI
[02:48:48] [PASSED] Writeback
[02:48:48] [PASSED] SPI
[02:48:48] [PASSED] USB
[02:48:48] ==== [PASSED] drm_test_drm_connector_dynamic_init_name =====
[02:48:48] =========== [PASSED] drm_connector_dynamic_init ============
[02:48:48] ==== drm_connector_dynamic_register_early (4 subtests) =====
[02:48:48] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list
[02:48:48] [PASSED] drm_test_drm_connector_dynamic_register_early_defer
[02:48:48] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init
[02:48:48] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object
[02:48:48] ====== [PASSED] drm_connector_dynamic_register_early =======
[02:48:48] ======= drm_connector_dynamic_register (7 subtests) ========
[02:48:48] [PASSED] drm_test_drm_connector_dynamic_register_on_list
[02:48:48] [PASSED] drm_test_drm_connector_dynamic_register_no_defer
[02:48:48] [PASSED] drm_test_drm_connector_dynamic_register_no_init
[02:48:48] [PASSED] drm_test_drm_connector_dynamic_register_mode_object
[02:48:48] [PASSED] drm_test_drm_connector_dynamic_register_sysfs
[02:48:48] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name
[02:48:48] [PASSED] drm_test_drm_connector_dynamic_register_debugfs
[02:48:48] ========= [PASSED] drm_connector_dynamic_register ==========
[02:48:48] = drm_connector_attach_broadcast_rgb_property (2 subtests) =
[02:48:48] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property
[02:48:48] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector
[02:48:48] === [PASSED] drm_connector_attach_broadcast_rgb_property ===
[02:48:48] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[02:48:48] ========== drm_test_get_tv_mode_from_name_valid ===========
[02:48:48] [PASSED] NTSC
[02:48:48] [PASSED] NTSC-443
[02:48:48] [PASSED] NTSC-J
[02:48:48] [PASSED] PAL
[02:48:48] [PASSED] PAL-M
[02:48:48] [PASSED] PAL-N
[02:48:48] [PASSED] SECAM
[02:48:48] [PASSED] Mono
[02:48:48] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[02:48:48] [PASSED] drm_test_get_tv_mode_from_name_truncated
[02:48:48] ============ [PASSED] drm_get_tv_mode_from_name ============
[02:48:48] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) =
[02:48:48] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb
[02:48:48] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc
[02:48:48] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1
[02:48:48] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc
[02:48:48] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1
[02:48:48] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double
[02:48:48] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid =
[02:48:48] [PASSED] VIC 96
[02:48:48] [PASSED] VIC 97
[02:48:48] [PASSED] VIC 101
[02:48:48] [PASSED] VIC 102
[02:48:48] [PASSED] VIC 106
[02:48:48] [PASSED] VIC 107
[02:48:48] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid ===
[02:48:48] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc
[02:48:48] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc
[02:48:48] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc
[02:48:48] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc
[02:48:48] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc
[02:48:48] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ====
[02:48:48] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) ==
[02:48:48] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name ====
[02:48:48] [PASSED] Automatic
[02:48:48] [PASSED] Full
[02:48:48] [PASSED] Limited 16:235
[02:48:48] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name ===
[02:48:48] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid
[02:48:48] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ====
[02:48:48] == drm_hdmi_connector_get_output_format_name (2 subtests) ==
[02:48:48] === drm_test_drm_hdmi_connector_get_output_format_name ====
[02:48:48] [PASSED] RGB
[02:48:48] [PASSED] YUV 4:2:0
[02:48:48] [PASSED] YUV 4:2:2
[02:48:48] [PASSED] YUV 4:4:4
[02:48:48] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name ===
[02:48:48] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid
[02:48:48] ==== [PASSED] drm_hdmi_connector_get_output_format_name ====
[02:48:48] ============= drm_damage_helper (21 subtests) ==============
[02:48:48] [PASSED] drm_test_damage_iter_no_damage
[02:48:48] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[02:48:48] [PASSED] drm_test_damage_iter_no_damage_src_moved
[02:48:48] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[02:48:48] [PASSED] drm_test_damage_iter_no_damage_not_visible
[02:48:48] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[02:48:48] [PASSED] drm_test_damage_iter_no_damage_no_fb
[02:48:48] [PASSED] drm_test_damage_iter_simple_damage
[02:48:48] [PASSED] drm_test_damage_iter_single_damage
[02:48:48] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[02:48:48] [PASSED] drm_test_damage_iter_single_damage_outside_src
[02:48:48] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[02:48:48] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[02:48:48] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[02:48:48] [PASSED] drm_test_damage_iter_single_damage_src_moved
[02:48:48] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[02:48:48] [PASSED] drm_test_damage_iter_damage
[02:48:48] [PASSED] drm_test_damage_iter_damage_one_intersect
[02:48:48] [PASSED] drm_test_damage_iter_damage_one_outside
[02:48:48] [PASSED] drm_test_damage_iter_damage_src_moved
[02:48:48] [PASSED] drm_test_damage_iter_damage_not_visible
[02:48:48] ================ [PASSED] drm_damage_helper ================
[02:48:48] ============== drm_dp_mst_helper (3 subtests) ==============
[02:48:48] ============== drm_test_dp_mst_calc_pbn_mode ==============
[02:48:48] [PASSED] Clock 154000 BPP 30 DSC disabled
[02:48:48] [PASSED] Clock 234000 BPP 30 DSC disabled
[02:48:48] [PASSED] Clock 297000 BPP 24 DSC disabled
[02:48:48] [PASSED] Clock 332880 BPP 24 DSC enabled
[02:48:48] [PASSED] Clock 324540 BPP 24 DSC enabled
[02:48:48] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[02:48:48] ============== drm_test_dp_mst_calc_pbn_div ===============
[02:48:48] [PASSED] Link rate 2000000 lane count 4
[02:48:48] [PASSED] Link rate 2000000 lane count 2
[02:48:48] [PASSED] Link rate 2000000 lane count 1
[02:48:48] [PASSED] Link rate 1350000 lane count 4
[02:48:48] [PASSED] Link rate 1350000 lane count 2
[02:48:48] [PASSED] Link rate 1350000 lane count 1
[02:48:48] [PASSED] Link rate 1000000 lane count 4
[02:48:48] [PASSED] Link rate 1000000 lane count 2
[02:48:48] [PASSED] Link rate 1000000 lane count 1
[02:48:48] [PASSED] Link rate 810000 lane count 4
[02:48:48] [PASSED] Link rate 810000 lane count 2
[02:48:48] [PASSED] Link rate 810000 lane count 1
[02:48:48] [PASSED] Link rate 540000 lane count 4
[02:48:48] [PASSED] Link rate 540000 lane count 2
[02:48:48] [PASSED] Link rate 540000 lane count 1
[02:48:48] [PASSED] Link rate 270000 lane count 4
[02:48:48] [PASSED] Link rate 270000 lane count 2
[02:48:48] [PASSED] Link rate 270000 lane count 1
[02:48:48] [PASSED] Link rate 162000 lane count 4
[02:48:48] [PASSED] Link rate 162000 lane count 2
[02:48:48] [PASSED] Link rate 162000 lane count 1
[02:48:48] ========== [PASSED] drm_test_dp_mst_calc_pbn_div ===========
[02:48:48] ========= drm_test_dp_mst_sideband_msg_req_decode =========
[02:48:48] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[02:48:48] [PASSED] DP_POWER_UP_PHY with port number
[02:48:48] [PASSED] DP_POWER_DOWN_PHY with port number
[02:48:48] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[02:48:48] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[02:48:48] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[02:48:48] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[02:48:48] [PASSED] DP_QUERY_PAYLOAD with port number
[02:48:48] [PASSED] DP_QUERY_PAYLOAD with VCPI
[02:48:48] [PASSED] DP_REMOTE_DPCD_READ with port number
[02:48:48] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[02:48:48] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[02:48:48] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[02:48:48] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[02:48:48] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[02:48:48] [PASSED] DP_REMOTE_I2C_READ with port number
[02:48:48] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[02:48:48] [PASSED] DP_REMOTE_I2C_READ with transactions array
[02:48:48] [PASSED] DP_REMOTE_I2C_WRITE with port number
[02:48:48] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[02:48:48] [PASSED] DP_REMOTE_I2C_WRITE with data array
[02:48:48] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[02:48:48] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[02:48:48] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[02:48:48] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[02:48:48] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[02:48:48] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[02:48:48] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[02:48:48] ================ [PASSED] drm_dp_mst_helper ================
[02:48:48] ================== drm_exec (7 subtests) ===================
[02:48:48] [PASSED] sanitycheck
[02:48:48] [PASSED] test_lock
[02:48:48] [PASSED] test_lock_unlock
[02:48:48] [PASSED] test_duplicates
[02:48:48] [PASSED] test_prepare
[02:48:48] [PASSED] test_prepare_array
[02:48:48] [PASSED] test_multiple_loops
[02:48:48] ==================== [PASSED] drm_exec =====================
[02:48:48] =========== drm_format_helper_test (17 subtests) ===========
[02:48:48] ============== drm_test_fb_xrgb8888_to_gray8 ==============
[02:48:48] [PASSED] single_pixel_source_buffer
[02:48:48] [PASSED] single_pixel_clip_rectangle
[02:48:48] [PASSED] well_known_colors
[02:48:48] [PASSED] destination_pitch
[02:48:48] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[02:48:48] ============= drm_test_fb_xrgb8888_to_rgb332 ==============
[02:48:48] [PASSED] single_pixel_source_buffer
[02:48:48] [PASSED] single_pixel_clip_rectangle
[02:48:48] [PASSED] well_known_colors
[02:48:48] [PASSED] destination_pitch
[02:48:48] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[02:48:48] ============= drm_test_fb_xrgb8888_to_rgb565 ==============
[02:48:48] [PASSED] single_pixel_source_buffer
[02:48:48] [PASSED] single_pixel_clip_rectangle
[02:48:48] [PASSED] well_known_colors
[02:48:48] [PASSED] destination_pitch
[02:48:48] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[02:48:48] ============ drm_test_fb_xrgb8888_to_xrgb1555 =============
[02:48:48] [PASSED] single_pixel_source_buffer
[02:48:48] [PASSED] single_pixel_clip_rectangle
[02:48:48] [PASSED] well_known_colors
[02:48:48] [PASSED] destination_pitch
[02:48:48] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[02:48:48] ============ drm_test_fb_xrgb8888_to_argb1555 =============
[02:48:48] [PASSED] single_pixel_source_buffer
[02:48:48] [PASSED] single_pixel_clip_rectangle
[02:48:48] [PASSED] well_known_colors
[02:48:48] [PASSED] destination_pitch
[02:48:48] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[02:48:48] ============ drm_test_fb_xrgb8888_to_rgba5551 =============
[02:48:48] [PASSED] single_pixel_source_buffer
[02:48:48] [PASSED] single_pixel_clip_rectangle
[02:48:48] [PASSED] well_known_colors
[02:48:48] [PASSED] destination_pitch
[02:48:48] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[02:48:48] ============= drm_test_fb_xrgb8888_to_rgb888 ==============
[02:48:48] [PASSED] single_pixel_source_buffer
[02:48:48] [PASSED] single_pixel_clip_rectangle
[02:48:48] [PASSED] well_known_colors
[02:48:48] [PASSED] destination_pitch
[02:48:48] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[02:48:48] ============= drm_test_fb_xrgb8888_to_bgr888 ==============
[02:48:48] [PASSED] single_pixel_source_buffer
[02:48:48] [PASSED] single_pixel_clip_rectangle
[02:48:48] [PASSED] well_known_colors
[02:48:48] [PASSED] destination_pitch
[02:48:48] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ==========
[02:48:48] ============ drm_test_fb_xrgb8888_to_argb8888 =============
[02:48:48] [PASSED] single_pixel_source_buffer
[02:48:48] [PASSED] single_pixel_clip_rectangle
[02:48:48] [PASSED] well_known_colors
[02:48:48] [PASSED] destination_pitch
[02:48:48] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[02:48:48] =========== drm_test_fb_xrgb8888_to_xrgb2101010 ===========
[02:48:48] [PASSED] single_pixel_source_buffer
[02:48:48] [PASSED] single_pixel_clip_rectangle
[02:48:48] [PASSED] well_known_colors
[02:48:48] [PASSED] destination_pitch
[02:48:48] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[02:48:48] =========== drm_test_fb_xrgb8888_to_argb2101010 ===========
[02:48:48] [PASSED] single_pixel_source_buffer
[02:48:48] [PASSED] single_pixel_clip_rectangle
[02:48:48] [PASSED] well_known_colors
[02:48:48] [PASSED] destination_pitch
[02:48:48] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[02:48:48] ============== drm_test_fb_xrgb8888_to_mono ===============
[02:48:48] [PASSED] single_pixel_source_buffer
[02:48:48] [PASSED] single_pixel_clip_rectangle
[02:48:48] [PASSED] well_known_colors
[02:48:48] [PASSED] destination_pitch
[02:48:48] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[02:48:48] ==================== drm_test_fb_swab =====================
[02:48:48] [PASSED] single_pixel_source_buffer
[02:48:48] [PASSED] single_pixel_clip_rectangle
[02:48:48] [PASSED] well_known_colors
[02:48:48] [PASSED] destination_pitch
[02:48:48] ================ [PASSED] drm_test_fb_swab =================
[02:48:48] ============ drm_test_fb_xrgb8888_to_xbgr8888 =============
[02:48:48] [PASSED] single_pixel_source_buffer
[02:48:48] [PASSED] single_pixel_clip_rectangle
[02:48:48] [PASSED] well_known_colors
[02:48:48] [PASSED] destination_pitch
[02:48:48] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 =========
[02:48:48] ============ drm_test_fb_xrgb8888_to_abgr8888 =============
[02:48:48] [PASSED] single_pixel_source_buffer
[02:48:48] [PASSED] single_pixel_clip_rectangle
[02:48:48] [PASSED] well_known_colors
[02:48:48] [PASSED] destination_pitch
[02:48:48] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 =========
[02:48:48] ================= drm_test_fb_clip_offset =================
[02:48:48] [PASSED] pass through
[02:48:48] [PASSED] horizontal offset
[02:48:48] [PASSED] vertical offset
[02:48:48] [PASSED] horizontal and vertical offset
[02:48:48] [PASSED] horizontal offset (custom pitch)
[02:48:48] [PASSED] vertical offset (custom pitch)
[02:48:48] [PASSED] horizontal and vertical offset (custom pitch)
[02:48:48] ============= [PASSED] drm_test_fb_clip_offset =============
[02:48:48] =================== drm_test_fb_memcpy ====================
[02:48:48] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258)
[02:48:48] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258)
[02:48:48] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559)
[02:48:48] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258)
[02:48:48] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258)
[02:48:48] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559)
[02:48:48] [PASSED] well_known_colors: XB24 little-endian (0x34324258)
[02:48:48] [PASSED] well_known_colors: XRA8 little-endian (0x38415258)
[02:48:48] [PASSED] well_known_colors: YU24 little-endian (0x34325559)
[02:48:48] [PASSED] destination_pitch: XB24 little-endian (0x34324258)
[02:48:48] [PASSED] destination_pitch: XRA8 little-endian (0x38415258)
[02:48:48] [PASSED] destination_pitch: YU24 little-endian (0x34325559)
[02:48:48] =============== [PASSED] drm_test_fb_memcpy ================
[02:48:48] ============= [PASSED] drm_format_helper_test ==============
[02:48:48] ================= drm_format (18 subtests) =================
[02:48:48] [PASSED] drm_test_format_block_width_invalid
[02:48:48] [PASSED] drm_test_format_block_width_one_plane
[02:48:48] [PASSED] drm_test_format_block_width_two_plane
[02:48:48] [PASSED] drm_test_format_block_width_three_plane
[02:48:48] [PASSED] drm_test_format_block_width_tiled
[02:48:48] [PASSED] drm_test_format_block_height_invalid
[02:48:48] [PASSED] drm_test_format_block_height_one_plane
[02:48:48] [PASSED] drm_test_format_block_height_two_plane
[02:48:48] [PASSED] drm_test_format_block_height_three_plane
[02:48:48] [PASSED] drm_test_format_block_height_tiled
[02:48:48] [PASSED] drm_test_format_min_pitch_invalid
[02:48:48] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[02:48:48] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[02:48:48] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[02:48:48] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[02:48:48] [PASSED] drm_test_format_min_pitch_two_plane
[02:48:48] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[02:48:48] [PASSED] drm_test_format_min_pitch_tiled
[02:48:48] =================== [PASSED] drm_format ====================
[02:48:48] ============== drm_framebuffer (10 subtests) ===============
[02:48:48] ========== drm_test_framebuffer_check_src_coords ==========
[02:48:48] [PASSED] Success: source fits into fb
[02:48:48] [PASSED] Fail: overflowing fb with x-axis coordinate
[02:48:48] [PASSED] Fail: overflowing fb with y-axis coordinate
[02:48:48] [PASSED] Fail: overflowing fb with source width
[02:48:48] [PASSED] Fail: overflowing fb with source height
[02:48:48] ====== [PASSED] drm_test_framebuffer_check_src_coords ======
[02:48:48] [PASSED] drm_test_framebuffer_cleanup
[02:48:48] =============== drm_test_framebuffer_create ===============
[02:48:48] [PASSED] ABGR8888 normal sizes
[02:48:48] [PASSED] ABGR8888 max sizes
[02:48:48] [PASSED] ABGR8888 pitch greater than min required
[02:48:48] [PASSED] ABGR8888 pitch less than min required
[02:48:48] [PASSED] ABGR8888 Invalid width
[02:48:48] [PASSED] ABGR8888 Invalid buffer handle
[02:48:48] [PASSED] No pixel format
[02:48:48] [PASSED] ABGR8888 Width 0
[02:48:48] [PASSED] ABGR8888 Height 0
[02:48:48] [PASSED] ABGR8888 Out of bound height * pitch combination
[02:48:48] [PASSED] ABGR8888 Large buffer offset
[02:48:48] [PASSED] ABGR8888 Buffer offset for inexistent plane
[02:48:48] [PASSED] ABGR8888 Invalid flag
[02:48:48] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[02:48:48] [PASSED] ABGR8888 Valid buffer modifier
[02:48:48] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[02:48:48] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[02:48:48] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[02:48:48] [PASSED] NV12 Normal sizes
[02:48:48] [PASSED] NV12 Max sizes
[02:48:48] [PASSED] NV12 Invalid pitch
[02:48:48] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[02:48:48] [PASSED] NV12 different modifier per-plane
[02:48:48] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[02:48:48] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[02:48:48] [PASSED] NV12 Modifier for inexistent plane
[02:48:48] [PASSED] NV12 Handle for inexistent plane
[02:48:48] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[02:48:48] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[02:48:48] [PASSED] YVU420 Normal sizes
[02:48:48] [PASSED] YVU420 Max sizes
[02:48:48] [PASSED] YVU420 Invalid pitch
[02:48:48] [PASSED] YVU420 Different pitches
[02:48:48] [PASSED] YVU420 Different buffer offsets/pitches
[02:48:48] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[02:48:48] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[02:48:48] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[02:48:48] [PASSED] YVU420 Valid modifier
[02:48:48] [PASSED] YVU420 Different modifiers per plane
[02:48:48] [PASSED] YVU420 Modifier for inexistent plane
[02:48:48] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR)
[02:48:48] [PASSED] X0L2 Normal sizes
[02:48:48] [PASSED] X0L2 Max sizes
[02:48:48] [PASSED] X0L2 Invalid pitch
[02:48:48] [PASSED] X0L2 Pitch greater than minimum required
[02:48:48] [PASSED] X0L2 Handle for inexistent plane
[02:48:48] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[02:48:48] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[02:48:48] [PASSED] X0L2 Valid modifier
[02:48:48] [PASSED] X0L2 Modifier for inexistent plane
[02:48:48] =========== [PASSED] drm_test_framebuffer_create ===========
[02:48:48] [PASSED] drm_test_framebuffer_free
[02:48:48] [PASSED] drm_test_framebuffer_init
[02:48:48] [PASSED] drm_test_framebuffer_init_bad_format
[02:48:48] [PASSED] drm_test_framebuffer_init_dev_mismatch
[02:48:48] [PASSED] drm_test_framebuffer_lookup
[02:48:48] [PASSED] drm_test_framebuffer_lookup_inexistent
[02:48:48] [PASSED] drm_test_framebuffer_modifiers_not_supported
[02:48:48] ================= [PASSED] drm_framebuffer =================
[02:48:48] ================ drm_gem_shmem (8 subtests) ================
[02:48:48] [PASSED] drm_gem_shmem_test_obj_create
[02:48:48] [PASSED] drm_gem_shmem_test_obj_create_private
[02:48:48] [PASSED] drm_gem_shmem_test_pin_pages
[02:48:48] [PASSED] drm_gem_shmem_test_vmap
[02:48:48] [PASSED] drm_gem_shmem_test_get_pages_sgt
[02:48:48] [PASSED] drm_gem_shmem_test_get_sg_table
[02:48:48] [PASSED] drm_gem_shmem_test_madvise
[02:48:48] [PASSED] drm_gem_shmem_test_purge
[02:48:48] ================== [PASSED] drm_gem_shmem ==================
[02:48:48] === drm_atomic_helper_connector_hdmi_check (27 subtests) ===
[02:48:48] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode
[02:48:48] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1
[02:48:48] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode
[02:48:48] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1
[02:48:48] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode
[02:48:48] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1
[02:48:48] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420 =======
[02:48:48] [PASSED] Automatic
[02:48:48] [PASSED] Full
[02:48:48] [PASSED] Limited 16:235
[02:48:48] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 ===
[02:48:48] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed
[02:48:48] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed
[02:48:48] [PASSED] drm_test_check_disable_connector
[02:48:48] [PASSED] drm_test_check_hdmi_funcs_reject_rate
[02:48:48] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb
[02:48:48] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420
[02:48:48] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422
[02:48:48] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420
[02:48:48] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420
[02:48:48] [PASSED] drm_test_check_output_bpc_crtc_mode_changed
[02:48:48] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed
[02:48:48] [PASSED] drm_test_check_output_bpc_dvi
[02:48:48] [PASSED] drm_test_check_output_bpc_format_vic_1
[02:48:48] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only
[02:48:48] [PASSED] drm_test_check_output_bpc_format_display_rgb_only
[02:48:48] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only
[02:48:48] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only
[02:48:48] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc
[02:48:48] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc
[02:48:48] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc
[02:48:48] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ======
[02:48:48] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ====
[02:48:48] [PASSED] drm_test_check_broadcast_rgb_value
[02:48:48] [PASSED] drm_test_check_bpc_8_value
[02:48:48] [PASSED] drm_test_check_bpc_10_value
[02:48:48] [PASSED] drm_test_check_bpc_12_value
[02:48:48] [PASSED] drm_test_check_format_value
[02:48:48] [PASSED] drm_test_check_tmds_char_value
[02:48:48] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ======
[02:48:48] = drm_atomic_helper_connector_hdmi_mode_valid (4 subtests) =
[02:48:48] [PASSED] drm_test_check_mode_valid
[02:48:48] [PASSED] drm_test_check_mode_valid_reject
[02:48:48] [PASSED] drm_test_check_mode_valid_reject_rate
[02:48:48] [PASSED] drm_test_check_mode_valid_reject_max_clock
[02:48:48] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid ===
[02:48:48] ================= drm_managed (2 subtests) =================
[02:48:48] [PASSED] drm_test_managed_release_action
[02:48:48] [PASSED] drm_test_managed_run_action
[02:48:48] =================== [PASSED] drm_managed ===================
[02:48:48] =================== drm_mm (6 subtests) ====================
[02:48:48] [PASSED] drm_test_mm_init
[02:48:48] [PASSED] drm_test_mm_debug
[02:48:48] [PASSED] drm_test_mm_align32
[02:48:48] [PASSED] drm_test_mm_align64
[02:48:48] [PASSED] drm_test_mm_lowest
[02:48:48] [PASSED] drm_test_mm_highest
[02:48:48] ===================== [PASSED] drm_mm ======================
[02:48:48] ============= drm_modes_analog_tv (5 subtests) =============
[02:48:48] [PASSED] drm_test_modes_analog_tv_mono_576i
[02:48:48] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[02:48:48] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[02:48:48] [PASSED] drm_test_modes_analog_tv_pal_576i
[02:48:48] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[02:48:48] =============== [PASSED] drm_modes_analog_tv ===============
[02:48:48] ============== drm_plane_helper (2 subtests) ===============
[02:48:48] =============== drm_test_check_plane_state ================
[02:48:48] [PASSED] clipping_simple
[02:48:48] [PASSED] clipping_rotate_reflect
[02:48:48] [PASSED] positioning_simple
[02:48:48] [PASSED] upscaling
[02:48:48] [PASSED] downscaling
[02:48:48] [PASSED] rounding1
[02:48:48] [PASSED] rounding2
[02:48:48] [PASSED] rounding3
[02:48:48] [PASSED] rounding4
[02:48:48] =========== [PASSED] drm_test_check_plane_state ============
[02:48:48] =========== drm_test_check_invalid_plane_state ============
[02:48:48] [PASSED] positioning_invalid
[02:48:48] [PASSED] upscaling_invalid
[02:48:48] [PASSED] downscaling_invalid
[02:48:48] ======= [PASSED] drm_test_check_invalid_plane_state ========
[02:48:48] ================ [PASSED] drm_plane_helper =================
[02:48:48] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[02:48:48] ====== drm_test_connector_helper_tv_get_modes_check =======
[02:48:48] [PASSED] None
[02:48:48] [PASSED] PAL
[02:48:48] [PASSED] NTSC
[02:48:48] [PASSED] Both, NTSC Default
[02:48:48] [PASSED] Both, PAL Default
[02:48:48] [PASSED] Both, NTSC Default, with PAL on command-line
[02:48:48] [PASSED] Both, PAL Default, with NTSC on command-line
[02:48:48] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[02:48:48] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[02:48:48] ================== drm_rect (9 subtests) ===================
[02:48:48] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[02:48:48] [PASSED] drm_test_rect_clip_scaled_not_clipped
[02:48:48] [PASSED] drm_test_rect_clip_scaled_clipped
[02:48:48] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[02:48:48] ================= drm_test_rect_intersect =================
[02:48:48] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[02:48:48] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[02:48:48] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[02:48:48] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[02:48:48] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[02:48:48] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[02:48:48] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[02:48:48] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[02:48:48] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[02:48:48] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[02:48:48] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[02:48:48] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[02:48:48] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[02:48:48] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[02:48:48] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[02:48:48] ============= [PASSED] drm_test_rect_intersect =============
[02:48:48] ================ drm_test_rect_calc_hscale ================
[02:48:48] [PASSED] normal use
[02:48:48] [PASSED] out of max range
[02:48:48] [PASSED] out of min range
[02:48:48] [PASSED] zero dst
[02:48:48] [PASSED] negative src
[02:48:48] [PASSED] negative dst
[02:48:48] ============ [PASSED] drm_test_rect_calc_hscale ============
[02:48:48] ================ drm_test_rect_calc_vscale ================
[02:48:48] [PASSED] normal use
[02:48:48] [PASSED] out of max range
[02:48:48] [PASSED] out of min range
[02:48:48] [PASSED] zero dst
[02:48:48] [PASSED] negative src
[02:48:48] [PASSED] negative dst
[02:48:48] ============ [PASSED] drm_test_rect_calc_vscale ============
[02:48:48] ================== drm_test_rect_rotate ===================
[02:48:48] [PASSED] reflect-x
[02:48:48] [PASSED] reflect-y
[02:48:48] [PASSED] rotate-0
[02:48:48] [PASSED] rotate-90
[02:48:48] [PASSED] rotate-180
[02:48:48] [PASSED] rotate-270
stty: 'standard input': Inappropriate ioctl for device
[02:48:48] ============== [PASSED] drm_test_rect_rotate ===============
[02:48:48] ================ drm_test_rect_rotate_inv =================
[02:48:48] [PASSED] reflect-x
[02:48:48] [PASSED] reflect-y
[02:48:48] [PASSED] rotate-0
[02:48:48] [PASSED] rotate-90
[02:48:48] [PASSED] rotate-180
[02:48:48] [PASSED] rotate-270
[02:48:48] ============ [PASSED] drm_test_rect_rotate_inv =============
[02:48:48] ==================== [PASSED] drm_rect =====================
[02:48:48] ============ drm_sysfb_modeset_test (1 subtest) ============
[02:48:48] ============ drm_test_sysfb_build_fourcc_list =============
[02:48:48] [PASSED] no native formats
[02:48:48] [PASSED] XRGB8888 as native format
[02:48:48] [PASSED] remove duplicates
[02:48:48] [PASSED] convert alpha formats
[02:48:48] [PASSED] random formats
[02:48:48] ======== [PASSED] drm_test_sysfb_build_fourcc_list =========
[02:48:48] ============= [PASSED] drm_sysfb_modeset_test ==============
[02:48:48] ============================================================
[02:48:48] Testing complete. Ran 616 tests: passed: 616
[02:48:48] Elapsed time: 23.354s total, 1.634s configuring, 21.499s building, 0.191s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig
[02:48:48] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[02:48:50] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[02:48:57] Starting KUnit Kernel (1/1)...
[02:48:57] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[02:48:57] ================= ttm_device (5 subtests) ==================
[02:48:57] [PASSED] ttm_device_init_basic
[02:48:57] [PASSED] ttm_device_init_multiple
[02:48:57] [PASSED] ttm_device_fini_basic
[02:48:57] [PASSED] ttm_device_init_no_vma_man
[02:48:57] ================== ttm_device_init_pools ==================
[02:48:57] [PASSED] No DMA allocations, no DMA32 required
[02:48:57] [PASSED] DMA allocations, DMA32 required
[02:48:57] [PASSED] No DMA allocations, DMA32 required
[02:48:57] [PASSED] DMA allocations, no DMA32 required
[02:48:57] ============== [PASSED] ttm_device_init_pools ==============
[02:48:57] =================== [PASSED] ttm_device ====================
[02:48:57] ================== ttm_pool (8 subtests) ===================
[02:48:57] ================== ttm_pool_alloc_basic ===================
[02:48:57] [PASSED] One page
[02:48:57] [PASSED] More than one page
[02:48:57] [PASSED] Above the allocation limit
[02:48:57] [PASSED] One page, with coherent DMA mappings enabled
[02:48:57] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[02:48:57] ============== [PASSED] ttm_pool_alloc_basic ===============
[02:48:57] ============== ttm_pool_alloc_basic_dma_addr ==============
[02:48:57] [PASSED] One page
[02:48:57] [PASSED] More than one page
[02:48:57] [PASSED] Above the allocation limit
[02:48:57] [PASSED] One page, with coherent DMA mappings enabled
[02:48:57] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[02:48:57] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[02:48:57] [PASSED] ttm_pool_alloc_order_caching_match
[02:48:57] [PASSED] ttm_pool_alloc_caching_mismatch
[02:48:57] [PASSED] ttm_pool_alloc_order_mismatch
[02:48:57] [PASSED] ttm_pool_free_dma_alloc
[02:48:57] [PASSED] ttm_pool_free_no_dma_alloc
[02:48:57] [PASSED] ttm_pool_fini_basic
[02:48:57] ==================== [PASSED] ttm_pool =====================
[02:48:57] ================ ttm_resource (8 subtests) =================
[02:48:57] ================= ttm_resource_init_basic =================
[02:48:57] [PASSED] Init resource in TTM_PL_SYSTEM
[02:48:57] [PASSED] Init resource in TTM_PL_VRAM
[02:48:57] [PASSED] Init resource in a private placement
[02:48:57] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[02:48:57] ============= [PASSED] ttm_resource_init_basic =============
[02:48:57] [PASSED] ttm_resource_init_pinned
[02:48:57] [PASSED] ttm_resource_fini_basic
[02:48:57] [PASSED] ttm_resource_manager_init_basic
[02:48:57] [PASSED] ttm_resource_manager_usage_basic
[02:48:57] [PASSED] ttm_resource_manager_set_used_basic
[02:48:57] [PASSED] ttm_sys_man_alloc_basic
[02:48:57] [PASSED] ttm_sys_man_free_basic
[02:48:57] ================== [PASSED] ttm_resource ===================
[02:48:57] =================== ttm_tt (15 subtests) ===================
[02:48:57] ==================== ttm_tt_init_basic ====================
[02:48:57] [PASSED] Page-aligned size
[02:48:57] [PASSED] Extra pages requested
[02:48:57] ================ [PASSED] ttm_tt_init_basic ================
[02:48:57] [PASSED] ttm_tt_init_misaligned
[02:48:57] [PASSED] ttm_tt_fini_basic
[02:48:57] [PASSED] ttm_tt_fini_sg
[02:48:57] [PASSED] ttm_tt_fini_shmem
[02:48:57] [PASSED] ttm_tt_create_basic
[02:48:57] [PASSED] ttm_tt_create_invalid_bo_type
[02:48:57] [PASSED] ttm_tt_create_ttm_exists
[02:48:57] [PASSED] ttm_tt_create_failed
[02:48:57] [PASSED] ttm_tt_destroy_basic
[02:48:57] [PASSED] ttm_tt_populate_null_ttm
[02:48:57] [PASSED] ttm_tt_populate_populated_ttm
[02:48:57] [PASSED] ttm_tt_unpopulate_basic
[02:48:57] [PASSED] ttm_tt_unpopulate_empty_ttm
[02:48:57] [PASSED] ttm_tt_swapin_basic
[02:48:57] ===================== [PASSED] ttm_tt ======================
[02:48:57] =================== ttm_bo (14 subtests) ===================
[02:48:57] =========== ttm_bo_reserve_optimistic_no_ticket ===========
[02:48:57] [PASSED] Cannot be interrupted and sleeps
[02:48:57] [PASSED] Cannot be interrupted, locks straight away
[02:48:57] [PASSED] Can be interrupted, sleeps
[02:48:57] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[02:48:57] [PASSED] ttm_bo_reserve_locked_no_sleep
[02:48:57] [PASSED] ttm_bo_reserve_no_wait_ticket
[02:48:57] [PASSED] ttm_bo_reserve_double_resv
[02:48:57] [PASSED] ttm_bo_reserve_interrupted
[02:48:57] [PASSED] ttm_bo_reserve_deadlock
[02:48:57] [PASSED] ttm_bo_unreserve_basic
[02:48:57] [PASSED] ttm_bo_unreserve_pinned
[02:48:57] [PASSED] ttm_bo_unreserve_bulk
[02:48:57] [PASSED] ttm_bo_put_basic
[02:48:57] [PASSED] ttm_bo_put_shared_resv
[02:48:57] [PASSED] ttm_bo_pin_basic
[02:48:57] [PASSED] ttm_bo_pin_unpin_resource
[02:48:57] [PASSED] ttm_bo_multiple_pin_one_unpin
[02:48:57] ===================== [PASSED] ttm_bo ======================
[02:48:57] ============== ttm_bo_validate (21 subtests) ===============
[02:48:57] ============== ttm_bo_init_reserved_sys_man ===============
[02:48:57] [PASSED] Buffer object for userspace
[02:48:57] [PASSED] Kernel buffer object
[02:48:57] [PASSED] Shared buffer object
[02:48:57] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[02:48:57] ============== ttm_bo_init_reserved_mock_man ==============
[02:48:57] [PASSED] Buffer object for userspace
[02:48:57] [PASSED] Kernel buffer object
[02:48:57] [PASSED] Shared buffer object
[02:48:57] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[02:48:57] [PASSED] ttm_bo_init_reserved_resv
[02:48:57] ================== ttm_bo_validate_basic ==================
[02:48:57] [PASSED] Buffer object for userspace
[02:48:57] [PASSED] Kernel buffer object
[02:48:57] [PASSED] Shared buffer object
[02:48:57] ============== [PASSED] ttm_bo_validate_basic ==============
[02:48:57] [PASSED] ttm_bo_validate_invalid_placement
[02:48:57] ============= ttm_bo_validate_same_placement ==============
[02:48:57] [PASSED] System manager
[02:48:57] [PASSED] VRAM manager
[02:48:57] ========= [PASSED] ttm_bo_validate_same_placement ==========
[02:48:57] [PASSED] ttm_bo_validate_failed_alloc
[02:48:57] [PASSED] ttm_bo_validate_pinned
[02:48:57] [PASSED] ttm_bo_validate_busy_placement
[02:48:57] ================ ttm_bo_validate_multihop =================
[02:48:57] [PASSED] Buffer object for userspace
[02:48:57] [PASSED] Kernel buffer object
[02:48:57] [PASSED] Shared buffer object
[02:48:57] ============ [PASSED] ttm_bo_validate_multihop =============
[02:48:57] ========== ttm_bo_validate_no_placement_signaled ==========
[02:48:57] [PASSED] Buffer object in system domain, no page vector
[02:48:57] [PASSED] Buffer object in system domain with an existing page vector
[02:48:57] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[02:48:57] ======== ttm_bo_validate_no_placement_not_signaled ========
[02:48:57] [PASSED] Buffer object for userspace
[02:48:57] [PASSED] Kernel buffer object
[02:48:57] [PASSED] Shared buffer object
[02:48:57] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[02:48:57] [PASSED] ttm_bo_validate_move_fence_signaled
[02:48:57] ========= ttm_bo_validate_move_fence_not_signaled =========
[02:48:57] [PASSED] Waits for GPU
[02:48:57] [PASSED] Tries to lock straight away
[02:48:57] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[02:48:57] [PASSED] ttm_bo_validate_happy_evict
[02:48:57] [PASSED] ttm_bo_validate_all_pinned_evict
[02:48:57] [PASSED] ttm_bo_validate_allowed_only_evict
[02:48:57] [PASSED] ttm_bo_validate_deleted_evict
[02:48:57] [PASSED] ttm_bo_validate_busy_domain_evict
[02:48:57] [PASSED] ttm_bo_validate_evict_gutting
[02:48:57] [PASSED] ttm_bo_validate_recrusive_evict
stty: 'standard input': Inappropriate ioctl for device
[02:48:57] ================= [PASSED] ttm_bo_validate =================
[02:48:57] ============================================================
[02:48:57] Testing complete. Ran 101 tests: passed: 101
[02:48:57] Elapsed time: 9.596s total, 1.648s configuring, 7.682s building, 0.217s running
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel
^ permalink raw reply [flat|nested] 30+ messages in thread
* ✓ Xe.CI.BAT: success for drm/xe/guc: Add LFD format output for guc log (rev6)
2025-07-22 1:35 [PATCH v6 0/6] drm/xe/guc: Add LFD format output for guc log Zhanjun Dong
` (7 preceding siblings ...)
2025-07-22 2:49 ` ✓ CI.KUnit: success " Patchwork
@ 2025-07-22 3:54 ` Patchwork
2025-07-22 7:48 ` ✗ Xe.CI.Full: failure " Patchwork
9 siblings, 0 replies; 30+ messages in thread
From: Patchwork @ 2025-07-22 3:54 UTC (permalink / raw)
To: Zhanjun Dong; +Cc: intel-xe
[-- Attachment #1: Type: text/plain, Size: 959 bytes --]
== Series Details ==
Series: drm/xe/guc: Add LFD format output for guc log (rev6)
URL : https://patchwork.freedesktop.org/series/146541/
State : success
== Summary ==
CI Bug Log - changes from xe-3452-617f6e11e288a649addc9471911d29947c0996c8_BAT -> xe-pw-146541v6_BAT
====================================================
Summary
-------
**SUCCESS**
No regressions found.
Participating hosts (8 -> 7)
------------------------------
Missing (1): bat-adlp-vm
Changes
-------
No changes found
Build changes
-------------
* Linux: xe-3452-617f6e11e288a649addc9471911d29947c0996c8 -> xe-pw-146541v6
IGT_8470: ee326481fd4d17eba84fbc629f9e4a5def7dbd8f @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
xe-3452-617f6e11e288a649addc9471911d29947c0996c8: 617f6e11e288a649addc9471911d29947c0996c8
xe-pw-146541v6: 146541v6
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/index.html
[-- Attachment #2: Type: text/html, Size: 1507 bytes --]
^ permalink raw reply [flat|nested] 30+ messages in thread
* ✗ Xe.CI.Full: failure for drm/xe/guc: Add LFD format output for guc log (rev6)
2025-07-22 1:35 [PATCH v6 0/6] drm/xe/guc: Add LFD format output for guc log Zhanjun Dong
` (8 preceding siblings ...)
2025-07-22 3:54 ` ✓ Xe.CI.BAT: " Patchwork
@ 2025-07-22 7:48 ` Patchwork
9 siblings, 0 replies; 30+ messages in thread
From: Patchwork @ 2025-07-22 7:48 UTC (permalink / raw)
To: Zhanjun Dong; +Cc: intel-xe
[-- Attachment #1: Type: text/plain, Size: 49190 bytes --]
== Series Details ==
Series: drm/xe/guc: Add LFD format output for guc log (rev6)
URL : https://patchwork.freedesktop.org/series/146541/
State : failure
== Summary ==
CI Bug Log - changes from xe-3452-617f6e11e288a649addc9471911d29947c0996c8_FULL -> xe-pw-146541v6_FULL
====================================================
Summary
-------
**FAILURE**
Serious unknown changes coming with xe-pw-146541v6_FULL absolutely need to be
verified manually.
If you think the reported changes have nothing to do with the changes
introduced in xe-pw-146541v6_FULL, please notify your bug team (I915-ci-infra@lists.freedesktop.org) to allow them
to document this new failure mode, which will reduce false positives in CI.
Participating hosts (4 -> 4)
------------------------------
No changes in participating hosts
Possible new issues
-------------------
Here are the unknown changes that may have been introduced in xe-pw-146541v6_FULL:
### IGT changes ###
#### Possible regressions ####
* igt@xe_exec_system_allocator@threads-shared-vm-many-new-bo-map:
- shard-lnl: [PASS][1] -> [FAIL][2]
[1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-lnl-1/igt@xe_exec_system_allocator@threads-shared-vm-many-new-bo-map.html
[2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-lnl-3/igt@xe_exec_system_allocator@threads-shared-vm-many-new-bo-map.html
Known issues
------------
Here are the changes found in xe-pw-146541v6_FULL that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@intel_hwmon@hwmon-write:
- shard-adlp: NOTRUN -> [SKIP][3] ([Intel XE#1125] / [Intel XE#5574])
[3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@intel_hwmon@hwmon-write.html
* igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-0-async-flip:
- shard-adlp: NOTRUN -> [SKIP][4] ([Intel XE#1124])
[4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-0-async-flip.html
* igt@kms_big_fb@y-tiled-8bpp-rotate-270:
- shard-adlp: NOTRUN -> [SKIP][5] ([Intel XE#316]) +1 other test skip
[5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@kms_big_fb@y-tiled-8bpp-rotate-270.html
* igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0:
- shard-dg2-set2: NOTRUN -> [SKIP][6] ([Intel XE#1124]) +3 other tests skip
[6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-436/igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0.html
* igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-180-hflip:
- shard-bmg: NOTRUN -> [SKIP][7] ([Intel XE#1124]) +2 other tests skip
[7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-bmg-6/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-180-hflip.html
* igt@kms_bw@connected-linear-tiling-4-displays-3840x2160p:
- shard-bmg: NOTRUN -> [SKIP][8] ([Intel XE#2314] / [Intel XE#2894])
[8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-bmg-6/igt@kms_bw@connected-linear-tiling-4-displays-3840x2160p.html
* igt@kms_bw@linear-tiling-1-displays-1920x1080p:
- shard-dg2-set2: NOTRUN -> [SKIP][9] ([Intel XE#367])
[9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-436/igt@kms_bw@linear-tiling-1-displays-1920x1080p.html
* igt@kms_bw@linear-tiling-3-displays-3840x2160p:
- shard-adlp: NOTRUN -> [SKIP][10] ([Intel XE#367])
[10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@kms_bw@linear-tiling-3-displays-3840x2160p.html
* igt@kms_ccs@crc-primary-rotation-180-4-tiled-dg2-rc-ccs-cc@pipe-d-hdmi-a-1:
- shard-adlp: NOTRUN -> [SKIP][11] ([Intel XE#455] / [Intel XE#787]) +7 other tests skip
[11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@kms_ccs@crc-primary-rotation-180-4-tiled-dg2-rc-ccs-cc@pipe-d-hdmi-a-1.html
* igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs:
- shard-dg2-set2: [PASS][12] -> [INCOMPLETE][13] ([Intel XE#3862]) +1 other test incomplete
[12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-dg2-433/igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs.html
[13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-464/igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs.html
* igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs-cc@pipe-b-hdmi-a-1:
- shard-adlp: NOTRUN -> [SKIP][14] ([Intel XE#787]) +11 other tests skip
[14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs-cc@pipe-b-hdmi-a-1.html
* igt@kms_ccs@crc-sprite-planes-basic-4-tiled-mtl-rc-ccs-cc@pipe-c-hdmi-a-6:
- shard-dg2-set2: NOTRUN -> [SKIP][15] ([Intel XE#787]) +104 other tests skip
[15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-436/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-mtl-rc-ccs-cc@pipe-c-hdmi-a-6.html
* igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-a-dp-4:
- shard-dg2-set2: NOTRUN -> [INCOMPLETE][16] ([Intel XE#2705] / [Intel XE#4212])
[16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-433/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-a-dp-4.html
* igt@kms_ccs@random-ccs-data-yf-tiled-ccs@pipe-d-dp-4:
- shard-dg2-set2: NOTRUN -> [SKIP][17] ([Intel XE#455] / [Intel XE#787]) +16 other tests skip
[17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-436/igt@kms_ccs@random-ccs-data-yf-tiled-ccs@pipe-d-dp-4.html
* igt@kms_chamelium_color@ctm-0-25:
- shard-adlp: NOTRUN -> [SKIP][18] ([Intel XE#306])
[18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@kms_chamelium_color@ctm-0-25.html
* igt@kms_chamelium_frames@hdmi-aspect-ratio:
- shard-dg2-set2: NOTRUN -> [SKIP][19] ([Intel XE#373]) +2 other tests skip
[19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-436/igt@kms_chamelium_frames@hdmi-aspect-ratio.html
* igt@kms_content_protection@atomic@pipe-a-dp-2:
- shard-dg2-set2: NOTRUN -> [FAIL][20] ([Intel XE#1178])
[20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-432/igt@kms_content_protection@atomic@pipe-a-dp-2.html
* igt@kms_content_protection@uevent@pipe-a-dp-4:
- shard-dg2-set2: NOTRUN -> [FAIL][21] ([Intel XE#1188])
[21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-463/igt@kms_content_protection@uevent@pipe-a-dp-4.html
* igt@kms_cursor_crc@cursor-offscreen-512x512:
- shard-dg2-set2: NOTRUN -> [SKIP][22] ([Intel XE#308]) +1 other test skip
[22]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-436/igt@kms_cursor_crc@cursor-offscreen-512x512.html
* igt@kms_cursor_crc@cursor-onscreen-512x512:
- shard-bmg: NOTRUN -> [SKIP][23] ([Intel XE#2321])
[23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-bmg-6/igt@kms_cursor_crc@cursor-onscreen-512x512.html
* igt@kms_cursor_legacy@2x-long-flip-vs-cursor-atomic:
- shard-bmg: [PASS][24] -> [SKIP][25] ([Intel XE#2291])
[24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-bmg-8/igt@kms_cursor_legacy@2x-long-flip-vs-cursor-atomic.html
[25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-bmg-6/igt@kms_cursor_legacy@2x-long-flip-vs-cursor-atomic.html
* igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions:
- shard-bmg: NOTRUN -> [SKIP][26] ([Intel XE#2291])
[26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-bmg-6/igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions.html
* igt@kms_cursor_legacy@short-busy-flip-before-cursor-toggle:
- shard-dg2-set2: NOTRUN -> [SKIP][27] ([Intel XE#323])
[27]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-436/igt@kms_cursor_legacy@short-busy-flip-before-cursor-toggle.html
* igt@kms_cursor_legacy@single-bo:
- shard-bmg: [PASS][28] -> [DMESG-WARN][29] ([Intel XE#5354]) +1 other test dmesg-warn
[28]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-bmg-2/igt@kms_cursor_legacy@single-bo.html
[29]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-bmg-8/igt@kms_cursor_legacy@single-bo.html
* igt@kms_dither@fb-8bpc-vs-panel-6bpc@pipe-a-hdmi-a-6:
- shard-dg2-set2: NOTRUN -> [SKIP][30] ([Intel XE#4494] / [i915#3804])
[30]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-436/igt@kms_dither@fb-8bpc-vs-panel-6bpc@pipe-a-hdmi-a-6.html
* igt@kms_dsc@dsc-fractional-bpp-with-bpc:
- shard-adlp: NOTRUN -> [SKIP][31] ([Intel XE#455]) +2 other tests skip
[31]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@kms_dsc@dsc-fractional-bpp-with-bpc.html
* igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset-interruptible@bc-hdmi-a6-dp4:
- shard-dg2-set2: [PASS][32] -> [INCOMPLETE][33] ([Intel XE#2049]) +1 other test incomplete
[32]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-dg2-435/igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset-interruptible@bc-hdmi-a6-dp4.html
[33]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-464/igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset-interruptible@bc-hdmi-a6-dp4.html
* igt@kms_flip@2x-flip-vs-wf_vblank-interruptible:
- shard-adlp: NOTRUN -> [SKIP][34] ([Intel XE#310])
[34]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@kms_flip@2x-flip-vs-wf_vblank-interruptible.html
* igt@kms_flip@2x-modeset-vs-vblank-race:
- shard-bmg: [PASS][35] -> [SKIP][36] ([Intel XE#2316]) +1 other test skip
[35]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-bmg-8/igt@kms_flip@2x-modeset-vs-vblank-race.html
[36]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-bmg-6/igt@kms_flip@2x-modeset-vs-vblank-race.html
* igt@kms_flip@basic-flip-vs-wf_vblank:
- shard-adlp: [PASS][37] -> [DMESG-WARN][38] ([Intel XE#4543]) +3 other tests dmesg-warn
[37]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-6/igt@kms_flip@basic-flip-vs-wf_vblank.html
[38]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-4/igt@kms_flip@basic-flip-vs-wf_vblank.html
* igt@kms_flip@flip-vs-wf_vblank-interruptible@c-hdmi-a1:
- shard-adlp: NOTRUN -> [DMESG-WARN][39] ([Intel XE#4543]) +1 other test dmesg-warn
[39]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@kms_flip@flip-vs-wf_vblank-interruptible@c-hdmi-a1.html
* igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling:
- shard-bmg: NOTRUN -> [SKIP][40] ([Intel XE#2293] / [Intel XE#2380])
[40]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-bmg-6/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling.html
* igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling@pipe-a-valid-mode:
- shard-bmg: NOTRUN -> [SKIP][41] ([Intel XE#2293])
[41]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-bmg-6/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling@pipe-a-valid-mode.html
* igt@kms_flip_tiling@flip-change-tiling@pipe-d-hdmi-a-1-y-to-y:
- shard-adlp: [PASS][42] -> [DMESG-FAIL][43] ([Intel XE#4543]) +2 other tests dmesg-fail
[42]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-9/igt@kms_flip_tiling@flip-change-tiling@pipe-d-hdmi-a-1-y-to-y.html
[43]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-9/igt@kms_flip_tiling@flip-change-tiling@pipe-d-hdmi-a-1-y-to-y.html
* igt@kms_frontbuffer_tracking@drrs-1p-primscrn-shrfb-plflip-blt:
- shard-dg2-set2: NOTRUN -> [SKIP][44] ([Intel XE#651]) +5 other tests skip
[44]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-436/igt@kms_frontbuffer_tracking@drrs-1p-primscrn-shrfb-plflip-blt.html
* igt@kms_frontbuffer_tracking@drrs-2p-primscrn-shrfb-msflip-blt:
- shard-bmg: NOTRUN -> [SKIP][45] ([Intel XE#2312]) +3 other tests skip
[45]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-bmg-6/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-shrfb-msflip-blt.html
* igt@kms_frontbuffer_tracking@drrs-slowdraw:
- shard-bmg: NOTRUN -> [SKIP][46] ([Intel XE#2311])
[46]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-bmg-6/igt@kms_frontbuffer_tracking@drrs-slowdraw.html
* igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-fullscreen:
- shard-adlp: NOTRUN -> [SKIP][47] ([Intel XE#656]) +6 other tests skip
[47]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-fullscreen.html
* igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-cur-indfb-draw-mmap-wc:
- shard-adlp: NOTRUN -> [SKIP][48] ([Intel XE#651]) +3 other tests skip
[48]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-cur-indfb-draw-mmap-wc.html
* igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-shrfb-pgflip-blt:
- shard-dg2-set2: NOTRUN -> [SKIP][49] ([Intel XE#653]) +6 other tests skip
[49]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-436/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-shrfb-pgflip-blt.html
* igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-mmap-wc:
- shard-adlp: NOTRUN -> [SKIP][50] ([Intel XE#653]) +3 other tests skip
[50]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-mmap-wc.html
* igt@kms_hdr@invalid-hdr:
- shard-dg2-set2: [PASS][51] -> [SKIP][52] ([Intel XE#455])
[51]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-dg2-463/igt@kms_hdr@invalid-hdr.html
[52]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-466/igt@kms_hdr@invalid-hdr.html
- shard-bmg: [PASS][53] -> [SKIP][54] ([Intel XE#1503])
[53]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-bmg-3/igt@kms_hdr@invalid-hdr.html
[54]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-bmg-5/igt@kms_hdr@invalid-hdr.html
* igt@kms_plane_cursor@overlay@pipe-a-hdmi-a-6-size-64:
- shard-dg2-set2: NOTRUN -> [FAIL][55] ([Intel XE#616])
[55]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-463/igt@kms_plane_cursor@overlay@pipe-a-hdmi-a-6-size-64.html
* igt@kms_plane_multiple@tiling-yf:
- shard-bmg: NOTRUN -> [SKIP][56] ([Intel XE#5020])
[56]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-bmg-6/igt@kms_plane_multiple@tiling-yf.html
* igt@kms_pm_backlight@fade-with-dpms:
- shard-dg2-set2: NOTRUN -> [SKIP][57] ([Intel XE#870])
[57]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-436/igt@kms_pm_backlight@fade-with-dpms.html
* igt@kms_pm_dc@dc5-retention-flops:
- shard-adlp: NOTRUN -> [SKIP][58] ([Intel XE#3309])
[58]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@kms_pm_dc@dc5-retention-flops.html
* igt@kms_psr2_sf@fbc-pr-cursor-plane-move-continuous-sf:
- shard-dg2-set2: NOTRUN -> [SKIP][59] ([Intel XE#1489]) +1 other test skip
[59]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-436/igt@kms_psr2_sf@fbc-pr-cursor-plane-move-continuous-sf.html
* igt@kms_psr2_sf@fbc-pr-overlay-primary-update-sf-dmg-area:
- shard-bmg: NOTRUN -> [SKIP][60] ([Intel XE#1489]) +1 other test skip
[60]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-bmg-6/igt@kms_psr2_sf@fbc-pr-overlay-primary-update-sf-dmg-area.html
* igt@kms_psr2_sf@pr-primary-plane-update-sf-dmg-area:
- shard-adlp: NOTRUN -> [SKIP][61] ([Intel XE#1489])
[61]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@kms_psr2_sf@pr-primary-plane-update-sf-dmg-area.html
* igt@kms_psr@fbc-pr-cursor-plane-move:
- shard-dg2-set2: NOTRUN -> [SKIP][62] ([Intel XE#2850] / [Intel XE#929]) +4 other tests skip
[62]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-466/igt@kms_psr@fbc-pr-cursor-plane-move.html
* igt@kms_psr@psr2-cursor-plane-move:
- shard-adlp: NOTRUN -> [SKIP][63] ([Intel XE#2850] / [Intel XE#929]) +3 other tests skip
[63]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@kms_psr@psr2-cursor-plane-move.html
* igt@kms_tv_load_detect@load-detect:
- shard-adlp: NOTRUN -> [SKIP][64] ([Intel XE#330])
[64]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@kms_tv_load_detect@load-detect.html
* igt@kms_vrr@cmrr:
- shard-adlp: NOTRUN -> [SKIP][65] ([Intel XE#2168])
[65]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@kms_vrr@cmrr.html
* igt@kms_vrr@flip-dpms:
- shard-dg2-set2: NOTRUN -> [SKIP][66] ([Intel XE#455]) +7 other tests skip
[66]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-436/igt@kms_vrr@flip-dpms.html
* igt@kms_vrr@flip-suspend:
- shard-bmg: NOTRUN -> [SKIP][67] ([Intel XE#1499])
[67]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-bmg-6/igt@kms_vrr@flip-suspend.html
* igt@kms_vrr@seamless-rr-switch-virtual@pipe-a-edp-1:
- shard-lnl: [PASS][68] -> [FAIL][69] ([Intel XE#2142]) +1 other test fail
[68]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-lnl-7/igt@kms_vrr@seamless-rr-switch-virtual@pipe-a-edp-1.html
[69]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-lnl-5/igt@kms_vrr@seamless-rr-switch-virtual@pipe-a-edp-1.html
* igt@xe_ccs@ctrl-surf-copy-new-ctx:
- shard-adlp: NOTRUN -> [SKIP][70] ([Intel XE#455] / [Intel XE#488] / [Intel XE#5607])
[70]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@xe_ccs@ctrl-surf-copy-new-ctx.html
* igt@xe_copy_basic@mem-copy-linear-0xfd:
- shard-dg2-set2: NOTRUN -> [SKIP][71] ([Intel XE#1123])
[71]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-436/igt@xe_copy_basic@mem-copy-linear-0xfd.html
* igt@xe_eudebug@basic-vm-bind:
- shard-bmg: NOTRUN -> [SKIP][72] ([Intel XE#4837]) +1 other test skip
[72]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-bmg-6/igt@xe_eudebug@basic-vm-bind.html
* igt@xe_eudebug@discovery-race-vmbind:
- shard-dg2-set2: NOTRUN -> [SKIP][73] ([Intel XE#4837]) +4 other tests skip
[73]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-436/igt@xe_eudebug@discovery-race-vmbind.html
* igt@xe_eudebug_online@reset-with-attention:
- shard-adlp: NOTRUN -> [SKIP][74] ([Intel XE#4837] / [Intel XE#5565]) +2 other tests skip
[74]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@xe_eudebug_online@reset-with-attention.html
* igt@xe_evict_ccs@evict-overcommit-standalone-nofree-samefd:
- shard-adlp: NOTRUN -> [SKIP][75] ([Intel XE#5563] / [Intel XE#688])
[75]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@xe_evict_ccs@evict-overcommit-standalone-nofree-samefd.html
* igt@xe_exec_basic@multigpu-no-exec-basic-defer-mmap:
- shard-adlp: NOTRUN -> [SKIP][76] ([Intel XE#1392] / [Intel XE#5575])
[76]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@xe_exec_basic@multigpu-no-exec-basic-defer-mmap.html
* igt@xe_exec_basic@multigpu-no-exec-null-defer-mmap:
- shard-dg2-set2: [PASS][77] -> [SKIP][78] ([Intel XE#1392]) +3 other tests skip
[77]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-dg2-433/igt@xe_exec_basic@multigpu-no-exec-null-defer-mmap.html
[78]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-432/igt@xe_exec_basic@multigpu-no-exec-null-defer-mmap.html
* igt@xe_exec_fault_mode@twice-bindexecqueue-userptr-invalidate-race-imm:
- shard-adlp: NOTRUN -> [SKIP][79] ([Intel XE#288] / [Intel XE#5561]) +5 other tests skip
[79]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@xe_exec_fault_mode@twice-bindexecqueue-userptr-invalidate-race-imm.html
* igt@xe_exec_fault_mode@twice-userptr-invalidate-race:
- shard-dg2-set2: NOTRUN -> [SKIP][80] ([Intel XE#288]) +6 other tests skip
[80]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-466/igt@xe_exec_fault_mode@twice-userptr-invalidate-race.html
* igt@xe_exec_system_allocator@many-large-malloc-nomemset:
- shard-dg2-set2: NOTRUN -> [SKIP][81] ([Intel XE#4915]) +60 other tests skip
[81]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-436/igt@xe_exec_system_allocator@many-large-malloc-nomemset.html
* igt@xe_exec_system_allocator@once-large-mmap-free-huge-nomemset:
- shard-bmg: NOTRUN -> [SKIP][82] ([Intel XE#4943]) +1 other test skip
[82]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-bmg-6/igt@xe_exec_system_allocator@once-large-mmap-free-huge-nomemset.html
* igt@xe_exec_system_allocator@twice-large-new-race:
- shard-adlp: NOTRUN -> [SKIP][83] ([Intel XE#4915] / [Intel XE#5560]) +45 other tests skip
[83]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@xe_exec_system_allocator@twice-large-new-race.html
* igt@xe_oa@unprivileged-single-ctx-counters:
- shard-adlp: NOTRUN -> [SKIP][84] ([Intel XE#3573]) +1 other test skip
[84]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@xe_oa@unprivileged-single-ctx-counters.html
* igt@xe_oa@whitelisted-registers-userspace-config:
- shard-dg2-set2: NOTRUN -> [SKIP][85] ([Intel XE#3573]) +1 other test skip
[85]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-436/igt@xe_oa@whitelisted-registers-userspace-config.html
* igt@xe_pm@d3hot-basic-exec:
- shard-adlp: [PASS][86] -> [DMESG-WARN][87] ([Intel XE#2953] / [Intel XE#4173])
[86]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-1/igt@xe_pm@d3hot-basic-exec.html
[87]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-2/igt@xe_pm@d3hot-basic-exec.html
* igt@xe_pmu@gt-frequency:
- shard-dg2-set2: [PASS][88] -> [FAIL][89] ([Intel XE#4819]) +1 other test fail
[88]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-dg2-466/igt@xe_pmu@gt-frequency.html
[89]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-434/igt@xe_pmu@gt-frequency.html
* igt@xe_query@multigpu-query-pxp-status:
- shard-bmg: NOTRUN -> [SKIP][90] ([Intel XE#944])
[90]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-bmg-6/igt@xe_query@multigpu-query-pxp-status.html
* igt@xe_query@multigpu-query-uc-fw-version-guc:
- shard-dg2-set2: NOTRUN -> [SKIP][91] ([Intel XE#944])
[91]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-436/igt@xe_query@multigpu-query-uc-fw-version-guc.html
* igt@xe_sriov_scheduling@equal-throughput:
- shard-dg2-set2: NOTRUN -> [SKIP][92] ([Intel XE#4351])
[92]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-436/igt@xe_sriov_scheduling@equal-throughput.html
#### Possible fixes ####
* igt@kms_big_fb@x-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip:
- shard-adlp: [DMESG-FAIL][93] ([Intel XE#4543]) -> [PASS][94]
[93]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-9/igt@kms_big_fb@x-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip.html
[94]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-2/igt@kms_big_fb@x-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip.html
* igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs:
- shard-dg2-set2: [INCOMPLETE][95] ([Intel XE#1727] / [Intel XE#3113] / [Intel XE#3124] / [Intel XE#4345]) -> [PASS][96]
[95]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-dg2-434/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs.html
[96]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-466/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs.html
* igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-a-hdmi-a-6:
- shard-dg2-set2: [INCOMPLETE][97] ([Intel XE#1727] / [Intel XE#3113] / [Intel XE#3124]) -> [PASS][98] +1 other test pass
[97]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-dg2-434/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-a-hdmi-a-6.html
[98]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-466/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-a-hdmi-a-6.html
* igt@kms_cursor_legacy@2x-long-cursor-vs-flip-legacy:
- shard-bmg: [SKIP][99] ([Intel XE#2291]) -> [PASS][100]
[99]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-bmg-6/igt@kms_cursor_legacy@2x-long-cursor-vs-flip-legacy.html
[100]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-bmg-1/igt@kms_cursor_legacy@2x-long-cursor-vs-flip-legacy.html
* igt@kms_flip@dpms-off-confusion@b-hdmi-a1:
- shard-adlp: [DMESG-WARN][101] ([Intel XE#4543]) -> [PASS][102] +2 other tests pass
[101]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-9/igt@kms_flip@dpms-off-confusion@b-hdmi-a1.html
[102]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@kms_flip@dpms-off-confusion@b-hdmi-a1.html
* igt@xe_exec_basic@multigpu-many-execqueues-many-vm-basic-defer-bind:
- shard-dg2-set2: [SKIP][103] ([Intel XE#1392]) -> [PASS][104] +4 other tests pass
[103]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-dg2-432/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-basic-defer-bind.html
[104]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-463/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-basic-defer-bind.html
* igt@xe_exec_reset@parallel-gt-reset:
- shard-adlp: [DMESG-WARN][105] ([Intel XE#3876]) -> [PASS][106]
[105]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-8/igt@xe_exec_reset@parallel-gt-reset.html
[106]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@xe_exec_reset@parallel-gt-reset.html
* igt@xe_exec_system_allocator@many-execqueues-mmap-shared-remap-dontunmap-eocheck:
- shard-bmg: [INCOMPLETE][107] ([Intel XE#2594] / [Intel XE#5401]) -> [PASS][108]
[107]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-bmg-8/igt@xe_exec_system_allocator@many-execqueues-mmap-shared-remap-dontunmap-eocheck.html
[108]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-bmg-6/igt@xe_exec_system_allocator@many-execqueues-mmap-shared-remap-dontunmap-eocheck.html
* igt@xe_module_load@reload:
- shard-dg2-set2: [ABORT][109] -> [PASS][110]
[109]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-dg2-434/igt@xe_module_load@reload.html
[110]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-436/igt@xe_module_load@reload.html
* igt@xe_pm@d3hot-basic:
- shard-adlp: [ABORT][111] -> [PASS][112]
[111]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-8/igt@xe_pm@d3hot-basic.html
[112]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@xe_pm@d3hot-basic.html
* igt@xe_pm@s2idle-multiple-execs:
- shard-adlp: [DMESG-WARN][113] ([Intel XE#2953] / [Intel XE#4173]) -> [PASS][114] +4 other tests pass
[113]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-4/igt@xe_pm@s2idle-multiple-execs.html
[114]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-8/igt@xe_pm@s2idle-multiple-execs.html
#### Warnings ####
* igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs:
- shard-dg2-set2: [INCOMPLETE][115] ([Intel XE#1727] / [Intel XE#3113] / [Intel XE#3124]) -> [INCOMPLETE][116] ([Intel XE#2705] / [Intel XE#4212] / [Intel XE#4345])
[115]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-dg2-464/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs.html
[116]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-433/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs.html
* igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-blt:
- shard-bmg: [SKIP][117] ([Intel XE#2312]) -> [SKIP][118] ([Intel XE#5390])
[117]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-blt.html
[118]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-bmg-5/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-blt.html
* igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-render:
- shard-bmg: [SKIP][119] ([Intel XE#5390]) -> [SKIP][120] ([Intel XE#2312]) +1 other test skip
[119]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-bmg-5/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-render.html
[120]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-render.html
* igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-pri-indfb-draw-render:
- shard-bmg: [SKIP][121] ([Intel XE#2311]) -> [SKIP][122] ([Intel XE#2312]) +1 other test skip
[121]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-bmg-8/igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-pri-indfb-draw-render.html
[122]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-pri-indfb-draw-render.html
* igt@kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-onoff:
- shard-bmg: [SKIP][123] ([Intel XE#2313]) -> [SKIP][124] ([Intel XE#2312]) +3 other tests skip
[123]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-bmg-5/igt@kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-onoff.html
[124]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-bmg-6/igt@kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-onoff.html
* igt@kms_hdr@brightness-with-hdr:
- shard-bmg: [SKIP][125] ([Intel XE#3544]) -> [SKIP][126] ([Intel XE#3374] / [Intel XE#3544])
[125]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-bmg-5/igt@kms_hdr@brightness-with-hdr.html
[126]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-bmg-4/igt@kms_hdr@brightness-with-hdr.html
* igt@xe_compute@ccs-mode-basic:
- shard-adlp: [SKIP][127] ([Intel XE#1447]) -> [SKIP][128] ([Intel XE#1447] / [Intel XE#5617])
[127]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-4/igt@xe_compute@ccs-mode-basic.html
[128]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@xe_compute@ccs-mode-basic.html
* igt@xe_module_load@force-load:
- shard-adlp: [SKIP][129] ([Intel XE#378]) -> [SKIP][130] ([Intel XE#378] / [Intel XE#5612])
[129]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-6/igt@xe_module_load@force-load.html
[130]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-6/igt@xe_module_load@force-load.html
* igt@xe_module_load@load:
- shard-adlp: ([PASS][131], [PASS][132], [PASS][133], [SKIP][134], [PASS][135], [PASS][136], [PASS][137], [PASS][138], [PASS][139], [PASS][140], [PASS][141], [PASS][142], [PASS][143], [PASS][144], [PASS][145], [PASS][146], [PASS][147], [PASS][148], [PASS][149], [PASS][150], [PASS][151], [PASS][152], [PASS][153], [PASS][154], [PASS][155], [PASS][156]) ([Intel XE#378]) -> ([PASS][157], [PASS][158], [PASS][159], [PASS][160], [PASS][161], [SKIP][162], [PASS][163], [PASS][164], [PASS][165], [PASS][166], [PASS][167], [PASS][168], [PASS][169], [PASS][170], [PASS][171], [PASS][172], [PASS][173], [PASS][174], [PASS][175], [PASS][176], [PASS][177], [PASS][178], [PASS][179], [PASS][180], [PASS][181], [PASS][182]) ([Intel XE#378] / [Intel XE#5612])
[131]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-6/igt@xe_module_load@load.html
[132]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-6/igt@xe_module_load@load.html
[133]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-6/igt@xe_module_load@load.html
[134]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-1/igt@xe_module_load@load.html
[135]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-3/igt@xe_module_load@load.html
[136]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-3/igt@xe_module_load@load.html
[137]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-3/igt@xe_module_load@load.html
[138]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-6/igt@xe_module_load@load.html
[139]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-1/igt@xe_module_load@load.html
[140]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-1/igt@xe_module_load@load.html
[141]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-3/igt@xe_module_load@load.html
[142]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-1/igt@xe_module_load@load.html
[143]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-9/igt@xe_module_load@load.html
[144]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-1/igt@xe_module_load@load.html
[145]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-9/igt@xe_module_load@load.html
[146]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-9/igt@xe_module_load@load.html
[147]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-8/igt@xe_module_load@load.html
[148]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-4/igt@xe_module_load@load.html
[149]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-4/igt@xe_module_load@load.html
[150]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-4/igt@xe_module_load@load.html
[151]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-4/igt@xe_module_load@load.html
[152]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-4/igt@xe_module_load@load.html
[153]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-8/igt@xe_module_load@load.html
[154]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-8/igt@xe_module_load@load.html
[155]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-8/igt@xe_module_load@load.html
[156]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-9/igt@xe_module_load@load.html
[157]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-2/igt@xe_module_load@load.html
[158]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-1/igt@xe_module_load@load.html
[159]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-8/igt@xe_module_load@load.html
[160]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-8/igt@xe_module_load@load.html
[161]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-8/igt@xe_module_load@load.html
[162]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-6/igt@xe_module_load@load.html
[163]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-6/igt@xe_module_load@load.html
[164]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-2/igt@xe_module_load@load.html
[165]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-2/igt@xe_module_load@load.html
[166]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-4/igt@xe_module_load@load.html
[167]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-4/igt@xe_module_load@load.html
[168]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-8/igt@xe_module_load@load.html
[169]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@xe_module_load@load.html
[170]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@xe_module_load@load.html
[171]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-2/igt@xe_module_load@load.html
[172]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-3/igt@xe_module_load@load.html
[173]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-1/igt@xe_module_load@load.html
[174]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-1/igt@xe_module_load@load.html
[175]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-4/igt@xe_module_load@load.html
[176]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-9/igt@xe_module_load@load.html
[177]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-9/igt@xe_module_load@load.html
[178]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-9/igt@xe_module_load@load.html
[179]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-9/igt@xe_module_load@load.html
[180]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-6/igt@xe_module_load@load.html
[181]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-6/igt@xe_module_load@load.html
[182]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-6/igt@xe_module_load@load.html
* igt@xe_noexec_ping_pong:
- shard-adlp: [SKIP][183] ([Intel XE#379]) -> [SKIP][184] ([Intel XE#379] / [Intel XE#5613])
[183]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-3/igt@xe_noexec_ping_pong.html
[184]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-9/igt@xe_noexec_ping_pong.html
* igt@xe_peer2peer@read:
- shard-dg2-set2: [FAIL][185] ([Intel XE#1173]) -> [SKIP][186] ([Intel XE#1061])
[185]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-dg2-433/igt@xe_peer2peer@read.html
[186]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-dg2-432/igt@xe_peer2peer@read.html
* igt@xe_pm@vram-d3cold-threshold:
- shard-adlp: [SKIP][187] ([Intel XE#579]) -> [SKIP][188] ([Intel XE#5611] / [Intel XE#579])
[187]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-3/igt@xe_pm@vram-d3cold-threshold.html
[188]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-8/igt@xe_pm@vram-d3cold-threshold.html
* igt@xe_render_copy@render-stress-4-copies:
- shard-adlp: [SKIP][189] ([Intel XE#4814]) -> [SKIP][190] ([Intel XE#4814] / [Intel XE#5614]) +2 other tests skip
[189]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3452-617f6e11e288a649addc9471911d29947c0996c8/shard-adlp-1/igt@xe_render_copy@render-stress-4-copies.html
[190]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/shard-adlp-6/igt@xe_render_copy@render-stress-4-copies.html
[Intel XE#1061]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1061
[Intel XE#1123]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1123
[Intel XE#1124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1124
[Intel XE#1125]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1125
[Intel XE#1173]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1173
[Intel XE#1178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1178
[Intel XE#1188]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1188
[Intel XE#1392]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1392
[Intel XE#1447]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1447
[Intel XE#1489]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1489
[Intel XE#1499]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1499
[Intel XE#1503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1503
[Intel XE#1727]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1727
[Intel XE#2049]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2049
[Intel XE#2142]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2142
[Intel XE#2168]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2168
[Intel XE#2291]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2291
[Intel XE#2293]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2293
[Intel XE#2311]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2311
[Intel XE#2312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2312
[Intel XE#2313]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2313
[Intel XE#2314]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2314
[Intel XE#2316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2316
[Intel XE#2321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2321
[Intel XE#2380]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2380
[Intel XE#2594]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2594
[Intel XE#2705]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2705
[Intel XE#2850]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2850
[Intel XE#288]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/288
[Intel XE#2894]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2894
[Intel XE#2953]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2953
[Intel XE#306]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/306
[Intel XE#308]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/308
[Intel XE#310]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/310
[Intel XE#3113]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3113
[Intel XE#3124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3124
[Intel XE#316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/316
[Intel XE#323]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/323
[Intel XE#330]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/330
[Intel XE#3309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3309
[Intel XE#3374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3374
[Intel XE#3544]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3544
[Intel XE#3573]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3573
[Intel XE#367]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/367
[Intel XE#373]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/373
[Intel XE#378]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/378
[Intel XE#379]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/379
[Intel XE#3862]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3862
[Intel XE#3876]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3876
[Intel XE#4173]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4173
[Intel XE#4212]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4212
[Intel XE#4345]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4345
[Intel XE#4351]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4351
[Intel XE#4494]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4494
[Intel XE#4543]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4543
[Intel XE#455]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/455
[Intel XE#4814]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4814
[Intel XE#4819]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4819
[Intel XE#4837]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4837
[Intel XE#488]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/488
[Intel XE#4915]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4915
[Intel XE#4943]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4943
[Intel XE#5020]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5020
[Intel XE#5354]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5354
[Intel XE#5390]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5390
[Intel XE#5401]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5401
[Intel XE#5560]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5560
[Intel XE#5561]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5561
[Intel XE#5563]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5563
[Intel XE#5565]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5565
[Intel XE#5574]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5574
[Intel XE#5575]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5575
[Intel XE#5607]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5607
[Intel XE#5611]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5611
[Intel XE#5612]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5612
[Intel XE#5613]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5613
[Intel XE#5614]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5614
[Intel XE#5617]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5617
[Intel XE#579]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/579
[Intel XE#616]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/616
[Intel XE#651]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/651
[Intel XE#653]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/653
[Intel XE#656]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/656
[Intel XE#688]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/688
[Intel XE#787]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/787
[Intel XE#870]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/870
[Intel XE#929]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/929
[Intel XE#944]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/944
[i915#3804]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3804
Build changes
-------------
* Linux: xe-3452-617f6e11e288a649addc9471911d29947c0996c8 -> xe-pw-146541v6
IGT_8470: ee326481fd4d17eba84fbc629f9e4a5def7dbd8f @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
xe-3452-617f6e11e288a649addc9471911d29947c0996c8: 617f6e11e288a649addc9471911d29947c0996c8
xe-pw-146541v6: 146541v6
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-146541v6/index.html
[-- Attachment #2: Type: text/html, Size: 56496 bytes --]
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v6 1/6] drm/xe/guc: Add log init config abi definitions
2025-07-22 1:35 ` [PATCH v6 1/6] drm/xe/guc: Add log init config abi definitions Zhanjun Dong
@ 2025-07-29 17:40 ` Michal Wajdeczko
2025-08-18 15:03 ` Dong, Zhanjun
2025-07-29 18:34 ` John Harrison
1 sibling, 1 reply; 30+ messages in thread
From: Michal Wajdeczko @ 2025-07-29 17:40 UTC (permalink / raw)
To: Zhanjun Dong, intel-xe
On 7/22/2025 3:35 AM, Zhanjun Dong wrote:
> Add GuC log init config (LIC) ABI definitions.
>
> Signed-off-by: Zhanjun Dong <zhanjun.dong@intel.com>
> ---
> drivers/gpu/drm/xe/abi/guc_lic_abi.h | 107 +++++++++++++++++++++++++++
> 1 file changed, 107 insertions(+)
> create mode 100644 drivers/gpu/drm/xe/abi/guc_lic_abi.h
>
> diff --git a/drivers/gpu/drm/xe/abi/guc_lic_abi.h b/drivers/gpu/drm/xe/abi/guc_lic_abi.h
> new file mode 100644
> index 000000000000..a4e27da304cd
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/abi/guc_lic_abi.h
> @@ -0,0 +1,107 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2025 Intel Corporation
> + */
> +
> +#ifndef _ABI_GUC_LIC_ABI_H_
> +#define _ABI_GUC_LIC_ABI_H_
> +
> +#include <linux/types.h>
> +
> +/** enum guc_lic_type - Log Init Config TLV IDs. */
> +enum guc_lic_type {
> + /**
> + * @GUC_LIC_TYPE_GUC_SW_VERSION: GuC firmware version. Value
> + * is a 32 bit number represented by guc_sw_version.
> + */
> + GUC_LIC_TYPE_GUC_SW_VERSION = 0x1,
> + /**
> + * @GUC_LIC_TYPE_GUC_DEVICE_ID: GuC device id. Value is a 32
> + * bit.
> + */
> + GUC_LIC_TYPE_GUC_DEVICE_ID = 0x2,
> + /**
> + * @GUC_LIC_TYPE_TSC_FREQUENCY: GuC timestamp counter
> + * frequency. Value is a 32 bit number representing frequency in
> + * kHz. This timestamp is utilized in log entries, timer and
> + * for engine utilization tracking.
> + */
> + GUC_LIC_TYPE_TSC_FREQUENCY = 0x3,
> + /**
> + * @GUC_LIC_TYPE_GMD_ID: HW GMD ID. Value is a 32 bit number
> + * representing graphics, media and display HW architecture IDs.
> + */
> + GUC_LIC_TYPE_GMD_ID = 0x4,
> + /**
> + * @GUC_LIC_TYPE_BUILD_PLATFORM_ID: GuC build platform ID.
> + * Value is 32 bits.
> + */
> + GUC_LIC_TYPE_BUILD_PLATFORM_ID = 0x5,
> +};
> +
> +/**
> + * struct guc_sw_version - This structure describes the full version of a
> + * software component.
> + */
> +struct guc_sw_version {
> + /** @dw0: A 32 bits dword, contains multiple bit fields */
> + u32 dw0;
> +#define GUC_SW_VERSION_PATCH_VERSION GENMASK(7, 0)
> +#define GUC_SW_VERSION_MINOR_VERSION GENMASK(15, 8)
> +#define GUC_SW_VERSION_MAJOR_VERSION GENMASK(23, 16)
> +#define GUC_SW_VERSION_BRANCH_ID GENMASK(31, 24)
in other places we start with MSB definitions first
> +} __packed;
> +
> +/**
> + * struct guc_lic_format_version - Log Init Config Structure Version.
*
> + * Major-Minor is not a fractional number (i.e. Ver 1.3 would be older
> + * than 1.12)
> + */
> +struct guc_lic_format_version {
> + /** @dw0: A 32 bits dword, contains multiple bit fields */
> + u32 dw0;
> + /*
> + * Log-Init-Config structure minor version. Must be
> + * GUC_LIC_FORMAT_VERSION_MASK_MINOR
you likely mean GUC_LIC_FORMAT_VERSION_MINOR here
and likely the guc_lic_format_version shall be defined first as all
other definitions depends on this being 1.0, right?
> + */
> +#define GUC_LIC_FORMAT_VERSION_MASK_MINOR GENMASK(15, 0)
> + /*
> + * Log-Init-Config structure major version. Must be
> + * GUC_LIC_FORMAT_VERSION_MASK_MAJOR
GUC_LIC_FORMAT_VERSION_MAJOR
> + */
> +#define GUC_LIC_FORMAT_VERSION_MASK_MAJOR GENMASK(31, 16)
again, start with MSB first
> +} __packed;
> +
> +/**
> + * struct guc_lic - GuC lic (Log-Init-Config) structure.
s/GuC lic/GuC LIC
*
> + * This is populated by the GUC at log init time and is located in the log
> + * buffer as per the Log Buffer Layout (In Memory). The array of guc log
> + * buffer states plus this structure must not exceed 4KB
> + */
> +struct guc_lic {
> + /**
> + * @magic: A magic number set by GuC to identify that this
> + * structure contains valid information: magic = GUC_LIC_MAGIC.
> + * Used to verify the information in this structure is valid.
hmm, last sentence is redundant, please rephrase
> + */
> + u32 magic;
> +#define GUC_LIC_MAGIC 0x8086900D
> +
> + /**
> + * @version: The version of the this structure. Represented by
> + * guc_lic_format_version
> + */
> + struct guc_lic_format_version version;
> +#define GUC_LIC_FORMAT_VERSION_MAJOR 1u
> +#define GUC_LIC_FORMAT_VERSION_MINOR 0u
those defs should be closer to struct guc_lic_format_version
where they are already referenced in description
> +
> + /** @dw_size: Number of Dws the `data` array contains. */
s/Dws/DWs or DWORDs or dwords but not Dws
> + u32 dw_size;
hmm, still dw_size name is suggesting something else...
maybe "@data_size: Number of dwords in the @data array"
or data_count or data_len
> + /**
> + * @data: Array of dwords representing a list of LIC KLVs of
> + * type guc_klv_generic with keys represented by guc_lic_type
> + */
> + u32 data[] __counted_by(dw_size);
> +} __packed;
> +
> +#endif
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v6 2/6] drm/xe/guc: Add LFD related abi definitions
2025-07-22 1:35 ` [PATCH v6 2/6] drm/xe/guc: Add LFD related " Zhanjun Dong
@ 2025-07-29 18:07 ` Michal Wajdeczko
2025-08-20 20:43 ` Dong, Zhanjun
2025-07-29 19:08 ` John Harrison
1 sibling, 1 reply; 30+ messages in thread
From: Michal Wajdeczko @ 2025-07-29 18:07 UTC (permalink / raw)
To: Zhanjun Dong, intel-xe
On 7/22/2025 3:35 AM, Zhanjun Dong wrote:
> Add GuC LFD (Log Format Descriptors) related ABI definitions.
>
> Signed-off-by: Zhanjun Dong <zhanjun.dong@intel.com>
> ---
> drivers/gpu/drm/xe/abi/guc_lfd_abi.h | 282 +++++++++++++++++++++++++++
> 1 file changed, 282 insertions(+)
> create mode 100644 drivers/gpu/drm/xe/abi/guc_lfd_abi.h
>
> diff --git a/drivers/gpu/drm/xe/abi/guc_lfd_abi.h b/drivers/gpu/drm/xe/abi/guc_lfd_abi.h
> new file mode 100644
> index 000000000000..b6888ab47e25
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/abi/guc_lfd_abi.h
> @@ -0,0 +1,282 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2025 Intel Corporation
> + */
> +
> +#ifndef _ABI_GUC_LFD_ABI_H_
> +#define _ABI_GUC_LFD_ABI_H_
> +
> +#include <linux/types.h>
> +
> +#include "guc_lic_abi.h"
> +
> +/* Magic keys define */
> +#define GUC_LFD_DRIVER_KEY_STREAMING 0x8086AAAA474C5346
> +#define GUC_LFD_LOG_BUFFER_MARKER_2 0xDEADFEED
> +#define GUC_LFD_CRASH_DUMP_BUFFER_MARKER_2 0x8086DEAD
> +#define GUC_LFD_STATE_CAPTURE_BUFFER_MARKER_2 0xBEEFFEED
> +#define GUC_LFD_LOG_BUFFER_MARKER_1V2 0xCABBA9E6
> +#define GUC_LFD_STATE_CAPTURE_BUFFER_MARKER_1V2 0xCABBA9F7
> +#define GUC_LFD_DATA_HEADER_MAGIC 0x8086
> +
> +/* The current major version of GuC-Log-File format. */
> +#define GUC_LFD_FORMAT_VERSION_MAJOR 0x0001
> +/* The current minor version of GuC-Log-File format. */
> +#define GUC_LFD_FORMAT_VERSION_MINOR 0x0000
> +
> +/** enum guc_lfd_type - Log format descriptor type */
> +enum guc_lfd_type {
> + /**
> + * @GUC_LFD_TYPE_FW_REQUIRED_RANGE_START: Start of range for
> + * required LFDs from GuC
> + */
> + GUC_LFD_TYPE_FW_REQUIRED_RANGE_START = 0x1,
> + /**
> + * @GUC_LFD_TYPE_FW_VERSION: GuC Firmware Version structure. LFDs
> + * payload is guc_lfd_data_fw_version
hmm, if this type identifies specific lfd payload, why it uses a lic type?
if both types has to match, say that, and add static_assert to check that somewhere
(edit: or maybe those lfd specific structures are simply redundant, and
you can directly say here that payload is that lic or other struct)
> + */
> + GUC_LFD_TYPE_FW_VERSION = GUC_LIC_TYPE_GUC_SW_VERSION,
> + /**
> + * @GUC_LFD_TYPE_GUC_DEVICE_ID: GuC microcontroller device ID.
> + * LFDs payload is guc_lfd_data_guc_devid
> + */
> + GUC_LFD_TYPE_GUC_DEVICE_ID = GUC_LIC_TYPE_GUC_DEVICE_ID,
> + /**
> + * @GUC_LFD_TYPE_TSC_FREQUENCY: Frequency of GuC timestamps. LFDs
> + * payload is guc_lfd_data_tsc_freq
> + */
> + GUC_LFD_TYPE_TSC_FREQUENCY = GUC_LIC_TYPE_TSC_FREQUENCY,
> + /**
> + * @GUC_LFD_TYPE_GMD_ID: HW GMD ID. LFDs payload is
> + * guc_lfd_data_gmdid
> + */
> + GUC_LFD_TYPE_GMD_ID = GUC_LIC_TYPE_GMD_ID,
> + /**
> + * @GUC_LFD_TYPE_BUILD_PLATFORM_ID: GuC build platform ID. LFDs
> + * payload is guc_lfd_data_build_platformid
> + */
> + GUC_LFD_TYPE_BUILD_PLATFORM_ID = GUC_LIC_TYPE_BUILD_PLATFORM_ID,
> + /** @GUC_LFD_TYPE_FW_REQUIRED_RANGE_END: End of this range */
"End of this range" is repeated few times below, make it unique per enum
> + GUC_LFD_TYPE_FW_REQUIRED_RANGE_END = 0x1FFF,
> + /**
> + * @GUC_LFD_TYPE_FW_OPTIONAL_RANGE_START: Start of range for
> + * required LFDs from GuC
> + */
> + GUC_LFD_TYPE_FW_OPTIONAL_RANGE_START = 0x2000,
> + /**
> + * @GUC_LFD_TYPE_LOG_EVENTS_BUFFER: Log-event-entries buffer. LFDs
> + * payload is guc_lfd_data_log_events_buf
> + */
> + GUC_LFD_TYPE_LOG_EVENTS_BUFFER = 0x2000,
> + /**
> + * @GUC_LFD_TYPE_FW_CRASH_DUMP: GuC generated crash-dump blob.
> + * LFDs payload is guc_lfd_data_fw_crashdump
> + */
> + GUC_LFD_TYPE_FW_CRASH_DUMP = 0x2001,
> + /** @GUC_LFD_TYPE_FW_OPTIONAL_RANGE_END: End of this range */
> + GUC_LFD_TYPE_FW_OPTIONAL_RANGE_END = 0x3FFF,
> + /**
> + * @GUC_LFD_TYPE_KMD_REQUIRED_RANGE_START: Start of range for
> + * required KMD LFDs
> + */
> + GUC_LFD_TYPE_KMD_REQUIRED_RANGE_START = 0x4000,
> + /**
> + * @GUC_LFD_TYPE_OS_ID: An identifier for the OS. LFDs payload is
> + * guc_lfd_data_os_id
> + */
> + GUC_LFD_TYPE_OS_ID = 0x4000,
> + /** @GUC_LFD_TYPE_KMD_REQUIRED_RANGE_END: End of this range */
> + GUC_LFD_TYPE_KMD_REQUIRED_RANGE_END = 0x5FFF,
> + /**
> + * @GUC_LFD_TYPE_KMD_OPTIONAL_RANGE_START: Start of range for
> + * optional KMD LFDs
> + */
> + GUC_LFD_TYPE_KMD_OPTIONAL_RANGE_START = 0x6000,
> + /**
> + * @GUC_LFD_TYPE_BINARY_SCHEMA_FORMAT: Binary representation of
> + * GuC log-events schema. LFDs TLV payload is
> + * guc_lfd_data_binary_schema
> + */
> + GUC_LFD_TYPE_BINARY_SCHEMA_FORMAT = 0x6000,
> + /**
> + * @GUC_LFD_TYPE_HOST_COMMENT: ASCII string containing comments
> + * from the host/KMD. LFDs TLV payload is
> + * guc_lfd_data_host_comment
> + */
> + GUC_LFD_TYPE_HOST_COMMENT = 0x6001,
> + /** @GUC_LFD_TYPE_KMD_OPTIONAL_RANGE_END: End of this range */
> + GUC_LFD_TYPE_KMD_OPTIONAL_RANGE_END = 0x7FFF,
> + /** @GUC_LFD_TYPE_RESERVED_RANGE_START: Start of reserved range */
> + GUC_LFD_TYPE_RESERVED_RANGE_START = 0x8000,
> + /** @GUC_LFD_TYPE_RESERVED_RANGE_END: End of this range */
> + GUC_LFD_TYPE_RESERVED_RANGE_END = 0xFFFF,
> +};
> +
> +/** enum guc_lfd_os_type - OS Type LFD-ID */
> +enum guc_lfd_os_type {
> + /** @GUC_LFD_OS_TYPE_OSID_WIN: Windows OS */
> + GUC_LFD_OS_TYPE_OSID_WIN = 0x1,
> + /** @GUC_LFD_OS_TYPE_OSID_LIN: Linux OS */
> + GUC_LFD_OS_TYPE_OSID_LIN = 0x2,
> + /** @GUC_LFD_OS_TYPE_OSID_VMW: VMWare OS */
> + GUC_LFD_OS_TYPE_OSID_VMW = 0x3,
> + /** @GUC_LFD_OS_TYPE_OSID_OTHER: Other */
> + GUC_LFD_OS_TYPE_OSID_OTHER = 0x4,
> +};
> +
> +/**
> + * struct guc_lfd_data - Log format descriptor (LFD).
> + * A type of KLV with custom field-sizes + magic numbers.
> + */
> +struct guc_lfd_data {
> + /** @dw0: A 32 bits dword, contains multiple bit fields */
> + u32 dw0;
> + /*
> + * Expected value: GUC_LFD_DATA_HEADER_MAGIC.
> + * Helpful in detecting file errors.
> + */
> +#define GUC_LFD_DATA_MAGIC GENMASK(15, 0)
> + /*
> + * File descriptor type (the 'T' in TLV) is used to identify how
> + * to interpret `data` below. For the range of types, see
> + * guc_lfd_type
> + */
> +#define GUC_LFD_DATA_DESC_TYPE GENMASK(31, 16)
> + /** @dw_size: Number of dwords the `data` field contains. */
> + u32 dw_size;
> + /** @data: Data defined by File descriptor type. */
> + u32 data[] __counted_by(dw_size);
> +} __packed;
> +
> +/**
> + * struct guc_lfd_version - GuC Log File Format Version.
> + * Major-Minor is not a fractional number (i.e. Ver 1.3 would be older
> + * than 1.12)
> + */
> +struct guc_lfd_version {
> + /** @dw0: A 32 bits dword, contains multiple bit fields */
> + u32 dw0;
> + /*
> + * Guc-Log-File Format minor version. Must be
> + * GUC_LOG_FILE_FORMAT_VERSION_MINOR
> + */
> +#define GUC_LFD_VERSION_MINOR GENMASK(15, 0)
> + /*
> + * Guc-Log-File Format major version. Must be
> + * GUC_LOG_FILE_FORMAT_VERSION_MAJOR
> + */
> +#define GUC_LFD_VERSION_MAJOR GENMASK(31, 16)
very easy to confuse with
#define GUC_LFD_FORMAT_VERSION_MAJOR
#define GUC_LFD_FORMAT_VERSION_MINOR
maybe there should be:
GUC_LFD_VERSION_DW0_MASK_MAJOR GENMASK()
GUC_LFD_VERSION_DW0_MASK_MINOR GENMASK()
and
GUC_LFD_VERSION_MAJOR 1u
GUC_LFD_VERSION_MINOR 0u
> +} __packed;
> +
> +/**
> + * struct guc_lfd_data_guc_devid - GuC Device ID.
> + * This is mandatory fw LFD data
> + */
> +struct guc_lfd_data_guc_devid {
> + /**
> + * @guc_devid: GuC microcontroller device ID defined as described
> + * in GUC_LIC_TYPE_GUC_DEVICE_ID
> + */
> + u32 guc_devid;
> +} __packed;
> +
> +/**
> + * struct guc_lfd_data_tsc_freq - GuC TSC Fequency.
> + * This is mandatory fw LFD data
> + */
> +struct guc_lfd_data_tsc_freq {
> + /**
> + * @tsc_freq: GuC timestamp counter frequency as described in
> + * GUC_LIC_TYPE_TSC_FREQUENCY
> + */
> + u32 tsc_freq;
> +} __packed;
> +
> +/** struct guc_lfd_data_gmdid - GMD ID. */
> +struct guc_lfd_data_gmdid {
> + /** @gmd_id: GMD ID as described in GUC_LIC_TYPE_GMD_ID */
> + u32 gmd_id;
> +} __packed;
> +
> +/** struct guc_lfd_data_build_platformid - GuC build platform ID. */
> +struct guc_lfd_data_build_platformid {
> + /**
> + * @platform_build_id: GuC build platform ID as described in
> + * GUC_LIC_TYPE_BUILD_PLATFORM_ID
> + */
> + u32 platform_build_id;
> +} __packed;
> +
> +/**
> + * struct guc_lfd_data_log_events_buf - GuC Log Events Buffer.
> + * This is optional fw LFD data
> + */
> +struct guc_lfd_data_log_events_buf {
> + /**
> + * @log_events_format_version: version of GuC log format of buffer
> + */
> + u32 log_events_format_version;
need defines for VER_1 and VER_2
> + /**
> + * @log_format_buf: If `log_format_version` == 1, array of
> + * guc_log_format_version_1. If `log_format_version` == 2, array
> + * of guc_log_format_version_2. Dword size determined by
> + * guc_logfile_lfd.`desc_dw_size` - 1
> + */
> + u32 log_format_buf[];
> +} __packed;
> +
> +/**
> + * struct guc_lfd_data_os_info - OS Version Information.
> + * This is mandatory host LFD data
btw, why is it mandatory?
> + */
> +struct guc_lfd_data_os_info {
> + /**
> + * @os_id: enum values to identify the OS brand (1=Windows,
> + * 2=Linux, etc..). See guc_lfd_os_type for the range of types
> + */
> + u32 os_id;
> + /**
> + * @build_version: ASCII string containing OS build version
> + * information based on os_id. String is padded with null
> + * characters to ensure its DWORD aligned. Dword size determined
> + * by guc_logfile_lfd.`desc_dw_size` - 1
> + */
> + char build_version[];
> +} __packed;
> +
> +/**
> + * struct guc_lfd_data_fw_version - GuC FW Version.
> + * This is mandatory fw LFD data
> + */
> +struct guc_lfd_data_fw_version {
> + /**
> + * @guc_sw_version: The full version of the GuC microkernel that
> + * generated the logs as described in
> + * GUC_LIC_TYPE_GUC_SW_VERSION.
> + */
> + struct guc_sw_version guc_sw_version;
> +} __packed;
> +
> +/**
> + * struct guc_logfile_header - Header of GuC Log Streaming-LFD-File Format.
> + * This structure encapsulates the layout of the guc-log-file format
> + */
> +struct guc_lfd_file_header {
> + /**
> + * @magic: A magic number set by producer of a GuC log file to
> + * identify that file is a valid guc-log-file containing a stream
> + * of LFDs: Expected value: GUC_LFD_DRIVER_KEY_STREAMING
> + */
> + u64 magic;
> + /**
> + * @version: Version of this file format layout as per
> + * guc_lfd_version
> + */
> + struct guc_lfd_version version;
> + /**
> + * @lfd_stream: A stream of one or more guc_lfd_data LFD data
> + */
> + struct guc_lfd_data lfd_stream;
no need to repeat lfd from struct name in field name
s/lfd_stream/stream
> +} __packed;
> +
> +#endif
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v6 1/6] drm/xe/guc: Add log init config abi definitions
2025-07-22 1:35 ` [PATCH v6 1/6] drm/xe/guc: Add log init config abi definitions Zhanjun Dong
2025-07-29 17:40 ` Michal Wajdeczko
@ 2025-07-29 18:34 ` John Harrison
2025-08-18 15:03 ` Dong, Zhanjun
1 sibling, 1 reply; 30+ messages in thread
From: John Harrison @ 2025-07-29 18:34 UTC (permalink / raw)
To: Zhanjun Dong, intel-xe
On 7/21/2025 6:35 PM, Zhanjun Dong wrote:
> Add GuC log init config (LIC) ABI definitions.
>
> Signed-off-by: Zhanjun Dong <zhanjun.dong@intel.com>
> ---
> drivers/gpu/drm/xe/abi/guc_lic_abi.h | 107 +++++++++++++++++++++++++++
> 1 file changed, 107 insertions(+)
> create mode 100644 drivers/gpu/drm/xe/abi/guc_lic_abi.h
>
> diff --git a/drivers/gpu/drm/xe/abi/guc_lic_abi.h b/drivers/gpu/drm/xe/abi/guc_lic_abi.h
> new file mode 100644
> index 000000000000..a4e27da304cd
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/abi/guc_lic_abi.h
> @@ -0,0 +1,107 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2025 Intel Corporation
> + */
> +
> +#ifndef _ABI_GUC_LIC_ABI_H_
> +#define _ABI_GUC_LIC_ABI_H_
> +
> +#include <linux/types.h>
> +
> +/** enum guc_lic_type - Log Init Config TLV IDs. */
We use KLV in the Xe driver not TLV.
> +enum guc_lic_type {
> + /**
> + * @GUC_LIC_TYPE_GUC_SW_VERSION: GuC firmware version. Value
> + * is a 32 bit number represented by guc_sw_version.
> + */
> + GUC_LIC_TYPE_GUC_SW_VERSION = 0x1,
> + /**
> + * @GUC_LIC_TYPE_GUC_DEVICE_ID: GuC device id. Value is a 32
> + * bit.
> + */
> + GUC_LIC_TYPE_GUC_DEVICE_ID = 0x2,
> + /**
> + * @GUC_LIC_TYPE_TSC_FREQUENCY: GuC timestamp counter
> + * frequency. Value is a 32 bit number representing frequency in
> + * kHz. This timestamp is utilized in log entries, timer and
> + * for engine utilization tracking.
> + */
> + GUC_LIC_TYPE_TSC_FREQUENCY = 0x3,
> + /**
> + * @GUC_LIC_TYPE_GMD_ID: HW GMD ID. Value is a 32 bit number
> + * representing graphics, media and display HW architecture IDs.
> + */
> + GUC_LIC_TYPE_GMD_ID = 0x4,
> + /**
> + * @GUC_LIC_TYPE_BUILD_PLATFORM_ID: GuC build platform ID.
> + * Value is 32 bits.
> + */
> + GUC_LIC_TYPE_BUILD_PLATFORM_ID = 0x5,
> +};
> +
> +/**
> + * struct guc_sw_version - This structure describes the full version of a
> + * software component.
> + */
> +struct guc_sw_version {
> + /** @dw0: A 32 bits dword, contains multiple bit fields */
> + u32 dw0;
> +#define GUC_SW_VERSION_PATCH_VERSION GENMASK(7, 0)
> +#define GUC_SW_VERSION_MINOR_VERSION GENMASK(15, 8)
> +#define GUC_SW_VERSION_MAJOR_VERSION GENMASK(23, 16)
> +#define GUC_SW_VERSION_BRANCH_ID GENMASK(31, 24)
> +} __packed;
Is there any point in having this defined as a structure? Elsewhere we
just have a u32 in the parent structure and the bitmask definitions for
access. Given that this doesn't even have a parent structure, it is just
the data field of a KLV, it makes even less sense to have a structure
defined for it.
> +
> +/**
> + * struct guc_lic_format_version - Log Init Config Structure Version.
> + * Major-Minor is not a fractional number (i.e. Ver 1.3 would be older
> + * than 1.12)
> + */
> +struct guc_lic_format_version {
> + /** @dw0: A 32 bits dword, contains multiple bit fields */
> + u32 dw0;
> + /*
> + * Log-Init-Config structure minor version. Must be
> + * GUC_LIC_FORMAT_VERSION_MASK_MINOR
> + */
> +#define GUC_LIC_FORMAT_VERSION_MASK_MINOR GENMASK(15, 0)
> + /*
> + * Log-Init-Config structure major version. Must be
> + * GUC_LIC_FORMAT_VERSION_MASK_MAJOR
> + */
> +#define GUC_LIC_FORMAT_VERSION_MASK_MAJOR GENMASK(31, 16)
> +} __packed;
Again, why bother with a structure containing a single dword. Just use a
u32 in the parent structure.
> +
> +/**
> + * struct guc_lic - GuC lic (Log-Init-Config) structure.
> + * This is populated by the GUC at log init time and is located in the log
> + * buffer as per the Log Buffer Layout (In Memory). The array of guc log
> + * buffer states plus this structure must not exceed 4KB
The last sentence is an instruction for the GuC firmware implementation
people. And the 'as per ...' is a reference to another section in the
spec that you do not have access to in this header file. I would just
stop with 'is located in the log buffer memory allocation'.
John.
> + */
> +struct guc_lic {
> + /**
> + * @magic: A magic number set by GuC to identify that this
> + * structure contains valid information: magic = GUC_LIC_MAGIC.
> + * Used to verify the information in this structure is valid.
> + */
> + u32 magic;
> +#define GUC_LIC_MAGIC 0x8086900D
> +
> + /**
> + * @version: The version of the this structure. Represented by
> + * guc_lic_format_version
> + */
> + struct guc_lic_format_version version;
> +#define GUC_LIC_FORMAT_VERSION_MAJOR 1u
> +#define GUC_LIC_FORMAT_VERSION_MINOR 0u
> +
> + /** @dw_size: Number of Dws the `data` array contains. */
> + u32 dw_size;
> + /**
> + * @data: Array of dwords representing a list of LIC KLVs of
> + * type guc_klv_generic with keys represented by guc_lic_type
> + */
> + u32 data[] __counted_by(dw_size);
> +} __packed;
> +
> +#endif
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v6 2/6] drm/xe/guc: Add LFD related abi definitions
2025-07-22 1:35 ` [PATCH v6 2/6] drm/xe/guc: Add LFD related " Zhanjun Dong
2025-07-29 18:07 ` Michal Wajdeczko
@ 2025-07-29 19:08 ` John Harrison
2025-08-20 20:52 ` Dong, Zhanjun
1 sibling, 1 reply; 30+ messages in thread
From: John Harrison @ 2025-07-29 19:08 UTC (permalink / raw)
To: Zhanjun Dong, intel-xe
On 7/21/2025 6:35 PM, Zhanjun Dong wrote:
> Add GuC LFD (Log Format Descriptors) related ABI definitions.
>
> Signed-off-by: Zhanjun Dong <zhanjun.dong@intel.com>
> ---
> drivers/gpu/drm/xe/abi/guc_lfd_abi.h | 282 +++++++++++++++++++++++++++
> 1 file changed, 282 insertions(+)
> create mode 100644 drivers/gpu/drm/xe/abi/guc_lfd_abi.h
>
> diff --git a/drivers/gpu/drm/xe/abi/guc_lfd_abi.h b/drivers/gpu/drm/xe/abi/guc_lfd_abi.h
> new file mode 100644
> index 000000000000..b6888ab47e25
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/abi/guc_lfd_abi.h
> @@ -0,0 +1,282 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2025 Intel Corporation
> + */
> +
> +#ifndef _ABI_GUC_LFD_ABI_H_
> +#define _ABI_GUC_LFD_ABI_H_
> +
> +#include <linux/types.h>
> +
> +#include "guc_lic_abi.h"
> +
> +/* Magic keys define */
> +#define GUC_LFD_DRIVER_KEY_STREAMING 0x8086AAAA474C5346
> +#define GUC_LFD_LOG_BUFFER_MARKER_2 0xDEADFEED
> +#define GUC_LFD_CRASH_DUMP_BUFFER_MARKER_2 0x8086DEAD
> +#define GUC_LFD_STATE_CAPTURE_BUFFER_MARKER_2 0xBEEFFEED
> +#define GUC_LFD_LOG_BUFFER_MARKER_1V2 0xCABBA9E6
> +#define GUC_LFD_STATE_CAPTURE_BUFFER_MARKER_1V2 0xCABBA9F7
> +#define GUC_LFD_DATA_HEADER_MAGIC 0x8086
These are not LFD defines. They are the in-memory buffer header magic words.
> +
> +/* The current major version of GuC-Log-File format. */
> +#define GUC_LFD_FORMAT_VERSION_MAJOR 0x0001
> +/* The current minor version of GuC-Log-File format. */
> +#define GUC_LFD_FORMAT_VERSION_MINOR 0x0000
> +
> +/** enum guc_lfd_type - Log format descriptor type */
> +enum guc_lfd_type {
> + /**
> + * @GUC_LFD_TYPE_FW_REQUIRED_RANGE_START: Start of range for
> + * required LFDs from GuC
> + */
> + GUC_LFD_TYPE_FW_REQUIRED_RANGE_START = 0x1,
> + /**
> + * @GUC_LFD_TYPE_FW_VERSION: GuC Firmware Version structure. LFDs
> + * payload is guc_lfd_data_fw_version
> + */
> + GUC_LFD_TYPE_FW_VERSION = GUC_LIC_TYPE_GUC_SW_VERSION,
This equality is coincidental not a definition. Indeed, the original
spec had different numbering for the two enums. It only change to match
due to an implementation bug! So you should not define them as being
related and should not make any assumptions in the code about them being
related.
> + /**
> + * @GUC_LFD_TYPE_GUC_DEVICE_ID: GuC microcontroller device ID.
> + * LFDs payload is guc_lfd_data_guc_devid
> + */
> + GUC_LFD_TYPE_GUC_DEVICE_ID = GUC_LIC_TYPE_GUC_DEVICE_ID,
> + /**
> + * @GUC_LFD_TYPE_TSC_FREQUENCY: Frequency of GuC timestamps. LFDs
> + * payload is guc_lfd_data_tsc_freq
> + */
> + GUC_LFD_TYPE_TSC_FREQUENCY = GUC_LIC_TYPE_TSC_FREQUENCY,
> + /**
> + * @GUC_LFD_TYPE_GMD_ID: HW GMD ID. LFDs payload is
> + * guc_lfd_data_gmdid
> + */
> + GUC_LFD_TYPE_GMD_ID = GUC_LIC_TYPE_GMD_ID,
> + /**
> + * @GUC_LFD_TYPE_BUILD_PLATFORM_ID: GuC build platform ID. LFDs
> + * payload is guc_lfd_data_build_platformid
> + */
> + GUC_LFD_TYPE_BUILD_PLATFORM_ID = GUC_LIC_TYPE_BUILD_PLATFORM_ID,
> + /** @GUC_LFD_TYPE_FW_REQUIRED_RANGE_END: End of this range */
> + GUC_LFD_TYPE_FW_REQUIRED_RANGE_END = 0x1FFF,
> + /**
> + * @GUC_LFD_TYPE_FW_OPTIONAL_RANGE_START: Start of range for
> + * required LFDs from GuC
> + */
> + GUC_LFD_TYPE_FW_OPTIONAL_RANGE_START = 0x2000,
> + /**
> + * @GUC_LFD_TYPE_LOG_EVENTS_BUFFER: Log-event-entries buffer. LFDs
> + * payload is guc_lfd_data_log_events_buf
> + */
> + GUC_LFD_TYPE_LOG_EVENTS_BUFFER = 0x2000,
> + /**
> + * @GUC_LFD_TYPE_FW_CRASH_DUMP: GuC generated crash-dump blob.
> + * LFDs payload is guc_lfd_data_fw_crashdump
> + */
> + GUC_LFD_TYPE_FW_CRASH_DUMP = 0x2001,
> + /** @GUC_LFD_TYPE_FW_OPTIONAL_RANGE_END: End of this range */
> + GUC_LFD_TYPE_FW_OPTIONAL_RANGE_END = 0x3FFF,
> + /**
> + * @GUC_LFD_TYPE_KMD_REQUIRED_RANGE_START: Start of range for
> + * required KMD LFDs
> + */
> + GUC_LFD_TYPE_KMD_REQUIRED_RANGE_START = 0x4000,
> + /**
> + * @GUC_LFD_TYPE_OS_ID: An identifier for the OS. LFDs payload is
> + * guc_lfd_data_os_id
> + */
> + GUC_LFD_TYPE_OS_ID = 0x4000,
> + /** @GUC_LFD_TYPE_KMD_REQUIRED_RANGE_END: End of this range */
> + GUC_LFD_TYPE_KMD_REQUIRED_RANGE_END = 0x5FFF,
> + /**
> + * @GUC_LFD_TYPE_KMD_OPTIONAL_RANGE_START: Start of range for
> + * optional KMD LFDs
> + */
> + GUC_LFD_TYPE_KMD_OPTIONAL_RANGE_START = 0x6000,
> + /**
> + * @GUC_LFD_TYPE_BINARY_SCHEMA_FORMAT: Binary representation of
> + * GuC log-events schema. LFDs TLV payload is
> + * guc_lfd_data_binary_schema
> + */
> + GUC_LFD_TYPE_BINARY_SCHEMA_FORMAT = 0x6000,
> + /**
> + * @GUC_LFD_TYPE_HOST_COMMENT: ASCII string containing comments
> + * from the host/KMD. LFDs TLV payload is
> + * guc_lfd_data_host_comment
> + */
> + GUC_LFD_TYPE_HOST_COMMENT = 0x6001,
> + /** @GUC_LFD_TYPE_KMD_OPTIONAL_RANGE_END: End of this range */
> + GUC_LFD_TYPE_KMD_OPTIONAL_RANGE_END = 0x7FFF,
> + /** @GUC_LFD_TYPE_RESERVED_RANGE_START: Start of reserved range */
> + GUC_LFD_TYPE_RESERVED_RANGE_START = 0x8000,
> + /** @GUC_LFD_TYPE_RESERVED_RANGE_END: End of this range */
> + GUC_LFD_TYPE_RESERVED_RANGE_END = 0xFFFF,
> +};
Personally, I find the above impossible to read at a glance. The
comments add nothing - GUC_LFD_TYPE_KMD_REQUIRED_RANGE_START is
described as "Start of range for required KMD LFDs". Well, yeah, I can
get that from the name. I think this whole section would be much easier
to read if was just the enums:
+ GUC_LFD_TYPE_KMD_REQUIRED_RANGE_START = 0x4000,
+ GUC_LFD_TYPE_OS_ID = 0x4000,
+ GUC_LFD_TYPE_KMD_REQUIRED_RANGE_END = 0x5FFF,
The structure definitions and such for the individual entries can refer
back to the define they are associated with. But this section would be
more use if it is a simple list of enum values that is quick and easy to
scan through.
> +
> +/** enum guc_lfd_os_type - OS Type LFD-ID */
> +enum guc_lfd_os_type {
> + /** @GUC_LFD_OS_TYPE_OSID_WIN: Windows OS */
> + GUC_LFD_OS_TYPE_OSID_WIN = 0x1,
> + /** @GUC_LFD_OS_TYPE_OSID_LIN: Linux OS */
> + GUC_LFD_OS_TYPE_OSID_LIN = 0x2,
> + /** @GUC_LFD_OS_TYPE_OSID_VMW: VMWare OS */
> + GUC_LFD_OS_TYPE_OSID_VMW = 0x3,
> + /** @GUC_LFD_OS_TYPE_OSID_OTHER: Other */
> + GUC_LFD_OS_TYPE_OSID_OTHER = 0x4,
> +};
> +
> +/**
> + * struct guc_lfd_data - Log format descriptor (LFD).
> + * A type of KLV with custom field-sizes + magic numbers.
This description tells me nothing that I can't immediately see from
looking at the contents. Maybe just say "A generic header structure for
all LFD blocks".
> + */
> +struct guc_lfd_data {
> + /** @dw0: A 32 bits dword, contains multiple bit fields */
> + u32 dw0;
'header' would be better than 'dw0'.
> + /*
> + * Expected value: GUC_LFD_DATA_HEADER_MAGIC.
> + * Helpful in detecting file errors.
Why 'expected value'? Indeed, I don't think this comment is worth having
at all.
> + */
> +#define GUC_LFD_DATA_MAGIC GENMASK(15, 0)
Calling this 'DATA_MAGIC' implies it is related to the 'data' field
below. Assuming that 'dw0' is renamed to 'header' then this shld be
'GUC_LFD_HEADER_MAGIC'.
> + /*
> + * File descriptor type (the 'T' in TLV) is used to identify how
> + * to interpret `data` below. For the range of types, see
> + * guc_lfd_type
Again, this is a redundant comment. Also, the KMD uses KLV not TLV.
> + */
> +#define GUC_LFD_DATA_DESC_TYPE GENMASK(31, 16)
Again, GUC_LFD_HEADER_TYPE would be a better name.
> + /** @dw_size: Number of dwords the `data` field contains. */
> + u32 dw_size;
data_size
> + /** @data: Data defined by File descriptor type. */
Defined by GUC_LFD_HEADER_TYPE.
> + u32 data[] __counted_by(dw_size);
> +} __packed;
> +
> +/**
> + * struct guc_lfd_version - GuC Log File Format Version.
LFD is Log File Descriptor not Log File Format.
> + * Major-Minor is not a fractional number (i.e. Ver 1.3 would be older
> + * than 1.12)
> + */
> +struct guc_lfd_version {
> + /** @dw0: A 32 bits dword, contains multiple bit fields */
> + u32 dw0;
> + /*
> + * Guc-Log-File Format minor version. Must be
> + * GUC_LOG_FILE_FORMAT_VERSION_MINOR
> + */
> +#define GUC_LFD_VERSION_MINOR GENMASK(15, 0)
> + /*
> + * Guc-Log-File Format major version. Must be
> + * GUC_LOG_FILE_FORMAT_VERSION_MAJOR
> + */
> +#define GUC_LFD_VERSION_MAJOR GENMASK(31, 16)
> +} __packed;
Again, no point in having a structure defined for a single u32. Just the
bit field definitions is all we need.
> +
> +/**
> + * struct guc_lfd_data_guc_devid - GuC Device ID.
> + * This is mandatory fw LFD data
"fw" meaning firmware? But this is the LFD as created entirely by the
KMD, the firmware is not involved. Should just say "This is a mandatory
LFD block."
> + */
> +struct guc_lfd_data_guc_devid {
> + /**
> + * @guc_devid: GuC microcontroller device ID defined as described
> + * in GUC_LIC_TYPE_GUC_DEVICE_ID
> + */
> + u32 guc_devid;
> +} __packed;
> +
> +/**
> + * struct guc_lfd_data_tsc_freq - GuC TSC Fequency.
> + * This is mandatory fw LFD data
> + */
> +struct guc_lfd_data_tsc_freq {
> + /**
> + * @tsc_freq: GuC timestamp counter frequency as described in
> + * GUC_LIC_TYPE_TSC_FREQUENCY
> + */
> + u32 tsc_freq;
> +} __packed;
> +
> +/** struct guc_lfd_data_gmdid - GMD ID. */
> +struct guc_lfd_data_gmdid {
> + /** @gmd_id: GMD ID as described in GUC_LIC_TYPE_GMD_ID */
> + u32 gmd_id;
> +} __packed;
> +
> +/** struct guc_lfd_data_build_platformid - GuC build platform ID. */
> +struct guc_lfd_data_build_platformid {
> + /**
> + * @platform_build_id: GuC build platform ID as described in
> + * GUC_LIC_TYPE_BUILD_PLATFORM_ID
> + */
> + u32 platform_build_id;
> +} __packed;
Again, not sure these four are worth having structure definitions for. A
comment that says LFD_DEVID maps to LIC_DEVID, etc. would be sufficient.
> +
> +/**
> + * struct guc_lfd_data_log_events_buf - GuC Log Events Buffer.
> + * This is optional fw LFD data
As above, this is not a firmware generated data stream. Should just say
"This is an optional LFD block.".
> + */
> +struct guc_lfd_data_log_events_buf {
> + /**
> + * @log_events_format_version: version of GuC log format of buffer
> + */
> + u32 log_events_format_version;
> + /**
> + * @log_format_buf: If `log_format_version` == 1, array of
> + * guc_log_format_version_1. If `log_format_version` == 2, array
> + * of guc_log_format_version_2. Dword size determined by
> + * guc_logfile_lfd.`desc_dw_size` - 1
This does not match the name you used in the parent LFD header
structure. Should just say "Size in dwords is LFD block size - 1".
> + */
> + u32 log_format_buf[];
> +} __packed;
> +
> +/**
> + * struct guc_lfd_data_os_info - OS Version Information.
> + * This is mandatory host LFD data
As above, this is all being created by the host so no need to specify.
> + */
> +struct guc_lfd_data_os_info {
> + /**
> + * @os_id: enum values to identify the OS brand (1=Windows,
> + * 2=Linux, etc..). See guc_lfd_os_type for the range of types
Should not repeat a subset of the enum definition values here. Just
reference the enum name.
> + */
> + u32 os_id;
> + /**
> + * @build_version: ASCII string containing OS build version
> + * information based on os_id. String is padded with null
> + * characters to ensure its DWORD aligned. Dword size determined
> + * by guc_logfile_lfd.`desc_dw_size` - 1
As above about naming.
> + */
> + char build_version[];
> +} __packed;
> +
> +/**
> + * struct guc_lfd_data_fw_version - GuC FW Version.
> + * This is mandatory fw LFD data
> + */
> +struct guc_lfd_data_fw_version {
> + /**
> + * @guc_sw_version: The full version of the GuC microkernel that
> + * generated the logs as described in
> + * GUC_LIC_TYPE_GUC_SW_VERSION.
Except that the log data block is optional and so not necessarily
present. Should just say "The full version of the GuC firmware.".
> + */
> + struct guc_sw_version guc_sw_version;
> +} __packed;
Although, again this is a single u32 structure, which seems pointless. A
comment description would be sufficient.
> +
> +/**
> + * struct guc_logfile_header - Header of GuC Log Streaming-LFD-File Format.
> + * This structure encapsulates the layout of the guc-log-file format
> + */
> +struct guc_lfd_file_header {
> + /**
> + * @magic: A magic number set by producer of a GuC log file to
> + * identify that file is a valid guc-log-file containing a stream
> + * of LFDs: Expected value: GUC_LFD_DRIVER_KEY_STREAMING
> + */
> + u64 magic;
> + /**
> + * @version: Version of this file format layout as per
> + * guc_lfd_version
> + */
> + struct guc_lfd_version version;
> + /**
> + * @lfd_stream: A stream of one or more guc_lfd_data LFD data
"LFD blocks" is a better way to describe them than "LFD data". Data can
mean pretty much anything, whereas block implies a discrete unit.
> + */
> + struct guc_lfd_data lfd_stream;
Technically, this is just a single LFD block, not a stream. And you
can't really do 'lfd_stream[]' because blocks are variable in size.
Would be better to just say "u32 lfd_stream[];".
John.
> +} __packed;
> +
> +#endif
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v6 3/6] drm/xe/guc: Add new debugfs entry for lfd format output
2025-07-22 1:35 ` [PATCH v6 3/6] drm/xe/guc: Add new debugfs entry for lfd format output Zhanjun Dong
@ 2025-07-29 19:19 ` John Harrison
2025-08-20 22:03 ` Dong, Zhanjun
0 siblings, 1 reply; 30+ messages in thread
From: John Harrison @ 2025-07-29 19:19 UTC (permalink / raw)
To: Zhanjun Dong, intel-xe
On 7/21/2025 6:35 PM, Zhanjun Dong wrote:
> Add new debugfs entry "guc_log_lfd", prepared for output guc log
> in LFD(Log Format Descriptors) format.
>
> Signed-off-by: Zhanjun Dong <zhanjun.dong@intel.com>
> ---
> drivers/gpu/drm/xe/xe_guc_debugfs.c | 7 +++++++
> drivers/gpu/drm/xe/xe_guc_log.c | 32 +++++++++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_guc_log.h | 1 +
> 3 files changed, 40 insertions(+)
>
> diff --git a/drivers/gpu/drm/xe/xe_guc_debugfs.c b/drivers/gpu/drm/xe/xe_guc_debugfs.c
> index 0b102ab46c4d..6cbc4240a3bd 100644
> --- a/drivers/gpu/drm/xe/xe_guc_debugfs.c
> +++ b/drivers/gpu/drm/xe/xe_guc_debugfs.c
> @@ -85,6 +85,12 @@ static int guc_log(struct xe_guc *guc, struct drm_printer *p)
> return 0;
> }
>
> +static int guc_log_lfd(struct xe_guc *guc, struct drm_printer *p)
> +{
> + xe_guc_log_print_lfd(&guc->log, p);
> + return 0;
> +}
> +
> static int guc_log_dmesg(struct xe_guc *guc, struct drm_printer *p)
> {
> xe_guc_log_print_dmesg(&guc->log);
> @@ -121,6 +127,7 @@ static const struct drm_info_list slpc_debugfs_list[] = {
> /* everything else should be added here */
> static const struct drm_info_list pf_only_debugfs_list[] = {
> { "guc_log", .show = guc_debugfs_show, .data = guc_log },
> + { "guc_log_lfd", .show = guc_debugfs_show, .data = guc_log_lfd },
> { "guc_log_dmesg", .show = guc_debugfs_show, .data = guc_log_dmesg },
> };
>
> diff --git a/drivers/gpu/drm/xe/xe_guc_log.c b/drivers/gpu/drm/xe/xe_guc_log.c
> index c01ccb35dc75..d2256773aaf3 100644
> --- a/drivers/gpu/drm/xe/xe_guc_log.c
> +++ b/drivers/gpu/drm/xe/xe_guc_log.c
> @@ -9,6 +9,7 @@
>
> #include <drm/drm_managed.h>
>
> +#include "abi/guc_lfd_abi.h"
> #include "regs/xe_guc_regs.h"
> #include "xe_bo.h"
> #include "xe_devcoredump.h"
> @@ -19,6 +20,12 @@
> #include "xe_mmio.h"
> #include "xe_module.h"
>
> +static const struct guc_lfd_file_header default_guc_lfd_file_header = {
> + .magic = GUC_LFD_DRIVER_KEY_STREAMING,
> + .version.dw0 = FIELD_PREP_CONST(GUC_LFD_VERSION_MINOR, GUC_LFD_FORMAT_VERSION_MINOR) |
> + FIELD_PREP_CONST(GUC_LFD_VERSION_MAJOR, GUC_LFD_FORMAT_VERSION_MAJOR)
> +};
For the sake of two words, I'm not seeing that it is worth having this
as a static global structure. You are going to need to either copy it to
a local structure that you then fill in the 'lfd_stream' field of or
only output the first part of the structure. Either option is messy.
> +
> static struct xe_guc *
> log_to_guc(struct xe_guc_log *log)
> {
> @@ -216,6 +223,17 @@ void xe_guc_log_snapshot_print(struct xe_guc_log_snapshot *snapshot, struct drm_
> }
> }
>
> +static void
> +xe_guc_log_snapshot_print_lfd(struct xe_guc_log_snapshot *snapshot, struct drm_printer *p)
> +{
> + if (!snapshot || !snapshot->size)
> + return;
> +
> + /* Output LFD file header */
> + xe_print_blob_ascii85(p, "[LOG].data", 0, &default_guc_lfd_file_header, 0,
> + offsetof(struct guc_lfd_file_header, lfd_stream));
This is not an LFD format output. And a quick glance I am not seeing it
being replaced in any of the later patches.
Also, all you are generating at this point is a header with no actual
LFD blocks. That would not be a valid LFD stream. You should move this
patch to much later in the series (if not the end) so you only start
generating a file when it is a valid file.
> +}
> +
> /**
> * xe_guc_log_print_dmesg - dump a copy of the GuC log to dmesg
> * @log: GuC log structure
> @@ -251,6 +269,20 @@ void xe_guc_log_print(struct xe_guc_log *log, struct drm_printer *p)
> xe_guc_log_snapshot_free(snapshot);
> }
>
> +/**
> + * xe_guc_log_print_lfd - dump a copy of the GuC log to some useful location
Is this a cut/paste comment from somewhere else?
John.
> + * @log: GuC log structure
> + * @p: the printer object to output to
> + */
> +void xe_guc_log_print_lfd(struct xe_guc_log *log, struct drm_printer *p)
> +{
> + struct xe_guc_log_snapshot *snapshot;
> +
> + snapshot = xe_guc_log_snapshot_capture(log, false);
> + xe_guc_log_snapshot_print_lfd(snapshot, p);
> + xe_guc_log_snapshot_free(snapshot);
> +}
> +
> int xe_guc_log_init(struct xe_guc_log *log)
> {
> struct xe_device *xe = log_to_xe(log);
> diff --git a/drivers/gpu/drm/xe/xe_guc_log.h b/drivers/gpu/drm/xe/xe_guc_log.h
> index f1e2b0be90a9..0f6299886010 100644
> --- a/drivers/gpu/drm/xe/xe_guc_log.h
> +++ b/drivers/gpu/drm/xe/xe_guc_log.h
> @@ -40,6 +40,7 @@ struct xe_device;
>
> int xe_guc_log_init(struct xe_guc_log *log);
> void xe_guc_log_print(struct xe_guc_log *log, struct drm_printer *p);
> +void xe_guc_log_print_lfd(struct xe_guc_log *log, struct drm_printer *p);
> void xe_guc_log_print_dmesg(struct xe_guc_log *log);
> struct xe_guc_log_snapshot *xe_guc_log_snapshot_capture(struct xe_guc_log *log, bool atomic);
> void xe_guc_log_snapshot_print(struct xe_guc_log_snapshot *snapshot, struct drm_printer *p);
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v6 4/6] drm/xe/guc: Add GuC log init config in LFD format
2025-07-22 1:35 ` [PATCH v6 4/6] drm/xe/guc: Add GuC log init config in LFD format Zhanjun Dong
@ 2025-07-30 0:27 ` John Harrison
2025-07-30 23:40 ` Dong, Zhanjun
2025-08-22 21:59 ` Dong, Zhanjun
0 siblings, 2 replies; 30+ messages in thread
From: John Harrison @ 2025-07-30 0:27 UTC (permalink / raw)
To: Zhanjun Dong, intel-xe
On 7/21/2025 6:35 PM, Zhanjun Dong wrote:
> Add support to output GuC log init config (LIC) in LFD format.
>
> Signed-off-by: Zhanjun Dong <zhanjun.dong@intel.com>
> ---
> drivers/gpu/drm/xe/xe_guc_log.c | 204 ++++++++++++++++++++++++++++++++
> 1 file changed, 204 insertions(+)
>
> diff --git a/drivers/gpu/drm/xe/xe_guc_log.c b/drivers/gpu/drm/xe/xe_guc_log.c
> index d2256773aaf3..609a9fd5ba0c 100644
> --- a/drivers/gpu/drm/xe/xe_guc_log.c
> +++ b/drivers/gpu/drm/xe/xe_guc_log.c
> @@ -7,6 +7,7 @@
>
> #include <linux/fault-inject.h>
>
> +#include <linux/utsname.h>
> #include <drm/drm_managed.h>
>
> #include "abi/guc_lfd_abi.h"
> @@ -20,12 +21,67 @@
> #include "xe_mmio.h"
> #include "xe_module.h"
>
> +/* LFD supported LIC type range */
> +#define GUC_LOG_LIC_TYPE_FIRST (GUC_LIC_TYPE_GUC_SW_VERSION)
> +#define GUC_LOG_LIC_TYPE_LAST (GUC_LIC_TYPE_BUILD_PLATFORM_ID)
> +
> +#define GUC_LOG_BUFFER_STATE_HEADER_LENGTH 4096
> +#define GUC_LOG_BUFFER_STATE_HEADER_ENTRY_LOG 0
> +#define GUC_LOG_BUFFER_STATE_HEADER_ENTRY_CRASH 1
> +#define GUC_LOG_BUFFER_STATE_HEADER_ENTRY_CAPTURE 2
These are already defined in guc_log_abi.h.
> +#define GUC_LOG_BUFFER_STATE_HEADER_ENTRY_INIT 3
And the LIC is not/does not have a guc_log_buffer_state header.
> +#define GUC_LOG_BUFFER_STATE_HEADER_ENTRY_COUNT 4
> +
> +#define GUC_LFD_BUFFER_SIZE SZ_1K
> +
> +struct guc_log_buffer_entry_list {
> + u32 offset;
> + u32 rd_ptr;
> + u32 wr_ptr;
> + u32 buf_size;
> +};
> +
> +struct guc_lic_save {
> + u32 version;
> + /*
> + * Array of init config KLVs.
> + * Range from GUC_LOG_LIC_TYPE_FIRST to GUC_LOG_LIC_TYPE_LAST
> + */
> + u32 KLV[GUC_LOG_LIC_TYPE_LAST - GUC_LOG_LIC_TYPE_FIRST + 1];
> + struct guc_log_buffer_entry_list entry[GUC_LOG_BUFFER_STATE_HEADER_ENTRY_COUNT];
> +};
> +
> +static const struct guc_lfd_data default_guc_lfd_data = {
> + .dw0 = FIELD_PREP_CONST(GUC_LFD_DATA_MAGIC, GUC_LFD_DATA_HEADER_MAGIC)
> +};
> +
> static const struct guc_lfd_file_header default_guc_lfd_file_header = {
> .magic = GUC_LFD_DRIVER_KEY_STREAMING,
> .version.dw0 = FIELD_PREP_CONST(GUC_LFD_VERSION_MINOR, GUC_LFD_FORMAT_VERSION_MINOR) |
> FIELD_PREP_CONST(GUC_LFD_VERSION_MAJOR, GUC_LFD_FORMAT_VERSION_MAJOR)
> };
>
> +static struct guc_log_buffer_entry_markers {
> + u32 key[2];
> +} const entry_markers[4] = {
> + {{
> + GUC_LFD_LOG_BUFFER_MARKER_1V2,
> + GUC_LFD_LOG_BUFFER_MARKER_2
> + }},
> + {{
> + GUC_LFD_LOG_BUFFER_MARKER_1V2,
> + GUC_LFD_CRASH_DUMP_BUFFER_MARKER_2
> + }},
> + {{
> + GUC_LFD_STATE_CAPTURE_BUFFER_MARKER_1V2,
> + GUC_LFD_STATE_CAPTURE_BUFFER_MARKER_2
> + }},
> + {{
> + GUC_LIC_MAGIC,
> + ((GUC_LIC_FORMAT_VERSION_MAJOR << 16) | GUC_LIC_FORMAT_VERSION_MINOR)
> + }}
> +};
> +
> static struct xe_guc *
> log_to_guc(struct xe_guc_log *log)
> {
> @@ -223,15 +279,163 @@ void xe_guc_log_snapshot_print(struct xe_guc_log_snapshot *snapshot, struct drm_
> }
> }
>
> +static int xe_guc_log_add_lfd_header(void *buf, int buf_size)
> +{
> + int len = sizeof(default_guc_lfd_data);
> +
> + memcpy(buf, &default_guc_lfd_data, len);
> + return len;
> +}
For the sake of adding one dword in one place in the code, this seems
massively over-engineered.
I would just do "buf[0] = FIELD_PREP(MAGIC)".
> +
> +static int xe_guc_log_add_payload(void *buf, int buf_size, u32 data_len, void *data)
> +{
> + struct guc_lfd_data *lfd = buf;
> +
> + /* make length DW aligned */
> + lfd->dw_size = DIV_ROUND_UP(data_len, sizeof(u32));
> + memcpy(lfd->data, data, data_len);
> + return lfd->dw_size * sizeof(u32);
> +}
Again, why split this out into a separate function? For such a small
amount of code that called only once, it is simpler/clearer to just do
it inline.
> +
> +static int xe_guc_log_add_typed_payload(void *buf, int buf_size, u32 type,
> + u32 data_len, void *data)
> +{
> + struct guc_lfd_data *lfd = buf;
> + int index;
> +
> + index = xe_guc_log_add_lfd_header(buf, buf_size);
> + lfd->dw0 |= FIELD_PREP(GUC_LFD_DATA_DESC_TYPE, type);
> + index += xe_guc_log_add_payload(buf, buf_size, data_len, data);
I'm not seeing any checks that the pre-allocated size is sufficient.
> +
> + return index;
> +}
> +
> +static inline int lic_type_to_KLV_index(u32 lic_type)
> +{
> + XE_WARN_ON(lic_type < GUC_LOG_LIC_TYPE_FIRST || lic_type > GUC_LOG_LIC_TYPE_LAST);
> +
> + return lic_type - GUC_LOG_LIC_TYPE_FIRST;
> +}
> +
> +static int xe_guc_log_add_klv(void *buf, int size, u32 lic_type,
> + struct guc_lic_save *config)
> +{
> + int klv_index = lic_type_to_KLV_index(lic_type);
> +
> + return xe_guc_log_add_typed_payload(buf, size, lic_type, sizeof(u32),
> + &config->KLV[klv_index]);
> +}
> +
> +static int xe_guc_log_add_os_id(void *buf, int buf_size, u32 id)
> +{
> + struct guc_lfd_data *lfd = buf;
> + struct guc_lfd_data_os_info *os_id;
> + char *version;
> + int info_len;
> +
> + os_id = (void *)lfd->data;
> + os_id->os_id = id;
> +
> + version = init_utsname()->release;
> + info_len = strnlen(version, buf_size) + 1;
> +
> + if (buf_size < sizeof(struct guc_lfd_data) + info_len)
> + return -ENOMEM;
> +
> + strscpy(os_id->build_version, version, info_len);
> + return xe_guc_log_add_typed_payload(buf, buf_size, GUC_LFD_TYPE_OS_ID,
> + info_len + sizeof(*os_id), os_id);
> +}
> +
> +static void xe_guc_log_loop_log_init(struct guc_lic *init,
> + struct guc_lic_save *config)
> +{
> + struct guc_klv_generic_dw_t *p = (void *)init->data;
> + int i;
> +
> + for (i = 0; i < init->dw_size;) {
> + int klv_len = FIELD_GET(GUC_KLV_0_LEN, p->kl) + 1;
> + int key = FIELD_GET(GUC_KLV_0_KEY, p->kl);
> +
> + if (key < GUC_LOG_LIC_TYPE_FIRST || key > GUC_LOG_LIC_TYPE_LAST)
> + break;
Error message?
> + config->KLV[lic_type_to_KLV_index(key)] = p->value;
> + i += klv_len;
> + p = (void *)((u32 *)p + klv_len);
> + }
> +}
> +
> +static void xe_guc_log_load_lic(void *guc_log, struct guc_lic_save *config)
> +{
> + u32 offset = GUC_LOG_BUFFER_STATE_HEADER_LENGTH;
> + struct guc_log_buffer_state *p = guc_log;
> + int i = 0;
> +
> + config->version = p->version;
> + while (p) {
> + for (i = 0; i < GUC_LOG_BUFFER_STATE_HEADER_ENTRY_COUNT; i++) {
> + if (p->marker[0] == entry_markers[i].key[0] &&
> + p->marker[1] == entry_markers[i].key[1]) {
> + config->entry[i].offset = offset;
> + config->entry[i].rd_ptr = p->read_ptr;
> + config->entry[i].wr_ptr = p->write_ptr;
> + config->entry[i].buf_size = p->size;
> +
> + if (i != GUC_LOG_BUFFER_STATE_HEADER_ENTRY_INIT) {
> + offset += p->size;
> + p++;
> + } else {
> + /* Load log init config */
> + xe_guc_log_loop_log_init((void *)p, config);
> +
> + /* Init config is the last */
> + return;
> + }
> + }
> + }
> + if (i >= GUC_LOG_BUFFER_STATE_HEADER_ENTRY_COUNT)
> + break;
> + }
This does not seem like the correct way to decode this data. Not all
these items are the same structure. While the crash dump section does
technically have a standard log buffer state header, it does not
actually use it. And of the register capture buffer is not interesting
at all to LFD dumping, which is the only other section to have a valid
header.
I would flip this around and have a helper function which finds the
structure in the buffer that starts with the given magic header and
simply returns a pointer to it (or the offset from base). Then the
processing code for each section (which would be very different
implementations and be called at different times) can retrieve the bit
it is interested in and use it and not worry about having to have a
generic function that processes all sections at once.
> +}
> +
> +static int
> +xe_guc_log_output_lfd_init(struct drm_printer *p, struct xe_guc_log_snapshot *snapshot,
> + struct guc_lic_save *config)
> +{
> + int type, len;
> + size_t size = 0;
> + char buf[GUC_LFD_BUFFER_SIZE] = {0};
This will add 1KB of zeros as a global static object. You should never
give large arrays an empty initialisation like that. I recall someone
once doing that with a 16MB array and it took us ages to work out why
the driver was so huge in debug builds! Also, this is putting a 1KB
array on the stack. Kernel stack space is limited and you should never
put large objects on the stack unless absolutely necessary. Just use
kzalloc() for this.
> +
> + /* FW required types */
> + for (type = GUC_LOG_LIC_TYPE_FIRST; type <= GUC_LOG_LIC_TYPE_LAST; type++)
> + size += xe_guc_log_add_klv(&buf[size], GUC_LFD_BUFFER_SIZE - size, type, config);
I really don't like this idea of effectively cloning the LIC blocks into
LFD blocks. There is no requirement for any cross-compatibility of
structures, enums, etc. Also, the LIC information is potentially useful
data for the driver to include in other places, e.g. devcoredump output.
My preference would be to decode the LIC blocks as part of the GuC
initialisation and save the info in the xe_guc structure. Then the
devcoredump code can print it out and the LFD code can create LFD blocks
from it. But no longer with any assumptions or connections to LIC
formatting.
Also, no buffer overflow checking?
> +
> + /* KMD required type(s) */
> + len = xe_guc_log_add_os_id(&buf[size], GUC_LFD_BUFFER_SIZE - size,
&buf[size] -> buf + size
> + GUC_LFD_OS_TYPE_OSID_LIN);
> + if (len < 0)
> + return len;
Aborting on error means that if the given LFD block didn't fit then you
get no output at all. Would it not be better to print a warning message
and just skip adding that block?
> + size += len;
> +
> + xe_print_blob_ascii85(p, NULL, 0, buf, 0, size);
Why use ASCII85 encoding? The LFD stream is supposed to just be raw
binary data, isn't it?
Hmm. For small logs, it might be useful to output in ASCII, but then do
we need some kind of file format on top of the LFD format? E.g. the
"[LOG].data" tag below is part of the devcoredump format and has nothing
to do with LFDs. Do we need any kind of extra formatting? The LFD
already contains all the meta data we currently need and can support
adding arbitrary meta data anyway. So there is no need for extra data
around the side of the main payload such as we have in the current
debugfs log dump file.
However, the main purpose of a streaming output file is for capturing
very large logs. And those are going to need to be compressed to move
them around. In which case, there is no point in doing ASCII encoding
because it is going to become a non-ASCII zip file anyway.
John.
> + return size;
> +}
> +
> static void
> xe_guc_log_snapshot_print_lfd(struct xe_guc_log_snapshot *snapshot, struct drm_printer *p)
> {
> + struct guc_lic_save config;
> +
> if (!snapshot || !snapshot->size)
> return;
>
> /* Output LFD file header */
> xe_print_blob_ascii85(p, "[LOG].data", 0, &default_guc_lfd_file_header, 0,
> offsetof(struct guc_lfd_file_header, lfd_stream));
> +
> + /* Output LFD stream */
> + xe_guc_log_load_lic(snapshot->copy[0], &config);
> + xe_guc_log_output_lfd_init(p, snapshot, &config);
> }
>
> /**
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v6 5/6] drm/xe/guc: Add GuC log event buffer output in LFD format
2025-07-22 1:35 ` [PATCH v6 5/6] drm/xe/guc: Add GuC log event buffer output " Zhanjun Dong
@ 2025-07-30 17:40 ` John Harrison
2025-08-22 0:19 ` Dong, Zhanjun
0 siblings, 1 reply; 30+ messages in thread
From: John Harrison @ 2025-07-30 17:40 UTC (permalink / raw)
To: Zhanjun Dong, intel-xe
On 7/21/2025 6:35 PM, Zhanjun Dong wrote:
> Add GuC log event buffer output in LFD format.
>
> Signed-off-by: Zhanjun Dong <zhanjun.dong@intel.com>
> ---
> drivers/gpu/drm/xe/xe_guc_log.c | 88 ++++++++++++++++++++++++++++++++-
> 1 file changed, 87 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_guc_log.c b/drivers/gpu/drm/xe/xe_guc_log.c
> index 609a9fd5ba0c..a8910211c579 100644
> --- a/drivers/gpu/drm/xe/xe_guc_log.c
> +++ b/drivers/gpu/drm/xe/xe_guc_log.c
> @@ -421,10 +421,92 @@ xe_guc_log_output_lfd_init(struct drm_printer *p, struct xe_guc_log_snapshot *sn
> return size;
> }
>
> +static void
> +xe_guc_log_print_over_chunks(struct drm_printer *p, struct xe_guc_log_snapshot *snapshot,
> + u32 from, u32 to)
_over_ ?
> +{
> + int chunk_from = from % GUC_LOG_CHUNK_SIZE;
> + int chunk_id = from / GUC_LOG_CHUNK_SIZE;
> + int to_chunk_id = to / GUC_LOG_CHUNK_SIZE;
> + int chunk_to = to % GUC_LOG_CHUNK_SIZE;
> + int pos = from;
> +
> + do {
> + size_t size = (to_chunk_id > chunk_id ? GUC_LOG_CHUNK_SIZE : chunk_to) - chunk_from;
> +
> + xe_print_blob_ascii85(p, NULL, 0, snapshot->copy[chunk_id], chunk_from, size);
> + pos += size;
> + chunk_id++;
> + chunk_from = 0;
> + } while (pos < to);
> +}
> +
> +static void
> +xe_guc_log_lfd_print_from_chunks(struct drm_printer *p, struct xe_guc_log_snapshot *snapshot,
> + struct guc_log_buffer_entry_list *entry)
> +{
> + /* Output data from guc log chunks directly */
> + if (entry->rd_ptr < entry->wr_ptr) {
> + xe_guc_log_print_over_chunks(p, snapshot,
> + entry->offset + entry->rd_ptr,
> + entry->offset + entry->wr_ptr);
> + } else {
> + /* print from rd to buf end 1st */
> + xe_guc_log_print_over_chunks(p, snapshot,
> + entry->offset + entry->rd_ptr,
> + entry->offset + entry->buf_size);
The log does not necessarily reach the end. Indeed, the v2 format is 5
dwords which does not fit neatly into a page. So you need to stop at
buff_wrap_offset not buf_size.
Also, remember that the primary aim here is for streaming output -
continuously dumping data, not just a single snapshot. And in that case,
we should be sending a FLUSH_LOG H2G command and then dumping up to
sampled_log_buf_wr_ptr rather than wr_ptr. And in the case of streaming
output, taking a snapshot copy of the log is probably not worth doing.
We can just dump directly from the live buffer.
I'm not seeing anything that writes to rd_ptr. The KMD is responsible
for updating the read pointer after reading the data. The GuC does not
know what we have or have not read.
> +
> + /* print from buf start to wr */
> + xe_guc_log_print_over_chunks(p, snapshot, entry->offset,
> + entry->offset + entry->wr_ptr);
> + }
> +}
> +
> +static inline int
> +xe_guc_log_add_log_event(struct drm_printer *p, struct xe_guc_log_snapshot *snapshot,
> + struct guc_lic_save *config)
> +{
> + size_t size;
> + u32 data_len;
> + struct guc_lfd_data *lfd;
> + struct guc_log_buffer_entry_list *entry;
> + struct guc_lfd_data_log_events_buf *events_buf;
> + char buf[GUC_LFD_BUFFER_SIZE] = {0};
As per other patch, this is a very bad idea for multiple reasons.
> +
> + lfd = (void *)buf;
> + entry = &config->entry[GUC_LOG_BUFFER_STATE_HEADER_ENTRY_LOG];
> +
> + /* Skip empty log */
> + if (entry->rd_ptr == entry->wr_ptr)
> + return 0;
> +
> + size = xe_guc_log_add_lfd_header(buf, GUC_LFD_BUFFER_SIZE);
> + lfd->dw0 |= FIELD_PREP(GUC_LFD_DATA_DESC_TYPE, GUC_LFD_TYPE_LOG_EVENTS_BUFFER);
> + events_buf = (void *)&lfd->data;
> + events_buf->log_events_format_version = config->version;
> +
> + /* Adjust to log_format_buf */
> + data_len = offsetof(struct guc_lfd_data_log_events_buf, log_format_buf);
> + size += data_len;
This all seems a very complicated way of doing things. Why not just have
a structure which is the event buffer LFD block - header, magic,
version, etc. Create one of those on the stack as a local variable, fill
it in and write it out. No need for complicated type casting,
offsetting, pointer arithmetic, etc.
> +
> + /* Calculate data length */
> + data_len += (entry->wr_ptr + entry->buf_size - entry->rd_ptr) % entry->buf_size;
As above, this is not correct as the end of the log is the wrap_offset
not the size. And in the case where the log is not wrapped, the size is
just wr - rd and size is not relevant.
> + /* make length u32 aligned */
> + lfd->dw_size = DIV_ROUND_UP(data_len, sizeof(u32));
Is this just a belt and braces check? The log entries are multiples of
either 4 or 5 words so data_len must be 32-bit aligned unless something
is badly broken somewhere.
John.
> +
> + /* Output GUC_LFD_TYPE_LOG_EVENTS_BUFFER header */
> + xe_print_blob_ascii85(p, NULL, 0, buf, 0, size);
> + xe_guc_log_lfd_print_from_chunks(p, snapshot, entry);
> +
> + /* log event buffer content did not use buf, exclude from size count */
> + return size;
> +}
> +
> static void
> xe_guc_log_snapshot_print_lfd(struct xe_guc_log_snapshot *snapshot, struct drm_printer *p)
> {
> struct guc_lic_save config;
> + size_t size;
>
> if (!snapshot || !snapshot->size)
> return;
> @@ -435,7 +517,11 @@ xe_guc_log_snapshot_print_lfd(struct xe_guc_log_snapshot *snapshot, struct drm_p
>
> /* Output LFD stream */
> xe_guc_log_load_lic(snapshot->copy[0], &config);
> - xe_guc_log_output_lfd_init(p, snapshot, &config);
> + size = xe_guc_log_output_lfd_init(p, snapshot, &config);
> + if (size < 0)
> + return;
> +
> + xe_guc_log_add_log_event(p, snapshot, &config);
> }
>
> /**
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v6 4/6] drm/xe/guc: Add GuC log init config in LFD format
2025-07-30 0:27 ` John Harrison
@ 2025-07-30 23:40 ` Dong, Zhanjun
2025-08-01 16:57 ` John Harrison
2025-08-22 21:59 ` Dong, Zhanjun
1 sibling, 1 reply; 30+ messages in thread
From: Dong, Zhanjun @ 2025-07-30 23:40 UTC (permalink / raw)
To: John Harrison, intel-xe
There are multiple comments, this reply is focus on 1 topic, see my
comments below.
Regards,
Zhanjun
On 2025-07-29 8:27 p.m., John Harrison wrote:
> On 7/21/2025 6:35 PM, Zhanjun Dong wrote:
>> Add support to output GuC log init config (LIC) in LFD format.
>>
>> Signed-off-by: Zhanjun Dong <zhanjun.dong@intel.com>
>> ---
>> drivers/gpu/drm/xe/xe_guc_log.c | 204 ++++++++++++++++++++++++++++++++
>> 1 file changed, 204 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/xe/xe_guc_log.c b/drivers/gpu/drm/xe/
>> xe_guc_log.c
>> index d2256773aaf3..609a9fd5ba0c 100644
>> --- a/drivers/gpu/drm/xe/xe_guc_log.c
>> +++ b/drivers/gpu/drm/xe/xe_guc_log.c
...
>> +
>> +static int
>> +xe_guc_log_output_lfd_init(struct drm_printer *p, struct
>> xe_guc_log_snapshot *snapshot,
>> + struct guc_lic_save *config)
>> +{
>> + int type, len;
>> + size_t size = 0;
>> + char buf[GUC_LFD_BUFFER_SIZE] = {0};
> This will add 1KB of zeros as a global static object. You should never
> give large arrays an empty initialisation like that. I recall someone
> once doing that with a 16MB array and it took us ages to work out why
> the driver was so huge in debug builds! Also, this is putting a 1KB
> array on the stack. Kernel stack space is limited and you should never
> put large objects on the stack unless absolutely necessary. Just use
> kzalloc() for this.
>
I agree with you for static or global arrays cases, which will cause
.bss, .rodata or other(depends on platform) read-only segment increase,
that's because the static/global data is initialized by loader, loader
copy data from .bss/.rodata segment to memory, that's how it works.
While for this case, which is clear local stack memory to zero, that's
not load's task, that is compiler's job. Compiler will generate either
memset call or machine code to clear it to zero, for example on X86,
disassembly code is:
xe_guc_log_output_lfd_init(struct drm_printer *p, struct
xe_guc_log_snapshot *snapshot,
501: 65 48 8b 04 25 28 00 mov %gs:0x28,%rax
508: 00 00
// I set GUC_LFD_BUFFER_SIZE set to 0x258(decimal 600), compiler has
some calculation and make it 0x268
50a: 48 89 84 24 68 02 00 mov %rax,0x268(%rsp)
511: 00
512: 31 c0 xor %eax,%eax
char buf[GUC_LFD_BUFFER_SIZE] = {0};
514: 48 c7 44 24 10 00 00 movq $0x0,0x10(%rsp)
51b: 00 00
51d: f3 48 ab rep stos %rax,%es:(%rdi)
size += xe_guc_log_add_klv(&buf[size], GUC_LFD_BUFFER_SIZE - size,
type, config);
520: 49 8d 47 10 lea 0x10(%r15),%rax
524: 4c 8d 34 04 lea (%rsp,%rax,1),%r14
index = xe_guc_log_add_lfd_header(buf, buf_size);
Data cleared by instructions, there is no access to RO segment.
Local buf={0} should be similar to a memset call. If you have concerns
about support of compiler/compiler options/processor combination, let me
know, we can change it to memset call.
About the size, I see warning of stack usage is more than 1K, will
reduce it to 600 or 800 to avoid the warning.
LFD header is small, 600/800 looks good.
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v6 4/6] drm/xe/guc: Add GuC log init config in LFD format
2025-07-30 23:40 ` Dong, Zhanjun
@ 2025-08-01 16:57 ` John Harrison
0 siblings, 0 replies; 30+ messages in thread
From: John Harrison @ 2025-08-01 16:57 UTC (permalink / raw)
To: Dong, Zhanjun, intel-xe
On 7/30/2025 4:40 PM, Dong, Zhanjun wrote:
> There are multiple comments, this reply is focus on 1 topic, see my
> comments below.
>
> Regards,
> Zhanjun
>
> On 2025-07-29 8:27 p.m., John Harrison wrote:
>> On 7/21/2025 6:35 PM, Zhanjun Dong wrote:
>>> Add support to output GuC log init config (LIC) in LFD format.
>>>
>>> Signed-off-by: Zhanjun Dong <zhanjun.dong@intel.com>
>>> ---
>>> drivers/gpu/drm/xe/xe_guc_log.c | 204
>>> ++++++++++++++++++++++++++++++++
>>> 1 file changed, 204 insertions(+)
>>>
>>> diff --git a/drivers/gpu/drm/xe/xe_guc_log.c b/drivers/gpu/drm/xe/
>>> xe_guc_log.c
>>> index d2256773aaf3..609a9fd5ba0c 100644
>>> --- a/drivers/gpu/drm/xe/xe_guc_log.c
>>> +++ b/drivers/gpu/drm/xe/xe_guc_log.c
> ...
>>> +
>>> +static int
>>> +xe_guc_log_output_lfd_init(struct drm_printer *p, struct
>>> xe_guc_log_snapshot *snapshot,
>>> + struct guc_lic_save *config)
>>> +{
>>> + int type, len;
>>> + size_t size = 0;
>>> + char buf[GUC_LFD_BUFFER_SIZE] = {0};
>> This will add 1KB of zeros as a global static object. You should
>> never give large arrays an empty initialisation like that. I recall
>> someone once doing that with a 16MB array and it took us ages to work
>> out why the driver was so huge in debug builds! Also, this is putting
>> a 1KB array on the stack. Kernel stack space is limited and you
>> should never put large objects on the stack unless absolutely
>> necessary. Just use kzalloc() for this.
>>
>
> I agree with you for static or global arrays cases, which will cause
> .bss, .rodata or other(depends on platform) read-only segment
> increase, that's because the static/global data is initialized by
> loader, loader copy data from .bss/.rodata segment to memory, that's
> how it works.
> While for this case, which is clear local stack memory to zero, that's
> not load's task, that is compiler's job. Compiler will generate either
> memset call or machine code to clear it to zero, for example on X86,
> disassembly code is:
>
> xe_guc_log_output_lfd_init(struct drm_printer *p, struct
> xe_guc_log_snapshot *snapshot,
> 501: 65 48 8b 04 25 28 00 mov %gs:0x28,%rax
> 508: 00 00
> // I set GUC_LFD_BUFFER_SIZE set to 0x258(decimal 600), compiler has
> some calculation and make it 0x268
> 50a: 48 89 84 24 68 02 00 mov %rax,0x268(%rsp)
> 511: 00
> 512: 31 c0 xor %eax,%eax
> char buf[GUC_LFD_BUFFER_SIZE] = {0};
> 514: 48 c7 44 24 10 00 00 movq $0x0,0x10(%rsp)
> 51b: 00 00
> 51d: f3 48 ab rep stos %rax,%es:(%rdi)
> size += xe_guc_log_add_klv(&buf[size], GUC_LFD_BUFFER_SIZE -
> size, type, config);
> 520: 49 8d 47 10 lea 0x10(%r15),%rax
> 524: 4c 8d 34 04 lea (%rsp,%rax,1),%r14
> index = xe_guc_log_add_lfd_header(buf, buf_size);
>
> Data cleared by instructions, there is no access to RO segment.
>
> Local buf={0} should be similar to a memset call. If you have concerns
> about support of compiler/compiler options/processor combination, let
> me know, we can change it to memset call.
>
> About the size, I see warning of stack usage is more than 1K, will
> reduce it to 600 or 800 to avoid the warning.
> LFD header is small, 600/800 looks good.
>
Several hundred bytes of object is still a lot of object to be putting
on the stack. For anything over a hundred bytes, you should be asking if
this is the best way to do this. And in this case, it is not. Simple
re-working of the data structures would mean you never need to create an
oversized buffer for run-time construction of fields.
John.
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v6 6/6] drm/xe/guc: Only add GuC crash dump if available
2025-07-22 1:35 ` [PATCH v6 6/6] drm/xe/guc: Only add GuC crash dump if available Zhanjun Dong
@ 2025-08-04 20:14 ` John Harrison
2025-08-04 21:21 ` John Harrison
0 siblings, 1 reply; 30+ messages in thread
From: John Harrison @ 2025-08-04 20:14 UTC (permalink / raw)
To: Zhanjun Dong, intel-xe
On 7/21/2025 6:35 PM, Zhanjun Dong wrote:
> Add GuC crash dump data empty check. LFD will only include crash dump
> section when data is not empty.
>
> Signed-off-by: Zhanjun Dong<zhanjun.dong@intel.com>
> ---
> drivers/gpu/drm/xe/xe_guc_log.c | 60 +++++++++++++++++++++++++++++++++
> 1 file changed, 60 insertions(+)
>
> diff --git a/drivers/gpu/drm/xe/xe_guc_log.c b/drivers/gpu/drm/xe/xe_guc_log.c
> index a8910211c579..f5f31f15e7e3 100644
> --- a/drivers/gpu/drm/xe/xe_guc_log.c
> +++ b/drivers/gpu/drm/xe/xe_guc_log.c
> @@ -502,6 +502,65 @@ xe_guc_log_add_log_event(struct drm_printer *p, struct xe_guc_log_snapshot *snap
> return size;
> }
>
> +static int
> +xe_guc_log_add_crash_dump(struct drm_printer *p, struct xe_guc_log_snapshot *snapshot,
> + struct guc_lic_save *config)
> +{
> + struct guc_log_buffer_entry_list *entry;
> + int chunk_from, chunk_id, to_chunk_id;
> + int pos, from, to;
> + size_t size = 0;
> + char buf[GUC_LFD_BUFFER_SIZE] = {0};
> +
> + entry = &config->entry[GUC_LOG_BUFFER_STATE_HEADER_ENTRY_CRASH];
> +
> + /* Skip zero sized crash dump */
> + if (!entry->buf_size)
> + return 0;
> +
> + /* Check if crash dump section are all zero */
> + from = entry->offset;
> + to = entry->offset + entry->buf_size;
> + chunk_from = from % GUC_LOG_CHUNK_SIZE;
> + chunk_id = from / GUC_LOG_CHUNK_SIZE;
> + to_chunk_id = to / GUC_LOG_CHUNK_SIZE;
> + pos = from;
> +
> + do {
> + size_t size = (to_chunk_id > chunk_id ? GUC_LOG_CHUNK_SIZE : to) - chunk_from;
> + u32 *buf32 = snapshot->copy[chunk_id] + chunk_from;
> + int i;
> +
> + for (i = 0; i < size / sizeof(u32); i++)
> + if (buf32[i])
> + break;
> + if (i < size / sizeof(u32)) {
> + pos += i * sizeof(u32) - chunk_from;
> + break;
> + }
> + pos += size;
> + chunk_id++;
> + chunk_from = 0;
> + } while (pos < to);
> +
> + /* Buffer has non-zero data? */
> + if (pos < to) {
> + struct guc_lfd_data *lfd = (void *)buf;
> +
> + size = xe_guc_log_add_lfd_header(buf, GUC_LFD_BUFFER_SIZE);
> + lfd->dw0 |= FIELD_PREP(GUC_LFD_DATA_DESC_TYPE, GUC_LFD_TYPE_FW_CRASH_DUMP);
> + /* Calculate data length */
> + lfd->dw_size = DIV_ROUND_UP(entry->buf_size, sizeof(u32));
> + /* Output GUC_LFD_TYPE_FW_CRASH_DUMP header */
> + xe_print_blob_ascii85(p, NULL, 0, buf, 0, size);
> +
> + /* rd/wr ptr is not used for crash dump */
> + xe_guc_log_print_over_chunks(p, snapshot, entry->offset,
> + entry->offset + entry->buf_size);
> + }
> + return size;
Can't help but think that this is all way too complicated.
The crash dump buffer is never going to be more than 1MB. And that size
is the smallest we can allocate when using large units in order to get a
larger log buffer (because the units are shared). My understanding is
that the actual size used is only a few pages (currently working on
getting a definitive answer from someone who knows). So it would be far
simpler to just save the crash buffer to its own single, contiguous
allocation in the snapshot with no chunking required.
Then all the above complication disappears. You get a simple "for(i = 0;
i < size; i++) if(i) break;" to check for empty and a single print
buffer call.
John.
> +}
> +
> static void
> xe_guc_log_snapshot_print_lfd(struct xe_guc_log_snapshot *snapshot, struct drm_printer *p)
> {
> @@ -522,6 +581,7 @@ xe_guc_log_snapshot_print_lfd(struct xe_guc_log_snapshot *snapshot, struct drm_p
> return;
>
> xe_guc_log_add_log_event(p, snapshot, &config);
> + xe_guc_log_add_crash_dump(p, snapshot, &config);
> }
>
> /**
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v6 6/6] drm/xe/guc: Only add GuC crash dump if available
2025-08-04 20:14 ` John Harrison
@ 2025-08-04 21:21 ` John Harrison
2025-08-21 22:26 ` Dong, Zhanjun
0 siblings, 1 reply; 30+ messages in thread
From: John Harrison @ 2025-08-04 21:21 UTC (permalink / raw)
To: Zhanjun Dong, intel-xe
On 8/4/2025 1:14 PM, John Harrison wrote:
> On 7/21/2025 6:35 PM, Zhanjun Dong wrote:
>> Add GuC crash dump data empty check. LFD will only include crash dump
>> section when data is not empty.
>>
>> Signed-off-by: Zhanjun Dong<zhanjun.dong@intel.com>
>> ---
>> drivers/gpu/drm/xe/xe_guc_log.c | 60 +++++++++++++++++++++++++++++++++
>> 1 file changed, 60 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/xe/xe_guc_log.c
>> b/drivers/gpu/drm/xe/xe_guc_log.c
>> index a8910211c579..f5f31f15e7e3 100644
>> --- a/drivers/gpu/drm/xe/xe_guc_log.c
>> +++ b/drivers/gpu/drm/xe/xe_guc_log.c
>> @@ -502,6 +502,65 @@ xe_guc_log_add_log_event(struct drm_printer *p,
>> struct xe_guc_log_snapshot *snap
>> return size;
>> }
>> +static int
>> +xe_guc_log_add_crash_dump(struct drm_printer *p, struct
>> xe_guc_log_snapshot *snapshot,
>> + struct guc_lic_save *config)
>> +{
>> + struct guc_log_buffer_entry_list *entry;
>> + int chunk_from, chunk_id, to_chunk_id;
>> + int pos, from, to;
>> + size_t size = 0;
>> + char buf[GUC_LFD_BUFFER_SIZE] = {0};
>> +
>> + entry = &config->entry[GUC_LOG_BUFFER_STATE_HEADER_ENTRY_CRASH];
>> +
>> + /* Skip zero sized crash dump */
>> + if (!entry->buf_size)
>> + return 0;
>> +
>> + /* Check if crash dump section are all zero */
>> + from = entry->offset;
>> + to = entry->offset + entry->buf_size;
>> + chunk_from = from % GUC_LOG_CHUNK_SIZE;
>> + chunk_id = from / GUC_LOG_CHUNK_SIZE;
>> + to_chunk_id = to / GUC_LOG_CHUNK_SIZE;
>> + pos = from;
>> +
>> + do {
>> + size_t size = (to_chunk_id > chunk_id ? GUC_LOG_CHUNK_SIZE :
>> to) - chunk_from;
>> + u32 *buf32 = snapshot->copy[chunk_id] + chunk_from;
>> + int i;
>> +
>> + for (i = 0; i < size / sizeof(u32); i++)
>> + if (buf32[i])
>> + break;
>> + if (i < size / sizeof(u32)) {
>> + pos += i * sizeof(u32) - chunk_from;
>> + break;
>> + }
>> + pos += size;
>> + chunk_id++;
>> + chunk_from = 0;
>> + } while (pos < to);
>> +
>> + /* Buffer has non-zero data? */
>> + if (pos < to) {
>> + struct guc_lfd_data *lfd = (void *)buf;
>> +
>> + size = xe_guc_log_add_lfd_header(buf, GUC_LFD_BUFFER_SIZE);
>> + lfd->dw0 |= FIELD_PREP(GUC_LFD_DATA_DESC_TYPE,
>> GUC_LFD_TYPE_FW_CRASH_DUMP);
>> + /* Calculate data length */
>> + lfd->dw_size = DIV_ROUND_UP(entry->buf_size, sizeof(u32));
>> + /* Output GUC_LFD_TYPE_FW_CRASH_DUMP header */
>> + xe_print_blob_ascii85(p, NULL, 0, buf, 0, size);
>> +
>> + /* rd/wr ptr is not used for crash dump */
>> + xe_guc_log_print_over_chunks(p, snapshot, entry->offset,
>> + entry->offset + entry->buf_size);
>> + }
>> + return size;
> Can't help but think that this is all way too complicated.
>
> The crash dump buffer is never going to be more than 1MB. And that
> size is the smallest we can allocate when using large units in order
> to get a larger log buffer (because the units are shared). My
> understanding is that the actual size used is only a few pages
> (currently working on getting a definitive answer from someone who
> knows). So it would be far simpler to just save the crash buffer to
> its own single, contiguous allocation in the snapshot with no chunking
> required.
Just got an answer back. The size is needed is 12KB currently but will
shortly rise to 16KB. So a private allocation in the snapshot will be
sufficient and is definitely going to be simpler than going through the
chunking stuff.
Unfortunately, that also means that our current default of 8KB in
non-debug builds is too small! Can you post a patch to bump that up to 16KB?
Thanks,
John.
>
> Then all the above complication disappears. You get a simple "for(i =
> 0; i < size; i++) if(i) break;" to check for empty and a single print
> buffer call.
>
> John.
>
>> +}
>> +
>> static void
>> xe_guc_log_snapshot_print_lfd(struct xe_guc_log_snapshot *snapshot,
>> struct drm_printer *p)
>> {
>> @@ -522,6 +581,7 @@ xe_guc_log_snapshot_print_lfd(struct
>> xe_guc_log_snapshot *snapshot, struct drm_p
>> return;
>> xe_guc_log_add_log_event(p, snapshot, &config);
>> + xe_guc_log_add_crash_dump(p, snapshot, &config);
>> }
>> /**
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v6 1/6] drm/xe/guc: Add log init config abi definitions
2025-07-29 17:40 ` Michal Wajdeczko
@ 2025-08-18 15:03 ` Dong, Zhanjun
0 siblings, 0 replies; 30+ messages in thread
From: Dong, Zhanjun @ 2025-08-18 15:03 UTC (permalink / raw)
To: Michal Wajdeczko, intel-xe
On 2025-07-29 1:40 p.m., Michal Wajdeczko wrote:
>
>
> On 7/22/2025 3:35 AM, Zhanjun Dong wrote:
>> Add GuC log init config (LIC) ABI definitions.
>>
>> Signed-off-by: Zhanjun Dong <zhanjun.dong@intel.com>
>> ---
>> drivers/gpu/drm/xe/abi/guc_lic_abi.h | 107 +++++++++++++++++++++++++++
>> 1 file changed, 107 insertions(+)
>> create mode 100644 drivers/gpu/drm/xe/abi/guc_lic_abi.h
>>
>> diff --git a/drivers/gpu/drm/xe/abi/guc_lic_abi.h b/drivers/gpu/drm/xe/abi/guc_lic_abi.h
>> new file mode 100644
>> index 000000000000..a4e27da304cd
>> --- /dev/null
>> +++ b/drivers/gpu/drm/xe/abi/guc_lic_abi.h
>> @@ -0,0 +1,107 @@
>> +/* SPDX-License-Identifier: MIT */
>> +/*
>> + * Copyright © 2025 Intel Corporation
>> + */
>> +
>> +#ifndef _ABI_GUC_LIC_ABI_H_
>> +#define _ABI_GUC_LIC_ABI_H_
>> +
>> +#include <linux/types.h>
>> +
>> +/** enum guc_lic_type - Log Init Config TLV IDs. */
>> +enum guc_lic_type {
>> + /**
>> + * @GUC_LIC_TYPE_GUC_SW_VERSION: GuC firmware version. Value
>> + * is a 32 bit number represented by guc_sw_version.
>> + */
>> + GUC_LIC_TYPE_GUC_SW_VERSION = 0x1,
>> + /**
>> + * @GUC_LIC_TYPE_GUC_DEVICE_ID: GuC device id. Value is a 32
>> + * bit.
>> + */
>> + GUC_LIC_TYPE_GUC_DEVICE_ID = 0x2,
>> + /**
>> + * @GUC_LIC_TYPE_TSC_FREQUENCY: GuC timestamp counter
>> + * frequency. Value is a 32 bit number representing frequency in
>> + * kHz. This timestamp is utilized in log entries, timer and
>> + * for engine utilization tracking.
>> + */
>> + GUC_LIC_TYPE_TSC_FREQUENCY = 0x3,
>> + /**
>> + * @GUC_LIC_TYPE_GMD_ID: HW GMD ID. Value is a 32 bit number
>> + * representing graphics, media and display HW architecture IDs.
>> + */
>> + GUC_LIC_TYPE_GMD_ID = 0x4,
>> + /**
>> + * @GUC_LIC_TYPE_BUILD_PLATFORM_ID: GuC build platform ID.
>> + * Value is 32 bits.
>> + */
>> + GUC_LIC_TYPE_BUILD_PLATFORM_ID = 0x5,
>> +};
>> +
>> +/**
>> + * struct guc_sw_version - This structure describes the full version of a
>> + * software component.
>> + */
>> +struct guc_sw_version {
>> + /** @dw0: A 32 bits dword, contains multiple bit fields */
>> + u32 dw0;
>> +#define GUC_SW_VERSION_PATCH_VERSION GENMASK(7, 0)
>> +#define GUC_SW_VERSION_MINOR_VERSION GENMASK(15, 8)
>> +#define GUC_SW_VERSION_MAJOR_VERSION GENMASK(23, 16)
>> +#define GUC_SW_VERSION_BRANCH_ID GENMASK(31, 24)
>
> in other places we start with MSB definitions first
Sure, np
>> +} __packed;
>> +
>> +/**
>> + * struct guc_lic_format_version - Log Init Config Structure Version.
>
> *
>
>> + * Major-Minor is not a fractional number (i.e. Ver 1.3 would be older
>> + * than 1.12)
>> + */
>> +struct guc_lic_format_version {
>> + /** @dw0: A 32 bits dword, contains multiple bit fields */
>> + u32 dw0;
>> + /*
>> + * Log-Init-Config structure minor version. Must be
>> + * GUC_LIC_FORMAT_VERSION_MASK_MINOR
>
> you likely mean GUC_LIC_FORMAT_VERSION_MINOR here
>
> and likely the guc_lic_format_version shall be defined first as all
> other definitions depends on this being 1.0, right?
Sure, will move the version define ahead
>> + */
>> +#define GUC_LIC_FORMAT_VERSION_MASK_MINOR GENMASK(15, 0)
>> + /*
>> + * Log-Init-Config structure major version. Must be
>> + * GUC_LIC_FORMAT_VERSION_MASK_MAJOR
>
> GUC_LIC_FORMAT_VERSION_MAJOR
>
>> + */
>> +#define GUC_LIC_FORMAT_VERSION_MASK_MAJOR GENMASK(31, 16)
>
> again, start with MSB first
>
>> +} __packed;
>> +
>> +/**
>> + * struct guc_lic - GuC lic (Log-Init-Config) structure.
>
> s/GuC lic/GuC LIC
>
> *
>> + * This is populated by the GUC at log init time and is located in the log
>> + * buffer as per the Log Buffer Layout (In Memory). The array of guc log
>> + * buffer states plus this structure must not exceed 4KB
>> + */
>> +struct guc_lic {
>> + /**
>> + * @magic: A magic number set by GuC to identify that this
>> + * structure contains valid information: magic = GUC_LIC_MAGIC.
>> + * Used to verify the information in this structure is valid.
>
> hmm, last sentence is redundant, please rephrase
>
>> + */
>> + u32 magic;
>> +#define GUC_LIC_MAGIC 0x8086900D
>> +
>> + /**
>> + * @version: The version of the this structure. Represented by
>> + * guc_lic_format_version
>> + */
>> + struct guc_lic_format_version version;
>> +#define GUC_LIC_FORMAT_VERSION_MAJOR 1u
>> +#define GUC_LIC_FORMAT_VERSION_MINOR 0u
>
> those defs should be closer to struct guc_lic_format_version
> where they are already referenced in description
>
>> +
>> + /** @dw_size: Number of Dws the `data` array contains. */
>
> s/Dws/DWs or DWORDs or dwords but not Dws
>> + u32 dw_size;
>
> hmm, still dw_size name is suggesting something else...
> maybe "@data_size: Number of dwords in the @data array"
>
> or data_count or data_len
Will be changed to data_count, as it not size, but the count of dwords
>> + /**
>> + * @data: Array of dwords representing a list of LIC KLVs of
>> + * type guc_klv_generic with keys represented by guc_lic_type
>> + */
>> + u32 data[] __counted_by(dw_size);
>> +} __packed;
>> +
>> +#endif
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v6 1/6] drm/xe/guc: Add log init config abi definitions
2025-07-29 18:34 ` John Harrison
@ 2025-08-18 15:03 ` Dong, Zhanjun
0 siblings, 0 replies; 30+ messages in thread
From: Dong, Zhanjun @ 2025-08-18 15:03 UTC (permalink / raw)
To: John Harrison, intel-xe
On 2025-07-29 2:34 p.m., John Harrison wrote:
> On 7/21/2025 6:35 PM, Zhanjun Dong wrote:
>> Add GuC log init config (LIC) ABI definitions.
>>
>> Signed-off-by: Zhanjun Dong <zhanjun.dong@intel.com>
>> ---
>> drivers/gpu/drm/xe/abi/guc_lic_abi.h | 107 +++++++++++++++++++++++++++
>> 1 file changed, 107 insertions(+)
>> create mode 100644 drivers/gpu/drm/xe/abi/guc_lic_abi.h
>>
>> diff --git a/drivers/gpu/drm/xe/abi/guc_lic_abi.h b/drivers/gpu/drm/
>> xe/abi/guc_lic_abi.h
>> new file mode 100644
>> index 000000000000..a4e27da304cd
>> --- /dev/null
>> +++ b/drivers/gpu/drm/xe/abi/guc_lic_abi.h
>> @@ -0,0 +1,107 @@
>> +/* SPDX-License-Identifier: MIT */
>> +/*
>> + * Copyright © 2025 Intel Corporation
>> + */
>> +
>> +#ifndef _ABI_GUC_LIC_ABI_H_
>> +#define _ABI_GUC_LIC_ABI_H_
>> +
>> +#include <linux/types.h>
>> +
>> +/** enum guc_lic_type - Log Init Config TLV IDs. */
> We use KLV in the Xe driver not TLV.
KLV is Key-Length-Value
TLV is Type-Length-Value
as the Key here is the type, that make it become TLV, is it right?
>> +enum guc_lic_type {
>> + /**
>> + * @GUC_LIC_TYPE_GUC_SW_VERSION: GuC firmware version. Value
>> + * is a 32 bit number represented by guc_sw_version.
>> + */
>> + GUC_LIC_TYPE_GUC_SW_VERSION = 0x1,
>> + /**
>> + * @GUC_LIC_TYPE_GUC_DEVICE_ID: GuC device id. Value is a 32
>> + * bit.
>> + */
>> + GUC_LIC_TYPE_GUC_DEVICE_ID = 0x2,
>> + /**
>> + * @GUC_LIC_TYPE_TSC_FREQUENCY: GuC timestamp counter
>> + * frequency. Value is a 32 bit number representing frequency in
>> + * kHz. This timestamp is utilized in log entries, timer and
>> + * for engine utilization tracking.
>> + */
>> + GUC_LIC_TYPE_TSC_FREQUENCY = 0x3,
>> + /**
>> + * @GUC_LIC_TYPE_GMD_ID: HW GMD ID. Value is a 32 bit number
>> + * representing graphics, media and display HW architecture IDs.
>> + */
>> + GUC_LIC_TYPE_GMD_ID = 0x4,
>> + /**
>> + * @GUC_LIC_TYPE_BUILD_PLATFORM_ID: GuC build platform ID.
>> + * Value is 32 bits.
>> + */
>> + GUC_LIC_TYPE_BUILD_PLATFORM_ID = 0x5,
>> +};
>> +
>> +/**
>> + * struct guc_sw_version - This structure describes the full version
>> of a
>> + * software component.
>> + */
>> +struct guc_sw_version {
>> + /** @dw0: A 32 bits dword, contains multiple bit fields */
>> + u32 dw0;
>> +#define GUC_SW_VERSION_PATCH_VERSION GENMASK(7, 0)
>> +#define GUC_SW_VERSION_MINOR_VERSION GENMASK(15, 8)
>> +#define GUC_SW_VERSION_MAJOR_VERSION GENMASK(23, 16)
>> +#define GUC_SW_VERSION_BRANCH_ID GENMASK(31, 24)
>> +} __packed;
> Is there any point in having this defined as a structure? Elsewhere we
> just have a u32 in the parent structure and the bitmask definitions for
> access. Given that this doesn't even have a parent structure, it is just
> the data field of a KLV, it makes even less sense to have a structure
> defined for it.
Sure, Will make it a u32.
>
>> +
>> +/**
>> + * struct guc_lic_format_version - Log Init Config Structure Version.
>> + * Major-Minor is not a fractional number (i.e. Ver 1.3 would be older
>> + * than 1.12)
>> + */
>> +struct guc_lic_format_version {
>> + /** @dw0: A 32 bits dword, contains multiple bit fields */
>> + u32 dw0;
>> + /*
>> + * Log-Init-Config structure minor version. Must be
>> + * GUC_LIC_FORMAT_VERSION_MASK_MINOR
>> + */
>> +#define GUC_LIC_FORMAT_VERSION_MASK_MINOR GENMASK(15, 0)
>> + /*
>> + * Log-Init-Config structure major version. Must be
>> + * GUC_LIC_FORMAT_VERSION_MASK_MAJOR
>> + */
>> +#define GUC_LIC_FORMAT_VERSION_MASK_MAJOR GENMASK(31, 16)
>> +} __packed;
> Again, why bother with a structure containing a single dword. Just use a
> u32 in the parent structure.
Will make it a u32.
>
>> +
>> +/**
>> + * struct guc_lic - GuC lic (Log-Init-Config) structure.
>> + * This is populated by the GUC at log init time and is located in
>> the log
>> + * buffer as per the Log Buffer Layout (In Memory). The array of guc log
>> + * buffer states plus this structure must not exceed 4KB
> The last sentence is an instruction for the GuC firmware implementation
> people. And the 'as per ...' is a reference to another section in the
> spec that you do not have access to in this header file. I would just
> stop with 'is located in the log buffer memory allocation'.
will follow the recommendation
> John.
>
>> + */
>> +struct guc_lic {
>> + /**
>> + * @magic: A magic number set by GuC to identify that this
>> + * structure contains valid information: magic = GUC_LIC_MAGIC.
>> + * Used to verify the information in this structure is valid.
>> + */
>> + u32 magic;
>> +#define GUC_LIC_MAGIC 0x8086900D
>> +
>> + /**
>> + * @version: The version of the this structure. Represented by
>> + * guc_lic_format_version
>> + */
>> + struct guc_lic_format_version version;
>> +#define GUC_LIC_FORMAT_VERSION_MAJOR 1u
>> +#define GUC_LIC_FORMAT_VERSION_MINOR 0u
>> +
>> + /** @dw_size: Number of Dws the `data` array contains. */
>> + u32 dw_size;
>> + /**
>> + * @data: Array of dwords representing a list of LIC KLVs of
>> + * type guc_klv_generic with keys represented by guc_lic_type
>> + */
>> + u32 data[] __counted_by(dw_size);
>> +} __packed;
>> +
>> +#endif
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v6 2/6] drm/xe/guc: Add LFD related abi definitions
2025-07-29 18:07 ` Michal Wajdeczko
@ 2025-08-20 20:43 ` Dong, Zhanjun
0 siblings, 0 replies; 30+ messages in thread
From: Dong, Zhanjun @ 2025-08-20 20:43 UTC (permalink / raw)
To: Michal Wajdeczko, intel-xe
On 2025-07-29 2:07 p.m., Michal Wajdeczko wrote:
>
>
> On 7/22/2025 3:35 AM, Zhanjun Dong wrote:
>> Add GuC LFD (Log Format Descriptors) related ABI definitions.
>>
>> Signed-off-by: Zhanjun Dong <zhanjun.dong@intel.com>
>> ---
>> drivers/gpu/drm/xe/abi/guc_lfd_abi.h | 282 +++++++++++++++++++++++++++
>> 1 file changed, 282 insertions(+)
>> create mode 100644 drivers/gpu/drm/xe/abi/guc_lfd_abi.h
>>
>> diff --git a/drivers/gpu/drm/xe/abi/guc_lfd_abi.h b/drivers/gpu/drm/xe/abi/guc_lfd_abi.h
>> new file mode 100644
>> index 000000000000..b6888ab47e25
>> --- /dev/null
>> +++ b/drivers/gpu/drm/xe/abi/guc_lfd_abi.h
>> @@ -0,0 +1,282 @@
>> +/* SPDX-License-Identifier: MIT */
>> +/*
>> + * Copyright © 2025 Intel Corporation
>> + */
>> +
>> +#ifndef _ABI_GUC_LFD_ABI_H_
>> +#define _ABI_GUC_LFD_ABI_H_
>> +
>> +#include <linux/types.h>
>> +
>> +#include "guc_lic_abi.h"
>> +
>> +/* Magic keys define */
>> +#define GUC_LFD_DRIVER_KEY_STREAMING 0x8086AAAA474C5346
>> +#define GUC_LFD_LOG_BUFFER_MARKER_2 0xDEADFEED
>> +#define GUC_LFD_CRASH_DUMP_BUFFER_MARKER_2 0x8086DEAD
>> +#define GUC_LFD_STATE_CAPTURE_BUFFER_MARKER_2 0xBEEFFEED
>> +#define GUC_LFD_LOG_BUFFER_MARKER_1V2 0xCABBA9E6
>> +#define GUC_LFD_STATE_CAPTURE_BUFFER_MARKER_1V2 0xCABBA9F7
>> +#define GUC_LFD_DATA_HEADER_MAGIC 0x8086
>> +
>> +/* The current major version of GuC-Log-File format. */
>> +#define GUC_LFD_FORMAT_VERSION_MAJOR 0x0001
>> +/* The current minor version of GuC-Log-File format. */
>> +#define GUC_LFD_FORMAT_VERSION_MINOR 0x0000
>> +
>> +/** enum guc_lfd_type - Log format descriptor type */
>> +enum guc_lfd_type {
>> + /**
>> + * @GUC_LFD_TYPE_FW_REQUIRED_RANGE_START: Start of range for
>> + * required LFDs from GuC
>> + */
>> + GUC_LFD_TYPE_FW_REQUIRED_RANGE_START = 0x1,
>> + /**
>> + * @GUC_LFD_TYPE_FW_VERSION: GuC Firmware Version structure. LFDs
>> + * payload is guc_lfd_data_fw_version
>
> hmm, if this type identifies specific lfd payload, why it uses a lic type?
>
> if both types has to match, say that, and add static_assert to check that somewhere
>
> (edit: or maybe those lfd specific structures are simply redundant, and
> you can directly say here that payload is that lic or other struct)
To be changed to number
>
>> + */
>> + GUC_LFD_TYPE_FW_VERSION = GUC_LIC_TYPE_GUC_SW_VERSION,
>> + /**
>> + * @GUC_LFD_TYPE_GUC_DEVICE_ID: GuC microcontroller device ID.
>> + * LFDs payload is guc_lfd_data_guc_devid
>> + */
>> + GUC_LFD_TYPE_GUC_DEVICE_ID = GUC_LIC_TYPE_GUC_DEVICE_ID,
>> + /**
>> + * @GUC_LFD_TYPE_TSC_FREQUENCY: Frequency of GuC timestamps. LFDs
>> + * payload is guc_lfd_data_tsc_freq
>> + */
>> + GUC_LFD_TYPE_TSC_FREQUENCY = GUC_LIC_TYPE_TSC_FREQUENCY,
>> + /**
>> + * @GUC_LFD_TYPE_GMD_ID: HW GMD ID. LFDs payload is
>> + * guc_lfd_data_gmdid
>> + */
>> + GUC_LFD_TYPE_GMD_ID = GUC_LIC_TYPE_GMD_ID,
>> + /**
>> + * @GUC_LFD_TYPE_BUILD_PLATFORM_ID: GuC build platform ID. LFDs
>> + * payload is guc_lfd_data_build_platformid
>> + */
>> + GUC_LFD_TYPE_BUILD_PLATFORM_ID = GUC_LIC_TYPE_BUILD_PLATFORM_ID,
>> + /** @GUC_LFD_TYPE_FW_REQUIRED_RANGE_END: End of this range */
>
> "End of this range" is repeated few times below, make it unique per enum
Sure
>
>> + GUC_LFD_TYPE_FW_REQUIRED_RANGE_END = 0x1FFF,
>> + /**
>> + * @GUC_LFD_TYPE_FW_OPTIONAL_RANGE_START: Start of range for
>> + * required LFDs from GuC
>> + */
>> + GUC_LFD_TYPE_FW_OPTIONAL_RANGE_START = 0x2000,
>> + /**
>> + * @GUC_LFD_TYPE_LOG_EVENTS_BUFFER: Log-event-entries buffer. LFDs
>> + * payload is guc_lfd_data_log_events_buf
>> + */
>> + GUC_LFD_TYPE_LOG_EVENTS_BUFFER = 0x2000,
>> + /**
>> + * @GUC_LFD_TYPE_FW_CRASH_DUMP: GuC generated crash-dump blob.
>> + * LFDs payload is guc_lfd_data_fw_crashdump
>> + */
>> + GUC_LFD_TYPE_FW_CRASH_DUMP = 0x2001,
>> + /** @GUC_LFD_TYPE_FW_OPTIONAL_RANGE_END: End of this range */
>> + GUC_LFD_TYPE_FW_OPTIONAL_RANGE_END = 0x3FFF,
>> + /**
>> + * @GUC_LFD_TYPE_KMD_REQUIRED_RANGE_START: Start of range for
>> + * required KMD LFDs
>> + */
>> + GUC_LFD_TYPE_KMD_REQUIRED_RANGE_START = 0x4000,
>> + /**
>> + * @GUC_LFD_TYPE_OS_ID: An identifier for the OS. LFDs payload is
>> + * guc_lfd_data_os_id
>> + */
>> + GUC_LFD_TYPE_OS_ID = 0x4000,
>> + /** @GUC_LFD_TYPE_KMD_REQUIRED_RANGE_END: End of this range */
>> + GUC_LFD_TYPE_KMD_REQUIRED_RANGE_END = 0x5FFF,
>> + /**
>> + * @GUC_LFD_TYPE_KMD_OPTIONAL_RANGE_START: Start of range for
>> + * optional KMD LFDs
>> + */
>> + GUC_LFD_TYPE_KMD_OPTIONAL_RANGE_START = 0x6000,
>> + /**
>> + * @GUC_LFD_TYPE_BINARY_SCHEMA_FORMAT: Binary representation of
>> + * GuC log-events schema. LFDs TLV payload is
>> + * guc_lfd_data_binary_schema
>> + */
>> + GUC_LFD_TYPE_BINARY_SCHEMA_FORMAT = 0x6000,
>> + /**
>> + * @GUC_LFD_TYPE_HOST_COMMENT: ASCII string containing comments
>> + * from the host/KMD. LFDs TLV payload is
>> + * guc_lfd_data_host_comment
>> + */
>> + GUC_LFD_TYPE_HOST_COMMENT = 0x6001,
>> + /** @GUC_LFD_TYPE_KMD_OPTIONAL_RANGE_END: End of this range */
>> + GUC_LFD_TYPE_KMD_OPTIONAL_RANGE_END = 0x7FFF,
>> + /** @GUC_LFD_TYPE_RESERVED_RANGE_START: Start of reserved range */
>> + GUC_LFD_TYPE_RESERVED_RANGE_START = 0x8000,
>> + /** @GUC_LFD_TYPE_RESERVED_RANGE_END: End of this range */
>> + GUC_LFD_TYPE_RESERVED_RANGE_END = 0xFFFF,
>> +};
>> +
>> +/** enum guc_lfd_os_type - OS Type LFD-ID */
>> +enum guc_lfd_os_type {
>> + /** @GUC_LFD_OS_TYPE_OSID_WIN: Windows OS */
>> + GUC_LFD_OS_TYPE_OSID_WIN = 0x1,
>> + /** @GUC_LFD_OS_TYPE_OSID_LIN: Linux OS */
>> + GUC_LFD_OS_TYPE_OSID_LIN = 0x2,
>> + /** @GUC_LFD_OS_TYPE_OSID_VMW: VMWare OS */
>> + GUC_LFD_OS_TYPE_OSID_VMW = 0x3,
>> + /** @GUC_LFD_OS_TYPE_OSID_OTHER: Other */
>> + GUC_LFD_OS_TYPE_OSID_OTHER = 0x4,
>> +};
>> +
>> +/**
>> + * struct guc_lfd_data - Log format descriptor (LFD).
>> + * A type of KLV with custom field-sizes + magic numbers.
>> + */
>> +struct guc_lfd_data {
>> + /** @dw0: A 32 bits dword, contains multiple bit fields */
>> + u32 dw0;
>> + /*
>> + * Expected value: GUC_LFD_DATA_HEADER_MAGIC.
>> + * Helpful in detecting file errors.
>> + */
>> +#define GUC_LFD_DATA_MAGIC GENMASK(15, 0)
>> + /*
>> + * File descriptor type (the 'T' in TLV) is used to identify how
>> + * to interpret `data` below. For the range of types, see
>> + * guc_lfd_type
>> + */
>> +#define GUC_LFD_DATA_DESC_TYPE GENMASK(31, 16)
>> + /** @dw_size: Number of dwords the `data` field contains. */
>> + u32 dw_size;
>> + /** @data: Data defined by File descriptor type. */
>> + u32 data[] __counted_by(dw_size);
>> +} __packed;
>> +
>> +/**
>> + * struct guc_lfd_version - GuC Log File Format Version.
>> + * Major-Minor is not a fractional number (i.e. Ver 1.3 would be older
>> + * than 1.12)
>> + */
>> +struct guc_lfd_version {
>> + /** @dw0: A 32 bits dword, contains multiple bit fields */
>> + u32 dw0;
>> + /*
>> + * Guc-Log-File Format minor version. Must be
>> + * GUC_LOG_FILE_FORMAT_VERSION_MINOR
>> + */
>> +#define GUC_LFD_VERSION_MINOR GENMASK(15, 0)
>> + /*
>> + * Guc-Log-File Format major version. Must be
>> + * GUC_LOG_FILE_FORMAT_VERSION_MAJOR
>> + */
>> +#define GUC_LFD_VERSION_MAJOR GENMASK(31, 16)
>
> very easy to confuse with
>
> #define GUC_LFD_FORMAT_VERSION_MAJOR
> #define GUC_LFD_FORMAT_VERSION_MINOR
>
> maybe there should be:
>
> GUC_LFD_VERSION_DW0_MASK_MAJOR GENMASK()
> GUC_LFD_VERSION_DW0_MASK_MINOR GENMASK()
>
> and
>
> GUC_LFD_VERSION_MAJOR 1u
> GUC_LFD_VERSION_MINOR 0u
Will do a cleanup among this series, to rename all macros names for
GENMASK to be
STRUCTURE_NAME_XXX_MASK_YYY
XXX is structure field name
YYY is bit field name
>
>> +} __packed;
>> +
>> +/**
>> + * struct guc_lfd_data_guc_devid - GuC Device ID.
>> + * This is mandatory fw LFD data
>> + */
>> +struct guc_lfd_data_guc_devid {
>> + /**
>> + * @guc_devid: GuC microcontroller device ID defined as described
>> + * in GUC_LIC_TYPE_GUC_DEVICE_ID
>> + */
>> + u32 guc_devid;
>> +} __packed;
>> +
>> +/**
>> + * struct guc_lfd_data_tsc_freq - GuC TSC Fequency.
>> + * This is mandatory fw LFD data
>> + */
>> +struct guc_lfd_data_tsc_freq {
>> + /**
>> + * @tsc_freq: GuC timestamp counter frequency as described in
>> + * GUC_LIC_TYPE_TSC_FREQUENCY
>> + */
>> + u32 tsc_freq;
>> +} __packed;
>> +
>> +/** struct guc_lfd_data_gmdid - GMD ID. */
>> +struct guc_lfd_data_gmdid {
>> + /** @gmd_id: GMD ID as described in GUC_LIC_TYPE_GMD_ID */
>> + u32 gmd_id;
>> +} __packed;
>> +
>> +/** struct guc_lfd_data_build_platformid - GuC build platform ID. */
>> +struct guc_lfd_data_build_platformid {
>> + /**
>> + * @platform_build_id: GuC build platform ID as described in
>> + * GUC_LIC_TYPE_BUILD_PLATFORM_ID
>> + */
>> + u32 platform_build_id;
>> +} __packed;
>> +
>> +/**
>> + * struct guc_lfd_data_log_events_buf - GuC Log Events Buffer.
>> + * This is optional fw LFD data
>> + */
>> +struct guc_lfd_data_log_events_buf {
>> + /**
>> + * @log_events_format_version: version of GuC log format of buffer
>> + */
>> + u32 log_events_format_version;
>
> need defines for VER_1 and VER_2
This header file is for LFD abi, and LFD feature do not interpret log
event data contents, so details inside log event buffure seems out of
scope. Better to avoid mention things not touched.
>
>> + /**
>> + * @log_format_buf: If `log_format_version` == 1, array of
>> + * guc_log_format_version_1. If `log_format_version` == 2, array
>> + * of guc_log_format_version_2. Dword size determined by
>> + * guc_logfile_lfd.`desc_dw_size` - 1
>> + */
>> + u32 log_format_buf[];
Will be changed to
@log_event: The log event data.>> +} __packed;
>> +
>> +/**
>> + * struct guc_lfd_data_os_info - OS Version Information.
>> + * This is mandatory host LFD data
>
> btw, why is it mandatory?
That is come from LFD spec. My understanding is UMD tools need this OS
info for parsing.
As John commented, not need to specify, will be removed.
>
>> + */
>> +struct guc_lfd_data_os_info {
>> + /**
>> + * @os_id: enum values to identify the OS brand (1=Windows,
>> + * 2=Linux, etc..). See guc_lfd_os_type for the range of types
>> + */
>> + u32 os_id;
>> + /**
>> + * @build_version: ASCII string containing OS build version
>> + * information based on os_id. String is padded with null
>> + * characters to ensure its DWORD aligned. Dword size determined
>> + * by guc_logfile_lfd.`desc_dw_size` - 1
>> + */
>> + char build_version[];
>> +} __packed;
>> +
>> +/**
>> + * struct guc_lfd_data_fw_version - GuC FW Version.
>> + * This is mandatory fw LFD data
>> + */
>> +struct guc_lfd_data_fw_version {
>> + /**
>> + * @guc_sw_version: The full version of the GuC microkernel that
>> + * generated the logs as described in
>> + * GUC_LIC_TYPE_GUC_SW_VERSION.
>> + */
>> + struct guc_sw_version guc_sw_version;
>> +} __packed;
>> +
>> +/**
>> + * struct guc_logfile_header - Header of GuC Log Streaming-LFD-File Format.
>> + * This structure encapsulates the layout of the guc-log-file format
>> + */
>> +struct guc_lfd_file_header {
>> + /**
>> + * @magic: A magic number set by producer of a GuC log file to
>> + * identify that file is a valid guc-log-file containing a stream
>> + * of LFDs: Expected value: GUC_LFD_DRIVER_KEY_STREAMING
>> + */
>> + u64 magic;
>> + /**
>> + * @version: Version of this file format layout as per
>> + * guc_lfd_version
>> + */
>> + struct guc_lfd_version version;
>> + /**
>> + * @lfd_stream: A stream of one or more guc_lfd_data LFD data
>> + */
>> + struct guc_lfd_data lfd_stream;
>
> no need to repeat lfd from struct name in field name
>
> s/lfd_stream/stream
sure
>
>> +} __packed;
>> +
>> +#endif
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v6 2/6] drm/xe/guc: Add LFD related abi definitions
2025-07-29 19:08 ` John Harrison
@ 2025-08-20 20:52 ` Dong, Zhanjun
0 siblings, 0 replies; 30+ messages in thread
From: Dong, Zhanjun @ 2025-08-20 20:52 UTC (permalink / raw)
To: John Harrison, intel-xe
On 2025-07-29 3:08 p.m., John Harrison wrote:
> On 7/21/2025 6:35 PM, Zhanjun Dong wrote:
>> Add GuC LFD (Log Format Descriptors) related ABI definitions.
>>
>> Signed-off-by: Zhanjun Dong <zhanjun.dong@intel.com>
>> ---
>> drivers/gpu/drm/xe/abi/guc_lfd_abi.h | 282 +++++++++++++++++++++++++++
>> 1 file changed, 282 insertions(+)
>> create mode 100644 drivers/gpu/drm/xe/abi/guc_lfd_abi.h
>>
>> diff --git a/drivers/gpu/drm/xe/abi/guc_lfd_abi.h b/drivers/gpu/drm/
>> xe/abi/guc_lfd_abi.h
>> new file mode 100644
>> index 000000000000..b6888ab47e25
>> --- /dev/null
>> +++ b/drivers/gpu/drm/xe/abi/guc_lfd_abi.h
>> @@ -0,0 +1,282 @@
>> +/* SPDX-License-Identifier: MIT */
>> +/*
>> + * Copyright © 2025 Intel Corporation
>> + */
>> +
>> +#ifndef _ABI_GUC_LFD_ABI_H_
>> +#define _ABI_GUC_LFD_ABI_H_
>> +
>> +#include <linux/types.h>
>> +
>> +#include "guc_lic_abi.h"
>> +
>> +/* Magic keys define */
>> +#define GUC_LFD_DRIVER_KEY_STREAMING 0x8086AAAA474C5346
>> +#define GUC_LFD_LOG_BUFFER_MARKER_2 0xDEADFEED
>> +#define GUC_LFD_CRASH_DUMP_BUFFER_MARKER_2 0x8086DEAD
>> +#define GUC_LFD_STATE_CAPTURE_BUFFER_MARKER_2 0xBEEFFEED
>> +#define GUC_LFD_LOG_BUFFER_MARKER_1V2 0xCABBA9E6
>> +#define GUC_LFD_STATE_CAPTURE_BUFFER_MARKER_1V2 0xCABBA9F7
>> +#define GUC_LFD_DATA_HEADER_MAGIC 0x8086
> These are not LFD defines. They are the in-memory buffer header magic
> words.
Sure, to be moved out from abi header.
>
>> +
>> +/* The current major version of GuC-Log-File format. */
>> +#define GUC_LFD_FORMAT_VERSION_MAJOR 0x0001
>> +/* The current minor version of GuC-Log-File format. */
>> +#define GUC_LFD_FORMAT_VERSION_MINOR 0x0000
>> +
>> +/** enum guc_lfd_type - Log format descriptor type */
>> +enum guc_lfd_type {
>> + /**
>> + * @GUC_LFD_TYPE_FW_REQUIRED_RANGE_START: Start of range for
>> + * required LFDs from GuC
>> + */
>> + GUC_LFD_TYPE_FW_REQUIRED_RANGE_START = 0x1,
>> + /**
>> + * @GUC_LFD_TYPE_FW_VERSION: GuC Firmware Version structure. LFDs
>> + * payload is guc_lfd_data_fw_version
>> + */
>> + GUC_LFD_TYPE_FW_VERSION = GUC_LIC_TYPE_GUC_SW_VERSION,
> This equality is coincidental not a definition. Indeed, the original
> spec had different numbering for the two enums. It only change to match
> due to an implementation bug! So you should not define them as being
> related and should not make any assumptions in the code about them being
> related.
Got it, to be changed to numbers.
>
>
>> + /**
>> + * @GUC_LFD_TYPE_GUC_DEVICE_ID: GuC microcontroller device ID.
>> + * LFDs payload is guc_lfd_data_guc_devid
>> + */
>> + GUC_LFD_TYPE_GUC_DEVICE_ID = GUC_LIC_TYPE_GUC_DEVICE_ID,
>> + /**
>> + * @GUC_LFD_TYPE_TSC_FREQUENCY: Frequency of GuC timestamps. LFDs
>> + * payload is guc_lfd_data_tsc_freq
>> + */
>> + GUC_LFD_TYPE_TSC_FREQUENCY = GUC_LIC_TYPE_TSC_FREQUENCY,
>> + /**
>> + * @GUC_LFD_TYPE_GMD_ID: HW GMD ID. LFDs payload is
>> + * guc_lfd_data_gmdid
>> + */
>> + GUC_LFD_TYPE_GMD_ID = GUC_LIC_TYPE_GMD_ID,
>> + /**
>> + * @GUC_LFD_TYPE_BUILD_PLATFORM_ID: GuC build platform ID. LFDs
>> + * payload is guc_lfd_data_build_platformid
>> + */
>> + GUC_LFD_TYPE_BUILD_PLATFORM_ID = GUC_LIC_TYPE_BUILD_PLATFORM_ID,
>> + /** @GUC_LFD_TYPE_FW_REQUIRED_RANGE_END: End of this range */
>> + GUC_LFD_TYPE_FW_REQUIRED_RANGE_END = 0x1FFF,
>> + /**
>> + * @GUC_LFD_TYPE_FW_OPTIONAL_RANGE_START: Start of range for
>> + * required LFDs from GuC
>> + */
>> + GUC_LFD_TYPE_FW_OPTIONAL_RANGE_START = 0x2000,
>> + /**
>> + * @GUC_LFD_TYPE_LOG_EVENTS_BUFFER: Log-event-entries buffer. LFDs
>> + * payload is guc_lfd_data_log_events_buf
>> + */
>> + GUC_LFD_TYPE_LOG_EVENTS_BUFFER = 0x2000,
>> + /**
>> + * @GUC_LFD_TYPE_FW_CRASH_DUMP: GuC generated crash-dump blob.
>> + * LFDs payload is guc_lfd_data_fw_crashdump
>> + */
>> + GUC_LFD_TYPE_FW_CRASH_DUMP = 0x2001,
>> + /** @GUC_LFD_TYPE_FW_OPTIONAL_RANGE_END: End of this range */
>> + GUC_LFD_TYPE_FW_OPTIONAL_RANGE_END = 0x3FFF,
>> + /**
>> + * @GUC_LFD_TYPE_KMD_REQUIRED_RANGE_START: Start of range for
>> + * required KMD LFDs
>> + */
>> + GUC_LFD_TYPE_KMD_REQUIRED_RANGE_START = 0x4000,
>> + /**
>> + * @GUC_LFD_TYPE_OS_ID: An identifier for the OS. LFDs payload is
>> + * guc_lfd_data_os_id
>> + */
>> + GUC_LFD_TYPE_OS_ID = 0x4000,
>> + /** @GUC_LFD_TYPE_KMD_REQUIRED_RANGE_END: End of this range */
>> + GUC_LFD_TYPE_KMD_REQUIRED_RANGE_END = 0x5FFF,
>> + /**
>> + * @GUC_LFD_TYPE_KMD_OPTIONAL_RANGE_START: Start of range for
>> + * optional KMD LFDs
>> + */
>> + GUC_LFD_TYPE_KMD_OPTIONAL_RANGE_START = 0x6000,
>> + /**
>> + * @GUC_LFD_TYPE_BINARY_SCHEMA_FORMAT: Binary representation of
>> + * GuC log-events schema. LFDs TLV payload is
>> + * guc_lfd_data_binary_schema
>> + */
>> + GUC_LFD_TYPE_BINARY_SCHEMA_FORMAT = 0x6000,
>> + /**
>> + * @GUC_LFD_TYPE_HOST_COMMENT: ASCII string containing comments
>> + * from the host/KMD. LFDs TLV payload is
>> + * guc_lfd_data_host_comment
>> + */
>> + GUC_LFD_TYPE_HOST_COMMENT = 0x6001,
>> + /** @GUC_LFD_TYPE_KMD_OPTIONAL_RANGE_END: End of this range */
>> + GUC_LFD_TYPE_KMD_OPTIONAL_RANGE_END = 0x7FFF,
>> + /** @GUC_LFD_TYPE_RESERVED_RANGE_START: Start of reserved range */
>> + GUC_LFD_TYPE_RESERVED_RANGE_START = 0x8000,
>> + /** @GUC_LFD_TYPE_RESERVED_RANGE_END: End of this range */
>> + GUC_LFD_TYPE_RESERVED_RANGE_END = 0xFFFF,
>> +};
> Personally, I find the above impossible to read at a glance. The
> comments add nothing - GUC_LFD_TYPE_KMD_REQUIRED_RANGE_START is
> described as "Start of range for required KMD LFDs". Well, yeah, I can
> get that from the name. I think this whole section would be much easier
> to read if was just the enums:
>
> + GUC_LFD_TYPE_KMD_REQUIRED_RANGE_START = 0x4000,
> + GUC_LFD_TYPE_OS_ID = 0x4000,
> + GUC_LFD_TYPE_KMD_REQUIRED_RANGE_END = 0x5FFF,
>
> The structure definitions and such for the individual entries can refer
> back to the define they are associated with. But this section would be
> more use if it is a simple list of enum values that is quick and easy to
> scan through.
Good idea, comments for each items make it hard to read here.
We might still want to have kernel docs, so maybe I can change each
range like:
/**
* @GUC_LFD_TYPE_KMD_REQUIRED_RANGE_START : Start of range for
* required KMD LFDs
* @GUC_LFD_TYPE_OS_ID: An identifier for the OS
* @GUC_LFD_TYPE_KMD_REQUIRED_RANGE_END : End of range for
* required KMD LFDs
*/
GUC_LFD_TYPE_KMD_REQUIRED_RANGE_START = 0x4000,
GUC_LFD_TYPE_OS_ID = 0x4000,
GUC_LFD_TYPE_KMD_REQUIRED_RANGE_END = 0x5FFF,
>
>> +
>> +/** enum guc_lfd_os_type - OS Type LFD-ID */
>> +enum guc_lfd_os_type {
>> + /** @GUC_LFD_OS_TYPE_OSID_WIN: Windows OS */
>> + GUC_LFD_OS_TYPE_OSID_WIN = 0x1,
>> + /** @GUC_LFD_OS_TYPE_OSID_LIN: Linux OS */
>> + GUC_LFD_OS_TYPE_OSID_LIN = 0x2,
>> + /** @GUC_LFD_OS_TYPE_OSID_VMW: VMWare OS */
>> + GUC_LFD_OS_TYPE_OSID_VMW = 0x3,
>> + /** @GUC_LFD_OS_TYPE_OSID_OTHER: Other */
>> + GUC_LFD_OS_TYPE_OSID_OTHER = 0x4,
>> +};
>> +
>> +/**
>> + * struct guc_lfd_data - Log format descriptor (LFD).
>> + * A type of KLV with custom field-sizes + magic numbers.
> This description tells me nothing that I can't immediately see from
> looking at the contents. Maybe just say "A generic header structure for
> all LFD blocks".
Will follow.
>
>> + */
>> +struct guc_lfd_data {
>> + /** @dw0: A 32 bits dword, contains multiple bit fields */
>> + u32 dw0;
> 'header' would be better than 'dw0'.
sure>
>> + /*
>> + * Expected value: GUC_LFD_DATA_HEADER_MAGIC.
>> + * Helpful in detecting file errors.
> Why 'expected value'? Indeed, I don't think this comment is worth having
> at all.
To be removed.>> + */
>> +#define GUC_LFD_DATA_MAGIC GENMASK(15, 0)
> Calling this 'DATA_MAGIC' implies it is related to the 'data' field
> below. Assuming that 'dw0' is renamed to 'header' then this shld be
> 'GUC_LFD_HEADER_MAGIC'.
Will do a cleanup among this series, to rename all macros names for
GENMASK to be
STRUCTURE_NAME_XXX_MASK_YYY
XXX is structure field name
YYY is bit field name
for example:
GUC_LFD_DATA_HEADER_MASK_TYPE
GUC_LFD_DATA_HEADER_MASK_MAGIC
>> + /*
>> + * File descriptor type (the 'T' in TLV) is used to identify how
>> + * to interpret `data` below. For the range of types, see
>> + * guc_lfd_type
> Again, this is a redundant comment. Also, the KMD uses KLV not TLV.
Need to confirm TLV or KLV
>> + */
>> +#define GUC_LFD_DATA_DESC_TYPE GENMASK(31, 16)
> Again, GUC_LFD_HEADER_TYPE would be a better name.
Will be GUC_LFD_DATA_HEADER_MASK_TYPE
>
>> + /** @dw_size: Number of dwords the `data` field contains. */
>> + u32 dw_size;
> data_size
size might mislead to byte size, will use data_count
>> + /** @data: Data defined by File descriptor type. */
> Defined by GUC_LFD_HEADER_TYPE.
Sure
>> + u32 data[] __counted_by(dw_size);
>> +} __packed;
>> +
>> +/**
>> + * struct guc_lfd_version - GuC Log File Format Version.
> LFD is Log File Descriptor not Log File Format.
Struct to be removed
>> + * Major-Minor is not a fractional number (i.e. Ver 1.3 would be older
>> + * than 1.12)
>> + */
>> +struct guc_lfd_version {
>> + /** @dw0: A 32 bits dword, contains multiple bit fields */
>> + u32 dw0;
>> + /*
>> + * Guc-Log-File Format minor version. Must be
>> + * GUC_LOG_FILE_FORMAT_VERSION_MINOR
>> + */
>> +#define GUC_LFD_VERSION_MINOR GENMASK(15, 0)
>> + /*
>> + * Guc-Log-File Format major version. Must be
>> + * GUC_LOG_FILE_FORMAT_VERSION_MAJOR
>> + */
>> +#define GUC_LFD_VERSION_MAJOR GENMASK(31, 16)
>> +} __packed;
> Again, no point in having a structure defined for a single u32. Just the
> bit field definitions is all we need.
Yes, will do that way>
>> +
>> +/**
>> + * struct guc_lfd_data_guc_devid - GuC Device ID.
>> + * This is mandatory fw LFD data
> "fw" meaning firmware? But this is the LFD as created entirely by the
> KMD, the firmware is not involved. Should just say "This is a mandatory
> LFD block."
will do>
>> + */
>> +struct guc_lfd_data_guc_devid {
>> + /**
>> + * @guc_devid: GuC microcontroller device ID defined as described
>> + * in GUC_LIC_TYPE_GUC_DEVICE_ID
>> + */
>> + u32 guc_devid;
>> +} __packed;
>> +
>> +/**
>> + * struct guc_lfd_data_tsc_freq - GuC TSC Fequency.
>> + * This is mandatory fw LFD data
>> + */
>> +struct guc_lfd_data_tsc_freq {
>> + /**
>> + * @tsc_freq: GuC timestamp counter frequency as described in
>> + * GUC_LIC_TYPE_TSC_FREQUENCY
>> + */
>> + u32 tsc_freq;
>> +} __packed;
>> +
>> +/** struct guc_lfd_data_gmdid - GMD ID. */
>> +struct guc_lfd_data_gmdid {
>> + /** @gmd_id: GMD ID as described in GUC_LIC_TYPE_GMD_ID */
>> + u32 gmd_id;
>> +} __packed;
>> +
>> +/** struct guc_lfd_data_build_platformid - GuC build platform ID. */
>> +struct guc_lfd_data_build_platformid {
>> + /**
>> + * @platform_build_id: GuC build platform ID as described in
>> + * GUC_LIC_TYPE_BUILD_PLATFORM_ID
>> + */
>> + u32 platform_build_id;
>> +} __packed;
> Again, not sure these four are worth having structure definitions for. A
> comment that says LFD_DEVID maps to LIC_DEVID, etc. would be sufficient.
Agree, not worth to declare a structure, especially a single u32.
There is an difference between LFD and LIC values, The payload(or value)
for above is one u32, and for LIC, it is KLV, which has extra length
field, make it possible to more than 1 u32. There is no conflict at this
moment, but some assertion is needed to prevent further mismatch.
>> +
>> +/**
>> + * struct guc_lfd_data_log_events_buf - GuC Log Events Buffer.
>> + * This is optional fw LFD data
> As above, this is not a firmware generated data stream. Should just say
> "This is an optional LFD block.".
>
>> + */
>> +struct guc_lfd_data_log_events_buf {
>> + /**
>> + * @log_events_format_version: version of GuC log format of buffer
>> + */
>> + u32 log_events_format_version;
>> + /**
>> + * @log_format_buf: If `log_format_version` == 1, array of
>> + * guc_log_format_version_1. If `log_format_version` == 2, array
>> + * of guc_log_format_version_2. Dword size determined by
>> + * guc_logfile_lfd.`desc_dw_size` - 1
> This does not match the name you used in the parent LFD header
> structure. Should just say "Size in dwords is LFD block size - 1".
sure
>
>> + */
>> + u32 log_format_buf[];
>> +} __packed;
>> +
>> +/**
>> + * struct guc_lfd_data_os_info - OS Version Information.
>> + * This is mandatory host LFD data
> As above, this is all being created by the host so no need to specify.
To be removed.>
>> + */
>> +struct guc_lfd_data_os_info {
>> + /**
>> + * @os_id: enum values to identify the OS brand (1=Windows,
>> + * 2=Linux, etc..). See guc_lfd_os_type for the range of types
> Should not repeat a subset of the enum definition values here. Just
> reference the enum name.
Sure
>> + */
>> + u32 os_id;
>> + /**
>> + * @build_version: ASCII string containing OS build version
>> + * information based on os_id. String is padded with null
>> + * characters to ensure its DWORD aligned. Dword size determined
>> + * by guc_logfile_lfd.`desc_dw_size` - 1
> As above about naming.
Sure
>> + */
>> + char build_version[];
>> +} __packed;
>> +
>> +/**
>> + * struct guc_lfd_data_fw_version - GuC FW Version.
>> + * This is mandatory fw LFD data
>> + */
>> +struct guc_lfd_data_fw_version {
>> + /**
>> + * @guc_sw_version: The full version of the GuC microkernel that
>> + * generated the logs as described in
>> + * GUC_LIC_TYPE_GUC_SW_VERSION.
> Except that the log data block is optional and so not necessarily
> present. Should just say "The full version of the GuC firmware.".
>
>> + */
>> + struct guc_sw_version guc_sw_version;
>> +} __packed;
> Although, again this is a single u32 structure, which seems pointless. A
> comment description would be sufficient.
Yes, no need for single u32, To be removed>
>> +
>> +/**
>> + * struct guc_logfile_header - Header of GuC Log Streaming-LFD-File
>> Format.
>> + * This structure encapsulates the layout of the guc-log-file format
>> + */
>> +struct guc_lfd_file_header {
>> + /**
>> + * @magic: A magic number set by producer of a GuC log file to
>> + * identify that file is a valid guc-log-file containing a stream
>> + * of LFDs: Expected value: GUC_LFD_DRIVER_KEY_STREAMING
>> + */
>> + u64 magic;
>> + /**
>> + * @version: Version of this file format layout as per
>> + * guc_lfd_version
>> + */
>> + struct guc_lfd_version version;
>> + /**
>> + * @lfd_stream: A stream of one or more guc_lfd_data LFD data
> "LFD blocks" is a better way to describe them than "LFD data". Data can
> mean pretty much anything, whereas block implies a discrete unit.
will be LFD blocks>
>> + */
>> + struct guc_lfd_data lfd_stream;
> Technically, this is just a single LFD block, not a stream. And you
> can't really do 'lfd_stream[]' because blocks are variable in size.
> Would be better to just say "u32 lfd_stream[];".
Sounds good
> John.
>
>
>> +} __packed;
>> +
>> +#endif
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v6 3/6] drm/xe/guc: Add new debugfs entry for lfd format output
2025-07-29 19:19 ` John Harrison
@ 2025-08-20 22:03 ` Dong, Zhanjun
0 siblings, 0 replies; 30+ messages in thread
From: Dong, Zhanjun @ 2025-08-20 22:03 UTC (permalink / raw)
To: John Harrison, intel-xe
See my comments inline below.
Regards,
Zhanjun Dong
On 2025-07-29 3:19 p.m., John Harrison wrote:
> On 7/21/2025 6:35 PM, Zhanjun Dong wrote:
>> Add new debugfs entry "guc_log_lfd", prepared for output guc log
>> in LFD(Log Format Descriptors) format.
>>
>> Signed-off-by: Zhanjun Dong <zhanjun.dong@intel.com>
>> ---
>> drivers/gpu/drm/xe/xe_guc_debugfs.c | 7 +++++++
>> drivers/gpu/drm/xe/xe_guc_log.c | 32 +++++++++++++++++++++++++++++
>> drivers/gpu/drm/xe/xe_guc_log.h | 1 +
>> 3 files changed, 40 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/xe/xe_guc_debugfs.c b/drivers/gpu/drm/xe/
>> xe_guc_debugfs.c
>> index 0b102ab46c4d..6cbc4240a3bd 100644
>> --- a/drivers/gpu/drm/xe/xe_guc_debugfs.c
>> +++ b/drivers/gpu/drm/xe/xe_guc_debugfs.c
>> @@ -85,6 +85,12 @@ static int guc_log(struct xe_guc *guc, struct
>> drm_printer *p)
>> return 0;
>> }
>> +static int guc_log_lfd(struct xe_guc *guc, struct drm_printer *p)
>> +{
>> + xe_guc_log_print_lfd(&guc->log, p);
>> + return 0;
>> +}
>> +
>> static int guc_log_dmesg(struct xe_guc *guc, struct drm_printer *p)
>> {
>> xe_guc_log_print_dmesg(&guc->log);
>> @@ -121,6 +127,7 @@ static const struct drm_info_list
>> slpc_debugfs_list[] = {
>> /* everything else should be added here */
>> static const struct drm_info_list pf_only_debugfs_list[] = {
>> { "guc_log", .show = guc_debugfs_show, .data = guc_log },
>> + { "guc_log_lfd", .show = guc_debugfs_show, .data = guc_log_lfd },
>> { "guc_log_dmesg", .show = guc_debugfs_show, .data =
>> guc_log_dmesg },
>> };
>> diff --git a/drivers/gpu/drm/xe/xe_guc_log.c b/drivers/gpu/drm/xe/
>> xe_guc_log.c
>> index c01ccb35dc75..d2256773aaf3 100644
>> --- a/drivers/gpu/drm/xe/xe_guc_log.c
>> +++ b/drivers/gpu/drm/xe/xe_guc_log.c
>> @@ -9,6 +9,7 @@
>> #include <drm/drm_managed.h>
>> +#include "abi/guc_lfd_abi.h"
>> #include "regs/xe_guc_regs.h"
>> #include "xe_bo.h"
>> #include "xe_devcoredump.h"
>> @@ -19,6 +20,12 @@
>> #include "xe_mmio.h"
>> #include "xe_module.h"
>> +static const struct guc_lfd_file_header default_guc_lfd_file_header = {
>> + .magic = GUC_LFD_DRIVER_KEY_STREAMING,
>> + .version.dw0 = FIELD_PREP_CONST(GUC_LFD_VERSION_MINOR,
>> GUC_LFD_FORMAT_VERSION_MINOR) |
>> + FIELD_PREP_CONST(GUC_LFD_VERSION_MAJOR,
>> GUC_LFD_FORMAT_VERSION_MAJOR)
>> +};
> For the sake of two words, I'm not seeing that it is worth having this
> as a static global structure. You are going to need to either copy it to
> a local structure that you then fill in the 'lfd_stream' field of or
> only output the first part of the structure. Either option is messy.
To be removed
>
>> +
>> static struct xe_guc *
>> log_to_guc(struct xe_guc_log *log)
>> {
>> @@ -216,6 +223,17 @@ void xe_guc_log_snapshot_print(struct
>> xe_guc_log_snapshot *snapshot, struct drm_
>> }
>> }
>> +static void
>> +xe_guc_log_snapshot_print_lfd(struct xe_guc_log_snapshot *snapshot,
>> struct drm_printer *p)
>> +{
>> + if (!snapshot || !snapshot->size)
>> + return;
>> +
>> + /* Output LFD file header */
>> + xe_print_blob_ascii85(p, "[LOG].data", 0,
>> &default_guc_lfd_file_header, 0,
>> + offsetof(struct guc_lfd_file_header, lfd_stream));
> This is not an LFD format output. And a quick glance I am not seeing it
> being replaced in any of the later patches.
>
> Also, all you are generating at this point is a header with no actual
> LFD blocks. That would not be a valid LFD stream. You should move this
> patch to much later in the series (if not the end) so you only start
> generating a file when it is a valid file.
From
https://docs.kernel.org/process/submitting-patches.html
"
When dividing your change into a series of patches, take special care to
ensure that the kernel builds and runs properly after each patch in the
series.
"
LFD feature code is called by debugfs, if debugfs is the number 2 patch
in series, build #1 will get "xxx not referenced" build error.
Might discuss offline.
>
>> +}
>> +
>> /**
>> * xe_guc_log_print_dmesg - dump a copy of the GuC log to dmesg
>> * @log: GuC log structure
>> @@ -251,6 +269,20 @@ void xe_guc_log_print(struct xe_guc_log *log,
>> struct drm_printer *p)
>> xe_guc_log_snapshot_free(snapshot);
>> }
>> +/**
>> + * xe_guc_log_print_lfd - dump a copy of the GuC log to some useful
>> location
> Is this a cut/paste comment from somewhere else?
To be changed to:
xe_guc_log_print_lfd - dump a copy of the GuC log in LFD format>
> John.
>
>> + * @log: GuC log structure
>> + * @p: the printer object to output to
>> + */
>> +void xe_guc_log_print_lfd(struct xe_guc_log *log, struct drm_printer *p)
>> +{
>> + struct xe_guc_log_snapshot *snapshot;
>> +
>> + snapshot = xe_guc_log_snapshot_capture(log, false);
>> + xe_guc_log_snapshot_print_lfd(snapshot, p);
>> + xe_guc_log_snapshot_free(snapshot);
>> +}
>> +
>> int xe_guc_log_init(struct xe_guc_log *log)
>> {
>> struct xe_device *xe = log_to_xe(log);
>> diff --git a/drivers/gpu/drm/xe/xe_guc_log.h b/drivers/gpu/drm/xe/
>> xe_guc_log.h
>> index f1e2b0be90a9..0f6299886010 100644
>> --- a/drivers/gpu/drm/xe/xe_guc_log.h
>> +++ b/drivers/gpu/drm/xe/xe_guc_log.h
>> @@ -40,6 +40,7 @@ struct xe_device;
>> int xe_guc_log_init(struct xe_guc_log *log);
>> void xe_guc_log_print(struct xe_guc_log *log, struct drm_printer *p);
>> +void xe_guc_log_print_lfd(struct xe_guc_log *log, struct drm_printer
>> *p);
>> void xe_guc_log_print_dmesg(struct xe_guc_log *log);
>> struct xe_guc_log_snapshot *xe_guc_log_snapshot_capture(struct
>> xe_guc_log *log, bool atomic);
>> void xe_guc_log_snapshot_print(struct xe_guc_log_snapshot *snapshot,
>> struct drm_printer *p);
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v6 6/6] drm/xe/guc: Only add GuC crash dump if available
2025-08-04 21:21 ` John Harrison
@ 2025-08-21 22:26 ` Dong, Zhanjun
0 siblings, 0 replies; 30+ messages in thread
From: Dong, Zhanjun @ 2025-08-21 22:26 UTC (permalink / raw)
To: John Harrison, intel-xe
On 2025-08-04 5:21 p.m., John Harrison wrote:
> On 8/4/2025 1:14 PM, John Harrison wrote:
>> On 7/21/2025 6:35 PM, Zhanjun Dong wrote:
>>> Add GuC crash dump data empty check. LFD will only include crash dump
>>> section when data is not empty.
>>>
>>> Signed-off-by: Zhanjun Dong<zhanjun.dong@intel.com>
>>> ---
>>> drivers/gpu/drm/xe/xe_guc_log.c | 60 +++++++++++++++++++++++++++++++++
>>> 1 file changed, 60 insertions(+)
>>>
>>> diff --git a/drivers/gpu/drm/xe/xe_guc_log.c b/drivers/gpu/drm/xe/
>>> xe_guc_log.c
>>> index a8910211c579..f5f31f15e7e3 100644
>>> --- a/drivers/gpu/drm/xe/xe_guc_log.c
>>> +++ b/drivers/gpu/drm/xe/xe_guc_log.c
>>> @@ -502,6 +502,65 @@ xe_guc_log_add_log_event(struct drm_printer *p,
>>> struct xe_guc_log_snapshot *snap
>>> return size;
>>> }
>>> +static int
>>> +xe_guc_log_add_crash_dump(struct drm_printer *p, struct
>>> xe_guc_log_snapshot *snapshot,
>>> + struct guc_lic_save *config)
>>> +{
>>> + struct guc_log_buffer_entry_list *entry;
>>> + int chunk_from, chunk_id, to_chunk_id;
>>> + int pos, from, to;
>>> + size_t size = 0;
>>> + char buf[GUC_LFD_BUFFER_SIZE] = {0};
>>> +
>>> + entry = &config->entry[GUC_LOG_BUFFER_STATE_HEADER_ENTRY_CRASH];
>>> +
>>> + /* Skip zero sized crash dump */
>>> + if (!entry->buf_size)
>>> + return 0;
>>> +
>>> + /* Check if crash dump section are all zero */
>>> + from = entry->offset;
>>> + to = entry->offset + entry->buf_size;
>>> + chunk_from = from % GUC_LOG_CHUNK_SIZE;
>>> + chunk_id = from / GUC_LOG_CHUNK_SIZE;
>>> + to_chunk_id = to / GUC_LOG_CHUNK_SIZE;
>>> + pos = from;
>>> +
>>> + do {
>>> + size_t size = (to_chunk_id > chunk_id ? GUC_LOG_CHUNK_SIZE :
>>> to) - chunk_from;
>>> + u32 *buf32 = snapshot->copy[chunk_id] + chunk_from;
>>> + int i;
>>> +
>>> + for (i = 0; i < size / sizeof(u32); i++)
>>> + if (buf32[i])
>>> + break;
>>> + if (i < size / sizeof(u32)) {
>>> + pos += i * sizeof(u32) - chunk_from;
>>> + break;
>>> + }
>>> + pos += size;
>>> + chunk_id++;
>>> + chunk_from = 0;
>>> + } while (pos < to);
>>> +
>>> + /* Buffer has non-zero data? */
>>> + if (pos < to) {
>>> + struct guc_lfd_data *lfd = (void *)buf;
>>> +
>>> + size = xe_guc_log_add_lfd_header(buf, GUC_LFD_BUFFER_SIZE);
>>> + lfd->dw0 |= FIELD_PREP(GUC_LFD_DATA_DESC_TYPE,
>>> GUC_LFD_TYPE_FW_CRASH_DUMP);
>>> + /* Calculate data length */
>>> + lfd->dw_size = DIV_ROUND_UP(entry->buf_size, sizeof(u32));
>>> + /* Output GUC_LFD_TYPE_FW_CRASH_DUMP header */
>>> + xe_print_blob_ascii85(p, NULL, 0, buf, 0, size);
>>> +
>>> + /* rd/wr ptr is not used for crash dump */
>>> + xe_guc_log_print_over_chunks(p, snapshot, entry->offset,
>>> + entry->offset + entry->buf_size);
>>> + }
>>> + return size;
>> Can't help but think that this is all way too complicated.
>>
>> The crash dump buffer is never going to be more than 1MB. And that
>> size is the smallest we can allocate when using large units in order
>> to get a larger log buffer (because the units are shared). My
>> understanding is that the actual size used is only a few pages
>> (currently working on getting a definitive answer from someone who
>> knows). So it would be far simpler to just save the crash buffer to
>> its own single, contiguous allocation in the snapshot with no chunking
>> required.
> Just got an answer back. The size is needed is 12KB currently but will
> shortly rise to 16KB. So a private allocation in the snapshot will be
> sufficient and is definitely going to be simpler than going through the
> chunking stuff.
Nice to hear no need to handle across chunks.
It could be a single buffer print.
>
> Unfortunately, that also means that our current default of 8KB in non-
> debug builds is too small! Can you post a patch to bump that up to 16KB?
Sure, I will. As it will be out of LFD scope, that will be a separate patch.
Regard,
Zhanjun Dong>
> Thanks,
> John.
>
>>
>> Then all the above complication disappears. You get a simple "for(i =
>> 0; i < size; i++) if(i) break;" to check for empty and a single print
>> buffer call.
>>
>> John.
>>
>>> +}
>>> +
>>> static void
>>> xe_guc_log_snapshot_print_lfd(struct xe_guc_log_snapshot *snapshot,
>>> struct drm_printer *p)
>>> {
>>> @@ -522,6 +581,7 @@ xe_guc_log_snapshot_print_lfd(struct
>>> xe_guc_log_snapshot *snapshot, struct drm_p
>>> return;
>>> xe_guc_log_add_log_event(p, snapshot, &config);
>>> + xe_guc_log_add_crash_dump(p, snapshot, &config);
>>> }
>>> /**
>>
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v6 5/6] drm/xe/guc: Add GuC log event buffer output in LFD format
2025-07-30 17:40 ` John Harrison
@ 2025-08-22 0:19 ` Dong, Zhanjun
0 siblings, 0 replies; 30+ messages in thread
From: Dong, Zhanjun @ 2025-08-22 0:19 UTC (permalink / raw)
To: John Harrison, intel-xe
See my comments inline below.
Regards,
Zhanjun Dong
On 2025-07-30 1:40 p.m., John Harrison wrote:
> On 7/21/2025 6:35 PM, Zhanjun Dong wrote:
>> Add GuC log event buffer output in LFD format.
>>
>> Signed-off-by: Zhanjun Dong <zhanjun.dong@intel.com>
>> ---
>> drivers/gpu/drm/xe/xe_guc_log.c | 88 ++++++++++++++++++++++++++++++++-
>> 1 file changed, 87 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/gpu/drm/xe/xe_guc_log.c b/drivers/gpu/drm/xe/
>> xe_guc_log.c
>> index 609a9fd5ba0c..a8910211c579 100644
>> --- a/drivers/gpu/drm/xe/xe_guc_log.c
>> +++ b/drivers/gpu/drm/xe/xe_guc_log.c
>> @@ -421,10 +421,92 @@ xe_guc_log_output_lfd_init(struct drm_printer
>> *p, struct xe_guc_log_snapshot *sn
>> return size;
>> }
>> +static void
>> +xe_guc_log_print_over_chunks(struct drm_printer *p, struct
>> xe_guc_log_snapshot *snapshot,
>> + u32 from, u32 to)
> _over_ ?
or across?>
>> +{
>> + int chunk_from = from % GUC_LOG_CHUNK_SIZE;
>> + int chunk_id = from / GUC_LOG_CHUNK_SIZE;
>> + int to_chunk_id = to / GUC_LOG_CHUNK_SIZE;
>> + int chunk_to = to % GUC_LOG_CHUNK_SIZE;
>> + int pos = from;
>> +
>> + do {
>> + size_t size = (to_chunk_id > chunk_id ? GUC_LOG_CHUNK_SIZE :
>> chunk_to) - chunk_from;
>> +
>> + xe_print_blob_ascii85(p, NULL, 0, snapshot->copy[chunk_id],
>> chunk_from, size);
>> + pos += size;
>> + chunk_id++;
>> + chunk_from = 0;
>> + } while (pos < to);
>> +}
>> +
>> +static void
>> +xe_guc_log_lfd_print_from_chunks(struct drm_printer *p, struct
>> xe_guc_log_snapshot *snapshot,
>> + struct guc_log_buffer_entry_list *entry)
>> +{
>> + /* Output data from guc log chunks directly */
>> + if (entry->rd_ptr < entry->wr_ptr) {
>> + xe_guc_log_print_over_chunks(p, snapshot,
>> + entry->offset + entry->rd_ptr,
>> + entry->offset + entry->wr_ptr);
>> + } else {
>> + /* print from rd to buf end 1st */
>> + xe_guc_log_print_over_chunks(p, snapshot,
>> + entry->offset + entry->rd_ptr,
>> + entry->offset + entry->buf_size);
> The log does not necessarily reach the end. Indeed, the v2 format is 5
> dwords which does not fit neatly into a page. So you need to stop at
> buff_wrap_offset not buf_size.
Thanks, will stop at buff_wrap_offset >
> Also, remember that the primary aim here is for streaming output -
> continuously dumping data, not just a single snapshot. And in that case,
> we should be sending a FLUSH_LOG H2G command and then dumping up to
> sampled_log_buf_wr_ptr rather than wr_ptr. And in the case of streaming
> output, taking a snapshot copy of the log is probably not worth doing.
> We can just dump directly from the live buffer.
>
> I'm not seeing anything that writes to rd_ptr. The KMD is responsible
> for updating the read pointer after reading the data. The GuC does not
> know what we have or have not read.
Will do flush and write to rd_ptr later, for now, I can use guc_log to
verify lfd output contents.
>
>> +
>> + /* print from buf start to wr */
>> + xe_guc_log_print_over_chunks(p, snapshot, entry->offset,
>> + entry->offset + entry->wr_ptr);
>> + }
>> +}
>> +
>> +static inline int
>> +xe_guc_log_add_log_event(struct drm_printer *p, struct
>> xe_guc_log_snapshot *snapshot,
>> + struct guc_lic_save *config)
>> +{
>> + size_t size;
>> + u32 data_len;
>> + struct guc_lfd_data *lfd;
>> + struct guc_log_buffer_entry_list *entry;
>> + struct guc_lfd_data_log_events_buf *events_buf;
>> + char buf[GUC_LFD_BUFFER_SIZE] = {0};
> As per other patch, this is a very bad idea for multiple reasons.
>
>> +
>> + lfd = (void *)buf;
>> + entry = &config->entry[GUC_LOG_BUFFER_STATE_HEADER_ENTRY_LOG];
>> +
>> + /* Skip empty log */
>> + if (entry->rd_ptr == entry->wr_ptr)
>> + return 0;
>> +
>> + size = xe_guc_log_add_lfd_header(buf, GUC_LFD_BUFFER_SIZE);
>> + lfd->dw0 |= FIELD_PREP(GUC_LFD_DATA_DESC_TYPE,
>> GUC_LFD_TYPE_LOG_EVENTS_BUFFER);
>> + events_buf = (void *)&lfd->data;
>> + events_buf->log_events_format_version = config->version;
>> +
>> + /* Adjust to log_format_buf */
>> + data_len = offsetof(struct guc_lfd_data_log_events_buf,
>> log_format_buf);
>> + size += data_len;
> This all seems a very complicated way of doing things. Why not just have
> a structure which is the event buffer LFD block - header, magic,
> version, etc. Create one of those on the stack as a local variable, fill
> it in and write it out. No need for complicated type casting,
> offsetting, pointer arithmetic, etc.
Will optimize
>
>> +
>> + /* Calculate data length */
>> + data_len += (entry->wr_ptr + entry->buf_size - entry->rd_ptr) %
>> entry->buf_size;
> As above, this is not correct as the end of the log is the wrap_offset
> not the size. And in the case where the log is not wrapped, the size is
> just wr - rd and size is not relevant.
Yes, to be adjust to use wrap_offset>
>> + /* make length u32 aligned */
>> + lfd->dw_size = DIV_ROUND_UP(data_len, sizeof(u32));
> Is this just a belt and braces check? The log entries are multiples of
> either 4 or 5 words so data_len must be 32-bit aligned unless something
> is badly broken somewhere.
kind of, just make sure u32 aligned.>
> John.
>
>> +
>> + /* Output GUC_LFD_TYPE_LOG_EVENTS_BUFFER header */
>> + xe_print_blob_ascii85(p, NULL, 0, buf, 0, size);
>> + xe_guc_log_lfd_print_from_chunks(p, snapshot, entry);
>> +
>> + /* log event buffer content did not use buf, exclude from size
>> count */
>> + return size;
>> +}
>> +
>> static void
>> xe_guc_log_snapshot_print_lfd(struct xe_guc_log_snapshot *snapshot,
>> struct drm_printer *p)
>> {
>> struct guc_lic_save config;
>> + size_t size;
>> if (!snapshot || !snapshot->size)
>> return;
>> @@ -435,7 +517,11 @@ xe_guc_log_snapshot_print_lfd(struct
>> xe_guc_log_snapshot *snapshot, struct drm_p
>> /* Output LFD stream */
>> xe_guc_log_load_lic(snapshot->copy[0], &config);
>> - xe_guc_log_output_lfd_init(p, snapshot, &config);
>> + size = xe_guc_log_output_lfd_init(p, snapshot, &config);
>> + if (size < 0)
>> + return;
>> +
>> + xe_guc_log_add_log_event(p, snapshot, &config);
>> }
>> /**
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v6 4/6] drm/xe/guc: Add GuC log init config in LFD format
2025-07-30 0:27 ` John Harrison
2025-07-30 23:40 ` Dong, Zhanjun
@ 2025-08-22 21:59 ` Dong, Zhanjun
1 sibling, 0 replies; 30+ messages in thread
From: Dong, Zhanjun @ 2025-08-22 21:59 UTC (permalink / raw)
To: John Harrison, intel-xe
See my comments inline below.
Regards,
Zhanjun Dong
On 2025-07-29 8:27 p.m., John Harrison wrote:
> On 7/21/2025 6:35 PM, Zhanjun Dong wrote:
>> Add support to output GuC log init config (LIC) in LFD format.
>>
>> Signed-off-by: Zhanjun Dong <zhanjun.dong@intel.com>
>> ---
>> drivers/gpu/drm/xe/xe_guc_log.c | 204 ++++++++++++++++++++++++++++++++
>> 1 file changed, 204 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/xe/xe_guc_log.c b/drivers/gpu/drm/xe/
>> xe_guc_log.c
>> index d2256773aaf3..609a9fd5ba0c 100644
>> --- a/drivers/gpu/drm/xe/xe_guc_log.c
>> +++ b/drivers/gpu/drm/xe/xe_guc_log.c
>> @@ -7,6 +7,7 @@
>> #include <linux/fault-inject.h>
>> +#include <linux/utsname.h>
>> #include <drm/drm_managed.h>
>> #include "abi/guc_lfd_abi.h"
>> @@ -20,12 +21,67 @@
>> #include "xe_mmio.h"
>> #include "xe_module.h"
>> +/* LFD supported LIC type range */
>> +#define GUC_LOG_LIC_TYPE_FIRST (GUC_LIC_TYPE_GUC_SW_VERSION)
>> +#define GUC_LOG_LIC_TYPE_LAST (GUC_LIC_TYPE_BUILD_PLATFORM_ID)
>> +
>> +#define GUC_LOG_BUFFER_STATE_HEADER_LENGTH 4096
>> +#define GUC_LOG_BUFFER_STATE_HEADER_ENTRY_LOG 0
>> +#define GUC_LOG_BUFFER_STATE_HEADER_ENTRY_CRASH 1
>> +#define GUC_LOG_BUFFER_STATE_HEADER_ENTRY_CAPTURE 2
> These are already defined in guc_log_abi.h.
Will use the existing guc_log_buffer_type enum.
>
>> +#define GUC_LOG_BUFFER_STATE_HEADER_ENTRY_INIT 3
> And the LIC is not/does not have a guc_log_buffer_state header.
>
>> +#define GUC_LOG_BUFFER_STATE_HEADER_ENTRY_COUNT 4
>> +
>> +#define GUC_LFD_BUFFER_SIZE SZ_1K
>> +
>> +struct guc_log_buffer_entry_list {
>> + u32 offset;
>> + u32 rd_ptr;
>> + u32 wr_ptr;
>> + u32 buf_size;
>> +};
>> +
>> +struct guc_lic_save {
>> + u32 version;
>> + /*
>> + * Array of init config KLVs.
>> + * Range from GUC_LOG_LIC_TYPE_FIRST to GUC_LOG_LIC_TYPE_LAST
>> + */
>> + u32 KLV[GUC_LOG_LIC_TYPE_LAST - GUC_LOG_LIC_TYPE_FIRST + 1];
>> + struct guc_log_buffer_entry_list
>> entry[GUC_LOG_BUFFER_STATE_HEADER_ENTRY_COUNT];
>> +};
>> +
>> +static const struct guc_lfd_data default_guc_lfd_data = {
>> + .dw0 = FIELD_PREP_CONST(GUC_LFD_DATA_MAGIC,
>> GUC_LFD_DATA_HEADER_MAGIC)
>> +};
>> +
>> static const struct guc_lfd_file_header default_guc_lfd_file_header = {
>> .magic = GUC_LFD_DRIVER_KEY_STREAMING,
>> .version.dw0 = FIELD_PREP_CONST(GUC_LFD_VERSION_MINOR,
>> GUC_LFD_FORMAT_VERSION_MINOR) |
>> FIELD_PREP_CONST(GUC_LFD_VERSION_MAJOR,
>> GUC_LFD_FORMAT_VERSION_MAJOR)
>> };
>> +static struct guc_log_buffer_entry_markers {
>> + u32 key[2];
>> +} const entry_markers[4] = {
>> + {{
>> + GUC_LFD_LOG_BUFFER_MARKER_1V2,
>> + GUC_LFD_LOG_BUFFER_MARKER_2
>> + }},
>> + {{
>> + GUC_LFD_LOG_BUFFER_MARKER_1V2,
>> + GUC_LFD_CRASH_DUMP_BUFFER_MARKER_2
>> + }},
>> + {{
>> + GUC_LFD_STATE_CAPTURE_BUFFER_MARKER_1V2,
>> + GUC_LFD_STATE_CAPTURE_BUFFER_MARKER_2
>> + }},
>> + {{
>> + GUC_LIC_MAGIC,
>> + ((GUC_LIC_FORMAT_VERSION_MAJOR << 16) |
>> GUC_LIC_FORMAT_VERSION_MINOR)
>> + }}
>> +};
>> +
>> static struct xe_guc *
>> log_to_guc(struct xe_guc_log *log)
>> {
>> @@ -223,15 +279,163 @@ void xe_guc_log_snapshot_print(struct
>> xe_guc_log_snapshot *snapshot, struct drm_
>> }
>> }
>> +static int xe_guc_log_add_lfd_header(void *buf, int buf_size)
>> +{
>> + int len = sizeof(default_guc_lfd_data);
>> +
>> + memcpy(buf, &default_guc_lfd_data, len);
>> + return len;
>> +}
> For the sake of adding one dword in one place in the code, this seems
> massively over-engineered.
>
> I would just do "buf[0] = FIELD_PREP(MAGIC)".
Sure, will do>
>> +
>> +static int xe_guc_log_add_payload(void *buf, int buf_size, u32
>> data_len, void *data)
>> +{
>> + struct guc_lfd_data *lfd = buf;
>> +
>> + /* make length DW aligned */
>> + lfd->dw_size = DIV_ROUND_UP(data_len, sizeof(u32));
>> + memcpy(lfd->data, data, data_len);
>> + return lfd->dw_size * sizeof(u32);
>> +}
> Again, why split this out into a separate function? For such a small
> amount of code that called only once, it is simpler/clearer to just do
> it inline.
To be merged with next function>
>> +
>> +static int xe_guc_log_add_typed_payload(void *buf, int buf_size, u32
>> type,
>> + u32 data_len, void *data)
>> +{
>> + struct guc_lfd_data *lfd = buf;
>> + int index;
>> +
>> + index = xe_guc_log_add_lfd_header(buf, buf_size);
>> + lfd->dw0 |= FIELD_PREP(GUC_LFD_DATA_DESC_TYPE, type);
>> + index += xe_guc_log_add_payload(buf, buf_size, data_len, data);
> I'm not seeing any checks that the pre-allocated size is sufficient.
Yes, will change to either use local header or add size check>
>> +
>> + return index;
>> +}
>> +
>> +static inline int lic_type_to_KLV_index(u32 lic_type)
>> +{
>> + XE_WARN_ON(lic_type < GUC_LOG_LIC_TYPE_FIRST || lic_type >
>> GUC_LOG_LIC_TYPE_LAST);
>> +
>> + return lic_type - GUC_LOG_LIC_TYPE_FIRST;
>> +}
>> +
>> +static int xe_guc_log_add_klv(void *buf, int size, u32 lic_type,
>> + struct guc_lic_save *config)
>> +{
>> + int klv_index = lic_type_to_KLV_index(lic_type);
>> +
>> + return xe_guc_log_add_typed_payload(buf, size, lic_type,
>> sizeof(u32),
>> + &config->KLV[klv_index]);
>> +}
>> +
>> +static int xe_guc_log_add_os_id(void *buf, int buf_size, u32 id)
>> +{
>> + struct guc_lfd_data *lfd = buf;
>> + struct guc_lfd_data_os_info *os_id;
>> + char *version;
>> + int info_len;
>> +
>> + os_id = (void *)lfd->data;
>> + os_id->os_id = id;
>> +
>> + version = init_utsname()->release;
>> + info_len = strnlen(version, buf_size) + 1;
>> +
>> + if (buf_size < sizeof(struct guc_lfd_data) + info_len)
>> + return -ENOMEM;
>> +
>> + strscpy(os_id->build_version, version, info_len);
>> + return xe_guc_log_add_typed_payload(buf, buf_size,
>> GUC_LFD_TYPE_OS_ID,
>> + info_len + sizeof(*os_id), os_id);
>> +}
>> +
>> +static void xe_guc_log_loop_log_init(struct guc_lic *init,
>> + struct guc_lic_save *config)
>> +{
>> + struct guc_klv_generic_dw_t *p = (void *)init->data;
>> + int i;
>> +
>> + for (i = 0; i < init->dw_size;) {
>> + int klv_len = FIELD_GET(GUC_KLV_0_LEN, p->kl) + 1;
>> + int key = FIELD_GET(GUC_KLV_0_KEY, p->kl);
>> +
>> + if (key < GUC_LOG_LIC_TYPE_FIRST || key > GUC_LOG_LIC_TYPE_LAST)
>> + break;
> Error message?
Will added>
>> + config->KLV[lic_type_to_KLV_index(key)] = p->value;
>> + i += klv_len;
>> + p = (void *)((u32 *)p + klv_len);
>> + }
>> +}
>> +
>> +static void xe_guc_log_load_lic(void *guc_log, struct guc_lic_save
>> *config)
>> +{
>> + u32 offset = GUC_LOG_BUFFER_STATE_HEADER_LENGTH;
>> + struct guc_log_buffer_state *p = guc_log;
>> + int i = 0;
>> +
>> + config->version = p->version;
>> + while (p) {
>> + for (i = 0; i < GUC_LOG_BUFFER_STATE_HEADER_ENTRY_COUNT; i++) {
>> + if (p->marker[0] == entry_markers[i].key[0] &&
>> + p->marker[1] == entry_markers[i].key[1]) {
>> + config->entry[i].offset = offset;
>> + config->entry[i].rd_ptr = p->read_ptr;
>> + config->entry[i].wr_ptr = p->write_ptr;
>> + config->entry[i].buf_size = p->size;
>> +
>> + if (i != GUC_LOG_BUFFER_STATE_HEADER_ENTRY_INIT) {
>> + offset += p->size;
>> + p++;
>> + } else {
>> + /* Load log init config */
>> + xe_guc_log_loop_log_init((void *)p, config);
>> +
>> + /* Init config is the last */
>> + return;
>> + }
>> + }
>> + }
>> + if (i >= GUC_LOG_BUFFER_STATE_HEADER_ENTRY_COUNT)
>> + break;
>> + }
> This does not seem like the correct way to decode this data. Not all
> these items are the same structure. While the crash dump section does
> technically have a standard log buffer state header, it does not
> actually use it. And of the register capture buffer is not interesting
> at all to LFD dumping, which is the only other section to have a valid
> header.
>
> I would flip this around and have a helper function which finds the
> structure in the buffer that starts with the given magic header and
> simply returns a pointer to it (or the offset from base). Then the
> processing code for each section (which would be very different
> implementations and be called at different times) can retrieve the bit
> it is interested in and use it and not worry about having to have a
> generic function that processes all sections at once.
Good idea, will changed to use marker to find out structure for it>
>> +}
>> +
>> +static int
>> +xe_guc_log_output_lfd_init(struct drm_printer *p, struct
>> xe_guc_log_snapshot *snapshot,
>> + struct guc_lic_save *config)
>> +{
>> + int type, len;
>> + size_t size = 0;
>> + char buf[GUC_LFD_BUFFER_SIZE] = {0};
> This will add 1KB of zeros as a global static object. You should never
> give large arrays an empty initialisation like that. I recall someone
> once doing that with a 16MB array and it took us ages to work out why
> the driver was so huge in debug builds! Also, this is putting a 1KB
> array on the stack. Kernel stack space is limited and you should never
> put large objects on the stack unless absolutely necessary. Just use
> kzalloc() for this.
>
>> +
>> + /* FW required types */
>> + for (type = GUC_LOG_LIC_TYPE_FIRST; type <=
>> GUC_LOG_LIC_TYPE_LAST; type++)
>> + size += xe_guc_log_add_klv(&buf[size], GUC_LFD_BUFFER_SIZE -
>> size, type, config);
> I really don't like this idea of effectively cloning the LIC blocks into
> LFD blocks. There is no requirement for any cross-compatibility of
> structures, enums, etc. Also, the LIC information is potentially useful
> data for the driver to include in other places, e.g. devcoredump output.
>
> My preference would be to decode the LIC blocks as part of the GuC
> initialisation and save the info in the xe_guc structure. Then the
> devcoredump code can print it out and the LFD code can create LFD blocks
> from it. But no longer with any assumptions or connections to LIC
> formatting.
>
> Also, no buffer overflow checking?
Will avoid use LIC_TYPE_XXX
To be changed to add type from GUC_LFD_TYPE_FW_VERSION to
GUC_LFD_TYPE_BUILD_PLATFORM_ID>
>> +
>> + /* KMD required type(s) */
>> + len = xe_guc_log_add_os_id(&buf[size], GUC_LFD_BUFFER_SIZE - size,
> &buf[size] -> buf + size
>
>> + GUC_LFD_OS_TYPE_OSID_LIN);
>> + if (len < 0)
>> + return len;
> Aborting on error means that if the given LFD block didn't fit then you
> get no output at all. Would it not be better to print a warning message
> and just skip adding that block?
To be optimized>
>> + size += len;
>> +
>> + xe_print_blob_ascii85(p, NULL, 0, buf, 0, size);
> Why use ASCII85 encoding? The LFD stream is supposed to just be raw
> binary data, isn't it?
>
> Hmm. For small logs, it might be useful to output in ASCII, but then do
> we need some kind of file format on top of the LFD format? E.g. the
> "[LOG].data" tag below is part of the devcoredump format and has nothing
> to do with LFDs. Do we need any kind of extra formatting? The LFD
> already contains all the meta data we currently need and can support
> adding arbitrary meta data anyway. So there is no need for extra data
> around the side of the main payload such as we have in the current
> debugfs log dump file.
>
> However, the main purpose of a streaming output file is for capturing
> very large logs. And those are going to need to be compressed to move
> them around. In which case, there is no point in doing ASCII encoding
> because it is going to become a non-ASCII zip file anyway.
Sure, will output LFD in binary format.
>
> John.
>
>> + return size;
>> +}
>> +
>> static void
>> xe_guc_log_snapshot_print_lfd(struct xe_guc_log_snapshot *snapshot,
>> struct drm_printer *p)
>> {
>> + struct guc_lic_save config;
>> +
>> if (!snapshot || !snapshot->size)
>> return;
>> /* Output LFD file header */
>> xe_print_blob_ascii85(p, "[LOG].data", 0,
>> &default_guc_lfd_file_header, 0,
>> offsetof(struct guc_lfd_file_header, lfd_stream));
>> +
>> + /* Output LFD stream */
>> + xe_guc_log_load_lic(snapshot->copy[0], &config);
>> + xe_guc_log_output_lfd_init(p, snapshot, &config);
>> }
>> /**
>
^ permalink raw reply [flat|nested] 30+ messages in thread
end of thread, other threads:[~2025-08-22 21:59 UTC | newest]
Thread overview: 30+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-22 1:35 [PATCH v6 0/6] drm/xe/guc: Add LFD format output for guc log Zhanjun Dong
2025-07-22 1:35 ` [PATCH v6 1/6] drm/xe/guc: Add log init config abi definitions Zhanjun Dong
2025-07-29 17:40 ` Michal Wajdeczko
2025-08-18 15:03 ` Dong, Zhanjun
2025-07-29 18:34 ` John Harrison
2025-08-18 15:03 ` Dong, Zhanjun
2025-07-22 1:35 ` [PATCH v6 2/6] drm/xe/guc: Add LFD related " Zhanjun Dong
2025-07-29 18:07 ` Michal Wajdeczko
2025-08-20 20:43 ` Dong, Zhanjun
2025-07-29 19:08 ` John Harrison
2025-08-20 20:52 ` Dong, Zhanjun
2025-07-22 1:35 ` [PATCH v6 3/6] drm/xe/guc: Add new debugfs entry for lfd format output Zhanjun Dong
2025-07-29 19:19 ` John Harrison
2025-08-20 22:03 ` Dong, Zhanjun
2025-07-22 1:35 ` [PATCH v6 4/6] drm/xe/guc: Add GuC log init config in LFD format Zhanjun Dong
2025-07-30 0:27 ` John Harrison
2025-07-30 23:40 ` Dong, Zhanjun
2025-08-01 16:57 ` John Harrison
2025-08-22 21:59 ` Dong, Zhanjun
2025-07-22 1:35 ` [PATCH v6 5/6] drm/xe/guc: Add GuC log event buffer output " Zhanjun Dong
2025-07-30 17:40 ` John Harrison
2025-08-22 0:19 ` Dong, Zhanjun
2025-07-22 1:35 ` [PATCH v6 6/6] drm/xe/guc: Only add GuC crash dump if available Zhanjun Dong
2025-08-04 20:14 ` John Harrison
2025-08-04 21:21 ` John Harrison
2025-08-21 22:26 ` Dong, Zhanjun
2025-07-22 2:47 ` ✗ CI.checkpatch: warning for drm/xe/guc: Add LFD format output for guc log (rev6) Patchwork
2025-07-22 2:49 ` ✓ CI.KUnit: success " Patchwork
2025-07-22 3:54 ` ✓ Xe.CI.BAT: " Patchwork
2025-07-22 7:48 ` ✗ Xe.CI.Full: failure " Patchwork
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).