static void _mali_osk_wq_delayed_work_func( struct work_struct *work ) { mali_osk_wq_delayed_work_object_t *work_object; work_object = _MALI_OSK_CONTAINER_OF(work, mali_osk_wq_delayed_work_object_t, work.work); work_object->handler(work_object->data); }
static void _mali_osk_wq_work_func( struct work_struct *work ) { mali_osk_wq_work_object_t *work_object; work_object = _MALI_OSK_CONTAINER_OF(work, mali_osk_wq_work_object_t, work_handle); /* We want higher priority than the Dynamic Priority, setting it to the lowest of the RT priorities */ if (MALI_TRUE == work_object->high_pri) { set_user_nice(current, -19); } work_object->handler(work_object->data); }
static void _mali_osk_wq_work_func( struct work_struct *work ) { mali_osk_wq_work_object_t *work_object; work_object = _MALI_OSK_CONTAINER_OF(work, mali_osk_wq_work_object_t, work_handle); #if MALI_LICENSE_IS_GPL #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36) /* We want higher priority than the Dynamic Priority, setting it to the lowest of the RT priorities */ if (MALI_TRUE == work_object->high_pri) { set_user_nice(current, -19); } #endif #endif /* MALI_LICENSE_IS_GPL */ work_object->handler(work_object->data); }
static void irq_handler_bottom_half ( void * input ) #endif { mali_osk_irq_object_t *irq_object; #if defined(INIT_DELAYED_WORK) irq_object = _MALI_OSK_CONTAINER_OF(work, mali_osk_irq_object_t, work_queue_irq_handle); #else if ( NULL == input ) { MALI_PRINT_ERROR(("IRQ: Null pointer! Illegal!")); return; /* Error */ } irq_object = (mali_osk_irq_object_t *) input; #endif irq_object->bhandler(irq_object->data); }
static void _mali_osk_wq_work_func(struct work_struct *work) { mali_osk_wq_work_object_t *work_object; work_object = _MALI_OSK_CONTAINER_OF(work, mali_osk_wq_work_object_t, work_handle); #if MALI_LICENSE_IS_GPL #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36) /* We want highest Dynamic priority of the thread so that the Jobs depending ** on this thread could be scheduled in time. Without this, this thread might ** sometimes need to wait for some threads in user mode to finish its round-robin ** time, causing *bubble* in the Mali pipeline. Thanks to the new implementation ** of high-priority workqueue in new kernel, this only happens in older kernel. */ if (MALI_TRUE == work_object->high_pri) { set_user_nice(current, -19); } #endif #endif /* MALI_LICENSE_IS_GPL */ work_object->handler(work_object->data); }
/* Start this job on this core. Return MALI_TRUE if the job was started. */ static _mali_osk_errcode_t subsystem_mali200_start_job(mali_core_job * job, mali_core_renderunit * core) { mali200_job *job200; /* The local extended version of the general structs */ job200 = _MALI_OSK_CONTAINER_OF(job, mali200_job, embedded_core_job); if ( (0 == job200->user_input.frame_registers[0]) || (0 == job200->user_input.frame_registers[1]) ) { MALI_DEBUG_PRINT(4, ("Mali PP: Job: 0x%08x WILL NOT START SINCE JOB HAS ILLEGAL ADDRESSES\n", (u32)job200->user_input.user_job_ptr)); MALI_ERROR(_MALI_OSK_ERR_FAULT); } MALI_DEBUG_PRINT(4, ("Mali PP: Job: 0x%08x START_RENDER Tile_list: 0x%08x\n", (u32)job200->user_input.user_job_ptr, job200->user_input.frame_registers[0])); MALI_DEBUG_PRINT(6, ("Mali PP: RSW base addr: 0x%08x Vertex base addr: 0x%08x\n", job200->user_input.frame_registers[1], job200->user_input.frame_registers[2])); /* Frame registers. Copy from mem to physical registers */ mali_core_renderunit_register_write_array( core, MALI200_REG_ADDR_FRAME, &(job200->user_input.frame_registers[0]), MALI200_NUM_REGS_FRAME); /* Write Back unit 0. Copy from mem to physical registers only if the WB unit will be used. */ if (job200->user_input.wb0_registers[0]) { mali_core_renderunit_register_write_array( core, MALI200_REG_ADDR_WB0, &(job200->user_input.wb0_registers[0]), MALI200_NUM_REGS_WBx); } /* Write Back unit 1. Copy from mem to physical registers only if the WB unit will be used. */ if (job200->user_input.wb1_registers[0]) { mali_core_renderunit_register_write_array( core, MALI200_REG_ADDR_WB1, &(job200->user_input.wb1_registers[0]), MALI200_NUM_REGS_WBx); } /* Write Back unit 2. Copy from mem to physical registers only if the WB unit will be used. */ if (job200->user_input.wb2_registers[0]) { mali_core_renderunit_register_write_array( core, MALI200_REG_ADDR_WB2, &(job200->user_input.wb2_registers[0]), MALI200_NUM_REGS_WBx); } /* This selects which performance counters we are reading */ if ( 0 != job200->user_input.perf_counter_flag ) { if ( job200->user_input.perf_counter_flag & _MALI_PERFORMANCE_COUNTER_FLAG_SRC0_ENABLE) { mali_core_renderunit_register_write_relaxed( core, MALI200_REG_ADDR_MGMT_PERF_CNT_0_ENABLE, MALI200_REG_VAL_PERF_CNT_ENABLE); mali_core_renderunit_register_write_relaxed( core, MALI200_REG_ADDR_MGMT_PERF_CNT_0_SRC, job200->user_input.perf_counter_src0); } if ( job200->user_input.perf_counter_flag & _MALI_PERFORMANCE_COUNTER_FLAG_SRC1_ENABLE) { mali_core_renderunit_register_write_relaxed( core, MALI200_REG_ADDR_MGMT_PERF_CNT_1_ENABLE, MALI200_REG_VAL_PERF_CNT_ENABLE); mali_core_renderunit_register_write_relaxed( core, MALI200_REG_ADDR_MGMT_PERF_CNT_1_SRC, job200->user_input.perf_counter_src1); } #if defined(USING_MALI400_L2_CACHE) if ( job200->user_input.perf_counter_flag & (_MALI_PERFORMANCE_COUNTER_FLAG_L2_SRC0_ENABLE|_MALI_PERFORMANCE_COUNTER_FLAG_L2_SRC1_ENABLE) ) { int force_reset = ( job200->user_input.perf_counter_flag & _MALI_PERFORMANCE_COUNTER_FLAG_L2_RESET ) ? 1 : 0; u32 src0 = 0; u32 src1 = 0; if ( job200->user_input.perf_counter_flag & _MALI_PERFORMANCE_COUNTER_FLAG_L2_SRC0_ENABLE ) { src0 = job200->user_input.perf_counter_l2_src0; } if ( job200->user_input.perf_counter_flag & _MALI_PERFORMANCE_COUNTER_FLAG_L2_SRC1_ENABLE ) { src1 = job200->user_input.perf_counter_l2_src1; } mali_kernel_l2_cache_set_perf_counters(src0, src1, force_reset); /* will activate and possibly reset counters */ /* Now, retrieve the current values, so we can substract them when the job has completed */ mali_kernel_l2_cache_get_perf_counters(&job200->perf_counter_l2_src0, &job200->perf_counter_l2_val0, &job200->perf_counter_l2_src1, &job200->perf_counter_l2_val1); } #endif } subsystem_flush_mapped_mem_cache(); #if MALI_STATE_TRACKING _mali_osk_atomic_inc(&job->session->jobs_started); #endif /* This is the command that starts the Core */ mali_core_renderunit_register_write( core, MALI200_REG_ADDR_MGMT_CTRL_MGMT, MALI200_REG_VAL_CTRL_MGMT_START_RENDERING); _mali_osk_write_mem_barrier(); #if MALI_TIMELINE_PROFILING_ENABLED _mali_profiling_add_event(MALI_PROFILING_EVENT_TYPE_SINGLE | MALI_PROFILING_MAKE_EVENT_CHANNEL_PP(core->core_number) | MALI_PROFILING_EVENT_REASON_SINGLE_HW_FLUSH, job200->user_input.frame_builder_id, job200->user_input.flush_id, 0, 0, 0); _mali_profiling_add_event(MALI_PROFILING_EVENT_TYPE_START|MALI_PROFILING_MAKE_EVENT_CHANNEL_PP(core->core_number), job200->pid, job200->tid, #if defined(USING_MALI400_L2_CACHE) (job200->user_input.perf_counter_l2_src0 << 16) | (job200->user_input.perf_counter_l2_src1 << 24), job200->perf_counter_l2_val0, job200->perf_counter_l2_val1 #else 0, 0, 0 #endif ); #endif MALI_SUCCESS; }