di: turn on cont wr interrupt, fine tune cue
authorkele bai <kele.bai@amlogic.com>
Fri, 23 Feb 2018 10:26:25 +0000 (18:26 +0800)
committerYixun Lan <yixun.lan@amlogic.com>
Mon, 5 Mar 2018 07:34:37 +0000 (15:34 +0800)
PD#156734: di: turn on cont wr interrupt, fine tune cue

1) turn on cont wr int, disable me int
2) modify cue mode for abnormal mode 2/4/7/8/9
3) move clk adjustment into thread env
4) set min clk rate when di disable
5) modify txlx clk tree

Change-Id: I759324806bb9c9bfa4e83ee4a39e5283c5653f3b
Signed-off-by: kele bai <kele.bai@amlogic.com>
drivers/amlogic/clk/txlx/txlx_clk_media.c
drivers/amlogic/media/deinterlace/deinterlace.c
drivers/amlogic/media/deinterlace/deinterlace.h
drivers/amlogic/media/deinterlace/deinterlace_hw.c
drivers/amlogic/media/deinterlace/deinterlace_hw.h
drivers/amlogic/media/deinterlace/di_pps.c
drivers/amlogic/media/deinterlace/nr_drv.c
drivers/amlogic/media/deinterlace/register.h

index 8d9dca5..01bad3d 100644 (file)
@@ -651,4 +651,6 @@ void meson_txlx_media_init(void)
 
        clks[CLKID_IEC958_MUX] = clk_register(NULL, &cts_iec958_spdif.hw);
        WARN_ON(IS_ERR(clks[CLKID_IEC958_MUX]));
+       /* todo: set default div4 parent for tmp clkb */
+       clk_set_parent(clks[CLKID_VPU_CLKB_TMP_COMP], clks[CLKID_FCLK_DIV4]);
 }
index 58a1177..345a45b 100644 (file)
@@ -1512,9 +1512,10 @@ static unsigned char is_input2pre(void)
 #ifdef DI_USE_FIXED_CANVAS_IDX
 static int di_post_idx[2][6];
 static int di_pre_idx[2][10];
-static int di_wr_idx;
 #ifdef CONFIG_AMLOGIC_MEDIA_MULTI_DEC
 static unsigned int di_inp_idx[3];
+#else
+static int di_wr_idx;
 #endif
 static int di_get_canvas(void)
 {
@@ -1570,6 +1571,8 @@ static int di_get_canvas(void)
 #endif
        if (de_devp->post_wr_support == 0)
                return 0;
+
+#ifndef CONFIG_AMLOGIC_MEDIA_MULTI_DEC
        if (canvas_pool_alloc_canvas_table("di_wr",
                        &di_wr_idx, 1, CANVAS_MAP_TYPE_1)) {
                pr_err("%s allocat di write back canvas error.\n",
@@ -1577,6 +1580,7 @@ static int di_get_canvas(void)
                        return 1;
        }
        pr_info("DI: support post write back %u.\n", di_wr_idx);
+#endif
        return 0;
 }
 
@@ -1739,8 +1743,10 @@ static unsigned int di_cma_alloc(struct di_dev_s *devp)
                                                buf_p->index, buf_p->pages);
                        }
                } else {
-                       pr_err("DI buf[%d] page:0x%p cma alloced skip\n",
+                       if (cma_print) {
+                               pr_err("DI buf[%d] page:0x%p cma alloced skip\n",
                                        buf_p->index, buf_p->pages);
+                       }
                }
                buf_p->nr_adr = page_to_phys(buf_p->pages);
                if (cma_print)
@@ -1945,8 +1951,6 @@ static int di_init_buf(int width, int height, unsigned char prog_flag)
                        di_buf_size = nr_size + mtn_size + count_size;
                }
                di_buf_size = roundup(di_buf_size, PAGE_SIZE);
-               pr_info("[DI] %s buffer size %u.\n", __func__,
-                       di_buf_size);
                de_devp->buf_num_avail = de_devp->mem_size / di_buf_size;
 
                if (post_wr_en && post_wr_support) {
@@ -5765,8 +5769,11 @@ static void di_pre_size_change(unsigned short width,
                pps_h = di_pre_stru.cur_height>>1;
                di_pps_config(1, pps_w, pps_h, pps_dstw, (pps_dsth>>1));
        }
-       di_interrupt_ctrl(vf_type, det3d_en?1:0,
-               de_devp->nrds_enable, post_wr_en, mcpre_en?1:0);
+       di_interrupt_ctrl(di_pre_stru.madi_enable,
+               det3d_en?1:0,
+               de_devp->nrds_enable,
+               post_wr_en,
+               di_pre_stru.mcdi_enable);
 }
 
 static bool need_bypass(struct vframe_s *vf)
@@ -5844,28 +5851,18 @@ static void di_reg_process_irq(void)
                switch_vpu_clk_gate_vmod(VPU_VPU_CLKB, VPU_CLK_GATE_ON);
                if (post_wr_en && post_wr_support)
                        diwr_set_power_control(1);
+               /* up for vpu clkb rate change */
+               up(&di_sema);
                if (cpu_after_eq(MESON_CPU_MAJOR_ID_TXLX)) {
                        if (!use_2_interlace_buff) {
-                               if (is_meson_txlx_cpu()) {
-                                       #ifdef CLK_TREE_SUPPORT
-                                       /* nr only clkb upto 500M*/
-                                       clk_set_rate(de_devp->vpu_clkb,
-                                               de_devp->clkb_min_rate);
-                                       #endif
-                               }
                                di_top_gate_control(true, true);
                                di_post_gate_control(true);
                                /* freerun for reg configuration */
                                enable_di_post_mif(GATE_AUTO);
                        } else {
-                               if (is_meson_txlx_cpu()) {
-                                       #ifdef CLK_TREE_SUPPORT
-                                       clk_set_rate(de_devp->vpu_clkb,
-                                               de_devp->clkb_max_rate);
-                                       #endif
-                               }
                                di_top_gate_control(true, false);
                        }
+                       de_devp->flags |= DI_VPU_CLKB_SET;
                        enable_di_pre_mif(true, mcpre_en);
                        di_pre_gate_control(true, mcpre_en);
                } else {
@@ -6100,6 +6097,11 @@ static int di_task_handle(void *data)
                                di_pre_stru.disable_req_flag) &&
                                (di_pre_stru.pre_de_busy == 0)) {
                                di_unreg_process();
+                               /* set min rate for power saving */
+                               if (de_devp->vpu_clkb) {
+                                       clk_set_rate(de_devp->vpu_clkb,
+                                               de_devp->clkb_min_rate);
+                               }
                        }
                        if (di_pre_stru.reg_req_flag_irq ||
                                di_pre_stru.reg_req_flag) {
@@ -6126,6 +6128,28 @@ static int di_task_handle(void *data)
                        mutex_unlock(&de_devp->cma_mutex);
                        #endif
                }
+               if (de_devp->flags & DI_VPU_CLKB_SET) {
+                       if (is_meson_txlx_cpu()) {
+                               if (!use_2_interlace_buff) {
+                                       #ifdef CLK_TREE_SUPPORT
+                                       clk_set_rate(de_devp->vpu_clkb,
+                                               de_devp->clkb_min_rate);
+                                       #endif
+                               } else {
+                                       #ifdef CLK_TREE_SUPPORT
+                                       clk_set_rate(de_devp->vpu_clkb,
+                                               de_devp->clkb_max_rate);
+                                       #endif
+                               }
+                       }
+                       if (is_meson_g12a_cpu()) {
+                               #ifdef CLK_TREE_SUPPORT
+                               clk_set_rate(de_devp->vpu_clkb,
+                                               de_devp->clkb_max_rate);
+                               #endif
+                       }
+                       de_devp->flags &= (~DI_VPU_CLKB_SET);
+               }
        }
 
        return 0;
@@ -6559,7 +6583,7 @@ static bool show_nrwr;
 static vframe_t *di_vf_get(void *arg)
 {
        vframe_t *vframe_ret = NULL;
-       struct di_buf_s *di_buf = NULL;
+       struct di_buf_s *di_buf = NULL, *nr_buf = NULL;
        ulong irq_flag2 = 0;
 
        if (di_pre_stru.bypass_flag)
@@ -6596,11 +6620,10 @@ get_vframe:
 
                if (di_buf) {
                        vframe_ret = di_buf->vframe;
-
+                       nr_buf = di_buf->di_buf_dup_p[1];
                        if ((post_wr_en && post_wr_support) &&
                        (di_buf->process_fun_index != PROCESS_FUN_NULL)) {
-                               #if 0
-                               CONFIG_MULTI_DEC
+                               #ifdef CONFIG_AMLOGIC_MEDIA_MULTI_DEC
                                vframe_ret->canvas0_config[0].phy_addr =
                                        di_buf->nr_adr;
                                vframe_ret->canvas0_config[0].width =
@@ -6611,13 +6634,20 @@ get_vframe:
                                vframe_ret->plane_num = 1;
                                vframe_ret->canvas0Addr = -1;
                                vframe_ret->canvas1Addr = -1;
+                               if (show_nrwr) {
+                                       vframe_ret->canvas0_config[0].phy_addr =
+                                               nr_buf->nr_adr;
+                                       vframe_ret->canvas0_config[0].width =
+                                               nr_buf->canvas_width[NR_CANVAS];
+                                       vframe_ret->canvas0_config[0].height =
+                                               nr_buf->canvas_height;
+                               }
                                #else
                                config_canvas_idx(di_buf, di_wr_idx, -1);
                                vframe_ret->canvas0Addr = di_buf->nr_canvas_idx;
                                vframe_ret->canvas1Addr = di_buf->nr_canvas_idx;
                                if (show_nrwr) {
-                                       config_canvas_idx(
-                                               di_buf->di_buf_dup_p[1],
+                                       config_canvas_idx(nr_buf,
                                                di_wr_idx, -1);
                                        vframe_ret->canvas0Addr = di_wr_idx;
                                        vframe_ret->canvas1Addr = di_wr_idx;
@@ -7131,8 +7161,7 @@ static void di_get_vpu_clkb(struct device *dev, struct di_dev_s *pdev)
        pdev->vpu_clkb = clk_get(dev, "vpu_clkb_composite");
        if (IS_ERR(pdev->vpu_clkb))
                pr_err("%s: get vpu clkb gate error.\n", __func__);
-       clk_set_rate(pdev->vpu_clkb, pdev->clkb_max_rate);
-       clk_set_rate(pdev->vpu_clkb, pdev->clkb_max_rate);
+       clk_set_rate(pdev->vpu_clkb, pdev->clkb_min_rate);
        #endif
 }
 
index 11672a8..269fd3f 100644 (file)
@@ -192,6 +192,7 @@ extern bool is_vsync_rdma_enable(void);
 #define DI_MAP_FLAG    0x1
 #define DI_SUSPEND_FLAG 0x2
 #define DI_LOAD_REG_FLAG 0x4
+#define DI_VPU_CLKB_SET 0x8
 struct di_dev_s {
        dev_t                      devt;
        struct cdev                cdev; /* The cdev structure */
index 1090e87..244ba7b 100644 (file)
@@ -610,25 +610,21 @@ static void set_di_nrwr_mif(struct DI_SIM_MIF_s *nrwr_mif,
                RDMA_WR_BITS(DI_NRWR_CTRL, 0x3, 22, 2);
 }
 
-void di_interrupt_ctrl(unsigned char vf_type,
+void di_interrupt_ctrl(unsigned char ma_en,
        unsigned char det3d_en, unsigned char nrds_en,
        unsigned char post_wr, unsigned char mc_en)
 {
 
-       if (vf_type & VIDTYPE_TYPEMASK) {
-               RDMA_WR_BITS(DI_INTR_CTRL, 0, 17, 1);
-               RDMA_WR_BITS(DI_INTR_CTRL, 1, 20, 1);
-               RDMA_WR_BITS(DI_INTR_CTRL, mc_en?0:7, 21, 3);
-       } else {
-               RDMA_WR_BITS(DI_INTR_CTRL, 1, 17, 1);
-               RDMA_WR_BITS(DI_INTR_CTRL, 1, 20, 1);
-               /* mask mc int */
-               RDMA_WR_BITS(DI_INTR_CTRL, 7, 21, 3);
-       }
+       RDMA_WR_BITS(DI_INTR_CTRL, ma_en?0:1, 17, 1);
+       RDMA_WR_BITS(DI_INTR_CTRL, ma_en?0:1, 20, 1);
+       RDMA_WR_BITS(DI_INTR_CTRL, mc_en?0:3, 22, 2);
        /* enable nr wr int */
        RDMA_WR_BITS(DI_INTR_CTRL, 0, 16, 1);
-       RDMA_WR_BITS(DI_INTR_CTRL, 1, 19, 1);
        RDMA_WR_BITS(DI_INTR_CTRL, post_wr?0:1, 18, 1);
+       /* mask me interrupt hit abnormal */
+       RDMA_WR_BITS(DI_INTR_CTRL, 1, 21, 1);
+       /* mask hist interrupt */
+       RDMA_WR_BITS(DI_INTR_CTRL, 1, 19, 1);
        RDMA_WR_BITS(DI_INTR_CTRL, det3d_en?0:1, 24, 1);
        RDMA_WR_BITS(DI_INTR_CTRL, nrds_en?0:1, 25, 1);
        /* clean all pending interrupt bits */
@@ -678,7 +674,6 @@ void enable_di_pre_aml(
                chan2_disable = true;
        if ((mem_hsize != nrwr_hsize) || (mem_vsize != nrwr_vsize))
                mem_bypass = true;
-
        /*
         * enable&disable contwr txt
         */
@@ -713,6 +708,7 @@ void enable_di_pre_aml(
                                (0 << 12) | /* pre viu link */
                        (pre_vdin_link << 13) |
                        (pre_vdin_link << 14) |/* pre go line link */
+                               (1 << 21) |/* invert NR field num */
                                (1 << 22) |/* MTN after NR. */
                        (0 << 25) |/* contrd en */
                ((mem_bypass ? 1 : 0) << 28) |
index 11d0f11..1ee22e4 100644 (file)
@@ -170,7 +170,7 @@ void pulldown_vof_win_config(struct pulldown_detected_s *wins);
 void di_load_regs(struct di_pq_parm_s *di_pq_ptr);
 void pre_frame_reset_g12a(unsigned char madi_en, unsigned char mcdi_en);
 void pre_frame_reset(void);
-void di_interrupt_ctrl(unsigned char vf_type,
+void di_interrupt_ctrl(unsigned char ma_en,
        unsigned char det3d_en, unsigned char nrds_en,
        unsigned char post_wr, unsigned char mc_en);
 #endif
index 2ba9160..8c9f7f3 100644 (file)
@@ -415,8 +415,6 @@ void di_pps_config(unsigned char path, int src_w, int src_h,
                vsc_en = 1;
        if (src_w != dst_w)
                hsc_en = 1;
-       pr_info("[pps] %s input %d %d output %d %d.\n",
-               path?"pre":"post", src_w, src_h, dst_w, dst_h);
        /* config hdr size */
        Wr_reg_bits(DI_HDR_IN_HSIZE, dst_w, 0, 13);
        Wr_reg_bits(DI_HDR_IN_VSIZE, dst_h, 0, 13);
@@ -533,6 +531,9 @@ void di_pps_config(unsigned char path, int src_w, int src_h,
                (0 << 4)          |      // vert nonlinear 4region enable
                (vert_bank_length << 0)  // vert scaler bank length
        );
+
+       pr_info("[pps] %s input %d %d output %d %d.\n",
+               path?"pre":"post", src_w, src_h, dst_w, dst_h);
 }
 /*
  * 0x374e ~ 0x376d, 20 regs
index 0d2faa1..d9da906 100644 (file)
@@ -719,10 +719,10 @@ void adaptive_cue_adjust(unsigned int frame_diff, unsigned int field_diff)
                /* for clockfuliness clip */
                if (pcue_parm->field_count >
                                (pcue_parm->glb_mot_fieldnum - 6)) {
-                       Wr(NR2_CUE_MODE, 0x50322|(Rd(NR2_CUE_MODE)&0xc00));
+                       Wr(NR2_CUE_MODE, 0x50323|(Rd(NR2_CUE_MODE)&0xc00));
                        Wr(NR2_CUE_CON_MOT_TH, 0x03010e01);
                } else {
-                       Wr(NR2_CUE_MODE, 0x00054377|(Rd(NR2_CUE_MODE)&0xc00));
+                       Wr(NR2_CUE_MODE, 0x00054375|(Rd(NR2_CUE_MODE)&0xc00));
                        Wr(NR2_CUE_CON_MOT_TH, 0xa03c8c3c);
                }
        }
index fa3f220..6d20bf4 100644 (file)
@@ -1294,7 +1294,7 @@ void DI_VSYNC_WR_MPEG_REG_BITS(unsigned int addr,
  */
 /* // NR2 REG DEFINE END //// */
 /* // DET 3D REG DEFINE BEGIN //// */
-/* //  8'h80~8'h8f */
+/* for gxlx */
 #define DI_EI_DRT_CTRL_GXLX                  ((0x2028))
 
 #define DI_EI_DRT_PIXTH_GXLX                 ((0x2029))