static void _cmdq_flush_config_handle(int blocking, void *callback, unsigned int userdata)
{
    if(blocking )
    	cmdqRecFlush(pgc->cmdq_handle_config);  // it will be blocked until mutex done
	else
    {
        if(callback)
			cmdqRecFlushAsyncCallback(pgc->cmdq_handle_config, callback, userdata);
		else
			cmdqRecFlushAsync(pgc->cmdq_handle_config);
    }
	//dprec_event_op(DPREC_EVENT_CMDQ_FLUSH);
}
Example #2
0
static int wdma_config_l(DISP_MODULE_ENUM module, disp_ddp_path_config* pConfig, void *handle)
{

    WDMA_CONFIG_STRUCT* config = &pConfig->wdma_config;
	int wdma_idx = wdma_index(module);
	CMDQ_ENG_ENUM cmdq_engine;

    if (!pConfig->wdma_dirty) {
        return 0;
    }

	//warm reset wdma every time we use it
	if(handle) {
		if(/*(primary_display_is_video_mode()==0 && primary_display_is_decouple_mode()==0) ||*/
			primary_display_is_decouple_mode()==1)
		{
		    unsigned int idx_offst = wdma_idx*DISP_WDMA_INDEX_OFFSET;

			DISP_REG_SET(handle, idx_offst+DISP_REG_WDMA_RST, 0x01); // trigger soft reset
			cmdqRecPoll(handle, disp_addr_convert(idx_offst+DISP_REG_WDMA_FLOW_CTRL_DBG), 1, 0x1);
			DISP_REG_SET(handle, idx_offst+DISP_REG_WDMA_RST , 0x0); // trigger soft reset
		}
	}
	
	cmdq_engine = wdma_idx==0 ? CMDQ_ENG_DISP_WDMA0 : CMDQ_ENG_DISP_WDMA1;

	if(config->security == DISP_SECURE_BUFFER) {
		cmdqRecSetSecure(handle, 1);

		/* set engine as sec */
		cmdqRecSecureEnablePortSecurity(handle, (1LL << cmdq_engine));
		cmdqRecSecureEnableDAPC(handle, (1LL << cmdq_engine));
		if(wdma_is_sec[wdma_idx] == 0)
			DDPMSG("[SVP] switch wdma%d to sec\n", wdma_idx);
		wdma_is_sec[wdma_idx] = 1;
	} else {
		if(wdma_is_sec[wdma_idx]) {
			/* wdma is in sec stat, we need to switch it to nonsec */
			cmdqRecHandle nonsec_switch_handle;
			int ret;
			ret = cmdqRecCreate(CMDQ_SCENARIO_DISP_PRIMARY_DISABLE_SECURE_PATH, &(nonsec_switch_handle));
			if(ret)
				DDPAEE("[SVP]fail to create disable handle %s ret=%d\n", __FUNCTION__, ret);

			cmdqRecReset(nonsec_switch_handle);
			_cmdq_insert_wait_frame_done_token_mira(nonsec_switch_handle);
			cmdqRecSetSecure(nonsec_switch_handle, 1);

			/*in fact, dapc/port_sec will be disabled by cmdq*/
			cmdqRecSecureEnablePortSecurity(nonsec_switch_handle, (1LL << cmdq_engine));
			cmdqRecSecureEnableDAPC(nonsec_switch_handle, (1LL << cmdq_engine));
			cmdqRecFlushAsync(nonsec_switch_handle);
			cmdqRecDestroy(nonsec_switch_handle);
			DDPMSG("[SVP] switch wdma%d to nonsec\n", wdma_idx);
		}
		wdma_is_sec[wdma_idx] = 0;
	}

    if (wdma_check_input_param(config) == 0)
        wdma_config(module, 
                   config->srcWidth, 
                   config->srcHeight, 
                   config->clipX, 
                   config->clipY, 
                   config->clipWidth, 
                   config->clipHeight, 
                   config->outputFormat, 
                   config->dstAddress, 
                   config->dstPitch, 
                   config->useSpecifiedAlpha, 
                   config->alpha,
                   config->security,
                   handle);      
    return 0;
}