示例#1
0
static void DAL_UpdateScreen (BOOL enable, BOOL aen, UINT32 width, UINT32 height) {
    disp_job *job = disp_deque_job(disp_config.session_id);
    mutex_lock(&job->lock);
    job->input[ASSERT_LAYER].layer_id = ASSERT_LAYER;
    job->input[ASSERT_LAYER].layer_enable = enable;
    job->input[ASSERT_LAYER].dirty = TRUE;
    if (enable) {
        job->input[ASSERT_LAYER].src_x = DAL_WIDTH - width;
        job->input[ASSERT_LAYER].src_y = 0;
        job->input[ASSERT_LAYER].dst_x = DAL_WIDTH - width;
        job->input[ASSERT_LAYER].dst_y = 0;
        job->input[ASSERT_LAYER].width = width;
        job->input[ASSERT_LAYER].height = height;
        job->input[ASSERT_LAYER].pitch = DAL_PITCH * DAL_BPP;
        job->input[ASSERT_LAYER].format = DAL_FORMAT;
        job->input[ASSERT_LAYER].address = dal_fb_pa;
        job->input[ASSERT_LAYER].alpha_enable = aen;
        if (aen) {
            job->input[ASSERT_LAYER].alpha = 0x80;
        }
    }
    mutex_unlock(&job->lock);
    printk("[FB Driver] DAL_UpdateScreen(): id=%d,en=%d,aen=%d,fmt=%d,pitch=%d,w=%d,h=%d\n",
           ASSERT_LAYER, enable, aen, DP_COLOR_GET_UNIQUE_ID(DAL_FORMAT), (int)(DAL_PITCH * DAL_BPP), width, height);
    disp_enque_job(disp_config.session_id);
    if (DISP_IsDecoupleMode()) {
        DISP_StartOverlayTransfer();
    }
}
示例#2
0
int RDMAConfig(unsigned idx,
	       enum RDMA_MODE mode,
	       DpColorFormat inFormat,
	       unsigned address,
	       enum RDMA_OUTPUT_FORMAT outputFormat,
	       unsigned pitch,
	       unsigned width,
	       unsigned height,
	       bool isByteSwap,	/* input setting */
	       bool isRGBSwap) /* ourput setting */
{
	unsigned int bpp = 2;
	unsigned int rgb_swap = 0;
	unsigned int input_is_yuv = 0;
	unsigned int output_is_yuv = 0;
	/* Calculate fifo settings */
	unsigned int fifo_pseudo_length = 256;
	unsigned int fifo_threashold;
	/* Calculate ultra settings */
	unsigned int fps = 60;
	unsigned int blank_overhead = 115;	/* it is 1.15, need to divide 100 later */
	unsigned int rdma_fifo_width = 16;	/* in unit of byte */
	unsigned int ultra_low_time = 6;	/* in unit of us */
	unsigned int pre_ultra_low_time = 8;	/* in unit of us */
	unsigned int pre_ultra_high_time = 9;	/* in unit of us */
	unsigned int consume_levels_per_usec;
	unsigned int ultra_low_level;
	unsigned int pre_ultra_low_level;
	unsigned int pre_ultra_high_level;
	unsigned int ultra_high_ofs;
	unsigned int pre_ultra_low_ofs;
	unsigned int pre_ultra_high_ofs;
	enum RDMA_INPUT_FORMAT inputFormat;

	if ((DISP_IsDecoupleMode() == 0) || (gEnableUltra == 1)) {
		if (gUltraLevel == 0) {
			ultra_low_time = 4;	/* in unit of us */
			pre_ultra_low_time = 6;	/* in unit of us */
			pre_ultra_high_time = 7;	/* in unit of us */
		} else if (gUltraLevel == 1) {
			ultra_low_time = 5;	/* in unit of us */
			pre_ultra_low_time = 7;	/* in unit of us */
			pre_ultra_high_time = 8;	/* in unit of us */
		} else if (gUltraLevel == 2) {
			ultra_low_time = 6;	/* in unit of us */
			pre_ultra_low_time = 8;	/* in unit of us */
			pre_ultra_high_time = 9;	/* in unit of us */
		}
	}
	inputFormat = rdma_fmt_convert(inFormat);
	ASSERT(idx <= 2);
	if ((width > RDMA_MAX_WIDTH) || (height > RDMA_MAX_HEIGHT)) {
		DISP_ERR("DDP error, RDMA input overflow, w=%d, h=%d, max_w=%d, max_h=%d\n",
			 width, height, RDMA_MAX_WIDTH, RDMA_MAX_HEIGHT);
	}

	if (width == 0 || height == 0) {
		DISP_ERR("DDP error, RDMA input error, w=%d, h=%d, pitch=%d\n", width, height,
			 pitch);
		ASSERT(width > 0);
		ASSERT(height > 0);
	}
	if (mode == RDMA_MODE_MEMORY) {
		ASSERT(pitch > 0);
		ASSERT(address > 0);
	}

	switch (inputFormat) {
	case RDMA_INPUT_FORMAT_YUYV:
	case RDMA_INPUT_FORMAT_UYVY:
	case RDMA_INPUT_FORMAT_YVYU:
	case RDMA_INPUT_FORMAT_VYUY:
	case RDMA_INPUT_FORMAT_RGB565:
		bpp = 2;
		break;
	case RDMA_INPUT_FORMAT_RGB888:
		bpp = 3;
		break;
	case RDMA_INPUT_FORMAT_ARGB:
		bpp = 4;
		break;
		/* More color format support */
	case RDMA_INPUT_FORMAT_BGR565:
		inputFormat -= RDMA_COLOR_BASE;
		bpp = 2;
		rgb_swap = 1;
		break;
	case RDMA_INPUT_FORMAT_BGR888:
		inputFormat -= RDMA_COLOR_BASE;
		bpp = 3;
		rgb_swap = 1;
		break;
	case RDMA_INPUT_FORMAT_ABGR:
		inputFormat -= RDMA_COLOR_BASE;
		bpp = 4;
		rgb_swap = 1;
		break;

	default:
		DISP_ERR("DDP error, unknown RDMA input format = %d\n", inputFormat);
		ASSERT(0);
	}
	/* OUTPUT_VALID_FIFO_THREASHOLD = min{(DISP_WIDTH+120)*bpp/16, FIFO_PSEUDO_LENGTH} */
	fifo_threashold = (width + 120) * bpp / 16;
	fifo_threashold =
	    fifo_threashold > fifo_pseudo_length ? fifo_pseudo_length : fifo_threashold;
	/* -------------------------------------------------------- */
	/* calculate ultra/pre-ultra setting */
	/* to start to issue ultra from fifo having 4us data */
	/* to stop  to issue ultra until fifo having 6us data */
	/* to start to issue pre-ultra from fifo having 6us data */
	/* to stop  to issue pre-ultra until fifo having 7us data */
	/* the sequence is ultra_low < pre_ultra_low < ultra_high < pre_ultra_high */
	/* 4us         6us             6us+1level   7us */
	/* -------------------------------------------------------- */
	consume_levels_per_usec =
	    (width * height * fps * bpp / rdma_fifo_width / 100) * blank_overhead;

	/* /1000000 for ultra_low_time in unit of us */
	ultra_low_level = ultra_low_time * consume_levels_per_usec / 1000000;
	pre_ultra_low_level = pre_ultra_low_time * consume_levels_per_usec / 1000000;
	pre_ultra_high_level = pre_ultra_high_time * consume_levels_per_usec / 1000000;
	pre_ultra_low_ofs = pre_ultra_low_level - ultra_low_level;
	ultra_high_ofs = 1;
	pre_ultra_high_ofs = pre_ultra_high_level - pre_ultra_low_level - 1;

	if ((DISP_IsDecoupleMode() == 0) || (gEnableUltra == 1)) {
		if (gUltraLevel == 4) {
			ultra_low_level = 0x6b;
			pre_ultra_low_ofs = 0xa0;
			ultra_high_ofs = 1;
			pre_ultra_high_ofs = 1;
		} else if (gUltraLevel == 3) {
			ultra_low_level = 0x6b;
			pre_ultra_low_ofs = 0x36;
			ultra_high_ofs = 0x50;
			pre_ultra_high_ofs = 0x14;
		}
	}

	switch (inputFormat) {
	case RDMA_INPUT_FORMAT_YUYV:
	case RDMA_INPUT_FORMAT_UYVY:
	case RDMA_INPUT_FORMAT_YVYU:
	case RDMA_INPUT_FORMAT_VYUY:
		input_is_yuv = 1;
		break;

	case RDMA_INPUT_FORMAT_RGB565:
	case RDMA_INPUT_FORMAT_RGB888:
	case RDMA_INPUT_FORMAT_ARGB:
		input_is_yuv = 0;
		break;

	default:
		DISP_ERR("DDP error, unknow input format is %d\n", inputFormat);
		ASSERT(0);
	}

	if (outputFormat == RDMA_OUTPUT_FORMAT_ARGB)
		output_is_yuv = 0;
	else
		output_is_yuv = 1;

	if (input_is_yuv == 1 && output_is_yuv == 0) {
		DISP_REG_SET_FIELD(SIZE_CON_0_FLD_MATRIX_ENABLE,
				   idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_SIZE_CON_0, 1);
		DISP_REG_SET_FIELD(SIZE_CON_0_FLD_MATRIX_INT_MTX_SEL,
				   idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_SIZE_CON_0, 0x6);
		/* set color conversion matrix */
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_00,
			     coef_rdma_601_y2r[0][0]);
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_01,
			     coef_rdma_601_y2r[0][1]);
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_02,
			     coef_rdma_601_y2r[0][2]);
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_10,
			     coef_rdma_601_y2r[1][0]);
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_11,
			     coef_rdma_601_y2r[1][1]);
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_12,
			     coef_rdma_601_y2r[1][2]);
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_20,
			     coef_rdma_601_y2r[2][0]);
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_21,
			     coef_rdma_601_y2r[2][1]);
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_22,
			     coef_rdma_601_y2r[2][2]);

		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_PRE_ADD0,
			     coef_rdma_601_y2r[3][0]);
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_PRE_ADD1,
			     coef_rdma_601_y2r[3][1]);
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_PRE_ADD2,
			     coef_rdma_601_y2r[3][2]);
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_POST_ADD0,
			     coef_rdma_601_y2r[4][0]);
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_POST_ADD1,
			     coef_rdma_601_y2r[4][1]);
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_POST_ADD2,
			     coef_rdma_601_y2r[4][2]);
	} else if (input_is_yuv == 0 && output_is_yuv == 1) {
		DISP_REG_SET_FIELD(SIZE_CON_0_FLD_MATRIX_ENABLE,
				   idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_SIZE_CON_0, 1);
		DISP_REG_SET_FIELD(SIZE_CON_0_FLD_MATRIX_INT_MTX_SEL,
				   idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_SIZE_CON_0, 0x2);
		/* set color conversion matrix */
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_00,
			     coef_rdma_601_r2y[0][0]);
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_01,
			     coef_rdma_601_r2y[0][1]);
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_02,
			     coef_rdma_601_r2y[0][2]);
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_10,
			     coef_rdma_601_r2y[1][0]);
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_11,
			     coef_rdma_601_r2y[1][1]);
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_12,
			     coef_rdma_601_r2y[1][2]);
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_20,
			     coef_rdma_601_r2y[2][0]);
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_21,
			     coef_rdma_601_r2y[2][1]);
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_22,
			     coef_rdma_601_r2y[2][2]);

		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_PRE_ADD0,
			     coef_rdma_601_r2y[3][0]);
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_PRE_ADD1,
			     coef_rdma_601_r2y[3][1]);
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_PRE_ADD2,
			     coef_rdma_601_r2y[3][2]);
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_POST_ADD0,
			     coef_rdma_601_r2y[4][0]);
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_POST_ADD1,
			     coef_rdma_601_r2y[4][1]);
		DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_POST_ADD2,
			     coef_rdma_601_r2y[4][2]);
	} else {
		DISP_REG_SET_FIELD(SIZE_CON_0_FLD_MATRIX_ENABLE,
				   idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_SIZE_CON_0, 0);
		DISP_REG_SET_FIELD(SIZE_CON_0_FLD_MATRIX_INT_MTX_SEL,
				   idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_SIZE_CON_0, 0);
	}

	DISP_REG_SET_FIELD(GLOBAL_CON_FLD_MODE_SEL,
			   idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_GLOBAL_CON, mode);
	DISP_REG_SET_FIELD(MEM_CON_FLD_MEM_MODE_INPUT_FORMAT,
			   idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_MEM_CON, inputFormat);

	DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_MEM_START_ADDR, address);
	DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_MEM_SRC_PITCH, pitch);
	DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_INT_ENABLE, 0x3F);

	DISP_REG_SET_FIELD(SIZE_CON_0_FLD_INPUT_BYTE_SWAP,
			   idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_SIZE_CON_0, isByteSwap);
	DISP_REG_SET_FIELD(SIZE_CON_0_FLD_OUTPUT_FORMAT,
			   idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_SIZE_CON_0, outputFormat);
	DISP_REG_SET_FIELD(SIZE_CON_0_FLD_OUTPUT_FRAME_WIDTH,
			   idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_SIZE_CON_0, width);
	DISP_REG_SET_FIELD(SIZE_CON_0_FLD_OUTPUT_RGB_SWAP,
			   idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_SIZE_CON_0, isRGBSwap
			   || rgb_swap);
	DISP_REG_SET_FIELD(SIZE_CON_1_FLD_OUTPUT_FRAME_HEIGHT,
			   idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_SIZE_CON_1, height);


	/* RDMA fifo config */
	DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_FIFO_CON,
		     (1 << 31) | (fifo_pseudo_length << 16) | fifo_threashold);
	/* disp_rdma ultra high setting */
	DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_MEM_GMC_SETTING_0,
		     (pre_ultra_high_ofs << 24) | (ultra_high_ofs << 16) | (pre_ultra_low_ofs << 8)
		     | ultra_low_level);

	return 0;
}
示例#3
0
// ---------------------------------------------------------------------------
//  DBI Display Driver Public Functions
// ---------------------------------------------------------------------------
static DISP_STATUS dsi_config_ddp(UINT32 fbPA)
{
	struct disp_path_config_struct config = {0};
	if (DISP_IsDecoupleMode()) {
		config.srcModule = DISP_MODULE_RDMA;
	} else {
		config.srcModule = DISP_MODULE_OVL;
	}

	config.bgROI.x = 0;
	config.bgROI.y = 0;
	config.bgROI.width = lcm_params->width;
	config.bgROI.height = lcm_params->height;
	config.bgColor = 0x0;	// background color

	config.pitch = lcm_params->width*2;
	config.srcROI.x = 0;config.srcROI.y = 0;
	config.srcROI.height= lcm_params->height;
	config.srcROI.width= lcm_params->width;
	config.ovl_config.source = OVL_LAYER_SOURCE_MEM; 
	
	if(lcm_params->dsi.mode != CMD_MODE)
	{
		config.ovl_config.layer = DDP_OVL_LAYER_MUN-1;
		config.ovl_config.layer_en = 0;
		//disp_path_get_mutex();
		disp_path_config_layer(&config.ovl_config);
		//disp_path_release_mutex();
		//disp_path_wait_reg_update();
	}
#if 1
		// Disable LK UI layer (Layer2)
	{
		config.ovl_config.layer = DDP_OVL_LAYER_MUN-1-1;
		config.ovl_config.layer_en = 0; // disable LK UI layer anyway
		//disp_path_get_mutex();
		disp_path_config_layer(&config.ovl_config);
		//disp_path_release_mutex();
		//disp_path_wait_reg_update();
	}
#endif
		config.ovl_config.layer = DDP_OVL_LAYER_MUN-1;
		config.ovl_config.layer_en = 1; 
		config.ovl_config.fmt = eRGB565;
		config.ovl_config.addr = fbPA;	
		config.ovl_config.source = OVL_LAYER_SOURCE_MEM; 
		config.ovl_config.src_x = 0;
		config.ovl_config.src_y = 0;
		config.ovl_config.dst_x = 0;	   // ROI
		config.ovl_config.dst_y = 0;
		config.ovl_config.dst_w = lcm_params->width;
		config.ovl_config.dst_h = lcm_params->height;
		config.ovl_config.src_pitch = ALIGN_TO(lcm_params->width, MTK_FB_ALIGNMENT)*2; //pixel number
		config.ovl_config.keyEn = 0;
		config.ovl_config.key = 0xFF;	   // color key
		config.ovl_config.aen = 0;			  // alpha enable
		config.ovl_config.alpha = 0;	

		/*LCD_LayerSetAddress(DDP_OVL_LAYER_MUN-1, fbPA);
		LCD_LayerSetFormat(DDP_OVL_LAYER_MUN-1, LCD_LAYER_FORMAT_RGB565);
		LCD_LayerSetOffset(DDP_OVL_LAYER_MUN-1, 0, 0);
		LCD_LayerSetSize(DDP_OVL_LAYER_MUN-1,lcm_params->width,lcm_params->height);
		LCD_LayerSetPitch(DDP_OVL_LAYER_MUN-1, ALIGN_TO(lcm_params->width, MTK_FB_ALIGNMENT) * 2);
		LCD_LayerEnable(DDP_OVL_LAYER_MUN-1, TRUE); */
		LCD_LayerSetAddress(FB_LAYER, fbPA);
		LCD_LayerSetFormat(FB_LAYER, eRGB565);
		LCD_LayerSetOffset(FB_LAYER, 0, 0);
		LCD_LayerSetSize(FB_LAYER,lcm_params->width,lcm_params->height);
		LCD_LayerSetPitch(FB_LAYER, ALIGN_TO(lcm_params->width, MTK_FB_ALIGNMENT) * 2);
		LCD_LayerEnable(FB_LAYER, TRUE);

		if(lcm_params->dsi.mode == CMD_MODE)
			config.dstModule = DISP_MODULE_DSI_CMD;// DISP_MODULE_WDMA1
		else
			config.dstModule = DISP_MODULE_DSI_VDO;// DISP_MODULE_WDMA1
		config.outFormat = RDMA_OUTPUT_FORMAT_ARGB; 
		disp_path_config(&config);
		
	if(lcm_params->dsi.mode != CMD_MODE)
	{
		//DSI_Wait_VDO_Idle();
		disp_path_get_mutex();
	}

	// Config FB_Layer port to be physical.
	{
		M4U_PORT_STRUCT portStruct;

		portStruct.ePortID = DISP_OVL_0;		   //hardware port ID, defined in M4U_PORT_ID_ENUM
		portStruct.Virtuality = 1;
		portStruct.Security = 0;
		portStruct.domain = 3;			  //domain : 0 1 2 3
		portStruct.Distance = 1;
		portStruct.Direction = 0;
		m4u_config_port(&portStruct);
	}

	if(lcm_params->dsi.mode != CMD_MODE)
	{
		disp_path_release_mutex();
		//if(1 == lcm_params->dsi.ufoe_enable)
		//	UFOE_Start();
		//DSI_Start();
	}
	printk("%s, config done\n", __func__);
	return DISP_STATUS_OK;
}
// ---------------------------------------------------------------------------
//  DBI Display Driver Public Functions
// ---------------------------------------------------------------------------
static DISP_STATUS dsi_config_ddp(UINT32 fbPA)
{
    unsigned long irq_mask;
    struct disp_path_config_struct config = {0};

    if (DISP_IsDecoupleMode()) 
    {
        config.srcModule = DISP_MODULE_RDMA0;
    } 
    else 
    {
        config.srcModule = DISP_MODULE_OVL;
    }
    
    config.bgROI.x = 0;
    config.bgROI.y = 0;
    config.bgROI.width = lcm_params->width;
    config.bgROI.height = lcm_params->height;
    config.bgColor = 0x0;	// background color
    
    config.pitch = lcm_params->width*2;
    config.srcROI.x = 0;config.srcROI.y = 0;
    config.srcROI.height= lcm_params->height;
    config.srcROI.width= lcm_params->width;
    config.ovl_config.source = OVL_LAYER_SOURCE_MEM; 
    
    config.ovl_config.layer = DDP_OVL_LAYER_MUN-1;
    config.ovl_config.layer_en = 1; 
    config.ovl_config.fmt = eRGB565;
    config.ovl_config.addr = fbPA;	
    config.ovl_config.source = OVL_LAYER_SOURCE_MEM; 
    config.ovl_config.src_x = 0;
    config.ovl_config.src_y = 0;
    config.ovl_config.dst_x = 0;	   // ROI
    config.ovl_config.dst_y = 0;
    config.ovl_config.dst_w = lcm_params->width;
    config.ovl_config.dst_h = lcm_params->height;
    config.ovl_config.src_pitch = ALIGN_TO(lcm_params->width, MTK_FB_ALIGNMENT)*2; //pixel number
    config.ovl_config.keyEn = 0;
    config.ovl_config.key = 0xFF;	   // color key
    config.ovl_config.aen = 0;			  // alpha enable
    config.ovl_config.alpha = 0;	
    
    LCD_LayerSetAddress(DDP_OVL_LAYER_MUN-1, fbPA);
    LCD_LayerSetFormat(DDP_OVL_LAYER_MUN-1, LCD_LAYER_FORMAT_RGB565);
    LCD_LayerSetOffset(DDP_OVL_LAYER_MUN-1, 0, 0);
    LCD_LayerSetSize(DDP_OVL_LAYER_MUN-1,lcm_params->width,lcm_params->height);
    LCD_LayerSetPitch(DDP_OVL_LAYER_MUN-1, ALIGN_TO(lcm_params->width, MTK_FB_ALIGNMENT) * 2);
    LCD_LayerEnable(DDP_OVL_LAYER_MUN-1, TRUE); 
    
    if(lcm_params->dsi.mode == CMD_MODE)
    {
        config.dstModule = DISP_MODULE_DSI_CMD;// DISP_MODULE_WDMA1
    }
    else
    {
        config.dstModule = DISP_MODULE_DSI_VDO;// DISP_MODULE_WDMA1
    }
    config.outFormat = RDMA_OUTPUT_FORMAT_ARGB; 
    
    if(lcm_params->dsi.mode != CMD_MODE)
    {
        DSI_Wait_VDO_Idle();
        local_irq_save(irq_mask);
        disp_path_get_mutex();
    }
    
    disp_path_config(&config);

    // Config FB_Layer port to be physical.
    {
        M4U_PORT_STRUCT portStruct;
        
        portStruct.ePortID = M4U_PORT_LCD_OVL;		   //hardware port ID, defined in M4U_PORT_ID_ENUM
        portStruct.Virtuality = 1;
        portStruct.Security = 0;
        portStruct.domain = 3;			  //domain : 0 1 2 3
        portStruct.Distance = 1;
        portStruct.Direction = 0;
        m4u_config_port(&portStruct);
    }
    // hook m4u debug callback function
    m4u_set_tf_callback(M4U_CLNTMOD_DISP, &disp_m4u_dump_reg);
    
    if(lcm_params->dsi.mode != CMD_MODE)
    {
        disp_path_release_mutex();
        DSI_Start();
        local_irq_restore(irq_mask);
    }
    printk("%s, config done\n", __func__);

    return DISP_STATUS_OK;
}
static DISP_STATUS dpi_init(UINT32 fbVA, UINT32 fbPA, BOOL isLcmInited)
{
	if (!disp_drv_dpi_init_context())
		return DISP_STATUS_NOT_IMPLEMENTED;
#ifndef MT65XX_NEW_DISP
	init_intermediate_buffers(fbPA);
#else
	{
		struct disp_path_config_struct config = { 0 };

		if (DISP_IsDecoupleMode())
			config.srcModule = DISP_MODULE_RDMA;
		else
			config.srcModule = DISP_MODULE_OVL;

		config.bgROI.x = 0;
		config.bgROI.y = 0;
		config.bgROI.width = DISP_GetScreenWidth();
		config.bgROI.height = DISP_GetScreenHeight();
		config.bgColor = 0x0;	/* background color */

		config.srcROI.x = 0;
		config.srcROI.y = 0;
		config.srcROI.height = DISP_GetScreenHeight();
		config.srcROI.width = DISP_GetScreenWidth();
		config.ovl_config.source = OVL_LAYER_SOURCE_MEM;
#if 0
		/* Disable all layers. */
		/* First disable FB_Layer. */
		disp_path_get_mutex();
		config.ovl_config.layer = 0;
		config.ovl_config.layer_en = 0;
		disp_path_config_layer(&config.ovl_config);
		config.ovl_config.layer = 1;
		disp_path_config_layer(&config.ovl_config);
		config.ovl_config.layer = 2;
		disp_path_config_layer(&config.ovl_config);
		config.ovl_config.layer = 3;
		disp_path_config_layer(&config.ovl_config);
		disp_path_release_mutex();
		disp_path_wait_reg_update();
#endif
		/* Config FB_Layer port to be virtual. */
		{
			M4U_PORT_STRUCT portStruct;
			portStruct.ePortID = DISP_OVL_0;	/* hardware port ID, defined in M4U_PORT_ID_ENUM */
			portStruct.Virtuality = 1;
			portStruct.Security = 0;
			portStruct.domain = 3;	/* domain : 0 1 2 3 */
			portStruct.Distance = 1;
			portStruct.Direction = 0;
			m4u_config_port(&portStruct);
		}
		/* Reconfig FB_Layer and enable it. */

		config.ovl_config.layer = FB_LAYER;
		config.ovl_config.layer_en = 1;
		config.ovl_config.fmt = eRGB565;
		config.ovl_config.addr = fbPA;
		config.ovl_config.source = OVL_LAYER_SOURCE_MEM;
		config.ovl_config.src_x = 0;
		config.ovl_config.src_y = 0;
		config.ovl_config.dst_x = 0;	/* ROI */
		config.ovl_config.dst_y = 0;
		config.ovl_config.dst_w = DISP_GetScreenWidth();
		config.ovl_config.dst_h = DISP_GetScreenHeight();
		config.ovl_config.src_pitch = ALIGN_TO(DISP_GetScreenWidth(), 32) * 2;
		config.ovl_config.keyEn = 0;
		config.ovl_config.key = 0xFF;	/* color key */
		config.ovl_config.aen = 0;	/* alpha enable */
		config.ovl_config.alpha = 0;
		LCD_LayerSetAddress(FB_LAYER, fbPA);
		LCD_LayerSetFormat(FB_LAYER, LCD_LAYER_FORMAT_RGB565);
		LCD_LayerSetOffset(FB_LAYER, 0, 0);
		LCD_LayerSetSize(FB_LAYER, DISP_GetScreenWidth(), DISP_GetScreenHeight());
		LCD_LayerSetPitch(FB_LAYER, ALIGN_TO(DISP_GetScreenWidth(), 32) * 2);
		LCD_LayerEnable(FB_LAYER, TRUE);

		config.dstModule = DISP_MODULE_DPI0;	/* DISP_MODULE_WDMA1 */
		config.outFormat = RDMA_OUTPUT_FORMAT_ARGB;
		disp_path_get_mutex();
		disp_path_config(&config);
		disp_path_release_mutex();

	}
#endif
	init_mipi_pll();
	init_io_pad();
	init_io_driving_current();

	init_lcd();
	init_dpi(isLcmInited);

	if (NULL != lcm_drv->init && !isLcmInited)
		lcm_drv->init();

	DSI_PowerOn();
	DSI_PowerOff();
	UFOE_PowerOn();
	UFOE_PowerOff();
#ifdef SPM_SODI_ENABLED
	spm_sodi_lcm_video_mode(TRUE);
#endif
	return DISP_STATUS_OK;
}
DAL_STATUS DAL_Printf(const char *fmt, ...)
{
    va_list args;
    uint i;
    DAL_STATUS ret = DAL_STATUS_OK;
    printk("%s", __func__);
    //printk("[MTKFB_DAL] DAL_Printf mfc_handle=0x%08X, fmt=0x%08X\n", mfc_handle, fmt);
    if (NULL == mfc_handle) 
        return DAL_STATUS_NOT_READY;
    
    if (NULL == fmt)
        return DAL_STATUS_INVALID_ARGUMENT;
    
    DAL_LOCK();
	mutex_lock(&OverlaySettingMutex);
     if(isAEEEnabled==0)
    {
        printk("[DDP] isAEEEnabled from 0 to 1, ASSERT_LAYER=%d, dal_fb_pa %x\n", 
            ASSERT_LAYER, dal_fb_pa);
            
        isAEEEnabled = 1;
        DAL_Dynamic_Change_FB_Layer(isAEEEnabled); // default_ui_ layer coniig to changed_ui_layer
        
        DAL_CHECK_MFC_RET(MFC_Open_Ex(&mfc_handle, dal_fb_addr,
                               DAL_WIDTH, DAL_HEIGHT,DAL_PITCH, DAL_BPP,
                               DAL_FG_COLOR, DAL_BG_COLOR));
        //DAL_Clean();  
              
        cached_layer_config[ASSERT_LAYER].addr = dal_fb_pa;
        cached_layer_config[ASSERT_LAYER].alpha = 0x80;
        cached_layer_config[ASSERT_LAYER].aen = TRUE;
        cached_layer_config[ASSERT_LAYER].src_pitch = DAL_PITCH * DAL_BPP;
		cached_layer_config[ASSERT_LAYER].fmt= DAL_FORMAT;
		cached_layer_config[ASSERT_LAYER].src_x = 0;
		cached_layer_config[ASSERT_LAYER].src_y = 0;
		cached_layer_config[ASSERT_LAYER].src_w = DAL_WIDTH;
		cached_layer_config[ASSERT_LAYER].src_h = DAL_HEIGHT;
		cached_layer_config[ASSERT_LAYER].dst_x = 0;
		cached_layer_config[ASSERT_LAYER].dst_y = 0;
		cached_layer_config[ASSERT_LAYER].dst_w = DAL_WIDTH;
		cached_layer_config[ASSERT_LAYER].dst_h = DAL_HEIGHT;
        cached_layer_config[ASSERT_LAYER].layer_en= TRUE;
        cached_layer_config[ASSERT_LAYER].isDirty = true;
		atomic_set(&OverlaySettingDirtyFlag, 1);
        atomic_set(&OverlaySettingApplied, 0);
    }
	mutex_unlock(&OverlaySettingMutex);
    va_start (args, fmt);
    i = vsprintf(dal_print_buffer, fmt, args);
    BUG_ON(i>=ARRAY_SIZE(dal_print_buffer));
    va_end (args);
    DAL_CHECK_MFC_RET(MFC_Print(mfc_handle, dal_print_buffer));

    flush_cache_all();
/*
    if (LCD_STATE_POWER_OFF == LCD_GetState()) {
        ret = DAL_STATUS_LCD_IN_SUSPEND;
        dal_enable_when_resume = TRUE;
        goto End;
    }
    */
    if (down_interruptible(&sem_early_suspend)) {
        DISP_LOG_PRINT(ANDROID_LOG_INFO, "DAL", "can't get semaphore in DAL_Printf()\n");
        goto End;
    }

#if 0
    if(is_early_suspended){
        up(&sem_early_suspend);
        DISP_LOG_PRINT(ANDROID_LOG_INFO, "DAL", "DAL_Printf in power off\n");
        goto End;
    }
#endif
    up(&sem_early_suspend);

    mutex_lock(&OverlaySettingMutex);

    if (!dal_shown) {
        dal_shown = TRUE;
    }

    //DAL enable, switch ui layer from default 3 to 2
   
    atomic_set(&OverlaySettingDirtyFlag, 1);
    atomic_set(&OverlaySettingApplied, 0);
    mutex_unlock(&OverlaySettingMutex);
    if (DISP_IsDecoupleMode()) {
    	DISP_StartOverlayTransfer();
    }
    DAL_CHECK_DISP_RET(DISP_UpdateScreen(0, 0, 
                                         DAL_WIDTH,
                                         DAL_HEIGHT));
End:
    DAL_UNLOCK();

    return ret;
}
DAL_STATUS DAL_Clean(void)
{
    const UINT32 BG_COLOR = MAKE_TWO_RGB565_COLOR(DAL_BG_COLOR, DAL_BG_COLOR);
    DAL_STATUS ret = DAL_STATUS_OK;

    static int dal_clean_cnt = 0;
    
    printk("[MTKFB_DAL] DAL_Clean\n");
    if (NULL == mfc_handle) 
        return DAL_STATUS_NOT_READY;

//    if (LCD_STATE_POWER_OFF == LCD_GetState())
//        return DAL_STATUS_LCD_IN_SUSPEND;

    DAL_LOCK();

    DAL_CHECK_MFC_RET(MFC_ResetCursor(mfc_handle));

    MFC_CONTEXT *ctxt = (MFC_CONTEXT *)mfc_handle;
    ctxt->screen_color=0;
    DAL_SetScreenColor(DAL_COLOR_RED);
 
/*
    if (LCD_STATE_POWER_OFF == LCD_GetState()) {
	    DISP_LOG_PRINT(ANDROID_LOG_INFO, "DAL", "dal_clean in power off\n");
        dal_disable_when_resume = TRUE;
        ret = DAL_STATUS_LCD_IN_SUSPEND;
        goto End;
    }
    */
    if (down_interruptible(&sem_early_suspend)) {
        DISP_LOG_PRINT(ANDROID_LOG_INFO, "DAL", "can't get semaphore in DAL_Clean()\n");
        goto End;
    }
    //xuecheng, for debug
#if 0
    if(is_early_suspended){
        up(&sem_early_suspend);
        DISP_LOG_PRINT(ANDROID_LOG_INFO, "DAL", "dal_clean in power off\n");
        goto End;
    }
#endif
    up(&sem_early_suspend);

    mutex_lock(&OverlaySettingMutex);

    //TODO: if dal_shown=false, and 3D enabled, mtkfb may disable UI layer, please modify 3D driver
    if(isAEEEnabled==1)
    {
        cached_layer_config[ASSERT_LAYER].layer_en= FALSE;
        cached_layer_config[ASSERT_LAYER].isDirty = true;
        
        // DAL disable, switch UI layer to default layer 3
        printk("[DDP]* isAEEEnabled from 1 to 0, %d \n", dal_clean_cnt++);
        isAEEEnabled = 0;
        DAL_Dynamic_Change_FB_Layer(isAEEEnabled);  // restore UI layer to DEFAULT_UI_LAYER
    }
    
    dal_shown = FALSE;
#ifdef DAL_LOWMEMORY_ASSERT
   	if (dal_lowMemory_shown) {//only need show lowmemory assert
		UINT32 LOWMEMORY_FG_COLOR = MAKE_TWO_RGB565_COLOR(DAL_LOWMEMORY_FG_COLOR, DAL_LOWMEMORY_FG_COLOR);
        UINT32 LOWMEMORY_BG_COLOR = MAKE_TWO_RGB565_COLOR(DAL_LOWMEMORY_BG_COLOR, DAL_LOWMEMORY_BG_COLOR);
        
        DAL_CHECK_MFC_RET(MFC_LowMemory_Printf(mfc_handle, low_memory_msg, LOWMEMORY_FG_COLOR, LOWMEMORY_BG_COLOR));
        Show_LowMemory();
    }
    dal_enable_when_resume_lowmemory = FALSE;
    dal_disable_when_resume_lowmemory = FALSE;
#endif
    dal_disable_when_resume = FALSE;
    atomic_set(&OverlaySettingDirtyFlag, 1);
    atomic_set(&OverlaySettingApplied, 0);
    mutex_unlock(&OverlaySettingMutex);
    if (DISP_IsDecoupleMode()) {
    	DISP_StartOverlayTransfer();
    }
    DAL_CHECK_DISP_RET(DISP_UpdateScreen(0, 0, 
                                         DAL_WIDTH,
                                         DAL_HEIGHT));
                                         

End:
    DAL_UNLOCK();
    return ret;
}