| // SPDX-License-Identifier: (GPL-2.0+ OR MIT) |
| /* |
| * Copyright (c) 2019 Amlogic, Inc. All rights reserved. |
| */ |
| |
| #include <linux/types.h> |
| #include <linux/init.h> |
| #include <linux/module.h> |
| #include <linux/kernel.h> |
| #include <linux/fs.h> |
| #include <linux/device.h> |
| #include <linux/cdev.h> |
| #include <linux/platform_device.h> |
| #include <linux/of.h> |
| #include <linux/of_device.h> |
| #include <linux/of_fdt.h> |
| #include <linux/of_reserved_mem.h> |
| #include <linux/of_irq.h> |
| #include <linux/of_clk.h> |
| #include <linux/string.h> |
| #include <linux/mm.h> |
| #include <linux/slab.h> |
| #include <linux/stat.h> |
| #include <linux/errno.h> |
| #include <linux/uaccess.h> |
| #include <linux/ioport.h> |
| #include <linux/ctype.h> |
| #include <linux/vmalloc.h> |
| #include <linux/interrupt.h> |
| #include <linux/workqueue.h> |
| #include <linux/clk.h> |
| #include <linux/sched/clock.h> |
| #include <linux/amlogic/media/registers/register_map.h> |
| #include <linux/amlogic/iomap.h> |
| #include <linux/amlogic/media/frc/frc_reg.h> |
| #include <linux/amlogic/media/amvecm/amvecm.h> |
| #include "frc_drv.h" |
| #include "frc_hw.h" |
| #include "frc_regs_table.h" |
| #include "frc_proc.h" |
| #include "vlock.h" |
| |
| void __iomem *frc_clk_base; |
| void __iomem *vpu_base; |
| |
| struct stvlock_frc_param gst_frc_param; |
| |
| const struct vf_rate_table vf_rate_table[FRAME_RATE_CNT] = { |
| {800, FRC_VD_FPS_120}, |
| {801, FRC_VD_FPS_120}, |
| {960, FRC_VD_FPS_100}, |
| {961, FRC_VD_FPS_100}, |
| {1600, FRC_VD_FPS_60}, |
| {1601, FRC_VD_FPS_60}, |
| {1920, FRC_VD_FPS_50}, |
| {2000, FRC_VD_FPS_48}, |
| {3199, FRC_VD_FPS_30}, |
| {3200, FRC_VD_FPS_30}, |
| {3203, FRC_VD_FPS_30}, |
| {3840, FRC_VD_FPS_25}, |
| {3999, FRC_VD_FPS_24}, |
| {4000, FRC_VD_FPS_24}, |
| {4001, FRC_VD_FPS_24}, |
| {4004, FRC_VD_FPS_24}, |
| {0000, FRC_VD_FPS_00}, |
| }; |
| |
| u32 vpu_reg_read(u32 addr) |
| { |
| unsigned int value = 0; |
| |
| value = aml_read_vcbus_s(addr); |
| return value; |
| } |
| |
| void vpu_reg_write(u32 addr, u32 value) |
| { |
| aml_write_vcbus_s(addr, value); |
| } |
| |
| void vpu_reg_write_bits(unsigned int reg, unsigned int value, |
| unsigned int start, unsigned int len) |
| { |
| aml_vcbus_update_bits_s(reg, value, start, len); |
| } |
| |
| //.clk0: ( fclk_div3), //666 div: 0 1/1, 1:1/2, 2:1/4 |
| //.clk1: ( fclk_div4), //500 div: 0 1/1, 1:1/2, 2:1/4 |
| //.clk2: ( fclk_div5), //400 div: 0 1/1, 1:1/2, 2:1/4 |
| //.clk3: ( fclk_div7), //285 div: 0 1/1, 1:1/2, 2:1/4 |
| //.clk4: ( mp1_clk_out), |
| //.clk5: ( vid_pll0_clk), |
| //.clk6: ( hifi_pll_clk), |
| //.clk7: ( sys1_pll_clk), |
| void set_frc_div_clk(int sel, int div) |
| { |
| unsigned int val = 0; |
| unsigned int reg; |
| |
| reg = CLKCTRL_FRC_CLK_CNTL; |
| |
| val = readl(frc_clk_base + (reg << 2)); |
| |
| if (val == 0 || (val & (1 << 31))) { |
| val &= ~((0x7 << 9) | |
| (1 << 8) | |
| (0x7f << 0)); |
| val |= (sel << 9) | |
| (1 << 8) | |
| (div << 0); |
| val &= ~(1 << 31); |
| val |= 1 << 30; |
| writel(val, (frc_clk_base + (reg << 2))); |
| } else { |
| val &= ~((0x7 << 25) | |
| (1 << 24) | |
| (0x7f << 16)); |
| val |= (sel << 25) | |
| (1 << 24) | |
| (div << 16); |
| val |= 1 << 31; |
| val |= 1 << 30; |
| writel(val, (frc_clk_base + (reg << 2))); |
| } |
| } |
| |
| void set_me_div_clk(int sel, int div) |
| { |
| unsigned int val = 0; |
| unsigned int reg; |
| |
| reg = CLKCTRL_ME_CLK_CNTL; |
| |
| val = readl(frc_clk_base + (reg << 2)); |
| |
| if (val == 0 || (val & (1 << 31))) { |
| val &= ~((0x7 << 9) | |
| (1 << 8) | |
| (0x7f << 0)); |
| val |= (sel << 9) | |
| (1 << 8) | |
| (div << 0); |
| val &= ~(1 << 31); |
| val |= 1 << 30; |
| writel(val, (frc_clk_base + (reg << 2))); |
| } else { |
| val &= ~((0x7 << 25) | |
| (1 << 24) | |
| (0x7f << 16)); |
| val |= (sel << 25) | |
| (1 << 24) | |
| (div << 16); |
| val |= 1 << 31; |
| val |= 1 << 30; |
| writel(val, (frc_clk_base + (reg << 2))); |
| } |
| } |
| |
| void set_frc_clk_disable(struct frc_dev_s *frc_devp, u8 disable) |
| { |
| if (disable == 1) { |
| if (frc_devp->clk_state == FRC_CLOCK_OFF) |
| return; |
| if (IS_ERR(frc_devp->clk_me)) |
| PR_ERR("%s: frc_devp->clk_me to disable", __func__); |
| else |
| clk_disable_unprepare(frc_devp->clk_me); |
| if (IS_ERR(frc_devp->clk_frc)) |
| PR_ERR("%s: frc_devp->clk_me to disable", __func__); |
| else |
| clk_disable_unprepare(frc_devp->clk_frc); |
| frc_devp->clk_state = FRC_CLOCK_OFF; |
| pr_frc(0, "dis frc_clk\n"); |
| } else { |
| if (frc_devp->clk_state == FRC_CLOCK_NOR) |
| return; |
| if (IS_ERR(frc_devp->clk_me)) |
| PR_ERR("%s: frc_devp->clk_me to enable", __func__); |
| else |
| clk_prepare_enable(frc_devp->clk_me); |
| if (IS_ERR(frc_devp->clk_frc)) |
| PR_ERR("%s: frc_devp->clk_frc to enable", __func__); |
| else |
| clk_prepare_enable(frc_devp->clk_frc); |
| frc_devp->clk_state = FRC_CLOCK_NOR; |
| pr_frc(2, "en frc_clk\n"); |
| } |
| } |
| |
| void frc_clk_init(struct frc_dev_s *frc_devp) |
| { |
| int me_clk, mc_clk; |
| unsigned int height, width; |
| |
| height = frc_devp->out_sts.vout_height; |
| width = frc_devp->out_sts.vout_width; |
| frc_devp->clk_state = FRC_CLOCK_OFF; |
| if (get_chip_type() == ID_T3X) { |
| me_clk = FRC_CLOCK_RATE_667; |
| mc_clk = FRC_CLOCK_RATE_667; |
| } else { |
| me_clk = FRC_CLOCK_RATE_333; |
| mc_clk = FRC_CLOCK_RATE_667; |
| } |
| clk_set_rate(frc_devp->clk_frc, mc_clk); |
| clk_prepare_enable(frc_devp->clk_frc); |
| frc_devp->clk_frc_frq = clk_get_rate(frc_devp->clk_frc); |
| pr_frc(0, "clk_frc frq : %d Mhz\n", |
| frc_devp->clk_frc_frq / 1000000); |
| clk_set_rate(frc_devp->clk_me, me_clk); |
| clk_prepare_enable(frc_devp->clk_me); |
| frc_devp->clk_me_frq = clk_get_rate(frc_devp->clk_me); |
| pr_frc(0, "clk_me frq : %d Mhz\n", frc_devp->clk_me_frq / 1000000); |
| frc_devp->clk_state = FRC_CLOCK_NOR; |
| } |
| |
| void frc_osdbit_setfalsecolor(struct frc_dev_s *devp, u32 falsecolor) |
| { |
| enum chip_id chip; |
| u32 tmp_reg1; |
| |
| chip = get_chip_type(); |
| |
| if (chip == ID_T3) { |
| frc_config_reg_value((falsecolor << 19), 0x80000, ®data_logodbg_0142); |
| WRITE_FRC_REG_BY_CPU(FRC_LOGO_DEBUG, regdata_logodbg_0142); |
| } else if (chip == ID_T5M || chip == ID_T3X) { |
| tmp_reg1 = READ_FRC_REG(FRC_MC_LBUF_LOGO_CTRL); |
| regdata_logodbg_0142 = READ_FRC_REG(FRC_LOGO_DEBUG); |
| if (falsecolor == 1) { |
| tmp_reg1 |= (BIT_8 + BIT_7); |
| regdata_logodbg_0142 |= BIT_19; |
| } else { |
| tmp_reg1 &= ~(BIT_8 + BIT_7); |
| regdata_logodbg_0142 &= ~BIT_19; |
| } |
| WRITE_FRC_REG_BY_CPU(FRC_MC_LBUF_LOGO_CTRL, tmp_reg1); |
| WRITE_FRC_REG_BY_CPU(FRC_LOGO_DEBUG, regdata_logodbg_0142); |
| } |
| } |
| |
| void frc_init_config(struct frc_dev_s *devp) |
| { |
| enum chip_id chip; |
| struct frc_fw_data_s *fw_data; |
| struct frc_top_type_s *frc_top; |
| |
| if (!devp) |
| return; |
| fw_data = (struct frc_fw_data_s *)devp->fw_data; |
| frc_top = &fw_data->frc_top_type; |
| frc_load_reg_table(devp, 0); |
| frc_set_val_from_reg(); |
| chip = get_chip_type(); |
| |
| if (chip == ID_T3) |
| frc_top->frc_fb_num = FRC_BUF_NUM_T3; |
| else if (chip == ID_T5M) |
| frc_top->frc_fb_num = FRC_BUF_NUM_T5M; |
| else if (chip == ID_T3X) |
| frc_top->frc_fb_num = FRC_BUF_NUM_T3X; |
| else |
| frc_top->frc_fb_num = FRC_TOTAL_BUF_NUM; |
| |
| frc_set_buf_num(frc_top->frc_fb_num); |
| |
| /*1: before postblend, 0: after postblend*/ |
| if (devp->frc_hw_pos == FRC_POS_AFTER_POSTBLEND) { |
| vpu_reg_write_bits(devp->vpu_byp_frc_reg_addr, 0, 4, 1); |
| frc_config_reg_value(0x02, 0x02, ®data_blkscale_012c); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_BLK_SCALE, regdata_blkscale_012c); |
| frc_config_reg_value(0x800000, 0xF00000, ®data_iplogo_en_0503); |
| WRITE_FRC_REG_BY_CPU(FRC_IPLOGO_EN, regdata_iplogo_en_0503); |
| } else { |
| vpu_reg_write_bits(devp->vpu_byp_frc_reg_addr, 1, 4, 1); |
| frc_config_reg_value(0x0, 0x02, ®data_blkscale_012c); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_BLK_SCALE, regdata_blkscale_012c); |
| frc_config_reg_value(0x0, 0xF00000, ®data_iplogo_en_0503); |
| WRITE_FRC_REG_BY_CPU(FRC_IPLOGO_EN, regdata_iplogo_en_0503); |
| frc_config_reg_value(0x0, 0x80000, ®data_logodbg_0142); |
| WRITE_FRC_REG_BY_CPU(FRC_LOGO_DEBUG, regdata_logodbg_0142); |
| } |
| } |
| |
| void frc_reset(u32 onoff) |
| { |
| if (onoff) { |
| WRITE_FRC_REG_BY_CPU(FRC_AUTO_RST_SEL, 0x3c); |
| WRITE_FRC_REG_BY_CPU(FRC_SYNC_SW_RESETS, 0x3c); |
| } else { |
| WRITE_FRC_REG_BY_CPU(FRC_SYNC_SW_RESETS, 0x0); |
| WRITE_FRC_REG_BY_CPU(FRC_AUTO_RST_SEL, 0x0); |
| } |
| } |
| |
| void frc_mc_reset(u32 onoff) |
| { |
| if (onoff) { |
| WRITE_FRC_REG_BY_CPU(FRC_MC_SW_RESETS, 0xffff); |
| WRITE_FRC_REG_BY_CPU(FRC_MEVP_SW_RESETS, 0xffffff); |
| } else { |
| WRITE_FRC_REG_BY_CPU(FRC_MEVP_SW_RESETS, 0x0); |
| WRITE_FRC_REG_BY_CPU(FRC_MC_SW_RESETS, 0x0); |
| } |
| pr_frc(2, "%s %d\n", __func__, onoff); |
| } |
| |
| void set_frc_enable(u32 en) |
| { |
| enum chip_id chip = get_chip_type(); |
| struct frc_dev_s *devp = get_frc_devp(); |
| |
| pr_frc(2, "%s set(1122) %d\n", __func__, en); |
| |
| regdata_topctl_3f01 = READ_FRC_REG(FRC_TOP_CTRL); |
| frc_config_reg_value(en, BIT_0, ®data_topctl_3f01); |
| WRITE_FRC_REG_BY_CPU(FRC_TOP_CTRL, regdata_topctl_3f01); |
| if (en == 1) { |
| if (chip == ID_T3X) { |
| if (READ_FRC_REG(FRC_REG_TOP_CTRL7) & 0xFFFFFFFF) { |
| PR_ERR("CTRL7 error\n"); |
| regdata_top_ctl_0007 = 0; |
| WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL7, regdata_top_ctl_0007); |
| } |
| WRITE_FRC_REG_BY_CPU(FRC_AUTO_RST_SEL, 0x3c); |
| WRITE_FRC_REG_BY_CPU(FRC_SYNC_SW_RESETS, 0x3c); |
| WRITE_FRC_REG_BY_CPU(FRC_SYNC_SW_RESETS, 0); |
| WRITE_FRC_REG_BY_CPU(FRC_AUTO_RST_SEL, 0); |
| frc_mc_reset(1); |
| frc_mc_reset(0); |
| WRITE_FRC_REG_BY_CPU(FRC_TOP_SW_RESET, 0xFFFF); |
| WRITE_FRC_REG_BY_CPU(FRC_TOP_SW_RESET, 0x0); |
| } else { |
| frc_mc_reset(1); |
| frc_mc_reset(0); |
| WRITE_FRC_REG_BY_CPU(FRC_TOP_SW_RESET, 0xFFFF); |
| WRITE_FRC_REG_BY_CPU(FRC_TOP_SW_RESET, 0x0); |
| if (devp->dbg_mvrd_mode > 0) |
| WRITE_FRC_REG_BY_CPU(FRC_MC_MVRD_CTRL, 0x101); |
| } |
| } else { |
| // if ((READ_FRC_REG(FRC_REG_TOP_CTRL7) >> 24) > 0) { |
| // frc_config_reg_value(0x0, 0x9000000, ®data_top_ctl_0007); |
| // WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL7, regdata_top_ctl_0007); |
| // } |
| regdata_top_ctl_0007 = 0; |
| WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL7, regdata_top_ctl_0007); |
| gst_frc_param.s2l_en = 0; |
| gst_frc_param.frc_mcfixlines = 0; |
| // WRITE_FRC_REG_BY_CPU(FRC_FRAME_SIZE, 0x0); |
| if (vlock_sync_frc_vporch(gst_frc_param) < 0) |
| pr_frc(1, "frc_off_set maxlnct fail !!!\n"); |
| else |
| pr_frc(1, "frc_off_set maxlnct success!!!\n"); |
| } |
| pr_frc(2, "%s ok\n", __func__); |
| } |
| |
| void set_frc_bypass(u32 en) |
| { |
| struct frc_dev_s *devp = get_frc_devp(); |
| u32 tmp_vpu_top_reg; |
| |
| if (get_chip_type() == ID_T3X) { |
| devp->need_bypass = en ? 1 : 2; |
| } else { |
| tmp_vpu_top_reg = vpu_reg_read(VPU_FRC_TOP_CTRL); |
| if (en && !(tmp_vpu_top_reg & BIT_0)) |
| vpu_reg_write(VPU_FRC_TOP_CTRL, (tmp_vpu_top_reg | BIT_0)); |
| else if (!en && (tmp_vpu_top_reg & BIT_0)) |
| vpu_reg_write(VPU_FRC_TOP_CTRL, (tmp_vpu_top_reg & 0xfffffffe)); |
| else |
| pr_frc(2, "%s set:%d rd vpu:0x%X\n", __func__, en, tmp_vpu_top_reg); |
| } |
| } |
| |
| void frc_set_buf_num(u32 frc_fb_num) |
| { |
| struct frc_fw_data_s *fw_data; |
| struct frc_top_type_s *frc_top; |
| u32 temp; |
| u8 frm_buf_num; |
| struct frc_dev_s *frc_devp = get_frc_devp(); |
| |
| if (!frc_devp) |
| return; |
| |
| fw_data = (struct frc_fw_data_s *)frc_devp->fw_data; |
| frc_top = &fw_data->frc_top_type; |
| |
| temp = READ_FRC_REG(FRC_FRAME_BUFFER_NUM); |
| frm_buf_num = temp & 0x1F; |
| pr_frc(0, "buf num (read: %d, set: %d)\n", |
| frm_buf_num, frc_fb_num); |
| if (frc_fb_num != frm_buf_num) { |
| WRITE_FRC_REG_BY_CPU(FRC_FRAME_BUFFER_NUM, |
| frc_fb_num << 8 | frc_fb_num); |
| frc_top->frc_fb_num = frc_fb_num; |
| temp = READ_FRC_REG(FRC_FRAME_BUFFER_NUM); |
| frm_buf_num = temp & 0x1F; |
| if (frm_buf_num != frc_top->frc_fb_num) |
| pr_frc(1, "set buf num error (set %d, read back %d)\n", |
| frc_top->frc_fb_num, frm_buf_num); |
| } |
| frc_devp->buf.frm_buf_num = frc_fb_num; |
| frc_devp->buf.logo_buf_num = frc_fb_num; |
| } |
| |
| void frc_check_hw_stats(struct frc_dev_s *frc_devp, u8 checkflag) |
| { |
| u32 val = 0; |
| struct frc_hw_stats_s *tmpstats; |
| |
| tmpstats = &frc_devp->hw_stats; |
| if (checkflag == 0) { |
| tmpstats = &frc_devp->hw_stats; |
| val = READ_FRC_REG(FRC_RO_DBG0_STAT); |
| tmpstats->reg4dh.rawdat = val; |
| val = READ_FRC_REG(FRC_RO_DBG1_STAT); |
| tmpstats->reg4eh.rawdat = val; |
| val = READ_FRC_REG(FRC_RO_DBG2_STAT); |
| tmpstats->reg4fh.rawdat = val; |
| } else if (checkflag == 1) { |
| pr_frc(1, "[0x%x] ref_vs_dly_num = %d, ref_de_dly_num = %d\n", |
| tmpstats->reg4dh.rawdat, |
| tmpstats->reg4dh.bits.ref_vs_dly_num, |
| tmpstats->reg4dh.bits.ref_de_dly_num); |
| pr_frc(1, "[0x%x] mevp_dly_num = %d, mcout_dly_num = %d\n", |
| tmpstats->reg4eh.rawdat, |
| tmpstats->reg4eh.bits.mevp_dly_num, |
| tmpstats->reg4eh.bits.mcout_dly_num); |
| pr_frc(1, "[0x%x] memc_corr_st = %d, corr_dly_num = %d\n", |
| tmpstats->reg4fh.rawdat, |
| tmpstats->reg4fh.bits.memc_corr_st, |
| tmpstats->reg4fh.bits.memc_corr_dly_num); |
| pr_frc(1, "out_dly_err=%d, out_de_dly_num = %d\n", |
| tmpstats->reg4fh.bits.out_dly_err, |
| tmpstats->reg4fh.bits.out_de_dly_num); |
| } |
| } |
| |
| void frc_crc_check_frm(struct frc_dev_s *frc_devp) |
| { |
| struct frc_crc_data_s *crc_data; |
| |
| crc_data = &frc_devp->frc_crc_data; |
| WRITE_FRC_REG(FRC_MEVP_CRC_CHECK_FRM, crc_data->me_check_frm); |
| WRITE_FRC_REG(FRC_MC_CRC_CHECK_FRM, crc_data->mc_check_frm); |
| } |
| |
| void frc_crc_read(struct frc_dev_s *frc_devp) |
| { |
| struct frc_crc_data_s *crc_data; |
| |
| crc_data = &frc_devp->frc_crc_data; |
| crc_data->mevp_mv_crc_sum = READ_FRC_REG(FRC_MEVP_RO_MV_CRC_SUM); |
| crc_data->mevp_logo_crc_sum = READ_FRC_REG(FRC_MEVP_RO_LOGO_CRC_SUM); |
| crc_data->mc_crc_sum = READ_FRC_REG(FRC_MC_CRC_SUM); |
| PR_FRC("mv_crc = 0x%8x\tlogo_crc = 0x%8x\tmc_crc = 0x%8x\n", |
| crc_data->mevp_mv_crc_sum, |
| crc_data->mevp_logo_crc_sum, |
| crc_data->mc_crc_sum); |
| } |
| |
| void inp_undone_read(struct frc_dev_s *frc_devp) |
| { |
| u32 offset = 0x0; |
| enum chip_id chip; |
| u32 inp_ud_flag, readval, timeout; |
| |
| if (!frc_devp) |
| return; |
| if (!frc_devp->probe_ok || !frc_devp->power_on_flag) |
| return; |
| if (frc_devp->frc_sts.re_config) |
| return; |
| //if (frc_devp->frc_sts.state != FRC_STATE_ENABLE || |
| // frc_devp->frc_sts.new_state != FRC_STATE_ENABLE) |
| // return; |
| |
| chip = get_chip_type(); |
| |
| if (chip == ID_T3) |
| offset = 0xa0; |
| else if (chip == ID_T5M || chip == ID_T3X) |
| offset = 0x0; |
| |
| inp_ud_flag = READ_FRC_REG(FRC_INP_UE_DBG + offset) & 0x3f; |
| if (inp_ud_flag == 0x10 && (chip == ID_T5M || chip == ID_T3X)) { |
| return; |
| } else if (inp_ud_flag != 0) { |
| WRITE_FRC_REG_BY_CPU(FRC_INP_UE_CLR + offset, 0x3f); |
| WRITE_FRC_REG_BY_CPU(FRC_INP_UE_CLR + offset, 0x0); |
| frc_devp->ud_dbg.inp_undone_err++; |
| frc_devp->frc_sts.inp_undone_cnt++; |
| if (frc_devp->ud_dbg.inp_ud_dbg_en != 0) { |
| PR_ERR("inp_ud_err=0x%x, isr_cnt=(%d,%d), vd_vs_cnt=%d\n", |
| inp_ud_flag, |
| frc_devp->in_sts.vs_cnt, |
| frc_devp->out_sts.vs_cnt, |
| frc_devp->frc_sts.vs_cnt); |
| } |
| timeout = 0; |
| do { |
| readval = READ_FRC_REG(FRC_INP_UE_CLR + offset) & 0x3f; |
| if (readval == 0) |
| break; |
| } while (timeout++ < 100); |
| if (frc_devp->ud_dbg.res1_time_en == 1) { |
| if (frc_devp->ud_dbg.inp_undone_err == 100) { |
| frc_devp->frc_sts.re_config = true; |
| PR_ERR("inp undo more err, frc will reset\n"); |
| } |
| } |
| } else { |
| frc_devp->ud_dbg.inp_undone_err = 0; |
| } |
| } |
| |
| void me_undone_read(struct frc_dev_s *frc_devp) |
| { |
| u32 me_ud_flag; |
| |
| if (!frc_devp) |
| return; |
| if (!frc_devp->probe_ok || !frc_devp->power_on_flag) |
| return; |
| if (frc_devp->ud_dbg.meud_dbg_en) { |
| me_ud_flag = READ_FRC_REG(FRC_MEVP_RO_STAT0) & BIT_0; |
| if (me_ud_flag != 0) { |
| frc_devp->frc_sts.me_undone_cnt++; |
| WRITE_FRC_BITS(FRC_MEVP_CTRL0, 1, 31, 1); |
| WRITE_FRC_BITS(FRC_MEVP_CTRL0, 0, 31, 1); |
| frc_devp->ud_dbg.me_undone_err = me_ud_flag; |
| } else { |
| frc_devp->ud_dbg.me_undone_err = 0; |
| } |
| if (frc_devp->ud_dbg.me_undone_err == 1) |
| PR_ERR("me_ud_err_cnt=%d, isr_cnt=(%d,%d), vd_vs_cnt=%d\n", |
| frc_devp->frc_sts.me_undone_cnt, |
| frc_devp->in_sts.vs_cnt, |
| frc_devp->out_sts.vs_cnt, |
| frc_devp->frc_sts.vs_cnt); |
| } |
| } |
| |
| void mc_undone_read(struct frc_dev_s *frc_devp) |
| { |
| u32 val, mc_ud_flag; |
| |
| if (!frc_devp) |
| return; |
| if (!frc_devp->probe_ok || !frc_devp->power_on_flag) |
| return; |
| if (frc_devp->ud_dbg.mcud_dbg_en) { |
| val = READ_FRC_REG(FRC_RO_MC_STAT); |
| mc_ud_flag = (val >> 12) & 0x1; |
| if (mc_ud_flag != 0) { |
| frc_devp->frc_sts.mc_undone_cnt = (val >> 16) & 0xfff; |
| frc_devp->ud_dbg.mc_undone_err = 1; |
| WRITE_FRC_BITS(FRC_MC_HW_CTRL0, 1, 21, 1); |
| WRITE_FRC_BITS(FRC_MC_HW_CTRL0, 0, 21, 1); |
| } else { |
| frc_devp->ud_dbg.mc_undone_err = 0; |
| } |
| if (frc_devp->ud_dbg.mc_undone_err == 1) |
| PR_ERR("mc_undo_vcnt= %d, isr_cnt=(%d,%d), vd_vs_cnt=%d\n", |
| frc_devp->frc_sts.mc_undone_cnt, |
| frc_devp->in_sts.vs_cnt, |
| frc_devp->out_sts.vs_cnt, |
| frc_devp->frc_sts.vs_cnt); |
| } |
| } |
| |
| void vp_undone_read(struct frc_dev_s *frc_devp) |
| { |
| u32 vp_ud_flag; |
| |
| if (!frc_devp) |
| return; |
| if (!frc_devp->probe_ok || !frc_devp->power_on_flag) |
| return; |
| if (frc_devp->ud_dbg.vpud_dbg_en) { |
| vp_ud_flag = READ_FRC_REG(FRC_VP_TOP_STAT) & 0x03; |
| if (vp_ud_flag != 0) { |
| frc_devp->frc_sts.vp_undone_cnt++; |
| frc_devp->ud_dbg.vp_undone_err = vp_ud_flag; |
| WRITE_FRC_BITS(FRC_VP_TOP_CLR_STAT, 3, 0, 2); |
| WRITE_FRC_BITS(FRC_VP_TOP_CLR_STAT, 0, 0, 2); |
| } else { |
| frc_devp->ud_dbg.vp_undone_err = 0; |
| } |
| if (frc_devp->ud_dbg.vp_undone_err != 0) |
| PR_ERR("vp_err=%x, err_cnt=%d, outvs_cnt=%d, vd_vs_cnt:%d\n", |
| frc_devp->ud_dbg.vp_undone_err, |
| frc_devp->frc_sts.vp_undone_cnt, |
| frc_devp->out_sts.vs_cnt, |
| frc_devp->frc_sts.vs_cnt); |
| } |
| } |
| |
| const char * const mtx_str[] = { |
| "FRC_INPUT_CSC", |
| "FRC_OUTPUT_CSC" |
| }; |
| |
| const char * const csc_str[] = { |
| "CSC_OFF", |
| "RGB_YUV709L", |
| "RGB_YUV709F", |
| "YUV709L_RGB", |
| "YUV709F_RGB", |
| "PAT_RED", |
| "PAT_GREEN", |
| "PAT_BLUE", |
| "PAT_WHITE", |
| "PAT_BLACK", |
| "RETORE_DEF", |
| }; |
| |
| void frc_mtx_cfg(enum frc_mtx_e mtx_sel, enum frc_mtx_csc_e mtx_csc) |
| { |
| unsigned int pre_offset01 = 0; |
| unsigned int pre_offset2 = 0; |
| unsigned int pst_offset01 = 0x0200, pst_offset2 = 0x0200; |
| unsigned int coef00_01 = 0, coef02_10 = 0, coef11_12 = 0; |
| unsigned int coef20_21 = 0, coef22 = 0; |
| unsigned int en = 1; |
| struct frc_dev_s *devp = get_frc_devp(); |
| |
| if (!devp->probe_ok || !devp->power_on_flag) |
| return; |
| if (devp->clk_state == FRC_CLOCK_OFF) |
| return; |
| switch (mtx_csc) { |
| case CSC_OFF: |
| en = 0; |
| break; |
| case RGB_YUV709L: |
| coef00_01 = 0x00bb0275; |
| coef02_10 = 0x003f1f99; |
| coef11_12 = 0x1ea601c2; |
| coef20_21 = 0x01c21e67; |
| coef22 = 0x00001fd7; |
| pre_offset01 = 0x0; |
| pre_offset2 = 0x0; |
| pst_offset01 = 0x00400200; |
| pst_offset2 = 0x00000200; |
| break; |
| case RGB_YUV709F: |
| coef00_01 = 0xda02dc; |
| coef02_10 = 0x4a1f8b; |
| coef11_12 = 0x1e750200; |
| coef20_21 = 0x2001e2f; |
| coef22 = 0x1fd0; |
| pre_offset01 = 0x0; |
| pre_offset2 = 0x0; |
| pst_offset01 = 0x200; |
| pst_offset2 = 0x200; |
| break; |
| case YUV709L_RGB: |
| coef00_01 = 0x04A80000; |
| coef02_10 = 0x072C04A8; |
| coef11_12 = 0x1F261DDD; |
| coef20_21 = 0x04A80876; |
| coef22 = 0x0; |
| pre_offset01 = 0x1fc01e00; |
| pre_offset2 = 0x000001e00; |
| pst_offset01 = 0x0; |
| pst_offset2 = 0x0; |
| break; |
| case YUV709F_RGB: |
| coef00_01 = 0x04000000; |
| coef02_10 = 0x064D0400; |
| coef11_12 = 0x1F411E21; |
| coef20_21 = 0x0400076D; |
| coef22 = 0x0; |
| pre_offset01 = 0x000001e00; |
| pre_offset2 = 0x000001e00; |
| pst_offset01 = 0x0; |
| pst_offset2 = 0x0; |
| break; |
| case PAT_RD: |
| coef00_01 = 0x0; |
| coef02_10 = 0x0; |
| coef11_12 = 0x0; |
| coef20_21 = 0x0; |
| coef22 = 0x0; |
| pst_offset01 = 0x0; |
| pst_offset2 = 0xFFF; |
| break; |
| case PAT_GR: |
| coef00_01 = 0x0; |
| coef02_10 = 0x0; |
| coef11_12 = 0x0; |
| coef20_21 = 0x0; |
| coef22 = 0x0; |
| pst_offset01 = 0x0FFF0000; |
| pst_offset2 = 0x0; |
| break; |
| case PAT_BU: |
| coef00_01 = 0x0; |
| coef02_10 = 0x0; |
| coef11_12 = 0x0; |
| coef20_21 = 0x0; |
| coef22 = 0x0; |
| pst_offset01 = 0x0FFF; |
| pst_offset2 = 0x0; |
| break; |
| case PAT_WT: |
| coef00_01 = 0x0; |
| coef02_10 = 0x0; |
| coef11_12 = 0x0; |
| coef20_21 = 0x0; |
| coef22 = 0x0; |
| pst_offset01 = 0x0FFF0FFF; |
| pst_offset2 = 0x0200; |
| break; |
| case PAT_BK: |
| coef00_01 = 0x0; |
| coef02_10 = 0x0; |
| coef11_12 = 0x0; |
| coef20_21 = 0x0; |
| coef22 = 0x0; |
| pst_offset01 = 0x0200; |
| pst_offset2 = 0x0200; |
| break; |
| case DEFAULT: |
| if (mtx_sel == FRC_INPUT_CSC) { |
| coef00_01 = devp->init_csc[0].coef00_01; |
| coef02_10 = devp->init_csc[0].coef02_10; |
| coef11_12 = devp->init_csc[0].coef11_12; |
| coef20_21 = devp->init_csc[0].coef20_21; |
| coef22 = devp->init_csc[0].coef22; |
| pre_offset01 = devp->init_csc[0].pre_offset01; |
| pre_offset2 = devp->init_csc[0].pre_offset2; |
| pst_offset01 = devp->init_csc[0].pst_offset01; |
| pst_offset2 = devp->init_csc[0].pst_offset2; |
| en = devp->init_csc[0].enable; |
| } else { |
| coef00_01 = devp->init_csc[1].coef00_01; |
| coef02_10 = devp->init_csc[1].coef02_10; |
| coef11_12 = devp->init_csc[1].coef11_12; |
| coef20_21 = devp->init_csc[1].coef20_21; |
| coef22 = devp->init_csc[1].coef22; |
| pre_offset01 = devp->init_csc[1].pre_offset01; |
| pre_offset2 = devp->init_csc[1].pre_offset2; |
| pst_offset01 = devp->init_csc[1].pst_offset01; |
| pst_offset2 = devp->init_csc[1].pst_offset2; |
| en = devp->init_csc[1].enable; |
| } |
| break; |
| default: |
| coef00_01 = 0x0; |
| coef02_10 = 0x0; |
| coef11_12 = 0x0; |
| coef20_21 = 0x0; |
| coef22 = 0x0; |
| pst_offset01 = 0x0200; |
| pst_offset2 = 0x0200; |
| en = 0; // invalid case |
| break; |
| } |
| |
| switch (mtx_sel) { |
| case FRC_INPUT_CSC: |
| WRITE_FRC_REG(FRC_INP_CSC_OFFSET_INP01, pre_offset01); |
| WRITE_FRC_REG(FRC_INP_CSC_OFFSET_INP2, pre_offset2); |
| WRITE_FRC_REG(FRC_INP_CSC_COEF_00_01, coef00_01); |
| WRITE_FRC_REG(FRC_INP_CSC_COEF_02_10, coef02_10); |
| WRITE_FRC_REG(FRC_INP_CSC_COEF_11_12, coef11_12); |
| WRITE_FRC_REG(FRC_INP_CSC_COEF_20_21, coef20_21); |
| WRITE_FRC_REG(FRC_INP_CSC_COEF_22, coef22); |
| WRITE_FRC_REG(FRC_INP_CSC_OFFSET_OUP01, pst_offset01); |
| WRITE_FRC_REG(FRC_INP_CSC_OFFSET_OUP2, pst_offset2); |
| WRITE_FRC_BITS(FRC_INP_CSC_CTRL, en, 3, 1); |
| break; |
| case FRC_OUTPUT_CSC: |
| WRITE_FRC_REG(FRC_MC_CSC_OFFSET_INP01, pre_offset01); |
| WRITE_FRC_REG(FRC_MC_CSC_OFFSET_INP2, pre_offset2); |
| WRITE_FRC_REG(FRC_MC_CSC_COEF_00_01, coef00_01); |
| WRITE_FRC_REG(FRC_MC_CSC_COEF_02_10, coef02_10); |
| WRITE_FRC_REG(FRC_MC_CSC_COEF_11_12, coef11_12); |
| WRITE_FRC_REG(FRC_MC_CSC_COEF_20_21, coef20_21); |
| WRITE_FRC_REG(FRC_MC_CSC_COEF_22, coef22); |
| WRITE_FRC_REG(FRC_MC_CSC_OFFSET_OUP01, pst_offset01); |
| WRITE_FRC_REG(FRC_MC_CSC_OFFSET_OUP2, pst_offset2); |
| WRITE_FRC_BITS(FRC_MC_CSC_CTRL, en, 3, 1); |
| break; |
| default: |
| break; |
| } |
| pr_frc(1, "%s, mtx sel: %s, en:%d, mtx csc : %s\n", |
| __func__, mtx_str[mtx_sel - 1], en, csc_str[mtx_csc]); |
| } |
| |
| void frc_get_init_csc(struct frc_dev_s *frc_devp) |
| { |
| frc_devp->init_csc[0].coef00_01 = READ_FRC_REG(FRC_INP_CSC_COEF_00_01); |
| frc_devp->init_csc[0].coef02_10 = READ_FRC_REG(FRC_INP_CSC_COEF_02_10); |
| frc_devp->init_csc[0].coef11_12 = READ_FRC_REG(FRC_INP_CSC_COEF_11_12); |
| frc_devp->init_csc[0].coef20_21 = READ_FRC_REG(FRC_INP_CSC_COEF_20_21); |
| frc_devp->init_csc[0].coef22 = READ_FRC_REG(FRC_INP_CSC_COEF_22); |
| frc_devp->init_csc[0].pre_offset01 = READ_FRC_REG(FRC_INP_CSC_OFFSET_INP01); |
| frc_devp->init_csc[0].pre_offset2 = READ_FRC_REG(FRC_INP_CSC_OFFSET_INP2); |
| frc_devp->init_csc[0].pst_offset01 = READ_FRC_REG(FRC_INP_CSC_OFFSET_OUP01); |
| frc_devp->init_csc[0].pst_offset2 = READ_FRC_REG(FRC_INP_CSC_OFFSET_OUP2); |
| frc_devp->init_csc[0].enable = |
| (READ_FRC_REG(FRC_INP_CSC_CTRL) >> 3) & BIT_0; |
| |
| frc_devp->init_csc[1].coef00_01 = READ_FRC_REG(FRC_MC_CSC_COEF_00_01); |
| frc_devp->init_csc[1].coef02_10 = READ_FRC_REG(FRC_MC_CSC_COEF_02_10); |
| frc_devp->init_csc[1].coef11_12 = READ_FRC_REG(FRC_MC_CSC_COEF_11_12); |
| frc_devp->init_csc[1].coef20_21 = READ_FRC_REG(FRC_MC_CSC_COEF_20_21); |
| frc_devp->init_csc[1].coef22 = READ_FRC_REG(FRC_MC_CSC_COEF_22); |
| frc_devp->init_csc[1].pre_offset01 = READ_FRC_REG(FRC_MC_CSC_OFFSET_INP01); |
| frc_devp->init_csc[1].pre_offset2 = READ_FRC_REG(FRC_MC_CSC_OFFSET_INP2); |
| frc_devp->init_csc[1].pst_offset01 = READ_FRC_REG(FRC_MC_CSC_OFFSET_OUP01); |
| frc_devp->init_csc[1].pst_offset2 = READ_FRC_REG(FRC_MC_CSC_OFFSET_OUP2); |
| frc_devp->init_csc[1].enable = |
| (READ_FRC_REG(FRC_MC_CSC_CTRL) >> 3) & BIT_0; |
| |
| pr_frc(1, "%s, inp_csc_en:%d mtx(%x-%x-%x), mc_csc_en:%d mtx(%x-%x-%x)\n", |
| __func__, frc_devp->init_csc[0].enable, |
| frc_devp->init_csc[0].coef00_01, |
| frc_devp->init_csc[0].pre_offset01, |
| frc_devp->init_csc[0].pre_offset01, |
| frc_devp->init_csc[1].enable, |
| frc_devp->init_csc[1].coef00_01, |
| frc_devp->init_csc[1].pre_offset01, |
| frc_devp->init_csc[1].pre_offset01); |
| } |
| |
| void frc_mtx_set(struct frc_dev_s *frc_devp) |
| { |
| if (frc_devp->frc_hw_pos == FRC_POS_AFTER_POSTBLEND) { |
| frc_mtx_cfg(FRC_INPUT_CSC, RGB_YUV709F); |
| frc_mtx_cfg(FRC_OUTPUT_CSC, YUV709F_RGB); |
| return; |
| } |
| |
| if (frc_devp->frc_test_ptn) { |
| frc_mtx_cfg(FRC_INPUT_CSC, RGB_YUV709L); |
| frc_mtx_cfg(FRC_OUTPUT_CSC, CSC_OFF); |
| } else { |
| frc_mtx_cfg(FRC_INPUT_CSC, CSC_OFF); |
| frc_mtx_cfg(FRC_OUTPUT_CSC, CSC_OFF); |
| } |
| frc_get_init_csc(frc_devp); |
| } |
| |
| static void set_vd1_out_size(struct frc_dev_s *frc_devp) |
| { |
| unsigned int hsize = 0; |
| unsigned int vsize = 0; |
| enum chip_id chip; |
| |
| chip = get_chip_type(); |
| if (frc_devp->frc_hw_pos == FRC_POS_BEFORE_POSTBLEND) { |
| if (frc_devp->force_size.force_en) { |
| hsize = frc_devp->force_size.force_hsize - 1; |
| vsize = frc_devp->force_size.force_vsize - 1; |
| if (chip == ID_T3) { |
| vpu_reg_write_bits(VD1_BLEND_SRC_CTRL_T3X, 1, 8, 4); |
| vpu_reg_write_bits(VPP_POSTBLEND_VD1_H_START_END_T3X, hsize, 0, 13); |
| vpu_reg_write_bits(VPP_POSTBLEND_VD1_V_START_END_T3X, vsize, 0, 13); |
| } else { |
| vpu_reg_write_bits(VD1_BLEND_SRC_CTRL, 1, 8, 4); |
| vpu_reg_write_bits(VPP_POSTBLEND_VD1_H_START_END, hsize, 0, 13); |
| vpu_reg_write_bits(VPP_POSTBLEND_VD1_V_START_END, vsize, 0, 13); |
| } |
| } |
| } |
| pr_frc(1, "hsize = %d, vsize = %d\n", hsize, vsize); |
| } |
| |
| void frc_pattern_on(u32 en) |
| { |
| u32 offset = 0x0; |
| enum chip_id chip; |
| |
| chip = get_chip_type(); |
| |
| if (chip == ID_T3) |
| offset = 0xa0; |
| else if (chip == ID_T5M || chip == ID_T3X) |
| offset = 0x0; |
| |
| // WRITE_FRC_BITS(FRC_REG_INP_MODULE_EN, en, 6, 1); |
| frc_config_reg_value(en << 6, 0x40, ®data_inpmoden_04f9); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_INP_MODULE_EN + offset, regdata_inpmoden_04f9); |
| |
| if (en == 1) { |
| frc_mtx_cfg(FRC_INPUT_CSC, RGB_YUV709L); |
| frc_mtx_cfg(FRC_OUTPUT_CSC, CSC_OFF); |
| |
| } else { |
| frc_mtx_cfg(FRC_INPUT_CSC, DEFAULT); |
| frc_mtx_cfg(FRC_OUTPUT_CSC, DEFAULT); |
| } |
| } |
| |
| void frc_input_init(struct frc_dev_s *frc_devp, |
| struct frc_top_type_s *frc_top) |
| { |
| if (frc_devp->frc_test_ptn) { |
| if (frc_devp->frc_hw_pos == FRC_POS_BEFORE_POSTBLEND && |
| frc_devp->force_size.force_en) { |
| /*used for set testpattern size, only for debug*/ |
| frc_top->hsize = frc_devp->force_size.force_hsize; |
| frc_top->vsize = frc_devp->force_size.force_vsize; |
| frc_top->out_hsize = frc_devp->force_size.force_hsize; |
| frc_top->out_vsize = frc_devp->force_size.force_vsize; |
| } else { |
| frc_top->hsize = frc_devp->out_sts.vout_width; |
| frc_top->vsize = frc_devp->out_sts.vout_height; |
| frc_top->out_hsize = frc_devp->out_sts.vout_width; |
| frc_top->out_vsize = frc_devp->out_sts.vout_height; |
| } |
| frc_top->frc_ratio_mode = frc_devp->in_out_ratio; |
| frc_top->film_mode = frc_devp->film_mode; |
| /*hw film detect*/ |
| frc_top->film_hwfw_sel = frc_devp->film_mode_det; |
| frc_top->frc_prot_mode = frc_devp->prot_mode; |
| |
| set_vd1_out_size(frc_devp); |
| } else { |
| if (frc_devp->frc_hw_pos == FRC_POS_AFTER_POSTBLEND) { |
| frc_top->hsize = frc_devp->out_sts.vout_width; |
| frc_top->vsize = frc_devp->out_sts.vout_height; |
| } else { |
| frc_top->hsize = frc_devp->in_sts.in_hsize; |
| frc_top->vsize = frc_devp->in_sts.in_vsize; |
| } |
| frc_top->out_hsize = frc_devp->out_sts.vout_width; |
| frc_top->out_vsize = frc_devp->out_sts.vout_height; |
| frc_top->frc_ratio_mode = frc_devp->in_out_ratio; |
| frc_top->film_mode = frc_devp->film_mode; |
| /*sw film detect*/ |
| frc_top->film_hwfw_sel = frc_devp->film_mode_det; |
| frc_top->frc_prot_mode = frc_devp->prot_mode; |
| } |
| |
| if (frc_devp->out_sts.vout_width > frc_devp->buf.in_hsize || |
| frc_devp->out_sts.vout_height > frc_devp->buf.in_vsize) |
| PR_ERR("FRC initial buf is not enough!\n"); |
| |
| if (frc_top->out_vsize == HEIGHT_2K && |
| frc_top->out_hsize == WIDTH_4K) |
| frc_top->panel_res = FRC_RES_4K2K; |
| else if (frc_top->out_vsize == HEIGHT_1K && |
| frc_top->out_hsize == WIDTH_2K) |
| frc_top->panel_res = FRC_RES_2K1K; |
| else if (frc_top->out_vsize == HEIGHT_1K && |
| frc_top->out_hsize == WIDTH_4K) |
| frc_top->panel_res = FRC_RES_4K1K; |
| else |
| frc_top->panel_res = FRC_RES_NONE; |
| |
| pr_frc(2, "top in: hsize:%d, vsize:%d\n", frc_top->hsize, frc_top->vsize); |
| pr_frc(2, "top out: hsize:%d, vsize:%d\n", frc_top->out_hsize, frc_top->out_vsize); |
| if (frc_top->hsize == 0 || frc_top->vsize == 0) |
| pr_frc(0, "err: size in hsize:%d, vsize:%d !!!!\n", frc_top->hsize, frc_top->vsize); |
| } |
| |
| void frc_drv_bbd_init_xyxy(struct frc_fw_data_s *pfw_data) |
| { |
| u32 reg_data; |
| u32 me_width; |
| u32 me_height; |
| u32 me_blk_xsize; |
| u32 me_blk_ysize; |
| u32 me_dsx; |
| u32 me_dsy; |
| u32 me_blksize_dsx; |
| u32 me_blksize_dsy; |
| u32 hsize_align, vsize_align; |
| struct frc_top_type_s *gst_frc_top_item; |
| |
| if (!pfw_data) |
| return; |
| |
| gst_frc_top_item = &pfw_data->frc_top_type; |
| // regdata_hme_scale_012d = READ_FRC_REG(FRC_REG_ME_HME_SCALE); |
| reg_data = regdata_hme_scale_012d; |
| me_dsx = (reg_data >> 6) & 0x3; |
| me_dsy = (reg_data >> 4) & 0x3; |
| // regdata_blksizexy_012b = READ_FRC_REG(FRC_REG_BLK_SIZE_XY); |
| reg_data = regdata_blksizexy_012b; |
| me_blksize_dsx = (reg_data >> 19) & 0x7; |
| me_blksize_dsy = (reg_data >> 16) & 0x7; |
| |
| //me me_blksize_dsx me_blksize_dsy-> FRC_REG_BLK_SIZE_XY |
| if (gst_frc_top_item->is_me1mc4 == 0) { |
| hsize_align = (gst_frc_top_item->hsize + 7) / 8 * 8; |
| vsize_align = (gst_frc_top_item->vsize + 7) / 8 * 8; |
| } else { |
| hsize_align = (gst_frc_top_item->hsize + 15) / 16 * 16; |
| vsize_align = (gst_frc_top_item->vsize + 15) / 16 * 16; |
| } |
| me_width = (hsize_align + (1 << me_dsx) - 1) / (1 << me_dsx);/*960*/ |
| me_height = (vsize_align + (1 << me_dsy) - 1) / (1 << me_dsy);/*540*/ |
| me_blk_xsize = (me_width + (1 << me_blksize_dsx) - 1) / (1 << me_blksize_dsx);/*240*/ |
| me_blk_ysize = (me_height + (1 << me_blksize_dsy) - 1) / (1 << me_blksize_dsy);/*135*/ |
| |
| reg_data = me_height - 1; |
| reg_data |= (me_width - 1) << 16; |
| frc_config_reg_value(reg_data, 0xfff0fff, ®data_me_bbpixed_1108); |
| WRITE_FRC_REG_BY_CPU(FRC_ME_BB_PIX_ED, regdata_me_bbpixed_1108); |
| |
| reg_data = (me_blk_ysize - 1); |
| reg_data |= (me_blk_xsize - 1) << 16; |
| frc_config_reg_value(reg_data, 0xfff0fff, ®data_me_bbblked_110a); |
| WRITE_FRC_REG_BY_CPU(FRC_ME_BB_BLK_ED, regdata_me_bbblked_110a);// 240*135 |
| |
| /*reg_me_stat_region_hend 0*/ |
| frc_config_reg_value(0, 0x3ff, ®data_me_stat12rhst_110b); |
| WRITE_FRC_REG_BY_CPU(FRC_ME_STAT_12R_HST, regdata_me_stat12rhst_110b); |
| |
| reg_data = (me_blk_xsize * 2 / 4); |
| reg_data |= me_blk_xsize * 1 / 4 << 16; |
| frc_config_reg_value(reg_data, 0x3ff03ff, ®data_me_stat12rh_110c); |
| WRITE_FRC_REG_BY_CPU(FRC_ME_STAT_12R_H01, regdata_me_stat12rh_110c); |
| reg_data = (me_blk_xsize * 4 / 4 - 1); |
| reg_data |= (me_blk_xsize * 3 / 4) << 16; |
| frc_config_reg_value(reg_data, 0xfff0fff, ®data_me_stat12rh_110d); |
| WRITE_FRC_REG_BY_CPU(FRC_ME_STAT_12R_H23, regdata_me_stat12rh_110d); |
| |
| /*reg_me_stat_region_vend[0]: 45*/ |
| /*reg_me_stat_region_vend[1]: 90*/ |
| /*reg_me_stat_region_vend[2]: 135*/ |
| frc_config_reg_value(me_blk_ysize * 1 / 3, 0x3ff03ff, ®data_me_stat12rv_110e); |
| frc_config_reg_value((me_blk_ysize * 2 / 3) << 16, 0x3ff0000, ®data_me_stat12rv_110f); |
| frc_config_reg_value((me_blk_ysize * 3 / 3 - 1), 0x3ff, ®data_me_stat12rv_110f); |
| WRITE_FRC_REG_BY_CPU(FRC_ME_STAT_12R_V0, regdata_me_stat12rv_110e); |
| WRITE_FRC_REG_BY_CPU(FRC_ME_STAT_12R_V1, regdata_me_stat12rv_110f); |
| |
| //vp |
| /*reg_vp_bb_xyxy[2] 240*/ |
| /*reg_vp_bb_xyxy[3] 135*/ |
| frc_config_reg_value((me_blk_ysize - 1) << 16, 0xffff0000, ®data_vpbb2_1e04); |
| frc_config_reg_value((me_blk_xsize - 1), 0xffff, ®data_vpbb2_1e04); |
| WRITE_FRC_REG_BY_CPU(FRC_VP_BB_1, 0x0); |
| WRITE_FRC_REG_BY_CPU(FRC_VP_BB_2, regdata_vpbb2_1e04); |
| |
| /*reg_vp_me_bb_blk_xyxy[2] 240*/ |
| /*reg_vp_me_bb_blk_xyxy[3] 135*/ |
| frc_config_reg_value((me_blk_ysize - 1) << 16, 0xffff0000, ®data_vpmebb2_1e06); |
| frc_config_reg_value((me_blk_xsize - 1), 0xffff, ®data_vpmebb2_1e06); |
| WRITE_FRC_REG_BY_CPU(FRC_VP_ME_BB_1, 0x0); |
| WRITE_FRC_REG_BY_CPU(FRC_VP_ME_BB_2, regdata_vpmebb2_1e06); |
| |
| frc_config_reg_value((me_blk_xsize * 1 / 4) << 8, 0xfffff, ®data_vp_win1_1e58); |
| frc_config_reg_value((me_blk_xsize * 2 / 4) << 20, 0xfff00000, ®data_vp_win1_1e58); |
| frc_config_reg_value((me_blk_xsize * 3 / 4) << 12, 0xfffff000, ®data_vp_win2_1e59); |
| frc_config_reg_value((me_blk_xsize * 4 / 4 - 1), 0xfff, ®data_vp_win2_1e59); |
| frc_config_reg_value((me_blk_ysize * 1 / 3), 0x0ff, ®data_vp_win3_1e5a); |
| frc_config_reg_value((me_blk_ysize * 2 / 3) << 8, 0xfff00, ®data_vp_win3_1e5a); |
| frc_config_reg_value((me_blk_ysize * 3 / 3 - 1) << 20, 0xfff00000, ®data_vp_win3_1e5a); |
| WRITE_FRC_REG_BY_CPU(FRC_VP_REGION_WINDOW_1, regdata_vp_win1_1e58); |
| WRITE_FRC_REG_BY_CPU(FRC_VP_REGION_WINDOW_2, regdata_vp_win2_1e59); |
| WRITE_FRC_REG_BY_CPU(FRC_VP_REGION_WINDOW_3, regdata_vp_win3_1e5a); |
| |
| //mc: |
| WRITE_FRC_REG_BY_CPU(FRC_MC_BB_HANDLE_ME_BLK_BB_XYXY_RIT_AND_BOT, |
| ((me_blk_xsize - 1) << 16) | (me_blk_ysize - 1)); |
| |
| //melogo: |
| /*reg_melogo_bb_blk_xyxy[2] 240*/ |
| /*reg_melogo_bb_blk_xyxy[3] 135*/ |
| WRITE_FRC_REG_BY_CPU(FRC_MELOGO_BB_BLK_ST, 0x0); |
| WRITE_FRC_REG_BY_CPU(FRC_MELOGO_BB_BLK_ED, |
| ((me_blk_xsize - 1) << 16) | (me_blk_ysize - 1)); |
| |
| /*reg_melogo_stat_region_hend[0] 60*/ |
| /*reg_melogo_stat_region_hend[1] 120*/ |
| /*reg_melogo_stat_region_hend[2] 180*/ |
| /*reg_melogo_stat_region_hend[3] 240*/ |
| reg_data = me_blk_xsize * 1 / 4; |
| reg_data |= (me_blk_xsize * 2 / 4) << 16; |
| WRITE_FRC_REG_BY_CPU(FRC_MELOGO_REGION_HWINDOW_0, 0x0); |
| WRITE_FRC_REG_BY_CPU(FRC_MELOGO_REGION_HWINDOW_1, reg_data); |
| reg_data = me_blk_xsize * 3 / 4; |
| reg_data |= (me_blk_xsize * 4 / 4 - 1) << 16; |
| WRITE_FRC_REG_BY_CPU(FRC_MELOGO_REGION_HWINDOW_2, reg_data); |
| |
| /*reg_melogo_stat_region_vend[0] 45*/ |
| /*reg_melogo_stat_region_vend[1] 90*/ |
| /*reg_melogo_stat_region_vend[2] 135*/ |
| reg_data = me_blk_ysize * 1 / 3 << 16; |
| WRITE_FRC_REG_BY_CPU(FRC_MELOGO_REGION_VWINDOW_0, reg_data); |
| reg_data = (me_blk_ysize * 2 / 3); |
| reg_data |= (me_blk_ysize * 3 / 3 - 1) << 16; |
| WRITE_FRC_REG_BY_CPU(FRC_MELOGO_REGION_VWINDOW_1, reg_data); |
| |
| //IPLOGO |
| /*reg_iplogo_bb_xyxy[2] 960*/ |
| /*reg_iplogo_bb_xyxy[3] 540*/ |
| WRITE_FRC_REG_BY_CPU(FRC_IPLOGO_BB_PIX_ST, 0x0); |
| WRITE_FRC_REG_BY_CPU(FRC_IPLOGO_BB_PIX_ED, |
| ((me_width - 1) << 16) | (me_height - 1)); |
| /*reg_iplogo_stat_region_hend[0] 240*/ |
| /*reg_iplogo_stat_region_hend[1] 480*/ |
| /*reg_iplogo_stat_region_hend[2] 720*/ |
| /*reg_iplogo_stat_region_hend[3] 960*/ |
| reg_data = me_blk_xsize * 1 / 4; |
| reg_data |= (me_blk_xsize * 2 / 4) << 16; |
| WRITE_FRC_REG_BY_CPU(FRC_IPLOGO_REGION_HWINDOW_0, 0x0); |
| WRITE_FRC_REG_BY_CPU(FRC_IPLOGO_REGION_HWINDOW_1, reg_data); |
| reg_data = me_blk_xsize * 3 / 4; |
| reg_data |= (me_blk_xsize * 4 / 4 - 1) << 16; |
| WRITE_FRC_REG_BY_CPU(FRC_IPLOGO_REGION_HWINDOW_2, reg_data); |
| /*reg_iplogo_stat_region_vend[0] 180*/ |
| /*reg_iplogo_stat_region_vend[1] 360*/ |
| /*reg_iplogo_stat_region_vend[2] 540*/ |
| reg_data = me_blk_ysize * 1 / 3 << 16; |
| WRITE_FRC_REG_BY_CPU(FRC_IPLOGO_REGION_VWINDOW_0, reg_data); |
| reg_data = (me_blk_ysize * 2 / 3); |
| reg_data |= (me_blk_ysize * 3 / 3 - 1) << 16; |
| WRITE_FRC_REG_BY_CPU(FRC_IPLOGO_REGION_VWINDOW_1, reg_data); |
| |
| WRITE_FRC_REG_BY_CPU(FRC_LOGO_BB_RIT_BOT, |
| gst_frc_top_item->vsize | (gst_frc_top_item->hsize << 16)); |
| } |
| |
| void frc_drv_fw_param_init(u32 frm_hsize, u32 frm_vsize, u32 is_me1mc4) |
| { |
| u32 reg_me_mvx_div_mode; |
| u32 reg_me_mvy_div_mode; |
| u32 reg_demo_window1_en; |
| u32 reg_demo_window2_en; |
| u32 reg_demo_window3_en; |
| u32 reg_demo_window4_en; |
| u32 mc_org_me_bb_2; |
| u32 mc_org_me_bb_3; |
| u32 mc_org_me_blk_bb_2; |
| u32 mc_org_me_blk_bb_3; |
| u32 reg_me_dsx_scale; |
| u32 reg_me_dsy_scale; |
| u32 reg_mc_blksize_xscale; |
| u32 reg_mc_blksize_yscale; |
| u32 reg_mc_mvx_scale; |
| u32 reg_mc_mvy_scale; |
| u32 reg_mc_fetch_size; |
| u32 reg_mc_blk_x; |
| u32 reg_data; |
| // u32 reg_data1; |
| u32 reg_bb_det_top; |
| u32 reg_bb_det_bot; |
| u32 reg_bb_det_lft; |
| u32 reg_bb_det_rit; |
| u32 reg_bb_det_motion_top; |
| u32 reg_bb_det_motion_bot; |
| u32 reg_bb_det_motion_lft; |
| u32 reg_bb_det_motion_rit; |
| u32 bb_mo_ds_2; |
| u32 bb_mo_ds_3; |
| u32 bb_oob_v_2; |
| u32 tmp_reg_value, tmp_reg_value_2; |
| u32 me_mc_x_ratio; |
| u32 me_mc_y_ratio; |
| u32 logo_mc_x_ratio; |
| u32 logo_mc_y_ratio; |
| u32 osd_mc_x_ratio; |
| u32 osd_mc_y_ratio; |
| u32 regdata_bb_xy_st_0119; // FRC_REG_BLACKBAR_XYXY_ST 0x0119 |
| u32 regdata_bb_xy_ed_011a; // FRC_REG_BLACKBAR_XYXY_ED 0x011a |
| u32 regdata_bb_xy_me_st_011b; // FRC_REG_BLACKBAR_XYXY_ME_ST 0x011b |
| u32 regdata_bb_xy_me_ed_011c; // FRC_REG_BLACKBAR_XYXY_ME_ED 0x011c |
| |
| if (is_me1mc4 == 0) { |
| reg_me_dsx_scale = 1; |
| reg_me_dsy_scale = 1; |
| me_mc_x_ratio = 1; |
| me_mc_y_ratio = 1; |
| logo_mc_x_ratio = 1; |
| logo_mc_y_ratio = 1; |
| } else if (is_me1mc4 == 1) { |
| reg_me_dsx_scale = 2; |
| reg_me_dsy_scale = 2; |
| me_mc_x_ratio = 2; |
| me_mc_y_ratio = 2; |
| logo_mc_x_ratio = 2; |
| logo_mc_y_ratio = 2; |
| } else if (is_me1mc4 == 2) { |
| reg_me_dsx_scale = 2; |
| reg_me_dsy_scale = 1; |
| me_mc_x_ratio = 2; |
| me_mc_y_ratio = 1; |
| logo_mc_x_ratio = 2; |
| logo_mc_y_ratio = 1; |
| } else { |
| reg_me_dsx_scale = 1; |
| reg_me_dsy_scale = 2; |
| me_mc_x_ratio = 1; |
| me_mc_y_ratio = 2; |
| logo_mc_x_ratio = 1; |
| logo_mc_y_ratio = 2; |
| } |
| osd_mc_x_ratio = 0; |
| osd_mc_y_ratio = 0; |
| |
| frc_config_reg_value((reg_me_dsx_scale << 6 | reg_me_dsy_scale << 4), |
| 0xf0, ®data_hme_scale_012d); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_ME_SCALE, regdata_hme_scale_012d); |
| |
| frc_config_reg_value((logo_mc_x_ratio << 4 | logo_mc_y_ratio << 2), |
| 0xf << 2, ®data_blkscale_012c); //reg_logo_mc_dsx_ratio | reg_logo_mc_dsy_ratio |
| |
| frc_config_reg_value((logo_mc_x_ratio - osd_mc_x_ratio) << 20 | |
| (logo_mc_y_ratio - osd_mc_y_ratio) << 18, |
| 0xf << 18, ®data_blkscale_012c); //reg_osd_logo_dsx_ratio reg_osd_logo_dsy_ratio |
| |
| frc_config_reg_value(0x1 << 14, 0x3 << 14, ®data_blkscale_012c);//reg_osd_logo_ratio_th |
| |
| WRITE_FRC_REG_BY_CPU(FRC_REG_BLK_SCALE, regdata_blkscale_012c); |
| |
| //reg_me_logo_dsx_ratio reg_me_logo_dsy_ratio |
| // tmp_reg_value = logo_mc_ratio - me_mc_ratio; |
| // tmp_reg_value |= (logo_mc_ratio - me_mc_ratio) << 1; |
| frc_config_reg_value((logo_mc_x_ratio - me_mc_x_ratio) << 25 | |
| (logo_mc_y_ratio - me_mc_y_ratio) << 24, 0x3 << 24, ®data_blksizexy_012b); |
| // frc_config_reg_value(tmp_reg_value<<24, 0x03000000, ®data_blksizexy_012b); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_BLK_SIZE_XY, regdata_blksizexy_012b); |
| |
| reg_me_mvx_div_mode = (regdata_me_en_1100 >> 4) & 0x3; |
| reg_me_mvy_div_mode = (regdata_me_en_1100 >> 0) & 0x3; |
| |
| tmp_reg_value = |
| ((ME_MVY_BIT - 2 + reg_me_mvy_div_mode) - (ME_FINER_HIST_BIT + ME_ROUGH_Y_HIST_BIT)) & 0x7; |
| tmp_reg_value |= |
| ((ME_MVX_BIT - 2 + reg_me_mvx_div_mode) - (ME_FINER_HIST_BIT + ME_ROUGH_X_HIST_BIT)) << 4; |
| WRITE_FRC_REG_BY_CPU(FRC_ME_GMV_CTRL, tmp_reg_value | 0xc00); |
| |
| //reg_region_rp_gmv_mvx_sft |
| //reg_region_rp_gmv_mvy_sft |
| tmp_reg_value = (reg_me_mvy_div_mode + 2) << 14 & 0x1c000; |
| tmp_reg_value |= (reg_me_mvy_div_mode + 2) << 17 & 0xe0000; |
| WRITE_FRC_REG_BY_CPU(FRC_ME_REGION_RP_GMV_2, tmp_reg_value | 0x90400); |
| |
| /* because me_mc_ratio only equal 1 or 2 |
| *if (me_mc_ratio == 2) { |
| * reg_mc_blksize_xscale = 4; |
| * reg_mc_blksize_yscale = 4; |
| * reg_mc_mvx_scale = 2; |
| * reg_mc_mvy_scale = 2; |
| * reg_mc_fetch_size = 9; |
| * reg_mc_blk_x = 16; |
| *} else { |
| * reg_mc_blksize_xscale = 3; |
| * reg_mc_blksize_yscale = 3; |
| * reg_mc_mvx_scale = 1; |
| * reg_mc_mvy_scale = 1; |
| * reg_mc_fetch_size = 5; |
| * reg_mc_blk_x = 8; |
| *} |
| */ |
| if (me_mc_x_ratio == 2) { |
| reg_mc_blksize_xscale = 4; |
| reg_mc_mvx_scale = 2; |
| reg_mc_fetch_size = 9; |
| reg_mc_blk_x = 16; |
| } else { // if (me_mc_x_ratio == 1) |
| reg_mc_blksize_xscale = 3; |
| reg_mc_mvx_scale = 1; |
| reg_mc_fetch_size = 5; |
| reg_mc_blk_x = 8; |
| } |
| /* |
| *else if (me_mc_x_ratio == 0) { |
| * reg_mc_blksize_xscale = 2; |
| * reg_mc_mvx_scale = 0; |
| * reg_mc_fetch_size = 3; |
| * reg_mc_blk_x = 4; |
| *} else if (me_mc_x_ratio == 3) { |
| * reg_mc_blksize_xscale = 5; |
| * reg_mc_mvx_scale = 3; |
| * reg_mc_fetch_size = 17; |
| * reg_mc_blk_x = 32; |
| *} |
| */ |
| |
| if (me_mc_y_ratio == 2) { |
| reg_mc_blksize_yscale = 4; |
| reg_mc_mvy_scale = 2; |
| } else { // if (me_mc_y_ratio == 1) |
| reg_mc_blksize_yscale = 3; |
| reg_mc_mvy_scale = 1; |
| } |
| /* |
| *else if (me_mc_y_ratio == 0) { |
| * reg_mc_blksize_yscale = 2; |
| * reg_mc_mvy_scale = 0; |
| *} else if (me_mc_y_ratio == 3) { |
| * reg_mc_blksize_yscale = 5; |
| * reg_mc_mvy_scale = 3; |
| *} |
| */ |
| tmp_reg_value = reg_mc_blksize_yscale << 6 & 0x01c0; |
| tmp_reg_value |= reg_mc_blksize_xscale << 9 & 0xe00; |
| frc_config_reg_value(tmp_reg_value, 0xfc0, ®data_blkscale_012c); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_BLK_SCALE, regdata_blkscale_012c); |
| |
| tmp_reg_value = reg_mc_mvy_scale & 0xf; |
| tmp_reg_value |= (reg_mc_mvx_scale << 8) & 0xf00; |
| frc_config_reg_value(tmp_reg_value, 0xf0f, ®data_mcset1_3000); |
| WRITE_FRC_REG_BY_CPU(FRC_MC_SETTING1, regdata_mcset1_3000); |
| tmp_reg_value = reg_mc_blk_x & 0x3f; |
| tmp_reg_value |= (reg_mc_fetch_size << 8) & 0x3f00; |
| frc_config_reg_value(tmp_reg_value, 0x3f3f, ®data_mcset2_3001); |
| WRITE_FRC_REG_BY_CPU(FRC_MC_SETTING2, regdata_mcset2_3001); |
| |
| // MC |
| //reg_mc_vsrch_rng_luma reg_mc_vsrch_rng_chrm |
| tmp_reg_value = MAX_MC_C_VRANG; |
| tmp_reg_value |= (MAX_MC_Y_VRANG << 8) & 0xff00; |
| WRITE_FRC_REG_BY_CPU(FRC_NOW_SRCH_REG, tmp_reg_value | 0x20200000); // 0x308e, 0x2020a0a0 |
| |
| // bbd |
| reg_bb_det_top = 0; |
| reg_bb_det_bot = frm_vsize - 1; |
| reg_bb_det_lft = 0; |
| reg_bb_det_rit = frm_hsize - 1; |
| |
| regdata_bbd_t2b_0604 = reg_bb_det_bot; |
| regdata_bbd_t2b_0604 |= reg_bb_det_top << 16; |
| WRITE_FRC_REG_BY_CPU(FRC_BBD_DETECT_REGION_TOP2BOT, regdata_bbd_t2b_0604); |
| regdata_bbd_l2r_0605 = reg_bb_det_rit; |
| regdata_bbd_l2r_0605 |= reg_bb_det_lft << 16; |
| WRITE_FRC_REG_BY_CPU(FRC_BBD_DETECT_REGION_LFT2RIT, regdata_bbd_l2r_0605); |
| |
| reg_bb_det_motion_top = reg_bb_det_top >> reg_me_dsy_scale; |
| reg_bb_det_motion_bot = ((reg_bb_det_bot + 1) >> reg_me_dsy_scale) - 1; |
| reg_bb_det_motion_lft = reg_bb_det_lft >> reg_me_dsx_scale; |
| reg_bb_det_motion_rit = ((reg_bb_det_rit + 1) >> reg_me_dsx_scale) - 1; |
| |
| // reg_bb_det_motion_top _bot _lft _rit |
| tmp_reg_value = reg_bb_det_motion_bot; |
| tmp_reg_value |= reg_bb_det_motion_top << 16; |
| WRITE_FRC_REG_BY_CPU(FRC_BBD_DETECT_MOTION_REGION_TOP2BOT, tmp_reg_value); |
| tmp_reg_value_2 = reg_bb_det_motion_rit; |
| tmp_reg_value_2 |= reg_bb_det_motion_lft << 16; |
| WRITE_FRC_REG_BY_CPU(FRC_BBD_DETECT_MOTION_REGION_LFT2RIT, tmp_reg_value_2); |
| |
| // TODO.... |
| //reg_bb_det_detail_h_top _h_bot _h_lft _h_rit |
| // pr_frc(0, "FRC_BBD_DETECT_DETAIL_H_TOP2BOT(0x0606):%08x\n", regdata_bbd_t2b_0604); |
| WRITE_FRC_REG_BY_CPU(FRC_BBD_DETECT_DETAIL_H_TOP2BOT, regdata_bbd_t2b_0604); |
| WRITE_FRC_REG_BY_CPU(FRC_BBD_DETECT_DETAIL_H_LFT2RIT, regdata_bbd_l2r_0605); |
| |
| // reg_bb_det_detail_v_top _v_bot _v_lft _v_rit |
| WRITE_FRC_REG_BY_CPU(FRC_BBD_DETECT_DETAIL_V_TOP2BOT, regdata_bbd_t2b_0604); |
| WRITE_FRC_REG_BY_CPU(FRC_BBD_DETECT_DETAIL_V_LFT2RIT, tmp_reg_value_2); // to check |
| |
| //reg_debug_top/bot/lft/rit_motion_posi2 |
| WRITE_FRC_REG_BY_CPU(FRC_REG_DEBUG_PATH_TOP_BOT_MOTION_POSI2, regdata_bbd_t2b_0604); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_DEBUG_PATH_LFT_RIT_MOTION_POSI2, regdata_bbd_l2r_0605); |
| |
| //reg_debug_top/bot/lft/rit_motion_posi1 |
| WRITE_FRC_REG_BY_CPU(FRC_REG_DEBUG_PATH_TOP_BOT_MOTION_POSI1, regdata_bbd_t2b_0604); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_DEBUG_PATH_LFT_RIT_MOTION_POSI1, regdata_bbd_l2r_0605); |
| |
| //reg_debug_top/bot/lft/rit_edge_posi2 |
| WRITE_FRC_REG_BY_CPU(FRC_REG_DEBUG_PATH_TOP_BOT_EDGE_POSI2, regdata_bbd_t2b_0604); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_DEBUG_PATH_LFT_RIT_EDGE_POSI2, regdata_bbd_l2r_0605); |
| |
| //reg_debug_top/bot/lft/rit_edge_posi1 |
| WRITE_FRC_REG_BY_CPU(FRC_REG_DEBUG_PATH_TOP_BOT_EDGE_POSI1, regdata_bbd_t2b_0604); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_DEBUG_PATH_LFT_RIT_EDGE_POSI1, regdata_bbd_l2r_0605); |
| |
| // black bar location (will be changed oframe base by fw algorithm) |
| //reg_blackbar_xyxy_0 _xyxy_1 _xyxy_2 _xyxy_3 |
| regdata_bb_xy_st_0119 = reg_bb_det_top; |
| regdata_bb_xy_st_0119 |= (reg_bb_det_lft << 16); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_BLACKBAR_XYXY_ST, regdata_bb_xy_st_0119); |
| regdata_bb_xy_ed_011a = reg_bb_det_bot; |
| regdata_bb_xy_ed_011a |= (reg_bb_det_rit << 16); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_BLACKBAR_XYXY_ED, regdata_bb_xy_ed_011a); |
| |
| //reg_blackbar_xyxy_me_0 |
| regdata_bb_xy_me_st_011b = reg_bb_det_top; |
| regdata_bb_xy_me_st_011b |= (reg_bb_det_lft << 16); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_BLACKBAR_XYXY_ME_ST, regdata_bb_xy_me_st_011b); |
| regdata_bb_xy_me_ed_011c = reg_bb_det_bot; |
| regdata_bb_xy_me_ed_011c |= (reg_bb_det_rit << 16); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_BLACKBAR_XYXY_ME_ED, regdata_bb_xy_me_ed_011c); |
| |
| // TODO: related to mc registers?? |
| // reg_data = READ_FRC_REG(FRC_MC_DEMO_WINDOW); |
| reg_data = regdata_mcdemo_win_3200; |
| reg_demo_window1_en = (reg_data >> 3) & 0x1; |
| reg_demo_window2_en = (reg_data >> 2) & 0x1; |
| reg_demo_window3_en = (reg_data >> 1) & 0x1; |
| reg_demo_window4_en = reg_data & 0x1; |
| if (reg_demo_window1_en) { |
| // WRITE_FRC_REG_BY_CPU(FRC_REG_DEMOWINDOW1_XYXY_ST, (frm_hsize>>1)<<16); |
| // WRITE_FRC_REG_BY_CPU(FRC_REG_DEMOWINDOW1_XYXY_ED, (frm_vsize-1) | (frm_hsize-1)<<16); |
| } |
| if (reg_demo_window2_en) { |
| //reg_demowindow2_xyxy_0 |
| // WRITE_FRC_REG_BY_CPU(FRC_REG_DEMOWINDOW2_XYXY_ST, (frm_hsize>>1)<<16); |
| // WRITE_FRC_REG_BY_CPU(FRC_REG_DEMOWINDOW2_XYXY_ED, (frm_vsize-1) | (frm_hsize-1)<<16); |
| } |
| if (reg_demo_window3_en) { |
| //reg_demowindow3_xyxy_0 |
| //WRITE_FRC_REG_BY_CPU(FRC_REG_DEMOWINDOW3_XYXY_ST, (frm_hsize>>1)<<16); |
| // WRITE_FRC_REG_BY_CPU(FRC_REG_DEMOWINDOW3_XYXY_ED, (frm_vsize-1) | (frm_hsize-1)<<16); |
| } |
| if (reg_demo_window4_en) { |
| //reg_demowindow4_xyxy_0 |
| // WRITE_FRC_REG_BY_CPU(FRC_REG_DEMOWINDOW4_XYXY_ST, (frm_hsize>>1)<<16); |
| // WRITE_FRC_REG_BY_CPU(FRC_REG_DEMOWINDOW4_XYXY_ED, (frm_vsize-1) | (frm_hsize-1)<<16); |
| } |
| //reg_bb_ds_xyxy_0 _xyxy_1 |
| WRITE_FRC_REG_BY_CPU(FRC_REG_DS_WIN_SETTING_LFT_TOP, 0); |
| //reg_bb_ds_xyxy_2 xyxy_3 |
| WRITE_FRC_REG_BY_CPU(FRC_BBD_DS_WIN_SETTING_RIT_BOT, |
| (frm_vsize - 1) | (frm_hsize - 1) << 16); |
| |
| //reg_mc_org_me_bb_xyxy_0 xyxy_1 |
| WRITE_FRC_REG_BY_CPU(FRC_MC_BB_HANDLE_ORG_ME_BB_XYXY_LEFT_TOP, 0); |
| |
| regdata_hme_scale_012d = READ_FRC_REG(FRC_REG_ME_SCALE); |
| mc_org_me_bb_2 = (regdata_hme_scale_012d >> 6) & 0x3; |
| mc_org_me_bb_3 = (regdata_hme_scale_012d >> 4) & 0x3; |
| //reg_mc_org_me_bb_xyxy_2 xyxy_3 |
| tmp_reg_value = (frm_vsize >> mc_org_me_bb_3) - 1; |
| tmp_reg_value |= ((tmp_reg_value >> mc_org_me_bb_2) - 1) << 16; |
| WRITE_FRC_REG_BY_CPU(FRC_MC_BB_HANDLE_ORG_ME_BB_XYXY_RIGHT_BOT, tmp_reg_value); |
| //reg_mc_org_me_blk_bb_xyxy_0/1 |
| WRITE_FRC_REG_BY_CPU(FRC_MC_BB_HANDLE_ORG_ME_BLK_BB_XYXY_LFT_AND_TOP, 0); |
| |
| regdata_blksizexy_012b = READ_FRC_REG(FRC_REG_BLK_SIZE_XY); |
| mc_org_me_blk_bb_2 = (regdata_blksizexy_012b >> 19) & 0x7; |
| mc_org_me_blk_bb_3 = (regdata_blksizexy_012b >> 16) & 0x7; |
| //reg_mc_org_me_blk_bb_xyxy_2/3 |
| tmp_reg_value = ((frm_vsize >> mc_org_me_bb_3) >> mc_org_me_blk_bb_3) - 1; |
| tmp_reg_value |= (((frm_hsize >> mc_org_me_bb_2) >> mc_org_me_blk_bb_2) - 1) << 16; |
| WRITE_FRC_REG_BY_CPU(FRC_MC_BB_HANDLE_ORG_ME_BLK_BB_XYXY_RIT_AND_BOT, tmp_reg_value); |
| |
| tmp_reg_value = reg_bb_det_top; |
| tmp_reg_value |= (reg_bb_det_lft << 16); |
| tmp_reg_value_2 = reg_bb_det_bot; |
| tmp_reg_value_2 |= (reg_bb_det_rit << 16); |
| |
| //reg_bb_apl_hist_xyxy_0/1/2/3 |
| WRITE_FRC_REG_BY_CPU(FRC_BBD_APL_HIST_WIN_LFT_TOP, tmp_reg_value); |
| WRITE_FRC_REG_BY_CPU(FRC_BBD_APL_HIST_WIN_RIT_BOT, tmp_reg_value_2); |
| |
| //reg_bb_oob_apl_xyxy_0/1/2/3 |
| WRITE_FRC_REG_BY_CPU(FRC_BBD_OOB_APL_CAL_LFT_TOP_RANGE, tmp_reg_value); |
| WRITE_FRC_REG_BY_CPU(FRC_BBD_OOB_APL_CAL_RIT_BOT_RANGE, tmp_reg_value_2); |
| |
| //reg_bb_oob_h_detail_xyxy_0/1/2/3 |
| WRITE_FRC_REG_BY_CPU(FRC_BBD_OOB_DETAIL_WIN_LFT_TOP, tmp_reg_value); |
| WRITE_FRC_REG_BY_CPU(FRC_BBD_OOB_DETAIL_WIN_RIT_BOT, tmp_reg_value_2); |
| |
| bb_mo_ds_2 = MIN((frm_hsize >> mc_org_me_bb_2) - 1, (reg_bb_det_rit >> mc_org_me_bb_2)); |
| bb_mo_ds_3 = MIN((frm_vsize >> mc_org_me_bb_3) - 1, (reg_bb_det_bot >> mc_org_me_bb_3)); |
| //reg_bb_motion_xyxy_ds_0/1/2/3 |
| tmp_reg_value = reg_bb_det_top >> mc_org_me_bb_3; |
| tmp_reg_value |= (reg_bb_det_lft >> mc_org_me_bb_2) << 16; |
| tmp_reg_value_2 = bb_mo_ds_3; |
| tmp_reg_value_2 |= bb_mo_ds_2 << 16; |
| WRITE_FRC_REG_BY_CPU(FRC_BBD_MOTION_DETEC_REGION_LFT_TOP_DS, tmp_reg_value); |
| WRITE_FRC_REG_BY_CPU(FRC_BBD_MOTION_DETEC_REGION_RIT_BOT_DS, tmp_reg_value_2); |
| |
| bb_oob_v_2 = MIN((frm_hsize >> mc_org_me_bb_2) - 1, (reg_bb_det_rit >> mc_org_me_bb_2)); |
| //reg_bb_oob_v_detail_xyxy_0/1/2/3 |
| tmp_reg_value = reg_bb_det_top; |
| tmp_reg_value |= (reg_bb_det_lft >> mc_org_me_bb_2) << 16; |
| tmp_reg_value_2 = reg_bb_det_bot; |
| tmp_reg_value_2 |= bb_oob_v_2 << 16; |
| WRITE_FRC_REG_BY_CPU(FRC_BBD_OOB_V_DETAIL_WIN_LFT_TOP, tmp_reg_value); |
| WRITE_FRC_REG_BY_CPU(FRC_BBD_OOB_V_DETAIL_WIN_RIT_BOT, tmp_reg_value_2); |
| |
| //reg_bb_flat_xyxy_0/1/2/3 |
| WRITE_FRC_REG_BY_CPU(FRC_BBD_FLATNESS_DETEC_REGION_LFT_TOP, |
| reg_bb_det_top | (reg_bb_det_lft << 16)); |
| WRITE_FRC_REG_BY_CPU(FRC_BBD_FLATNESS_DETEC_REGION_RIT_BOT, |
| reg_bb_det_bot | (reg_bb_det_rit << 16)); |
| } |
| |
| void frc_top_init(struct frc_dev_s *frc_devp) |
| { |
| ////Config frc ctrl timming |
| u32 me_hold_line;//me_hold_line |
| u32 mc_hold_line;//mc_hold_line |
| u32 inp_hold_line; |
| u32 reg_post_dly_vofst;//fixed |
| u32 reg_mc_dly_vofst0 ;//fixed |
| u32 reg_mc_out_line; |
| u32 reg_me_dly_vofst; |
| u32 mevp_frm_dly;//Read RO ro_mevp_dly_num |
| u32 mc_frm_dly;//Read RO ro_mc2out_dly_num |
| u32 memc_frm_dly;//total delay |
| u32 reg_mc_dly_vofst1; |
| u32 log = 2; |
| u32 tmpvalue; |
| u32 tmpvalue2; |
| u32 frc_v_porch; |
| u32 frc_vporch_cal; |
| u32 frc_porch_delta; |
| u32 adj_mc_dly; |
| u32 out_frm_dly_num; |
| enum chip_id chip; |
| |
| struct frc_fw_data_s *fw_data; |
| struct frc_top_type_s *frc_top; |
| |
| fw_data = (struct frc_fw_data_s *)frc_devp->fw_data; |
| frc_top = &fw_data->frc_top_type; |
| |
| regdata_outholdctl_0003 = READ_FRC_REG(FRC_OUT_HOLD_CTRL); |
| regdata_inpholdctl_0002 = READ_FRC_REG(FRC_INP_HOLD_CTRL); |
| |
| me_hold_line = regdata_outholdctl_0003 & 0xff; |
| mc_hold_line = (regdata_outholdctl_0003 >> 8) & 0xff; |
| inp_hold_line = regdata_inpholdctl_0002 & 0x1fff; |
| |
| fw_data->holdline_parm.me_hold_line = me_hold_line; |
| fw_data->holdline_parm.mc_hold_line = mc_hold_line; |
| fw_data->holdline_parm.inp_hold_line = inp_hold_line; |
| |
| reg_post_dly_vofst = fw_data->holdline_parm.reg_post_dly_vofst; |
| reg_mc_dly_vofst0 = fw_data->holdline_parm.reg_mc_dly_vofst0; |
| chip = get_chip_type(); |
| |
| frc_input_init(frc_devp, frc_top); |
| config_phs_lut(frc_top->frc_ratio_mode, frc_top->film_mode); |
| config_phs_regs(frc_top->frc_ratio_mode, frc_top->film_mode); |
| pr_frc(log, "%s\n", __func__); |
| // Config frc input size & vpu register |
| if (chip == ID_T3X) { |
| //if (frc_top->frc_ratio_mode == FRC_RATIO_1_2) |
| // tmpvalue = (frc_top->hsize + 15) & 0xFFF0; |
| //else |
| // tmpvalue = frc_top->hsize; |
| tmpvalue = frc_top->hsize; |
| tmpvalue |= (frc_top->vsize) << 16; |
| WRITE_FRC_REG_BY_CPU(FRC_FRAME_SIZE, tmpvalue); |
| frc_top->vfb = |
| (vpu_reg_read(ENCL_VIDEO_VAVON_BLINE_T3X) >> 16) & 0xffff; |
| } else { |
| tmpvalue = frc_top->hsize; |
| tmpvalue |= (frc_top->vsize) << 16; |
| WRITE_FRC_REG_BY_CPU(FRC_FRAME_SIZE, tmpvalue); |
| frc_top->vfb = vpu_reg_read(ENCL_VIDEO_VAVON_BLINE); |
| } |
| pr_frc(log, "ENCL_VIDEO_VAVON_BLINE:%d\n", frc_top->vfb); |
| |
| // frc_win_align_apply(frc_devp, frc_top); |
| |
| //(frc_top->vfb / 4) * 3; 3/4 point of front vblank, default |
| reg_mc_out_line = frc_init_out_line(); |
| adj_mc_dly = frc_devp->out_line; // from user debug |
| |
| // reg_me_dly_vofst = reg_mc_out_line; |
| reg_me_dly_vofst = reg_mc_dly_vofst0; // change for keep me first run |
| if (frc_top->hsize <= 1920 && (frc_top->hsize * frc_top->vsize <= 1920 * 1080)) { |
| frc_top->is_me1mc4 = 0;/*me:mc 1:2*/ |
| if (frc_top->hsize * frc_top->vsize == 1920 * 1080) { |
| WRITE_FRC_REG_BY_CPU(FRC_INPUT_SIZE_ALIGN, 0x0); //8*8 align |
| } else { |
| WRITE_FRC_REG_BY_CPU(FRC_INPUT_SIZE_ALIGN, 0x3); //16*16 align |
| } |
| } else { |
| frc_top->is_me1mc4 = 1;/*me:mc 1:4*/ |
| WRITE_FRC_REG_BY_CPU(FRC_INPUT_SIZE_ALIGN, 0x3); //16*16 align |
| } |
| // little window |
| if (frc_top->hsize * frc_top->vsize < |
| frc_top->out_hsize * frc_top->out_vsize && |
| frc_top->out_hsize * frc_top->out_vsize >= 3840 * 1080) { |
| frc_top->is_me1mc4 = 1;/*me:mc 1:4*/ |
| WRITE_FRC_REG_BY_CPU(FRC_INPUT_SIZE_ALIGN, 0x3); //16*16 align |
| pr_frc(log, "me:mc 1:4\n"); |
| if (frc_top->hsize < WIDTH_2K && frc_top->out_hsize == WIDTH_4K) |
| frc_devp->little_win = 1; |
| } else if (chip == ID_T3X) { |
| //if (frc_devp->out_sts.out_framerate > 80) |
| // frc_devp->ud_dbg.res2_dbg_en = 0; |
| //else |
| // frc_devp->ud_dbg.res2_dbg_en = 1; |
| } else { |
| frc_devp->ud_dbg.res2_dbg_en = 3; |
| } |
| /*The resolution of the input is not standard for test |
| * input size adjust within 8 lines and output size > 1920 * 1080 |
| * default FRC_PARAM_NUM: 8 adjustable |
| */ |
| if (!frc_devp->in_sts.inp_size_adj_en && |
| frc_top->out_hsize - FRC_PARAM_NUM < frc_top->hsize && |
| frc_top->hsize <= frc_top->out_hsize && |
| frc_top->out_vsize - FRC_PARAM_NUM < frc_top->vsize && |
| frc_top->vsize < frc_top->out_vsize && |
| frc_top->out_hsize * frc_top->out_vsize >= 1920 * 1080) { |
| frc_top->is_me1mc4 = 1;/*me:mc 1:4*/ |
| WRITE_FRC_REG_BY_CPU(FRC_INPUT_SIZE_ALIGN, 0x0); //8*8 align |
| pr_frc(log, " %s this input case is not standard\n", __func__); |
| } |
| |
| if (frc_top->out_hsize == 1920 && frc_top->out_vsize == 1080) { |
| // mevp_frm_dly = 110; |
| // mc_frm_dly = 5; |
| //inp performace issue, need frc_clk > enc0_clk |
| mevp_frm_dly = frc_devp->frm_dly_set[0].mevp_frm_dly; |
| mc_frm_dly = frc_devp->frm_dly_set[0].mc_frm_dly; |
| } else if (frc_top->out_hsize == 3840 && frc_top->out_vsize == 2160) { |
| //mevp_frm_dly = 222; // reg readback under 333MHz |
| //mc_frm_dly = 28; // reg readback (14) under 333MHz |
| // mevp_frm_dly = 260; // under 400MHz |
| // mc_frm_dly = 28; // under 400MHz |
| if (frc_devp->out_sts.out_framerate > 80) { // 4k2k-120Hz |
| mevp_frm_dly = frc_devp->frm_dly_set[3].mevp_frm_dly; |
| mc_frm_dly = frc_devp->frm_dly_set[3].mc_frm_dly; |
| } else { |
| mevp_frm_dly = frc_devp->frm_dly_set[1].mevp_frm_dly; |
| mc_frm_dly = frc_devp->frm_dly_set[1].mc_frm_dly; |
| } |
| } else if (frc_top->out_hsize == 3840 && frc_top->out_vsize == 1080) { |
| reg_mc_out_line = (frc_top->vfb / 2) * 1; |
| reg_me_dly_vofst = reg_mc_out_line; |
| //mevp_frm_dly = 222; // reg readback under 333MHz |
| //mc_frm_dly = 20; // reg readback (34) under 333MHz |
| mevp_frm_dly = frc_devp->frm_dly_set[2].mevp_frm_dly; |
| mc_frm_dly = frc_devp->frm_dly_set[2].mc_frm_dly; |
| pr_frc(log, "4k1k_mc_frm_dly:%d\n", mc_frm_dly); |
| //if (chip == ID_T3X) |
| // frc_top->is_me1mc4 = 2; |
| } else { |
| //mevp_frm_dly = 140; |
| //mc_frm_dly = 10; |
| mevp_frm_dly = frc_devp->frm_dly_set[3].mevp_frm_dly; |
| mc_frm_dly = frc_devp->frm_dly_set[3].mc_frm_dly; |
| } |
| //memc_frm_dly |
| memc_frm_dly = reg_me_dly_vofst + me_hold_line + mevp_frm_dly + |
| mc_frm_dly + mc_hold_line + adj_mc_dly; |
| reg_mc_dly_vofst1 = memc_frm_dly - mc_frm_dly - mc_hold_line ; |
| frc_vporch_cal = memc_frm_dly - reg_mc_out_line; |
| |
| /*bug only for T3*/ |
| if (chip == ID_T3) |
| WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL27, frc_vporch_cal); |
| |
| if (chip == ID_T3 && is_meson_rev_a()) { |
| if ((frc_top->out_hsize > 1920 && frc_top->out_vsize > 1080) || |
| (frc_top->out_hsize == 3840 && frc_top->out_vsize == 1080 && |
| frc_devp->out_sts.out_framerate > 80)) { |
| /* |
| * MEMC 4K ENCL setting, vlock will change the ENCL_VIDEO_MAX_LNCNT, |
| * so need dynamic change this register |
| */ |
| //u32 frc_v_porch = vpu_reg_read(ENCL_FRC_CTRL);/*0x1cdd*/ |
| u32 max_lncnt = vpu_reg_read(ENCL_VIDEO_MAX_LNCNT);/*0x1cbb*/ |
| u32 max_pxcnt = vpu_reg_read(ENCL_VIDEO_MAX_PXCNT);/*0x1cb0*/ |
| |
| pr_frc(log, "max_lncnt=%d max_pxcnt=%d\n", max_lncnt, max_pxcnt); |
| |
| //frc_v_porch = max_lncnt > 1800 ? max_lncnt - 1800 : frc_vporch_cal; |
| frc_v_porch = ((max_lncnt - frc_vporch_cal) <= 1950) ? |
| frc_vporch_cal : (max_lncnt - 1950); |
| |
| gst_frc_param.frc_v_porch = frc_v_porch; |
| gst_frc_param.max_lncnt = max_lncnt; |
| gst_frc_param.max_pxcnt = max_pxcnt; |
| gst_frc_param.frc_mcfixlines = |
| mc_frm_dly + mc_hold_line - reg_mc_out_line; |
| if (mc_frm_dly + mc_hold_line < reg_mc_out_line) |
| gst_frc_param.frc_mcfixlines = 0; |
| if (frc_devp->vlock_flag == 1) { |
| gst_frc_param.s2l_en = 0; |
| frc_devp->vlock_flag = 0; |
| } else { |
| gst_frc_param.s2l_en = 1; |
| } |
| if (vlock_sync_frc_vporch(gst_frc_param) < 0) |
| PR_ERR("frc_infrom vlock fail, check vlock st!\n"); |
| else |
| pr_frc(0, "frc_on_set maxlnct success!!!\n"); |
| |
| //vpu_reg_write(ENCL_SYNC_TO_LINE_EN, |
| // (1 << 13) | (max_lncnt - frc_v_porch)); |
| //vpu_reg_write(ENCL_SYNC_LINE_LENGTH, max_lncnt - frc_v_porch - 1); |
| //vpu_reg_write(ENCL_SYNC_PIXEL_EN, (1 << 15) | (max_pxcnt - 1)); |
| |
| pr_frc(log, "ENCL_SYNC_TO_LINE_EN=0x%x\n", |
| vpu_reg_read(ENCL_SYNC_TO_LINE_EN)); |
| pr_frc(log, "ENCL_SYNC_PIXEL_EN=0x%x\n", |
| vpu_reg_read(ENCL_SYNC_PIXEL_EN)); |
| pr_frc(log, "ENCL_SYNC_LINE_LENGTH=0x%x\n", |
| vpu_reg_read(ENCL_SYNC_LINE_LENGTH)); |
| } else { |
| frc_v_porch = frc_vporch_cal; |
| gst_frc_param.frc_mcfixlines = |
| mc_frm_dly + mc_hold_line - reg_mc_out_line; |
| if (mc_frm_dly + mc_hold_line < reg_mc_out_line) |
| gst_frc_param.frc_mcfixlines = 0; |
| gst_frc_param.s2l_en = 0; |
| if (vlock_sync_frc_vporch(gst_frc_param) < 0) |
| PR_ERR("frc_infrom vlock fail, check vlock st!\n"); |
| else |
| pr_frc(1, "frc_infrom vlock success!!!\n"); |
| } |
| frc_porch_delta = frc_v_porch - frc_vporch_cal; |
| pr_frc(log, "frc_v_porch=%d frc_porch_delta=%d\n", |
| frc_v_porch, frc_porch_delta); |
| vpu_reg_write_bits(ENCL_FRC_CTRL, frc_v_porch, 0, 16); |
| tmpvalue = (reg_post_dly_vofst + frc_porch_delta); |
| tmpvalue |= (reg_me_dly_vofst + frc_porch_delta) << 16; |
| WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL14, tmpvalue); |
| tmpvalue2 = (reg_mc_dly_vofst0 + frc_porch_delta); |
| tmpvalue2 |= (reg_mc_dly_vofst1 + frc_porch_delta) << 16; |
| WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL15, tmpvalue2); |
| } else { |
| /*T3 revB,t5m,t3x*/ |
| frc_v_porch = frc_vporch_cal; |
| pr_frc(2, "%s t3b/t5m/t3x inform vlock\n", __func__); |
| gst_frc_param.frc_mcfixlines = |
| mc_frm_dly + mc_hold_line - reg_mc_out_line; |
| if (mc_frm_dly + mc_hold_line < reg_mc_out_line) |
| gst_frc_param.frc_mcfixlines = 0; |
| gst_frc_param.s2l_en = 2; /* rev B chip*/ |
| if (vlock_sync_frc_vporch(gst_frc_param) < 0) |
| PR_ERR("frc_infrom vlock fail, check vlock st!\n"); |
| else |
| pr_frc(1, "frc_infrom vlock success!!!\n"); |
| if (chip == ID_T3X) |
| vpu_reg_write_bits(ENCL_FRC_CTRL_T3X, |
| memc_frm_dly - reg_mc_out_line, 0, 16); |
| else |
| vpu_reg_write_bits(ENCL_FRC_CTRL, memc_frm_dly - reg_mc_out_line, 0, 16); |
| // WRITE_FRC_BITS(FRC_REG_TOP_CTRL14, reg_post_dly_vofst, 0, 16); |
| // WRITE_FRC_BITS(FRC_REG_TOP_CTRL14, reg_me_dly_vofst, 16, 16); |
| // WRITE_FRC_BITS(FRC_REG_TOP_CTRL15, reg_mc_dly_vofst0, 0, 16); |
| // WRITE_FRC_BITS(FRC_REG_TOP_CTRL15, reg_mc_dly_vofst1, 16, 16); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL14, |
| reg_post_dly_vofst | (reg_me_dly_vofst << 16)); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL15, |
| reg_mc_dly_vofst0 | (reg_mc_dly_vofst1 << 16)); |
| } |
| pr_frc(log, "reg_mc_out_line = %d\n", reg_mc_out_line); |
| pr_frc(log, "me_hold_line = %d\n", me_hold_line); |
| pr_frc(log, "mc_hold_line = %d\n", mc_hold_line); |
| pr_frc(log, "mevp_frm_dly = %d\n", mevp_frm_dly); |
| pr_frc(log, "adj_mc_dly = %d\n", adj_mc_dly); |
| pr_frc(log, "mc_frm_dly = %d\n", mc_frm_dly); |
| pr_frc(log, "memc_frm_dly = %d\n", memc_frm_dly); |
| pr_frc(log, "reg_mc_dly_vofst1 = %d\n", reg_mc_dly_vofst1); |
| pr_frc(log, "frc_ratio_mode = %d\n", frc_top->frc_ratio_mode); |
| pr_frc(log, "frc_fb_num = %d\n", frc_top->frc_fb_num); |
| |
| if (chip >= ID_T3X && frc_devp->no_ko_mode == 1) { |
| frc_drv_bbd_init_xyxy(fw_data); |
| frc_drv_fw_param_init(frc_top->hsize, frc_top->vsize, frc_top->is_me1mc4); |
| } |
| |
| /*T5M n2m change*/ |
| out_frm_dly_num = 0; |
| if ((frc_devp->control_0 & BIT_3) && chip == ID_T5M) { |
| if (frc_devp->in_out_ratio == FRC_RATIO_1_1) |
| out_frm_dly_num = 0x03000000; |
| regdata_top_ctl_0009 = READ_FRC_REG(FRC_REG_TOP_CTRL9); |
| if ((regdata_top_ctl_0009 & 0x0F000000) != out_frm_dly_num) { |
| frc_config_reg_value(out_frm_dly_num, 0x0F000000, |
| ®data_top_ctl_0009); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL9, regdata_top_ctl_0009); |
| } |
| } |
| } |
| |
| /*buffer number can dynamic kmalloc, film_hwfw_sel ????*/ |
| void frc_inp_init(void) |
| { |
| u32 offset = 0x0; |
| enum chip_id chip; |
| |
| chip = get_chip_type(); |
| |
| if (chip == ID_T3) |
| offset = 0xa0; |
| else if (chip == ID_T5M || chip == ID_T3X) |
| offset = 0x0; |
| |
| WRITE_FRC_REG_BY_CPU(FRC_MC_PRB_CTRL1, 0x00640164); // bit8 set 1 close reg_mc_probe_en |
| |
| // WRITE_FRC_BITS(FRC_REG_INP_MODULE_EN + offset, 1, 5, 1);//close reg_inp_logo_en |
| // WRITE_FRC_BITS(FRC_REG_INP_MODULE_EN + offset, 1, 8, 1);//open |
| // WRITE_FRC_BITS(FRC_REG_INP_MODULE_EN + offset, 1, 7, 1);//open bbd en |
| regdata_inpmoden_04f9 = READ_FRC_REG(FRC_REG_INP_MODULE_EN + offset); |
| // frc_config_reg_value((BIT_5 + BIT_7 + BIT_8), (BIT_5 + BIT_7 + BIT_8), |
| // ®data_inpmoden_04f9); |
| frc_config_reg_value((BIT_7 + BIT_8), (BIT_5 + BIT_7 + BIT_8), |
| ®data_inpmoden_04f9); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_INP_MODULE_EN + offset, regdata_inpmoden_04f9); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL25, 0x4080200); //aligned padding value |
| |
| // WRITE_FRC_BITS(FRC_MEVP_CTRL0, 0, 0, 1);//close hme |
| WRITE_FRC_REG_BY_CPU(FRC_MEVP_CTRL0, 0xe); //close hme |
| |
| /*for fw signal latch, should always enable*/ |
| //WRITE_FRC_BITS(FRC_REG_MODE_OPT, 1, 1, 1); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_MODE_OPT, 0x02); |
| } |
| |
| void config_phs_lut(enum frc_ratio_mode_type frc_ratio_mode, |
| enum en_drv_film_mode film_mode) |
| { |
| #define lut_ary_size 18 |
| u32 input_n; |
| u32 tmpregdata; |
| u32 output_m; |
| u64 phs_lut_table[lut_ary_size]; |
| int i; |
| |
| for (i = 0; i < lut_ary_size; i++) |
| phs_lut_table[i] = 0xffffffffffffffff; |
| |
| if (frc_ratio_mode == FRC_RATIO_1_2) { |
| //phs_st plog_dif clog_dif pfrm_dif cfrm_dif nfrm_dif mc_ph me_ph film_ph frc_ph |
| if (film_mode == EN_DRV_VIDEO) { |
| //phs_lut_table[0] = {1'h1,4'h3,4'h2,4'h3,4'h2,4'h1,8'h00,8'h40,8'h00,8'h00}; |
| //phs_lut_table[1] = {1'h0,4'h3,4'h2,4'h3,4'h2,4'h1,8'h40,8'h40,8'h00,8'h01}; |
| phs_lut_table[0] = 0x13232100400000; |
| phs_lut_table[1] = 0x03232140400001; |
| } else if (film_mode == EN_DRV_FILM22) { |
| //cadence = 22_1/2 |
| //phs_lut_table[0] = {1'h1,4'h4,4'h3,4'h4,4'h3,4'h1,8'h00,8'h20,8'h01,8'h00}; |
| //phs_lut_table[1] = {1'h0,4'h4,4'h3,4'h4,4'h3,4'h1,8'h20,8'h20,8'h02,8'h01}; |
| //phs_lut_table[2] = {1'h0,4'h5,4'h3,4'h5,4'h3,4'h2,8'h40,8'h40,8'h03,8'h00}; |
| //phs_lut_table[3] = {1'h0,4'h5,4'h3,4'h5,4'h3,4'h2,8'h60,8'h60,8'h00,8'h01}; |
| phs_lut_table[0] = 0x14343100200100; |
| phs_lut_table[1] = 0x04343120200201; |
| phs_lut_table[2] = 0x05353240400300; |
| phs_lut_table[3] = 0x05353260600001; |
| } else if (film_mode == EN_DRV_FILM32) { |
| //cadence = 32_1/2,table_cnt= 10,match_data=0x14 |
| //mem[0]={ 1'd1, 4'd3, 4'd2, 4'd5, 4'd4, 4'd1, 8'd0, 8'd25, 8'd1, 8'd0}; |
| //mem[1]={ 1'd0, 4'd3, 4'd2, 4'd5, 4'd4, 4'd1, 8'd25, 8'd25, 8'd1, 8'd1}; |
| //mem[2]={ 1'd0, 4'd4, 4'd3, 4'd6, 4'd4, 4'd2, 8'd51, 8'd51, 8'd2, 8'd0}; |
| //mem[3]={ 1'd0, 4'd4, 4'd3, 4'd6, 4'd4, 4'd2, 8'd76, 8'd76, 8'd2, 8'd1}; |
| //mem[4]={ 1'd0, 4'd4, 4'd3, 4'd7, 4'd5, 4'd3, 8'd102, 8'd102, 8'd3, 8'd0}; |
| //mem[5]={ 1'd1, 4'd3, 4'd2, 4'd5, 4'd3, 4'd1, 8'd0, 8'd25, 8'd3, 8'd1}; |
| //mem[6]={ 1'd0, 4'd3, 4'd2, 4'd6, 4'd3, 4'd2, 8'd25, 8'd25, 8'd4, 8'd0}; |
| //mem[7]={ 1'd0, 4'd3, 4'd2, 4'd6, 4'd3, 4'd2, 8'd51, 8'd51, 8'd4, 8'd1}; |
| //mem[8]={ 1'd0, 4'd4, 4'd3, 4'd7, 4'd4, 4'd3, 8'd76, 8'd76, 8'd0, 8'd0}; |
| //mem[9]={ 1'd0, 4'd4, 4'd3, 4'd7, 4'd4, 4'd3, 8'd102, 8'd102, 8'd0, 8'd1}; |
| phs_lut_table[0] = 0x13254100190100; |
| phs_lut_table[1] = 0x03254119190101; |
| phs_lut_table[2] = 0x04364233330200; |
| phs_lut_table[3] = 0x0436424c4c0201; |
| phs_lut_table[4] = 0x04375366660300; |
| phs_lut_table[5] = 0x13253100190301; |
| phs_lut_table[6] = 0x03263219190400; |
| phs_lut_table[7] = 0x03263233330401; |
| phs_lut_table[8] = 0x0437434c4c0000; |
| phs_lut_table[9] = 0x04374366660001; |
| } |
| input_n = 1; |
| output_m = 2; |
| } else if (frc_ratio_mode == FRC_RATIO_2_3) { |
| //phs_lut_table[0] = {1'h1, 4'h3, 4'h2, 4'h3, 4'h2, 4'h1, 8'h00 ,8'h55 ,8'h00, 8'h00}; |
| //phs_lut_table[1] = {1'h0, 4'h3, 4'h2, 4'h3, 4'h2, 4'h1, 8'h55 ,8'h55 ,8'h00, 8'h01}; |
| //phs_lut_table[2] = {1'h1, 4'h3, 4'h2, 4'h3, 4'h2, 4'h1, 8'h2a ,8'h2a ,8'h00, 8'h02}; |
| phs_lut_table[0] = 0x13232100550000; |
| phs_lut_table[1] = 0x03232155550001; |
| phs_lut_table[2] = 0x1323212a2a0002; |
| input_n = 2; |
| output_m = 3; |
| } else if (frc_ratio_mode == FRC_RATIO_2_5) { |
| //phs_lut_table[0] = {1'h1, 4'h3, 4'h2, 4'h3, 4'h2, 4'h1, 8'h00 ,8'h33 ,8'h00, 8'h00}; |
| //phs_lut_table[1] = {1'h0, 4'h3, 4'h2, 4'h3, 4'h2, 4'h1, 8'h33 ,8'h33 ,8'h00, 8'h01}; |
| //phs_lut_table[2] = {1'h0, 4'h3, 4'h2, 4'h3, 4'h2, 4'h1, 8'h66 ,8'h66 ,8'h00, 8'h02}; |
| //phs_lut_table[3] = {1'h1, 4'h3, 4'h2, 4'h3, 4'h2, 4'h1, 8'h19 ,8'h19 ,8'h00, 8'h03}; |
| //phs_lut_table[4] = {1'h0, 4'h3, 4'h2, 4'h3, 4'h2, 4'h1, 8'h4c ,8'h4c ,8'h00, 8'h04}; |
| phs_lut_table[0] = 0x13232100330000; |
| phs_lut_table[1] = 0x03232133330001; |
| phs_lut_table[2] = 0x03232166660002; |
| phs_lut_table[3] = 0x13232119190003; |
| phs_lut_table[4] = 0x0323214c4c0004; |
| input_n = 2; |
| output_m = 5; |
| } else if (frc_ratio_mode == FRC_RATIO_5_6) { |
| //phs_lut_table[0] = {1'h1, 4'h3, 4'h2, 4'h3, 4'h2, 4'h1, 8'h00 ,8'h6a ,8'h00, 8'h00}; |
| //phs_lut_table[1] = {1'h0, 4'h3, 4'h2, 4'h3, 4'h2, 4'h1, 8'h6a ,8'h6a ,8'h00, 8'h01}; |
| //phs_lut_table[2] = {1'h1, 4'h3, 4'h2, 4'h3, 4'h2, 4'h1, 8'h55 ,8'h55 ,8'h00, 8'h02}; |
| //phs_lut_table[3] = {1'h1, 4'h3, 4'h2, 4'h3, 4'h2, 4'h1, 8'h40 ,8'h40 ,8'h00, 8'h03}; |
| //phs_lut_table[4] = {1'h1, 4'h3, 4'h2, 4'h3, 4'h2, 4'h1, 8'h2a ,8'h2a ,8'h00, 8'h04}; |
| //phs_lut_table[5] = {1'h1, 4'h3, 4'h2, 4'h3, 4'h2, 4'h1, 8'h15 ,8'h15 ,8'h00, 8'h05}; |
| phs_lut_table[0] = 0x132321006a0000; |
| phs_lut_table[1] = 0x0323216a6a0001; |
| phs_lut_table[2] = 0x13232155550002; |
| phs_lut_table[3] = 0x13232140400003; |
| phs_lut_table[4] = 0x1323212a2a0004; |
| phs_lut_table[5] = 0x13232115150005; |
| input_n = 5; |
| output_m = 6; |
| } else if (frc_ratio_mode == FRC_RATIO_5_12) { |
| //phs_lut_table[0] = {1'h1, 4'h3, 4'h2, 4'h3, 4'h2, 4'h1, 8'h00 ,8'h35 ,8'h00, 8'h00}; |
| //phs_lut_table[1] = {1'h0, 4'h3, 4'h2, 4'h3, 4'h2, 4'h1, 8'h35 ,8'h35 ,8'h00, 8'h01}; |
| //phs_lut_table[2] = {1'h0, 4'h3, 4'h2, 4'h3, 4'h2, 4'h1, 8'h6a ,8'h6a ,8'h00, 8'h02}; |
| //phs_lut_table[3] = {1'h1, 4'h3, 4'h2, 4'h3, 4'h2, 4'h1, 8'h20 ,8'h20 ,8'h00, 8'h03}; |
| //phs_lut_table[4] = {1'h0, 4'h3, 4'h2, 4'h3, 4'h2, 4'h1, 8'h55 ,8'h55 ,8'h00, 8'h04}; |
| //phs_lut_table[5] = {1'h1, 4'h3, 4'h2, 4'h3, 4'h2, 4'h1, 8'h0a ,8'h0a ,8'h00, 8'h05}; |
| //phs_lut_table[6] = {1'h0, 4'h3, 4'h2, 4'h3, 4'h2, 4'h1, 8'h40 ,8'h40 ,8'h00, 8'h06}; |
| //phs_lut_table[7] = {1'h0, 4'h3, 4'h2, 4'h3, 4'h2, 4'h1, 8'h75 ,8'h75 ,8'h00, 8'h07}; |
| //phs_lut_table[8] = {1'h1, 4'h3, 4'h2, 4'h3, 4'h2, 4'h1, 8'h2a ,8'h2a ,8'h00, 8'h08}; |
| //phs_lut_table[9] = {1'h0, 4'h3, 4'h2, 4'h3, 4'h2, 4'h1, 8'h60 ,8'h60 ,8'h00, 8'h09}; |
| //phs_lut_table[10]= {1'h1, 4'h3, 4'h2, 4'h3, 4'h2, 4'h1, 8'h15 ,8'h15 ,8'h00, 8'h0a}; |
| //phs_lut_table[11]= {1'h0, 4'h3, 4'h2, 4'h3, 4'h2, 4'h1, 8'h4a ,8'h4a ,8'h00, 8'h0b}; |
| phs_lut_table[0] = 0x13232100350000; |
| phs_lut_table[1] = 0x03232135350001; |
| phs_lut_table[2] = 0x0323216a6a0002; |
| phs_lut_table[3] = 0x13232120200003; |
| phs_lut_table[4] = 0x03232155550004; |
| phs_lut_table[5] = 0x1323210a0a0005; |
| phs_lut_table[6] = 0x03232140400006; |
| phs_lut_table[7] = 0x03232175750007; |
| phs_lut_table[8] = 0x1323212a2a0008; |
| phs_lut_table[9] = 0x03232160600009; |
| phs_lut_table[10]= 0x1323211515000a; |
| phs_lut_table[11]= 0x0323214a4a000b; |
| input_n = 5; |
| output_m = 12; |
| } else if (frc_ratio_mode == FRC_RATIO_1_1) { |
| if (film_mode == EN_DRV_VIDEO) { |
| //phs_lut_table[0] = {1'h1, 4'h3,4'h2, 4'h3, 4'h2, 4'h1, 8'h00 ,8'h00 ,8'h00, 8'h00}; |
| phs_lut_table[0] = 0x13232100000000; |
| } |
| //else if(film_mode == EN_FILM22) { |
| //phs_lut_table[0] = {1'h1, 4'h3, 4'h2, 4'h4, 4'h3, 4'h1, 8'd0 ,8'd64 ,8'h01, 8'h00}; |
| //phs_lut_table[1] = {1'h0, 4'h3, 4'h2, 4'h5, 4'h3, 4'h2, 8'd64 ,8'd64 ,8'h00, 8'h00}; |
| //} |
| else if (film_mode == EN_DRV_FILM32) { |
| //phs_lut_table[0] = {1'h1, 4'h3, 4'h2, 4'h5, 4'h4, 4'h1, 8'h00 ,8'h33 ,8'h01, 8'h00}; |
| //phs_lut_table[1] = {1'h0, 4'h3, 4'h2, 4'h6, 4'h4, 4'h2, 8'h33 ,8'h33 ,8'h02, 8'h00}; |
| //phs_lut_table[2] = {1'h0, 4'h4, 4'h3, 4'h7, 4'h4, 4'h3, 8'h66 ,8'h66 ,8'h03, 8'h00}; |
| //phs_lut_table[3] = {1'h1, 4'h3, 4'h2, 4'h5, 4'h4, 4'h2, 8'h19 ,8'h19 ,8'h04, 8'h00}; |
| //phs_lut_table[4] = {1'h0, 4'h3, 4'h2, 4'h6, 4'h4, 4'h3, 8'h4c ,8'h4c ,8'h00, 8'h00}; |
| phs_lut_table[0] = 0x13254100330100; |
| phs_lut_table[1] = 0x03264233330200; |
| phs_lut_table[2] = 0x04374366660300; |
| phs_lut_table[3] = 0x13254219190400; |
| phs_lut_table[4] = 0x0326434c4c0000; |
| } |
| //else if(film_mode == EN_DRV_FILM3223) { |
| //phs_lut_table[0] = { 1'd1, 4'd3, 4'd2, 4'd6, 4'd4, 4'd1, 8'd0, 8'd51, 8'd1, 8'h00}; |
| //phs_lut_table[1] = { 1'd0, 4'd3, 4'd2, 4'd7, 4'd4, 4'd2, 8'd51, 8'd51, 8'd2, 8'h00}; |
| //phs_lut_table[2] = { 1'd0, 4'd4, 4'd3, 4'd8, 4'd4, 4'd3, 8'd102, 8'd102, 8'd3, 8'h00}; |
| //phs_lut_table[3] = { 1'd1, 4'd3, 4'd2, 4'd5, 4'd4, 4'd2, 8'd25, 8'd25, 8'd4, 8'h00}; |
| //phs_lut_table[4] = { 1'd0, 4'd4, 4'd3, 4'd6, 4'd4, 4'd3, 8'd76, 8'd76, 8'd5, 8'h00}; |
| //phs_lut_table[5] = { 1'd1, 4'd3, 4'd2, 4'd5, 4'd4, 4'd2, 8'd0, 8'd51, 8'd6, 8'h00}; |
| //phs_lut_table[6] = { 1'd0, 4'd3, 4'd2, 4'd6, 4'd4, 4'd3, 8'd51, 8'd51, 8'd7, 8'h00}; |
| //phs_lut_table[7] = { 1'd0, 4'd4, 4'd3, 4'd7, 4'd5, 4'd4, 8'd102, 8'd102, 8'd8, 8'h00}; |
| //phs_lut_table[8] = { 1'd1, 4'd3, 4'd2, 4'd6, 4'd5, 4'd2, 8'd25, 8'd25, 8'd9, 8'h00}; |
| //phs_lut_table[9] = { 1'd0, 4'd3, 4'd2, 4'd7, 4'd5, 4'd3, 8'd76, 8'd76, 8'd0, 8'h00}; |
| //} |
| //else if(film_mode == EN_DRV_FILM2224) { |
| //phs_lut_table[0] = { 1'd1, 4'd3, 4'd2, 4'd6, 4'd5, 4'd1, 8'd0, 8'd51, 8'd1, 8'h00}; |
| //phs_lut_table[1] = { 1'd0, 4'd3, 4'd2, 4'd7, 4'd5, 4'd2, 8'd51, 8'd51, 8'd2, 8'h00}; |
| //phs_lut_table[2] = { 1'd0, 4'd4, 4'd3, 4'd8, 4'd5, 4'd3, 8'd102, 8'd102, 8'd3, 8'h00}; |
| //phs_lut_table[3] = { 1'd1, 4'd3, 4'd2, 4'd6, 4'd4, 4'd2, 8'd25, 8'd25, 8'd4, 8'h00}; |
| //phs_lut_table[4] = { 1'd0, 4'd4, 4'd3, 4'd7, 4'd4, 4'd3, 8'd76, 8'd76, 8'd5, 8'h00}; |
| //phs_lut_table[5] = { 1'd1, 4'd3, 4'd2, 4'd5, 4'd4, 4'd2, 8'd0, 8'd51, 8'd6, 8'h00}; |
| //phs_lut_table[6] = { 1'd0, 4'd4, 4'd3, 4'd6, 4'd4, 4'd3, 8'd51, 8'd51, 8'd7, 8'h00}; |
| //phs_lut_table[7] = { 1'd0, 4'd4, 4'd3, 4'd7, 4'd5, 4'd4, 8'd102, 8'd102, 8'd8, 8'h00}; |
| //phs_lut_table[8] = { 1'd1, 4'd4, 4'd3, 4'd6, 4'd5, 4'd3, 8'd25, 8'd25, 8'd9, 8'h00}; |
| //phs_lut_table[9] = { 1'd0, 4'd4, 4'd3, 4'd7, 4'd5, 4'd4, 8'd76, 8'd76, 8'd0, 8'h00}; |
| //} |
| //else if(film_mode == EN_DRV_FILM32322) { |
| //phs_lut_table[0] = { 1'd1, 4'd3, 4'd2, 4'd5, 4'd4, 4'd1, 8'd0, 8'd53, 8'd1, 8'h00}; |
| //phs_lut_table[1] = { 1'd0, 4'd3, 4'd2, 4'd6, 4'd4, 4'd2, 8'd53, 8'd53, 8'd2, 8'h00}; |
| //phs_lut_table[2] = { 1'd0, 4'd4, 4'd3, 4'd7, 4'd4, 4'd3, 8'd106, 8'd106, 8'd3, 8'h00}; |
| //phs_lut_table[3] = { 1'd1, 4'd3, 4'd2, 4'd5, 4'd4, 4'd2, 8'd32, 8'd32, 8'd4, 8'h00}; |
| //phs_lut_table[4] = { 1'd0, 4'd4, 4'd3, 4'd6, 4'd4, 4'd3, 8'd85, 8'd85, 8'd5, 8'h00}; |
| //phs_lut_table[5] = { 1'd1, 4'd3, 4'd2, 4'd5, 4'd4, 4'd2, 8'd10, 8'd10, 8'd6, 8'h00}; |
| //phs_lut_table[6] = { 1'd0, 4'd3, 4'd2, 4'd6, 4'd4, 4'd3, 8'd64, 8'd64, 8'd7, 8'h00}; |
| //phs_lut_table[7] = { 1'd0, 4'd4, 4'd3, 4'd7, 4'd5, 4'd4, 8'd117, 8'd117, 8'd8, 8'h00}; |
| //phs_lut_table[8] = { 1'd1, 4'd3, 4'd2, 4'd6, 4'd5, 4'd2, 8'd42, 8'd42, 8'd9, 8'h00}; |
| //phs_lut_table[9] = { 1'd0, 4'd4, 4'd3, 4'd7, 4'd5, 4'd3, 8'd96, 8'd96, 8'd10, 8'h00}; |
| //phs_lut_table[10] = { 1'd1, 4'd3, 4'd2, 4'd6, 4'd4, 4'd2, 8'd21, 8'd21, 8'd11, 8'h00}; |
| //phs_lut_table[11] = { 1'd0, 4'd3, 4'd2, 4'd7, 4'd4, 4'd3, 8'd74, 8'd74, 8'd0, 8'h00}; |
| //} |
| //else if(film_mode == EN_DRV_FILM44) { |
| //phs_lut_table[0] = { 1'd1, 4'd3, 4'd2, 4'd6, 4'd5, 4'd1, 8'd0, 8'd32, 8'd1, 8'h00}; |
| //phs_lut_table[1] = { 1'd0, 4'd3, 4'd2, 4'd7, 4'd5, 4'd2, 8'd32, 8'd32, 8'd2, 8'h00}; |
| //phs_lut_table[2] = { 1'd0, 4'd3, 4'd2, 4'd8, 4'd5, 4'd3, 8'd64, 8'd64, 8'd3, 8'h00}; |
| //phs_lut_table[3] = { 1'd0, 4'd3, 4'd2, 4'd9, 4'd5, 4'd4, 8'd96, 8'd96, 8'd0, 8'h00}; |
| //} |
| //else if(film_mode == EN_FILM21111) { |
| //phs_lut_table[0] = { 1'd1, 4'd3, 4'd2, 4'd4, 4'd3, 4'd1, 8'd0, 8'd106, 8'd1, 8'h00}; |
| //phs_lut_table[1] = { 1'd0, 4'd4, 4'd3, 4'd5, 4'd3, 4'd2, 8'd106, 8'd106, 8'd2, 8'h00}; |
| //phs_lut_table[2] = { 1'd1, 4'd4, 4'd3, 4'd4, 4'd3, 4'd2, 8'd85, 8'd85, 8'd3, 8'h00}; |
| //phs_lut_table[3] = { 1'd1, 4'd4, 4'd3, 4'd4, 4'd3, 4'd2, 8'd64, 8'd64, 8'd4, 8'h00}; |
| //phs_lut_table[4] = { 1'd1, 4'd4, 4'd3, 4'd4, 4'd3, 4'd2, 8'd42, 8'd42, 8'd5, 8'h00}; |
| //phs_lut_table[5] = { 1'd1, 4'd3, 4'd2, 4'd4, 4'd3, 4'd2, 8'd21, 8'd21, 8'd0, 8'h00}; |
| //} |
| //else if(film_mode == EN_DRV_FILM23322) { |
| //phs_lut_table[0] = { 1'd1, 4'd3, 4'd2, 4'd6, 4'd4, 4'd1, 8'd0, 8'd53, 8'd1, 8'h00}; |
| //phs_lut_table[1] = { 1'd0, 4'd3, 4'd2, 4'd7, 4'd4, 4'd2, 8'd53, 8'd53, 8'd2, 8'h00}; |
| //phs_lut_table[2] = { 1'd0, 4'd4, 4'd3, 4'd8, 4'd4, 4'd3, 8'd106, 8'd106, 8'd3, 8'h00}; |
| //phs_lut_table[3] = { 1'd1, 4'd3, 4'd2, 4'd5, 4'd4, 4'd2, 8'd32, 8'd32, 8'd4, 8'h00}; |
| //phs_lut_table[4] = { 1'd0, 4'd4, 4'd3, 4'd6, 4'd4, 4'd3, 8'd85, 8'd85, 8'd5, 8'h00}; |
| //phs_lut_table[5] = { 1'd1, 4'd3, 4'd2, 4'd5, 4'd4, 4'd2, 8'd10, 8'd10, 8'd6, 8'h00}; |
| //phs_lut_table[6] = { 1'd0, 4'd4, 4'd3, 4'd6, 4'd4, 4'd3, 8'd64, 8'd64, 8'd7, 8'h00}; |
| //phs_lut_table[7] = { 1'd0, 4'd4, 4'd3, 4'd7, 4'd5, 4'd4, 8'd117, 8'd117, 8'd8, 8'h00}; |
| //phs_lut_table[8] = { 1'd1, 4'd3, 4'd2, 4'd6, 4'd5, 4'd3, 8'd42, 8'd42, 8'd9, 8'h00}; |
| //phs_lut_table[9] = { 1'd0, 4'd4, 4'd3, 4'd7, 4'd5, 4'd4, 8'd96, 8'd96, 8'd10, 8'h00}; |
| //phs_lut_table[10] = { 1'd1, 4'd3, 4'd2, 4'd6, 4'd5, 4'd2, 8'd21, 8'd21, 8'd11, 8'h00}; |
| //phs_lut_table[11] = { 1'd0, 4'd3, 4'd2, 4'd7, 4'd5, 4'd3, 8'd74, 8'd74, 8'd0, 'h00}; |
| //} |
| //else if(film_mode == EN_DRV_FILM2111) { |
| //phs_lut_table[0] = { 1'd1, 4'd3, 4'd2, 4'd4, 4'd3, 4'd1, 8'd0, 8'd102, 8'd1, 8'h00}; |
| //phs_lut_table[1] = { 1'd0, 4'd4, 4'd3, 4'd5, 4'd3, 4'd2, 8'd102, 8'd102, 8'd2, 8'h00}; |
| //phs_lut_table[2] = { 1'd1, 4'd4, 4'd3, 4'd4, 4'd3, 4'd2, 8'd76, 8'd76, 8'd3, 8'h00}; |
| //phs_lut_table[3] = { 1'd1, 4'd4, 4'd3, 4'd4, 4'd3, 4'd2, 8'd51, 8'd51, 8'd4, 8'h00}; |
| //phs_lut_table[4] = { 1'd1, 4'd3, 4'd2, 4'd4, 4'd3, 4'd2, 8'd25, 8'd25, 8'd0, 8'h00}; |
| //} |
| |
| //else if(film_mode == EN_DRV_FILM22224) { |
| // //cadence=22224(10),table_cnt= 12,match_data=0xaa8 |
| //phs_lut_table[0]={ 1'd1, 4'd3, 4'd2, 4'd6, 4'd5, 4'd1, 8'd0, 8'd53, 8'd1, 8'd0}; |
| //phs_lut_table[1]={ 1'd0, 4'd3, 4'd2, 4'd7, 4'd5, 4'd2, 8'd53, 8'd53, 8'd2, 8'd0}; |
| //phs_lut_table[2]={ 1'd0, 4'd4, 4'd3, 4'd8, 4'd5, 4'd3, 8'd106, 8'd106, 8'd3, 8'd0}; |
| //phs_lut_table[3]={ 1'd1, 4'd3, 4'd2, 4'd6, 4'd4, 4'd2, 8'd32, 8'd32, 8'd4, 8'd0}; |
| //phs_lut_table[4]={ 1'd0, 4'd4, 4'd3, 4'd7, 4'd4, 4'd3, 8'd85, 8'd85, 8'd5, 8'd0}; |
| //phs_lut_table[5]={ 1'd1, 4'd3, 4'd2, 4'd5, 4'd4, 4'd2, 8'd10, 8'd10, 8'd6, 8'd0}; |
| //phs_lut_table[6]={ 1'd0, 4'd4, 4'd3, 4'd6, 4'd4, 4'd3, 8'd64, 8'd64, 8'd7, 8'd0}; |
| //phs_lut_table[7]={ 1'd0, 4'd4, 4'd3, 4'd7, 4'd5, 4'd4, 8'd117, 8'd117, 8'd8, 8'd0}; |
| //phs_lut_table[8]={ 1'd1, 4'd4, 4'd3, 4'd6, 4'd5, 4'd3, 8'd42, 8'd42, 8'd9, 8'd0}; |
| //phs_lut_table[9]={ 1'd0, 4'd4, 4'd3, 4'd7, 4'd5, 4'd4, 8'd96, 8'd96, 8'd10, 8'd0}; |
| //phs_lut_table[10]={ 1'd1, 4'd3, 4'd2, 4'd6, 4'd5, 4'd3, 8'd21, 8'd21, 8'd11, 8'd0}; |
| //phs_lut_table[11]={ 1'd0, 4'd3, 4'd2, 4'd7, 4'd5, 4'd4, 8'd74, 8'd74, 8'd0, 8'd0}; |
| //} |
| //else if(film_mode == EN_DRV_FILM33) { |
| // //cadence=33(11),table_cnt= 3,match_data=0x4 |
| //phs_lut_table[0]={ 1'd1, 4'd3, 4'd2, 4'd5, 4'd4, 4'd1, 8'd0, 8'd42, 8'd1, 8'd0}; |
| //phs_lut_table[1]={ 1'd0, 4'd3, 4'd2, 4'd6, 4'd4, 4'd2, 8'd42, 8'd42, 8'd2, 8'd0}; |
| //phs_lut_table[2]={ 1'd0, 4'd3, 4'd2, 4'd7, 4'd4, 4'd3, 8'd85, 8'd85, 8'd0, 8'd0}; |
| //} |
| //else if(film_mode == EN_DRV_FILM334) { |
| // //cadence=334(12),table_cnt= 10,match_data=0x248 |
| //phs_lut_table[0]={ 1'd1, 4'd3, 4'd2, 4'd6, 4'd5, 4'd1, 8'd0, 8'd38, 8'd1, 8'd0}; |
| //phs_lut_table[1]={ 1'd0, 4'd3, 4'd2, 4'd7, 4'd5, 4'd2, 8'd38, 8'd38, 8'd2, 8'd0}; |
| //phs_lut_table[2]={ 1'd0, 4'd3, 4'd2, 4'd8, 4'd5, 4'd3, 8'd76, 8'd76, 8'd3, 8'd0}; |
| //phs_lut_table[3]={ 1'd0, 4'd4, 4'd3, 4'd9, 4'd5, 4'd4, 8'd115, 8'd115, 8'd4, 8'd0}; |
| //phs_lut_table[4]={ 1'd1, 4'd3, 4'd2, 4'd6, 4'd5, 4'd2, 8'd25, 8'd25, 8'd5, 8'd0}; |
| //phs_lut_table[5]={ 1'd0, 4'd3, 4'd2, 4'd7, 4'd5, 4'd3, 8'd64, 8'd64, 8'd6, 8'd0}; |
| //phs_lut_table[6]={ 1'd0, 4'd4, 4'd3, 4'd8, 4'd5, 4'd4, 8'd102, 8'd102, 8'd7, 8'd0}; |
| //phs_lut_table[7]={ 1'd1, 4'd3, 4'd2, 4'd6, 4'd5, 4'd2, 8'd12, 8'd12, 8'd8, 8'd0}; |
| //phs_lut_table[8]={ 1'd0, 4'd3, 4'd2, 4'd7, 4'd5, 4'd3, 8'd51, 8'd51, 8'd9, 8'd0}; |
| //phs_lut_table[9]={ 1'd0, 4'd3, 4'd2, 4'd8, 4'd5, 4'd4, 8'd89, 8'd89, 8'd0, 8'd0}; |
| // |
| //} |
| //else if(film_mode == EN_DRV_FILM55) { |
| // //cadence=55(13),table_cnt= 5,match_data=0x10 |
| //phs_lut_table[0]={ 1'd1, 4'd3, 4'd2, 4'd7, 4'd6, 4'd1, 8'd0, 8'd25, 8'd1, 8'd0}; |
| //phs_lut_table[1]={ 1'd0, 4'd3, 4'd2, 4'd8, 4'd6, 4'd2, 8'd25, 8'd25, 8'd2, 8'd0}; |
| //phs_lut_table[2]={ 1'd0, 4'd3, 4'd2, 4'd9, 4'd6, 4'd3, 8'd51, 8'd51, 8'd3, 8'd0}; |
| //phs_lut_table[3]={ 1'd0, 4'd3, 4'd2, 4'd10, 4'd6, 4'd4, 8'd76, 8'd76, 8'd4, 8'd0}; |
| //phs_lut_table[4]={ 1'd0, 4'd3, 4'd2, 4'd11, 4'd6, 4'd5, 8'd102, 8'd102, 8'd0, 8'd0}; |
| // |
| //} |
| //else if(film_mode == EN_DRV_FILM64) { |
| // //cadence=64(14),table_cnt= 10,match_data=0x220 |
| //phs_lut_table[0]={ 1'd1, 4'd3, 4'd2, 4'd8, 4'd7, 4'd1, 8'd0, 8'd25, 8'd1, 8'd0}; |
| //phs_lut_table[1]={ 1'd0, 4'd3, 4'd2, 4'd9, 4'd7, 4'd2, 8'd25, 8'd25, 8'd2, 8'd0}; |
| //phs_lut_table[2]={ 1'd0, 4'd3, 4'd2, 4'd10, 4'd7, 4'd3, 8'd51, 8'd51, 8'd3, 8'd0}; |
| //phs_lut_table[3]={ 1'd0, 4'd3, 4'd2, 4'd11, 4'd7, 4'd4, 8'd76, 8'd76, 8'd4, 8'd0}; |
| //phs_lut_table[4]={ 1'd0, 4'd4, 4'd3, 4'd12, 4'd7, 4'd5, 8'd102, 8'd102, 8'd5, 8'd0}; |
| //phs_lut_table[5]={ 1'd1, 4'd3, 4'd2, 4'd8, 4'd6, 4'd2, 8'd0, 8'd25, 8'd6, 8'd0}; |
| //phs_lut_table[6]={ 1'd0, 4'd3, 4'd2, 4'd9, 4'd6, 4'd3, 8'd25, 8'd25, 8'd7, 8'd0}; |
| //phs_lut_table[7]={ 1'd0, 4'd3, 4'd2, 4'd10, 4'd6, 4'd4, 8'd51, 8'd51, 8'd8, 8'd0}; |
| //phs_lut_table[8]={ 1'd0, 4'd3, 4'd2, 4'd11, 4'd6, 4'd5, 8'd76, 8'd76, 8'd9, 8'd0}; |
| //phs_lut_table[9]={ 1'd0, 4'd3, 4'd2, 4'd12, 4'd7, 4'd6, 8'd102, 8'd102, 8'd0, 8'd0}; |
| //} |
| //else if(film_mode == EN_DRV_FILM66) { |
| // //cadence=66(15),table_cnt= 6,match_data=0x20 |
| //phs_lut_table[0]={ 1'd1, 4'd3, 4'd2, 4'd8, 4'd7, 4'd1, 8'd0, 8'd21, 8'd1, 8'd0}; |
| //phs_lut_table[1]={ 1'd0, 4'd3, 4'd2, 4'd9, 4'd7, 4'd2, 8'd21, 8'd21, 8'd2, 8'd0}; |
| //phs_lut_table[2]={ 1'd0, 4'd3, 4'd2, 4'd10, 4'd7, 4'd3, 8'd42, 8'd42, 8'd3, 8'd0}; |
| //phs_lut_table[3]={ 1'd0, 4'd3, 4'd2, 4'd11, 4'd7, 4'd4, 8'd64, 8'd64, 8'd4, 8'd0}; |
| //phs_lut_table[4]={ 1'd0, 4'd3, 4'd2, 4'd12, 4'd7, 4'd5, 8'd85, 8'd85, 8'd5, 8'd0}; |
| //phs_lut_table[5]={ 1'd0, 4'd3, 4'd2, 4'd13, 4'd7, 4'd6, 8'd106, 8'd106, 8'd0, 8'd0}; |
| //} |
| //else if(film_mode == EN_DRV_FILM87) { |
| // //cadence=87(16),table_cnt= 15,match_data=0x4080 |
| //phs_lut_table[0]= { 1'd1, 4'd3, 4'd2, 4'd4, 4'd10, 4'd0, 8'd0, 8'd17, 8'd1, 8'd0}; |
| //phs_lut_table[1]= { 1'd0, 4'd3, 4'd2, 4'd4, 4'd1, 4'd0, 8'd17, 8'd17, 8'd2, 8'd0}; |
| //phs_lut_table[2]= { 1'd0, 4'd3, 4'd2, 4'd4, 4'd11, 4'd0, 8'd34, 8'd34, 8'd3, 8'd0}; |
| //phs_lut_table[3]= { 1'd0, 4'd3, 4'd2, 4'd4, 4'd5, 4'd0, 8'd51, 8'd51, 8'd4, 8'd0}; |
| //phs_lut_table[4]= { 1'd0, 4'd3, 4'd2, 4'd4, 4'd14, 4'd0, 8'd68, 8'd68, 8'd5, 8'd0}; |
| //phs_lut_table[5]= { 1'd0, 4'd3, 4'd2, 4'd13, 4'd2, 4'd9, 8'd85, 8'd85, 8'd6, 8'd0}; |
| //phs_lut_table[6]= { 1'd0, 4'd3, 4'd2, 4'd7, 4'd6, 4'd3, 8'd102, 8'd102, 8'd7, 8'd0}; |
| //phs_lut_table[7]= { 1'd0, 4'd4, 4'd3, 4'd1, 4'd11, 4'd12, 8'd119, 8'd119, 8'd8, 8'd0}; |
| //phs_lut_table[8]= { 1'd1, 4'd3, 4'd2, 4'd1, 4'd2, 4'd14, 8'd8, 8'd8, 8'd9, 8'd0}; |
| //phs_lut_table[9]= { 1'd0, 4'd3, 4'd2, 4'd7, 4'd8, 4'd5, 8'd25, 8'd25, 8'd10, 8'd0}; |
| //phs_lut_table[10]={ 1'd0, 4'd3, 4'd2, 4'd13, 4'd14, 4'd11, 8'd42, 8'd42, 8'd11, 8'd0}; |
| //phs_lut_table[11]={ 1'd0, 4'd3, 4'd2, 4'd4, 4'd5, 4'd2, 8'd59, 8'd59, 8'd12, 8'd0}; |
| //phs_lut_table[12]={ 1'd0, 4'd3, 4'd2, 4'd9, 4'd10, 4'd7, 8'd76, 8'd76, 8'd13, 8'd0}; |
| //phs_lut_table[13]={ 1'd0, 4'd3, 4'd2, 4'd13, 4'd14, 4'd11, 8'd93, 8'd93, 8'd14, 8'd0}; |
| //phs_lut_table[14]={ 1'd0, 4'd3, 4'd12, 4'd12, 4'd4, 4'd10, 8'd110, 8'd110, 8'd0, 8'd0}; |
| // |
| //phs_lut_table[0]= { 1'd1, 4'd3, 4'd2, 4'd8, 4'd5, 4'd2, 8'd0, 8'd17, 8'd1, 8'd0}; |
| //phs_lut_table[1]= { 1'd0, 4'd3, 4'd2, 4'd10, 4'd7, 4'd4, 8'd17, 8'd17, 8'd2, 8'd0}; |
| //phs_lut_table[2]= { 1'd0, 4'd3, 4'd2, 4'd12, 4'd9, 4'd6, 8'd34, 8'd34, 8'd3, 8'd0}; |
| //phs_lut_table[3]= { 1'd0, 4'd3, 4'd2, 4'd14, 4'd11, 4'd8, 8'd51, 8'd51, 8'd4, 8'd0}; |
| //phs_lut_table[4]= { 1'd0, 4'd3, 4'd2, 4'd1, 4'd14, 4'd11, 8'd68, 8'd68, 8'd5, 8'd0}; |
| //phs_lut_table[5]= { 1'd0, 4'd3, 4'd2, 4'd5, 4'd2, 4'd15, 8'd85, 8'd85, 8'd6, 8'd0}; |
| //phs_lut_table[6]= { 1'd0, 4'd3, 4'd2, 4'd8, 4'd5, 4'd2, 8'd102, 8'd102, 8'd7, 8'd0}; |
| //phs_lut_table[7]= { 1'd0, 4'd4, 4'd3, 4'd10, 4'd7, 4'd4, 8'd119, 8'd119, 8'd8, 8'd0}; |
| //phs_lut_table[8]= { 1'd1, 4'd3, 4'd2, 4'd9, 4'd7, 4'd4, 8'd8, 8'd8, 8'd9, 8'd0}; |
| //phs_lut_table[9]= { 1'd0, 4'd3, 4'd2, 4'd11, 4'd9, 4'd6, 8'd25, 8'd25, 8'd10, 8'd0}; |
| //phs_lut_table[10]={ 1'd0, 4'd3, 4'd2, 4'd13, 4'd11, 4'd8, 8'd42, 8'd42, 8'd11, 8'd0}; |
| //phs_lut_table[11]={ 1'd0, 4'd3, 4'd2, 4'd15, 4'd13, 4'd10, 8'd59, 8'd59, 8'd12, 8'd0}; |
| //phs_lut_table[12]={ 1'd0, 4'd3, 4'd2, 4'd3, 4'd1, 4'd14, 8'd76, 8'd76, 8'd13, 8'd0}; |
| //phs_lut_table[13]={ 1'd0, 4'd3, 4'd2, 4'd5, 4'd3, 4'd2, 8'd93, 8'd93, 8'd14, 8'd0}; |
| //phs_lut_table[14]={ 1'd0, 4'd3, 4'd12, 4'd8, 4'd6, 4'd3, 8'd110, 8'd110, 8'd0, 8'd0}; |
| //} |
| //else if(film_mode == EN_DRV_FILM212) { |
| // //cadence=212(17),table_cnt= 5,match_data=0x1a |
| //phs_lut_table[0]={ 1'd1, 4'd3, 4'd2, 4'd5, 4'd3, 4'd1, 8'd0, 8'd76, 8'd1, 8'd0}; |
| //phs_lut_table[1]={ 1'd0, 4'd4, 4'd3, 4'd6, 4'd3, 4'd2, 8'd76, 8'd76, 8'd2, 8'd0}; |
| //phs_lut_table[2]={ 1'd1, 4'd3, 4'd2, 4'd4, 4'd3, 4'd2, 8'd25, 8'd25, 8'd3, 8'd0}; |
| //phs_lut_table[3]={ 1'd0, 4'd4, 4'd3, 4'd5, 4'd4, 4'd3, 8'd102, 8'd102, 8'd4, 8'd0}; |
| //phs_lut_table[4]={ 1'd1, 4'd3, 4'd2, 4'd5, 4'd4, 4'd2, 8'd51, 8'd51, 8'd0, 8'd0}; |
| //} |
| //else { |
| // stimulus_print ("==== USE ERROR CADENCE ===="); |
| //} |
| input_n = 1; |
| output_m = 1; |
| } |
| regdata_top_ctl_0011 = READ_FRC_REG(FRC_REG_TOP_CTRL17); |
| frc_config_reg_value(0x08, 0x18, ®data_top_ctl_0011); //lut_cfg_en |
| WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL17, regdata_top_ctl_0011); |
| WRITE_FRC_REG_BY_CPU(FRC_TOP_LUT_ADDR, 0); |
| // for (i = 0; i < 256; i++) { |
| for (i = 0; i < lut_ary_size + 2; i++) { |
| |
| if (i < lut_ary_size) { |
| WRITE_FRC_REG_BY_CPU(FRC_TOP_LUT_DATA, phs_lut_table[i] & 0xffffffff); |
| WRITE_FRC_REG_BY_CPU(FRC_TOP_LUT_DATA, phs_lut_table[i] >> 32 & 0xffffffff); |
| } else { |
| WRITE_FRC_REG_BY_CPU(FRC_TOP_LUT_DATA, 0xffffffff); |
| WRITE_FRC_REG_BY_CPU(FRC_TOP_LUT_DATA, 0xffffffff); |
| } |
| } |
| frc_config_reg_value(0x10, 0x18, ®data_top_ctl_0011); //lut_cfg_en |
| WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL17, regdata_top_ctl_0011); |
| |
| tmpregdata = input_n << 24 | output_m << 16; |
| frc_config_reg_value(tmpregdata, 0xffff0000, ®data_phs_tab_0116); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_PHS_TABLE, regdata_phs_tab_0116); |
| |
| } |
| |
| /*get new frame mode*/ |
| void config_phs_regs(enum frc_ratio_mode_type frc_ratio_mode, |
| enum en_drv_film_mode film_mode) |
| { |
| u32 reg_out_frm_dly_num = 3; |
| u32 reg_frc_pd_pat_num = 1; |
| u32 reg_ip_film_end = 1; |
| u64 inp_frm_vld_lut = 1; |
| u32 reg_ip_incr[16] = {0,1,3,1,1,1,1,1,2,3,2,1,1,1,1,2}; |
| u32 record_value = 0; |
| //config ip_film_end |
| if(frc_ratio_mode == FRC_RATIO_1_1) { |
| inp_frm_vld_lut = 1; |
| |
| if (film_mode == EN_DRV_VIDEO) { |
| reg_ip_film_end = 1; |
| reg_frc_pd_pat_num = 1; |
| reg_out_frm_dly_num = 3; // 10 |
| } else if (film_mode == EN_DRV_FILM22) { |
| reg_ip_film_end = 0x2; |
| reg_frc_pd_pat_num = 2; |
| reg_out_frm_dly_num = 7; |
| } else if (film_mode == EN_DRV_FILM32) { |
| reg_ip_film_end = 0x12; |
| reg_frc_pd_pat_num = 5; |
| reg_out_frm_dly_num = 10; |
| } else if (film_mode == EN_DRV_FILM3223) { |
| reg_ip_film_end = 0x24a; |
| reg_frc_pd_pat_num = 10; |
| reg_out_frm_dly_num = 15; |
| } else if (film_mode == EN_DRV_FILM2224) { |
| reg_ip_film_end = 0x22a; |
| reg_frc_pd_pat_num = 10; |
| reg_out_frm_dly_num = 15; |
| } else if (film_mode == EN_DRV_FILM32322) { |
| reg_ip_film_end = 0x94a; |
| reg_frc_pd_pat_num = 12; |
| reg_out_frm_dly_num = 15; |
| } else if (film_mode == EN_DRV_FILM44) { |
| reg_ip_film_end = 0x8; |
| reg_frc_pd_pat_num = 4; |
| reg_out_frm_dly_num = 14; |
| } else if (film_mode == EN_DRV_FILM21111) { |
| reg_ip_film_end = 0x2f; |
| reg_frc_pd_pat_num = 6; |
| reg_out_frm_dly_num = 10; |
| } else if (film_mode == EN_DRV_FILM23322) { |
| reg_ip_film_end = 0x92a; |
| reg_frc_pd_pat_num = 12; |
| reg_out_frm_dly_num = 15; |
| } else if (film_mode == EN_DRV_FILM2111) { |
| reg_ip_film_end = 0x17; |
| reg_frc_pd_pat_num = 5; |
| reg_out_frm_dly_num = 10; |
| } else if (film_mode == EN_DRV_FILM22224) { |
| reg_ip_film_end = 0x8aa; |
| reg_frc_pd_pat_num = 12; |
| reg_out_frm_dly_num = 15; |
| } else if (film_mode == EN_DRV_FILM33) { |
| reg_ip_film_end = 0x4; |
| reg_frc_pd_pat_num = 3; |
| reg_out_frm_dly_num = 11; |
| } else if (film_mode == EN_DRV_FILM334) { |
| reg_ip_film_end = 0x224; |
| reg_frc_pd_pat_num = 10; |
| reg_out_frm_dly_num = 15; |
| } else if (film_mode == EN_DRV_FILM55) { |
| reg_ip_film_end = 0x10; |
| reg_frc_pd_pat_num = 5; |
| reg_out_frm_dly_num = 15; |
| } else if (film_mode == EN_DRV_FILM64) { |
| reg_ip_film_end = 0x208; |
| reg_frc_pd_pat_num = 10; |
| reg_out_frm_dly_num = 15; |
| } else if (film_mode == EN_DRV_FILM66) { |
| reg_ip_film_end = 0x20; |
| reg_frc_pd_pat_num = 6; |
| reg_out_frm_dly_num = 15; |
| } else if (film_mode == EN_DRV_FILM87) { |
| //memc need pre-load 3 different frames, so at least input 8+7+8=23 frames, |
| //but memc lbuf number max is 16<23, so skip some repeated frames |
| reg_ip_film_end = 0x4040; |
| reg_frc_pd_pat_num = 15; |
| reg_out_frm_dly_num = 15; |
| } else if (film_mode == EN_DRV_FILM212) { |
| reg_ip_film_end = 0x15; |
| reg_frc_pd_pat_num = 5; |
| reg_out_frm_dly_num = 15; |
| } else if (film_mode == EN_DRV_FILM_MAX) { |
| reg_ip_film_end = 0xffff; // fix deadcode |
| } else { |
| pr_frc(0, "==== USE ERROR CADENCE ====\n"); |
| } |
| } else { |
| reg_ip_film_end = 0x1; |
| reg_frc_pd_pat_num = 1; |
| if (frc_ratio_mode == FRC_RATIO_1_2) |
| inp_frm_vld_lut = 0x2; |
| else if (frc_ratio_mode == FRC_RATIO_2_3) |
| inp_frm_vld_lut = 0x6; |
| else if (frc_ratio_mode == FRC_RATIO_2_5) |
| inp_frm_vld_lut = 0x14; |
| else if (frc_ratio_mode == FRC_RATIO_5_6) |
| inp_frm_vld_lut = 0x3e; |
| else if (frc_ratio_mode == FRC_RATIO_5_12) |
| inp_frm_vld_lut = 0xa94; |
| } |
| // input [63:0] reg_inp_frm_vld_lut; |
| WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL18, (inp_frm_vld_lut >> 0) & 0xffffffff); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL19, (inp_frm_vld_lut >> 32) & 0xffffffff); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_PD_PAT_NUM, reg_frc_pd_pat_num); |
| |
| // frc_config_reg_value(reg_out_frm_dly_num << 24, |
| // 0xF000000, ®data_top_ctl_0009); |
| // WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL9, regdata_top_ctl_0009); |
| regdata_loadorgframe[0] = READ_FRC_REG(FRC_REG_LOAD_ORG_FRAME_0); |
| regdata_loadorgframe[1] = READ_FRC_REG(FRC_REG_LOAD_ORG_FRAME_1); |
| regdata_loadorgframe[2] = READ_FRC_REG(FRC_REG_LOAD_ORG_FRAME_2); |
| regdata_loadorgframe[3] = READ_FRC_REG(FRC_REG_LOAD_ORG_FRAME_3); |
| record_value = 0x0; |
| if ((reg_ip_film_end >> 0) & 0x1) |
| record_value |= 0x08000000; |
| if ((reg_ip_film_end >> 1) & 0x1) |
| record_value |= 0x00080000; |
| if ((reg_ip_film_end >> 2) & 0x1) |
| record_value |= 0x00000800; |
| if ((reg_ip_film_end >> 3) & 0x1) |
| record_value |= 0x00000008; |
| frc_config_reg_value(record_value, 0x08080808, ®data_loadorgframe[0]); |
| record_value = 0x0; |
| if ((reg_ip_film_end >> 4) & 0x1) |
| record_value |= 0x08000000; |
| if ((reg_ip_film_end >> 5) & 0x1) |
| record_value |= 0x00080000; |
| if ((reg_ip_film_end >> 6) & 0x1) |
| record_value |= 0x00000800; |
| if ((reg_ip_film_end >> 7) & 0x1) |
| record_value |= 0x00000008; |
| frc_config_reg_value(record_value, 0x08080808, ®data_loadorgframe[1]); |
| record_value = 0x0; |
| if ((reg_ip_film_end >> 8) & 0x1) |
| record_value |= 0x08000000; |
| if ((reg_ip_film_end >> 9) & 0x1) |
| record_value |= 0x00080000; |
| if ((reg_ip_film_end >> 10) & 0x1) |
| record_value |= 0x00000800; |
| if ((reg_ip_film_end >> 11) & 0x1) |
| record_value |= 0x00000008; |
| frc_config_reg_value(record_value, 0x08080808, ®data_loadorgframe[2]); |
| record_value = 0x0; |
| if ((reg_ip_film_end >> 12) & 0x1) |
| record_value |= 0x08000000; |
| if ((reg_ip_film_end >> 13) & 0x1) |
| record_value |= 0x00080000; |
| if ((reg_ip_film_end >> 14) & 0x1) |
| record_value |= 0x00000800; |
| if ((reg_ip_film_end >> 15) & 0x1) |
| record_value |= 0x00000008; |
| frc_config_reg_value(record_value, 0x08080808, ®data_loadorgframe[3]); |
| |
| if (film_mode == EN_DRV_FILM87 && frc_ratio_mode == FRC_RATIO_1_1) { |
| frc_config_reg_value(reg_ip_incr[0] << 28, 0xF0000000, ®data_loadorgframe[0]); |
| frc_config_reg_value(reg_ip_incr[1] << 20, 0x00F00000, ®data_loadorgframe[0]); |
| frc_config_reg_value(reg_ip_incr[2] << 12, 0x0000F000, ®data_loadorgframe[0]); |
| frc_config_reg_value(reg_ip_incr[3] << 4, 0x000000F0, ®data_loadorgframe[0]); |
| |
| frc_config_reg_value(reg_ip_incr[4] << 28, 0xF0000000, ®data_loadorgframe[1]); |
| frc_config_reg_value(reg_ip_incr[5] << 20, 0x00F00000, ®data_loadorgframe[1]); |
| frc_config_reg_value(reg_ip_incr[6] << 12, 0x0000F000, ®data_loadorgframe[1]); |
| frc_config_reg_value(reg_ip_incr[7] << 4, 0x000000F0, ®data_loadorgframe[1]); |
| |
| frc_config_reg_value(reg_ip_incr[8] << 28, 0xF0000000, ®data_loadorgframe[2]); |
| frc_config_reg_value(reg_ip_incr[9] << 20, 0x00F00000, ®data_loadorgframe[2]); |
| frc_config_reg_value(reg_ip_incr[10] << 12, 0x0000F000, ®data_loadorgframe[2]); |
| frc_config_reg_value(reg_ip_incr[11] << 4, 0x000000F0, ®data_loadorgframe[2]); |
| |
| frc_config_reg_value(reg_ip_incr[12] << 28, 0xF0000000, ®data_loadorgframe[3]); |
| frc_config_reg_value(reg_ip_incr[13] << 20, 0x00F00000, ®data_loadorgframe[3]); |
| frc_config_reg_value(reg_ip_incr[14] << 12, 0x0000F000, ®data_loadorgframe[3]); |
| frc_config_reg_value(reg_ip_incr[15] << 4, 0x000000F0, ®data_loadorgframe[3]); |
| } else { |
| frc_config_reg_value(0, 0xF0000000, ®data_loadorgframe[0]); |
| frc_config_reg_value(0, 0x00F00000, ®data_loadorgframe[0]); |
| frc_config_reg_value(0, 0x0000F000, ®data_loadorgframe[0]); |
| frc_config_reg_value(0, 0x000000F0, ®data_loadorgframe[0]); |
| |
| frc_config_reg_value(0, 0xF0000000, ®data_loadorgframe[1]); |
| frc_config_reg_value(0, 0x00F00000, ®data_loadorgframe[1]); |
| frc_config_reg_value(0, 0x0000F000, ®data_loadorgframe[1]); |
| frc_config_reg_value(0, 0x000000F0, ®data_loadorgframe[1]); |
| |
| frc_config_reg_value(0, 0xF0000000, ®data_loadorgframe[2]); |
| frc_config_reg_value(0, 0x00F00000, ®data_loadorgframe[2]); |
| frc_config_reg_value(0, 0x0000F000, ®data_loadorgframe[2]); |
| frc_config_reg_value(0, 0x000000F0, ®data_loadorgframe[2]); |
| |
| frc_config_reg_value(0, 0xF0000000, ®data_loadorgframe[3]); |
| frc_config_reg_value(0, 0x00F00000, ®data_loadorgframe[3]); |
| frc_config_reg_value(0, 0x0000F000, ®data_loadorgframe[3]); |
| frc_config_reg_value(0, 0x000000F0, ®data_loadorgframe[3]); |
| } |
| WRITE_FRC_REG_BY_CPU(FRC_REG_LOAD_ORG_FRAME_0, regdata_loadorgframe[0]); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_LOAD_ORG_FRAME_1, regdata_loadorgframe[1]); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_LOAD_ORG_FRAME_2, regdata_loadorgframe[2]); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_LOAD_ORG_FRAME_3, regdata_loadorgframe[3]); |
| } |
| EXPORT_SYMBOL(config_phs_regs); |
| |
| void config_me_top_hw_reg(void) |
| { |
| u32 reg_data; |
| u32 mvx_div_mode; |
| u32 mvy_div_mode; |
| u32 me_max_mvx ; |
| u32 me_max_mvy ; |
| |
| reg_data = READ_FRC_REG(FRC_REG_BLK_SIZE_XY); |
| // reg_data = regdata_blksizexy_012b; |
| mvx_div_mode = (reg_data>>14) & 0x3; |
| mvy_div_mode = (reg_data>>12) & 0x3; |
| |
| me_max_mvx = (MAX_ME_MVX << mvx_div_mode < (1<<(ME_MVX_BIT-1))-1) ? (MAX_ME_MVX << mvx_div_mode) : ((1<<(ME_MVX_BIT-1))-1); |
| me_max_mvy = (MAX_ME_MVY << mvy_div_mode < (1<<(ME_MVY_BIT-1))-1) ? (MAX_ME_MVY << mvy_div_mode) : ((1<<(ME_MVY_BIT-1))-1); |
| |
| WRITE_FRC_REG_BY_CPU(FRC_ME_CMV_MAX_MV, (me_max_mvx << 16) | me_max_mvy); |
| |
| WRITE_FRC_REG_BY_CPU(FRC_ME_CMV_CTRL, 0x800000ff); |
| WRITE_FRC_REG_BY_CPU(FRC_ME_CMV_CTRL, 0x000000ff); |
| } |
| |
| void config_loss_out(u32 fmt422) |
| { |
| #ifdef LOSS_TEST |
| WRITE_FRC_BITS(CLOSS_MISC, 1, 0, 1); //reg_enable |
| WRITE_FRC_BITS(CLOSS_MISC, fmt422, 1, 1); //reg_inp_422; 1: 422, 0:444 |
| |
| WRITE_FRC_BITS(CLOSS_MISC, (6 << 8) | (7 << 16), 12, 20); //reg_misc |
| printf("config_loss_out\n"); |
| #endif |
| } |
| |
| void enable_nr(void) |
| { |
| u32 reg_data; |
| u32 reg_nr_misc_data; |
| u32 offset = 0x0; |
| enum chip_id chip; |
| |
| chip = get_chip_type(); |
| |
| if (chip == ID_T3) |
| offset = 0xa0; |
| else if (chip == ID_T5M || chip == ID_T3X) |
| offset = 0x0; |
| |
| WRITE_FRC_BITS(FRC_REG_INP_MODULE_EN + offset, 1, 9, 1); //reg_mc_nr_en |
| reg_data = READ_FRC_REG(FRC_NR_MISC); |
| reg_nr_misc_data = reg_data & 0x00000001; |
| WRITE_FRC_BITS(FRC_NR_MISC, reg_nr_misc_data, 0, 32); //reg_nr_misc |
| } |
| |
| void enable_bbd(void) |
| { |
| u32 offset = 0x0; |
| enum chip_id chip; |
| |
| chip = get_chip_type(); |
| |
| if (chip == ID_T3) |
| offset = 0xa0; |
| else if (chip == ID_T5M || chip == ID_T3X) |
| offset = 0x0; |
| |
| // WRITE_FRC_BITS(FRC_REG_INP_MODULE_EN + offset, 1, 7, 1); //reg_inp_bbd_en |
| frc_config_reg_value(0x80, 0x80, ®data_inpmoden_04f9); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_INP_MODULE_EN + offset, regdata_inpmoden_04f9); |
| } |
| |
| void frc_cfg_memc_loss(u32 memc_loss_en) |
| { |
| u32 memcloss = READ_FRC_REG(FRC_REG_TOP_CTRL11); // 0x0404000c; |
| |
| if (memc_loss_en > 3) |
| memc_loss_en = 3; |
| memcloss &= 0xFFFFFFFC; |
| memcloss |= memc_loss_en; |
| WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL11, memcloss); |
| } |
| |
| void frc_cfg_mcdw_loss(u32 mcdw_loss_en) |
| { |
| u32 temp = 0; |
| |
| temp = READ_FRC_REG(FRC_INP_MCDW_CTRL); |
| if (mcdw_loss_en == 1) |
| temp |= 0x10; |
| else if (mcdw_loss_en == 0) |
| temp &= 0xFFFFFFEF; |
| WRITE_FRC_REG_BY_CPU(FRC_INP_MCDW_CTRL, temp); |
| pr_frc(2, "%s FRC_INP_MCDW_CTRL=0x%x\n", __func__, |
| READ_FRC_REG(FRC_INP_MCDW_CTRL)); |
| |
| } |
| |
| void frc_force_secure(u32 onoff) |
| { |
| if (onoff) |
| WRITE_FRC_REG_BY_CPU(FRC_MC_LOSS_SLICE_SEC, 1);//reg_mc_loss_slice_sec |
| else |
| WRITE_FRC_REG_BY_CPU(FRC_MC_LOSS_SLICE_SEC, 0);//reg_mc_loss_slice_sec |
| } |
| |
| void recfg_memc_mif_base_addr(u32 base_ofst) |
| { |
| u32 reg_addr; |
| u32 reg_data; |
| |
| for(reg_addr = FRC_REG_MC_YINFO_BADDR; reg_addr < FRC_REG_LOGO_SCC_BUF_ADDR; reg_addr += 4) { |
| reg_data = READ_FRC_REG(reg_addr); |
| reg_data += base_ofst; |
| WRITE_FRC_REG_BY_CPU(reg_addr, reg_data); |
| } |
| } |
| |
| static const struct dbg_dump_tab frc_reg_tab[FRC_DBG_DUMP_TABLE_NUM] = { |
| {"FRC_TOP_CTRL->reg_frc_en_in", FRC_TOP_CTRL, 0, 1}, |
| {"FRC_REG_INP_MODULE_EN_T5M", FRC_REG_INP_MODULE_EN, 0, 0}, |
| {"FRC_REG_INP_MODULE_EN_T3", FRC_REG_INP_MODULE_EN + 0xA0, 0, 0}, |
| |
| {"FRC_REG_TOP_CTRL14->post_dly_vofst", FRC_REG_TOP_CTRL14, 0, 16}, |
| {"FRC_REG_TOP_CTRL14->reg_me_dly_vofst", FRC_REG_TOP_CTRL14, 16, 16}, |
| {"FRC_REG_TOP_CTRL15->reg_mc_dly_vofst0", FRC_REG_TOP_CTRL15, 0, 16}, |
| {"FRC_REG_TOP_CTRL15->reg_mc_dly_vofst1", FRC_REG_TOP_CTRL15, 16, 16}, |
| |
| {"FRC_OUT_HOLD_CTRL->me_hold_line", FRC_OUT_HOLD_CTRL, 0, 8}, |
| {"FRC_OUT_HOLD_CTRL->mc_hold_line", FRC_OUT_HOLD_CTRL, 8, 8}, |
| {"FRC_INP_HOLD_CTRL->inp_hold_line", FRC_INP_HOLD_CTRL, 0, 13}, |
| |
| {"FRC_FRAME_BUFFER_NUM->logo_fb_num", FRC_FRAME_BUFFER_NUM, 0, 5}, |
| {"FRC_FRAME_BUFFER_NUM->frc_fb_num", FRC_FRAME_BUFFER_NUM, 8, 5}, |
| |
| {"FRC_REG_BLK_SIZE_XY->reg_me_mvx_div_mode", FRC_REG_BLK_SIZE_XY, 14, 2}, |
| {"FRC_REG_BLK_SIZE_XY->reg_me_mvy_div_mode", FRC_REG_BLK_SIZE_XY, 12, 2}, |
| // {"FRC_REG_BLK_SIZE_XY->reg_hme_mvx_div_mode", FRC_REG_BLK_SIZE_XY, 2, 2}, |
| // {"FRC_REG_BLK_SIZE_XY->reg_hme_mvy_div_mode", FRC_REG_BLK_SIZE_XY, 0, 2}, |
| |
| {"FRC_REG_ME_DS_COEF_0", FRC_REG_ME_DS_COEF_0, 0, 0}, |
| {"FRC_REG_ME_DS_COEF_1", FRC_REG_ME_DS_COEF_1, 0, 0}, |
| {"FRC_REG_ME_DS_COEF_2", FRC_REG_ME_DS_COEF_2, 0, 0}, |
| {"FRC_REG_ME_DS_COEF_3", FRC_REG_ME_DS_COEF_3, 0, 0}, |
| }; |
| |
| void frc_dump_reg_tab(void) |
| { |
| u32 i = 0; |
| enum chip_id chip; |
| |
| chip = get_chip_type(); |
| if (chip == ID_T3X) { |
| pr_frc(0, "VIU_FRC_MISC (0x%x)->bypass val:0x%x (1:bypass)\n", |
| VIU_FRC_MISC, vpu_reg_read(VIU_FRC_MISC) & 0x1); |
| pr_frc(0, "VIU_FRC_MISC (0x%x)->pos_sel val:0x%x (0:after blend)\n", |
| VIU_FRC_MISC, (vpu_reg_read(VIU_FRC_MISC) >> 4) & 0x1); |
| pr_frc(0, "ENCL_FRC_CTRL (0x%x)->val:0x%x\n", |
| ENCL_FRC_CTRL_T3X, vpu_reg_read(ENCL_FRC_CTRL_T3X) & 0xffff); |
| pr_frc(0, "ENCL_VIDEO_VAVON_BLINE:0x%x->val: 0x%x\n", |
| ENCL_VIDEO_VAVON_BLINE_T3X, |
| (vpu_reg_read(ENCL_VIDEO_VAVON_BLINE_T3X) >> 16) & 0xffff); |
| } else if (chip == ID_T5M || chip == ID_T3) { |
| pr_frc(0, "VPU_FRC_TOP_CTRL (0x%x)->bypass val:0x%x (1:bypass)\n", |
| VPU_FRC_TOP_CTRL, vpu_reg_read(VPU_FRC_TOP_CTRL) & 0x1); |
| |
| pr_frc(0, "VPU_FRC_TOP_CTRL (0x%x)->pos_sel val:0x%x (0:after blend)\n", |
| VPU_FRC_TOP_CTRL, (vpu_reg_read(VPU_FRC_TOP_CTRL) >> 4) & 0x1); |
| |
| pr_frc(0, "ENCL_FRC_CTRL (0x%x)->val:0x%x\n", |
| ENCL_FRC_CTRL, vpu_reg_read(ENCL_FRC_CTRL) & 0xffff); |
| |
| pr_frc(0, "ENCL_VIDEO_VAVON_BLINE:0x%x->val: 0x%x\n", |
| ENCL_VIDEO_VAVON_BLINE, |
| vpu_reg_read(ENCL_VIDEO_VAVON_BLINE) & 0xffff); |
| } |
| for (i = 0; i < FRC_DBG_DUMP_TABLE_NUM; i++) { |
| if (frc_reg_tab[i].len != 0) { |
| pr_frc(0, "%s (0x%x) val:0x%x\n", |
| frc_reg_tab[i].name, frc_reg_tab[i].addr, |
| READ_FRC_BITS(frc_reg_tab[i].addr, |
| frc_reg_tab[i].start, frc_reg_tab[i].len)); |
| } else { |
| pr_frc(0, "%s (0x%x) val:0x%x\n", |
| frc_reg_tab[i].name, frc_reg_tab[i].addr, |
| READ_FRC_REG(frc_reg_tab[i].addr)); |
| } |
| } |
| } |
| |
| /*request from xianjun, dump fixed table reg*/ |
| void frc_dump_fixed_table(void) |
| { |
| int i = 0; |
| unsigned int value = 0; |
| enum chip_id chip; |
| |
| chip = get_chip_type(); |
| |
| if (chip == ID_T3) { |
| for (i = 0; i < T3_DRV_REG_NUM; i++) { |
| value = READ_FRC_REG(t3_drv_regs_table[i].addr); |
| pr_frc(0, "0x%04x, 0x%08x\n", t3_drv_regs_table[i].addr, value); |
| } |
| } else if (chip == ID_T5M) { |
| for (i = 0; i < T5M_REG_NUM; i++) { |
| value = READ_FRC_REG(t5m_regs_table[i].addr); |
| pr_frc(0, "0x%04x, 0x%08x\n", t5m_regs_table[i].addr, value); |
| } |
| } else if (chip == ID_T3X) { |
| for (i = 0; i < T3X_REG_NUM; i++) { |
| value = READ_FRC_REG(t3x_regs_table[i].addr); |
| pr_frc(0, "0x%04x, 0x%08x\n", t3x_regs_table[i].addr, value); |
| } |
| } |
| } |
| |
| void frc_set_val_from_reg(void) |
| { |
| regdata_loadorgframe[0] = 0; |
| regdata_loadorgframe[1] = 0; |
| regdata_loadorgframe[2] = 0; |
| |
| regdata_inpholdctl_0002 = READ_FRC_REG(FRC_INP_HOLD_CTRL); |
| regdata_outholdctl_0003 = READ_FRC_REG(FRC_OUT_HOLD_CTRL); |
| regdata_top_ctl_0007 = READ_FRC_REG(FRC_REG_TOP_CTRL7); |
| regdata_top_ctl_0009 = READ_FRC_REG(FRC_REG_TOP_CTRL9); |
| regdata_top_ctl_0011 = READ_FRC_REG(FRC_REG_TOP_CTRL17); |
| |
| regdata_pat_pointer_0102 = READ_FRC_REG(FRC_REG_PAT_POINTER); |
| // regdata_loadorgframe[16]; // 0x0103 |
| |
| regdata_phs_tab_0116 = READ_FRC_REG(FRC_REG_PHS_TABLE); |
| regdata_blksizexy_012b = READ_FRC_REG(FRC_REG_BLK_SIZE_XY); |
| regdata_blkscale_012c = READ_FRC_REG(FRC_REG_BLK_SCALE); |
| regdata_hme_scale_012d = READ_FRC_REG(FRC_REG_ME_SCALE); |
| |
| regdata_logodbg_0142 = READ_FRC_REG(FRC_LOGO_DEBUG); |
| |
| regdata_iplogo_en_0503 = READ_FRC_REG(FRC_IPLOGO_EN); |
| regdata_bbd_t2b_0604 = READ_FRC_REG(FRC_BBD_DETECT_REGION_TOP2BOT); |
| regdata_bbd_l2r_0605 = READ_FRC_REG(FRC_BBD_DETECT_REGION_LFT2RIT); |
| |
| regdata_me_en_1100 = READ_FRC_REG(FRC_ME_EN); |
| regdata_me_bbpixed_1108 = READ_FRC_REG(FRC_ME_BB_PIX_ED); |
| regdata_me_bbblked_110a = READ_FRC_REG(FRC_ME_BB_BLK_ED); |
| regdata_me_stat12rhst_110b = READ_FRC_REG(FRC_ME_STAT_12R_HST); |
| regdata_me_stat12rh_110c = READ_FRC_REG(FRC_ME_STAT_12R_H01); |
| regdata_me_stat12rh_110d = READ_FRC_REG(FRC_ME_STAT_12R_H23); |
| regdata_me_stat12rv_110e = READ_FRC_REG(FRC_ME_STAT_12R_V0); |
| regdata_me_stat12rv_110f = READ_FRC_REG(FRC_ME_STAT_12R_V1); |
| |
| regdata_vpbb1_1e03 = READ_FRC_REG(FRC_VP_BB_1); |
| regdata_vpbb2_1e04 = READ_FRC_REG(FRC_VP_BB_2); |
| regdata_vpmebb1_1e05 = READ_FRC_REG(FRC_VP_ME_BB_1); |
| regdata_vpmebb2_1e06 = READ_FRC_REG(FRC_VP_ME_BB_2); |
| |
| regdata_vp_win1_1e58 = READ_FRC_REG(FRC_VP_REGION_WINDOW_1); |
| regdata_vp_win2_1e59 = READ_FRC_REG(FRC_VP_REGION_WINDOW_2); |
| regdata_vp_win3_1e5a = READ_FRC_REG(FRC_VP_REGION_WINDOW_3); |
| regdata_vp_win4_1e5b = READ_FRC_REG(FRC_VP_REGION_WINDOW_4); |
| |
| regdata_mcset1_3000 = READ_FRC_REG(FRC_MC_SETTING1); |
| regdata_mcset2_3001 = READ_FRC_REG(FRC_MC_SETTING2); |
| |
| regdata_mcdemo_win_3200 = READ_FRC_REG(FRC_MC_DEMO_WINDOW); |
| |
| regdata_topctl_3f01 = READ_FRC_REG(FRC_TOP_CTRL); |
| } |
| EXPORT_SYMBOL(frc_set_val_from_reg); |
| |
| void frc_load_reg_table(struct frc_dev_s *frc_devp, u8 flag) |
| { |
| enum chip_id chip; |
| int i; |
| |
| if (!frc_devp) |
| return; |
| |
| chip = get_chip_type(); |
| if (chip == ID_T3) { |
| for (i = 0; i < T3_DRV_REG_NUM; i++) |
| WRITE_FRC_REG_BY_CPU(t3_drv_regs_table[i].addr, t3_drv_regs_table[i].value); |
| pr_frc(0, "t3_drv_regs_table[%d] init done\n", T3_DRV_REG_NUM); |
| regdata_inpmoden_04f9 = READ_FRC_REG(FRC_REG_INP_MODULE_EN + 0xA0); |
| } else if (chip == ID_T5M) { |
| for (i = 0; i < T5M_DRV_REG_NUM; i++) |
| WRITE_FRC_REG_BY_CPU(t5m_regs_table[i].addr, t5m_regs_table[i].value); |
| pr_frc(0, "t5m_drv_regs_table[%d] init done\n", T5M_DRV_REG_NUM); |
| regdata_inpmoden_04f9 = READ_FRC_REG(FRC_REG_INP_MODULE_EN); |
| } else if (chip == ID_T3X && flag == 0) { |
| for (i = 0; i < T3X_REG_NUM; i++) |
| WRITE_FRC_REG_BY_CPU(t3x_regs_table[i].addr, |
| t3x_regs_table[i].value); |
| pr_frc(0, "t3x_regs_table[%d] init done\n", T3X_REG_NUM); |
| regdata_inpmoden_04f9 = READ_FRC_REG(FRC_REG_INP_MODULE_EN); |
| } |
| } |
| |
| /* driver probe call */ |
| void frc_internal_initial(struct frc_dev_s *frc_devp) |
| { |
| // int i; |
| enum chip_id chip; |
| struct frc_fw_data_s *fw_data; |
| struct frc_top_type_s *frc_top; |
| u32 me_hold_line;//me_hold_line |
| u32 mc_hold_line;//mc_hold_line |
| u32 inp_hold_line; |
| u32 out_frm_dly_num = 0; |
| u32 ctrl_frame_num = 0; |
| |
| if (!frc_devp) |
| return; |
| |
| fw_data = (struct frc_fw_data_s *)frc_devp->fw_data; |
| frc_top = &fw_data->frc_top_type; |
| chip = get_chip_type(); |
| |
| me_hold_line = fw_data->holdline_parm.me_hold_line; |
| mc_hold_line = fw_data->holdline_parm.mc_hold_line; |
| inp_hold_line = fw_data->holdline_parm.inp_hold_line; |
| |
| regdata_outholdctl_0003 = READ_FRC_REG(FRC_OUT_HOLD_CTRL); |
| regdata_inpholdctl_0002 = READ_FRC_REG(FRC_INP_HOLD_CTRL); |
| frc_config_reg_value(me_hold_line, 0xff, ®data_outholdctl_0003); |
| frc_config_reg_value(mc_hold_line << 8, 0xff00, ®data_outholdctl_0003); |
| WRITE_FRC_REG_BY_CPU(FRC_OUT_HOLD_CTRL, regdata_outholdctl_0003); |
| frc_config_reg_value(inp_hold_line, 0x1fff, ®data_inpholdctl_0002); |
| WRITE_FRC_REG_BY_CPU(FRC_INP_HOLD_CTRL, regdata_inpholdctl_0002); |
| frc_set_arb_ugt_cfg(ARB_UGT_WR, 1, 15); |
| // sys_fw_param_frc_init(frc_top->hsize, frc_top->vsize, frc_top->is_me1mc4); |
| // init_bb_xyxy(frc_top->hsize, frc_top->vsize, frc_top->is_me1mc4); |
| frc_inp_init(); |
| if (frc_devp->in_out_ratio == FRC_RATIO_1_1) |
| frc_devp->ud_dbg.res2_time_en = 3; |
| else |
| frc_devp->ud_dbg.res2_time_en = 0; |
| // config_phs_lut(frc_top->frc_ratio_mode, frc_top->film_mode); |
| // config_phs_regs(frc_top->frc_ratio_mode, frc_top->film_mode); |
| config_me_top_hw_reg(); |
| if (chip >= ID_T3X) { |
| frc_top->memc_loss_en = 0x13; |
| frc_cfg_memc_loss(frc_top->memc_loss_en & 0x3); |
| frc_cfg_mcdw_loss((frc_top->memc_loss_en >> 4) & 0x01); |
| out_frm_dly_num = 0x0; |
| ctrl_frame_num = (FRC_FREEZE_FRAME_NUM_T3X | |
| FRC_BYPASS_FRAME_NUM_T3X << 4); |
| // WRITE_FRC_BITS(FRC_REG_TOP_RESERVE0, 0x17, 0, 8); // rev.A |
| // WRITE_FRC_BITS(FRC_REG_TOP_RESERVE0, 0x46, 0, 8); // rev.B |
| // WRITE_FRC_BITS(FRC_REG_TOP_RESERVE0, 0x78, 0, 8); // rev.B + prevsync |
| WRITE_FRC_BITS(FRC_REG_TOP_RESERVE0, ctrl_frame_num, 0, 8); |
| |
| // frc_memc_120hz_patch_1(frc_devp); |
| } else { |
| frc_top->memc_loss_en = 0x03; |
| frc_cfg_memc_loss(frc_top->memc_loss_en & 0x3); |
| out_frm_dly_num = 0x03000000; |
| ctrl_frame_num = (FRC_FREEZE_FRAME_NUM | |
| FRC_BYPASS_FRAME_NUM << 4); |
| WRITE_FRC_BITS(FRC_REG_TOP_RESERVE0, ctrl_frame_num, 0, 8); |
| } |
| if (frc_devp->ud_dbg.res2_dbg_en == 3) { |
| if (frc_devp->out_sts.out_framerate > 90) { |
| t3x_eco_initial(); |
| t3x_eco_qp_cfg(2); |
| } else if (frc_devp->out_sts.out_framerate < 70) |
| t3x_verB_60hz_patch(); |
| } |
| |
| // protect mode, enable: memc delay 2 frame |
| if (frc_devp->prot_mode) { |
| regdata_top_ctl_0009 = READ_FRC_REG(FRC_REG_TOP_CTRL9); |
| regdata_top_ctl_0011 = READ_FRC_REG(FRC_REG_TOP_CTRL17); |
| frc_config_reg_value(out_frm_dly_num, 0x0F000000, |
| ®data_top_ctl_0009); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL9, regdata_top_ctl_0009); |
| frc_config_reg_value(0x100, 0x100, ®data_top_ctl_0011); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL17, regdata_top_ctl_0011); |
| WRITE_FRC_REG_BY_CPU(FRC_MODE_OPT, 0x6); // set bit1/bit2 |
| } else { |
| WRITE_FRC_REG_BY_CPU(FRC_MODE_OPT, 0x0); // clear bit1/bit2 |
| } |
| WRITE_FRC_REG_BY_CPU(FRC_PROC_SIZE, |
| (frc_devp->out_sts.vout_height & 0x3fff) << 16 | |
| (frc_devp->out_sts.vout_width & 0x3fff)); |
| |
| return; |
| } |
| |
| u8 frc_frame_forcebuf_enable(u8 enable) |
| { |
| u8 ro_frc_input_fid = 0;//u4 |
| |
| if (enable == 1) { //frc off->on |
| ro_frc_input_fid = READ_FRC_REG(FRC_REG_PAT_POINTER) >> 4 & 0xF; |
| //force phase 0 |
| regdata_top_ctl_0007 = READ_FRC_REG(FRC_REG_TOP_CTRL7); |
| frc_config_reg_value(0x9000000, 0x9000000, ®data_top_ctl_0007); |
| // WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL7, regdata_top_ctl_0007); |
| // WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL8, 0); |
| FRC_RDMA_WR_REG_IN(FRC_REG_TOP_CTRL7, regdata_top_ctl_0007); |
| FRC_RDMA_WR_REG_IN(FRC_REG_TOP_CTRL8, 0); |
| } else { |
| frc_config_reg_value(0x0, 0xD000000, ®data_top_ctl_0007); |
| // WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL7, regdata_top_ctl_0007); |
| FRC_RDMA_WR_REG_IN(FRC_REG_TOP_CTRL7, regdata_top_ctl_0007); |
| } |
| return ro_frc_input_fid; |
| } |
| |
| void frc_frame_forcebuf_count(u8 forceidx) |
| { |
| // UPDATE_FRC_REG_BITS(FRC_REG_TOP_CTRL7, |
| // (forceidx | forceidx << 4 | forceidx << 8), 0xFFF);//0-11bit |
| // regdata_top_ctl_0007 = READ_FRC_REG(FRC_REG_TOP_CTRL7); |
| frc_config_reg_value((forceidx | forceidx << 4 | forceidx << 8), |
| 0xFFF, ®data_top_ctl_0007); |
| // WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL7, regdata_top_ctl_0007); |
| FRC_RDMA_WR_REG_IN(FRC_REG_TOP_CTRL7, regdata_top_ctl_0007); |
| } |
| |
| u16 frc_check_vf_rate(u16 duration, struct frc_dev_s *frc_devp) |
| { |
| int i, getflag; |
| u16 framerate = 0; |
| |
| /*duration: 1600(60fps) 1920(50fps) 3200(30fps) 3203(29.97)*/ |
| /*3840(25fps) 4000(24fps) 4004(23.976fps)*/ |
| i = 0; |
| getflag = 0; |
| while (i < FRAME_RATE_CNT) { |
| if (vf_rate_table[i].duration == duration) { |
| framerate = vf_rate_table[i].framerate; |
| getflag = 1; |
| break; |
| } |
| i++; |
| } |
| if (!getflag && duration > 333) { |
| framerate = 96000 / duration; |
| getflag = 1; |
| } |
| if (getflag == 1 && framerate != frc_devp->in_sts.frc_vf_rate) { |
| pr_frc(2, "input vf rate changed [%d->%d, duration:%d].\n", |
| frc_devp->in_sts.frc_vf_rate, framerate, |
| duration); |
| frc_devp->in_sts.frc_vf_rate = framerate; |
| getflag = 0; |
| } |
| return frc_devp->in_sts.frc_vf_rate; |
| } |
| |
| void frc_get_film_base_vf(struct frc_dev_s *frc_devp) |
| { |
| struct frc_fw_data_s *pfw_data; |
| u16 in_frame_rate = frc_devp->in_sts.frc_vf_rate; |
| u16 outfrmrate = frc_devp->out_sts.out_framerate; |
| // u32 vf_duration = frc_devp->in_sts.duration; |
| |
| pfw_data = (struct frc_fw_data_s *)frc_devp->fw_data; |
| pfw_data->frc_top_type.film_mode = EN_DRV_VIDEO; |
| pfw_data->frc_top_type.vfp &= 0xFFFFFFF0; |
| if (frc_devp->in_sts.frc_is_tvin) // HDMI_src no inform alg |
| return; |
| if ((pfw_data->frc_top_type.vfp & BIT_7) == BIT_7) |
| return; |
| if ((pfw_data->frc_top_type.vfp & BIT_4) == 0) |
| return; |
| pfw_data->frc_top_type.vfp &= 0xfffffff0; |
| pfw_data->frc_top_type.vfp |= 0x4; |
| pr_frc(1, "get in_rate:%d,out_rate:%d\n", in_frame_rate, outfrmrate); |
| switch (in_frame_rate) { |
| case FRC_VD_FPS_24: |
| if (outfrmrate == 50) { |
| pfw_data->frc_top_type.film_mode = EN_DRV_FILM1123; |
| } else if (outfrmrate == 60 || outfrmrate == 59) { |
| pfw_data->frc_top_type.film_mode = EN_DRV_FILM32; |
| pfw_data->frc_top_type.vfp |= 0x07; |
| } else if (outfrmrate == 120) { |
| pfw_data->frc_top_type.film_mode = EN_DRV_FILM55; |
| } |
| break; |
| case FRC_VD_FPS_25: |
| if (outfrmrate == 50) { |
| pfw_data->frc_top_type.film_mode = EN_DRV_FILM22; |
| pfw_data->frc_top_type.vfp |= 0x04; |
| } else if (outfrmrate == 60 || outfrmrate == 59) { |
| pfw_data->frc_top_type.film_mode = EN_DRV_FILM32322; |
| } else if (outfrmrate == 100) { |
| pfw_data->frc_top_type.film_mode = EN_DRV_FILM44; |
| } |
| break; |
| case FRC_VD_FPS_30: |
| if (outfrmrate == 50) { |
| pfw_data->frc_top_type.film_mode = EN_DRV_FILM212; |
| } else if (outfrmrate == 60 || outfrmrate == 59) { |
| pfw_data->frc_top_type.film_mode = EN_DRV_FILM22; |
| pfw_data->frc_top_type.vfp |= 0x04; |
| } else if (outfrmrate == 120) { |
| pfw_data->frc_top_type.film_mode = EN_DRV_FILM44; |
| } |
| break; |
| case FRC_VD_FPS_50: |
| if (outfrmrate == 60 || outfrmrate == 59) { |
| pfw_data->frc_top_type.film_mode = EN_DRV_FILM21111; |
| } else if (outfrmrate == 100) { |
| pfw_data->frc_top_type.film_mode = EN_DRV_FILM22; |
| pfw_data->frc_top_type.vfp |= 0x04; |
| } |
| break; |
| case FRC_VD_FPS_60: |
| if (outfrmrate == 120) { |
| pfw_data->frc_top_type.film_mode = EN_DRV_FILM22; |
| pfw_data->frc_top_type.vfp |= 0x04; |
| } |
| break; |
| default: |
| pfw_data->frc_top_type.film_mode = EN_DRV_VIDEO; |
| break; |
| } |
| } |
| |
| void frc_set_enter_forcefilm(struct frc_dev_s *frc_devp, u16 flag) |
| { |
| struct frc_fw_data_s *pfw_data; |
| |
| pfw_data = (struct frc_fw_data_s *)frc_devp->fw_data; |
| |
| if (flag) |
| pfw_data->frc_top_type.vfp |= BIT_4; |
| else |
| pfw_data->frc_top_type.vfp &= (~BIT_4); |
| } |
| |
| void frc_set_notell_film(struct frc_dev_s *frc_devp, u16 flag) |
| { |
| struct frc_fw_data_s *pfw_data; |
| |
| pfw_data = (struct frc_fw_data_s *)frc_devp->fw_data; |
| |
| if (flag == 1) |
| pfw_data->frc_top_type.vfp |= BIT_7; |
| else |
| pfw_data->frc_top_type.vfp &= ~BIT_7; |
| pfw_data->frc_top_type.vfp &= ~BIT_6; |
| } |
| |
| void frc_set_output_pattern(u8 enpat) |
| { |
| u8 realpattern = 4; |
| |
| if (enpat) { |
| realpattern = realpattern + enpat; |
| if (realpattern > 9) |
| realpattern = 9; |
| frc_mtx_cfg(FRC_OUTPUT_CSC, realpattern); |
| } else { |
| frc_mtx_cfg(FRC_OUTPUT_CSC, DEFAULT); |
| } |
| } |
| |
| void frc_set_input_pattern(u8 enpat) |
| { |
| u8 realpattern = 4; |
| |
| if (enpat) { |
| realpattern = realpattern + enpat; |
| if (realpattern > 9) |
| realpattern = 9; |
| frc_mtx_cfg(FRC_INPUT_CSC, realpattern); |
| } else { |
| frc_mtx_cfg(FRC_INPUT_CSC, DEFAULT); |
| } |
| } |
| |
| void frc_set_arb_ugt_cfg(enum frc_arb_ugt ch, u8 urgent, u8 level) |
| { |
| u32 urgent_val; |
| enum chip_id chip; |
| |
| u32 reg_0x0974 = READ_FRC_REG(FRC_ARB_UGT_RD_BASIC); |
| u32 reg_0x0994 = READ_FRC_REG(FRC_ARB_UGT_WR_BASIC); |
| u32 reg_0x3f07 = READ_FRC_REG(FRC_AXIRD0_QLEVEL); |
| u32 reg_0x3f08 = READ_FRC_REG(FRC_AXIRD1_QLEVEL); |
| u32 reg_0x3f09 = READ_FRC_REG(FRC_AXIWR0_QLEVEL); |
| |
| chip = get_chip_type(); |
| urgent_val = (urgent > 3) ? 3 : urgent; |
| pr_frc(1, "%s set (ch:%d, urgent:%d, level:%d)\n", __func__, ch, urgent, level); |
| if ((chip == ID_T3X || chip == ID_T5M) && urgent_val > 1) { |
| pr_frc(1, "T3X/T5M only 0 or 1 urgent\n"); |
| urgent_val = 1; |
| } |
| switch (ch) { |
| case ARB_UGT_R0: |
| frc_config_reg_value(urgent_val, BIT_0 + BIT_1, ®_0x0974); |
| WRITE_FRC_REG_BY_CPU(FRC_ARB_UGT_RD_BASIC, reg_0x0974); |
| reg_0x3f07 &= 0xFFFF0000; |
| WRITE_FRC_REG_BY_CPU(FRC_AXIRD0_QLEVEL, reg_0x3f07 | level << urgent_val * 4); |
| break; |
| case ARB_UGT_R1: |
| frc_config_reg_value(urgent_val << 2, BIT_2 + BIT_3, ®_0x0974); |
| WRITE_FRC_REG_BY_CPU(FRC_ARB_UGT_RD_BASIC, reg_0x0974); |
| reg_0x3f07 &= 0x0000FFFF; |
| WRITE_FRC_REG_BY_CPU(FRC_AXIRD0_QLEVEL, |
| reg_0x3f07 | level << (urgent_val * 4 + 16)); |
| break; |
| case ARB_UGT_R2: |
| frc_config_reg_value(urgent_val << 4, BIT_4 + BIT_5, ®_0x0974); |
| WRITE_FRC_REG_BY_CPU(FRC_ARB_UGT_RD_BASIC, reg_0x0974); |
| reg_0x3f08 &= 0xFFFF0000; |
| WRITE_FRC_REG_BY_CPU(FRC_AXIRD1_QLEVEL, reg_0x3f08 | level << urgent_val * 4); |
| break; |
| case ARB_UGT_R3: |
| frc_config_reg_value(urgent_val << 6, BIT_6 + BIT_7, ®_0x0974); |
| WRITE_FRC_REG_BY_CPU(FRC_ARB_UGT_RD_BASIC, reg_0x0974); |
| reg_0x3f08 &= 0x0000FFFF; |
| WRITE_FRC_REG_BY_CPU(FRC_AXIRD1_QLEVEL, |
| reg_0x3f08 | level << (urgent_val * 4 + 16)); |
| break; |
| case ARB_UGT_W0: |
| frc_config_reg_value(urgent_val, BIT_0 + BIT_1, ®_0x0994); |
| WRITE_FRC_REG_BY_CPU(FRC_ARB_UGT_WR_BASIC, reg_0x0994); |
| reg_0x3f09 &= 0xFFFF0000; |
| WRITE_FRC_REG_BY_CPU(FRC_AXIWR0_QLEVEL, reg_0x3f09 | level << urgent_val * 4); |
| break; |
| case ARB_UGT_W1: |
| frc_config_reg_value(urgent_val << 2, BIT_2 + BIT_3, ®_0x0994); |
| WRITE_FRC_REG_BY_CPU(FRC_ARB_UGT_WR_BASIC, reg_0x0994); |
| reg_0x3f09 &= 0x0000FFFF; |
| WRITE_FRC_REG_BY_CPU(FRC_AXIWR0_QLEVEL, |
| reg_0x3f09 | level << (urgent_val * 4 + 16)); |
| break; |
| case ARB_UGT_WR: |
| reg_0x0974 &= 0xFF00; |
| reg_0x0974 |= urgent_val | (urgent_val << 2) | |
| (urgent_val << 4) | (urgent_val << 6); |
| WRITE_FRC_REG_BY_CPU(FRC_ARB_UGT_RD_BASIC, reg_0x0974); |
| reg_0x0994 &= 0xFFF0; |
| reg_0x0994 |= urgent_val | (urgent_val << 2); |
| WRITE_FRC_REG_BY_CPU(FRC_ARB_UGT_WR_BASIC, reg_0x0994); |
| reg_0x3f07 = (level << (urgent_val & 0x3) * 4) | |
| (level << ((urgent_val & 0x3) * 4 + 16)); |
| WRITE_FRC_REG_BY_CPU(FRC_AXIRD0_QLEVEL, reg_0x3f07); |
| reg_0x3f08 = reg_0x3f07; |
| WRITE_FRC_REG_BY_CPU(FRC_AXIRD1_QLEVEL, reg_0x3f08); |
| reg_0x3f09 = reg_0x3f08; |
| WRITE_FRC_REG_BY_CPU(FRC_AXIWR0_QLEVEL, reg_0x3f09); |
| break; |
| default: |
| PR_FRC("%s ch:%d error", __func__, ch); |
| break; |
| } |
| pr_frc(1, "FRC_ARB_UGT_RD_BASIC=0x%x\n", |
| READ_FRC_REG(FRC_ARB_UGT_RD_BASIC)); |
| pr_frc(1, "FRC_ARB_UGT_WR_BASIC=0x%x\n", |
| READ_FRC_REG(FRC_ARB_UGT_WR_BASIC)); |
| pr_frc(1, "FRC_AXIRD0_QLEVEL=0x%x\n", |
| READ_FRC_REG(FRC_AXIRD0_QLEVEL)); |
| pr_frc(1, "FRC_AXIRD1_QLEVEL=0x%x\n", |
| READ_FRC_REG(FRC_AXIRD1_QLEVEL)); |
| pr_frc(1, "FRC_AXIWR0_QLEVEL=0x%x\n", |
| READ_FRC_REG(FRC_AXIWR0_QLEVEL)); |
| } |
| |
| void frc_set_n2m(u8 ratio_value) |
| { |
| struct frc_dev_s *devp = get_frc_devp(); |
| |
| if (get_chip_type() == ID_T3) |
| return; |
| |
| if (ratio_value == devp->in_out_ratio) |
| return; |
| if (ratio_value <= (u8)FRC_RATIO_1_1) { |
| devp->in_out_ratio = (enum frc_ratio_mode_type)ratio_value; |
| if ((devp->use_pre_vsync & PRE_VSYNC_120HZ) == |
| PRE_VSYNC_120HZ) { |
| set_vsync_2to1_mode(0); |
| set_pre_vsync_mode(1); |
| } else if ((devp->use_pre_vsync & PRE_VSYNC_060HZ) == |
| PRE_VSYNC_060HZ) { |
| set_vsync_2to1_mode(0); |
| set_pre_vsync_mode(1); |
| } else { |
| set_vsync_2to1_mode((ratio_value > 0) ? 0 : 1); |
| set_pre_vsync_mode(0); |
| } |
| if (ratio_value == FRC_RATIO_1_1) |
| devp->ud_dbg.res2_time_en = 3; |
| else |
| devp->ud_dbg.res2_time_en = 0; |
| if (devp->frc_sts.state == FRC_STATE_ENABLE) |
| devp->frc_sts.re_config = true; |
| } |
| } |
| |
| int frc_set_n2m_from_vc(struct vframe_s *vf) |
| { |
| enum frc_operation_mode_e vc_flag; |
| int ret; |
| struct frc_dev_s *devp; |
| struct frc_fw_data_s *pfw_data; |
| |
| ret = 0; |
| devp = get_frc_devp(); |
| if (!devp) |
| return -1; |
| if (devp->auto_n2m != 2) |
| return ret; |
| |
| if (!vf) { |
| return -1; |
| } else if (!vf->vc_private) { |
| PR_FRC("frame_index = %d vf->vc_private is NULL\n", vf->frame_index); |
| return -1; |
| } |
| |
| pfw_data = (struct frc_fw_data_s *)devp->fw_data; |
| vc_flag = vf->vc_private->frc_operation_mode; |
| if (!devp->in_sts.vc_set_n2m_change) |
| return vc_flag == VC_FRC_FLAG_BYPASS ? -1 : 0; |
| |
| switch (vc_flag) { |
| case VC_FRC_FLAG_BYPASS: |
| ret = -1; |
| break; |
| case VC_FRC_FLAG_1_1: |
| frc_set_n2m(FRC_RATIO_1_1); |
| set_vsync_2to1_mode(0); |
| set_pre_vsync_mode(0); |
| pfw_data->frc_fw_alg_ctrl.frc_algctrl_u8param4 = 1; |
| break; |
| case VC_FRC_FLAG_1_2: |
| frc_set_n2m(FRC_RATIO_1_2); |
| set_vsync_2to1_mode(0); |
| set_pre_vsync_mode(1); |
| pfw_data->frc_fw_alg_ctrl.frc_algctrl_u8param4 = 2; |
| break; |
| case VC_FRC_FLAG_2_5: |
| frc_set_n2m(FRC_RATIO_2_5); |
| set_vsync_2to1_mode(0); |
| set_pre_vsync_mode(1); |
| pfw_data->frc_fw_alg_ctrl.frc_algctrl_u8param4 = 2; |
| break; |
| case VC_FRC_FLAG_5_6: |
| frc_set_n2m(FRC_RATIO_5_6); |
| set_vsync_2to1_mode(0); |
| set_pre_vsync_mode(1); |
| pfw_data->frc_fw_alg_ctrl.frc_algctrl_u8param4 = 2; |
| break; |
| case VC_FRC_FLAG_5_12: |
| frc_set_n2m(FRC_RATIO_5_12); |
| set_vsync_2to1_mode(0); |
| set_pre_vsync_mode(1); |
| pfw_data->frc_fw_alg_ctrl.frc_algctrl_u8param4 = 2; |
| break; |
| default: |
| ret = -1; |
| pr_frc(1, "%s vc input arg err", __func__); |
| break; |
| } |
| pr_frc(2, "%s --> %d\n", __func__, vf->vc_private->frc_operation_mode); |
| return ret; |
| } |
| |
| void frc_set_axi_crash_irq(struct frc_dev_s *frc_devp, u8 enable) |
| { |
| if (frc_devp->axi_crash_irq <= 0) |
| return; |
| |
| if (enable == 1) |
| enable_irq(frc_devp->axi_crash_irq); |
| else if (enable == 0) |
| disable_irq(frc_devp->axi_crash_irq); |
| else |
| pr_frc(1, "%s invalid param\n", __func__); |
| } |
| |
| /* frc chip type |
| * return chip ID |
| */ |
| int get_chip_type(void) |
| { |
| enum chip_id chip; |
| struct frc_dev_s *devp; |
| struct frc_data_s *frc_data; |
| |
| devp = get_frc_devp(); |
| frc_data = (struct frc_data_s *)devp->data; |
| chip = frc_data->match_data->chip; |
| |
| if (chip == ID_T3) |
| return ID_T3; |
| else if (chip == ID_T5M) |
| return ID_T5M; |
| else if (chip == ID_T3X) |
| return ID_T3X; |
| else if (chip == ID_TMAX) |
| return ID_TMAX; |
| else |
| return ID_NULL; |
| } |
| |
| static void frc_force_h2v2(u32 mcdw_path_en, u32 h2v2_mode, u32 mcdw_loss_en) |
| { |
| u32 tmp = 0; |
| |
| tmp = READ_FRC_REG(FRC_MC_H2V2_SETTING); |
| tmp |= ((h2v2_mode >> 1) & 0x1) << 30; |
| tmp |= (h2v2_mode & 0x1) << 24; |
| WRITE_FRC_REG_BY_CPU(FRC_MC_H2V2_SETTING, tmp); |
| |
| tmp = READ_FRC_REG(FRC_INP_MCDW_CTRL); |
| tmp |= (h2v2_mode & 0x3) << 24; |
| tmp |= (mcdw_path_en & 0x1); |
| tmp |= (mcdw_loss_en & 0x1) << 4; |
| WRITE_FRC_REG_BY_CPU(FRC_INP_MCDW_CTRL, tmp); |
| |
| tmp = READ_FRC_REG(FRC_MCDW_PATH_CTRL); |
| tmp |= h2v2_mode & 0x3; |
| tmp |= (mcdw_path_en & 0x1) << 4; |
| WRITE_FRC_REG_BY_CPU(FRC_MCDW_PATH_CTRL, tmp); |
| |
| tmp = READ_FRC_REG(FRC_BYP_PATH_CTRL); |
| tmp |= BIT_4; |
| WRITE_FRC_REG_BY_CPU(FRC_BYP_PATH_CTRL, tmp); |
| |
| tmp = READ_FRC_REG(FRC_INP_PATH_OPT); |
| tmp |= 0x01E; |
| WRITE_FRC_REG_BY_CPU(FRC_INP_PATH_OPT, tmp); |
| |
| pr_frc(1, "%s set\n", __func__); |
| pr_frc(1, "FRC_MC_H2V2_SETTING=0x%x\n", |
| READ_FRC_REG(FRC_MC_H2V2_SETTING)); |
| pr_frc(1, "FRC_INP_MCDW_CTRL=0x%x\n", |
| READ_FRC_REG(FRC_INP_MCDW_CTRL)); |
| pr_frc(1, "FRC_MCDW_PATH_CTRL=0x%x\n", |
| READ_FRC_REG(FRC_MCDW_PATH_CTRL)); |
| pr_frc(1, "FRC_BYP_PATH_CTRL=0x%x\n", |
| READ_FRC_REG(FRC_BYP_PATH_CTRL)); |
| pr_frc(1, "FRC_INP_PATH_OPT=0x%x\n", |
| READ_FRC_REG(FRC_INP_PATH_OPT)); |
| } |
| |
| static void frc_disable_h2v2(void) |
| { |
| u32 tmp = 0; |
| |
| tmp = READ_FRC_REG(FRC_MC_H2V2_SETTING); |
| tmp &= 0xBEFFFFFF; // clear bit24,30 |
| WRITE_FRC_REG_BY_CPU(FRC_MC_H2V2_SETTING, tmp); |
| |
| tmp = READ_FRC_REG(FRC_INP_MCDW_CTRL); |
| tmp &= 0xFCFFFFEE ; // clear bit24/25,0,4 |
| WRITE_FRC_REG_BY_CPU(FRC_INP_MCDW_CTRL, tmp); |
| |
| tmp = READ_FRC_REG(FRC_MCDW_PATH_CTRL); |
| tmp &= 0xFFFFFFEC; // clear bit4, 0/1 |
| WRITE_FRC_REG_BY_CPU(FRC_MCDW_PATH_CTRL, tmp); |
| |
| tmp = READ_FRC_REG(FRC_BYP_PATH_CTRL); |
| tmp &= 0xFFFFFFEF; // clear bit4 |
| WRITE_FRC_REG_BY_CPU(FRC_BYP_PATH_CTRL, tmp); |
| |
| tmp = READ_FRC_REG(FRC_INP_PATH_OPT); |
| tmp &= 0xFFFFFFE1; // clear bit 4,3,2,1 |
| WRITE_FRC_REG_BY_CPU(FRC_INP_PATH_OPT, tmp); |
| |
| pr_frc(1, "%s clear\n", __func__); |
| pr_frc(1, "FRC_MC_H2V2_SETTING=0x%x\n", |
| READ_FRC_REG(FRC_MC_H2V2_SETTING)); |
| pr_frc(1, "FRC_INP_MCDW_CTRL=0x%x\n", |
| READ_FRC_REG(FRC_INP_MCDW_CTRL)); |
| pr_frc(1, "FRC_MCDW_PATH_CTRL=0x%x\n", |
| READ_FRC_REG(FRC_MCDW_PATH_CTRL)); |
| pr_frc(1, "FRC_BYP_PATH_CTRL=0x%x\n", |
| READ_FRC_REG(FRC_BYP_PATH_CTRL)); |
| pr_frc(1, "FRC_INP_PATH_OPT=0x%x\n", |
| READ_FRC_REG(FRC_INP_PATH_OPT)); |
| } |
| |
| void frc_set_h2v2(u32 enable) |
| { |
| enum chip_id chip; |
| |
| chip = get_chip_type(); |
| if (chip < ID_T3X) { |
| pr_frc(0, "%s is not supported\n", __func__); |
| return; |
| } |
| if (enable == 1) |
| frc_force_h2v2(1, 3, 1); |
| else |
| frc_disable_h2v2(); |
| } |
| |
| void frc_set_mcdw_buffer_ratio(u32 ratio) |
| { |
| enum chip_id chip; |
| struct frc_dev_s *devp = get_frc_devp(); |
| |
| chip = get_chip_type(); |
| if (chip < ID_T3X) { |
| pr_frc(1, "%s is not supported\n", __func__); |
| return; |
| } |
| if (!(ratio & 0xf) || !((ratio >> 4) & 0xf)) { |
| pr_frc(1, "%s ratio value is err\n", __func__); |
| return; |
| } |
| devp->buf.mcdw_size_rate = (ratio & 0xff); |
| } |
| |
| void frc_memc_120hz_patch(struct frc_dev_s *frc_devp) |
| { |
| enum chip_id chip; |
| struct frc_fw_data_s *fw_data; |
| struct frc_top_type_s *frc_top; |
| u32 tmp = 0; |
| |
| if (!frc_devp) |
| return; |
| |
| fw_data = (struct frc_fw_data_s *)frc_devp->fw_data; |
| frc_top = &fw_data->frc_top_type; |
| chip = get_chip_type(); |
| |
| if (chip != ID_T3X) |
| return; |
| |
| // h2v2 setting |
| tmp = READ_FRC_REG(FRC_MC_H2V2_SETTING); |
| tmp |= BIT_30 + BIT_24 + BIT_23 + BIT_21 + BIT_19; |
| WRITE_FRC_REG_BY_CPU(FRC_MC_H2V2_SETTING, tmp); |
| |
| // hold mc chroma path |
| tmp = READ_FRC_REG(0x927); |
| tmp &= 0xFFFFFF8E; |
| tmp |= 0xFFFFFF7E; |
| WRITE_FRC_REG_BY_CPU(0x927, tmp); |
| |
| // close bbd opt |
| tmp = READ_FRC_REG(FRC_INP_PATH_OPT); |
| tmp |= BIT_3; |
| WRITE_FRC_REG_BY_CPU(FRC_INP_PATH_OPT, tmp); |
| |
| // mcdw |
| tmp = READ_FRC_REG(FRC_INP_MCDW_CTRL); |
| tmp |= BIT_28 + BIT_4 + BIT_0 + BIT_25; |
| tmp &= 0xFEFFFFFF; |
| WRITE_FRC_REG_BY_CPU(FRC_INP_MCDW_CTRL, tmp); |
| |
| tmp = READ_FRC_REG(FRC_MCDW_PATH_CTRL); |
| tmp |= BIT_4 + BIT_1; |
| tmp &= 0xFFFFFFFE; |
| WRITE_FRC_REG_BY_CPU(FRC_MCDW_PATH_CTRL, tmp); |
| |
| tmp = READ_FRC_REG(FRC_BYP_PATH_CTRL); |
| tmp |= BIT_0; |
| WRITE_FRC_REG_BY_CPU(FRC_BYP_PATH_CTRL, tmp); |
| |
| // mc lp mode set |
| tmp = READ_FRC_REG(FRC_MC_HW_CTRL0); |
| tmp |= BIT_3; |
| WRITE_FRC_REG_BY_CPU(FRC_MC_HW_CTRL0, tmp); |
| |
| // close mc loss |
| frc_top->memc_loss_en = 0x12; |
| frc_cfg_memc_loss(frc_top->memc_loss_en & 0x3); |
| |
| // mcdw setting |
| pr_frc(1, "%s set\n", __func__); |
| pr_frc(1, "FRC_MC_H2V2_SETTING=0x%x\n", |
| READ_FRC_REG(FRC_MC_H2V2_SETTING)); |
| pr_frc(1, "FRC_INP_MCDW_CTRL=0x%x\n", |
| READ_FRC_REG(FRC_INP_MCDW_CTRL)); |
| pr_frc(1, "FRC_MCDW_PATH_CTRL=0x%x\n", |
| READ_FRC_REG(FRC_MCDW_PATH_CTRL)); |
| pr_frc(1, "FRC_BYP_PATH_CTRL=0x%x\n", |
| READ_FRC_REG(FRC_BYP_PATH_CTRL)); |
| pr_frc(1, "FRC_INP_PATH_OPT=0x%x\n", |
| READ_FRC_REG(FRC_INP_PATH_OPT)); |
| } |
| |
| void frc_memc_120hz_patch_1(struct frc_dev_s *frc_devp) |
| { |
| enum chip_id chip; |
| struct frc_fw_data_s *fw_data; |
| struct frc_top_type_s *frc_top; |
| u32 tmp = 0; |
| |
| if (!frc_devp) |
| return; |
| |
| fw_data = (struct frc_fw_data_s *)frc_devp->fw_data; |
| frc_top = &fw_data->frc_top_type; |
| chip = get_chip_type(); |
| |
| if (chip != ID_T3X) |
| return; |
| |
| if (frc_devp->ud_dbg.res2_dbg_en == 1 || |
| frc_devp->ud_dbg.res2_dbg_en == 3) |
| return; |
| |
| // h2v2 setting |
| tmp = READ_FRC_REG(FRC_MC_H2V2_SETTING); |
| tmp |= 0x7E000000; |
| tmp |= 0x01F80000; |
| WRITE_FRC_REG_BY_CPU(FRC_MC_H2V2_SETTING, tmp); |
| |
| // hold mc chroma path |
| tmp = READ_FRC_REG(0x927); |
| tmp &= 0xFFFFFF8E; |
| tmp |= 0xFFFFFF7E; |
| WRITE_FRC_REG_BY_CPU(0x927, tmp); |
| |
| // close opt for prefetch phase |
| tmp = READ_FRC_REG(FRC_INP_PATH_OPT); |
| tmp |= 0x1B; |
| WRITE_FRC_REG_BY_CPU(FRC_INP_PATH_OPT, tmp); |
| |
| // OUT_INT_OPT |
| tmp = READ_FRC_REG(FRC_REG_MODE_OPT); |
| tmp |= 0x20; |
| WRITE_FRC_REG_BY_CPU(FRC_REG_MODE_OPT, tmp); |
| |
| // mcdw |
| tmp = READ_FRC_REG(FRC_INP_MCDW_CTRL); |
| tmp |= BIT_28 + BIT_4 + BIT_0 + BIT_25 + BIT_24; |
| // tmp &= 0xFEFFFFFF; |
| WRITE_FRC_REG_BY_CPU(FRC_INP_MCDW_CTRL, tmp); |
| |
| tmp = READ_FRC_REG(FRC_MCDW_PATH_CTRL); |
| tmp |= BIT_4 + BIT_1 + BIT_0; |
| // tmp &= 0xFFFFFFFE; |
| WRITE_FRC_REG_BY_CPU(FRC_MCDW_PATH_CTRL, tmp); |
| |
| tmp = READ_FRC_REG(FRC_BYP_PATH_CTRL); |
| tmp |= BIT_0 + BIT_4; |
| WRITE_FRC_REG_BY_CPU(FRC_BYP_PATH_CTRL, tmp); |
| |
| // mc lp mode set |
| tmp = READ_FRC_REG(FRC_MC_HW_CTRL0); |
| tmp |= BIT_3; |
| WRITE_FRC_REG_BY_CPU(FRC_MC_HW_CTRL0, tmp); |
| |
| // close mc loss |
| frc_top->memc_loss_en = 0x12; |
| frc_cfg_memc_loss(frc_top->memc_loss_en & 0x3); |
| |
| // mcdw setting |
| pr_frc(1, "%s set\n", __func__); |
| pr_frc(1, "FRC_MC_H2V2_SETTING=0x%x\n", |
| READ_FRC_REG(FRC_MC_H2V2_SETTING)); |
| pr_frc(1, "FRC_INP_MCDW_CTRL=0x%x\n", |
| READ_FRC_REG(FRC_INP_MCDW_CTRL)); |
| pr_frc(1, "FRC_MCDW_PATH_CTRL=0x%x\n", |
| READ_FRC_REG(FRC_MCDW_PATH_CTRL)); |
| pr_frc(1, "FRC_BYP_PATH_CTRL=0x%x\n", |
| READ_FRC_REG(FRC_BYP_PATH_CTRL)); |
| pr_frc(1, "FRC_INP_PATH_OPT=0x%x\n", |
| READ_FRC_REG(FRC_INP_PATH_OPT)); |
| } |
| |
| void frc_memc_120hz_patch_2(struct frc_dev_s *frc_devp) |
| { |
| enum chip_id chip; |
| struct frc_fw_data_s *fw_data; |
| struct frc_top_type_s *frc_top; |
| u32 tmp = 0; |
| |
| if (!frc_devp) |
| return; |
| |
| fw_data = (struct frc_fw_data_s *)frc_devp->fw_data; |
| frc_top = &fw_data->frc_top_type; |
| chip = get_chip_type(); |
| |
| if (chip != ID_T3X) |
| return; |
| if (frc_devp->ud_dbg.res2_dbg_en == 1 || |
| frc_devp->ud_dbg.res2_dbg_en == 3) |
| return; |
| if (frc_devp->little_win == 1 && chip == ID_T3X) |
| return; |
| // mcdw |
| tmp = READ_FRC_REG(FRC_INP_MCDW_CTRL); |
| tmp |= BIT_25; |
| tmp &= 0xFEFFFFFF; |
| WRITE_FRC_REG_BY_CPU(FRC_INP_MCDW_CTRL, tmp); |
| |
| // TOP setting |
| //tmp = READ_FRC_REG(FRC_REG_TOP_CTRL7); |
| //tmp |= 0x03000000; |
| //tmp &= 0xFFE00000; |
| //WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL7, tmp); |
| |
| //regdata_top_ctl_0007 = READ_FRC_REG(FRC_REG_TOP_CTRL7); |
| //frc_config_reg_value(0x0300000, 0x031FFFFF, ®data_top_ctl_0007); |
| //WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL7, regdata_top_ctl_0007); |
| |
| pr_frc(1, "%s set\n", __func__); |
| pr_frc(1, "FRC_INP_MCDW_CTRL=0x%x\n", |
| READ_FRC_REG(FRC_INP_MCDW_CTRL)); |
| //pr_frc(1, "FRC_REG_TOP_CTRL7=0x%x\n", |
| // READ_FRC_REG(FRC_REG_TOP_CTRL7)); |
| } |
| |
| void frc_memc_120hz_patch_3(struct frc_dev_s *frc_devp) |
| { |
| enum chip_id chip; |
| struct frc_fw_data_s *fw_data; |
| struct frc_top_type_s *frc_top; |
| u32 tmp = 0; |
| |
| if (!frc_devp) |
| return; |
| |
| fw_data = (struct frc_fw_data_s *)frc_devp->fw_data; |
| frc_top = &fw_data->frc_top_type; |
| chip = get_chip_type(); |
| |
| if (chip != ID_T3X) |
| return; |
| if (frc_devp->ud_dbg.res2_dbg_en == 1 || |
| frc_devp->ud_dbg.res2_dbg_en == 3) |
| return; |
| if (frc_devp->little_win == 1 && chip == ID_T3X) |
| return; |
| // TOP setting |
| //regdata_top_ctl_0007 = READ_FRC_REG(FRC_REG_TOP_CTRL7); |
| //frc_config_reg_value(0x0, 0x03000000, ®data_top_ctl_0007); |
| //WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL7, regdata_top_ctl_0007); |
| |
| tmp = READ_FRC_REG(FRC_MCDW_PATH_CTRL); |
| tmp &= 0xFFFFFFFE; |
| WRITE_FRC_REG_BY_CPU(FRC_MCDW_PATH_CTRL, tmp); |
| |
| // h2v2 setting |
| tmp = READ_FRC_REG(FRC_MC_H2V2_SETTING); |
| tmp &= 0x41AFFFFF; |
| WRITE_FRC_REG_BY_CPU(FRC_MC_H2V2_SETTING, tmp); |
| |
| pr_frc(1, "%s set\n", __func__); |
| pr_frc(1, "FRC_MCDW_PATH_CTRL=0x%x\n", |
| READ_FRC_REG(FRC_MCDW_PATH_CTRL)); |
| pr_frc(1, "FRC_MC_H2V2_SETTING=0x%x\n", |
| READ_FRC_REG(FRC_MC_H2V2_SETTING)); |
| //pr_frc(1, "FRC_REG_TOP_CTRL7=0x%x\n", |
| // READ_FRC_REG(FRC_REG_TOP_CTRL7)); |
| } |
| |
| void frc_debug_table_print(struct work_struct *work) |
| { |
| int i; |
| struct frc_dev_s *devp = container_of(work, |
| struct frc_dev_s, frc_print_work); |
| |
| if (unlikely(!devp)) { |
| PR_ERR("%s err, devp is NULL\n", __func__); |
| return; |
| } |
| if (!devp->probe_ok) |
| return; |
| if (!devp->power_on_flag) |
| return; |
| |
| pr_frc(0, "print reg table\n"); |
| if (get_chip_type() == ID_T3X) { |
| for (i = 0; i < T3X_REG_NUM; i++) { |
| pr_frc(0, "0x%04x, 0x%08x\n", |
| frc_regs_dbg_table[i].addr, |
| frc_regs_dbg_table[i].value); |
| } |
| } else if (get_chip_type() == ID_T5M) { |
| for (i = 0; i < T5M_REG_NUM; i++) { |
| pr_frc(0, "0x%04x, 0x%08x\n", |
| frc_regs_dbg_table[i].addr, |
| frc_regs_dbg_table[i].value); |
| } |
| } else if (get_chip_type() == ID_T3) { |
| for (i = 0; i < T3_REG_NUM; i++) { |
| pr_frc(0, "0x%04x, 0x%08x\n", |
| frc_regs_dbg_table[i].addr, |
| frc_regs_dbg_table[i].value); |
| } |
| } |
| devp->ud_dbg.pr_dbg = 0; |
| } |
| |
| void frc_debug_print(struct frc_dev_s *devp) |
| { |
| int i; |
| |
| if (get_chip_type() == ID_T3X) { |
| for (i = 0; i < T3X_DRV_REG_NUM; i++) { |
| frc_regs_dbg_table[i].addr = |
| t3x_regs_table[i].addr; |
| frc_regs_dbg_table[i].value = |
| READ_FRC_REG(frc_regs_dbg_table[i].addr); |
| } |
| } else if (get_chip_type() == ID_T5M) { |
| for (i = 0; i < T5M_REG_NUM; i++) { |
| frc_regs_dbg_table[i].addr = |
| t5m_regs_table[i].addr; |
| frc_regs_dbg_table[i].value = |
| READ_FRC_REG(frc_regs_dbg_table[i].addr); |
| } |
| } else if (get_chip_type() == ID_T3) { |
| for (i = 0; i < T3_REG_NUM; i++) { |
| frc_regs_dbg_table[i].addr = |
| t3_regs_table[i].addr; |
| frc_regs_dbg_table[i].value = |
| READ_FRC_REG(frc_regs_dbg_table[i].addr); |
| } |
| } |
| schedule_work(&devp->frc_print_work); |
| } |
| |
| void frc_memc_clr_vbuffer(struct frc_dev_s *frc_devp, u8 flag) |
| { |
| enum chip_id chip; |
| u32 tmp_value, tmp_value2; |
| |
| if (!frc_devp) |
| return; |
| if (frc_devp->other1_flag == 0) |
| return; |
| |
| chip = get_chip_type(); |
| if (flag == 0) { |
| tmp_value = READ_FRC_REG(FRC_ME_GCV_EN); |
| tmp_value |= BIT_0 + BIT_16; |
| WRITE_FRC_REG_BY_CPU(FRC_ME_GCV_EN, tmp_value); |
| if (chip >= ID_T5M) { |
| tmp_value2 = READ_FRC_REG(FRC_ME_GCV2_EN); |
| tmp_value2 |= BIT_12 + BIT_15; |
| WRITE_FRC_REG_BY_CPU(FRC_ME_GCV2_EN, tmp_value2); |
| } |
| } else { |
| tmp_value = READ_FRC_REG(FRC_ME_GCV_EN); |
| tmp_value &= 0xFFFEFFFE; |
| WRITE_FRC_REG_BY_CPU(FRC_ME_GCV_EN, tmp_value); |
| if (chip >= ID_T5M) { |
| tmp_value2 = READ_FRC_REG(FRC_ME_GCV2_EN); |
| tmp_value2 &= 0xFFFF6FFF; |
| WRITE_FRC_REG_BY_CPU(FRC_ME_GCV2_EN, tmp_value2); |
| } |
| } |
| pr_frc(1, "%s set %d\n", __func__, flag); |
| pr_frc(1, "FRC_ME_GCV_EN=0x%x\n", |
| READ_FRC_REG(FRC_ME_GCV_EN)); |
| } |
| |
| void frc_in_sts_init(struct st_frc_in_sts *sts) |
| { |
| if (!sts) |
| return; |
| |
| sts->vf = NULL; |
| sts->vf_sts = 0; |
| sts->vf_type = 0; |
| sts->duration = 0; |
| sts->in_hsize = 0; |
| sts->in_vsize = 0; |
| sts->signal_type = 0; |
| sts->source_type = 0; |
| sts->frc_hd_start_lines = 0; |
| sts->frc_hd_end_lines = 0; |
| sts->frc_vd_start_lines = 0; |
| sts->frc_vd_end_lines = 0; |
| sts->frc_vsc_startp = 0; |
| sts->frc_vsc_endp = 0; |
| sts->frc_hsc_startp = 0; |
| sts->frc_hsc_endp = 0; |
| }; |
| |
| void frc_chg_loss_slice_num(u8 num) |
| { |
| enum chip_id chip; |
| u32 tmp_value, tmp_value2; |
| |
| chip = get_chip_type(); |
| if (chip != ID_T3X) |
| return; |
| |
| tmp_value = READ_FRC_REG(FRC_INP_MCDW_CTRL); |
| tmp_value &= 0xFFC00FF; // 0xFFFC00FF |
| tmp_value2 = READ_FRC_REG(FRC_REG_TOP_CTRL11); |
| tmp_value2 &= 0x0000FFFF; |
| tmp_value |= (num & 0x3FF) << 8; |
| WRITE_FRC_REG_BY_CPU(FRC_INP_MCDW_CTRL, tmp_value); |
| tmp_value2 |= (num & 0xff) << 16; |
| tmp_value2 |= (num & 0xff) << 24; |
| WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL11, tmp_value2); |
| |
| pr_frc(1, "%s set\n", __func__); |
| pr_frc(1, "FRC_REG_TOP_CTRL11=0x%x\n", |
| READ_FRC_REG(FRC_REG_TOP_CTRL11)); |
| pr_frc(1, "FRC_INP_MCDW_CTRL=0x%x\n", |
| READ_FRC_REG(FRC_INP_MCDW_CTRL)); |
| } |
| |
| void t3x_eco_initial(void) |
| { |
| enum chip_id chip; |
| u32 tmp_value; |
| int log = 2; |
| |
| chip = get_chip_type(); |
| if (chip != ID_T3X) |
| return; |
| // reg_mc_nr_en |
| //tmp_value = READ_FRC_REG(FRC_REG_INP_MODULE_EN); |
| //tmp_value |= BIT_9; |
| //WRITE_FRC_REG_BY_CPU(FRC_REG_INP_MODULE_EN, tmp_value); |
| //reg_nr_misc 32bits |
| // WRITE_FRC_REG_BY_CPU(FRC_NR_MISC, 0x801); |
| |
| //Close Nr/bbd/mcwr opt for prefetch phase |
| tmp_value = READ_FRC_REG(FRC_INP_PATH_OPT); |
| // tmp_value |= BIT_0 + BIT_1 + BIT_3 + BIT_4; |
| tmp_value |= BIT_0 + BIT_1 + BIT_3; |
| WRITE_FRC_REG_BY_CPU(FRC_INP_PATH_OPT, tmp_value); |
| |
| //Use h2v2 pic in prefetch phase |
| tmp_value = READ_FRC_REG(FRC_BYP_PATH_CTRL); |
| tmp_value |= BIT_0 + BIT_4; |
| WRITE_FRC_REG_BY_CPU(FRC_BYP_PATH_CTRL, tmp_value); |
| |
| // h2v2 setting force luma&chroma, h2+v2 downsample 20230907 add |
| tmp_value = READ_FRC_REG(FRC_MC_H2V2_SETTING); |
| tmp_value |= 0x5E000000; |
| tmp_value |= 0x01780000; |
| WRITE_FRC_REG_BY_CPU(FRC_MC_H2V2_SETTING, tmp_value); |
| |
| WRITE_FRC_REG_BY_CPU(FRC_SRCH_RNG_MODE, 0x77); // add 20230907 |
| |
| //Use h2v2 pic in prefetch phase |
| tmp_value = READ_FRC_REG(FRC_MCDW_PATH_CTRL); |
| // reg_frc_mcdw_path_en reg_frc_mcdw_v2_en reg_frc_mcdw_h2_en |
| // tmp_value |= BIT_0 + BIT_1 + BIT_4; |
| tmp_value &= 0xFFFFFFFC; |
| tmp_value |= BIT_1 + BIT_4; |
| WRITE_FRC_REG_BY_CPU(FRC_MCDW_PATH_CTRL, tmp_value); |
| |
| //generate h2v2 pic in prefetch phase |
| tmp_value = READ_FRC_REG(FRC_INP_MCDW_CTRL); |
| // reg_mcdw_lpf_mode reg_mcdw_ds_mode_hv |
| // reg_mcdw_loss_en reg_mcdw_path_en |
| // tmp_value |= BIT_0 + BIT_4 + BIT_24 + BIT_25 + BIT_28; |
| tmp_value &= 0xFC000000; // bit24,25 set 01 |
| tmp_value |= BIT_0 + BIT_4 + BIT_24 + BIT_25 + BIT_28; |
| WRITE_FRC_REG_BY_CPU(FRC_INP_MCDW_CTRL, tmp_value); |
| |
| //slice_num == 1 |
| frc_chg_loss_slice_num(1); |
| |
| //CLOSS_MISC:encoder+decoder reg_use_sw_preslc_fifolevel == 0 |
| tmp_value = READ_FRC_REG(0x0C00); |
| // reg_use_sw_preslc_fifolevel |
| tmp_value &= 0xFFFFFFF7; |
| WRITE_FRC_REG_BY_CPU(0x0C00, tmp_value); |
| tmp_value = READ_FRC_REG(0x0D00); |
| // reg_use_sw_preslc_fifolevel |
| tmp_value &= 0xFFFFFFF7; |
| WRITE_FRC_REG_BY_CPU(0x0D00, tmp_value); |
| tmp_value = READ_FRC_REG(0x3500); |
| // reg_use_sw_preslc_fifolevel |
| tmp_value &= 0xFFFFFFF7; |
| WRITE_FRC_REG_BY_CPU(0x3500, tmp_value); |
| tmp_value = READ_FRC_REG(0x3700); |
| // reg_use_sw_preslc_fifolevel |
| tmp_value &= 0xFFFFFFF7; |
| WRITE_FRC_REG_BY_CPU(0x3700, tmp_value); |
| |
| //CLOSS_DEBUG_MODE:encoder reg_force_qp_0 ==0x80~0x87 |
| tmp_value = READ_FRC_REG(0x0c0b); |
| tmp_value &= 0xFFFFFF00; |
| tmp_value |= 0x82; |
| WRITE_FRC_REG_BY_CPU(0x0c0b, tmp_value); |
| //CLOSS0_RATIO_0: encoder QP Value //reg_ratio_bppx16_0_3 |
| tmp_value = READ_FRC_REG(0x0c59); |
| tmp_value &= 0x00FFFFFF; |
| tmp_value |= 0x82000000; |
| WRITE_FRC_REG_BY_CPU(0x0c59, tmp_value); |
| |
| //CLOSS_DEBUG_MODE:decoder reg_force_qp_0 ==0x80~0x87 |
| tmp_value = READ_FRC_REG(0x0d0b); |
| tmp_value &= 0xFFFFFF00; |
| tmp_value |= 0x80; |
| WRITE_FRC_REG_BY_CPU(0x0d0b, tmp_value); |
| tmp_value = READ_FRC_REG(0x350b); |
| tmp_value &= 0xFFFFFF00; |
| tmp_value |= 0x80; |
| WRITE_FRC_REG_BY_CPU(0x350b, tmp_value); |
| tmp_value = READ_FRC_REG(0x370b); |
| tmp_value &= 0xFFFFFF00; |
| tmp_value |= 0x80; |
| WRITE_FRC_REG_BY_CPU(0x370b, tmp_value); |
| |
| //CLOSS_MISC:decoder reg_misc[1] |
| tmp_value = READ_FRC_REG(0x0d00); |
| tmp_value &= 0xFFFFDFFF; |
| WRITE_FRC_REG_BY_CPU(0x0d00, tmp_value); |
| tmp_value = READ_FRC_REG(0x3500); |
| tmp_value &= 0xFFFFDFFF; |
| WRITE_FRC_REG_BY_CPU(0x3500, tmp_value); |
| tmp_value = READ_FRC_REG(0x3700); |
| tmp_value &= 0xFFFFDFFF; |
| WRITE_FRC_REG_BY_CPU(0x3700, tmp_value); |
| |
| // print setting |
| pr_frc(log, "%s set\n", __func__); |
| pr_frc(log, "FRC_REG_INP_MODULE_EN=0x%x\n", |
| READ_FRC_REG(FRC_REG_INP_MODULE_EN)); |
| pr_frc(log, "FRC_NR_MISC=0x%x\n", |
| READ_FRC_REG(FRC_NR_MISC)); |
| pr_frc(log, "FRC_INP_PATH_OPT=0x%x\n", |
| READ_FRC_REG(FRC_INP_PATH_OPT)); |
| pr_frc(log, "FRC_BYP_PATH_CTRL=0x%x\n", |
| READ_FRC_REG(FRC_BYP_PATH_CTRL)); |
| pr_frc(log, "FRC_MCDW_PATH_CTRL=0x%x\n", |
| READ_FRC_REG(FRC_MCDW_PATH_CTRL)); |
| pr_frc(log, "FRC_INP_MCDW_CTRL=0x%x\n", |
| READ_FRC_REG(FRC_INP_MCDW_CTRL)); |
| pr_frc(log, "FRC_REG_TOP_CTRL11=0x%x\n", |
| READ_FRC_REG(FRC_REG_TOP_CTRL11)); |
| pr_frc(log, "0xc00=0x%x, 0xd00=0x%x, 0xc0b=0x%x, 0xc59=0x%x,0xd0b=0x%x\n", |
| READ_FRC_REG(0x0c00), READ_FRC_REG(0x0d00), |
| READ_FRC_REG(0x0c0b), READ_FRC_REG(0x0c59), |
| READ_FRC_REG(0x0d0b)); |
| pr_frc(log, "0x3500=0x%x, 0x3700=0x%x, 0x350b=0x%x, 0x370b=0x%x\n", |
| READ_FRC_REG(0x3500), READ_FRC_REG(0x3700), |
| READ_FRC_REG(0x350b), READ_FRC_REG(0x370b)); |
| } |
| |
| void t3x_eco_qp_cfg(u32 qp) |
| { |
| enum chip_id chip; |
| u32 tmp_value; |
| int log = 0; |
| |
| chip = get_chip_type(); |
| if (chip != ID_T3X) |
| return; |
| |
| //CLOSS_DEBUG_MODE:encoder reg_force_qp_0 ==0x80~0x87 |
| tmp_value = READ_FRC_REG(0x0c0b); |
| tmp_value &= 0xFFFFFF80; |
| tmp_value |= (qp & 0x7F); |
| WRITE_FRC_REG_BY_CPU(0x0c0b, tmp_value); |
| |
| //CLOSS0_RATIO_0: encoder QP Value |
| tmp_value = READ_FRC_REG(0x0c59); |
| tmp_value &= 0x80FFFFFF; |
| tmp_value |= (qp & 0x7F) << 24; |
| WRITE_FRC_REG_BY_CPU(0x0c59, tmp_value); |
| |
| pr_frc(log, "%s set\n", __func__); |
| pr_frc(log, "0x0c0b=0x%x, 0x0c59=0x%x\n", |
| READ_FRC_REG(0x0c0b), READ_FRC_REG(0x0c59)); |
| } |
| |
| void t3x_revB_patch_apply(void) |
| { |
| enum chip_id chip; |
| struct frc_dev_s *devp = get_frc_devp(); |
| |
| if (!devp->probe_ok || !devp->power_on_flag) |
| return; |
| chip = get_chip_type(); |
| if (chip != ID_T3X) |
| return; |
| if (devp->ud_dbg.res2_dbg_en == 3) { |
| t3x_eco_initial(); |
| t3x_eco_qp_cfg(2); |
| } |
| } |
| |
| void t3x_verB_set_cfg(u8 flag, struct frc_dev_s *frc_devp) |
| { |
| enum chip_id chip; |
| struct frc_dev_s *devp = get_frc_devp(); |
| u32 tmp_isr_cnt; // tmp_value; |
| u32 inp_mcdw_ctrl; |
| u32 mcdw_path_ctrl; |
| u8 adj_mcdw_hv; |
| |
| if (!devp->probe_ok || !devp->power_on_flag) |
| return; |
| chip = get_chip_type(); |
| if (chip != ID_T3X || frc_devp->out_sts.out_framerate < 70) |
| return; |
| |
| if (flag == 0) { // set before frc enable |
| adj_mcdw_hv = devp->in_sts.t3x_adj_mcdw_hv; |
| inp_mcdw_ctrl = READ_FRC_REG(FRC_INP_MCDW_CTRL); |
| if (devp->in_sts.in_hsize * devp->in_sts.in_vsize < 1920 * 1080) { |
| frc_config_reg_value((adj_mcdw_hv << 24), 0x3000000, &inp_mcdw_ctrl); |
| WRITE_FRC_BITS(FRC_MCDW_PATH_CTRL, adj_mcdw_hv, 0, 2); |
| } else { |
| frc_config_reg_value((3 << 24), 0x3000000, &inp_mcdw_ctrl); |
| WRITE_FRC_BITS(FRC_MCDW_PATH_CTRL, 0x3, 0, 2); |
| } |
| |
| WRITE_FRC_REG_BY_CPU(FRC_INP_MCDW_CTRL, inp_mcdw_ctrl); |
| // WRITE_FRC_BITS(FRC_MCDW_PATH_CTRL, 3, 0, 2); |
| WRITE_FRC_REG_BY_CPU(FRC_SRCH_RNG_MODE, 0x77); |
| // tmp_value = READ_FRC_REG(FRC_MC_H2V2_SETTING); |
| // tmp_value |= 0x20800000; |
| // WRITE_FRC_REG_BY_CPU(FRC_MC_H2V2_SETTING, tmp_value); |
| devp->ud_dbg.other1_err = 1; |
| |
| FRC_RDMA_WR_REG_IN(FRC_INP_MCDW_CTRL, inp_mcdw_ctrl); |
| FRC_RDMA_WR_REG_IN(FRC_MCDW_PATH_CTRL, READ_FRC_REG(FRC_MCDW_PATH_CTRL)); |
| FRC_RDMA_WR_REG_IN(FRC_SRCH_RNG_MODE, 0x77); |
| pr_frc(2, "%s set:%d INP_MCDW_CTRL=0x%x, MCDW_CTRL=0x%x vs_cnt=%d\n", |
| __func__, |
| flag, |
| READ_FRC_REG(FRC_INP_MCDW_CTRL), |
| READ_FRC_REG(FRC_MCDW_PATH_CTRL), |
| devp->frc_sts.vs_cnt); |
| } else { // restore after frc enable |
| if (devp->ud_dbg.other1_err == 1) { |
| tmp_isr_cnt = READ_FRC_REG(FRC_RO_INT_CNT); |
| // tmp_value = READ_FRC_REG(FRC_REG_INP_INT_FLAG); |
| pr_frc(2, "%s set:%d ro_isr_cnt=(%d,%d), isr_cnt=(%d,%d)\n", |
| __func__, |
| flag, |
| tmp_isr_cnt & 0xFFF, |
| tmp_isr_cnt >> 16, |
| devp->in_sts.vs_cnt, |
| devp->out_sts.vs_cnt); |
| // if (1){ // ((tmp_value & BIT_4) == 0) |
| // WRITE_FRC_BITS(FRC_INP_MCDW_CTRL, 2, 24, 2); |
| // WRITE_FRC_BITS(FRC_MCDW_PATH_CTRL, 0, 0, 1); |
| // WRITE_FRC_REG_BY_CPU(FRC_SRCH_RNG_MODE, 0x00); |
| pr_frc(2, "%s before_INP_MCDW=0x%x,MCDW_CTRL=0x%x,SRCH_RNG=%x\n", |
| __func__, |
| READ_FRC_REG(FRC_INP_MCDW_CTRL), |
| READ_FRC_REG(FRC_MCDW_PATH_CTRL), |
| READ_FRC_REG(FRC_SRCH_RNG_MODE) |
| ); |
| inp_mcdw_ctrl = READ_FRC_REG(FRC_INP_MCDW_CTRL); |
| frc_config_reg_value((2 << 24), 0x3000000, &inp_mcdw_ctrl); |
| FRC_RDMA_WR_REG_IN(FRC_INP_MCDW_CTRL, inp_mcdw_ctrl); |
| |
| mcdw_path_ctrl = READ_FRC_REG(FRC_MCDW_PATH_CTRL); |
| frc_config_reg_value(0x0, 0x1, &mcdw_path_ctrl); |
| FRC_RDMA_WR_REG_IN(FRC_MCDW_PATH_CTRL, mcdw_path_ctrl); |
| |
| // srch_rng_mode = READ_FRC_REG(FRC_SRCH_RNG_MODE); |
| FRC_RDMA_WR_REG_IN(FRC_SRCH_RNG_MODE, 0x0); |
| |
| // tmp_value = READ_FRC_REG(FRC_MC_H2V2_SETTING); |
| // tmp_value &= 0xDF7FFFFF; |
| // WRITE_FRC_REG_BY_CPU(FRC_MC_H2V2_SETTING, tmp_value); |
| pr_frc(2, "%s set_INP_MCDW=0x%x,MCDW_CTRL=0x%x\n", |
| __func__, |
| inp_mcdw_ctrl, mcdw_path_ctrl); |
| // READ_FRC_REG(FRC_SRCH_RNG_MODE)); |
| devp->ud_dbg.other1_err = 0; |
| // } |
| } |
| } |
| } |
| |
| void frc_pattern_dbg_ctrl(struct frc_dev_s *devp) |
| { |
| if (!devp || !devp->pat_dbg.pat_en) |
| return; |
| |
| if (devp->pat_dbg.pat_type & BIT_0) |
| frc_set_input_pattern(devp->pat_dbg.pat_color); |
| if (devp->pat_dbg.pat_type & BIT_1) |
| frc_set_output_pattern(devp->pat_dbg.pat_color); |
| if (devp->in_sts.enable_mute_flag == 1) { |
| frc_set_output_pattern(5); // mute blank |
| pr_frc(1, "enable set mute wait %d(%d) frames", |
| devp->in_sts.mute_vsync_cnt, |
| devp->frc_sts.vs_data_cnt); |
| } |
| } |
| |
| void t3x_verB_60hz_patch(void) |
| { |
| enum chip_id chip; |
| |
| chip = get_chip_type(); |
| |
| if (chip != ID_T3X) |
| return; |
| |
| regdata_top_ctl_000a = READ_FRC_REG(FRC_REG_TOP_CTRL10); |
| frc_config_reg_value(0x7f, 0xff, ®data_top_ctl_000a); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL10, regdata_top_ctl_000a); |
| |
| inp_mcdw_ctl_047a = READ_FRC_REG(FRC_INP_MCDW_CTRL); |
| inp_mcdw_ctl_047a &= ~0x11; |
| WRITE_FRC_REG_BY_CPU(FRC_INP_MCDW_CTRL, inp_mcdw_ctl_047a); |
| |
| inp_path_opt_047c = READ_FRC_REG(FRC_INP_PATH_OPT); |
| inp_path_opt_047c &= ~0x1; |
| WRITE_FRC_REG_BY_CPU(FRC_INP_PATH_OPT, inp_path_opt_047c); |
| |
| mcdw_path_ctl_39fd = READ_FRC_REG(FRC_MCDW_PATH_CTRL); |
| mcdw_path_ctl_39fd &= ~0x10; |
| WRITE_FRC_REG_BY_CPU(FRC_MCDW_PATH_CTRL, mcdw_path_ctl_39fd); |
| |
| pr_frc(0, "%s ok", __func__); |
| } |
| |
| void frc_clr_badedit_effect_before_enable(void) |
| { |
| regdata_fwd_sign_ro_016e = READ_FRC_REG(FRC_REG_FWD_SIGN_RO); |
| if (((regdata_fwd_sign_ro_016e >> 28) & 0x3) != 0) { |
| pr_frc(1, "%s read FRC_REG_FWD_SIGN_RO %8x\n", __func__, |
| regdata_fwd_sign_ro_016e); |
| regdata_fwd_sign_ro_016e &= 0xCFFFFFFF; |
| WRITE_FRC_REG_BY_CPU(FRC_REG_FWD_SIGN_RO, regdata_fwd_sign_ro_016e); |
| pr_frc(1, "set FRC_REG_FWD_SIGN_RO %8x\n", regdata_fwd_sign_ro_016e); |
| } |
| regdata_fwd_phs_0146 = READ_FRC_REG(FRC_REG_FWD_PHS); |
| if ((regdata_fwd_phs_0146 & BIT_29) == BIT_29) { |
| pr_frc(1, "%s read FRC_REG_FWD_PHS %8x\n", __func__, regdata_fwd_phs_0146); |
| regdata_fwd_phs_0146 &= 0xDFFFFFFF; |
| WRITE_FRC_REG_BY_CPU(FRC_REG_FWD_PHS, regdata_fwd_phs_0146); |
| pr_frc(1, "set FRC_REG_FWD_PHS %8x\n", regdata_fwd_phs_0146); |
| } |
| regdata_fwd_fid_0147 = READ_FRC_REG(FRC_REG_FWD_FID); |
| if (regdata_fwd_fid_0147 != 0) { |
| pr_frc(1, "%s read FRC_REG_FWD_FID %8x\n", __func__, regdata_fwd_fid_0147); |
| regdata_fwd_fid_0147 = 0; |
| WRITE_FRC_REG_BY_CPU(FRC_REG_FWD_FID, regdata_fwd_fid_0147); |
| pr_frc(1, "set FRC_REG_FWD_FID %8x\n", regdata_fwd_fid_0147); |
| } |
| regdata_top_ctl_0007 = 0; |
| WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL7, regdata_top_ctl_0007); |
| } |
| |
| void frc_probe_dbg_proc(struct frc_dev_s *devp) |
| { |
| u8 en, path, color; |
| u16 posi_x, posi_y; |
| u32 reg_data = 0; |
| u32 reg_data2, reg_data3; |
| u32 color_list[4] = {0x3fffffff, 0xfa66bc0, 0x2b02a069, 0x7ff01d8}; // W/R/G/B |
| |
| en = devp->probe_dbg.probe_en; |
| path = devp->probe_dbg.probe_path; |
| color = devp->probe_dbg.probe_color; |
| posi_x = devp->probe_dbg.posi_x; |
| posi_y = devp->probe_dbg.posi_y; |
| |
| if (color > 3) |
| color = 3; |
| if (posi_x > devp->in_sts.in_hsize) |
| posi_x = devp->in_sts.in_hsize - 1; |
| if (posi_y > devp->in_sts.in_vsize) |
| posi_y = devp->in_sts.in_vsize - 1; |
| |
| switch (path) { |
| case FRC_PROBE_INP_PATH: |
| /*reserved*/ |
| pr_frc(0, "INP path unsupport\n"); |
| break; |
| case FRC_PROBE_VP_PATH: |
| if (en) { |
| // en |
| WRITE_FRC_BITS(FRC_REG_CURSOR, 1, 16, 1); |
| // line color |
| WRITE_FRC_BITS(FRC_REG_CURSOR, color, 8, 3); |
| // set posi |
| WRITE_FRC_BITS(FRC_REG_MC_CURSOR_0, posi_x, 0, 12); |
| WRITE_FRC_BITS(FRC_REG_MC_CURSOR_1, posi_y, 0, 12); |
| reg_data = READ_FRC_REG(FRC_REG_MC_CURSOR_0); |
| reg_data2 = READ_FRC_REG(FRC_REG_MC_CURSOR_1); |
| reg_data3 = READ_FRC_REG(FRC_REG_MC_CURSOR_2); |
| reg_data = ((reg_data3 >> 13) & 0x3ff) << 20 | |
| ((reg_data2 >> 13) & 0x3ff) << 10 | |
| ((reg_data >> 13) & 0x3ff); |
| } else { |
| WRITE_FRC_BITS(FRC_REG_CURSOR, 0, 16, 1); |
| } |
| break; |
| case FRC_PROBE_MC_PATH: |
| if (en) { |
| WRITE_FRC_BITS(FRC_MC_PRB_CTRL1, 1, 30, 1); |
| WRITE_FRC_BITS(FRC_MC_PRB_CTRL0, color_list[color], 0, 30); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL1, |
| posi_y << 16 | posi_x); |
| reg_data = READ_FRC_REG(FRC_RO_MC_PROBE); |
| } else { |
| WRITE_FRC_BITS(FRC_MC_PRB_CTRL1, 0, 30, 1); |
| } |
| break; |
| case FRC_PROBE_MC_CSC_PATH: |
| if (en) { |
| WRITE_FRC_BITS(FRC_MC_PRB_CTRL1, 1, 29, 1); |
| WRITE_FRC_BITS(FRC_MC_PRB_CTRL0, color_list[color], 0, 30); |
| WRITE_FRC_REG_BY_CPU(FRC_REG_TOP_CTRL1, |
| posi_y << 16 | posi_x); |
| reg_data = READ_FRC_REG(FRC_RO_MC_PROBE_CSC); |
| } else { |
| WRITE_FRC_BITS(FRC_MC_PRB_CTRL1, 0, 29, 1); |
| } |
| break; |
| default: |
| if (en) { |
| WRITE_FRC_BITS(FRC_MC_PRB_CTRL1, 1, 30, 1); |
| reg_data = READ_FRC_REG(FRC_RO_MC_PROBE); |
| pr_frc(0, "need set path,default: mc\n"); |
| } else { |
| WRITE_FRC_BITS(FRC_MC_PRB_CTRL1, 0, 29, 2); |
| WRITE_FRC_BITS(FRC_REG_CURSOR, 0, 16, 1); |
| reg_data = 0; |
| } |
| break; |
| } |
| |
| devp->probe_dbg.out_data = reg_data; |
| } |