static int kbase_fence_wait(kbase_jd_atom *katom) { int ret; OSK_ASSERT(NULL != katom); OSK_ASSERT(NULL != katom->kctx); sync_fence_waiter_init(&katom->sync_waiter, kbase_fence_wait_callback); ret = sync_fence_wait_async(katom->fence, &katom->sync_waiter); if (ret == 1) { /* Already signalled */ return 0; } else if (ret < 0) { goto cancel_atom; } return 1; cancel_atom: katom->event_code = BASE_JD_EVENT_JOB_CANCELLED; /* We should cause the dependant jobs in the bag to be failed, * to do this we schedule the work queue to complete this job */ OSK_ASSERT(0 == object_is_on_stack(&katom->work)); INIT_WORK(&katom->work, kbase_fence_wait_worker); queue_work(katom->kctx->jctx.job_done_wq, &katom->work); return 1; }
GED_ERROR ged_monitor_3D_fence_add(int fence_fd) { int err; GED_MONITOR_3D_FENCE* psMonitor; psMonitor = (GED_MONITOR_3D_FENCE*)ged_alloc(sizeof(GED_MONITOR_3D_FENCE)); if (!psMonitor) { return GED_ERROR_OOM; } sync_fence_waiter_init(&psMonitor->sSyncWaiter, ged_sync_cb); INIT_WORK(&psMonitor->sWork, ged_monitor_3D_fence_work_cb); psMonitor->psSyncFence = sync_fence_fdget(fence_fd); if (NULL == psMonitor->psSyncFence) { ged_free(psMonitor, sizeof(GED_MONITOR_3D_FENCE)); return GED_ERROR_INVALID_PARAMS; } err = sync_fence_wait_async(psMonitor->psSyncFence, &psMonitor->sSyncWaiter); if ((1 == err) || (0 > err)) { sync_fence_put(psMonitor->psSyncFence); ged_free(psMonitor, sizeof(GED_MONITOR_3D_FENCE)); } else if (0 == err) { int iCount = atomic_add_return(1, &g_i32Count); if (iCount > 1) { if (0 == ged_monitor_3D_fence_disable) { //unsigned int uiFreqLevelID; //if (mtk_get_bottom_gpu_freq(&uiFreqLevelID)) { //if (uiFreqLevelID != 4) { #ifdef CONFIG_GPU_TRACEPOINTS if (ged_monitor_3D_fence_systrace) { unsigned long long t = cpu_clock(smp_processor_id()); trace_gpu_sched_switch("Smart Boost", t, 1, 0, 1); } #endif mtk_set_bottom_gpu_freq(4); } } } } } if (ged_monitor_3D_fence_debug > 0) { GED_LOGI("[+]3D fences count = %d\n", atomic_read(&g_i32Count)); } return GED_OK; }
GED_ERROR ged_monitor_3D_fence_add(int fence_fd) { int err; GED_MONITOR_3D_FENCE* psMonitor = (GED_MONITOR_3D_FENCE*)ged_alloc(sizeof(GED_MONITOR_3D_FENCE)); #ifdef GED_DEBUG_MONITOR_3D_FENCE ged_log_buf_print(ghLogBuf_GED, "[+]ged_monitor_3D_fence_add"); #endif if (!psMonitor) { return GED_ERROR_OOM; } sync_fence_waiter_init(&psMonitor->sSyncWaiter, ged_sync_cb); INIT_WORK(&psMonitor->sWork, ged_monitor_3D_fence_work_cb); psMonitor->psSyncFence = sync_fence_fdget(fence_fd); if (NULL == psMonitor->psSyncFence) { ged_free(psMonitor, sizeof(GED_MONITOR_3D_FENCE)); return GED_ERROR_INVALID_PARAMS; } #ifdef GED_DEBUG_MONITOR_3D_FENCE ged_log_buf_print(ghLogBuf_GED, "[+]sync_fence_wait_async"); #endif err = sync_fence_wait_async(psMonitor->psSyncFence, &psMonitor->sSyncWaiter); #ifdef GED_DEBUG_MONITOR_3D_FENCE ged_log_buf_print(ghLogBuf_GED, "[-]sync_fence_wait_async, err = %d", err); #endif if ((1 == err) || (0 > err)) { sync_fence_put(psMonitor->psSyncFence); ged_free(psMonitor, sizeof(GED_MONITOR_3D_FENCE)); } else if (0 == err) { int iCount = atomic_add_return (1, &g_i32Count); if (iCount > 1) { //mtk_set_bottom_gpu_freq(iCount + 1); mtk_set_bottom_gpu_freq(4); } } #ifdef GED_DEBUG_MONITOR_3D_FENCE ged_log_buf_print(ghLogBuf_GED, "[-]ged_monitor_3D_fence_add, count = %d", atomic_read(&g_i32Count)); #endif return GED_OK; }
struct kgsl_sync_fence_waiter *kgsl_sync_fence_async_wait(int fd, void (*func)(void *priv), void *priv) { struct kgsl_sync_fence_waiter *kwaiter; struct sync_fence *fence; int status; fence = sync_fence_fdget(fd); if (fence == NULL) return ERR_PTR(-EINVAL); /* create the waiter */ kwaiter = kzalloc(sizeof(*kwaiter), GFP_ATOMIC); if (kwaiter == NULL) { sync_fence_put(fence); return ERR_PTR(-ENOMEM); } kwaiter->fence = fence; kwaiter->priv = priv; kwaiter->func = func; strlcpy(kwaiter->name, fence->name, sizeof(kwaiter->name)); sync_fence_waiter_init((struct sync_fence_waiter *) kwaiter, kgsl_sync_callback); /* if status then error or signaled */ status = sync_fence_wait_async(fence, (struct sync_fence_waiter *) kwaiter); if (status) { kfree(kwaiter); sync_fence_put(fence); if (status < 0) kwaiter = ERR_PTR(status); else kwaiter = NULL; } return kwaiter; }