static int k3_dss_offline_one_layer_config(struct k3_fb_data_type *k3fd,
	dss_layer_t *layer, dss_rect_t *wb_block_rect)
{
	int ret = 0;
	bool rdma_stretch_enable = false;
	dss_rect_ltrb_t clip_rect;
	dss_rect_t aligned_rect;
	dss_overlay_t *pov_req = NULL;
	int scf_idx = 0;

	BUG_ON(k3fd == NULL);
	pov_req = &(k3fd->ov_req);
	BUG_ON(pov_req == NULL);

	ret = k3_dss_check_layer_par(k3fd, layer);
	if (ret != 0) {
		K3_FB_ERR("k3_dss_check_layer_par failed! ret = %d\n", ret);
		return ret;
	}

	if (layer->need_cap & (CAP_BASE | CAP_DIM)) {
		ret = k3_dss_ovl_layer_config(k3fd, layer, wb_block_rect);
		if (ret != 0) {
			K3_FB_ERR("k3_dss_ovl_config failed! need_cap=0x%x, ret=%d\n",
				layer->need_cap, ret);
			return ret;
		}

		return ret;
	}

	ret = k3_dss_rdma_config(k3fd, pov_req, layer, &clip_rect, &aligned_rect, &rdma_stretch_enable);
	if (ret != 0) {
		K3_FB_ERR("k3_dss_rdma_config failed! ret = %d\n", ret);
		return ret;
	}

	if (layer->src.mmu_enable) {
		ret = k3_dss_mmu_config(k3fd, pov_req, layer, NULL, rdma_stretch_enable);
		if (ret != 0) {
			K3_FB_ERR("k3_dss_mmu_config failed! ret = %d\n", ret);
			return ret;
		}
	}

	ret = k3_dss_rdfc_config(k3fd, layer, &aligned_rect, clip_rect);
	if (ret != 0) {
		K3_FB_ERR("k3_dss_rdfc_config failed! ret = %d\n", ret);
		return ret;
	}

	scf_idx = k3_get_scf_index(layer->chn_idx);
	if(scf_idx >= 0)
		k3fd->dss_module.scf_used[scf_idx] = 1;

	ret = k3_dss_scf_config(k3fd, layer, NULL, &aligned_rect, rdma_stretch_enable);
	if (ret != 0) {
		K3_FB_ERR("k3_dss_scf_config failed! ret = %d\n", ret);
		return ret;
	}

	ret = k3_dss_scp_config(k3fd, layer, false);
	if (ret != 0) {
		K3_FB_ERR("k3_dss_scp_config failed! ret = %d\n", ret);
		return ret;
	}

	k3fd->dss_module.csc_used[layer->chn_idx] = 1;
	if(k3fd->ov_req.wb_layer_info.chn_idx == WBE1_CHN0
		&& isYUV(k3fd->ov_req.wb_layer_info.dst.format)
		&& k3fd->ov_req.wb_enable){

		if(!isYUV(layer->src.format)){
			k3fd->dss_module.csc_used[k3fd->ov_req.wb_layer_info.chn_idx] = 1;
			ret = k3_dss_csc_config(k3fd, NULL, &k3fd->ov_req.wb_layer_info);
			if (ret != 0) {
				K3_FB_ERR("k3_dss_csc_config failed! ret = %d\n", ret);
				return ret;
			}
		}
	}else{

		ret = k3_dss_csc_config(k3fd, layer, NULL);
		if (ret != 0) {
			K3_FB_ERR("k3_dss_csc_config failed! ret = %d\n", ret);
			return ret;
		}
	}

	ret = k3_dss_mux_config(k3fd, pov_req,layer);
	if (ret != 0) {
		K3_FB_ERR("k3_dss_mux_config failed, ret = %d\n", ret);
		return ret;
	}

	ret = k3_dss_ovl_layer_config(k3fd, layer, wb_block_rect);
	if (ret != 0) {
		K3_FB_ERR("k3_dss_ovl_config failed, ret = %d\n", ret);
		return ret;
	}

	return ret;
}
int hisi_dss_csc_config(struct hisi_fb_data_type *hisifd,
	dss_layer_t *layer, dss_wb_layer_t *wb_layer)
{
	dss_csc_t *csc = NULL;
	int chn_idx = 0;
	uint32_t format = 0;
	uint32_t csc_mode = 0;
	int (*csc_coe_yuv2rgb)[CSC_COL];
	int (*csc_coe_rgb2yuv)[CSC_COL];

	BUG_ON(hisifd == NULL);

	if (wb_layer) {
		chn_idx = wb_layer->chn_idx;
		format = wb_layer->dst.format;
		csc_mode = wb_layer->dst.csc_mode;
	} else {
		chn_idx = layer->chn_idx;
		format = layer->img.format;
		csc_mode = layer->img.csc_mode;
	}

	if (!isYUV(format))
		return 0;

	if (csc_mode == DSS_CSC_601_WIDE) {
		csc_coe_yuv2rgb = CSC_COE_YUV2RGB601_WIDE;
		csc_coe_rgb2yuv = CSC_COE_RGB2YUV601_WIDE;
	} else if (csc_mode == DSS_CSC_601_NARROW) {
		csc_coe_yuv2rgb = CSC_COE_YUV2RGB601_NARROW;
		csc_coe_rgb2yuv = CSC_COE_RGB2YUV601_NARROW;
	} else if (csc_mode == DSS_CSC_709_WIDE) {
		csc_coe_yuv2rgb = CSC_COE_YUV2RGB709_WIDE;
		csc_coe_rgb2yuv = CSC_COE_RGB2YUV709_WIDE;
	} else if (csc_mode == DSS_CSC_709_NARROW) {
		csc_coe_yuv2rgb = CSC_COE_YUV2RGB709_NARROW;
		csc_coe_rgb2yuv = CSC_COE_RGB2YUV709_NARROW;
	} else {
		HISI_FB_ERR("not support this csc_mode(%d)!\n", csc_mode);
		csc_coe_yuv2rgb = CSC_COE_YUV2RGB601_WIDE;
		csc_coe_rgb2yuv = CSC_COE_RGB2YUV601_WIDE;
	}

	csc = &(hisifd->dss_module.csc[chn_idx]);
	hisifd->dss_module.csc_used[chn_idx] = 1;

	if (layer) {
		csc->idc = set_bits32(csc->idc, 0x1, 1, 27);
		csc->idc = set_bits32(csc->idc,
			(csc_coe_yuv2rgb[2][3] |
			(csc_coe_yuv2rgb[1][3] << 9) |
			(csc_coe_yuv2rgb[0][3] << 18)), 27, 0);

		csc->odc = set_bits32(csc->odc,
			(csc_coe_yuv2rgb[2][4] |
			(csc_coe_yuv2rgb[1][4] << 9) |
			(csc_coe_yuv2rgb[0][4] << 18)), 27, 0);

		csc->p0 = set_bits32(csc->p0, csc_coe_yuv2rgb[0][0], 11, 0);
		csc->p0 = set_bits32(csc->p0, csc_coe_yuv2rgb[0][1], 11, 16);

		csc->p1 = set_bits32(csc->p1, csc_coe_yuv2rgb[0][2], 11, 0);
		csc->p1 = set_bits32(csc->p1, csc_coe_yuv2rgb[1][0], 11, 16);

		csc->p2 = set_bits32(csc->p2, csc_coe_yuv2rgb[1][1], 11, 0);
		csc->p2 = set_bits32(csc->p2, csc_coe_yuv2rgb[1][2], 11, 16);

		csc->p3 = set_bits32(csc->p3, csc_coe_yuv2rgb[2][0], 11, 0);
		csc->p3 = set_bits32(csc->p3, csc_coe_yuv2rgb[2][1], 11, 16);

		csc->p4 = set_bits32(csc->p4, csc_coe_yuv2rgb[2][2], 11, 0);
	}

	if (wb_layer) {
		csc->idc = set_bits32(csc->idc, 0x1, 1, 27);
		csc->idc = set_bits32(csc->idc,
			(csc_coe_rgb2yuv[2][3] |
			(csc_coe_rgb2yuv[1][3] << 9) |
			(csc_coe_rgb2yuv[0][3] << 18)), 27, 0);

		csc->odc = set_bits32(csc->odc,
			(csc_coe_rgb2yuv[2][4] |
			(csc_coe_rgb2yuv[1][4] << 9) |
			(csc_coe_rgb2yuv[0][4] << 18)), 27, 0);

		csc->p0 = set_bits32(csc->p0, csc_coe_rgb2yuv[0][0], 11, 0);
		csc->p0 = set_bits32(csc->p0, csc_coe_rgb2yuv[0][1], 11, 16);

		csc->p1 = set_bits32(csc->p1, csc_coe_rgb2yuv[0][2], 11, 0);
		csc->p1 = set_bits32(csc->p1, csc_coe_rgb2yuv[1][0], 11, 16);

		csc->p2 = set_bits32(csc->p2, csc_coe_rgb2yuv[1][1], 11, 0);
		csc->p2 = set_bits32(csc->p2, csc_coe_rgb2yuv[1][2], 11, 16);

		csc->p3 = set_bits32(csc->p3, csc_coe_rgb2yuv[2][0], 11, 0);
		csc->p3 = set_bits32(csc->p3, csc_coe_rgb2yuv[2][1], 11, 16);

		csc->p4 = set_bits32(csc->p4, csc_coe_rgb2yuv[2][2], 27, 0);
	}

	csc->icg_module = set_bits32(csc->icg_module, 0x1, 1, 0);

	return 0;
}