1 /* SPDX-License-Identifier: MIT */
2 /*
3  * Copyright © 2021-2022 Intel Corporation
4  */
5 
6 #ifndef _INTEL_GUC_CAPTURE_FWIF_H
7 #define _INTEL_GUC_CAPTURE_FWIF_H
8 
9 #include <linux/types.h>
10 #include "intel_guc_fwif.h"
11 
12 struct intel_guc;
13 struct file;
14 
15 /**
16  * struct __guc_capture_bufstate
17  *
18  * Book-keeping structure used to track read and write pointers
19  * as we extract error capture data from the GuC-log-buffer's
20  * error-capture region as a stream of dwords.
21  */
22 struct __guc_capture_bufstate {
23 	u32 size;
24 	void *data;
25 	u32 rd;
26 	u32 wr;
27 };
28 
29 /**
30  * struct __guc_capture_parsed_output - extracted error capture node
31  *
32  * A single unit of extracted error-capture output data grouped together
33  * at an engine-instance level. We keep these nodes in a linked list.
34  * See cachelist and outlist below.
35  */
36 struct __guc_capture_parsed_output {
37 	/*
38 	 * A single set of 3 capture lists: a global-list
39 	 * an engine-class-list and an engine-instance list.
40 	 * outlist in __guc_capture_parsed_output will keep
41 	 * a linked list of these nodes that will eventually
42 	 * be detached from outlist and attached into to
43 	 * i915_gpu_codedump in response to a context reset
44 	 */
45 	struct list_head link;
46 	bool is_partial;
47 	u32 eng_class;
48 	u32 eng_inst;
49 	u32 guc_id;
50 	u32 lrca;
51 	struct gcap_reg_list_info {
52 		u32 vfid;
53 		u32 num_regs;
54 		struct guc_mmio_reg *regs;
55 	} reginfo[GUC_CAPTURE_LIST_TYPE_MAX];
56 #define GCAP_PARSED_REGLIST_INDEX_GLOBAL   BIT(GUC_CAPTURE_LIST_TYPE_GLOBAL)
57 #define GCAP_PARSED_REGLIST_INDEX_ENGCLASS BIT(GUC_CAPTURE_LIST_TYPE_ENGINE_CLASS)
58 #define GCAP_PARSED_REGLIST_INDEX_ENGINST  BIT(GUC_CAPTURE_LIST_TYPE_ENGINE_INSTANCE)
59 };
60 
61 /**
62  * struct guc_debug_capture_list_header / struct guc_debug_capture_list
63  *
64  * As part of ADS registration, these header structures (followed by
65  * an array of 'struct guc_mmio_reg' entries) are used to register with
66  * GuC microkernel the list of registers we want it to dump out prior
67  * to a engine reset.
68  */
69 struct guc_debug_capture_list_header {
70 	u32 info;
71 #define GUC_CAPTURELISTHDR_NUMDESCR GENMASK(15, 0)
72 } __packed;
73 
74 struct guc_debug_capture_list {
75 	struct guc_debug_capture_list_header header;
76 	struct guc_mmio_reg regs[0];
77 } __packed;
78 
79 /**
80  * struct __guc_mmio_reg_descr / struct __guc_mmio_reg_descr_group
81  *
82  * intel_guc_capture module uses these structures to maintain static
83  * tables (per unique platform) that consists of lists of registers
84  * (offsets, names, flags,...) that are used at the ADS regisration
85  * time as well as during runtime processing and reporting of error-
86  * capture states generated by GuC just prior to engine reset events.
87  */
88 struct __guc_mmio_reg_descr {
89 	i915_reg_t reg;
90 	u32 flags;
91 	u32 mask;
92 	const char *regname;
93 };
94 
95 struct __guc_mmio_reg_descr_group {
96 	const struct __guc_mmio_reg_descr *list;
97 	u32 num_regs;
98 	u32 owner; /* see enum guc_capture_owner */
99 	u32 type; /* see enum guc_capture_type */
100 	u32 engine; /* as per MAX_ENGINE_CLASS */
101 	struct __guc_mmio_reg_descr *extlist; /* only used for steered registers */
102 };
103 
104 /**
105  * struct guc_state_capture_header_t / struct guc_state_capture_t /
106  * guc_state_capture_group_header_t / guc_state_capture_group_t
107  *
108  * Prior to resetting engines that have hung or faulted, GuC microkernel
109  * reports the engine error-state (register values that was read) by
110  * logging them into the shared GuC log buffer using these hierarchy
111  * of structures.
112  */
113 struct guc_state_capture_header_t {
114 	u32 owner;
115 #define CAP_HDR_CAPTURE_VFID GENMASK(7, 0)
116 	u32 info;
117 #define CAP_HDR_CAPTURE_TYPE GENMASK(3, 0) /* see enum guc_capture_type */
118 #define CAP_HDR_ENGINE_CLASS GENMASK(7, 4) /* see GUC_MAX_ENGINE_CLASSES */
119 #define CAP_HDR_ENGINE_INSTANCE GENMASK(11, 8)
120 	u32 lrca; /* if type-instance, LRCA (address) that hung, else set to ~0 */
121 	u32 guc_id; /* if type-instance, context index of hung context, else set to ~0 */
122 	u32 num_mmios;
123 #define CAP_HDR_NUM_MMIOS GENMASK(9, 0)
124 } __packed;
125 
126 struct guc_state_capture_t {
127 	struct guc_state_capture_header_t header;
128 	struct guc_mmio_reg mmio_entries[0];
129 } __packed;
130 
131 enum guc_capture_group_types {
132 	GUC_STATE_CAPTURE_GROUP_TYPE_FULL,
133 	GUC_STATE_CAPTURE_GROUP_TYPE_PARTIAL,
134 	GUC_STATE_CAPTURE_GROUP_TYPE_MAX,
135 };
136 
137 struct guc_state_capture_group_header_t {
138 	u32 owner;
139 #define CAP_GRP_HDR_CAPTURE_VFID GENMASK(7, 0)
140 	u32 info;
141 #define CAP_GRP_HDR_NUM_CAPTURES GENMASK(7, 0)
142 #define CAP_GRP_HDR_CAPTURE_TYPE GENMASK(15, 8) /* guc_capture_group_types */
143 } __packed;
144 
145 /* this is the top level structure where an error-capture dump starts */
146 struct guc_state_capture_group_t {
147 	struct guc_state_capture_group_header_t grp_header;
148 	struct guc_state_capture_t capture_entries[0];
149 } __packed;
150 
151 /**
152  * struct __guc_capture_ads_cache
153  *
154  * A structure to cache register lists that were populated and registered
155  * with GuC at startup during ADS registration. This allows much quicker
156  * GuC resets without re-parsing all the tables for the given gt.
157  */
158 struct __guc_capture_ads_cache {
159 	bool is_valid;
160 	void *ptr;
161 	size_t size;
162 	int status;
163 };
164 
165 /**
166  * struct intel_guc_state_capture
167  *
168  * Internal context of the intel_guc_capture module.
169  */
170 struct intel_guc_state_capture {
171 	/**
172 	 * @reglists: static table of register lists used for error-capture state.
173 	 */
174 	const struct __guc_mmio_reg_descr_group *reglists;
175 
176 	/**
177 	 * @extlists: allocated table of steered register lists used for error-capture state.
178 	 *
179 	 * NOTE: steered registers have multiple instances depending on the HW configuration
180 	 * (slices or dual-sub-slices) and thus depends on HW fuses discovered at startup
181 	 */
182 	struct __guc_mmio_reg_descr_group *extlists;
183 
184 	/**
185 	 * @ads_cache: cached register lists that is ADS format ready
186 	 */
187 	struct __guc_capture_ads_cache ads_cache[GUC_CAPTURE_LIST_INDEX_MAX]
188 						[GUC_CAPTURE_LIST_TYPE_MAX]
189 						[GUC_MAX_ENGINE_CLASSES];
190 	void *ads_null_cache;
191 
192 	/**
193 	 * @cachelist: Pool of pre-allocated nodes for error capture output
194 	 *
195 	 * We need this pool of pre-allocated nodes because we cannot
196 	 * dynamically allocate new nodes when receiving the G2H notification
197 	 * because the event handlers for all G2H event-processing is called
198 	 * by the ct processing worker queue and when that queue is being
199 	 * processed, there is no absoluate guarantee that we are not in the
200 	 * midst of a GT reset operation (which doesn't allow allocations).
201 	 */
202 	struct list_head cachelist;
203 #define PREALLOC_NODES_MAX_COUNT (3 * GUC_MAX_ENGINE_CLASSES * GUC_MAX_INSTANCES_PER_CLASS)
204 #define PREALLOC_NODES_DEFAULT_NUMREGS 64
205 	int max_mmio_per_node;
206 
207 	/**
208 	 * @outlist: Pool of pre-allocated nodes for error capture output
209 	 *
210 	 * A linked list of parsed GuC error-capture output data before
211 	 * reporting with formatting via i915_gpu_coredump. Each node in this linked list shall
212 	 * contain a single engine-capture including global, engine-class and
213 	 * engine-instance register dumps as per guc_capture_parsed_output_node
214 	 */
215 	struct list_head outlist;
216 };
217 
218 #endif /* _INTEL_GUC_CAPTURE_FWIF_H */
219