xref: /linux/drivers/gpu/drm/xe/abi/guc_capture_abi.h (revision 3a2c4d55e32ad65efebdb6de44eef3bfa08bb49d)
1 /* SPDX-License-Identifier: MIT */
2 /*
3  * Copyright © 2024 Intel Corporation
4  */
5 
6 #ifndef _ABI_GUC_CAPTURE_ABI_H
7 #define _ABI_GUC_CAPTURE_ABI_H
8 
9 #include <linux/types.h>
10 
11 /* Capture List Index */
12 enum guc_capture_list_index_type {
13 	GUC_CAPTURE_LIST_INDEX_PF = 0,
14 	GUC_CAPTURE_LIST_INDEX_VF = 1,
15 };
16 
17 #define GUC_CAPTURE_LIST_INDEX_MAX	(GUC_CAPTURE_LIST_INDEX_VF + 1)
18 
19 /* Register-types of GuC capture register lists */
20 enum guc_state_capture_type {
21 	GUC_STATE_CAPTURE_TYPE_GLOBAL = 0,
22 	GUC_STATE_CAPTURE_TYPE_ENGINE_CLASS,
23 	GUC_STATE_CAPTURE_TYPE_ENGINE_INSTANCE
24 };
25 
26 #define GUC_STATE_CAPTURE_TYPE_MAX	(GUC_STATE_CAPTURE_TYPE_ENGINE_INSTANCE + 1)
27 
28 /* Class indices for capture_class and capture_instance arrays */
29 enum guc_capture_list_class_type {
30 	GUC_CAPTURE_LIST_CLASS_RENDER_COMPUTE = 0,
31 	GUC_CAPTURE_LIST_CLASS_VIDEO = 1,
32 	GUC_CAPTURE_LIST_CLASS_VIDEOENHANCE = 2,
33 	GUC_CAPTURE_LIST_CLASS_BLITTER = 3,
34 	GUC_CAPTURE_LIST_CLASS_GSC_OTHER = 4,
35 	GUC_CAPTURE_LIST_CLASS_PAGING = 5,
36 };
37 
38 #define GUC_CAPTURE_LIST_CLASS_MAX	(GUC_CAPTURE_LIST_CLASS_PAGING + 1)
39 
40 /**
41  * struct guc_mmio_reg - GuC MMIO reg state struct
42  *
43  * GuC MMIO reg state struct
44  */
45 struct guc_mmio_reg {
46 	/** @offset: MMIO Offset - filled in by Host */
47 	u32 offset;
48 	/** @value: MMIO Value - Used by Firmware to store value */
49 	u32 value;
50 	/** @flags: Flags for accessing the MMIO */
51 	u32 flags;
52 	/** @mask: Value of a mask to apply if mask with value is set */
53 	u32 mask;
54 #define GUC_REGSET_MASKED		BIT(0)
55 #define GUC_REGSET_STEERING_NEEDED	BIT(1)
56 #define GUC_REGSET_MASKED_WITH_VALUE	BIT(2)
57 #define GUC_REGSET_RESTORE_ONLY		BIT(3)
58 #define GUC_REGSET_STEERING_GROUP       GENMASK(16, 12)
59 #define GUC_REGSET_STEERING_INSTANCE    GENMASK(23, 20)
60 } __packed;
61 
62 /**
63  * struct guc_mmio_reg_set - GuC register sets
64  *
65  * GuC register sets
66  */
67 struct guc_mmio_reg_set {
68 	/** @address: register address */
69 	u32 address;
70 	/** @count: register count */
71 	u16 count;
72 	/** @reserved: reserved */
73 	u16 reserved;
74 } __packed;
75 
76 /**
77  * struct guc_debug_capture_list_header - Debug capture list header.
78  *
79  * Debug capture list header.
80  */
81 struct guc_debug_capture_list_header {
82 	/** @info: contains number of MMIO descriptors in the capture list. */
83 	u32 info;
84 #define GUC_CAPTURELISTHDR_NUMDESCR GENMASK(15, 0)
85 } __packed;
86 
87 /**
88  * struct guc_debug_capture_list - Debug capture list
89  *
90  * As part of ADS registration, these header structures (followed by
91  * an array of 'struct guc_mmio_reg' entries) are used to register with
92  * GuC microkernel the list of registers we want it to dump out prior
93  * to a engine reset.
94  */
95 struct guc_debug_capture_list {
96 	/** @header: Debug capture list header. */
97 	struct guc_debug_capture_list_header header;
98 	/** @regs: MMIO descriptors in the capture list. */
99 	struct guc_mmio_reg regs[];
100 } __packed;
101 
102 /**
103  * struct guc_state_capture_header_t - State capture header.
104  *
105  * Prior to resetting engines that have hung or faulted, GuC microkernel
106  * reports the engine error-state (register values that was read) by
107  * logging them into the shared GuC log buffer using these hierarchy
108  * of structures.
109  */
110 struct guc_state_capture_header_t {
111 	/**
112 	 * @owner: VFID
113 	 * BR[ 7: 0] MBZ when SRIOV is disabled. When SRIOV is enabled
114 	 * VFID is an integer in range [0, 63] where 0 means the state capture
115 	 * is corresponding to the PF and an integer N in range [1, 63] means
116 	 * the state capture is for VF N.
117 	 */
118 	u32 owner;
119 #define GUC_STATE_CAPTURE_HEADER_VFID GENMASK(7, 0)
120 	/** @info: Engine class/instance and capture type info */
121 	u32 info;
122 #define GUC_STATE_CAPTURE_HEADER_CAPTURE_TYPE GENMASK(3, 0) /* see guc_state_capture_type */
123 #define GUC_STATE_CAPTURE_HEADER_ENGINE_CLASS GENMASK(7, 4) /* see guc_capture_list_class_type */
124 #define GUC_STATE_CAPTURE_HEADER_ENGINE_INSTANCE GENMASK(11, 8)
125 	/**
126 	 * @lrca: logical ring context address.
127 	 * if type-instance, LRCA (address) that hung, else set to ~0
128 	 */
129 	u32 lrca;
130 	/**
131 	 * @guc_id: context_index.
132 	 * if type-instance, context index of hung context, else set to ~0
133 	 */
134 	u32 guc_id;
135 	/** @num_mmio_entries: Number of captured MMIO entries. */
136 	u32 num_mmio_entries;
137 #define GUC_STATE_CAPTURE_HEADER_NUM_MMIO_ENTRIES GENMASK(9, 0)
138 } __packed;
139 
140 /**
141  * struct guc_state_capture_t - State capture.
142  *
143  * State capture
144  */
145 struct guc_state_capture_t {
146 	/** @header: State capture header. */
147 	struct guc_state_capture_header_t header;
148 	/** @mmio_entries: Array of captured guc_mmio_reg entries. */
149 	struct guc_mmio_reg mmio_entries[];
150 } __packed;
151 
152 /* State Capture Group Type */
153 enum guc_state_capture_group_type {
154 	GUC_STATE_CAPTURE_GROUP_TYPE_FULL = 0,
155 	GUC_STATE_CAPTURE_GROUP_TYPE_PARTIAL
156 };
157 
158 #define GUC_STATE_CAPTURE_GROUP_TYPE_MAX (GUC_STATE_CAPTURE_GROUP_TYPE_PARTIAL + 1)
159 
160 /**
161  * struct guc_state_capture_group_header_t - State capture group header
162  *
163  * State capture group header.
164  */
165 struct guc_state_capture_group_header_t {
166 	/** @owner: VFID */
167 	u32 owner;
168 #define GUC_STATE_CAPTURE_GROUP_HEADER_VFID GENMASK(7, 0)
169 	/** @info: Engine class/instance and capture type info */
170 	u32 info;
171 #define GUC_STATE_CAPTURE_GROUP_HEADER_NUM_CAPTURES GENMASK(7, 0)
172 #define GUC_STATE_CAPTURE_GROUP_HEADER_CAPTURE_GROUP_TYPE GENMASK(15, 8)
173 } __packed;
174 
175 /**
176  * struct guc_state_capture_group_t - State capture group.
177  *
178  * this is the top level structure where an error-capture dump starts
179  */
180 struct guc_state_capture_group_t {
181 	/** @grp_header: State capture group header. */
182 	struct guc_state_capture_group_header_t grp_header;
183 	/** @capture_entries: Array of state captures */
184 	struct guc_state_capture_t capture_entries[];
185 } __packed;
186 
187 #endif
188