xref: /OK3568_Linux_fs/kernel/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_linux_ktrace_csf.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2 /*
3  *
4  * (C) COPYRIGHT 2020-2022 ARM Limited. All rights reserved.
5  *
6  * This program is free software and is provided to you under the terms of the
7  * GNU General Public License version 2 as published by the Free Software
8  * Foundation, and any use by you of this program is subject to the terms
9  * of such GNU license.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, you can access it online at
18  * http://www.gnu.org/licenses/gpl-2.0.html.
19  *
20  */
21 
22 /*
23  * NOTE: This must **only** be included through mali_linux_trace.h,
24  * otherwise it will fail to setup tracepoints correctly
25  */
26 
27 #if !defined(_KBASE_DEBUG_LINUX_KTRACE_CSF_H_) || defined(TRACE_HEADER_MULTI_READ)
28 #define _KBASE_DEBUG_LINUX_KTRACE_CSF_H_
29 
30 /*
31  * Generic CSF events - using the common DEFINE_MALI_ADD_EVENT
32  */
33 DEFINE_MALI_ADD_EVENT(SCHEDULER_EVICT_CTX_SLOTS_START);
34 DEFINE_MALI_ADD_EVENT(SCHEDULER_EVICT_CTX_SLOTS_END);
35 DEFINE_MALI_ADD_EVENT(CSF_FIRMWARE_BOOT);
36 DEFINE_MALI_ADD_EVENT(CSF_FIRMWARE_REBOOT);
37 DEFINE_MALI_ADD_EVENT(SCHEDULER_TOCK_INVOKE);
38 DEFINE_MALI_ADD_EVENT(SCHEDULER_TICK_INVOKE);
39 DEFINE_MALI_ADD_EVENT(SCHEDULER_TOCK_START);
40 DEFINE_MALI_ADD_EVENT(SCHEDULER_TOCK_END);
41 DEFINE_MALI_ADD_EVENT(SCHEDULER_TICK_START);
42 DEFINE_MALI_ADD_EVENT(SCHEDULER_TICK_END);
43 DEFINE_MALI_ADD_EVENT(SCHEDULER_RESET_START);
44 DEFINE_MALI_ADD_EVENT(SCHEDULER_RESET_END);
45 DEFINE_MALI_ADD_EVENT(SCHEDULER_PROTM_WAIT_QUIT_START);
46 DEFINE_MALI_ADD_EVENT(SCHEDULER_PROTM_WAIT_QUIT_END);
47 DEFINE_MALI_ADD_EVENT(SCHEDULER_GROUP_SYNC_UPDATE_EVENT);
48 DEFINE_MALI_ADD_EVENT(CSF_SYNC_UPDATE_NOTIFY_GPU_EVENT);
49 DEFINE_MALI_ADD_EVENT(CSF_INTERRUPT_START);
50 DEFINE_MALI_ADD_EVENT(CSF_INTERRUPT_END);
51 DEFINE_MALI_ADD_EVENT(CSF_INTERRUPT_GLB_REQ_ACK);
52 DEFINE_MALI_ADD_EVENT(SCHEDULER_GPU_IDLE_EVENT_CAN_SUSPEND);
53 DEFINE_MALI_ADD_EVENT(SCHEDULER_TICK_ADVANCE);
54 DEFINE_MALI_ADD_EVENT(SCHEDULER_TICK_NOADVANCE);
55 DEFINE_MALI_ADD_EVENT(SCHEDULER_RUNNABLE_KCTX_INSERT);
56 DEFINE_MALI_ADD_EVENT(SCHEDULER_RUNNABLE_KCTX_REMOVE);
57 DEFINE_MALI_ADD_EVENT(SCHEDULER_RUNNABLE_KCTX_ROTATE);
58 DEFINE_MALI_ADD_EVENT(SCHEDULER_RUNNABLE_KCTX_HEAD);
59 DEFINE_MALI_ADD_EVENT(SCHEDULER_GPU_IDLE_WORKER_START);
60 DEFINE_MALI_ADD_EVENT(SCHEDULER_GPU_IDLE_WORKER_END);
61 DEFINE_MALI_ADD_EVENT(SCHEDULER_GROUP_SYNC_UPDATE_WORKER_START);
62 DEFINE_MALI_ADD_EVENT(SCHEDULER_GROUP_SYNC_UPDATE_WORKER_END);
63 DEFINE_MALI_ADD_EVENT(SCHEDULER_UPDATE_IDLE_SLOTS_ACK);
64 DEFINE_MALI_ADD_EVENT(SCHEDULER_GPU_IDLE_WORKER_HANDLING_START);
65 DEFINE_MALI_ADD_EVENT(SCHEDULER_GPU_IDLE_WORKER_HANDLING_END);
66 DEFINE_MALI_ADD_EVENT(CSF_FIRMWARE_MCU_HALTED);
67 DEFINE_MALI_ADD_EVENT(CSF_FIRMWARE_MCU_SLEEP);
68 DEFINE_MALI_ADD_EVENT(SCHED_BUSY);
69 DEFINE_MALI_ADD_EVENT(SCHED_INACTIVE);
70 DEFINE_MALI_ADD_EVENT(SCHED_SUSPENDED);
71 DEFINE_MALI_ADD_EVENT(SCHED_SLEEPING);
72 #define KBASEP_MCU_STATE(n) DEFINE_MALI_ADD_EVENT(PM_MCU_ ## n);
73 #include "backend/gpu/mali_kbase_pm_mcu_states.h"
74 #undef KBASEP_MCU_STATE
75 
76 DECLARE_EVENT_CLASS(mali_csf_grp_q_template,
77 	TP_PROTO(struct kbase_device *kbdev, struct kbase_queue_group *group,
78 			struct kbase_queue *queue, u64 info_val),
79 	TP_ARGS(kbdev, group, queue, info_val),
80 	TP_STRUCT__entry(
81 		__field(u64, info_val)
82 		__field(pid_t, kctx_tgid)
83 		__field(u32, kctx_id)
84 		__field(u8, group_handle)
85 		__field(s8, csg_nr)
86 		__field(u8, slot_prio)
87 		__field(s8, csi_index)
88 	),
89 	TP_fast_assign(
90 		{
91 			struct kbase_context *kctx = NULL;
92 
93 			__entry->info_val = info_val;
94 			/* Note: if required in future, we could record some
95 			 * flags in __entry about whether the group/queue parts
96 			 * are valid, and add that to the trace message e.g.
97 			 * by using __print_flags()/__print_symbolic()
98 			 */
99 			if (queue) {
100 				/* Note: kctx overridden by group->kctx later if group is valid */
101 				kctx = queue->kctx;
102 				__entry->csi_index = queue->csi_index;
103 			} else {
104 				__entry->csi_index = -1;
105 			}
106 
107 			if (group) {
108 				kctx = group->kctx;
109 				__entry->group_handle = group->handle;
110 				__entry->csg_nr = group->csg_nr;
111 				if (group->csg_nr >= 0)
112 					__entry->slot_prio = kbdev->csf.scheduler.csg_slots[group->csg_nr].priority;
113 				else
114 					__entry->slot_prio = 0u;
115 			} else {
116 				__entry->group_handle = 0u;
117 				__entry->csg_nr = -1;
118 				__entry->slot_prio = 0u;
119 			}
120 			__entry->kctx_id = (kctx) ? kctx->id : 0u;
121 			__entry->kctx_tgid = (kctx) ? kctx->tgid : 0;
122 		}
123 
124 	),
125 	TP_printk("kctx=%d_%u group=%u slot=%d prio=%u csi=%d info=0x%llx",
126 			__entry->kctx_tgid, __entry->kctx_id,
127 			__entry->group_handle, __entry->csg_nr,
128 			__entry->slot_prio, __entry->csi_index,
129 			__entry->info_val)
130 );
131 
132 /*
133  * Group events
134  */
135 #define DEFINE_MALI_CSF_GRP_EVENT(name) \
136 	DEFINE_EVENT_PRINT(mali_csf_grp_q_template, mali_##name, \
137 	TP_PROTO(struct kbase_device *kbdev, struct kbase_queue_group *group, \
138 			struct kbase_queue *queue, u64 info_val), \
139 	TP_ARGS(kbdev, group, queue, info_val), \
140 	TP_printk("kctx=%d_%u group=%u slot=%d prio=%u info=0x%llx", \
141 		__entry->kctx_tgid, __entry->kctx_id, __entry->group_handle, \
142 		__entry->csg_nr, __entry->slot_prio, __entry->info_val))
143 
144 DEFINE_MALI_CSF_GRP_EVENT(CSG_SLOT_START_REQ);
145 DEFINE_MALI_CSF_GRP_EVENT(CSG_SLOT_STOP_REQ);
146 DEFINE_MALI_CSF_GRP_EVENT(CSG_SLOT_RUNNING);
147 DEFINE_MALI_CSF_GRP_EVENT(CSG_SLOT_STOPPED);
148 DEFINE_MALI_CSF_GRP_EVENT(CSG_SLOT_CLEANED);
149 DEFINE_MALI_CSF_GRP_EVENT(CSG_UPDATE_IDLE_SLOT_REQ);
150 DEFINE_MALI_CSF_GRP_EVENT(CSG_SLOT_IDLE_SET);
151 DEFINE_MALI_CSF_GRP_EVENT(CSG_INTERRUPT_NO_NON_IDLE_GROUPS);
152 DEFINE_MALI_CSF_GRP_EVENT(CSG_INTERRUPT_NON_IDLE_GROUPS);
153 DEFINE_MALI_CSF_GRP_EVENT(CSG_SLOT_IDLE_CLEAR);
154 DEFINE_MALI_CSF_GRP_EVENT(CSG_SLOT_PRIO_UPDATE);
155 DEFINE_MALI_CSF_GRP_EVENT(CSG_INTERRUPT_SYNC_UPDATE);
156 DEFINE_MALI_CSF_GRP_EVENT(CSG_INTERRUPT_IDLE);
157 DEFINE_MALI_CSF_GRP_EVENT(CSG_INTERRUPT_PROGRESS_TIMER_EVENT);
158 DEFINE_MALI_CSF_GRP_EVENT(CSG_INTERRUPT_PROCESS_START);
159 DEFINE_MALI_CSF_GRP_EVENT(CSG_INTERRUPT_PROCESS_END);
160 DEFINE_MALI_CSF_GRP_EVENT(GROUP_SYNC_UPDATE_DONE);
161 DEFINE_MALI_CSF_GRP_EVENT(GROUP_DESCHEDULE);
162 DEFINE_MALI_CSF_GRP_EVENT(GROUP_SCHEDULE);
163 DEFINE_MALI_CSF_GRP_EVENT(GROUP_EVICT);
164 DEFINE_MALI_CSF_GRP_EVENT(GROUP_RUNNABLE_INSERT);
165 DEFINE_MALI_CSF_GRP_EVENT(GROUP_RUNNABLE_REMOVE);
166 DEFINE_MALI_CSF_GRP_EVENT(GROUP_RUNNABLE_ROTATE);
167 DEFINE_MALI_CSF_GRP_EVENT(GROUP_RUNNABLE_HEAD);
168 DEFINE_MALI_CSF_GRP_EVENT(GROUP_IDLE_WAIT_INSERT);
169 DEFINE_MALI_CSF_GRP_EVENT(GROUP_IDLE_WAIT_REMOVE);
170 DEFINE_MALI_CSF_GRP_EVENT(GROUP_IDLE_WAIT_HEAD);
171 DEFINE_MALI_CSF_GRP_EVENT(SCHEDULER_PROTM_ENTER_CHECK);
172 DEFINE_MALI_CSF_GRP_EVENT(SCHEDULER_PROTM_ENTER);
173 DEFINE_MALI_CSF_GRP_EVENT(SCHEDULER_PROTM_EXIT);
174 DEFINE_MALI_CSF_GRP_EVENT(SCHEDULER_TOP_GRP);
175 DEFINE_MALI_CSF_GRP_EVENT(SCHEDULER_NONIDLE_OFFSLOT_GRP_INC);
176 DEFINE_MALI_CSF_GRP_EVENT(SCHEDULER_NONIDLE_OFFSLOT_GRP_DEC);
177 DEFINE_MALI_CSF_GRP_EVENT(SCHEDULER_HANDLE_IDLE_SLOTS);
178 DEFINE_MALI_CSF_GRP_EVENT(PROTM_EVENT_WORKER_START);
179 DEFINE_MALI_CSF_GRP_EVENT(PROTM_EVENT_WORKER_END);
180 DEFINE_MALI_CSF_GRP_EVENT(CSF_GROUP_INACTIVE);
181 DEFINE_MALI_CSF_GRP_EVENT(CSF_GROUP_RUNNABLE);
182 DEFINE_MALI_CSF_GRP_EVENT(CSF_GROUP_IDLE);
183 DEFINE_MALI_CSF_GRP_EVENT(CSF_GROUP_SUSPENDED);
184 DEFINE_MALI_CSF_GRP_EVENT(CSF_GROUP_SUSPENDED_ON_IDLE);
185 DEFINE_MALI_CSF_GRP_EVENT(CSF_GROUP_SUSPENDED_ON_WAIT_SYNC);
186 DEFINE_MALI_CSF_GRP_EVENT(CSF_GROUP_FAULT_EVICTED);
187 DEFINE_MALI_CSF_GRP_EVENT(CSF_GROUP_TERMINATED);
188 
189 #undef DEFINE_MALI_CSF_GRP_EVENT
190 
191 /*
192  * Group + Queue events
193  */
194 #define DEFINE_MALI_CSF_GRP_Q_EVENT(name)  \
195 	DEFINE_EVENT(mali_csf_grp_q_template, mali_##name, \
196 	TP_PROTO(struct kbase_device *kbdev, struct kbase_queue_group *group, \
197 			struct kbase_queue *queue, u64 info_val), \
198 	TP_ARGS(kbdev, group, queue, info_val))
199 
200 DEFINE_MALI_CSF_GRP_Q_EVENT(CSI_START);
201 DEFINE_MALI_CSF_GRP_Q_EVENT(CSI_STOP);
202 DEFINE_MALI_CSF_GRP_Q_EVENT(CSI_STOP_REQ);
203 DEFINE_MALI_CSF_GRP_Q_EVENT(CSI_INTERRUPT_GROUP_SUSPENDS_IGNORED);
204 DEFINE_MALI_CSF_GRP_Q_EVENT(CSI_INTERRUPT_FAULT);
205 DEFINE_MALI_CSF_GRP_Q_EVENT(CSI_INTERRUPT_TILER_OOM);
206 DEFINE_MALI_CSF_GRP_Q_EVENT(CSI_INTERRUPT_PROTM_PEND);
207 DEFINE_MALI_CSF_GRP_Q_EVENT(CSI_PROTM_ACK);
208 DEFINE_MALI_CSF_GRP_Q_EVENT(QUEUE_START);
209 DEFINE_MALI_CSF_GRP_Q_EVENT(QUEUE_STOP);
210 DEFINE_MALI_CSF_GRP_Q_EVENT(QUEUE_SYNC_UPDATE_EVAL_START);
211 DEFINE_MALI_CSF_GRP_Q_EVENT(QUEUE_SYNC_UPDATE_EVAL_END);
212 DEFINE_MALI_CSF_GRP_Q_EVENT(QUEUE_SYNC_UPDATE_WAIT_STATUS);
213 DEFINE_MALI_CSF_GRP_Q_EVENT(QUEUE_SYNC_UPDATE_CUR_VAL);
214 DEFINE_MALI_CSF_GRP_Q_EVENT(QUEUE_SYNC_UPDATE_TEST_VAL);
215 DEFINE_MALI_CSF_GRP_Q_EVENT(QUEUE_SYNC_UPDATE_BLOCKED_REASON);
216 DEFINE_MALI_CSF_GRP_Q_EVENT(CSI_PROTM_PEND_SET);
217 DEFINE_MALI_CSF_GRP_Q_EVENT(CSI_PROTM_PEND_CLEAR);
218 
219 #undef DEFINE_MALI_CSF_GRP_Q_EVENT
220 
221 /*
222  * KCPU queue events
223  */
224 DECLARE_EVENT_CLASS(mali_csf_kcpu_queue_template,
225 	TP_PROTO(struct kbase_kcpu_command_queue *queue,
226 		 u64 info_val1, u64 info_val2),
227 	TP_ARGS(queue, info_val1, info_val2),
228 	TP_STRUCT__entry(
229 		__field(u64, info_val1)
230 		__field(u64, info_val2)
231 		__field(pid_t, kctx_tgid)
232 		__field(u32, kctx_id)
233 		__field(u8, id)
234 	),
235 	TP_fast_assign(
236 		{
237 			__entry->info_val1 = info_val1;
238 			__entry->info_val2 = info_val2;
239 			__entry->kctx_id = queue->kctx->id;
240 			__entry->kctx_tgid = queue->kctx->tgid;
241 			__entry->id = queue->id;
242 		}
243 
244 	),
245 	TP_printk("kctx=%d_%u id=%u info_val1=0x%llx info_val2=0x%llx",
246 			__entry->kctx_tgid, __entry->kctx_id, __entry->id,
247 			__entry->info_val1, __entry->info_val2)
248 );
249 
250 #define DEFINE_MALI_CSF_KCPU_EVENT(name)  \
251 	DEFINE_EVENT(mali_csf_kcpu_queue_template, mali_##name, \
252 	TP_PROTO(struct kbase_kcpu_command_queue *queue, \
253 		 u64 info_val1, u64 info_val2), \
254 	TP_ARGS(queue, info_val1, info_val2))
255 
256 DEFINE_MALI_CSF_KCPU_EVENT(KCPU_QUEUE_CREATE);
257 DEFINE_MALI_CSF_KCPU_EVENT(KCPU_QUEUE_DELETE);
258 DEFINE_MALI_CSF_KCPU_EVENT(KCPU_CQS_SET);
259 DEFINE_MALI_CSF_KCPU_EVENT(KCPU_CQS_WAIT_START);
260 DEFINE_MALI_CSF_KCPU_EVENT(KCPU_CQS_WAIT_END);
261 DEFINE_MALI_CSF_KCPU_EVENT(KCPU_FENCE_SIGNAL);
262 DEFINE_MALI_CSF_KCPU_EVENT(KCPU_FENCE_WAIT_START);
263 DEFINE_MALI_CSF_KCPU_EVENT(KCPU_FENCE_WAIT_END);
264 
265 #undef DEFINE_MALI_CSF_KCPU_EVENT
266 
267 #endif /* !defined(_KBASE_DEBUG_LINUX_KTRACE_CSF_H_) || defined(TRACE_HEADER_MULTI_READ) */
268