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