static int setup_rdma_sec(DISP_MODULE_ENUM module, disp_ddp_path_config* pConfig, void *handle) { static int rdma_is_sec[2]; CMDQ_ENG_ENUM cmdq_engine; int rdma_idx = rdma_index(module); DISP_BUFFER_TYPE security = pConfig->rdma_config.security; enum RDMA_MODE mode = rdma_config_mode(pConfig->rdma_config.address); cmdq_engine = rdma_idx==0 ? CMDQ_ENG_DISP_RDMA0 : CMDQ_ENG_DISP_RDMA1; if(!handle) { DDPMSG("[SVP] bypass rdma sec setting sec=%d,handle=NULL\n", security); return 0; } /* sec setting make sence only in memory mode ! */ if(mode == RDMA_MODE_MEMORY) { if(security == DISP_SECURE_BUFFER) { cmdqRecSetSecure(handle, 1); /* set engine as sec */ cmdqRecSecureEnablePortSecurity(handle, (1LL << cmdq_engine)); //cmdqRecSecureEnableDAPC(handle, (1LL << cmdq_engine)); if(rdma_is_sec[rdma_idx] == 0) DDPMSG("[SVP] switch rdma%d to sec\n", rdma_idx); rdma_is_sec[rdma_idx] = 1; } else { if(rdma_is_sec[rdma_idx]) { /* rdma 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); /*ugly work around by kzhang !!. will remove when cmdq delete disable scenario. * To avoid translation fault like ovl (see notes in ovl.c)*/ do_rdma_config_l(module, pConfig, nonsec_switch_handle); /*in fact, dapc/port_sec will be disabled by cmdq*/ cmdqRecSecureEnablePortSecurity(nonsec_switch_handle, (1LL << cmdq_engine)); //cmdqRecSecureEnableDAPC(nonsec_switch_handle, (1LL << cmdq_engine)); cmdqRecFlush(nonsec_switch_handle); cmdqRecDestroy(nonsec_switch_handle); DDPMSG("[SVP] switch rdma%d to nonsec done\n", rdma_idx); } rdma_is_sec[rdma_idx] = 0; } } return 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; }