/** * @brief Configure HW counters collection */ mali_error kbase_instr_hwcnt_setup(kbase_context *kctx, kbase_uk_hwcnt_setup *setup) { mali_error err = MALI_ERROR_FUNCTION_FAILED; kbase_device *kbdev; KBASE_DEBUG_ASSERT(NULL != kctx); kbdev = kctx->kbdev; KBASE_DEBUG_ASSERT(NULL != kbdev); if (NULL == setup) { /* Bad parameter - abort */ goto out; } if (setup->dump_buffer != 0ULL) { /* Enable HW counters */ err = kbase_instr_hwcnt_enable(kctx, setup); } else { /* Disable HW counters */ err = kbase_instr_hwcnt_disable(kctx); } out: return err; }
void kbase_gator_hwcnt_term(struct kbase_gator_hwcnt_info *in_out_info, struct kbase_gator_hwcnt_handles *opaque_handles) { if (in_out_info) kfree(in_out_info->hwc_layout); if (opaque_handles) { kbase_instr_hwcnt_disable(opaque_handles->kctx); kbase_vunmap(opaque_handles->kctx, &opaque_handles->hwcnt_map); kbase_mem_free(opaque_handles->kctx, opaque_handles->hwcnt_gpu_va); kbase_destroy_context(opaque_handles->kctx); kbase_release_device(opaque_handles->kbdev); kfree(opaque_handles); } }
/* Disable instrumentation and wait for any existing dump to complete * It's assumed that there's only one privileged context * Safe to do this without lock when doing an OS suspend, because it only * changes in response to user-space IOCTLs */ void kbase_instr_hwcnt_suspend(kbase_device *kbdev) { kbase_context *kctx; KBASE_DEBUG_ASSERT(kbdev); KBASE_DEBUG_ASSERT(!kbdev->hwcnt.suspended_kctx); kctx = kbdev->hwcnt.kctx; kbdev->hwcnt.suspended_kctx = kctx; /* Relevant state was saved into hwcnt.suspended_state when enabling the * counters */ if (kctx) { KBASE_DEBUG_ASSERT(kctx->jctx.sched_info.ctx.flags & KBASE_CTX_FLAG_PRIVILEGED); kbase_instr_hwcnt_disable(kctx); } }