From: Huang Jiachai Date: Thu, 31 Mar 2016 03:36:04 +0000 (+0800) Subject: video: rockchip: vop: 3399: add win2 and win3 when get dsp_info X-Git-Tag: firefly_0821_release~2892 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=52649986e842a1453570673a1a1d29df7752bbb9;p=firefly-linux-kernel-4.4.55.git video: rockchip: vop: 3399: add win2 and win3 when get dsp_info Change-Id: Ib1ae76de66656b0531683eede117346945587008 Signed-off-by: Huang Jiachai --- diff --git a/drivers/video/rockchip/lcdc/rk322x_lcdc.c b/drivers/video/rockchip/lcdc/rk322x_lcdc.c index 51454e00ef91..10b926bce011 100644 --- a/drivers/video/rockchip/lcdc/rk322x_lcdc.c +++ b/drivers/video/rockchip/lcdc/rk322x_lcdc.c @@ -3522,6 +3522,17 @@ static char *vop_format_to_string(int format, char *fmt) break; case 6: strcpy(fmt, "YCbCr444"); + case 8: + strcpy(fmt, "YUYV422"); + break; + case 9: + strcpy(fmt, "YUYV420"); + break; + case 10: + strcpy(fmt, "UYVY422"); + break; + case 11: + strcpy(fmt, "UYVY420"); break; default: strcpy(fmt, "invalid\n"); @@ -3545,11 +3556,21 @@ static ssize_t vop_get_disp_info(struct rk_lcdc_driver *dev_drv, u32 fmt_id; char format_w0[9] = "NULL"; char format_w1[9] = "NULL"; + char format_w2_0[9] = "NULL"; + char format_w2_1[9] = "NULL"; + char format_w2_2[9] = "NULL"; + char format_w2_3[9] = "NULL"; + char format_w3_0[9] = "NULL"; + char format_w3_1[9] = "NULL"; + char format_w3_2[9] = "NULL"; + char format_w3_3[9] = "NULL"; char dsp_buf[100]; u32 win_ctrl, zorder, vir_info, act_info, dsp_info, dsp_st; u32 y_factor, uv_factor; - u8 layer0_sel, layer1_sel; - u8 w0_state, w1_state; + u8 layer0_sel, layer1_sel, layer2_sel, layer3_sel; + u8 w0_state, w1_state, w2_state, w3_state; + u8 w2_0_state, w2_1_state, w2_2_state, w2_3_state; + u8 w3_0_state, w3_1_state, w3_2_state, w3_3_state; u32 w0_vir_y, w0_vir_uv, w0_act_x, w0_act_y, w0_dsp_x, w0_dsp_y; u32 w0_st_x = h_pw_bp, w0_st_y = v_pw_bp; @@ -3558,6 +3579,21 @@ static ssize_t vop_get_disp_info(struct rk_lcdc_driver *dev_drv, u32 w0_y_h_fac, w0_y_v_fac, w0_uv_h_fac, w0_uv_v_fac; u32 w1_y_h_fac, w1_y_v_fac, w1_uv_h_fac, w1_uv_v_fac; + u32 w2_0_vir_y, w2_1_vir_y, w2_2_vir_y, w2_3_vir_y; + u32 w2_0_dsp_x, w2_1_dsp_x, w2_2_dsp_x, w2_3_dsp_x; + u32 w2_0_dsp_y, w2_1_dsp_y, w2_2_dsp_y, w2_3_dsp_y; + u32 w2_0_st_x = h_pw_bp, w2_1_st_x = h_pw_bp; + u32 w2_2_st_x = h_pw_bp, w2_3_st_x = h_pw_bp; + u32 w2_0_st_y = v_pw_bp, w2_1_st_y = v_pw_bp; + u32 w2_2_st_y = v_pw_bp, w2_3_st_y = v_pw_bp; + + u32 w3_0_vir_y, w3_1_vir_y, w3_2_vir_y, w3_3_vir_y; + u32 w3_0_dsp_x, w3_1_dsp_x, w3_2_dsp_x, w3_3_dsp_x; + u32 w3_0_dsp_y, w3_1_dsp_y, w3_2_dsp_y, w3_3_dsp_y; + u32 w3_0_st_x = h_pw_bp, w3_1_st_x = h_pw_bp; + u32 w3_2_st_x = h_pw_bp, w3_3_st_x = h_pw_bp; + u32 w3_0_st_y = v_pw_bp, w3_1_st_y = v_pw_bp; + u32 w3_2_st_y = v_pw_bp, w3_3_st_y = v_pw_bp; u32 dclk_freq; int size = 0; @@ -3569,10 +3605,13 @@ static ssize_t vop_get_disp_info(struct rk_lcdc_driver *dev_drv, zorder = vop_readl(vop_dev, DSP_CTRL1); layer0_sel = (zorder & MASK(DSP_LAYER0_SEL)) >> 8; layer1_sel = (zorder & MASK(DSP_LAYER1_SEL)) >> 10; + layer2_sel = (zorder & MASK(DSP_LAYER2_SEL)) >> 12; + layer3_sel = (zorder & MASK(DSP_LAYER3_SEL)) >> 14; /* WIN0 */ win_ctrl = vop_readl(vop_dev, WIN0_CTRL0); w0_state = win_ctrl & MASK(WIN0_EN); fmt_id = (win_ctrl & MASK(WIN0_DATA_FMT)) >> 1; + fmt_id |= (win_ctrl & MASK(WIN0_YUYV)) >> 14; /* yuyv*/ vop_format_to_string(fmt_id, format_w0); vir_info = vop_readl(vop_dev, WIN0_VIR); act_info = vop_readl(vop_dev, WIN0_ACT_INFO); @@ -3599,6 +3638,7 @@ static ssize_t vop_get_disp_info(struct rk_lcdc_driver *dev_drv, win_ctrl = vop_readl(vop_dev, WIN1_CTRL0); w1_state = win_ctrl & MASK(WIN1_EN); fmt_id = (win_ctrl & MASK(WIN1_DATA_FMT)) >> 1; + fmt_id |= (win_ctrl & MASK(WIN1_YUYV)) >> 14; /* yuyv*/ vop_format_to_string(fmt_id, format_w1); vir_info = vop_readl(vop_dev, WIN1_VIR); act_info = vop_readl(vop_dev, WIN1_ACT_INFO); @@ -3620,14 +3660,126 @@ static ssize_t vop_get_disp_info(struct rk_lcdc_driver *dev_drv, w1_y_v_fac = (y_factor & MASK(WIN1_VS_FACTOR_YRGB)) >> 16; w1_uv_h_fac = uv_factor & MASK(WIN1_HS_FACTOR_CBR); w1_uv_v_fac = (uv_factor & MASK(WIN1_VS_FACTOR_CBR)) >> 16; + + /*WIN2 */ + win_ctrl = vop_readl(vop_dev, WIN2_CTRL0); + w2_state = win_ctrl & MASK(WIN2_EN); + w2_0_state = (win_ctrl & 0x10) >> 4; + w2_1_state = (win_ctrl & 0x100) >> 8; + w2_2_state = (win_ctrl & 0x1000) >> 12; + w2_3_state = (win_ctrl & 0x10000) >> 16; + vir_info = vop_readl(vop_dev, WIN2_VIR0_1); + w2_0_vir_y = vir_info & MASK(WIN2_VIR_STRIDE0); + w2_1_vir_y = (vir_info & MASK(WIN2_VIR_STRIDE1)) >> 16; + vir_info = vop_readl(vop_dev, WIN2_VIR2_3); + w2_2_vir_y = vir_info & MASK(WIN2_VIR_STRIDE2); + w2_3_vir_y = (vir_info & MASK(WIN2_VIR_STRIDE3)) >> 16; + + fmt_id = (win_ctrl & MASK(WIN2_DATA_FMT0)) >> 5; + vop_format_to_string(fmt_id, format_w2_0); + fmt_id = (win_ctrl & MASK(WIN2_DATA_FMT1)) >> 9; + vop_format_to_string(fmt_id, format_w2_1); + fmt_id = (win_ctrl & MASK(WIN2_DATA_FMT2)) >> 13; + vop_format_to_string(fmt_id, format_w2_2); + fmt_id = (win_ctrl & MASK(WIN2_DATA_FMT3)) >> 17; + vop_format_to_string(fmt_id, format_w2_3); + + dsp_info = vop_readl(vop_dev, WIN2_DSP_INFO0); + dsp_st = vop_readl(vop_dev, WIN2_DSP_ST0); + w2_0_dsp_x = (dsp_info & MASK(WIN2_DSP_WIDTH0)) + 1; + w2_0_dsp_y = ((dsp_info & MASK(WIN2_DSP_HEIGHT0)) >> 16) + 1; + if (w2_0_state) { + w2_0_st_x = dsp_st & MASK(WIN2_DSP_XST0); + w2_0_st_y = (dsp_st & MASK(WIN2_DSP_YST0)) >> 16; + } + dsp_info = vop_readl(vop_dev, WIN2_DSP_INFO1); + dsp_st = vop_readl(vop_dev, WIN2_DSP_ST1); + w2_1_dsp_x = (dsp_info & MASK(WIN2_DSP_WIDTH1)) + 1; + w2_1_dsp_y = ((dsp_info & MASK(WIN2_DSP_HEIGHT1)) >> 16) + 1; + if (w2_1_state) { + w2_1_st_x = dsp_st & MASK(WIN2_DSP_XST1); + w2_1_st_y = (dsp_st & MASK(WIN2_DSP_YST1)) >> 16; + } + dsp_info = vop_readl(vop_dev, WIN2_DSP_INFO2); + dsp_st = vop_readl(vop_dev, WIN2_DSP_ST2); + w2_2_dsp_x = (dsp_info & MASK(WIN2_DSP_WIDTH2)) + 1; + w2_2_dsp_y = ((dsp_info & MASK(WIN2_DSP_HEIGHT2)) >> 16) + 1; + if (w2_2_state) { + w2_2_st_x = dsp_st & MASK(WIN2_DSP_XST2); + w2_2_st_y = (dsp_st & MASK(WIN2_DSP_YST2)) >> 16; + } + dsp_info = vop_readl(vop_dev, WIN2_DSP_INFO3); + dsp_st = vop_readl(vop_dev, WIN2_DSP_ST3); + w2_3_dsp_x = (dsp_info & MASK(WIN2_DSP_WIDTH3)) + 1; + w2_3_dsp_y = ((dsp_info & MASK(WIN2_DSP_HEIGHT3)) >> 16) + 1; + if (w2_3_state) { + w2_3_st_x = dsp_st & MASK(WIN2_DSP_XST3); + w2_3_st_y = (dsp_st & MASK(WIN2_DSP_YST3)) >> 16; + } + + /*WIN3 */ + win_ctrl = vop_readl(vop_dev, WIN3_CTRL0); + w3_state = win_ctrl & MASK(WIN3_EN); + w3_0_state = (win_ctrl & 0x10) >> 4; + w3_1_state = (win_ctrl & 0x100) >> 8; + w3_2_state = (win_ctrl & 0x1000) >> 12; + w3_3_state = (win_ctrl & 0x10000) >> 16; + vir_info = vop_readl(vop_dev, WIN3_VIR0_1); + w3_0_vir_y = vir_info & MASK(WIN3_VIR_STRIDE0); + w3_1_vir_y = (vir_info & MASK(WIN3_VIR_STRIDE1)) >> 16; + vir_info = vop_readl(vop_dev, WIN3_VIR2_3); + w3_2_vir_y = vir_info & MASK(WIN3_VIR_STRIDE2); + w3_3_vir_y = (vir_info & MASK(WIN3_VIR_STRIDE3)) >> 16; + + fmt_id = (win_ctrl & MASK(WIN3_DATA_FMT0)) >> 5; + vop_format_to_string(fmt_id, format_w3_0); + fmt_id = (win_ctrl & MASK(WIN3_DATA_FMT1)) >> 9; + vop_format_to_string(fmt_id, format_w3_1); + fmt_id = (win_ctrl & MASK(WIN3_DATA_FMT2)) >> 13; + vop_format_to_string(fmt_id, format_w3_2); + fmt_id = (win_ctrl & MASK(WIN3_DATA_FMT3)) >> 17; + vop_format_to_string(fmt_id, format_w3_3); + + dsp_info = vop_readl(vop_dev, WIN3_DSP_INFO0); + dsp_st = vop_readl(vop_dev, WIN3_DSP_ST0); + w3_0_dsp_x = (dsp_info & MASK(WIN3_DSP_WIDTH0)) + 1; + w3_0_dsp_y = ((dsp_info & MASK(WIN3_DSP_HEIGHT0)) >> 16) + 1; + if (w3_0_state) { + w3_0_st_x = dsp_st & MASK(WIN3_DSP_XST0); + w3_0_st_y = (dsp_st & MASK(WIN3_DSP_YST0)) >> 16; + } + dsp_info = vop_readl(vop_dev, WIN3_DSP_INFO1); + dsp_st = vop_readl(vop_dev, WIN3_DSP_ST1); + w3_1_dsp_x = (dsp_info & MASK(WIN3_DSP_WIDTH1)) + 1; + w3_1_dsp_y = ((dsp_info & MASK(WIN3_DSP_HEIGHT1)) >> 16) + 1; + if (w3_1_state) { + w3_1_st_x = dsp_st & MASK(WIN3_DSP_XST1); + w3_1_st_y = (dsp_st & MASK(WIN3_DSP_YST1)) >> 16; + } + dsp_info = vop_readl(vop_dev, WIN3_DSP_INFO2); + dsp_st = vop_readl(vop_dev, WIN3_DSP_ST2); + w3_2_dsp_x = (dsp_info & MASK(WIN3_DSP_WIDTH2)) + 1; + w3_2_dsp_y = ((dsp_info & MASK(WIN3_DSP_HEIGHT2)) >> 16) + 1; + if (w3_2_state) { + w3_2_st_x = dsp_st & MASK(WIN3_DSP_XST2); + w3_2_st_y = (dsp_st & MASK(WIN3_DSP_YST2)) >> 16; + } + dsp_info = vop_readl(vop_dev, WIN3_DSP_INFO3); + dsp_st = vop_readl(vop_dev, WIN3_DSP_ST3); + w3_3_dsp_x = (dsp_info & MASK(WIN3_DSP_WIDTH3)) + 1; + w3_3_dsp_y = ((dsp_info & MASK(WIN3_DSP_HEIGHT3)) >> 16) + 1; + if (w3_3_state) { + w3_3_st_x = dsp_st & MASK(WIN3_DSP_XST3); + w3_3_st_y = (dsp_st & MASK(WIN3_DSP_YST3)) >> 16; + } } else { spin_unlock(&vop_dev->reg_lock); return -EPERM; } spin_unlock(&vop_dev->reg_lock); size += snprintf(dsp_buf, 80, - "z-order:\n win[%d]\n win[%d]\n", - layer1_sel, layer0_sel); + "z-order:\n win[%d]\n win[%d]\n win[%d]\n win[%d]\n", + layer1_sel, layer0_sel, layer2_sel, layer3_sel); strcat(buf, dsp_buf); memset(dsp_buf, 0, sizeof(dsp_buf)); /* win0 */ @@ -3682,6 +3834,122 @@ static ssize_t vop_get_disp_info(struct rk_lcdc_driver *dev_drv, strcat(buf, dsp_buf); memset(dsp_buf, 0, sizeof(dsp_buf)); + /*win2*/ + size += snprintf(dsp_buf, 80, + "win2:\n state:%d\n", + w2_state); + strcat(buf, dsp_buf); + memset(dsp_buf, 0, sizeof(dsp_buf)); + /*area 0*/ + size += snprintf(dsp_buf, 80, + " area0: state:%d, fmt:%7s, dsp_x:%4d, dsp_y:%4d,", + w2_0_state, format_w2_0, w2_0_dsp_x, w2_0_dsp_y); + strcat(buf, dsp_buf); + memset(dsp_buf, 0, sizeof(dsp_buf)); + size += snprintf(dsp_buf, 80, + " x_st:%4d, y_st:%4d, y_addr:0x%08x\n", + w2_0_st_x - h_pw_bp, w2_0_st_y - v_pw_bp, + vop_readl(vop_dev, WIN2_MST0)); + strcat(buf, dsp_buf); + memset(dsp_buf, 0, sizeof(dsp_buf)); + + /*area 1*/ + size += snprintf(dsp_buf, 80, + " area1: state:%d, fmt:%7s, dsp_x:%4d, dsp_y:%4d,", + w2_1_state, format_w2_1, w2_1_dsp_x, w2_1_dsp_y); + strcat(buf, dsp_buf); + memset(dsp_buf, 0, sizeof(dsp_buf)); + size += snprintf(dsp_buf, 80, + " x_st:%4d, y_st:%4d, y_addr:0x%08x\n", + w2_1_st_x - h_pw_bp, w2_1_st_y - v_pw_bp, + vop_readl(vop_dev, WIN2_MST1)); + strcat(buf, dsp_buf); + memset(dsp_buf, 0, sizeof(dsp_buf)); + + /*area 2*/ + size += snprintf(dsp_buf, 80, + " area2: state:%d, fmt:%7s, dsp_x:%4d, dsp_y:%4d,", + w2_2_state, format_w2_2, w2_2_dsp_x, w2_2_dsp_y); + strcat(buf, dsp_buf); + memset(dsp_buf, 0, sizeof(dsp_buf)); + size += snprintf(dsp_buf, 80, + " x_st:%4d, y_st:%4d, y_addr:0x%08x\n", + w2_2_st_x - h_pw_bp, w2_2_st_y - v_pw_bp, + vop_readl(vop_dev, WIN2_MST2)); + strcat(buf, dsp_buf); + memset(dsp_buf, 0, sizeof(dsp_buf)); + + /*area 3*/ + size += snprintf(dsp_buf, 80, + " area3: state:%d, fmt:%7s, dsp_x:%4d, dsp_y:%4d,", + w2_3_state, format_w2_3, w2_3_dsp_x, w2_3_dsp_y); + strcat(buf, dsp_buf); + memset(dsp_buf, 0, sizeof(dsp_buf)); + size += snprintf(dsp_buf, 80, + " x_st:%4d, y_st:%4d, y_addr:0x%08x\n", + w2_3_st_x - h_pw_bp, w2_3_st_y - v_pw_bp, + vop_readl(vop_dev, WIN2_MST3)); + strcat(buf, dsp_buf); + memset(dsp_buf, 0, sizeof(dsp_buf)); + + /*win3*/ + size += snprintf(dsp_buf, 80, + "win3:\n state:%d\n", + w3_state); + strcat(buf, dsp_buf); + memset(dsp_buf, 0, sizeof(dsp_buf)); + /*area 0*/ + size += snprintf(dsp_buf, 80, + " area0: state:%d, fmt:%7s, dsp_x:%4d, dsp_y:%4d,", + w3_0_state, format_w3_0, w3_0_dsp_x, w3_0_dsp_y); + strcat(buf, dsp_buf); + memset(dsp_buf, 0, sizeof(dsp_buf)); + size += snprintf(dsp_buf, 80, + " x_st:%4d, y_st:%4d, y_addr:0x%08x\n", + w3_0_st_x - h_pw_bp, w3_0_st_y - v_pw_bp, + vop_readl(vop_dev, WIN3_MST0)); + strcat(buf, dsp_buf); + memset(dsp_buf, 0, sizeof(dsp_buf)); + + /*area 1*/ + size += snprintf(dsp_buf, 80, + " area1: state:%d, fmt:%7s, dsp_x:%4d, dsp_y:%4d,", + w3_1_state, format_w3_1, w3_1_dsp_x, w3_1_dsp_y); + strcat(buf, dsp_buf); + memset(dsp_buf, 0, sizeof(dsp_buf)); + size += snprintf(dsp_buf, 80, + " x_st:%4d, y_st:%4d, y_addr:0x%08x\n", + w3_1_st_x - h_pw_bp, w3_1_st_y - v_pw_bp, + vop_readl(vop_dev, WIN3_MST1)); + strcat(buf, dsp_buf); + memset(dsp_buf, 0, sizeof(dsp_buf)); + + /*area 2*/ + size += snprintf(dsp_buf, 80, + " area2: state:%d, fmt:%7s, dsp_x:%4d, dsp_y:%4d,", + w3_2_state, format_w3_2, w3_2_dsp_x, w3_2_dsp_y); + strcat(buf, dsp_buf); + memset(dsp_buf, 0, sizeof(dsp_buf)); + size += snprintf(dsp_buf, 80, + " x_st:%4d, y_st:%4d, y_addr:0x%08x\n", + w3_2_st_x - h_pw_bp, w3_2_st_y - v_pw_bp, + vop_readl(vop_dev, WIN3_MST2)); + strcat(buf, dsp_buf); + memset(dsp_buf, 0, sizeof(dsp_buf)); + + /*area 3*/ + size += snprintf(dsp_buf, 80, + " area3: state:%d, fmt:%7s, dsp_x:%4d, dsp_y:%4d,", + w3_3_state, format_w3_3, w3_3_dsp_x, w3_3_dsp_y); + strcat(buf, dsp_buf); + memset(dsp_buf, 0, sizeof(dsp_buf)); + size += snprintf(dsp_buf, 80, + " x_st:%4d, y_st:%4d, y_addr:0x%08x\n", + w3_3_st_x - h_pw_bp, w3_3_st_y - v_pw_bp, + vop_readl(vop_dev, WIN3_MST3)); + strcat(buf, dsp_buf); + memset(dsp_buf, 0, sizeof(dsp_buf)); + return size; }