Contributors: 2
Author Tokens Token Proportion Commits Commit Proportion
Zhanjun Dong 240 99.17% 1 50.00%
Jani Nikula 2 0.83% 1 50.00%
Total 242 2


/* 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"

/* 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_VERSION: GuC Firmware Version structure.
	 * @GUC_LFD_TYPE_GUC_DEVICE_ID: GuC microcontroller device ID.
	 * @GUC_LFD_TYPE_TSC_FREQUENCY: Frequency of GuC timestamps.
	 * @GUC_LFD_TYPE_GMD_ID: HW GMD ID.
	 * @GUC_LFD_TYPE_BUILD_PLATFORM_ID: GuC build platform ID.
	 * @GUC_LFD_TYPE_FW_REQUIRED_RANGE_END: End of range for
	 * required LFDs from GuC
	 */
	GUC_LFD_TYPE_FW_REQUIRED_RANGE_START	= 0x1,
	GUC_LFD_TYPE_FW_VERSION			= 0x1,
	GUC_LFD_TYPE_GUC_DEVICE_ID		= 0x2,
	GUC_LFD_TYPE_TSC_FREQUENCY		= 0x3,
	GUC_LFD_TYPE_GMD_ID			= 0x4,
	GUC_LFD_TYPE_BUILD_PLATFORM_ID		= 0x5,
	GUC_LFD_TYPE_FW_REQUIRED_RANGE_END	= 0x1FFF,

	/**
	 * @GUC_LFD_TYPE_FW_OPTIONAL_RANGE_START: Start of range for
	 * optional LFDs from GuC
	 * @GUC_LFD_TYPE_LOG_EVENTS_BUFFER: Log-event-entries buffer.
	 * @GUC_LFD_TYPE_FW_CRASH_DUMP: GuC generated crash-dump blob.
	 * @GUC_LFD_TYPE_FW_OPTIONAL_RANGE_END: End of range for
	 * optional LFDs from GuC
	 */
	GUC_LFD_TYPE_FW_OPTIONAL_RANGE_START	= 0x2000,
	GUC_LFD_TYPE_LOG_EVENTS_BUFFER		= 0x2000,
	GUC_LFD_TYPE_FW_CRASH_DUMP		= 0x2001,
	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_OS_ID: An identifier for the OS.
	 * @GUC_LFD_TYPE_KMD_REQUIRED_RANGE_END: End of this 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,

	/**
	 * @GUC_LFD_TYPE_KMD_OPTIONAL_RANGE_START: Start of range for
	 * optional KMD LFDs
	 * @GUC_LFD_TYPE_BINARY_SCHEMA_FORMAT: Binary representation of
	 * GuC log-events schema.
	 * @GUC_LFD_TYPE_HOST_COMMENT: ASCII string containing comments
	 * from the host/KMD.
	 * @GUC_LFD_TYPE_TIMESTAMP_ANCHOR: A timestamp anchor, to convert
	 * between host and GuC timestamp.
	 * @GUC_LFD_TYPE_TIMESTAMP_ANCHOR_CONFIG: Timestamp anchor
	 * configuration, definition of timestamp frequency and bit width.
	 * @GUC_LFD_TYPE_KMD_OPTIONAL_RANGE_END: End of this range for
	 * optional KMD LFDs
	 */
	GUC_LFD_TYPE_KMD_OPTIONAL_RANGE_START	= 0x6000,
	GUC_LFD_TYPE_BINARY_SCHEMA_FORMAT	= 0x6000,
	GUC_LFD_TYPE_HOST_COMMENT		= 0x6001,
	GUC_LFD_TYPE_TIMESTAMP_ANCHOR		= 0x6002,
	GUC_LFD_TYPE_TIMESTAMP_ANCHOR_CONFIG	= 0x6003,
	GUC_LFD_TYPE_KMD_OPTIONAL_RANGE_END	= 0x7FFF,

	/*
	 * @GUC_LFD_TYPE_RESERVED_RANGE_START: Start of reserved range
	 * @GUC_LFD_TYPE_RESERVED_RANGE_END: End of reserved range
	 */
	GUC_LFD_TYPE_RESERVED_RANGE_START	= 0x8000,
	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 - A generic header structure for all LFD blocks */
struct guc_lfd_data {
	/** @header: A 32 bits dword, contains multiple bit fields */
	u32 header;
	/* LFD type. See guc_lfd_type */
#define GUC_LFD_DATA_HEADER_MASK_TYPE		GENMASK(31, 16)
#define GUC_LFD_DATA_HEADER_MASK_MAGIC		GENMASK(15, 0)

	/** @data_count: Number of dwords the `data` field contains. */
	u32 data_count;
	/** @data: Data defined by GUC_LFD_DATA_HEADER_MASK_TYPE */
	u32 data[] __counted_by(data_count);
} __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_event: The log event data.
	 * Size in dwords is LFD block size - 1.
	 */
	u32 log_event[];
} __packed;

/** struct guc_lfd_data_os_info - OS Version Information. */
struct guc_lfd_data_os_info {
	/**
	 * @os_id: enum values to identify the OS brand.
	 * 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.
	 * Size in dwords is LFD block size - 1.
	 */
	char build_version[];
} __packed;

/**
 * struct guc_lfd_file_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.
	 */
	u64 magic;
	/** @version: Version of this file format layout */
	u32 version;
#define GUC_LFD_FILE_HEADER_VERSION_MASK_MAJOR	GENMASK(31, 16)
#define GUC_LFD_FILE_HEADER_VERSION_MASK_MINOR	GENMASK(15, 0)

	/** @stream: A stream of one or more guc_lfd_data LFD blocks */
	u32 stream[];
} __packed;

#endif