static int _trigger_display_interface(int blocking, void *callback, unsigned int userdata) { ///EXT_DISP_FUNC(); int i = 0; bool reg_flush = false; if(_should_wait_path_idle()) { dpmgr_wait_event_timeout(pgc->dpmgr_handle, DISP_PATH_EVENT_FRAME_DONE, HZ/2); } if(_should_update_lcm()) { extd_drv_update(pgc->plcm, 0, 0, pgc->plcm->params->width, pgc->plcm->params->height, 0); } if(_should_start_path()) { reg_flush = true; dpmgr_path_start(pgc->dpmgr_handle, ext_disp_cmdq_enabled()); MMProfileLogEx(ddp_mmp_get_events()->Extd_State, MMProfileFlagPulse, Trigger, 1); } if(_should_trigger_path()) { // trigger_loop_handle is used only for build trigger loop, which should always be NULL for config thread dpmgr_path_trigger(pgc->dpmgr_handle, NULL, ext_disp_cmdq_enabled()); } if(_should_set_cmdq_dirty()) { _cmdq_set_config_handle_dirty(); } ///if(reg_flush == false) { #if 0 if(reg_flush == false) { if(_should_insert_wait_frame_done_token()) { _cmdq_insert_wait_frame_done_token(); } } if(_should_flush_cmdq_config_handle()) { _cmdq_flush_config_handle(reg_flush); } if(_should_reset_cmdq_config_handle()) { _cmdq_reset_config_handle(); } if(reg_flush == true) { if(_should_insert_wait_frame_done_token()) { _cmdq_insert_wait_frame_done_token(); } } ///cmdqRecDumpCommand(cmdqRecHandle handle) #else if(_should_flush_cmdq_config_handle()) { if(reg_flush) { MMProfileLogEx(ddp_mmp_get_events()->Extd_State, MMProfileFlagPulse, Trigger, 2); } if(_should_start_path()) { EXT_DISP_LOG("Wait Main Display Vsync\n"); disp_session_vsync_config vsync_config; primary_display_wait_for_vsync(&vsync_config); } _cmdq_flush_config_handle(blocking, callback, userdata); } if(_should_reset_cmdq_config_handle()) { _cmdq_reset_config_handle(); } if(_should_insert_wait_frame_done_token()) { _cmdq_insert_wait_frame_done_token(); } #endif } return 0; }
int ext_disp_init(char *lcm_name, unsigned int session) { DISPFUNC(); EXT_DISP_STATUS ret = EXT_DISP_STATUS_OK; DISP_MODULE_ENUM dst_module = 0; LCM_PARAMS *lcm_param = NULL; LCM_INTERFACE_ID lcm_id = LCM_INTERFACE_NOTDEFINED; dpmgr_init(); extd_mutex_init(&(pgc->lock)); _ext_disp_path_lock(); pgc->plcm = extd_drv_probe( lcm_name, LCM_INTERFACE_NOTDEFINED); if(pgc->plcm == NULL) { DISPCHECK("disp_lcm_probe returns null\n"); ret = EXT_DISP_STATUS_ERROR; goto done; } else { DISPCHECK("disp_lcm_probe SUCCESS\n"); } lcm_param = extd_drv_get_params(pgc->plcm); if(lcm_param == NULL) { DISPERR("get lcm params FAILED\n"); ret = EXT_DISP_STATUS_ERROR; goto done; } #if 0 ret = cmdqCoreRegisterCB(CMDQ_GROUP_DISP, cmdqDdpClockOn,cmdqDdpDumpInfo,cmdqDdpResetEng,cmdqDdpClockOff); if(ret) { DISPERR("cmdqCoreRegisterCB failed, ret=%d \n", ret); ret = EXT_DISP_STATUS_ERROR; goto done; } #endif ret = cmdqRecCreate(CMDQ_SCENARIO_MHL_DISP, &(pgc->cmdq_handle_config)); if(ret) { DISPCHECK("cmdqRecCreate FAIL, ret=%d \n", ret); ret = EXT_DISP_STATUS_ERROR; goto done; } else { DISPCHECK("cmdqRecCreate SUCCESS, g_cmdq_handle=%p \n", pgc->cmdq_handle_config); } if(ext_disp_mode == EXTD_DIRECT_LINK_MODE) { _build_path_direct_link(); DISPCHECK("ext_disp display is DIRECT LINK MODE\n"); } else if(ext_disp_mode == EXTD_DECOUPLE_MODE) { _build_path_decouple(); DISPCHECK("ext_disp display is DECOUPLE MODE\n"); } else if(ext_disp_mode == EXTD_SINGLE_LAYER_MODE) { _build_path_single_layer(); DISPCHECK("ext_disp display is SINGLE LAYER MODE\n"); } else if(ext_disp_mode == EXTD_DEBUG_RDMA_DPI_MODE) { _build_path_debug_rdma_dpi(); DISPCHECK("ext_disp display is DEBUG RDMA to dpi MODE\n"); } else { DISPCHECK("ext_disp display mode is WRONG\n"); } if(ext_disp_use_cmdq == CMDQ_ENABLE) { _cmdq_build_trigger_loop(); DISPCHECK("ext_disp display BUILD cmdq trigger loop finished\n"); _cmdq_start_trigger_loop(); } pgc->session = session; DISPCHECK("ext_disp display START cmdq trigger loop finished\n"); dpmgr_path_set_video_mode(pgc->dpmgr_handle, ext_disp_is_video_mode()); dpmgr_path_init(pgc->dpmgr_handle, CMDQ_DISABLE); /* disp_ddp_path_config data_config; memset((void*)&data_config, 0, sizeof(disp_ddp_path_config)); memcpy(&(data_config.dispif_config), &(lcm_param), sizeof(LCM_PARAMS)); data_config.dst_w = lcm_param->width; data_config.dst_h = lcm_param->height; data_config.dst_dirty = 1; ret = dpmgr_path_config(pgc->dpmgr_handle, &data_config, CMDQ_DISABLE); */ disp_ddp_path_config *data_config = (disp_ddp_path_config *)vmalloc(sizeof(disp_ddp_path_config)); if(data_config) { memset((void*)data_config, 0, sizeof(disp_ddp_path_config)); memcpy(&(data_config->dispif_config), &(lcm_param), sizeof(LCM_PARAMS)); data_config->dst_w = lcm_param->width; data_config->dst_h = lcm_param->height; data_config->dst_dirty = 1; ret = dpmgr_path_config(pgc->dpmgr_handle, data_config, CMDQ_DISABLE); vfree(data_config); } else { DISPCHECK("allocate buffer data_config failed!!!\n"); ret = EXT_DISP_STATUS_ERROR; goto done; } if(!extd_drv_is_inited(pgc->plcm)) { ret = extd_drv_init(pgc->plcm); } // this will be set to always enable cmdq later if(ext_disp_is_video_mode()) { ///ext_disp_use_cmdq = CMDQ_ENABLE; if(ext_disp_mode == EXTD_DEBUG_RDMA_DPI_MODE) dpmgr_map_event_to_irq(pgc->dpmgr_handle, DISP_PATH_EVENT_IF_VSYNC, DDP_IRQ_RDMA2_DONE); else dpmgr_map_event_to_irq(pgc->dpmgr_handle, DISP_PATH_EVENT_IF_VSYNC, DDP_IRQ_RDMA1_DONE); } if(ext_disp_use_cmdq == CMDQ_ENABLE) { _cmdq_reset_config_handle(); _cmdq_insert_wait_frame_done_token(); } pgc->state = EXTD_INIT; done: ///dpmgr_check_status(pgc->dpmgr_handle); _ext_disp_path_unlock(); ext_disp_resume(); dpmgr_path_stop(pgc->dpmgr_handle, CMDQ_DISABLE); DISPMSG("ext_disp_init done \n"); return ret; }