video: rockchip: vop: 3399: add win2 and win3 when get dsp_info
authorHuang Jiachai <hjc@rock-chips.com>
Thu, 31 Mar 2016 03:36:04 +0000 (11:36 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Tue, 5 Apr 2016 06:04:39 +0000 (14:04 +0800)
Change-Id: Ib1ae76de66656b0531683eede117346945587008
Signed-off-by: Huang Jiachai <hjc@rock-chips.com>
drivers/video/rockchip/lcdc/rk322x_lcdc.c

index 51454e00ef91ac698aa93d7e81fca708bbf57194..10b926bce0115bea312bec0591d21e18515b2c8c 100644 (file)
@@ -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;
 }