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; }