/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ /* * * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved. * * This program is free software and is provided to you under the terms of the * GNU General Public License version 2 as published by the Free Software * Foundation, and any use by you of this program is subject to the terms * of such GNU license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, you can access it online at * http://www.gnu.org/licenses/gpl-2.0.html. * */ /* * NOTE: This must **only** be included through mali_linux_trace.h, * otherwise it will fail to setup tracepoints correctly */ #if !defined(_KBASE_DEBUG_LINUX_KTRACE_CSF_H_) || defined(TRACE_HEADER_MULTI_READ) #define _KBASE_DEBUG_LINUX_KTRACE_CSF_H_ /* * Generic CSF events - using the common DEFINE_MALI_ADD_EVENT */ DEFINE_MALI_ADD_EVENT(EVICT_CTX_SLOTS); DEFINE_MALI_ADD_EVENT(FIRMWARE_BOOT); DEFINE_MALI_ADD_EVENT(FIRMWARE_REBOOT); DEFINE_MALI_ADD_EVENT(SCHEDULER_TOCK); DEFINE_MALI_ADD_EVENT(SCHEDULER_TOCK_END); DEFINE_MALI_ADD_EVENT(SCHEDULER_TICK); DEFINE_MALI_ADD_EVENT(SCHEDULER_TICK_END); DEFINE_MALI_ADD_EVENT(SCHEDULER_RESET); DEFINE_MALI_ADD_EVENT(SCHEDULER_WAIT_PROTM_QUIT); DEFINE_MALI_ADD_EVENT(SCHEDULER_WAIT_PROTM_QUIT_DONE); DEFINE_MALI_ADD_EVENT(SYNC_UPDATE_EVENT); DEFINE_MALI_ADD_EVENT(SYNC_UPDATE_EVENT_NOTIFY_GPU); DEFINE_MALI_ADD_EVENT(CSF_INTERRUPT); DEFINE_MALI_ADD_EVENT(CSF_INTERRUPT_END); DEFINE_MALI_ADD_EVENT(CSG_INTERRUPT_PROCESS); DEFINE_MALI_ADD_EVENT(GLB_REQ_ACQ); DEFINE_MALI_ADD_EVENT(SCHEDULER_CAN_IDLE); DEFINE_MALI_ADD_EVENT(SCHEDULER_ADVANCE_TICK); DEFINE_MALI_ADD_EVENT(SCHEDULER_NOADVANCE_TICK); DEFINE_MALI_ADD_EVENT(SCHEDULER_INSERT_RUNNABLE); DEFINE_MALI_ADD_EVENT(SCHEDULER_REMOVE_RUNNABLE); DEFINE_MALI_ADD_EVENT(SCHEDULER_ROTATE_RUNNABLE); DEFINE_MALI_ADD_EVENT(SCHEDULER_HEAD_RUNNABLE); DEFINE_MALI_ADD_EVENT(IDLE_WORKER_BEGIN); DEFINE_MALI_ADD_EVENT(IDLE_WORKER_END); DEFINE_MALI_ADD_EVENT(GROUP_SYNC_UPDATE_WORKER_BEGIN); DEFINE_MALI_ADD_EVENT(GROUP_SYNC_UPDATE_WORKER_END); DEFINE_MALI_ADD_EVENT(SLOTS_STATUS_UPDATE_ACK); DECLARE_EVENT_CLASS(mali_csf_grp_q_template, TP_PROTO(struct kbase_device *kbdev, struct kbase_queue_group *group, struct kbase_queue *queue, u64 info_val), TP_ARGS(kbdev, group, queue, info_val), TP_STRUCT__entry( __field(u64, info_val) __field(pid_t, kctx_tgid) __field(u32, kctx_id) __field(u8, group_handle) __field(s8, csg_nr) __field(u8, slot_prio) __field(s8, csi_index) ), TP_fast_assign( { struct kbase_context *kctx = NULL; __entry->info_val = info_val; /* Note: if required in future, we could record some * flags in __entry about whether the group/queue parts * are valid, and add that to the trace message e.g. * by using __print_flags()/__print_symbolic() */ if (queue) { /* Note: kctx overridden by group->kctx later if group is valid */ kctx = queue->kctx; __entry->csi_index = queue->csi_index; } else { __entry->csi_index = -1; } if (group) { kctx = group->kctx; __entry->group_handle = group->handle; __entry->csg_nr = group->csg_nr; if (group->csg_nr >= 0) __entry->slot_prio = kbdev->csf.scheduler.csg_slots[group->csg_nr].priority; else __entry->slot_prio = 0u; } else { __entry->group_handle = 0u; __entry->csg_nr = -1; __entry->slot_prio = 0u; } __entry->kctx_id = (kctx) ? kctx->id : 0u; __entry->kctx_tgid = (kctx) ? kctx->tgid : 0; } ), TP_printk("kctx=%d_%u group=%u slot=%d prio=%u csi=%d info=0x%llx", __entry->kctx_tgid, __entry->kctx_id, __entry->group_handle, __entry->csg_nr, __entry->slot_prio, __entry->csi_index, __entry->info_val) ); /* * Group events */ #define DEFINE_MALI_CSF_GRP_EVENT(name) \ DEFINE_EVENT_PRINT(mali_csf_grp_q_template, mali_##name, \ TP_PROTO(struct kbase_device *kbdev, struct kbase_queue_group *group, \ struct kbase_queue *queue, u64 info_val), \ TP_ARGS(kbdev, group, queue, info_val), \ TP_printk("kctx=%d_%u group=%u slot=%d prio=%u info=0x%llx", \ __entry->kctx_tgid, __entry->kctx_id, __entry->group_handle, \ __entry->csg_nr, __entry->slot_prio, __entry->info_val)) DEFINE_MALI_CSF_GRP_EVENT(CSG_SLOT_START); DEFINE_MALI_CSF_GRP_EVENT(CSG_SLOT_STOP); DEFINE_MALI_CSF_GRP_EVENT(CSG_SLOT_STARTED); DEFINE_MALI_CSF_GRP_EVENT(CSG_SLOT_STOPPED); DEFINE_MALI_CSF_GRP_EVENT(CSG_SLOT_CLEANED); DEFINE_MALI_CSF_GRP_EVENT(CSG_SLOT_STATUS_UPDATE); DEFINE_MALI_CSF_GRP_EVENT(CSG_SLOT_IDLE_SET); DEFINE_MALI_CSF_GRP_EVENT(CSG_SLOT_IDLE_CLEAR); DEFINE_MALI_CSF_GRP_EVENT(CSG_PRIO_UPDATE); DEFINE_MALI_CSF_GRP_EVENT(CSG_SYNC_UPDATE_INTERRUPT); DEFINE_MALI_CSF_GRP_EVENT(CSG_IDLE_INTERRUPT); DEFINE_MALI_CSF_GRP_EVENT(CSG_PROGRESS_TIMER_INTERRUPT); DEFINE_MALI_CSF_GRP_EVENT(CSG_INTERRUPT_PROCESS_END); DEFINE_MALI_CSF_GRP_EVENT(GROUP_SYNC_UPDATE_DONE); DEFINE_MALI_CSF_GRP_EVENT(GROUP_DESCHEDULE); DEFINE_MALI_CSF_GRP_EVENT(GROUP_SCHEDULE); DEFINE_MALI_CSF_GRP_EVENT(GROUP_EVICT_SCHED); DEFINE_MALI_CSF_GRP_EVENT(GROUP_INSERT_RUNNABLE); DEFINE_MALI_CSF_GRP_EVENT(GROUP_REMOVE_RUNNABLE); DEFINE_MALI_CSF_GRP_EVENT(GROUP_ROTATE_RUNNABLE); DEFINE_MALI_CSF_GRP_EVENT(GROUP_HEAD_RUNNABLE); DEFINE_MALI_CSF_GRP_EVENT(GROUP_INSERT_IDLE_WAIT); DEFINE_MALI_CSF_GRP_EVENT(GROUP_REMOVE_IDLE_WAIT); DEFINE_MALI_CSF_GRP_EVENT(GROUP_HEAD_IDLE_WAIT); DEFINE_MALI_CSF_GRP_EVENT(SCHEDULER_CHECK_PROTM_ENTER); DEFINE_MALI_CSF_GRP_EVENT(SCHEDULER_ENTER_PROTM); DEFINE_MALI_CSF_GRP_EVENT(SCHEDULER_EXIT_PROTM); DEFINE_MALI_CSF_GRP_EVENT(SCHEDULER_TOP_GRP); DEFINE_MALI_CSF_GRP_EVENT(SCHEDULER_NONIDLE_OFFSLOT_INC); DEFINE_MALI_CSF_GRP_EVENT(SCHEDULER_NONIDLE_OFFSLOT_DEC); DEFINE_MALI_CSF_GRP_EVENT(PROTM_EVENT_WORKER_BEGIN); DEFINE_MALI_CSF_GRP_EVENT(PROTM_EVENT_WORKER_END); #undef DEFINE_MALI_CSF_GRP_EVENT /* * Group + Queue events */ #define DEFINE_MALI_CSF_GRP_Q_EVENT(name) \ DEFINE_EVENT(mali_csf_grp_q_template, mali_##name, \ TP_PROTO(struct kbase_device *kbdev, struct kbase_queue_group *group, \ struct kbase_queue *queue, u64 info_val), \ TP_ARGS(kbdev, group, queue, info_val)) DEFINE_MALI_CSF_GRP_Q_EVENT(CSI_START); DEFINE_MALI_CSF_GRP_Q_EVENT(CSI_STOP); DEFINE_MALI_CSF_GRP_Q_EVENT(CSI_STOP_REQUESTED); DEFINE_MALI_CSF_GRP_Q_EVENT(CSI_IGNORED_INTERRUPTS_GROUP_SUSPEND); DEFINE_MALI_CSF_GRP_Q_EVENT(CSI_FAULT_INTERRUPT); DEFINE_MALI_CSF_GRP_Q_EVENT(CSI_TILER_OOM_INTERRUPT); DEFINE_MALI_CSF_GRP_Q_EVENT(CSI_PROTM_PEND_INTERRUPT); DEFINE_MALI_CSF_GRP_Q_EVENT(CSI_PROTM_ACK); DEFINE_MALI_CSF_GRP_Q_EVENT(QUEUE_START); DEFINE_MALI_CSF_GRP_Q_EVENT(QUEUE_STOP); DEFINE_MALI_CSF_GRP_Q_EVENT(QUEUE_SYNC_UPDATE); DEFINE_MALI_CSF_GRP_Q_EVENT(QUEUE_SYNC_UPDATE_EVALUATED); DEFINE_MALI_CSF_GRP_Q_EVENT(QUEUE_SYNC_STATUS_WAIT); DEFINE_MALI_CSF_GRP_Q_EVENT(QUEUE_SYNC_CURRENT_VAL); DEFINE_MALI_CSF_GRP_Q_EVENT(QUEUE_SYNC_TEST_VAL); DEFINE_MALI_CSF_GRP_Q_EVENT(QUEUE_SYNC_BLOCKED_REASON); DEFINE_MALI_CSF_GRP_Q_EVENT(PROTM_PENDING_SET); DEFINE_MALI_CSF_GRP_Q_EVENT(PROTM_PENDING_CLEAR); #undef DEFINE_MALI_CSF_GRP_Q_EVENT /* * KCPU queue events */ DECLARE_EVENT_CLASS(mali_csf_kcpu_queue_template, TP_PROTO(struct kbase_kcpu_command_queue *queue, u64 info_val1, u64 info_val2), TP_ARGS(queue, info_val1, info_val2), TP_STRUCT__entry( __field(u64, info_val1) __field(u64, info_val2) __field(pid_t, kctx_tgid) __field(u32, kctx_id) __field(u8, id) ), TP_fast_assign( { __entry->info_val1 = info_val1; __entry->info_val2 = info_val2; __entry->kctx_id = queue->kctx->id; __entry->kctx_tgid = queue->kctx->tgid; __entry->id = queue->id; } ), TP_printk("kctx=%d_%u id=%u info_val1=0x%llx info_val2=0x%llx", __entry->kctx_tgid, __entry->kctx_id, __entry->id, __entry->info_val1, __entry->info_val2) ); #define DEFINE_MALI_CSF_KCPU_EVENT(name) \ DEFINE_EVENT(mali_csf_kcpu_queue_template, mali_##name, \ TP_PROTO(struct kbase_kcpu_command_queue *queue, \ u64 info_val1, u64 info_val2), \ TP_ARGS(queue, info_val1, info_val2)) DEFINE_MALI_CSF_KCPU_EVENT(KCPU_QUEUE_NEW); DEFINE_MALI_CSF_KCPU_EVENT(KCPU_QUEUE_DESTROY); DEFINE_MALI_CSF_KCPU_EVENT(CQS_SET); DEFINE_MALI_CSF_KCPU_EVENT(CQS_WAIT_START); DEFINE_MALI_CSF_KCPU_EVENT(CQS_WAIT_END); DEFINE_MALI_CSF_KCPU_EVENT(FENCE_SIGNAL); DEFINE_MALI_CSF_KCPU_EVENT(FENCE_WAIT_START); DEFINE_MALI_CSF_KCPU_EVENT(FENCE_WAIT_END); #undef DEFINE_MALI_CSF_KCPU_EVENT #endif /* !defined(_KBASE_DEBUG_LINUX_KTRACE_CSF_H_) || defined(TRACE_HEADER_MULTI_READ) */