| // SPDX-License-Identifier: (GPL-2.0+ OR MIT) |
| /* |
| * drivers/amlogic/media/deinterlace/sc2/di_hw_v3.c |
| * |
| * Copyright (C) 2017 Amlogic, Inc. All rights reserved. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or |
| * (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
| * more details. |
| * |
| */ |
| |
| #include <linux/types.h> |
| #include <linux/amlogic/tee.h> |
| #include "deinterlace.h" |
| #include "di_data_l.h" |
| #include "di_prc.h" |
| |
| //#include "sc2_ucode/cbus_register.h" |
| //#include "sc2_ucode/deint_new.h" |
| |
| #include "di_reg_v3.h" |
| #include "di_hw_v3.h" |
| #include "di_reg_v2.h" |
| |
| #include "register.h" |
| #include "register_nr4.h" |
| |
| //#include "sc2_ucode/f2v.h" |
| |
| #define stimulus_display PR_INF |
| #define stimulus_display2 PR_INF |
| #define stimulus_print PR_INF |
| |
| /* ary */ |
| static u32 sc2_dbg; |
| module_param_named(sc2_dbg, sc2_dbg, uint, 0664); |
| |
| /******************** |
| * BIT0: enable pre irq |
| * BIT1: enable pst irq |
| ********************/ |
| |
| static u32 sc2_dbg_cnt_pre; |
| module_param_named(sc2_dbg_cnt_pre, sc2_dbg_cnt_pre, uint, 0664); |
| |
| static u32 sc2_dbg_cnt_pst; |
| module_param_named(sc2_dbg_cnt_pst, sc2_dbg_cnt_pst, uint, 0664); |
| |
| void sc2_dbg_set(unsigned int val) |
| { |
| sc2_dbg = val; |
| } |
| |
| bool sc2_dbg_is_en_pre_irq(void) |
| { |
| if (sc2_dbg & DI_BIT0) |
| return true; |
| |
| return false; |
| } |
| |
| void sc2_dbg_pre_info(unsigned int val) |
| { |
| if ((sc2_dbg_cnt_pre % 32) == 0) { |
| PR_ERR("%s:di not work %d:0x%x\n", |
| __func__, sc2_dbg_cnt_pre, val); |
| } |
| sc2_dbg_cnt_pre++; |
| } |
| |
| void sc2_dbg_pst_info(unsigned int val) |
| { |
| if ((sc2_dbg_cnt_pst % 32) == 0) { |
| PR_ERR("%s:di not work %d:0x%x\n", |
| __func__, sc2_dbg_cnt_pst, val); |
| } |
| sc2_dbg_cnt_pst++; |
| } |
| |
| bool sc2_dbg_is_en_pst_irq(void) |
| { |
| if (sc2_dbg & DI_BIT1) |
| return true; |
| return false; |
| } |
| |
| /*dbg setting: */ |
| static u32 sc2_reg_mask; |
| module_param_named(sc2_reg_mask, sc2_reg_mask, uint, 0664); |
| /* */ |
| |
| bool is_mask(unsigned int cmd) |
| { |
| bool ret = false; |
| |
| switch (cmd) { |
| case SC2_REG_MSK_GEN_PRE: |
| if (sc2_reg_mask & DI_BIT0) |
| ret = true; |
| break; |
| case SC2_REG_MSK_GEN_PST: |
| if (sc2_reg_mask & DI_BIT1) |
| ret = true; |
| break; |
| case SC2_REG_MSK_nr: |
| if (sc2_reg_mask & DI_BIT2) |
| ret = true; |
| break; |
| case SC2_ROT_WR: |
| if (sc2_reg_mask & DI_BIT3) |
| ret = true; |
| break; |
| case SC2_ROT_PST: |
| if (sc2_reg_mask & DI_BIT4) |
| ret = true; |
| break; |
| case SC2_MEM_CPY: |
| if (sc2_reg_mask & DI_BIT5) |
| ret = true; |
| break; |
| case SC2_BYPASS_RESET: |
| if (sc2_reg_mask & DI_BIT6) |
| ret = true; |
| break; |
| case SC2_DISABLE_CHAN2: |
| if (sc2_reg_mask & DI_BIT7) |
| ret = true; |
| break; |
| /*bit 15->bit 8*/ |
| case SC2_DW_EN: |
| if (sc2_reg_mask & DI_BIT15) |
| ret = true; |
| break; |
| case SC2_DW_SHOW: |
| if ((sc2_reg_mask & DI_BIT15) && |
| (sc2_reg_mask & DI_BIT14)) |
| ret = true; |
| break; |
| case SC2_DW_SHRK_EN: |
| if (sc2_reg_mask & DI_BIT13) |
| ret = true; |
| break; |
| |
| case SC2_POST_TRIG: /*bit 23:bit 16*/ |
| if (sc2_reg_mask & DI_BIT16) |
| ret = true; |
| break; |
| case SC2_POST_TRIG_MSK1: |
| if (sc2_reg_mask & DI_BIT17) |
| ret = true; |
| break; |
| case SC2_POST_TRIG_MSK2: |
| if (sc2_reg_mask & DI_BIT18) |
| ret = true; |
| break; |
| case SC2_POST_TRIG_MSK3: |
| if (sc2_reg_mask & DI_BIT19) |
| ret = true; |
| break; |
| case SC2_POST_TRIG_MSK4: |
| if (sc2_reg_mask & DI_BIT20) |
| ret = true; |
| break; |
| case SC2_POST_TRIG_MSK5: |
| if (sc2_reg_mask & DI_BIT21) |
| ret = true; |
| break; |
| case SC2_POST_TRIG_MSK6: |
| if (sc2_reg_mask & DI_BIT22) |
| ret = true; |
| break; |
| case SC2_POST_TRIG_MSK7: |
| if (sc2_reg_mask & DI_BIT23) |
| ret = true; |
| break; |
| case SC2_LOG_POST_REG_OUT: |
| if (sc2_reg_mask & DI_BIT24) |
| ret = true; |
| break; |
| default: |
| break; |
| } |
| return ret; |
| } |
| |
| static unsigned int di_mif_add_get_offset_v3(enum DI_MIF0_ID mif_index); |
| |
| /********************************* |
| ******* linear address ******* |
| ********************************/ |
| /* DI_MIF0_t -> DI_MIF_S*/ |
| static void di_mif0_stride(struct DI_MIF_S *mif, |
| unsigned int *stride_y, |
| unsigned int *stride_cb, |
| unsigned int *stride_cr |
| ) |
| { |
| unsigned int burst_stride_0; |
| unsigned int burst_stride_1; |
| unsigned int burst_stride_2; |
| |
| //if support scope,need change this to real hsize |
| //unsigned int pic_hsize = mif->luma_x_end0 - mif->luma_x_start0 + 1; |
| unsigned int pic_hsize = mif->buf_crop_en ? |
| mif->buf_hsize : mif->luma_x_end0 - mif->luma_x_start0 + 1; |
| |
| // 0:8 bits 1:10 bits 422(old mode,12bit) 2: 10bit 444 3:10bit 422(full pack) or 444 |
| unsigned int comp_bits = (mif->bit_mode == 0) ? 8 : |
| (mif->bit_mode == 1) ? 12 : 10; |
| |
| //00: 4:2:0; 01: 4:2:2; 10: 4:4:4 |
| unsigned int comp_num = (mif->video_mode == 2) ? 3 : 2; |
| |
| // 00 : one canvas; 01 : 3 canvas(old 4:2:0). 10: 2 canvas. (NV21). |
| if (mif->set_separate_en == 0) { |
| burst_stride_0 = (pic_hsize * comp_num * comp_bits + 127) >> 7;//burst |
| burst_stride_1 = 0; |
| burst_stride_2 = 0; |
| } else if (mif->set_separate_en == 1) { |
| burst_stride_0 = (pic_hsize * comp_bits + 127) >> 7;//burst |
| burst_stride_1 = (((pic_hsize + 1) >> 1) * |
| comp_bits + 127) >> 7;//burst |
| burst_stride_2 = (((pic_hsize + 1) >> 1) * |
| comp_bits + 127) >> 7;//burst |
| } else { |
| burst_stride_0 = (pic_hsize * comp_bits + 127) >> 7;//burst |
| burst_stride_1 = (pic_hsize * comp_bits + 127) >> 7;//burst |
| burst_stride_2 = 0; |
| } |
| //stimulus_display("di_mif0_stride: burst_stride_0 = %x\n",burst_stride_0); |
| |
| *stride_y = ((burst_stride_0 + 3) >> 2) << 2;//now need 64bytes aligned |
| *stride_cb = ((burst_stride_1 + 3) >> 2) << 2;//now need 64bytes aligned |
| *stride_cr = ((burst_stride_2 + 3) >> 2) << 2;//now need 64bytes aligned |
| |
| //stimulus_display("di_mif0_stride: stride_y = %x\n",*stride_y); |
| } |
| |
| static void di_mif0_stride_input(struct DI_MIF_S *mif, |
| unsigned int *stride_y, |
| unsigned int *stride_cb, |
| unsigned int *stride_cr) |
| { |
| if (mif->set_separate_en == 2) { |
| //nv21 ? |
| *stride_y = (mif->cvs0_w + 15) >> 4; |
| *stride_cb = (mif->cvs1_w + 15) >> 4; |
| *stride_cr = 0; |
| } else if (mif->set_separate_en == 1) { |
| *stride_y = (mif->cvs0_w + 15) >> 4; |
| *stride_cb = (mif->cvs1_w + 15) >> 4; |
| *stride_cr = (mif->cvs2_w + 15) >> 4; |
| } else { |
| *stride_y = (mif->cvs0_w + 15) >> 4; |
| *stride_cb = 0; |
| *stride_cr = 0; |
| } |
| |
| dim_print("%s: stride_y = %d %d %d\n", |
| __func__, |
| *stride_y, |
| *stride_cb, |
| *stride_cr); |
| } |
| |
| /* DI_MIF0_t -> DI_MIF_S*/ |
| void di_mif0_linear_rd_cfg(struct DI_MIF_S *mif, int mif_index, const struct reg_acc *ops) |
| { |
| unsigned int stride_y; |
| unsigned int stride_cb; |
| unsigned int stride_cr; |
| const struct reg_acc *op; |
| unsigned int off; |
| |
| if (!ops) |
| op = &di_pre_regset; |
| else |
| op = ops; |
| |
| off = di_mif_add_get_offset_v3(mif_index); |
| if (off == DIM_ERR) { |
| PR_ERR("%s:\n", __func__); |
| return; |
| } |
| dbg_ic("%s:%d:off[0x%x],0x%lx,0x%lx,0x%lx\n", |
| __func__, |
| mif_index, |
| off, |
| mif->addr0, |
| mif->addr1, |
| mif->addr2); |
| if (mif_index == DI_MIF0_ID_INP) |
| di_mif0_stride_input(mif, &stride_y, &stride_cb, &stride_cr); |
| else |
| di_mif0_stride(mif, &stride_y, &stride_cb, &stride_cr); |
| |
| op->bwr(off + RDMIFXN_STRIDE_1, 1, 16, 1);//linear mode |
| |
| op->bwr(off + RDMIFXN_BADDR_Y, mif->addr0 >> 4, 0, 32);//linear address |
| op->bwr(off + RDMIFXN_BADDR_CB, mif->addr1 >> 4, 0, 32);//linear address |
| op->bwr(off + RDMIFXN_BADDR_CR, mif->addr2 >> 4, 0, 32);//linear address |
| |
| dbg_ic("\ty[%d]cb[%d]cr[%d]\n", stride_y, stride_cb, stride_cr); |
| dbg_ic("\ty[0x%lx]cb[0x%lx]cr[0x%lx]\n", mif->addr0, mif->addr1, mif->addr2); |
| |
| // op->bwr(off + RDMIFXN_STRIDE_0, stride_y, 0, 13);//stride |
| // op->bwr(off + RDMIFXN_STRIDE_0, stride_cb, 16, 13);//stride |
| // op->bwr(off + RDMIFXN_STRIDE_1, stride_cr, 0, 13);//stride |
| op->bwr(off + RDMIFXN_STRIDE_0, (stride_cb << 16) | stride_y, 0, 32);//stride |
| op->bwr(off + RDMIFXN_STRIDE_1, (1 << 16) | stride_cr, 0, 32);//stride |
| |
| dbg_ic("\t:reg:0x%x= 0x%x\n", off + RDMIFXN_BADDR_Y, op->rd(off + RDMIFXN_BADDR_Y)); |
| dbg_ic("\t:reg:0x%x= 0x%x\n", off + RDMIFXN_BADDR_CB, op->rd(off + RDMIFXN_BADDR_CB)); |
| dbg_ic("\t:reg:0x%x= 0x%x\n", off + RDMIFXN_BADDR_CR, op->rd(off + RDMIFXN_BADDR_CR)); |
| dbg_ic("\t:reg:0x%x= 0x%x\n", off + RDMIFXN_STRIDE_0, op->rd(off + RDMIFXN_STRIDE_0)); |
| dbg_ic("\t:reg:0x%x= 0x%x\n", off + RDMIFXN_STRIDE_1, op->rd(off + RDMIFXN_STRIDE_1)); |
| } |
| |
| /* DI_MIF0_t -> DI_MIF_S*/ |
| void di_mif0_linear_wr_cfg(struct DI_MIF_S *mif, int mif_index, const struct reg_acc *ops) |
| { |
| unsigned int WRMIF_BADDR0; |
| unsigned int WRMIF_BADDR1; |
| unsigned int WRMIF_STRIDE0; |
| unsigned int WRMIF_STRIDE1; |
| unsigned int stride_y; |
| unsigned int stride_cb; |
| unsigned int stride_cr; |
| const struct reg_acc *op; |
| |
| if (!ops) |
| op = &di_pre_regset; |
| else |
| op = ops; |
| |
| dbg_ic("%s:%d:0x%lx,0x%lx,0x%lx\n", |
| __func__, |
| mif_index, |
| mif->addr0, |
| mif->addr1, |
| mif->addr2); |
| |
| if (mif_index == 0) { |
| WRMIF_BADDR0 = DI_NRWR_BADDR0; |
| WRMIF_BADDR1 = DI_NRWR_BADDR1; |
| WRMIF_STRIDE0 = DI_NRWR_STRIDE0; |
| WRMIF_STRIDE1 = DI_NRWR_STRIDE1; |
| } else if (mif_index == 1) { |
| WRMIF_BADDR0 = DI_DIWR_BADDR0; |
| WRMIF_BADDR1 = DI_DIWR_BADDR1; |
| WRMIF_STRIDE0 = DI_DIWR_STRIDE0; |
| WRMIF_STRIDE1 = DI_DIWR_STRIDE1; |
| } else { |
| PR_ERR("ERROR:WR_MIF WRONG!!!\n"); |
| return; |
| } |
| |
| di_mif0_stride(mif, &stride_y, &stride_cb, &stride_cr); |
| |
| op->wr(WRMIF_BADDR0, mif->addr0 >> 4); |
| op->wr(WRMIF_BADDR1, mif->addr1 >> 4); |
| op->wr(WRMIF_STRIDE0, stride_y); |
| op->wr(WRMIF_STRIDE1, stride_cb); |
| } |
| |
| static void di_mif0_stride2(struct DI_SIM_MIF_s *mif, |
| unsigned int *stride_y, |
| unsigned int *stride_cb, |
| unsigned int *stride_cr) |
| { |
| unsigned int burst_stride_0; |
| unsigned int burst_stride_1; |
| unsigned int burst_stride_2; |
| |
| //if support scope,need change this to real hsize |
| //unsigned int pic_hsize = mif->luma_x_end0 - mif->luma_x_start0 + 1; |
| //unsigned int pic_hsize = mif->end_x - mif->start_x + 1; |
| unsigned int pic_hsize = mif->buf_crop_en ? |
| mif->buf_hsize : mif->end_x - mif->start_x + 1; |
| // 0:8 bits 1:10 bits 422(old mode,12bit) |
| // 2: 10bit 444 3:10bit 422(full pack) or 444 |
| unsigned int comp_bits = (mif->bit_mode == 0) ? 8 : |
| (mif->bit_mode == 1) ? 12 : 10; |
| |
| //00: 4:2:0; 01: 4:2:2; 10: 4:4:4 |
| unsigned int comp_num = (mif->video_mode == 2) ? 3 : 2; |
| |
| // 00 : one canvas; 01 : 3 canvas(old 4:2:0). 10: 2 canvas. (NV21). |
| if (mif->set_separate_en == 0) { |
| burst_stride_0 = (pic_hsize * comp_num * comp_bits + 127) >> 7; |
| //burst |
| burst_stride_1 = 0; |
| burst_stride_2 = 0; |
| } else if (mif->set_separate_en == 1) { |
| burst_stride_0 = (pic_hsize * comp_bits + 127) >> 7;//burst |
| burst_stride_1 = (((pic_hsize + 1) >> 1) * |
| comp_bits + 127) >> 7;//burst |
| burst_stride_2 = (((pic_hsize + 1) >> 1) * |
| comp_bits + 127) >> 7;//burst |
| } else { |
| burst_stride_0 = (pic_hsize * comp_bits + 127) >> 7;//burst |
| burst_stride_1 = (pic_hsize * comp_bits + 127) >> 7;//burst |
| burst_stride_2 = 0; |
| } |
| dbg_ic("di_mif0_stride: burst_stride_0 = %x\n", burst_stride_0); |
| |
| *stride_y = ((burst_stride_0 + 3) >> 2) << 2;//now need 64bytes aligned |
| *stride_cb = ((burst_stride_1 + 3) >> 2) << 2;//now need 64bytes aligned |
| *stride_cr = ((burst_stride_2 + 3) >> 2) << 2;//now need 64bytes aligned |
| |
| dbg_ic("\t: y[%d] cb[%d] cr[%d]\n", *stride_y, *stride_cb, *stride_cr); |
| } |
| |
| /* DI_MIF0_t -> DI_SIM_MIF_s*/ |
| void di_mif0_linear_wr_cfg2(struct DI_SIM_MIF_s *mif, int mif_index) |
| { |
| unsigned int WRMIF_BADDR0; |
| unsigned int WRMIF_BADDR1; |
| unsigned int WRMIF_STRIDE0; |
| unsigned int WRMIF_STRIDE1; |
| unsigned int stride_y; |
| unsigned int stride_cb; |
| unsigned int stride_cr; |
| const struct reg_acc *op = &di_pre_regset; |
| |
| dbg_ic("%s:%d:0x%lx,0x%lx,0x%lx\n", |
| __func__, |
| mif_index, |
| mif->addr, |
| mif->addr1, |
| mif->addr2); |
| |
| if (mif_index == 0) { |
| WRMIF_BADDR0 = DI_NRWR_BADDR0; |
| WRMIF_BADDR1 = DI_NRWR_BADDR1; |
| WRMIF_STRIDE0 = DI_NRWR_STRIDE0; |
| WRMIF_STRIDE1 = DI_NRWR_STRIDE1; |
| } else if (mif_index == 1) { |
| WRMIF_BADDR0 = DI_DIWR_BADDR0; |
| WRMIF_BADDR1 = DI_DIWR_BADDR1; |
| WRMIF_STRIDE0 = DI_DIWR_STRIDE0; |
| WRMIF_STRIDE1 = DI_DIWR_STRIDE1; |
| } else { |
| PR_ERR("ERROR:WR_MIF WRONG!!!\n"); |
| return; |
| } |
| |
| di_mif0_stride2(mif, &stride_y, &stride_cb, &stride_cr); |
| |
| op->wr(WRMIF_BADDR0, mif->addr >> 4); |
| op->wr(WRMIF_BADDR1, mif->addr1 >> 4); |
| op->wr(WRMIF_STRIDE0, stride_y); |
| op->wr(WRMIF_STRIDE1, stride_cb); |
| dbg_ic("\t:reg:0x%x= 0x%x\n", WRMIF_BADDR0, op->rd(WRMIF_BADDR0)); |
| dbg_ic("\t:reg:0x%x= 0x%x\n", WRMIF_BADDR1, op->rd(WRMIF_BADDR1)); |
| dbg_ic("\t:reg:0x%x= 0x%x\n", WRMIF_STRIDE0, op->rd(WRMIF_STRIDE0)); |
| dbg_ic("\t:reg:0x%x= 0x%x\n", WRMIF_STRIDE1, op->rd(WRMIF_STRIDE1)); |
| } |
| |
| /* struct DI_MIF1_t -> DI_SIM_MIF_s*/ |
| static void di_mif1_stride2(unsigned int per_bits, |
| unsigned int pic_hsize, |
| unsigned int *stride) |
| { |
| //if support scope,need change this to real hsize |
| //unsigned int pic_hsize = mif->end_x - mif->start_x + 1; |
| |
| *stride = (pic_hsize * per_bits + 511) >> 9;//burst |
| *stride = (*stride) << 2; |
| //now need 64bytes aligned, |
| //just set 32bytes aligned(DDR change to burst2 align) |
| //because of previous data are 32bytes aligned |
| } |
| |
| void di_mif1_linear_rd_cfg(struct DI_SIM_MIF_s *mif, |
| unsigned int CTRL1, |
| unsigned int CTRL2, |
| unsigned int BADDR) |
| { |
| unsigned int stride; |
| const struct reg_acc *op = &di_pre_regset; |
| |
| dbg_ic("%s:\n", __func__); |
| //di_mif1_stride(mif, &stride); |
| di_mif1_stride2(mif->per_bits, (mif->end_x - mif->start_x + 1), &stride); |
| op->bwr(CTRL1, 1, 3, 1);//linear_mode |
| op->bwr(CTRL2, stride, 0, 13);//stride |
| op->wr(BADDR, mif->addr >> 4);//base_addr |
| dbg_ic("stride[%d],per_bits[%d]\n", stride, mif->per_bits); |
| dbg_ic("reg[0x%x] = 0x%x\n", CTRL1, op->rd(CTRL1)); |
| dbg_ic("reg[0x%x] = 0x%x\n", CTRL2, op->rd(CTRL2)); |
| dbg_ic("reg[0x%x] = 0x%x\n", BADDR, op->rd(BADDR)); |
| } |
| |
| static void di_mif1_linear_wr_cfg(struct DI_SIM_MIF_s *mif, |
| unsigned int STRIDE, |
| unsigned int BADDR) |
| { |
| unsigned int stride; |
| const struct reg_acc *op = &di_pre_regset; |
| |
| dbg_ic("%s:\n", __func__); |
| //di_mif1_stride(mif, &stride); |
| di_mif1_stride2(mif->per_bits, (mif->end_x - mif->start_x + 1), &stride); |
| op->wr(STRIDE, (0 << 31) | stride);//stride |
| op->wr(BADDR, mif->addr >> 4);//base_addr |
| dbg_ic("\tstride[%d],per_bits[%d]\n", stride, mif->per_bits); |
| dbg_ic("\treg[0x%x] = 0x%x\n", STRIDE, op->rd(STRIDE)); |
| dbg_ic("\treg[0x%x] = 0x%x\n", BADDR, op->rd(BADDR)); |
| } |
| |
| void di_mcmif_linear_rd_cfg(struct DI_MC_MIF_s *mif, |
| unsigned int CTRL1, |
| unsigned int CTRL2, |
| unsigned int BADDR) |
| { |
| unsigned int stride; |
| const struct reg_acc *op = &di_pre_regset; |
| |
| dbg_ic("%s:\n", __func__); |
| //di_mif1_stride(mif, &stride); |
| di_mif1_stride2(mif->per_bits, mif->size_x, &stride); |
| op->bwr(CTRL1, 1, 3, 1);//linear_mode |
| op->bwr(CTRL2, stride, 0, 13);//stride |
| op->wr(BADDR, mif->addr >> 4);//base_addr |
| |
| dbg_ic("stride[%d],per_bits[%d]\n", stride, mif->per_bits); |
| dbg_ic("reg[0x%x] = 0x%x\n", CTRL1, op->rd(CTRL1)); |
| dbg_ic("reg[0x%x] = 0x%x\n", CTRL2, op->rd(CTRL2)); |
| dbg_ic("reg[0x%x] = 0x%x\n", BADDR, op->rd(BADDR)); |
| } |
| |
| static void di_mcmif_linear_wr_cfg(struct DI_MC_MIF_s *mif, |
| unsigned int STRIDE, |
| unsigned int BADDR) |
| { |
| unsigned int stride; |
| const struct reg_acc *op = &di_pre_regset; |
| |
| dbg_ic("%s:\n", __func__); |
| //di_mif1_stride(mif, &stride); |
| di_mif1_stride2(mif->per_bits, mif->size_x, &stride); |
| op->wr(STRIDE, (0 << 31) | stride);//stride |
| op->wr(BADDR, mif->addr >> 4);//base_addr |
| dbg_ic("\tstride[%d],per_bits[%d]\n", stride, mif->per_bits); |
| dbg_ic("\treg[0x%x] = 0x%x\n", STRIDE, op->rd(STRIDE)); |
| dbg_ic("\treg[0x%x] = 0x%x\n", BADDR, op->rd(BADDR)); |
| } |
| |
| //set_ma_pre_mif_g12 |
| static void set_ma_pre_mif_t7(void *pre, |
| unsigned short urgent) |
| { |
| struct DI_SIM_MIF_s *mtnwr_mif; |
| struct DI_SIM_MIF_s *contprd_mif; |
| struct DI_SIM_MIF_s *contp2rd_mif; |
| struct DI_SIM_MIF_s *contwr_mif; |
| const struct reg_acc *op = &di_pre_regset; |
| struct di_pre_stru_s *ppre = (struct di_pre_stru_s *)pre; |
| |
| dbg_ic("%s:\n", __func__); |
| mtnwr_mif = &ppre->di_mtnwr_mif; |
| contp2rd_mif = &ppre->di_contp2rd_mif; |
| contprd_mif = &ppre->di_contprd_mif; |
| contwr_mif = &ppre->di_contwr_mif; |
| |
| mtnwr_mif->per_bits = 4; |
| contp2rd_mif->per_bits = 4; |
| contprd_mif->per_bits = 4; |
| contwr_mif->per_bits = 4; |
| |
| op->bwr(CONTRD_SCOPE_X, contprd_mif->start_x, 0, 13); |
| op->bwr(CONTRD_SCOPE_X, contprd_mif->end_x, 16, 13); |
| op->bwr(CONTRD_SCOPE_Y, contprd_mif->start_y, 0, 13); |
| op->bwr(CONTRD_SCOPE_Y, contprd_mif->end_y, 16, 13); |
| //DIM_RDMA_WR_BITS(CONTRD_CTRL1, contprd_mif->canvas_num, 16, 8); |
| op->bwr(CONTRD_CTRL1, 2, 8, 2); |
| op->bwr(CONTRD_CTRL1, 0, 0, 3); |
| di_mif1_linear_rd_cfg(contp2rd_mif, |
| CONTRD_CTRL1, |
| CONTRD_CTRL2, |
| CONTRD_BADDR); |
| |
| op->bwr(CONT2RD_SCOPE_X, contp2rd_mif->start_x, 0, 13); |
| op->bwr(CONT2RD_SCOPE_X, contp2rd_mif->end_x, 16, 13); |
| op->bwr(CONT2RD_SCOPE_Y, contp2rd_mif->start_y, 0, 13); |
| op->bwr(CONT2RD_SCOPE_Y, contp2rd_mif->end_y, 16, 13); |
| //DIM_RDMA_WR_BITS(CONT2RD_CTRL1, contp2rd_mif->canvas_num, 16, 8); |
| op->bwr(CONT2RD_CTRL1, 2, 8, 2); |
| op->bwr(CONT2RD_CTRL1, 0, 0, 3); |
| di_mif1_linear_rd_cfg(contprd_mif, |
| CONT2RD_CTRL1, |
| CONT2RD_CTRL2, |
| CONT2RD_BADDR); |
| |
| /* current field mtn canvas index. */ |
| op->bwr(MTNWR_X, mtnwr_mif->start_x, 16, 13); |
| op->bwr(MTNWR_X, mtnwr_mif->end_x, 0, 13); |
| op->bwr(MTNWR_X, 2, 30, 2); |
| op->bwr(MTNWR_Y, mtnwr_mif->start_y, 16, 13); |
| op->bwr(MTNWR_Y, mtnwr_mif->end_y, 0, 13); |
| //DIM_RDMA_WR_BITS(MTNWR_CTRL, mtnwr_mif->canvas_num, 0, 8); |
| op->bwr(MTNWR_CAN_SIZE, |
| (mtnwr_mif->end_y - mtnwr_mif->start_y), 0, 13); |
| op->bwr(MTNWR_CAN_SIZE, |
| (mtnwr_mif->end_x - mtnwr_mif->start_x), 16, 13); |
| di_mif1_linear_wr_cfg(mtnwr_mif, MTNWR_STRIDE, MTNWR_BADDR); |
| |
| op->bwr(CONTWR_X, contwr_mif->start_x, 16, 13); |
| op->bwr(CONTWR_X, contwr_mif->end_x, 0, 13); |
| op->bwr(CONTWR_X, 2, 30, 2); |
| op->bwr(CONTWR_Y, contwr_mif->start_y, 16, 13); |
| op->bwr(CONTWR_Y, contwr_mif->end_y, 0, 13); |
| //DIM_RDMA_WR_BITS(CONTWR_CTRL, contwr_mif->canvas_num, 0, 8); |
| op->bwr(CONTWR_CAN_SIZE, |
| (contwr_mif->end_y - contwr_mif->start_y), 0, 13); |
| op->bwr(CONTWR_CAN_SIZE, |
| (contwr_mif->end_x - contwr_mif->start_x), 16, 13); |
| di_mif1_linear_wr_cfg(contwr_mif, CONTWR_STRIDE, CONTWR_BADDR); |
| } |
| |
| //set_post_mtnrd_mif_g12 |
| static void set_post_mtnrd_mif_t7(struct DI_SIM_MIF_s *mtnprd_mif) |
| { |
| dbg_ic("%s:", __func__); |
| DIM_VSYNC_WR_MPEG_REG(MTNRD_SCOPE_X, |
| (mtnprd_mif->end_x << 16) | |
| (mtnprd_mif->start_x)); |
| DIM_VSYNC_WR_MPEG_REG(MTNRD_SCOPE_Y, |
| (mtnprd_mif->end_y << 16) | |
| (mtnprd_mif->start_y)); |
| //DIM_VSC_WR_MPG_BT(MTNRD_CTRL1, mtnprd_mif->canvas_num, 16, 8); |
| DIM_VSC_WR_MPG_BT(MTNRD_CTRL1, 0, 0, 3); |
| di_mif1_linear_rd_cfg(mtnprd_mif, MTNRD_CTRL1, MTNRD_CTRL2, MTNRD_BADDR); |
| } |
| |
| //dimh_enable_mc_di_pre_g12 |
| static void pre_enable_mc_t7(struct DI_MC_MIF_s *mcinford_mif, |
| struct DI_MC_MIF_s *mcinfowr_mif, |
| struct DI_MC_MIF_s *mcvecwr_mif, |
| unsigned char mcdi_en) |
| { |
| dbg_ic("%s:", __func__); |
| DIM_RDMA_WR_BITS(MCDI_MOTINEN, (mcdi_en ? 3 : 0), 0, 2); |
| |
| if (is_meson_g12a_cpu() || |
| is_meson_g12b_cpu() || |
| is_meson_sm1_cpu()) { |
| DIM_RDMA_WR(MCDI_CTRL_MODE, (mcdi_en ? 0x1bfef7ff : 0)); |
| } else if (DIM_IS_IC_EF(SC2)) {//from vlsi yanling |
| if (mcdi_en) { |
| DIM_RDMA_WR_BITS(MCDI_CTRL_MODE, 0xf7ff, 0, 16); |
| DIM_RDMA_WR_BITS(MCDI_CTRL_MODE, 0xdff, 17, 15); |
| } else { |
| DIM_RDMA_WR(MCDI_CTRL_MODE, 0); |
| } |
| } else { |
| DIM_RDMA_WR(MCDI_CTRL_MODE, (mcdi_en ? 0x1bfff7ff : 0)); |
| } |
| |
| mcinford_mif->per_bits = 16; |
| mcinfowr_mif->per_bits = 16; |
| mcvecwr_mif->per_bits = 16; |
| DIM_RDMA_WR_BITS(DI_PRE_CTRL, (mcdi_en ? 3 : 0), 16, 2); |
| |
| DIM_RDMA_WR_BITS(MCINFRD_SCOPE_X, mcinford_mif->size_x, 16, 13); |
| DIM_RDMA_WR_BITS(MCINFRD_SCOPE_Y, mcinford_mif->size_y, 16, 13); |
| //DIM_RDMA_WR_BITS(MCINFRD_CTRL1, mcinford_mif->canvas_num, 16, 8); |
| DIM_RDMA_WR_BITS(MCINFRD_CTRL1, 2, 0, 3); |
| di_mcmif_linear_rd_cfg(mcinford_mif, |
| MCINFRD_CTRL1, |
| MCINFRD_CTRL2, |
| MCINFRD_BADDR); |
| |
| DIM_RDMA_WR_BITS(MCVECWR_X, mcvecwr_mif->size_x, 0, 13); |
| DIM_RDMA_WR_BITS(MCVECWR_Y, mcvecwr_mif->size_y, 0, 13); |
| //DIM_RDMA_WR_BITS(MCVECWR_CTRL, mcvecwr_mif->canvas_num, 0, 8); |
| DIM_RDMA_WR_BITS(MCVECWR_CAN_SIZE, mcvecwr_mif->size_y, 0, 13); |
| DIM_RDMA_WR_BITS(MCVECWR_CAN_SIZE, mcvecwr_mif->size_x, 16, 13); |
| di_mcmif_linear_wr_cfg(mcvecwr_mif, MCVECWR_STRIDE, MCVECWR_BADDR); |
| |
| DIM_RDMA_WR_BITS(MCINFWR_X, mcinfowr_mif->size_x, 0, 13); |
| DIM_RDMA_WR_BITS(MCINFWR_Y, mcinfowr_mif->size_y, 0, 13); |
| //DIM_RDMA_WR_BITS(MCINFWR_CTRL, mcinfowr_mif->canvas_num, 0, 8); |
| DIM_RDMA_WR_BITS(MCINFWR_CAN_SIZE, mcinfowr_mif->size_y, 0, 13); |
| DIM_RDMA_WR_BITS(MCINFWR_CAN_SIZE, mcinfowr_mif->size_x, 16, 13); |
| di_mcmif_linear_wr_cfg(mcinfowr_mif, MCINFWR_STRIDE, MCINFWR_BADDR); |
| } |
| |
| /*************************************************/ |
| |
| #define DI_SCALAR_DISABLE (1) |
| |
| unsigned int get_afbcd_offset(enum EAFBC_DEC dec) |
| { |
| int i, offset; |
| |
| i = 0; |
| switch (dec) { |
| case EAFBC_DEC0: |
| i = -24; |
| break; |
| case EAFBC_DEC1: |
| i = -23; |
| break; |
| case EAFBC_DEC2_DI: |
| i = 0; |
| break; |
| case EAFBC_DEC3_MEM: |
| i = 2; |
| break; |
| case EAFBC_DEC_CHAN2: |
| i = 1; |
| break; |
| case EAFBC_DEC_IF0: |
| i = 4; |
| break; |
| case EAFBC_DEC_IF1: |
| i = 3; |
| break; |
| case EAFBC_DEC_IF2: |
| i = 5; |
| break; |
| } |
| offset = i * 0x80; |
| |
| return offset; |
| } |
| |
| //--------------------display.c---------------------------- |
| |
| static unsigned int set_afbcd_mult_simple(int index, |
| struct AFBCD_S *inp_afbcd, |
| const struct reg_acc *opin) |
| { |
| u32 module_sel = index; |
| // 3 bits 0-5: select module m0-m5 6:vd1 7:vd2 |
| u32 hold_line_num = inp_afbcd->hold_line_num; |
| // 7 bits |
| u32 blk_mem_mode = inp_afbcd->blk_mem_mode; |
| // 1 bits 1-12x128bit/blk32x4, 0-16x128bit/blk32x4 |
| u32 compbits_y = inp_afbcd->compbits; |
| // 2 bits 0-8bits 1-9bits 2-10bits |
| u32 compbits_u = inp_afbcd->compbits; |
| // 2 bits 0-8bits 1-9bits 2-10bits |
| u32 compbits_v = inp_afbcd->compbits; |
| // 2 bits 0-8bits 1-9bits 2-10bits |
| u32 hsize_in = inp_afbcd->hsize; |
| //13 bits dec source pic hsize |
| u32 vsize_in = inp_afbcd->vsize; |
| //13 bits dec source pic vsize |
| u32 mif_info_baddr = inp_afbcd->head_baddr; //32 bits |
| u32 mif_data_baddr = inp_afbcd->body_baddr; //32 bits |
| u32 out_horz_bgn = inp_afbcd->out_horz_bgn; //13 bits |
| u32 out_vert_bgn = inp_afbcd->out_vert_bgn; //13 bits |
| u32 out_horz_end = inp_afbcd->hsize - 1; //13 bits |
| u32 out_vert_end = inp_afbcd->vsize - 1; //13 bits |
| |
| u32 hz_ini_phase = inp_afbcd->hz_ini_phase; // 4 bits |
| u32 vt_ini_phase = inp_afbcd->vt_ini_phase; // 4 bits |
| u32 hz_rpt_fst0_en = inp_afbcd->hz_rpt_fst0_en; // 1 bits |
| u32 vt_rpt_fst0_en = inp_afbcd->vt_rpt_fst0_en; // 1 bits |
| |
| u32 rev_mode = inp_afbcd->rev_mode; |
| // 2 bits [1]: vertical rev; [0]: horzontal rev |
| u32 vert_skip_y = inp_afbcd->v_skip_en; |
| // 2 bits 00-y0y1, 01-y0, 10-y1, 11-(y0+y1)/2 |
| u32 horz_skip_y = inp_afbcd->h_skip_en; |
| // 2 bits 00-y0y1, 01-y0, 10-y1, 11-(y0+y1)/2 |
| u32 vert_skip_uv = inp_afbcd->v_skip_en; |
| // 2 bits 00-y0y1, 01-y0, 10-y1, 11-(y0+y1)/2 |
| u32 horz_skip_uv = inp_afbcd->h_skip_en; |
| // 2 bits 00-y0y1, 01-y0, 10-y1, 11-(y0+y1)/2 |
| |
| #ifdef ARY_MARK |
| u32 def_color_y = 0; //10 bits |
| u32 def_color_u = (inp_afbcd->compbits == 0) ? |
| 0x200 : (inp_afbcd->compbits == 1) ? 0x100 : 0x80; //10 bits |
| #else //ary change |
| u32 def_color_y = 0x3ff; //ary 0; //10 bits |
| //u32 def_color_u = (inp_afbcd->compbits == 0) ? |
| // 0x200 : (inp_afbcd->compbits == 1) ? 0x100 : 0x80; //10 bits |
| u32 def_color_u = (inp_afbcd->compbits == 0) ? |
| 0x80 : (inp_afbcd->compbits == 1) ? 0x100 : 0x200; //10 bits |
| #endif |
| u32 def_color_v; |
| //ary = def_color_u ; //10 bits |
| u32 reg_lossy_en = inp_afbcd->reg_lossy_en; // 2 bits |
| u32 ddr_sz_mode = inp_afbcd->ddr_sz_mode; |
| // 1 bits 1:mmu mode |
| u32 fmt_mode = inp_afbcd->fmt_mode; |
| // 2 bits default = 2, 0:yuv444 1:yuv422 2:yuv420 |
| u32 reg_fmt444_comb = inp_afbcd->fmt444_comb; |
| // 1 bits fmt444 8bit pack enable |
| u32 reg_dos_uncomp_mode = inp_afbcd->dos_uncomp; //1 bits |
| |
| u32 pip_src_mode = inp_afbcd->pip_src_mode; |
| // 1 bits 0: src from vdin/dos 1:src from pip |
| u32 rot_ofmt_mode = inp_afbcd->rot_ofmt_mode; |
| // 2 bits default = 2, 0:yuv444 1:yuv422 2:yuv420 |
| u32 rot_ocompbit = inp_afbcd->rot_ocompbit; |
| // 2 bits rot output bit width,0:8bit 1:9bit 2:10bit |
| u32 rot_drop_mode = inp_afbcd->rot_drop_mode; |
| //rot_drop_mode |
| u32 rot_vshrk = inp_afbcd->rot_vshrk; //rot_vshrk |
| u32 rot_hshrk = inp_afbcd->rot_hshrk; //rot_hshrk |
| u32 rot_hbgn = inp_afbcd->rot_hbgn; //5 bits |
| u32 rot_vbgn = inp_afbcd->rot_vbgn; //2 bits |
| u32 rot_en = inp_afbcd->rot_en; //1 bits |
| |
| /*input end *****************************************************/ |
| u32 compbits_yuv; |
| u32 conv_lbuf_len; //12 bits |
| u32 dec_lbuf_depth; //12 bits |
| u32 mif_lbuf_depth; //12 bits |
| u32 mif_blk_bgn_h; //10 bits |
| u32 mif_blk_bgn_v; //12 bits |
| u32 mif_blk_end_h; //10 bits |
| u32 mif_blk_end_v; //12 bits |
| u32 dec_pixel_bgn_h; //13 bits |
| u32 dec_pixel_bgn_v; //13 bits |
| u32 dec_pixel_end_h; //13 bits |
| u32 dec_pixel_end_v; //13 bits |
| |
| u32 dec_hsize_proc; //13 bits |
| u32 dec_vsize_proc; //13 bits |
| //ary no use uint32_t hsize_out ; //13 bits |
| //ary no use uint32_t vsize_out ; //13 bits |
| u32 out_end_dif_h; //13 bits |
| u32 out_end_dif_v; //13 bits |
| u32 rev_mode_h; |
| u32 rev_mode_v; |
| |
| u32 fmt_size_h ; //13 bits |
| u32 fmt_size_v; //13 bits |
| u32 hfmt_en = 0; |
| u32 vfmt_en = 0; |
| u32 uv_vsize_in = 0; |
| u32 vt_yc_ratio = 0; |
| u32 hz_yc_ratio = 0; |
| |
| s32 compbits_eq8; |
| s32 regs_ofst; |
| u32 vt_phase_step; //ary add for compile |
| u32 vfmt_w; //ary add for compile |
| const struct reg_acc *op; |
| |
| if (!opin) |
| op = &di_pre_regset; |
| else |
| op = opin; |
| |
| def_color_v = def_color_u; //10 bits //ary |
| #ifdef MARK_SC2 |
| regs_ofst = (module_sel == 6) ? -24 : //vd1 0x48 0x0-0x7f |
| (module_sel == 7) ? -23 : //vd2 0x48 0x80-0xff |
| module_sel; //di_m0-m5 0x54-0x56 |
| regs_ofst = 128 * 4 * regs_ofst; |
| #endif |
| regs_ofst = get_afbcd_offset(index); |
| dim_print("%s:0x%x\n", __func__, (regs_ofst + AFBCDM_ENABLE)); |
| rev_mode_h = rev_mode & 0x1; |
| rev_mode_v = rev_mode & 0x2; |
| |
| compbits_yuv = ((compbits_v & 0x3) << 4) | |
| ((compbits_u & 0x3) << 2) | |
| ((compbits_y & 0x3) << 0); |
| |
| compbits_eq8 = (compbits_y == 0 && compbits_u == 0 && compbits_v == 0); |
| if ((hsize_in > 1024 && |
| fmt_mode == 0 && compbits_eq8 == 0) || hsize_in > 2048) |
| conv_lbuf_len = 256; |
| else |
| conv_lbuf_len = 128; |
| |
| //if(hsize_in>2048) dec_lbuf_depth = 128; //todo |
| //else dec_lbuf_depth = 64 ; |
| //if(hsize_in>2048) mif_lbuf_depth = 128; //todo |
| //else mif_lbuf_depth = 64 ; |
| |
| dec_lbuf_depth = 128; |
| mif_lbuf_depth = 128; |
| |
| dec_hsize_proc = ((hsize_in >> 5) + |
| ((hsize_in & 0x1f) != 0)) * 32; // unit: pixel |
| dec_vsize_proc = ((vsize_in >> 2) + |
| ((vsize_in & 0x3) != 0)) * 4; // unit: pixel |
| |
| mif_blk_bgn_h = out_horz_bgn >> 5; |
| mif_blk_bgn_v = out_vert_bgn >> 2; |
| mif_blk_end_h = out_horz_end >> 5; |
| mif_blk_end_v = out_vert_end >> 2; |
| |
| out_end_dif_h = out_horz_end - out_horz_bgn; |
| out_end_dif_v = out_vert_end - out_vert_bgn; |
| |
| dec_pixel_bgn_h = (out_horz_bgn & 0x1f); |
| dec_pixel_bgn_v = (out_vert_bgn & 0x03); |
| dec_pixel_end_h = (dec_pixel_bgn_h + out_end_dif_h); |
| dec_pixel_end_v = (dec_pixel_bgn_v + out_end_dif_v); |
| |
| fmt_size_h = ((out_horz_end >> 1) << 1) + 1 - |
| ((out_horz_bgn >> 1) << 1); |
| fmt_size_v = ((out_vert_end >> 1) << 1) + 1 - |
| ((out_vert_bgn >> 1) << 1); |
| fmt_size_h = horz_skip_y != 0 ? (fmt_size_h >> 1) + 1 : |
| fmt_size_h + 1; |
| fmt_size_v = vert_skip_y != 0 ? (fmt_size_v >> 1) + 1 : |
| fmt_size_v + 1; |
| |
| //stimulus_display("jsen_debug ofst=%x\n", regs_ofst); |
| //stimulus_display("jsen_debug reg_addr=%x\n", (regs_ofst+AFBCDM_MODE)); |
| dbg_afbc("\n=====afbcd module %x==========\n", module_sel); |
| dbg_afbc("fmt=%d bit=%d\n", fmt_mode, compbits_y); |
| dbg_afbc("hsize=%d vsize=%d\n", hsize_in, vsize_in); |
| dbg_afbc("win_hbgn=%d win_hend=%d\n", out_horz_bgn, |
| out_horz_end); |
| dbg_afbc("win_vbgn=%d win_vend=%d\n", out_vert_bgn, |
| out_vert_end); |
| dbg_afbc("dos=%d mmu=%d\n", reg_dos_uncomp_mode, |
| ddr_sz_mode); |
| dbg_afbc("rot_en=%d pip_src=%d\n", rot_en, pip_src_mode); |
| dbg_afbc("rev_mode=%d\n", rev_mode); |
| dbg_afbc("===========================\n"); |
| hold_line_num = (hold_line_num > 4) ? (hold_line_num - 4) : 0; |
| //ary: below maybe set_di_afbc_dec_base=========== |
| op->wr((regs_ofst + AFBCDM_MODE), |
| ((ddr_sz_mode & 0x1) << 29) | // ddr_sz_mode |
| ((blk_mem_mode & 0x1) << 28) | // blk_mem_mode |
| ((rev_mode & 0x3) << 26) | // rev_mode |
| ((3) << 24) | // mif_urgent |
| ((hold_line_num & 0x7f) << 16) | // hold_line_num |
| ((2) << 14) | // burst_len |
| ((compbits_yuv & 0x3f) << 8) | // compbits_yuv |
| ((vert_skip_y & 0x3) << 6) | // vert_skip_y |
| ((horz_skip_y & 0x3) << 4) | // horz_skip_y |
| ((vert_skip_uv & 0x3) << 2) | // vert_skip_uv |
| ((horz_skip_uv & 0x3) << 0) // horz_skip_uv |
| ); |
| |
| op->wr((regs_ofst + AFBCDM_SIZE_IN), |
| ((hsize_in & 0x1fff) << 16) | // hsize_in |
| ((vsize_in & 0x1fff) << 0) // vsize_in |
| ); |
| op->wr((regs_ofst + AFBCDM_DEC_DEF_COLOR), |
| ((def_color_y & 0x3ff) << 20) | // def_color_y |
| ((def_color_u & 0x3ff) << 10) | // def_color_u |
| ((def_color_v & 0x3ff) << 0) // def_color_v |
| ); |
| |
| op->wr((regs_ofst + AFBCDM_CONV_CTRL), |
| ((fmt_mode & 0x3) << 12) | // fmt_mode |
| ((conv_lbuf_len & 0xfff) << 0) // conv_lbuf_len |
| ); |
| |
| op->wr((regs_ofst + AFBCDM_LBUF_DEPTH), |
| ((dec_lbuf_depth & 0xfff) << 16) | // dec_lbuf_depth |
| ((mif_lbuf_depth & 0xfff) << 0) // mif_lbuf_depth |
| ); |
| |
| op->wr((regs_ofst + AFBCDM_HEAD_BADDR), mif_info_baddr); |
| op->wr((regs_ofst + AFBCDM_BODY_BADDR), mif_data_baddr); |
| |
| op->wr((regs_ofst + AFBCDM_MIF_HOR_SCOPE), |
| ((mif_blk_bgn_h & 0x3ff) << 16) | // |
| ((mif_blk_end_h & 0x3ff) << 0) // |
| ); |
| |
| op->wr((regs_ofst + AFBCDM_MIF_VER_SCOPE), |
| ((mif_blk_bgn_v & 0xfff) << 16) | // |
| ((mif_blk_end_v & 0xfff) << 0) // |
| ); |
| |
| op->wr((regs_ofst + AFBCDM_PIXEL_HOR_SCOPE), |
| ((dec_pixel_bgn_h & 0x1fff) << 16) | // |
| ((dec_pixel_end_h & 0x1fff) << 0) // |
| ); |
| |
| op->wr((regs_ofst + AFBCDM_PIXEL_VER_SCOPE), |
| ((dec_pixel_bgn_v & 0x1fff) << 16) | // |
| ((dec_pixel_end_v & 0x1fff) << 0) // |
| ); |
| |
| op->wr((regs_ofst + AFBCDM_ENABLE), |
| ((1 & 0x1) << 21) | //reg_addr_link_en |
| ((reg_fmt444_comb & 0x1) << 20) | //reg_fmt444_comb |
| ((reg_dos_uncomp_mode & 0x1) << 19) | //reg_dos_uncomp_mode |
| ((0x43700 & 0x7ffff) << 0) // |
| ); |
| //ary end of set_di_afbc_dec_base================================= |
| |
| if (fmt_mode == 2) { //420 |
| hfmt_en = ((horz_skip_y != 0) && (horz_skip_uv == 0)) ? 0 : 1; |
| vfmt_en = ((vert_skip_y != 0) && (vert_skip_uv == 0)) ? 0 : 1; |
| } else if (fmt_mode == 1) { //422 |
| hfmt_en = ((horz_skip_y != 0) && (horz_skip_uv == 0)) ? 0 : 1; |
| vfmt_en = ((vert_skip_y == 0) && (vert_skip_uv != 0)) ? 1 : 0; |
| } else if (fmt_mode == 0) { //444 |
| hfmt_en = ((horz_skip_y == 0) && (horz_skip_uv != 0)) ? 1 : 0; |
| vfmt_en = ((vert_skip_y == 0) && (vert_skip_uv != 0)) ? 1 : 0; |
| } |
| |
| if (fmt_mode == 2) { //420 |
| if (vfmt_en) { |
| if (vert_skip_uv != 0) { |
| uv_vsize_in = (fmt_size_v >> 2); |
| vt_yc_ratio = vert_skip_y == 0 ? 2 : 1; |
| } else { |
| uv_vsize_in = (fmt_size_v >> 1); |
| vt_yc_ratio = 1; |
| } |
| } else { |
| uv_vsize_in = fmt_size_v; |
| vt_yc_ratio = 0; |
| } |
| |
| if (hfmt_en) { |
| if (horz_skip_uv != 0) |
| hz_yc_ratio = horz_skip_y == 0 ? 2 : 1; |
| else |
| hz_yc_ratio = 1; |
| } else { |
| hz_yc_ratio = 0; |
| } |
| } else if (fmt_mode == 1) {//422 |
| if (vfmt_en) { |
| if (vert_skip_uv != 0) { |
| uv_vsize_in = (fmt_size_v >> 1); |
| vt_yc_ratio = vert_skip_y == 0 ? 1 : 0; |
| } else { |
| uv_vsize_in = (fmt_size_v >> 1); |
| vt_yc_ratio = 1; |
| } |
| } else { |
| uv_vsize_in = fmt_size_v; |
| vt_yc_ratio = 0; |
| } |
| |
| if (hfmt_en) { |
| if (horz_skip_uv != 0) |
| hz_yc_ratio = horz_skip_y == 0 ? 2 : 1; |
| else |
| hz_yc_ratio = 1; |
| } else { |
| hz_yc_ratio = 0; |
| } |
| } else if (fmt_mode == 0) {//444 |
| if (vfmt_en) { //vert_skip_y==0,vert_skip_uv!=0 |
| uv_vsize_in = (fmt_size_v >> 1); |
| vt_yc_ratio = 1; |
| } else { |
| uv_vsize_in = fmt_size_v; |
| vt_yc_ratio = 0; |
| } |
| |
| if (hfmt_en) {//horz_skip_y==0,horz_skip_uv!=0 |
| hz_yc_ratio = 1; |
| } else { |
| hz_yc_ratio = 0; |
| } |
| } |
| |
| //stimulus_display("===uv_vsize_in= %0x\n",uv_vsize_in ); |
| //stimulus_display("===vt_yc_ratio= %0x\n",vt_yc_ratio ); |
| //stimulus_display("===hz_yc_ratio= %0x\n",hz_yc_ratio ); |
| //ary below is set_di_afbc_fmt |
| |
| vt_phase_step = (16 >> vt_yc_ratio); |
| vfmt_w = (fmt_size_h >> hz_yc_ratio); |
| |
| op->wr((regs_ofst + AFBCDM_VD_CFMT_CTRL), |
| (0 << 28) | //hz rpt pixel |
| (hz_ini_phase << 24) | //hz ini phase |
| (hz_rpt_fst0_en << 23) | //repeat p0 enable |
| (hz_yc_ratio << 21) | //hz yc ratio |
| (hfmt_en << 20) | //hz enable |
| (1 << 17) | //nrpt_phase0 enable |
| (vt_rpt_fst0_en << 16) | //repeat l0 enable |
| (0 << 12) | //skip line num |
| (vt_ini_phase << 8) | //vt ini phase |
| (vt_phase_step << 1) | //vt phase step (3.4) |
| (vfmt_en << 0) //vt enable |
| ); |
| |
| op->wr((regs_ofst + AFBCDM_VD_CFMT_W), |
| (fmt_size_h << 16) | //hz format width |
| (vfmt_w << 0) //vt format width |
| ); |
| |
| op->wr((regs_ofst + AFBCDM_VD_CFMT_H), uv_vsize_in); |
| //ary set_di_afbc_fmt end |
| //=============================================== |
| |
| //ary below is in set_di_afbc_dec_base same |
| op->bwr((regs_ofst + AFBCDM_IQUANT_ENABLE), |
| (reg_lossy_en & 0x1), 0, 1);//lossy_luma_en |
| op->bwr((regs_ofst + AFBCDM_IQUANT_ENABLE), |
| (reg_lossy_en & 0x2), 4, 1);//lossy_chrm_en |
| |
| //=============================================== |
| //ary below is new |
| |
| op->wr((regs_ofst + AFBCDM_ROT_CTRL), |
| ((pip_src_mode & 0x1) << 27) | //pip_src_mode |
| ((rot_drop_mode & 0x7) << 24) | //rot_uv_vshrk_drop_mode |
| ((rot_drop_mode & 0x7) << 20) | //rot_uv_hshrk_drop_mode |
| ((rot_vshrk & 0x3) << 18) | //rot_uv_vshrk_ratio |
| ((rot_hshrk & 0x3) << 16) | //rot_uv_hshrk_ratio |
| ((rot_drop_mode & 0x7) << 12) | //rot_y_vshrk_drop_mode |
| ((rot_drop_mode & 0x7) << 8) | //rot_y_hshrk_drop_mode |
| ((rot_vshrk & 0x3) << 6) | //rot_y_vshrk_ratio |
| ((rot_hshrk & 0x3) << 4) | //rot_y_hshrk_ratio |
| ((0 & 0x3) << 2) | //rot_uv422_drop_mode |
| ((0 & 0x3) << 1) | //rot_uv422_omode |
| ((rot_en & 0x1) << 0) //rot_enable |
| ); |
| |
| op->wr((regs_ofst + AFBCDM_ROT_SCOPE), |
| ((1 & 0x1) << 16) | //reg_rot_ifmt_force444 |
| ((rot_ofmt_mode & 0x3) << 14) | //reg_rot_ofmt_mode |
| ((rot_ocompbit & 0x3) << 12) | //reg_rot_compbits_out_y |
| ((rot_ocompbit & 0x3) << 10) | //reg_rot_compbits_out_uv |
| ((rot_vbgn & 0x3) << 8) | //rot_wrbgn_v |
| ((rot_hbgn & 0x1f) << 0) //rot_wrbgn_h |
| ); |
| |
| //todo |
| //Wr_reg_bits(VD1_AFBCD0_MISC_CTRL, 1, 22, 1); // select afbc mem |
| //Wr_reg_bits(VD1_AFBCD0_MISC_CTRL, 1, 10, 1); // |
| //Wr_reg_bits(VD1_AFBCD0_MISC_CTRL, 1, 12, 1); // select afbc_dec0 |
| //Wr_reg_bits(VD2_AFBCD1_MISC_CTRL, 1, 22, 1); // select afbc mem |
| //Wr_reg_bits(VD2_AFBCD1_MISC_CTRL, 1, 10, 1); // |
| //Wr_reg_bits(VD2_AFBCD1_MISC_CTRL, 1, 12, 1); // select afbc_dec0 |
| return 0; |
| } /* set_afbcd_mult*/ |
| |
| static const unsigned int reg_afbc_e_v3[AFBC_ENC_V3_NUB][DIM_AFBCE_V3_NUB] = { |
| { |
| DI_AFBCE_ENABLE, |
| DI_AFBCE_MODE, |
| DI_AFBCE_SIZE_IN, |
| DI_AFBCE_BLK_SIZE_IN, |
| DI_AFBCE_HEAD_BADDR, |
| DI_AFBCE_MIF_SIZE, |
| DI_AFBCE_PIXEL_IN_HOR_SCOPE, |
| DI_AFBCE_PIXEL_IN_VER_SCOPE, |
| DI_AFBCE_CONV_CTRL, |
| DI_AFBCE_MIF_HOR_SCOPE, |
| DI_AFBCE_MIF_VER_SCOPE, |
| DI_AFBCE_STAT1, |
| DI_AFBCE_STAT2, |
| DI_AFBCE_FORMAT, |
| DI_AFBCE_MODE_EN, |
| DI_AFBCE_DWSCALAR, |
| DI_AFBCE_DEFCOLOR_1, |
| DI_AFBCE_DEFCOLOR_2, |
| DI_AFBCE_QUANT_ENABLE, |
| DI_AFBCE_IQUANT_LUT_1, |
| DI_AFBCE_IQUANT_LUT_2, |
| DI_AFBCE_IQUANT_LUT_3, |
| DI_AFBCE_IQUANT_LUT_4, |
| DI_AFBCE_RQUANT_LUT_1, |
| DI_AFBCE_RQUANT_LUT_2, |
| DI_AFBCE_RQUANT_LUT_3, |
| DI_AFBCE_RQUANT_LUT_4, |
| DI_AFBCE_YUV_FORMAT_CONV_MODE, |
| DI_AFBCE_DUMMY_DATA, |
| DI_AFBCE_CLR_FLAG, |
| DI_AFBCE_STA_FLAGT, |
| DI_AFBCE_MMU_NUM, |
| DI_AFBCE_MMU_RMIF_CTRL1, |
| DI_AFBCE_MMU_RMIF_CTRL2, |
| DI_AFBCE_MMU_RMIF_CTRL3, |
| DI_AFBCE_MMU_RMIF_CTRL4, |
| DI_AFBCE_MMU_RMIF_SCOPE_X, |
| DI_AFBCE_MMU_RMIF_SCOPE_Y, |
| DI_AFBCE_MMU_RMIF_RO_STAT, |
| DI_AFBCE_PIP_CTRL, |
| DI_AFBCE_ROT_CTRL, |
| }, |
| { |
| DI_AFBCE_ENABLE, |
| DI_AFBCE_MODE, |
| DI_AFBCE_SIZE_IN, |
| DI_AFBCE_BLK_SIZE_IN, |
| DI_AFBCE_HEAD_BADDR, |
| DI_AFBCE_MIF_SIZE, |
| DI_AFBCE_PIXEL_IN_HOR_SCOPE, |
| DI_AFBCE_PIXEL_IN_VER_SCOPE, |
| DI_AFBCE_CONV_CTRL, |
| DI_AFBCE_MIF_HOR_SCOPE, |
| DI_AFBCE_MIF_VER_SCOPE, |
| DI_AFBCE_STAT1, |
| DI_AFBCE_STAT2, |
| DI_AFBCE_FORMAT, |
| DI_AFBCE_MODE_EN, |
| DI_AFBCE_DWSCALAR, |
| DI_AFBCE_DEFCOLOR_1, |
| DI_AFBCE_DEFCOLOR_2, |
| DI_AFBCE_QUANT_ENABLE, |
| DI_AFBCE_IQUANT_LUT_1, |
| DI_AFBCE_IQUANT_LUT_2, |
| DI_AFBCE_IQUANT_LUT_3, |
| DI_AFBCE_IQUANT_LUT_4, |
| DI_AFBCE_RQUANT_LUT_1, |
| DI_AFBCE_RQUANT_LUT_2, |
| DI_AFBCE_RQUANT_LUT_3, |
| DI_AFBCE_RQUANT_LUT_4, |
| DI_AFBCE_YUV_FORMAT_CONV_MODE, |
| DI_AFBCE_DUMMY_DATA, |
| DI_AFBCE_CLR_FLAG, |
| DI_AFBCE_STA_FLAGT, |
| DI_AFBCE_MMU_NUM, |
| DI_AFBCE_MMU_RMIF_CTRL1, |
| DI_AFBCE_MMU_RMIF_CTRL2, |
| DI_AFBCE_MMU_RMIF_CTRL3, |
| DI_AFBCE_MMU_RMIF_CTRL4, |
| DI_AFBCE_MMU_RMIF_SCOPE_X, |
| DI_AFBCE_MMU_RMIF_SCOPE_Y, |
| DI_AFBCE_MMU_RMIF_RO_STAT, |
| DI_AFBCE_PIP_CTRL, |
| DI_AFBCE_ROT_CTRL, |
| }, |
| { |
| DI_AFBCE1_ENABLE, |
| DI_AFBCE1_MODE, |
| DI_AFBCE1_SIZE_IN, |
| DI_AFBCE1_BLK_SIZE_IN, |
| DI_AFBCE1_HEAD_BADDR, |
| DI_AFBCE1_MIF_SIZE, |
| DI_AFBCE1_PIXEL_IN_HOR_SCOPE, |
| DI_AFBCE1_PIXEL_IN_VER_SCOPE, |
| DI_AFBCE1_CONV_CTRL, |
| DI_AFBCE1_MIF_HOR_SCOPE, |
| DI_AFBCE1_MIF_VER_SCOPE, |
| DI_AFBCE1_STAT1, |
| DI_AFBCE1_STAT2, |
| DI_AFBCE1_FORMAT, |
| DI_AFBCE1_MODE_EN, |
| DI_AFBCE1_DWSCALAR, |
| DI_AFBCE1_DEFCOLOR_1, |
| DI_AFBCE1_DEFCOLOR_2, |
| DI_AFBCE1_QUANT_ENABLE, |
| DI_AFBCE1_IQUANT_LUT_1, |
| DI_AFBCE1_IQUANT_LUT_2, |
| DI_AFBCE1_IQUANT_LUT_3, |
| DI_AFBCE1_IQUANT_LUT_4, |
| DI_AFBCE1_RQUANT_LUT_1, |
| DI_AFBCE1_RQUANT_LUT_2, |
| DI_AFBCE1_RQUANT_LUT_3, |
| DI_AFBCE1_RQUANT_LUT_4, |
| DI_AFBCE1_YUV_FORMAT_CONV_MODE, |
| DI_AFBCE1_DUMMY_DATA, |
| DI_AFBCE1_CLR_FLAG, |
| DI_AFBCE1_STA_FLAGT, |
| DI_AFBCE1_MMU_NUM, |
| DI_AFBCE1_MMU_RMIF_CTRL1, |
| DI_AFBCE1_MMU_RMIF_CTRL2, |
| DI_AFBCE1_MMU_RMIF_CTRL3, |
| DI_AFBCE1_MMU_RMIF_CTRL4, |
| DI_AFBCE1_MMU_RMIF_SCOPE_X, |
| DI_AFBCE1_MMU_RMIF_SCOPE_Y, |
| DI_AFBCE1_MMU_RMIF_RO_STAT, |
| DI_AFBCE1_PIP_CTRL, |
| DI_AFBCE1_ROT_CTRL, |
| |
| }, |
| }; |
| |
| static unsigned int set_afbce_cfg_v1(int index, |
| //0:vdin_afbce 1:di_afbce0 2:di_afbce1 |
| int enable, |
| //open nbit of afbce |
| struct AFBCE_S *afbce, |
| const struct reg_acc *opin) |
| { |
| const unsigned int *reg; |
| int hold_line_num = 0; /* version 0523 is 2*/ |
| int lbuf_depth = 256; |
| |
| int hsize_buf = afbce->reg_pip_mode ? |
| afbce->hsize_bgnd : afbce->hsize_in; |
| int vsize_buf = afbce->reg_pip_mode ? |
| afbce->vsize_bgnd : afbce->vsize_in; |
| |
| int hblksize_buf = (hsize_buf + 31) >> 5; |
| int vblksize_buf = (vsize_buf + 3) >> 2; |
| |
| int blk_out_end_h = (afbce->enc_win_end_h + 31) >> 5; |
| //output blk scope |
| int blk_out_bgn_h = afbce->enc_win_bgn_h >> 5; |
| //output blk scope |
| int blk_out_end_v = (afbce->enc_win_end_v + 3) >> 2; |
| //output blk scope |
| int blk_out_bgn_v = afbce->enc_win_bgn_v >> 2; |
| //output blk scope |
| |
| int lossy_luma_en; |
| int lossy_chrm_en; |
| int reg_fmt444_comb;//calculate |
| int uncmp_size;//calculate |
| int uncmp_bits;//calculate |
| int sblk_num;//calculate |
| int cur_mmu_used = 0;//mmu info linear addr |
| const struct reg_acc *op; |
| |
| if (!opin) |
| op = &di_pre_regset; |
| else |
| op = opin; |
| |
| reg = ®_afbc_e_v3[index][0]; |
| |
| if (afbce->din_swt) { |
| index = (index == 1) ? 2 : |
| (index == 2) ? 1 : index;//todo |
| } |
| op->bwr(DI_TOP_CTRL1, (afbce->din_swt ? 3 : 0), 0, 2); |
| //only di afbce have ram_comb |
| |
| if (index == 0) { //Vdin_afbce |
| |
| } else if (index == 1) { |
| op->bwr(DI_TOP_CTRL1, afbce->reg_ram_comb, 2, 1); |
| //only di afbce have ram_comb |
| } else if (index == 2) { |
| op->bwr(DI_TOP_CTRL1, afbce->reg_ram_comb, 2, 1); |
| //only di afbce have ram_comb |
| } else { |
| PR_ERR("ERROR:AFBCE INDEX WRONG!!!\n"); |
| } |
| |
| /////////////////////////////////////////////////////////////////////// |
| //////Afbce configure logic |
| /////////////////////////////////////////////////////////////////////// |
| |
| reg_fmt444_comb = (afbce->reg_format_mode == 0) && |
| (afbce->force_444_comb); |
| //yuv444 can only support 8bit,and must use comb_mode |
| |
| sblk_num = (afbce->reg_format_mode == 2) ? 12 : |
| //4*4 subblock number in every 32*4 mblk |
| (afbce->reg_format_mode == 1) ? 16 : 24; |
| |
| uncmp_bits = afbce->reg_compbits_y > afbce->reg_compbits_c ? |
| afbce->reg_compbits_y : afbce->reg_compbits_c; |
| |
| uncmp_size = (((((16 * uncmp_bits * |
| sblk_num) + 7) >> 3) + 31) / 32) << 1; |
| //bit size of uncompression mode |
| |
| if (afbce->loosy_mode == 0) { //chose loosy mode of luma and chroma |
| lossy_luma_en = 0; |
| lossy_chrm_en = 0; |
| } else if (afbce->loosy_mode == 1) { |
| lossy_luma_en = 1; |
| lossy_chrm_en = 0; |
| } else if (afbce->loosy_mode == 2) { |
| lossy_luma_en = 0; |
| lossy_chrm_en = 1; |
| } else { |
| lossy_luma_en = 1; |
| lossy_chrm_en = 1; |
| } |
| dim_print("%s:0x%x\n", __func__, reg[AFBCEX_ENABLE]); |
| dim_print("\t:w[%d],h[%d]\n", afbce->hsize_in, afbce->vsize_in); |
| /////////////////////////////////////////////////////////////////////// |
| //////Afbce configure registers |
| /////////////////////////////////////////////////////////////////////// |
| |
| op->wr(reg[AFBCEX_MODE], |
| (0 & 0x7) << 29 | |
| (afbce->rev_mode & 0x3) << 26 | |
| (3 & 0x3) << 24 | |
| (hold_line_num & 0x7f) << 16 | |
| (2 & 0x3) << 14 | |
| (reg_fmt444_comb & 0x1)); |
| |
| op->bwr(reg[AFBCEX_QUANT_ENABLE], |
| (lossy_luma_en & 0x1), 0, 1);//loosy |
| op->bwr(reg[AFBCEX_QUANT_ENABLE], |
| (lossy_chrm_en & 0x1), 4, 1);//loosy |
| |
| op->wr(reg[AFBCEX_SIZE_IN], |
| ((hsize_buf & 0x1fff) << 16) | // hsize_in of afbc input |
| ((vsize_buf & 0x1fff) << 0) // vsize_in of afbc input |
| ); |
| |
| op->wr(reg[AFBCEX_BLK_SIZE_IN], |
| ((hblksize_buf & 0x1fff) << 16) | // out blk hsize |
| ((vblksize_buf & 0x1fff) << 0) // out blk vsize |
| ); |
| if (DIM_IS_IC_EF(T7)) |
| op->wr(reg[AFBCEX_HEAD_BADDR], afbce->head_baddr >> 4); |
| else |
| op->wr(reg[AFBCEX_HEAD_BADDR], afbce->head_baddr); |
| |
| //head addr of compressed data |
| |
| op->bwr(reg[AFBCEX_MIF_SIZE], |
| (uncmp_size & 0x1fff), 16, 5);//uncmp_size |
| |
| op->wr(reg[AFBCEX_PIXEL_IN_HOR_SCOPE], |
| ((afbce->enc_win_end_h & 0x1fff) << 16) | |
| // scope of hsize_in ,should be a integer multiple of 32 |
| ((afbce->enc_win_bgn_h & 0x1fff) << 0) |
| // scope of vsize_in ,should be a integer multiple of 4 |
| ); |
| |
| op->wr(reg[AFBCEX_PIXEL_IN_VER_SCOPE], |
| ((afbce->enc_win_end_v & 0x1fff) << 16) | |
| // scope of hsize_in ,should be a integer multiple of 32 |
| ((afbce->enc_win_bgn_v & 0x1fff) << 0)); |
| // scope of vsize_in ,should be a integer multiple of 4 |
| |
| op->wr(reg[AFBCEX_CONV_CTRL], lbuf_depth);//fix 256 |
| |
| op->wr(reg[AFBCEX_MIF_HOR_SCOPE], |
| ((blk_out_end_h & 0x3ff) << 16) | // scope of out blk hsize |
| ((blk_out_bgn_h & 0x3ff) << 0)); // scope of out blk vsize |
| |
| op->wr(reg[AFBCEX_MIF_VER_SCOPE], |
| ((blk_out_end_v & 0xfff) << 16) | // scope of out blk hsize |
| ((blk_out_bgn_v & 0xfff) << 0)); // scope of out blk vsize |
| |
| op->wr(reg[AFBCEX_FORMAT], |
| (afbce->reg_format_mode & 0x3) << 8 | |
| (afbce->reg_compbits_c & 0xf) << 4 | |
| (afbce->reg_compbits_y & 0xf)); |
| |
| op->wr(reg[AFBCEX_DEFCOLOR_1], |
| ((afbce->def_color_3 & 0xfff) << 12) | // def_color_a |
| ((afbce->def_color_0 & 0xfff) << 0)); // def_color_y |
| |
| op->wr(reg[AFBCEX_DEFCOLOR_2], |
| ((afbce->def_color_2 & 0xfff) << 12) | // def_color_v |
| ((afbce->def_color_1 & 0xfff) << 0)); // def_color_u |
| |
| //ary temp cur_mmu_used += op->rd(AFBCE_MMU_NUM); |
| //4k addr have used in every frame; |
| if (DIM_IS_IC_EF(T7)) |
| op->wr(reg[AFBCEX_MMU_RMIF_CTRL4], afbce->mmu_info_baddr >> 4); |
| else |
| op->wr(reg[AFBCEX_MMU_RMIF_CTRL4], afbce->mmu_info_baddr); |
| op->bwr(reg[AFBCEX_MMU_RMIF_CTRL1], 0x1, 6, 1);//litter_endia |
| if (afbce->reg_pip_mode) |
| op->bwr(reg[AFBCEX_MMU_RMIF_SCOPE_X], 0x0, 0, 13); |
| else |
| op->bwr(reg[AFBCEX_MMU_RMIF_SCOPE_X], cur_mmu_used, 0, 12); |
| op->bwr(reg[AFBCEX_MMU_RMIF_SCOPE_X], 0x1ffe, 16, 13); |
| op->bwr(reg[AFBCEX_MMU_RMIF_CTRL3], 0x1fff, 0, 13); |
| |
| op->bwr(reg[AFBCEX_PIP_CTRL], afbce->reg_init_ctrl, 1, 1);//pii_moide |
| op->bwr(reg[AFBCEX_PIP_CTRL], afbce->reg_pip_mode, 0, 1); |
| |
| op->bwr(reg[AFBCEX_ROT_CTRL], afbce->rot_en, 4, 1); |
| |
| op->bwr(reg[AFBCEX_ENABLE], 0, 12, 1);//go_line_cnt start |
| op->bwr(reg[AFBCEX_ENABLE], enable, 8, 1);//enable afbce |
| op->bwr(reg[AFBCEX_ENABLE], enable, 0, 1);//enable afbce |
| return 0; |
| |
| } /* set_afbce_cfg_v1 */ |
| |
| /* for double write function */ |
| static void set_shrk_ch(struct SHRK_S *srkcfg, const struct reg_acc *opin) |
| { |
| const struct reg_acc *op; |
| |
| if (!opin) |
| op = &di_pre_regset; |
| else |
| op = opin; |
| |
| if (!srkcfg->shrk_en) { |
| op->bwr(DI_DIWR_SHRK_CTRL, 0, 0, 1); |
| return; |
| } |
| /* pre / post select: 1: pre; 0; post */ |
| op->bwr(DI_TOP_CTRL1, srkcfg->pre_post, 27, 1); |
| |
| op->wr(DI_DIWR_SHRK_CTRL, |
| ((srkcfg->h_shrk_mode & 0x3) << 8) | |
| ((srkcfg->v_shrk_mode & 0x3) << 6) | |
| ((srkcfg->shrk_en & 0x1) << 0)); |
| |
| op->wr(DI_DIWR_SHRK_SIZE, |
| ((srkcfg->hsize_in & 0x1fff) << 13) | // reg_frm_hsize |
| ((srkcfg->vsize_in & 0x1fff) << 0)); // reg_frm_vsize |
| |
| op->bwr(DI_DIWR_SHRK_CTRL, srkcfg->frm_rst, 1, 1); |
| } |
| |
| static void set_shrk_disable(const struct reg_acc *opin) |
| { |
| const struct reg_acc *op; |
| |
| if (!opin) |
| op = &di_pre_regset; |
| else |
| op = opin; |
| op->bwr(DI_DIWR_SHRK_CTRL, 0, 0, 1); |
| } |
| |
| static void set_mcdi_mif(struct DI_MIF1_S *di_inf_default, |
| int hsize, int vsize, const struct reg_acc *op) |
| { |
| int addr_x = (hsize + 4) / 5 - 1; |
| //(di_inf_default->start_x << 16)| ((di_inf_default->end_x+4)/5); |
| int addr_y = vsize - 1; |
| int addrinfo_x = (vsize) / 2 - 1; |
| //(di_inf_default->start_y << 16)| |
| //((di_inf_default->end_y-di_inf_default->start_y) / 2); |
| int addrinfo_y = 1; |
| //(di_inf_default->start_y << 16)| (di_inf_default->start_y+1); |
| |
| // mcdi canvas |
| op->wr(MCVECWR_X, (2 << 30) | addr_x); |
| op->wr(MCVECWR_Y, addr_y); |
| op->wr(MCINFWR_X, (2 << 30) | addrinfo_x); |
| op->wr(MCINFWR_Y, addrinfo_y); |
| op->wr(MCVECRD_SCOPE_X, (addr_x) << 16); |
| op->wr(MCVECRD_SCOPE_Y, (addr_y) << 16); |
| op->wr(MCINFRD_SCOPE_X, (addrinfo_x) << 16); |
| op->wr(MCINFRD_SCOPE_Y, (addrinfo_y) << 16); |
| op->wr(MCVECWR_CAN_SIZE, (addr_x << 16) | addr_y); |
| op->wr(MCINFWR_CAN_SIZE, (addrinfo_x << 16) | addrinfo_y); |
| |
| op->wr(MCVECWR_CTRL, op->rd(MCVECWR_CTRL) | (0 << 14) |
| // sync latch en |
| | (0 << 12)); // enable |
| op->wr(MCINFWR_CTRL, op->rd(MCINFWR_CTRL) | (0 << 14) |
| // sync latch en |
| | (0 << 12)); // enable |
| } |
| |
| static void set_mcdi_def(struct DI_MIF1_S *di_inf_default, |
| int hsizem1, int vsizem1, |
| const struct reg_acc *op) |
| { |
| int hsize = hsizem1 + 1; |
| //(di_inf_default->end_x - di_inf_default->start_x)+ 1; |
| int vsize = vsizem1 + 1; |
| //(di_inf_default->end_y - di_inf_default->start_y)+ 1; |
| int blkhsize = (hsize + 4) / 5; |
| |
| op->wr(MCDI_HV_SIZEIN, ((hsize << 16) + vsize)); |
| op->wr(MCDI_HV_BLKSIZEIN, ((blkhsize << 16) + vsize)); |
| op->wr(MCDI_BLKTOTAL, blkhsize * vsize); |
| op->wr(MCDI_MOTINEN, 1 << 1); |
| //enable motin refinement ary:in dimh_enable_mc_di_pre_g12 |
| if (!(DIM_IS_REV(SC2, MAJOR))) |
| op->wr(MCDI_REF_MV_NUM, 2); |
| //ary : in mc_di_param_init |
| op->wr(MCDI_CTRL_MODE, op->rd(MCDI_CTRL_MODE) | |
| //ary : dimh_mc_pre_mv_irq |
| (0 << 28) | // close linf |
| (1 << 16) | // qme |
| (1 << 9)); // ref |
| //stimulus_print("MCDI DEFAULT SETTING\n"); |
| op->wr(MCDI_MC_CRTL, op->rd(MCDI_MC_CRTL) & 0xfffffffc); //close mc |
| set_mcdi_mif(di_inf_default, hsize, vsize, op); |
| } |
| |
| static void set_mcdi_pre(struct DI_MIF1_S *di_mcinford_mif, |
| struct DI_MIF1_S *di_mcvecwr_mif, |
| struct DI_MIF1_S *di_mcinfowr_mif, |
| const struct reg_acc *op) |
| { |
| op->wr(MCINFRD_CTRL1, di_mcinford_mif->canvas_num << 16 | //canvas index |
| 2 << 8 | //burst len = 2 |
| 0 << 6 | //little endian |
| 2 << 0);//pack mode |
| op->wr(MCINFWR_CTRL, (op->rd(MCINFWR_CTRL) & 0xffffff00) | |
| di_mcinfowr_mif->canvas_num | // canvas index. |
| (1 << 12)); // req enable |
| op->wr(MCVECWR_CTRL, (op->rd(MCVECWR_CTRL) & 0xffffff00) | |
| di_mcvecwr_mif->canvas_num | // canvas index. |
| (1 << 12)); // req enable |
| |
| op->bwr(DI_PRE_CTRL, 3, 16, 2);// me enable; auto enable |
| } |
| |
| static void set_mcdi_post(struct DI_MIF1_S *di_mcvecrd_mif, |
| const struct reg_acc *op) |
| { |
| op->wr(MCVECRD_CTRL1, di_mcvecrd_mif->canvas_num << 16 | //canvas index |
| 2 << 8 | //burst len = 2 |
| 0 << 6 | //little endian |
| 2 << 0);//pack mode |
| } |
| |
| static void set_cont_mif(struct DI_MIF1_S *di_contprd_mif, |
| struct DI_MIF1_S *di_contp2rd_mif, |
| struct DI_MIF1_S *di_contwr_mif, |
| const struct reg_acc *op) |
| { |
| int contwr_hsize = di_contwr_mif->end_x - di_contwr_mif->start_x + 1; |
| int contwr_vsize = di_contwr_mif->end_y - di_contwr_mif->start_y + 1; |
| |
| //stimulus_print("enter cont bus config\n"); |
| op->wr(CONTWR_X, (2 << 30) | (di_contwr_mif->start_x << 16) | |
| (di_contwr_mif->end_x)); // start_x 0 end_x 719. |
| op->wr(CONTWR_Y, (di_contwr_mif->start_y << 16) | |
| (di_contwr_mif->end_y)); // start_y 0 end_y 239. |
| op->wr(CONTWR_CAN_SIZE, ((contwr_hsize - 1) << 16) | |
| (contwr_vsize - 1)); |
| op->wr(CONTWR_CTRL, di_contwr_mif->canvas_num | // canvas index. |
| (1 << 12)); // req_en. |
| |
| op->wr(CONTRD_SCOPE_X, (di_contprd_mif->start_x) | |
| (di_contprd_mif->end_x << 16)); // start_x 0 end_x 719. |
| op->wr(CONTRD_SCOPE_Y, (di_contprd_mif->start_y) | |
| (di_contprd_mif->end_y << 16)); // start_y 0 end_y 239. |
| op->wr(CONT2RD_SCOPE_X, (di_contp2rd_mif->start_x) | |
| (di_contp2rd_mif->end_x << 16)); // start_x 0 end_x 719. |
| op->wr(CONT2RD_SCOPE_Y, (di_contp2rd_mif->start_y) | |
| (di_contp2rd_mif->end_y << 16)); // start_y 0 end_y 239. |
| op->wr(CONTRD_CTRL1, di_contprd_mif->canvas_num << 16 | |
| //canvas index |
| 2 << 8 | //burst len = 2 |
| 0 << 6 | //little endian |
| 0 << 0);//pack mode |
| op->wr(CONT2RD_CTRL1, di_contp2rd_mif->canvas_num << 16 | |
| //canvas index |
| 2 << 8 | //burst len = 2 |
| 0 << 6 | //little endian |
| 0 << 0);//pack mode |
| } |
| |
| static unsigned int di_mif_add_get_offset_v3(enum DI_MIF0_ID mif_index) |
| { |
| unsigned int addr = 0; |
| unsigned int index = 0; |
| |
| switch (mif_index) { |
| case DI_MIF0_ID_INP: |
| index = 0; |
| break; |
| case DI_MIF0_ID_CHAN2: |
| index = 1; |
| break; |
| case DI_MIF0_ID_MEM: |
| index = 2; |
| break; |
| case DI_MIF0_ID_IF1: |
| index = 3; |
| break; |
| case DI_MIF0_ID_IF0: |
| index = 4; |
| break; |
| case DI_MIF0_ID_IF2: |
| index = 5; |
| break; |
| default: |
| addr = DIM_ERR; |
| break; |
| }; |
| |
| if (addr == DIM_ERR) |
| return addr; |
| |
| //addr = (index<<2)*0x80; |
| addr = index * 0x80; |
| |
| return addr; |
| } |
| |
| static const unsigned int mif_contr_reg_v3[MIF_REG_NUB] = { |
| RDMIFXN_GEN_REG, |
| RDMIFXN_GEN_REG2, |
| RDMIFXN_GEN_REG3, |
| RDMIFXN_CANVAS0, |
| RDMIFXN_LUMA_X0, |
| RDMIFXN_LUMA_Y0, |
| RDMIFXN_CHROMA_X0, |
| RDMIFXN_CHROMA_Y0, |
| RDMIFXN_RPT_LOOP, |
| RDMIFXN_LUMA0_RPT_PAT, |
| RDMIFXN_CHROMA0_RPT_PAT, |
| RDMIFXN_DUMMY_PIXEL, |
| RDMIFXN_CFMT_CTRL, |
| RDMIFXN_CFMT_W, |
| RDMIFXN_LUMA_FIFO_SIZE, |
| }; |
| |
| static const unsigned int *mif_reg_get_v3(void) |
| { |
| return &mif_contr_reg_v3[0]; |
| } |
| |
| static const unsigned int mif_contr_reg[MIF_NUB][MIF_REG_NUB] = { |
| [DI_MIF0_ID_INP] = { |
| DI_SC2_INP_GEN_REG, |
| DI_SC2_INP_GEN_REG2, |
| DI_SC2_INP_GEN_REG3, |
| DI_SC2_INP_CANVAS0, |
| DI_SC2_INP_LUMA_X0, |
| DI_SC2_INP_LUMA_Y0, |
| DI_SC2_INP_CHROMA_X0, |
| DI_SC2_INP_CHROMA_Y0, |
| DI_SC2_INP_RPT_LOOP, |
| DI_SC2_INP_LUMA0_RPT_PAT, |
| DI_SC2_INP_CHROMA0_RPT_PAT, |
| DI_SC2_INP_DUMMY_PIXEL, |
| DI_SC2_INP_CFMT_CTRL, |
| DI_SC2_INP_CFMT_W, |
| DI_SC2_INP_LUMA_FIFO_SIZE}, |
| [DI_MIF0_ID_MEM] = { |
| DI_SC2_MEM_GEN_REG, |
| DI_SC2_MEM_GEN_REG2, |
| DI_SC2_MEM_GEN_REG3, |
| DI_SC2_MEM_CANVAS0, |
| DI_SC2_MEM_LUMA_X0, |
| DI_SC2_MEM_LUMA_Y0, |
| DI_SC2_MEM_CHROMA_X0, |
| DI_SC2_MEM_CHROMA_Y0, |
| DI_SC2_MEM_RPT_LOOP, |
| DI_SC2_MEM_LUMA0_RPT_PAT, |
| DI_SC2_MEM_CHROMA0_RPT_PAT, |
| DI_SC2_MEM_DUMMY_PIXEL, |
| DI_SC2_MEM_CFMT_CTRL, |
| DI_SC2_MEM_CFMT_W, |
| DI_SC2_MEM_LUMA_FIFO_SIZE |
| }, |
| [DI_MIF0_ID_CHAN2] = { |
| DI_SC2_CHAN2_GEN_REG, |
| DI_SC2_CHAN2_GEN_REG2, |
| DI_SC2_CHAN2_GEN_REG3, |
| DI_SC2_CHAN2_CANVAS0, |
| DI_SC2_CHAN2_LUMA_X0, |
| DI_SC2_CHAN2_LUMA_Y0, |
| DI_SC2_CHAN2_CHROMA_X0, |
| DI_SC2_CHAN2_CHROMA_Y0, |
| DI_SC2_CHAN2_RPT_LOOP, |
| DI_SC2_CHAN2_LUMA0_RPT_PAT, |
| DI_SC2_CHAN2_CHROMA0_RPT_PAT, |
| DI_SC2_CHAN2_DUMMY_PIXEL, |
| DI_SC2_CHAN2_CFMT_CTRL, |
| DI_SC2_CHAN2_CFMT_W, |
| DI_SC2_CHAN2_LUMA_FIFO_SIZE |
| }, |
| [DI_MIF0_ID_IF0] = { |
| DI_SC2_IF0_GEN_REG, |
| DI_SC2_IF0_GEN_REG2, |
| DI_SC2_IF0_GEN_REG3, |
| DI_SC2_IF0_CANVAS0, |
| DI_SC2_IF0_LUMA_X0, |
| DI_SC2_IF0_LUMA_Y0, |
| DI_SC2_IF0_CHROMA_X0, |
| DI_SC2_IF0_CHROMA_Y0, |
| DI_SC2_IF0_RPT_LOOP, |
| DI_SC2_IF0_LUMA0_RPT_PAT, |
| DI_SC2_IF0_CHROMA0_RPT_PAT, |
| DI_SC2_IF0_DUMMY_PIXEL, |
| DI_SC2_IF0_CFMT_CTRL, |
| DI_SC2_IF0_CFMT_W, |
| DI_SC2_IF0_LUMA_FIFO_SIZE, |
| }, |
| [DI_MIF0_ID_IF1] = { |
| DI_SC2_IF1_GEN_REG, |
| DI_SC2_IF1_GEN_REG2, |
| DI_SC2_IF1_GEN_REG3, |
| DI_SC2_IF1_CANVAS0, |
| DI_SC2_IF1_LUMA_X0, |
| DI_SC2_IF1_LUMA_Y0, |
| DI_SC2_IF1_CHROMA_X0, |
| DI_SC2_IF1_CHROMA_Y0, |
| DI_SC2_IF1_RPT_LOOP, |
| DI_SC2_IF1_LUMA0_RPT_PAT, |
| DI_SC2_IF1_CHROMA0_RPT_PAT, |
| DI_SC2_IF1_DUMMY_PIXEL, |
| DI_SC2_IF1_CFMT_CTRL, |
| DI_SC2_IF1_CFMT_W, |
| DI_SC2_IF1_LUMA_FIFO_SIZE |
| }, |
| [DI_MIF0_ID_IF2] = { |
| DI_SC2_IF2_GEN_REG, |
| DI_SC2_IF2_GEN_REG2, |
| DI_SC2_IF2_GEN_REG3, |
| DI_SC2_IF2_CANVAS0, |
| DI_SC2_IF2_LUMA_X0, |
| DI_SC2_IF2_LUMA_Y0, |
| DI_SC2_IF2_CHROMA_X0, |
| DI_SC2_IF2_CHROMA_Y0, |
| DI_SC2_IF2_RPT_LOOP, |
| DI_SC2_IF2_LUMA0_RPT_PAT, |
| DI_SC2_IF2_CHROMA0_RPT_PAT, |
| DI_SC2_IF2_DUMMY_PIXEL, |
| DI_SC2_IF2_CFMT_CTRL, |
| DI_SC2_IF2_CFMT_W, |
| DI_SC2_IF2_LUMA_FIFO_SIZE |
| }, |
| }; |
| |
| const unsigned int *mif_reg_getb_v3(enum DI_MIF0_ID mif_index) |
| { |
| if (mif_index > DI_MIF0_ID_IF2) |
| return NULL; |
| |
| return &mif_contr_reg[mif_index][0]; |
| } |
| |
| static void set_di_mif_v1(struct DI_MIF_S *mif, |
| enum DI_MIF0_ID mif_index, const struct reg_acc *op) |
| { |
| u32 bytes_per_pixel = 0; |
| //0 = 1 byte per pixel, 1 = 2 bytes per pixel, 2 = 3 bytes per pixel |
| u32 demux_mode = 0; |
| u32 chro_rpt_lastl_ctrl = 0; |
| u32 luma0_rpt_loop_start = 0; |
| u32 luma0_rpt_loop_end = 0; |
| u32 luma0_rpt_loop_pat = 0; |
| u32 chroma0_rpt_loop_start = 0; |
| u32 chroma0_rpt_loop_end = 0; |
| u32 chroma0_rpt_loop_pat = 0; |
| int hfmt_en = 0; |
| int hz_yc_ratio = 0; |
| int hz_ini_phase = 0; |
| int vfmt_en = 0; |
| int vt_yc_ratio = 0; |
| int vt_ini_phase = 0; |
| int y_length = 0; |
| int c_length = 0; |
| int hz_rpt = 0; |
| int vt_phase_step = 0;// = (16 >> vt_yc_ratio); |
| int urgent = mif->urgent; |
| int hold_line = mif->hold_line; |
| unsigned int off; |
| |
| off = di_mif_add_get_offset_v3(mif_index); |
| if (off == DIM_ERR) { |
| PR_ERR("%s:\n", __func__); |
| return; |
| } |
| |
| if (mif->set_separate_en != 0 && mif->src_field_mode == 1) { |
| if (mif->video_mode == 0) |
| chro_rpt_lastl_ctrl = 1; |
| else |
| chro_rpt_lastl_ctrl = 0; |
| |
| luma0_rpt_loop_start = 1; |
| luma0_rpt_loop_end = 1; |
| chroma0_rpt_loop_start = 1; |
| chroma0_rpt_loop_end = 1; |
| luma0_rpt_loop_pat = 0x80; |
| chroma0_rpt_loop_pat = 0x80; |
| } else if (mif->set_separate_en != 0 && mif->src_field_mode == 0) { |
| if (mif->video_mode == 0) |
| chro_rpt_lastl_ctrl = 1; |
| else |
| chro_rpt_lastl_ctrl = 0; |
| |
| luma0_rpt_loop_start = 0; |
| luma0_rpt_loop_end = 0; |
| chroma0_rpt_loop_start = 0; |
| chroma0_rpt_loop_end = 0; |
| luma0_rpt_loop_pat = 0x0; |
| chroma0_rpt_loop_pat = 0x0; |
| } else if (mif->set_separate_en == 0 && mif->src_field_mode == 1) { |
| chro_rpt_lastl_ctrl = 0; |
| luma0_rpt_loop_start = 1; |
| luma0_rpt_loop_end = 1; |
| chroma0_rpt_loop_start = 0; |
| chroma0_rpt_loop_end = 0; |
| luma0_rpt_loop_pat = 0x80; |
| chroma0_rpt_loop_pat = 0x00; |
| op->wr(off + RDMIFXN_LUMA_FIFO_SIZE, 0xc0); |
| } else { |
| chro_rpt_lastl_ctrl = 0; |
| luma0_rpt_loop_start = 0; |
| luma0_rpt_loop_end = 0; |
| chroma0_rpt_loop_start = 0; |
| chroma0_rpt_loop_end = 0; |
| luma0_rpt_loop_pat = 0x00; |
| chroma0_rpt_loop_pat = 0x00; |
| op->wr(off + RDMIFXN_LUMA_FIFO_SIZE, 0xc0); |
| } |
| |
| if (DIM_IS_ICS(T5W)) { |
| //axi bus fifo from feijun.fan for t5w |
| op->wr(DI_SC2_IF0_LUMA_FIFO_SIZE, 0x80); |
| op->wr(DI_SC2_IF2_LUMA_FIFO_SIZE, 0x80); |
| } |
| |
| bytes_per_pixel = (mif->set_separate_en) ? |
| 0 : ((mif->video_mode == 2) ? 2 : 1); |
| |
| bytes_per_pixel = mif->bit_mode == 3 ? |
| 1 : bytes_per_pixel;// 10bit full pack or not |
| |
| demux_mode = (mif->set_separate_en == 0) ? |
| ((mif->video_mode == 1) ? 0 : 1) : 0; |
| |
| // ---------------------- |
| // General register |
| // ---------------------- |
| op->wr(off + RDMIFXN_GEN_REG3, |
| mif->bit_mode << 8 | // bits_mode |
| 3 << 4 | // block length |
| 2 << 1 | // use bst4 |
| 1 << 0); //64 bit swap |
| |
| op->wr(off + RDMIFXN_GEN_REG, |
| (urgent << 28) | // chroma urgent bit |
| (urgent << 27) | // luma urgent bit. |
| (1 << 25) | // no dummy data. |
| (hold_line << 19) | // hold lines |
| (1 << 18) | // push dummy pixel |
| (demux_mode << 16) | // demux_mode |
| (bytes_per_pixel << 14) | |
| (mif->burst_size_cr << 12) | |
| (mif->burst_size_cb << 10) | |
| (mif->burst_size_y << 8) | |
| (chro_rpt_lastl_ctrl << 6) | |
| ((mif->set_separate_en != 0) << 1) | |
| (1 << 0) // cntl_enable |
| ); |
| |
| if (mif->set_separate_en == 2) { |
| // Enable NV12 Display |
| op->wr(off + RDMIFXN_GEN_REG2, 1); |
| } |
| |
| // reverse X and Y |
| op->bwr(off + RDMIFXN_GEN_REG2, ((mif->rev_y << 1) | |
| (mif->rev_x)), 2, 2); |
| |
| // ---------------------- |
| // Canvas |
| // ---------------------- |
| if (mif->linear) |
| di_mif0_linear_rd_cfg(mif, mif_index, op); |
| else |
| op->wr(off + RDMIFXN_CANVAS0, (mif->canvas0_addr2 << 16) | |
| // cntl_canvas0_addr2 |
| (mif->canvas0_addr1 << 8) | // cntl_canvas0_addr1 |
| (mif->canvas0_addr0 << 0) // cntl_canvas0_addr0 |
| ); |
| |
| // ---------------------- |
| // Picture 0 X/Y start,end |
| // ---------------------- |
| op->wr(off + RDMIFXN_LUMA_X0, (mif->luma_x_end0 << 16) | |
| // cntl_luma_x_end0 |
| (mif->luma_x_start0 << 0) // cntl_luma_x_start0 |
| ); |
| op->wr(off + RDMIFXN_LUMA_Y0, (mif->luma_y_end0 << 16) | |
| // cntl_luma_y_end0 |
| (mif->luma_y_start0 << 0) // cntl_luma_y_start0 |
| ); |
| op->wr(off + RDMIFXN_CHROMA_X0, (mif->chroma_x_end0 << 16) | |
| (mif->chroma_x_start0 << 0) |
| ); |
| op->wr(off + RDMIFXN_CHROMA_Y0, (mif->chroma_y_end0 << 16) | |
| (mif->chroma_y_start0 << 0) |
| ); |
| |
| // ---------------------- |
| // Repeat or skip |
| // ---------------------- |
| op->wr(off + RDMIFXN_RPT_LOOP, (0 << 28) | |
| (0 << 24) | |
| (0 << 20) | |
| (0 << 16) | |
| (chroma0_rpt_loop_start << 12) | |
| (chroma0_rpt_loop_end << 8) | |
| (luma0_rpt_loop_start << 4) | |
| (luma0_rpt_loop_end << 0)); |
| |
| op->wr(off + RDMIFXN_LUMA0_RPT_PAT, luma0_rpt_loop_pat); |
| op->wr(off + RDMIFXN_CHROMA0_RPT_PAT, chroma0_rpt_loop_pat); |
| |
| // Dummy pixel value |
| op->wr(off + RDMIFXN_DUMMY_PIXEL, 0x00808000); |
| if (mif->video_mode == 0) {// 4:2:0 block mode. |
| hfmt_en = 1; |
| hz_yc_ratio = 1; |
| hz_ini_phase = 0; |
| vfmt_en = 1; |
| vt_yc_ratio = 1; |
| vt_ini_phase = 0; |
| y_length = mif->luma_x_end0 - mif->luma_x_start0 + 1; |
| c_length = mif->chroma_x_end0 - mif->chroma_x_start0 + 1; |
| hz_rpt = 0; |
| } else if (mif->video_mode == 1) { |
| hfmt_en = 1; |
| hz_yc_ratio = 1; |
| hz_ini_phase = 0; |
| vfmt_en = 0; |
| vt_yc_ratio = 0; |
| vt_ini_phase = 0; |
| y_length = mif->luma_x_end0 - mif->luma_x_start0 + 1; |
| c_length = ((mif->luma_x_end0 >> 1) - |
| (mif->luma_x_start0 >> 1) + 1); |
| hz_rpt = 0; |
| } else if (mif->video_mode == 2) { |
| hfmt_en = 0; |
| hz_yc_ratio = 1; |
| hz_ini_phase = 0; |
| vfmt_en = 0; |
| vt_yc_ratio = 0; |
| vt_ini_phase = 0; |
| y_length = mif->luma_x_end0 - mif->luma_x_start0 + 1; |
| c_length = mif->luma_x_end0 - mif->luma_x_start0 + 1; |
| hz_rpt = 0; |
| } |
| vt_phase_step = (16 >> vt_yc_ratio); |
| op->wr(off + RDMIFXN_CFMT_CTRL, |
| (hz_rpt << 28) | //hz rpt pixel |
| (hz_ini_phase << 24) | //hz ini phase |
| (0 << 23) | //repeat p0 enable |
| (hz_yc_ratio << 21) | //hz yc ratio |
| (hfmt_en << 20) | //hz enable |
| (1 << 17) | //nrpt_phase0 enable |
| (0 << 16) | //repeat l0 enable |
| (0 << 12) | //skip line num |
| (vt_ini_phase << 8) | //vt ini phase |
| (vt_phase_step << 1) | //vt phase step (3.4) |
| (vfmt_en << 0) //vt enable |
| ); |
| |
| op->wr(off + RDMIFXN_CFMT_W, (y_length << 16) | |
| //hz format width |
| (c_length << 0) //vt format width |
| ); |
| } |
| |
| static const unsigned int reg_wrmif_v3 |
| [DIM_WRMIF_MIF_V3_NUB][DIM_WRMIF_SET_V3_NUB] = { |
| [EDI_MIFSM_NR] = { |
| DI_SC2_NRWR_X, |
| DI_SC2_NRWR_Y, |
| DI_SC2_NRWR_CTRL, |
| DI_NRWR_URGENT, |
| DI_NRWR_CANVAS, |
| NRWR_DBG_AXI_CMD_CNT, |
| NRWR_DBG_AXI_DAT_CNT, |
| }, |
| [EDI_MIFSM_WR] = { |
| DI_SC2_DIWR_X, |
| DI_SC2_DIWR_Y, |
| DI_SC2_DIWR_CTRL, |
| DI_DIWR_URGENT, |
| DI_DIWR_CANVAS, |
| DIWR_DBG_AXI_CMD_CNT, |
| DIWR_DBG_AXI_DAT_CNT, |
| }, |
| }; |
| |
| /* keep order with ENR_MIF_INDEX*/ |
| static const struct regs_t reg_bits_wr[] = { |
| {WRMIF_X, 16, 16, ENR_MIF_INDEX_X_ST, "x_start"}, |
| {WRMIF_X, 0, 16, ENR_MIF_INDEX_X_END, "x_end"}, |
| {WRMIF_Y, 16, 16, ENR_MIF_INDEX_Y_ST, "y_start"}, |
| {WRMIF_Y, 0, 16, ENR_MIF_INDEX_Y_END, "y_end"}, |
| {WRMIF_CANVAS, 0, 32, ENR_MIF_INDEX_CVS, "canvas"}, |
| {WRMIF_CTRL, 0, 1, ENR_MIF_INDEX_EN, "mif_en"}, |
| {WRMIF_CTRL, 1, 1, ENR_MIF_INDEX_BIT_MODE, "10bit mode"}, |
| {WRMIF_CTRL, 2, 1, ENR_MIF_INDEX_ENDIAN, "endian"}, |
| {WRMIF_CTRL, 16, 1, ENR_MIF_INDEX_URGENT, "urgent"}, |
| {WRMIF_CTRL, 17, 1, ENR_MIF_INDEX_CBCR_SW, "cbcr_sw"}, |
| {WRMIF_CTRL, 18, 2, ENR_MIF_INDEX_VCON, "vcon"}, |
| {WRMIF_CTRL, 20, 2, ENR_MIF_INDEX_HCON, "hcon"}, |
| {WRMIF_CTRL, 22, 3, ENR_MIF_INDEX_RGB_MODE, "rgb_mode"}, |
| /*below for sc2*/ |
| {WRMIF_DBG_AXI_CMD_CNT, 22, 3, |
| ENR_MIF_INDEX_DBG_CMD_CNT, "dbg_cmd_cnt"}, |
| {WRMIF_DBG_AXI_DAT_CNT, 22, 3, |
| ENR_MIF_INDEX_DBG_DAT_CNT, "dbg_dat_cnt"}, |
| {TABLE_FLG_END, TABLE_FLG_END, 0xff, 0xff, "end"} |
| }; |
| |
| static const struct reg_t rtab_sc2_contr_bits_tab[] = { |
| /*--------------------------*/ |
| {DI_TOP_PRE_CTRL, 0, 2, 0, "DI_TOP_PRE_CTRL", |
| "nrwr_path_sel", |
| "bit 0: mif; 1: afbce"}, |
| {DI_TOP_PRE_CTRL, 30, 2, 0, "", |
| "pre_frm_sel", |
| "0:internal 1:pre-post link 2:viu 3:vcp(vdin)"}, |
| {DI_TOP_PRE_CTRL, 2, 2, 0, "", |
| "afbce_path_se", |
| ""}, |
| {DI_TOP_PRE_CTRL, 4, 1, 0, "", |
| "afbc_vd_sel:inp", |
| "0:mif; 1:afbc dec"}, |
| {DI_TOP_PRE_CTRL, 5, 1, 0, "", |
| "afbc_vd_sel:chan2", |
| "0:mif; 1:afbc dec"}, |
| {DI_TOP_PRE_CTRL, 6, 1, 0, "", |
| "afbc_vd_sel:mem", |
| "0:mif; 1:afbc dec"}, |
| {DI_TOP_PRE_CTRL, 7, 1, 0, "", |
| "di inp afbc dec 4K size", |
| ""}, |
| {DI_TOP_PRE_CTRL, 8, 1, 0, "", |
| "di chan2 afbc dec 4K size", |
| ""}, |
| {DI_TOP_PRE_CTRL, 9, 1, 0, "", |
| "di mem afbc dec 4K size", |
| ""}, |
| {DI_TOP_PRE_CTRL, 10, 1, 0, "", |
| "nr_ch0_en", |
| "1:normal?"}, |
| {DI_TOP_PRE_CTRL, 12, 3, 0, "", |
| "pre_bypass_sel", |
| "1:inp; 2:chan2; 3mem; other:"}, |
| {DI_TOP_PRE_CTRL, 16, 3, 0, "", |
| "pre_bypass_mode", |
| "0:din0;1:din1;2:din2"}, |
| {DI_TOP_PRE_CTRL, 19, 1, 0, "", |
| "pre_bypass_en", |
| ""}, |
| {DI_TOP_PRE_CTRL, 20, 2, 0, "", |
| "fix_disable_pre", |
| "0"}, |
| /***********************************************/ |
| {DI_TOP_POST_CTRL, 0, 2, 0, "DI_TOP_POST_CTRL", |
| "diwr_path_sel", |
| "0: none; 1: normal;2: afbce"}, |
| {DI_TOP_POST_CTRL, 30, 2, 0, "", |
| "post_frm_sel", |
| "0:viu 1:internal 2:pre-post link (post timming)"}, |
| {DI_TOP_POST_CTRL, 4, 3, 0, "", |
| "afbc_vd_sel", |
| "0:normal; 7:afb_en"}, |
| {DI_TOP_POST_CTRL, 12, 8, 0, "", |
| "post_bypass_ctrl", |
| "0"}, |
| {DI_TOP_POST_CTRL, 20, 2, 0, "", |
| "fix_disable_post", |
| "0"}, |
| /***********************************************/ |
| {DI_PRE_CTRL, 11, 2, 0, "DI_PRE_CTRL", |
| "tfbf_en", |
| "1: only tfbf; 2: normal;3: normal + tfbf"}, |
| {DI_PRE_CTRL, 10, 1, 0, "", |
| "nr_wr_by", |
| "?"}, |
| {DI_PRE_CTRL, 7, 1, 0, "", |
| "nr_wr_by", |
| "?"}, |
| {DI_PRE_CTRL, 29, 1, 0, "", |
| "pre_field_num", |
| ""}, |
| {DI_PRE_CTRL, 26, 2, 0, "", |
| "mode_444c422", |
| ""}, |
| {DI_PRE_CTRL, 25, 1, 0, "", |
| "di_cont_read_en", |
| ""}, |
| {DI_PRE_CTRL, 23, 2, 0, "", |
| "mode_422c444", |
| ""}, |
| {DI_PRE_CTRL, 21, 1, 0, "", |
| "pre field num for nr", |
| ""}, |
| {DI_PRE_CTRL, 20, 1, 0, "", |
| "pre field num for pulldown", |
| ""}, |
| {DI_PRE_CTRL, 19, 1, 0, "", |
| "pre field num for mcdi", |
| ""}, |
| {DI_PRE_CTRL, 17, 1, 0, "", |
| "reg_me_autoen", |
| ""}, |
| {DI_PRE_CTRL, 16, 1, 0, "", |
| "reg_me_en", |
| ""}, |
| {DI_PRE_CTRL, 9, 1, 0, "", |
| "di_buf2_en,chan2", |
| ""}, |
| {DI_PRE_CTRL, 8, 1, 0, "", |
| "di_buf3_en,mem", |
| ""}, |
| {DI_PRE_CTRL, 5, 1, 0, "", |
| "hist_check_en", |
| ""}, |
| {DI_PRE_CTRL, 4, 1, 0, "", |
| "check_after_nr", |
| ""}, |
| {DI_PRE_CTRL, 3, 1, 0, "", |
| "check222p_en", |
| ""}, |
| {DI_PRE_CTRL, 2, 1, 0, "", |
| "check322p_en", |
| ""}, |
| {DI_PRE_CTRL, 1, 1, 0, "", |
| "mtn_en", |
| ""}, |
| {DI_PRE_CTRL, 0, 1, 0, "", |
| "nr_en", |
| ""}, |
| /***********************************************/ |
| {DI_POST_CTRL, 0, 1, 0, "DI_POST_CTRL", |
| "post_en", |
| ""}, |
| {DI_POST_CTRL, 1, 1, 0, "", |
| "blend_en", |
| ""}, |
| {DI_POST_CTRL, 2, 1, 0, "", |
| "ei_en", |
| ""}, |
| {DI_POST_CTRL, 3, 1, 0, "", |
| "mux_en", |
| ""}, |
| {DI_POST_CTRL, 4, 1, 0, "", |
| "ddr_en", |
| "wr_bk_en"}, |
| {DI_POST_CTRL, 5, 1, 0, "", |
| "vpp_out_en", |
| ""}, |
| {DI_POST_CTRL, 6, 1, 0, "", |
| "post mb en", |
| "0"}, |
| /***********************************************/ |
| {DI_TOP_CTRL, 0, 1, 0, "DI_TOP_CTRL", |
| "Vpp path sel", |
| "0:post to vpp; 1: pre to vpp"}, |
| {DI_TOP_CTRL, 4, 3, 0, "", |
| "inp", |
| ""}, |
| {DI_TOP_CTRL, 7, 3, 0, "", |
| "chan2", |
| ""}, |
| {DI_TOP_CTRL, 10, 3, 0, "", |
| "mem", |
| ""}, |
| {DI_TOP_CTRL, 13, 3, 0, "", |
| "if1", |
| ""}, |
| {DI_TOP_CTRL, 16, 3, 0, "", |
| "if0", |
| ""}, |
| {DI_TOP_CTRL, 19, 3, 0, "", |
| "if2", |
| ""}, |
| {TABLE_FLG_END, 0, 0, 0, "end", "end", ""}, |
| |
| }; |
| |
| static void set_wrmif_simple |
| (int index, |
| int enable, |
| struct DI_MIF_S *wr_mif, const struct reg_acc *opin) |
| { |
| const unsigned int *reg; |
| const struct reg_acc *op; |
| |
| if (!opin) |
| op = &di_pre_regset; |
| else |
| op = opin; |
| |
| //////////////////////////// |
| //////Afbce addreess mux |
| //////////////////////////// |
| if (index > (DIM_WRMIF_MIF_V3_NUB - 1)) { |
| stimulus_print("ERROR:WR_MIF WRONG!!!\n"); |
| return; |
| } |
| |
| reg = ®_wrmif_v3[index][0]; |
| |
| ////////////////////////////// |
| //////Afbce Write registers |
| ///////////////////////////// |
| |
| // set wr mif interface. |
| //Wr(WRMIF_X , |
| //Rd(WRMIF_X) | (wr_mif->luma_x_start0 <<16) | (wr_mif->luma_x_end0)); |
| // start_x 0 end_x 719. |
| //Wr(WRMIF_Y , |
| //Rd(WRMIF_Y) | (wr_mif->luma_y_start0 <<16) | (wr_mif->luma_y_end0)); |
| // start_y 0 end_y 239. |
| op->wr(reg[WRMIF_X], |
| (wr_mif->luma_x_start0 << 16) | (wr_mif->luma_x_end0)); |
| // start_x 0 end_x 719. |
| op->wr(reg[WRMIF_Y], |
| (wr_mif->luma_y_start0 << 16) | (wr_mif->luma_y_end0)); |
| // start_y 0 end_y 239. |
| //printf("wr_mif_scope = %d %d %d %d", |
| //wr_mif->luma_x_start0,wr_mif->luma_x_end0, |
| //wr_mif->luma_y_start0,wr_mif->luma_y_end0); |
| |
| op->wr(reg[WRMIF_CANVAS], wr_mif->canvas0_addr0); |
| op->wr(reg[WRMIF_CTRL], (enable << 0) | // write mif en. |
| (0 << 1) | // bit10 mode |
| (0 << 2) | // little endian |
| (0 << 3) | // data ext enable |
| (5 << 4) | // word limit |
| (0 << 16) | // urgent |
| (0 << 17) | // swap cbcrworking in rgb mode =2: swap cbcr |
| (0 << 18) | // vconv working in rgb mode =2: |
| (0 << 20) | // hconv. output even pixel |
| (1 << 22) | // rgb mode =0, 422 YCBCR to one canvas. |
| (0 << 24) | // no gate clock |
| (0 << 25) | // canvas_sync enable |
| (2 << 26) | // burst lim |
| (1 << 30)); // 64-bits swap enable |
| } |
| |
| static void set_wrmif_simple_v3(struct DI_SIM_MIF_s *mif, |
| const struct reg_acc *ops, |
| enum EDI_MIFSM mifsel) |
| { |
| const unsigned int *reg; |
| unsigned int bits_mode, rgb_mode; |
| const struct reg_acc *op; |
| |
| //////////////////////////// |
| //////Afbce addreess mux |
| //////////////////////////// |
| if (mifsel > (DIM_WRMIF_MIF_V3_NUB - 1)) { |
| PR_ERR("%s:%d\n", __func__, mifsel); |
| return; |
| } |
| if (!ops) |
| op = &di_pre_regset; |
| else |
| op = ops; |
| |
| if (is_mask(SC2_REG_MSK_nr)) |
| op = &sc2reg; |
| |
| mif->en = 1; //ary add temp; |
| bits_mode = mif->bit_mode != 0; |
| //1: 10bits 422(old mode) 0:8bits 2:10bit 444 3:10bit full-pack |
| // rgb_mode 0: 422 to one canvas |
| //1: 444 to one canvas |
| //2: 8bit Y to one canvas, 16bit UV to another canvas |
| //3: 422 full pack mode (10bit) |
| #ifdef MARK_SC2 |
| rgb_mode = mif->bits_mode == 3 ? 3 : //422 10bit |
| (mif->set_separate_en == 0 ? (mif->video_mode == 1 ? 0 : 1) : |
| ((mif->video_mode == 1) ? 2 : 3)); //two canvas |
| #endif |
| if (mif->bit_mode == 3) { |
| rgb_mode = 3; |
| } else { |
| if (mif->set_separate_en == 0) { |
| if (mif->video_mode == 1) |
| rgb_mode = 0; |
| else |
| rgb_mode = 1; |
| } else { |
| if (mif->video_mode == 1) |
| rgb_mode = 3;//2; |
| else |
| rgb_mode = 2; |
| } |
| } |
| reg = ®_wrmif_v3[mifsel][0]; |
| |
| ////////////////////////////// |
| //////Afbce Write registers |
| ///////////////////////////// |
| |
| // set wr mif interface. |
| //Wr(WRMIF_X, Rd(WRMIF_X) | (wr_mif->luma_x_start0 <<16) | |
| //(wr_mif->luma_x_end0)); // start_x 0 end_x 719. |
| //Wr(WRMIF_Y, Rd(WRMIF_Y) | (wr_mif->luma_y_start0 <<16) | |
| //(wr_mif->luma_y_end0)); // start_y 0 end_y 239. |
| |
| op->wr(reg[WRMIF_X], (mif->start_x << 16) | (mif->end_x)); |
| // start_x 0 end_x 719. |
| op->wr(reg[WRMIF_Y], (mif->start_y << 16) | (mif->end_y)); |
| // start_y 0 end_y 239. |
| //printf("wr_mif_scope = %d %d %d %d",wr_mif->luma_x_start0, |
| //wr_mif->luma_x_end0,wr_mif->luma_y_start0, |
| //wr_mif->luma_y_end0); |
| if (mif->linear) |
| di_mif0_linear_wr_cfg2(mif, mifsel); |
| else |
| op->wr(reg[WRMIF_CANVAS], mif->canvas_num); |
| if (mif->set_separate_en == 2) { |
| op->wr(reg[WRMIF_CTRL], |
| (mif->en << 0) | // write mif en. |
| (bits_mode << 1) | // bit10 mode |
| (mif->l_endian << 2) | // little endian |
| (1 << 3) | // data ext enable |
| (3 << 4) | // word limit ? |
| (mif->urgent << 16) | |
| // urgent // ary default is 0 ? |
| (mif->cbcr_swap << 17) | |
| //swap cbcrworking in rgb mode =2: swap cbcr |
| //(0 << 18) | // vconv working in rgb mode =2: |
| //(0 << 20) | // hconv. output even pixel |
| /* vcon working in rgb mode =2: 3 : output all.*/ |
| (((mif->video_mode == 0) ? 0 : 3) << 18) | |
| /* hconv. output even pixel */ |
| (((mif->video_mode == 2) ? 3 : 0) << 20) | |
| (rgb_mode << 22) | |
| // rgb mode =0, 422 YCBCR to one canvas. |
| (0 << 24) | // no gate clock |
| (0 << 25) | // canvas_sync enable |
| (2 << 26) | // burst lim |
| (mif->reg_swap << 30)); // 64-bits swap enable |
| } else { |
| op->wr(reg[WRMIF_CTRL], |
| (mif->en << 0) | // write mif en. |
| (bits_mode << 1) | // bit10 mode |
| (mif->l_endian << 2) | // little endian |
| (0 << 3) | // data ext enable |
| (5 << 4) | // word limit ? |
| (mif->urgent << 16) | // urgent // ary default is 0 ? |
| (mif->cbcr_swap << 17) | |
| // swap cbcrworking in rgb mode =2: swap cbcr |
| (0 << 18) | // vconv working in rgb mode =2: |
| (0 << 20) | // hconv. output even pixel |
| (rgb_mode << 22) | |
| // rgb mode =0, 422 YCBCR to one canvas. |
| (0 << 24) | // no gate clock |
| (0 << 25) | // canvas_sync enable |
| (2 << 26) | // burst lim |
| (mif->reg_swap << 30)); // 64-bits swap enable |
| } |
| } |
| |
| bool dim_aisr_test(struct DI_SIM_MIF_s *mif, bool sel) |
| { |
| dbg_ic("%s:%d\n", __func__, sel); |
| dbg_ic("\t <%d,%d>\n", mif->end_x + 1, mif->end_y + 1); |
| dbg_ic("\t addr= 0x%lx\n", mif->addr); |
| return true; |
| } |
| |
| static unsigned int dim_hf_dbg; |
| module_param_named(dim_hf_dbg, dim_hf_dbg, uint, 0644); |
| |
| /* from t3 */ |
| /* ucode: aisr_pre_cfg */ |
| /* sel: pre: 0; post: 1*/ |
| /* .aisr_pre */ |
| bool dim_aisr_pre_cfg(struct DI_SIM_MIF_s *mif, bool sel, bool para) |
| { |
| unsigned int wrmif_stride; |
| const struct reg_acc *op = &di_pre_regset; |
| unsigned int dummy_en = 1, dummy_x = 0, dummy_y = 0; |
| unsigned int d_x, d_y, b_x, b_y; |
| |
| /*dummy*/ |
| d_x = mif->end_x - mif->start_x + 1; |
| d_y = mif->end_y - mif->start_y + 1; |
| |
| b_x = mif->buf_hsize; |
| b_y = (unsigned int)mif->addr2; |
| dim_print("hf:hw cfg:sel:%d\n", sel); |
| if (b_x == d_x && |
| b_y == d_y) { |
| dummy_en = 0; |
| } else { |
| dummy_x = b_x - d_x; |
| dummy_y = b_y - d_y; |
| } |
| if (dummy_x > 1920 || dummy_y > 1080) { |
| PR_ERR("%s:size err:%d,%d\n", __func__, dummy_x, dummy_y); |
| PR_INF("%d,%d,%d,%d\n", d_x, d_y, b_x, b_y); |
| return false; |
| } |
| |
| op->wr(NN_LRHF6, 128 << 24 | |
| dummy_x << 12 | |
| dummy_en << 11 | |
| dummy_y); |
| dbg_ic("nn6:0x%x = 0x%x\n", NN_LRHF6, op->rd(NN_LRHF6)); |
| dbg_ic("nn6:<%d,%d,%d>\n", dummy_en, dummy_x, dummy_y); |
| /*bit3:2 1: pre 2: post */ |
| if (!sel) |
| op->bwr(DI_TOP_CTRL, 1, 2, 2);//select nr dout to nn_lr_hf |
| else |
| op->bwr(DI_TOP_CTRL, 2, 2, 2);//select post |
| |
| /*use canvas_num for dbg mode: not update this register*/ |
| if (dim_hf_dbg >= 2) |
| dim_print("hw:dbg_not cfg\n"); |
| else |
| op->bwr(NN_LRHF0, 3, 30, 2); |
| |
| //05-06 from jintao: op->bwr(AISR_PRE_WRMIF_BADDR,0,6,1);//little endian |
| op->bwr(AISR_PRE_WRMIF_BADDR, 1, 6, 1);//little endian //05-06fromjintao |
| op->bwr(AISR_PRE_WRMIF_BADDR, 0, 7, 1);//swap 64 bit |
| |
| wrmif_stride = ((mif->buf_hsize * 8 + 511) >> 9) << 2; |
| op->bwr(AISR_PRE_WMIF_CTRL3, 1, 16, 1); |
| op->bwr(AISR_PRE_WMIF_CTRL3, wrmif_stride, 0, 13); |
| op->wr(AISR_PRE_WMIF_CTRL4, mif->addr >> 4); |
| #ifdef HIS_CODE |
| op->wr(AISR_PRE_WMIF_SCOPE_X, ((b_x - 1) << 16) | 0); |
| op->wr(AISR_PRE_WMIF_SCOPE_Y, ((b_y - 1) << 16) | 0); |
| #else |
| op->wr(AISR_PRE_WMIF_SCOPE_X, ((mif->end_x - mif->start_x) << 16) | 0); |
| op->wr(AISR_PRE_WMIF_SCOPE_Y, ((mif->end_y - mif->start_y) << 16) | 0); |
| #endif |
| op->bwr(AISR_PRE_WRMIF_BADDR, para, 5, 1);//is_di_hf_y_reverse |
| |
| return true; |
| } |
| |
| void dim_aisr_disable(void) |
| { |
| const struct reg_acc *op = &di_pre_regset; |
| |
| if (dim_hf_dbg) { |
| dim_hf_dbg = 2; |
| return; |
| } |
| dim_print("hf:hw disable\n"); |
| op->bwr(NN_LRHF0, 0, 30, 2); |
| op->bwr(DI_TOP_CTRL, 0, 2, 2); |
| } |
| |
| /* ref to config_di_wr_mif */ |
| //static |
| void wr_mif_cfg_v3(struct DI_SIM_MIF_s *wr_mif, |
| enum EDI_MIFSM index, |
| /*struct di_buf_s *di_buf,*/ |
| void *di_vf, |
| struct di_win_s *win) |
| { |
| struct di_buf_s *di_buf; |
| struct vframe_s *vf; |
| |
| if (index == EDI_MIFSM_NR) { |
| di_buf = (struct di_buf_s *)di_vf; |
| vf = di_buf->vframe; |
| if (!di_buf->flg_nv21) |
| wr_mif->canvas_num = di_buf->nr_canvas_idx; |
| |
| } else { |
| vf = (struct vframe_s *)di_vf; |
| di_buf = (struct di_buf_s *)vf->private_data; |
| if (!di_buf) { |
| PR_ERR("%s:no di_buf\n", __func__); |
| return; |
| } |
| } |
| |
| wr_mif->start_x = 0; |
| wr_mif->end_x = vf->width - 1; |
| wr_mif->start_y = 0; |
| //tmp for t7: |
| wr_mif->buf_crop_en = 1; |
| //wr_mif->buf_hsize = 1920; |
| wr_mif->buf_hsize = di_buf->buf_hsize; |
| |
| if (vf->bitdepth & BITDEPTH_Y10) { |
| if (vf->type & VIDTYPE_VIU_444) { |
| wr_mif->bit_mode = (vf->bitdepth & FULL_PACK_422_MODE) ? |
| 3 : 2; |
| } else { |
| wr_mif->bit_mode = (vf->bitdepth & FULL_PACK_422_MODE) ? |
| 3 : 1; |
| } |
| } else { |
| wr_mif->bit_mode = 0; |
| } |
| |
| /* video mode */ |
| if (vf->type & (VIDTYPE_VIU_444 | VIDTYPE_RGB_444)) |
| wr_mif->video_mode = 2; |
| else if (vf->type & VIDTYPE_VIU_422) |
| wr_mif->video_mode = 1; |
| else /* nv21 or nv12 */ |
| wr_mif->video_mode = 0; |
| |
| /* separate */ |
| if (vf->type & VIDTYPE_VIU_422) |
| wr_mif->set_separate_en = 0; |
| else if (vf->type & (VIDTYPE_VIU_NV12 | VIDTYPE_VIU_NV21)) |
| wr_mif->set_separate_en = 2; /*nv12 ? nv 21?*/ |
| |
| if (index == EDI_MIFSM_NR) { |
| if (wr_mif->src_i) |
| wr_mif->end_y = vf->height / 2 - 1; |
| else |
| wr_mif->end_y = vf->height - 1; |
| } else { |
| if (dim_dbg_cfg_post_byapss()) |
| wr_mif->end_y = vf->height / 2 - 1; |
| else |
| wr_mif->end_y = vf->height - 1; |
| } |
| } |
| |
| /* for dw 2021-08-25 copy from wr_mif_cfg_v3 */ |
| void wr_mif_cfg_by_dvfm(struct DI_SIM_MIF_s *wr_mif, |
| enum EDI_MIFSM index, |
| struct dvfm_s *dvfm, |
| struct di_win_s *win) |
| { |
| unsigned int bitdepth; |
| |
| if (!wr_mif || !dvfm) |
| return; |
| wr_mif->canvas_num = dvfm->cvs_nu[0] & 0xff; |
| if (dvfm->plane_num == 2) |
| wr_mif->canvas_num |= ((dvfm->cvs_nu[1] & 0xff) << 8); |
| |
| dim_print("%s:w[%d]\n", __func__, dvfm->width); |
| wr_mif->start_x = 0; |
| wr_mif->end_x = dvfm->width - 1; |
| wr_mif->start_y = 0; |
| //tmp for t7: |
| wr_mif->buf_crop_en = 1; |
| //wr_mif->buf_hsize = 1920; |
| wr_mif->buf_hsize = dvfm->buf_hsize; |
| bitdepth = dvfm->bitdepth; |
| if (bitdepth & BITDEPTH_Y10) { |
| if (dvfm->type & VIDTYPE_VIU_444) { |
| wr_mif->bit_mode = (bitdepth & FULL_PACK_422_MODE) ? |
| 3 : 2; |
| } else { |
| wr_mif->bit_mode = (bitdepth & FULL_PACK_422_MODE) ? |
| 3 : 1; |
| } |
| } else { |
| wr_mif->bit_mode = 0; |
| } |
| |
| /* video mode */ |
| if (dvfm->type & (VIDTYPE_VIU_444 | VIDTYPE_RGB_444)) |
| wr_mif->video_mode = 2; |
| else if (dvfm->type & VIDTYPE_VIU_422) |
| wr_mif->video_mode = 1; |
| else /* nv21 or nv12 */ |
| wr_mif->video_mode = 0; |
| |
| /* separate */ |
| if (dvfm->type & VIDTYPE_VIU_422) |
| wr_mif->set_separate_en = 0; |
| else if (dvfm->type & (VIDTYPE_VIU_NV12 | VIDTYPE_VIU_NV21)) |
| wr_mif->set_separate_en = 2; /*nv12 ? nv 21?*/ |
| |
| if (index == EDI_MIFSM_NR) { |
| if (wr_mif->src_i) |
| wr_mif->end_y = dvfm->height / 2 - 1; |
| else |
| wr_mif->end_y = dvfm->height - 1; |
| } else { |
| if (dim_dbg_cfg_post_byapss()) |
| wr_mif->end_y = dvfm->height / 2 - 1; |
| else |
| wr_mif->end_y = dvfm->height - 1; |
| } |
| } |
| |
| static void set_di_pre_write(u32 pre_path_sel, |
| struct DI_MIF_S *pre_mif, |
| struct AFBCE_S *pre_afbce, |
| const struct reg_acc *op) |
| { |
| u32 pre_wrmif_enable = (pre_path_sel >> 0) & 0x1; |
| u32 pre_afbce_enable = (pre_path_sel >> 1) & 0x1; |
| |
| op->bwr(DI_TOP_PRE_CTRL, (pre_path_sel & 0x3), 0, 2); |
| //post_path_sel |
| |
| //////////////////////////////// |
| //////Cofigure Wrmif and Afbce |
| //////////////////////////////// |
| |
| if (pre_wrmif_enable) { |
| set_wrmif_simple(0, |
| //int index , |
| pre_wrmif_enable, |
| //int enable , |
| pre_mif, |
| //DI_MIF0_t *wr_mif |
| op); |
| } |
| |
| if (pre_afbce_enable) { |
| set_afbce_cfg_v1(1, |
| //int index , |
| //0:vdin_afbce 1:di_afbce0 2:di_afbce1 |
| pre_afbce_enable, |
| //int enable , |
| //open nbit of afbce |
| pre_afbce, |
| //AFBCE_t *afbce |
| op); |
| } |
| } |
| |
| static void set_di_post_write(u32 post_path_sel, |
| struct DI_MIF_S *post_mif, |
| struct AFBCE_S *post_afbce, |
| const struct reg_acc *op) |
| { |
| u32 post_wrmif_enable = (post_path_sel >> 0) & 0x1; |
| u32 post_afbce_enable = (post_path_sel >> 1) & 0x1; |
| |
| op->bwr(DI_TOP_POST_CTRL, (post_path_sel & 0x3), 0, 2); |
| //post_path_sel |
| |
| //////////////////////////////// |
| //////Cofigure Wrmif and Afbce |
| //////////////////////////////// |
| |
| if (post_wrmif_enable) { |
| set_wrmif_simple(1,//int index , |
| post_wrmif_enable,//int enable , |
| post_mif, //DI_MIF0_t *wr_mif |
| op); |
| } |
| if (post_afbce_enable) { |
| set_afbce_cfg_v1(2, post_afbce_enable, post_afbce, op); |
| //int index , |
| //0:vdin_afbce 1:di_afbce0 2:di_afbce1 |
| //int enable , |
| //open nbit of afbce |
| //AFBCE_t *afbce |
| } |
| } |
| |
| static void set_di_mult_write(struct DI_MULTI_WR_S *mwcfg, |
| const struct reg_acc *opin) |
| { |
| const struct reg_acc *op; |
| |
| if (!opin) |
| op = &di_pre_regset; |
| else |
| op = opin; |
| |
| //////////////////////////////// |
| //////Cofigure Wrmif and Afbce |
| //////////////////////////////// |
| set_di_pre_write(mwcfg->pre_path_sel,//uint32_t pre_path_sel , |
| mwcfg->pre_mif,//DI_MIF0_t *pre_mif , |
| mwcfg->pre_afbce, //AFBCE_t *pre_afbce , |
| op); |
| |
| set_di_post_write(mwcfg->post_path_sel,//uint32_t pre_path_sel , |
| mwcfg->post_mif,//DI_MIF0_t *pre_mif , |
| mwcfg->post_afbce,//AFBCE_t *pre_afbce , |
| op); |
| } |
| |
| static void set_di_pre(struct DI_PRE_S *pcfg, const struct reg_acc *opin) |
| { |
| int p1_en, p2_en; |
| int p1_mif_en, p2_mif_en;//chan2 and mem |
| int p1_hsize, p1_vsize; |
| int p2_hsize, p2_vsize; |
| int pre_hsize_i, pre_vsize_i; |
| int pre_hsize_o, pre_vsize_o; |
| int bits_mode, rgb_mode; |
| #ifndef DI_SCALAR_DISABLE //ary add |
| int inp_hsc_en, pps_en; |
| #endif |
| int hold_line_new; |
| const struct reg_acc *op; |
| |
| if (!opin) |
| op = &di_pre_regset; |
| else |
| op = opin; |
| |
| if (pcfg->pre_viu_link == 0) |
| op->wr(DI_SC2_PRE_GL_CTRL, 0xc0200001); |
| |
| //====================================// |
| // MIF configration |
| //====================================// |
| p1_en = pcfg->mcdi_en || pcfg->mtn_en || |
| pcfg->pd32_check_en || pcfg->pd22_check_en || |
| pcfg->hist_check_en || pcfg->cue_en; |
| p2_en = pcfg->nr_en || pcfg->mcdi_en || pcfg->mtn_en; |
| |
| if (pcfg->afbc_en) { |
| pre_hsize_i = |
| pcfg->inp_afbc->hsize >> pcfg->inp_afbc->h_skip_en; |
| pre_vsize_i = |
| pcfg->inp_afbc->vsize >> pcfg->inp_afbc->v_skip_en; |
| pre_hsize_o = pcfg->nrwr_afbc->hsize_in; |
| pre_vsize_o = pcfg->nrwr_afbc->vsize_in; |
| |
| p1_hsize = |
| pcfg->chan2_afbc->hsize >> pcfg->chan2_afbc->h_skip_en; |
| p1_vsize = |
| pcfg->chan2_afbc->vsize >> pcfg->chan2_afbc->v_skip_en; |
| p2_hsize = pcfg->mem_afbc->hsize >> pcfg->mem_afbc->h_skip_en; |
| p2_vsize = pcfg->mem_afbc->vsize >> pcfg->mem_afbc->v_skip_en; |
| |
| p1_mif_en = p1_en && (p1_hsize == pre_hsize_o) && |
| (p1_vsize == pre_vsize_o); |
| p2_mif_en = p2_en && (p2_hsize == pre_hsize_o) && |
| (p2_vsize == pre_vsize_o); |
| |
| set_afbcd_mult_simple(EAFBC_DEC2_DI,//di_inp_afbc->index, |
| pcfg->inp_afbc, |
| op);//AFBCD_t *afbcd |
| if (p2_mif_en) { |
| set_afbcd_mult_simple(EAFBC_DEC3_MEM, |
| //di_mem_afbc->index, |
| pcfg->mem_afbc, |
| op); //AFBCD_t *afbcd |
| } |
| if (p1_mif_en) { |
| set_afbcd_mult_simple(EAFBC_DEC_CHAN2, |
| //di_chan2_afbc->index, |
| pcfg->chan2_afbc, |
| op);//AFBCD_t *afbcd |
| } |
| |
| if (pcfg->nr_en) { |
| set_afbce_cfg_v1(1, 1, pcfg->nrwr_afbc, op); |
| //int index , |
| //0:vdin_afbce 1:di_afbce0 2:di_afbce1 |
| //int enable , |
| //open nbit of afbce |
| //AFBCE_t *afbce |
| } |
| } else { |
| pre_hsize_i = pcfg->inp_mif->luma_x_end0 - |
| pcfg->inp_mif->luma_x_start0 + 1; |
| pre_vsize_i = pcfg->inp_mif->luma_y_end0 - |
| pcfg->inp_mif->luma_y_start0 + 1; |
| pre_hsize_o = pcfg->nrwr_mif->luma_x_end0 - |
| pcfg->nrwr_mif->luma_x_start0 + 1; |
| pre_vsize_o = pcfg->nrwr_mif->luma_y_end0 - |
| pcfg->nrwr_mif->luma_y_start0 + 1; |
| |
| p1_hsize = pcfg->chan2_mif->luma_x_end0 - |
| pcfg->chan2_mif->luma_x_start0 + 1; |
| p1_vsize = pcfg->chan2_mif->luma_y_end0 - |
| pcfg->chan2_mif->luma_y_start0 + 1; |
| p2_hsize = pcfg->mem_mif->luma_x_end0 - |
| pcfg->mem_mif->luma_x_start0 + 1; |
| p2_vsize = pcfg->mem_mif->luma_y_end0 - |
| pcfg->mem_mif->luma_y_start0 + 1; |
| |
| p1_mif_en = p1_en && (p1_hsize == pre_hsize_o) && |
| (p1_vsize == pre_vsize_o); |
| p2_mif_en = p2_en && (p2_hsize == pre_hsize_o) && |
| (p2_vsize == pre_vsize_o); |
| |
| hold_line_new = pcfg->pre_viu_link ? |
| (pcfg->hold_line > 4 ? pcfg->hold_line - 4 : 0) : |
| pcfg->hold_line; |
| |
| pcfg->inp_mif->urgent = 0; //ary move |
| pcfg->inp_mif->hold_line = hold_line_new; //ary move |
| set_di_mif_v1(pcfg->inp_mif, DI_MIF0_ID_INP, op); |
| if (p2_mif_en) { |
| pcfg->mem_mif->urgent = 0; //ary move |
| pcfg->mem_mif->hold_line = hold_line_new; //ary move |
| set_di_mif_v1(pcfg->mem_mif, DI_MIF0_ID_MEM, op); |
| } |
| if (p1_mif_en) { |
| pcfg->chan2_mif->urgent = 0; //ary move |
| pcfg->chan2_mif->hold_line = hold_line_new; //ary move |
| set_di_mif_v1(pcfg->chan2_mif, DI_MIF0_ID_CHAN2, op); |
| } |
| // set nr wr mif interface. |
| if (pcfg->nr_en) { |
| op->wr(DI_SC2_NRWR_X, op->rd(DI_SC2_NRWR_X) | |
| (pcfg->nrwr_mif->luma_x_start0 << 16) | |
| (pcfg->nrwr_mif->luma_x_end0)); |
| // start_x 0 end_x 719. |
| op->wr(DI_SC2_NRWR_Y, op->rd(DI_SC2_NRWR_Y) | |
| (pcfg->nrwr_mif->luma_y_start0 << 16) | |
| (pcfg->nrwr_mif->luma_y_end0)); |
| // start_y 0 end_y 239. |
| if (pcfg->nrwr_mif->linear) |
| di_mif0_linear_wr_cfg(pcfg->nrwr_mif, 0, op); |
| else |
| op->wr(DI_NRWR_CANVAS, |
| pcfg->nrwr_mif->canvas0_addr0 | |
| (pcfg->nrwr_mif->canvas0_addr1 << 8)); |
| bits_mode = pcfg->nrwr_mif->bit_mode != 0; |
| //1: 10bits 422(old mode) |
| // 0:8bits 2:10bit 444 3:10bit full-pack |
| // rgb_mode 0: 422 to one canvas |
| // 1: 444 to one canvas |
| //2: 8bit Y to one canvas, 16bit UV to another canvas |
| // 3: 422 full pack mode (10bit) |
| rgb_mode = pcfg->nrwr_mif->bit_mode == 3 ? 3 : |
| //422 10bit |
| (pcfg->nrwr_mif->set_separate_en == 0 ? |
| (pcfg->nrwr_mif->video_mode == 1 ? 0 : 1) : |
| ((pcfg->nrwr_mif->video_mode == 1) ? 2 : 3)); |
| //two canvas |
| op->wr(DI_SC2_NRWR_CTRL, (pcfg->nr_en << 0) | |
| // write mif en. |
| (bits_mode << 1) | // bit10 mode |
| (0 << 2) | // little endian |
| (0 << 3) | // data ext enable |
| (5 << 4) | // word limit |
| (0 << 16) | // urgent |
| (0 << 17) | |
| // swap cbcrworking in rgb mode =2: swap cbcr |
| (0 << 18) | // vconv working in rgb mode =2: |
| (0 << 20) | // hconv. output even pixel |
| (rgb_mode << 22) | |
| // rgb mode =0, 422 YCBCR to one canvas. |
| (0 << 24) | // no gate clock |
| (0 << 25) | // canvas_sync enable |
| (2 << 26) | // burst lim |
| (1 << 30)); // 64-bits swap enable |
| } |
| } |
| if (pcfg->nr_en) { |
| op->wr(NR4_TOP_CTRL, |
| (0 << 20) | |
| //reg_gclk_ctrl = reg_top_ctrl[31:20]; |
| (1 << 19) | |
| //reg_text_en = reg_top_ctrl[19] ; |
| (1 << 18) | |
| //reg_nr4_mcnr_en = reg_top_ctrl[18] ; |
| (1 << 17) | |
| //reg_nr2_en = reg_top_ctrl[17] ; |
| (1 << 16) | |
| //reg_nr4_en = reg_top_ctrl[16] ; |
| (1 << 15) | |
| //reg_nr2_proc_en = reg_top_ctrl[15] ; |
| (0 << 14) | |
| //reg_det3d_en = reg_top_ctrl[14] ; |
| (0 << 13) | |
| //di_polar_en = reg_top_ctrl[13] ; |
| (0 << 12) | |
| //reg_cfr_enable = reg_top_ctrl[12] ; |
| (7 << 9) | |
| //reg_3dnr_en_l = reg_top_ctrl[11:9] ;// u3 |
| (7 << 6) | |
| //reg_3dnr_en_r = reg_top_ctrl[8:6] ;// u3 |
| (1 << 5) | |
| //reg_nr4_inbuf_ctrl = reg_top_ctrl[5] ; |
| (1 << 4) | |
| //reg_nr4_snr2_en = reg_top_ctrl[4] ; |
| (0 << 3) | |
| //reg_nr4_scene_change_en = reg_top_ctrl[3] ; |
| (1 << 2) | |
| //nr2_sw_en = reg_top_ctrl[2] ; |
| (1 << 1) | |
| //reg_cue_en = reg_top_ctrl[1] ; |
| (0 << 0)); |
| //reg_nr4_scene_change_flg = reg_top_ctrl[0] ; |
| } |
| |
| #ifndef DI_SCALAR_DISABLE //ary add |
| |
| // scaler |
| inp_hsc_en = (pre_vsize_i == pre_vsize_o) && |
| (pre_hsize_i != pre_hsize_o); |
| pps_en = (pre_vsize_i != pre_vsize_o); |
| if (inp_hsc_en) |
| set_inp_hsc(pre_hsize_i, pre_vsize_i, pre_hsize_o, pre_vsize_o); |
| else if (pps_en) |
| enable_di_scale(pre_hsize_i, |
| pre_vsize_i, |
| pre_hsize_o, pre_vsize_o, 1, 0); |
| #endif |
| // config motion detect. |
| if (pcfg->mtn_en) { |
| op->wr(MTNWR_X, (2 << 30) | |
| (pcfg->mtnwr_mif->start_x << 16) | |
| (pcfg->mtnwr_mif->end_x)); // start_x 0 end_x 719. |
| op->wr(MTNWR_Y, (pcfg->mtnwr_mif->start_y << 16) | |
| (pcfg->mtnwr_mif->end_y)); // start_y 0 end_y 239. |
| op->wr(MTNWR_CAN_SIZE, |
| ((pcfg->mtnwr_mif->end_x - pcfg->mtnwr_mif->start_x) << |
| 16) | (pcfg->mtnwr_mif->end_y - |
| pcfg->mtnwr_mif->start_y)); |
| op->wr(MTNWR_CTRL, pcfg->mtnwr_mif->canvas_num | |
| // canvas index. |
| (1 << 12)); // req_en. |
| |
| set_cont_mif(pcfg->contp1_mif, |
| pcfg->contp2_mif, pcfg->contwr_mif, op); |
| op->bwr(DI_MTN_CTRL1, pcfg->cont_ini_en, 30, 1); |
| } |
| |
| // config mcdi |
| if (pcfg->mcdi_en == 1) { |
| set_mcdi_def(pcfg->mcvecwr_mif, pre_hsize_o - 1, |
| pre_vsize_o - 1, op); |
| set_mcdi_pre(pcfg->mcinfrd_mif, |
| pcfg->mcvecwr_mif, |
| pcfg->mcinfwr_mif, op); |
| op->bwr(MCDI_CTRL_MODE, pcfg->mcinfo_rd_en, 28, 1);// |
| } |
| |
| op->bwr(DNR_CTRL, 0, 9, 1); //disable chroma |
| op->bwr(DNR_CTRL, pcfg->dnr_en, 16, 1); |
| op->bwr(DNR_DM_CTRL, 0, 8, 1); |
| |
| op->wr(DI_PRE_SIZE, ((pre_vsize_o - 1) << 16) | (pre_hsize_o - 1)); |
| |
| op->wr(DI_PRE_CTRL, |
| (pcfg->nr_en << 0) | |
| // nr_en = pre_ctrl[0]; |
| (pcfg->mtn_en << 1) | |
| // mtn_en = pre_ctrl[1]; |
| (pcfg->pd32_check_en << 2) | |
| // check322p_en = pre_ctrl[2]; |
| (pcfg->pd22_check_en << 3) | |
| // check222p_en = pre_ctrl[3]; |
| (1 << 4) | |
| // check_after_nr = pre_ctrl[4]; |
| (pcfg->hist_check_en << 5) | |
| // chan2_hist_en = pre_ctrl[5]; |
| (1 << 6) | |
| // mtn_after_nr = pre_ctrl[6]; |
| (0 << 7) | |
| // pd_mtn_swap = pre_ctrl[7]; |
| (p2_mif_en << 8) | |
| // di_buf3_en = pre_ctrl[8]; //mem, p2 field |
| (p1_mif_en << 9) | |
| // di_buf2_en = pre_ctrl[9]; //chan2, p1 field |
| (0 << 10) | |
| // nr_wr_by = pre_ctrl[10]; |
| (2 << 11) | |
| // reg_tfbf_en = pre_ctrl[12:11]; |
| //reg_tfbf_en : bit0:tfbf enable bit1:normal path |
| (pcfg->mcdi_en << 16) | |
| // reg_me_en = pre_ctrl[16];//mcdi |
| (pcfg->mcdi_en << 17) | |
| // reg_me_autoen = pre_ctrl[17]; |
| (0 << 19) | |
| // pre_field_num_mcdi = pre_ctrl[19] ^ pre_field_num; |
| (0 << 20) | |
| // pre_field_num_pulldow= pre_ctrl[20] ^ pre_field_num; |
| (0 << 21) | |
| // pre_field_num_nr = pre_ctrl[21] ^ pre_field_num; |
| (0 << 23) | |
| // mode_422c444 = pre_ctrl[24:23]; |
| (0 << 26) | |
| // mode_444c422 = pre_ctrl[27:26]; |
| (pcfg->pre_field_num << 29)); |
| // pre_field_num = pre_ctrl[29]; |
| |
| op->wr(DI_TOP_PRE_CTRL, |
| ((pcfg->afbc_en ? 2 : 1) << 0) | // nrwr_path_sel |
| (0 << 2) | // afbce_path_sel |
| ((pcfg->afbc_en ? 7 : 0) << 4) | // afbc_vd_sel |
| (1 << 10) | // nr_ch0_en |
| (0 << 12) | // pre_bypass_ctrl |
| (0 << 20) | // fix_disable_pre |
| ((pcfg->pre_viu_link ? 2 : 0) << 30)); |
| // pre_frm_sel = top_pre_ctrl[31:30]; |
| //0:internal 1:pre-post link 2:viu 3:vcp(vdin) |
| |
| op->bwr(DI_TOP_CTRL, pcfg->pre_viu_link, 0, 1); |
| |
| if (pre_hsize_o > 1368) |
| op->bwr(LBUF_TOP_CTRL, 0, 17, 1);// fmt444 disable |
| |
| op->bwr(DI_SC2_PRE_GL_THD, pcfg->hold_line, 16, 6); |
| if (pcfg->pre_viu_link == 0) |
| op->wr(DI_SC2_PRE_GL_CTRL, 0x80200001); |
| } |
| |
| //=========================================== |
| // enable di post module for separate test. |
| //=========================================== |
| static void set_di_post(struct DI_PST_S *ptcfg, const struct reg_acc *opin) |
| { |
| int ei_only; |
| int weave_en; |
| int m2m_en; |
| int bits_mode, rgb_mode; |
| int post_hsize1 = 0, post_vsize1 = 0; //before scaler |
| int post_hsize2 = 0, post_vsize2 = 0; //after scaler |
| #ifndef DI_SCALAR_DISABLE //ary add |
| int pps_en; |
| #endif |
| int hold_line_new; |
| const struct reg_acc *op; |
| |
| if (!opin) |
| op = &di_pre_regset; |
| else |
| op = opin; |
| |
| ei_only = ptcfg->post_en && ptcfg->mux_en && |
| ptcfg->ei_en && !ptcfg->blend_en;//weave |
| weave_en = ptcfg->post_en && |
| ptcfg->mux_en && !ptcfg->ei_en && !ptcfg->blend_en;//bob |
| m2m_en = ptcfg->post_en && |
| ptcfg->ddr_en && !ptcfg->mux_en;//memory copy |
| |
| if (ptcfg->ddr_en) |
| op->wr(DI_SC2_POST_GL_CTRL, 0x40200001); |
| |
| if (ptcfg->post_en) { |
| if (ptcfg->afbc_en) { |
| set_afbcd_mult_simple(EAFBC_DEC_IF0, |
| //di_buf0_afbc->index, |
| ptcfg->buf0_afbc, op); |
| //AFBCD *afbcd |
| |
| if (weave_en || ptcfg->blend_en) { |
| set_afbcd_mult_simple(EAFBC_DEC_IF1, |
| //di_buf1_afbc->index, |
| ptcfg->buf1_afbc, op); |
| //AFBCD *afbcd |
| } |
| if (ptcfg->blend_en) { |
| set_afbcd_mult_simple(EAFBC_DEC_IF2, |
| //di_buf2_afbc->index, |
| ptcfg->buf2_afbc, op); |
| //AFBCD *afbcd |
| } |
| |
| post_hsize1 = ptcfg->buf0_afbc->hsize; |
| post_vsize1 = m2m_en ? ptcfg->buf0_afbc->vsize : |
| ptcfg->buf0_afbc->vsize * 2; |
| post_hsize1 = |
| post_hsize1 >> ptcfg->buf0_afbc->h_skip_en; |
| post_vsize1 = |
| post_vsize1 >> ptcfg->buf0_afbc->v_skip_en; |
| |
| } else { |
| hold_line_new = ptcfg->vpp_en ? |
| (ptcfg->hold_line > 4 ? |
| ptcfg->hold_line - 4 : 0) : ptcfg->hold_line; |
| ptcfg->buf0_mif->urgent = 0;//ary move; |
| ptcfg->buf0_mif->hold_line = hold_line_new;//ary move; |
| set_di_mif_v1(ptcfg->buf0_mif, DI_MIF0_ID_IF0, op); |
| if (weave_en || ptcfg->blend_en) { |
| ptcfg->buf1_mif->urgent = 0; |
| //ary move; |
| ptcfg->buf1_mif->hold_line = hold_line_new; |
| //ary move; |
| set_di_mif_v1(ptcfg->buf1_mif, |
| DI_MIF0_ID_IF1, op); |
| } |
| if (ptcfg->blend_en) { |
| ptcfg->buf2_mif->urgent = 0; |
| //ary move; |
| ptcfg->buf2_mif->hold_line = hold_line_new; |
| //ary move; |
| set_di_mif_v1(ptcfg->buf2_mif, |
| DI_MIF0_ID_IF2, op); |
| } |
| |
| post_hsize1 = ptcfg->buf0_mif->luma_x_end0 - |
| ptcfg->buf0_mif->luma_x_start0 + 1; |
| post_vsize1 = m2m_en ? |
| (ptcfg->buf0_mif->luma_y_end0 - |
| ptcfg->buf0_mif->luma_y_start0 + 1) : |
| (ptcfg->buf0_mif->luma_y_end0 * 2 - |
| ptcfg->buf0_mif->luma_y_start0 * 2 + 2); |
| } |
| } |
| // motion for current display field. |
| if (ptcfg->blend_en) { |
| if (DIM_IS_REV(SC2, MAJOR)) |
| op->wr(MCDI_LMV_GAINTHD, (3 << 20));//normal di |
| else if (DIM_IS_REV(SC2, SUB)) |
| set_sc2overlap_table(DI_BLEND_CTRL, (3 << 20), |
| 0, 32); |
| else |
| op->wr(DI_BLEND_CTRL, (3 << 20));//normal di |
| |
| op->wr(MTNRD_SCOPE_X, |
| (ptcfg->mtn_mif->start_x) | |
| (ptcfg->mtn_mif->end_x << 16)); |
| // start_x 0 end_x 719. |
| op->wr(MTNRD_SCOPE_Y, |
| (ptcfg->mtn_mif->start_y) | |
| (ptcfg->mtn_mif->end_y << 16)); |
| // start_y 0 end_y 239. |
| op->wr(MTNRD_CTRL1, ptcfg->mtn_mif->canvas_num << 16 | |
| //canvas index |
| 2 << 8 | //burst len = 2 |
| 0 << 6 | //little endian |
| 0 << 0);//pack mode |
| //mc vector read mif |
| if (ptcfg->mc_en) { |
| set_mcdi_post(ptcfg->mcvec_mif, op); |
| op->bwr(MCDI_MC_CRTL, 1, 0, 2); |
| } else { |
| op->bwr(MCDI_MC_CRTL, 0, 0, 2); |
| } |
| } |
| |
| if (ptcfg->ddr_en) { |
| if (ptcfg->afbc_en) { |
| set_afbce_cfg_v1(2, 1, ptcfg->wr_afbc, op); |
| //int index , |
| //0:vdin_afbce 1:di_afbce0 2:di_afbce1 |
| //int enable , |
| //open nbit of afbce |
| //AFBCE_t *afbce |
| post_hsize2 = ptcfg->wr_afbc->hsize_in; |
| post_vsize2 = ptcfg->wr_afbc->vsize_in; |
| } else { |
| op->wr(DI_SC2_DIWR_X, |
| (ptcfg->wr_mif->luma_x_start0 << 16) | |
| (ptcfg->wr_mif->luma_x_end0)); |
| // start_x 0 end_x 719. |
| op->wr(DI_SC2_DIWR_Y, |
| (ptcfg->wr_mif->luma_y_start0 << 16) | |
| (ptcfg->wr_mif->luma_y_end0)); |
| // start_y 0 end_y 239. |
| if (ptcfg->wr_mif->linear) |
| di_mif0_linear_wr_cfg(ptcfg->wr_mif, 1, op); |
| else |
| op->wr(DI_DIWR_CANVAS, ptcfg->wr_mif->canvas0_addr0 | |
| (ptcfg->wr_mif->canvas0_addr1 << 8)); |
| bits_mode = ptcfg->wr_mif->bit_mode != 0; |
| //1: 10bits 0:8bits |
| // rgb_mode 0: 422 to one canvas |
| //1: 444 to one canvas |
| //2: 8bit Y to one canvas, 16bit UV to another canvas |
| //3: 422 full pack mode (10bit) |
| rgb_mode = ptcfg->wr_mif->bit_mode == 3 ? 3 ://422 10bit |
| (ptcfg->wr_mif->set_separate_en == 0 ? |
| (ptcfg->wr_mif->video_mode == 1 ? |
| 0 : 1) : |
| ((ptcfg->wr_mif->video_mode == 1) |
| ? 2 : 3)); //two canvas |
| op->wr(DI_SC2_DIWR_CTRL, (1 << 0) | // write mif en. |
| (bits_mode << 1) | // bit10 mode |
| (0 << 2) | // little endian |
| (0 << 3) | // data ext enable |
| (5 << 4) | // word limit |
| (0 << 16) | // urgent |
| (0 << 17) | |
| // swap cbcrworking in rgb mode =2: swap cbcr |
| (0 << 18) | // vconv working in rgb mode =2: |
| (0 << 20) | // hconv. output even pixel |
| (rgb_mode << 22) | |
| // rgb mode =0, 422 YCBCR to one canvas. |
| (0 << 24) | // no gate clock |
| (0 << 25) | // canvas_sync enable |
| (2 << 26) | // burst lim |
| (0 << 30)); // 64-bits swap enable |
| post_hsize2 = |
| ptcfg->wr_mif->luma_x_end0 - |
| ptcfg->wr_mif->luma_x_start0 + 1; |
| post_vsize2 = |
| ptcfg->wr_mif->luma_y_end0 - |
| ptcfg->wr_mif->luma_y_start0 + 1; |
| } |
| |
| #ifndef DI_SCALAR_DISABLE //ary add |
| pps_en = (post_hsize1 != post_hsize2) || |
| (post_vsize1 != post_vsize2); |
| if (pps_en) |
| enable_di_scale(post_hsize1, post_vsize1, |
| post_hsize2, post_vsize2, 0, 0); |
| #endif |
| } |
| |
| op->bwr(DI_SC2_POST_GL_THD, ptcfg->hold_line, 16, 6); |
| op->wr(DI_POST_SIZE, (post_vsize1 - 1) << 16 | (post_hsize1 - 1)); |
| |
| op->wr(DI_POST_CTRL, |
| (ptcfg->post_en << 0) | // di_post_en = post_ctrl[0]; |
| (ptcfg->blend_en << 1) | // di_blend_en = post_ctrl[1]; |
| (ptcfg->ei_en << 2) | // di_ei_en = post_ctrl[2]; |
| (ptcfg->mux_en << 3) | // di_mux_en = post_ctrl[3]; |
| (ptcfg->ddr_en << 4) | // di_wr_bk_en = post_ctrl[4]; |
| (ptcfg->vpp_en << 5) | // di_vpp_out_en = post_ctrl[5]; |
| (0 << 6) | // reg_post_mb_en = post_ctrl[6]; |
| (0 << 10) | // di_post_drop_1st= post_ctrl[10]; |
| (0 << 11) | // di_post_repeat = post_ctrl[11]; |
| (ptcfg->post_field_num << 29)); |
| // post_field_num = post_ctrl[29]; |
| |
| op->wr(DI_TOP_POST_CTRL, |
| ((ptcfg->afbc_en ? 2 : 1) << 0) | |
| // diwr_path_sel =top_post_ctrl[1:0]; |
| ((ptcfg->afbc_en ? 7 : 0) << 4) | |
| // afbc_vd_sel[5:3] =top_post_ctrl[6:4]; |
| ((ptcfg->ddr_en ? 1 : 0) << 30)); |
| // post_frm_sel =top_post_ctrl[3]; |
| //0:viu 1:internal 2:pre-post link (post timming) |
| |
| //Wr_reg_bits(DI_TOP_CTRL, !di_vpp_en, 0, 1); |
| |
| if (ptcfg->ddr_en) |
| op->wr(DI_SC2_POST_GL_CTRL, 0x80200001); |
| } |
| |
| // the input data is 4:2:2, saved in field mode video. |
| static void enable_prepost_link(struct DI_PREPST_S *ppcfg, |
| const struct reg_acc *opin) |
| { |
| int pre_hsize; |
| int pre_vsize; |
| int hold_line_new; |
| const struct reg_acc *op; |
| |
| if (!opin) |
| op = &di_pre_regset; |
| else |
| op = opin; |
| |
| // clock gate |
| if (ppcfg->link_vpp == 0) |
| op->wr(DI_SC2_PRE_GL_CTRL, 0xc0200001); |
| |
| /**********************************/ |
| /**** DI PRE MIF CONFIG ********/ |
| /**********************************/ |
| pre_hsize = ppcfg->nrwr_mif->luma_x_end0 - |
| ppcfg->nrwr_mif->luma_x_start0 + 1; |
| pre_vsize = ppcfg->nrwr_mif->luma_y_end0 - |
| ppcfg->nrwr_mif->luma_y_start0 + 1; |
| |
| //config read mif |
| hold_line_new = ppcfg->link_vpp ? |
| (ppcfg->hold_line > 4 ? ppcfg->hold_line - 4 : 0) : |
| ppcfg->hold_line; |
| //ary move: |
| ppcfg->inp_mif->urgent = 0; |
| ppcfg->inp_mif->hold_line = hold_line_new; |
| ppcfg->mem_mif->urgent = 0; |
| ppcfg->mem_mif->hold_line = hold_line_new; |
| ppcfg->chan2_mif->urgent = 0; |
| ppcfg->chan2_mif->hold_line = hold_line_new; |
| ppcfg->if1_mif->urgent = 0; |
| ppcfg->if1_mif->hold_line = hold_line_new; |
| set_di_mif_v1(ppcfg->inp_mif, DI_MIF0_ID_INP, op); |
| set_di_mif_v1(ppcfg->mem_mif, DI_MIF0_ID_MEM, op); |
| set_di_mif_v1(ppcfg->chan2_mif, DI_MIF0_ID_CHAN2, op); |
| set_di_mif_v1(ppcfg->if1_mif, DI_MIF0_ID_IF1, op); |
| |
| // set nr wr mif interface. |
| op->wr(DI_SC2_NRWR_X, op->rd(DI_SC2_NRWR_X) | |
| (ppcfg->nrwr_mif->luma_x_start0 << 16) | |
| (ppcfg->nrwr_mif->luma_x_end0)); // start_x 0 end_x 719. |
| op->wr(DI_SC2_NRWR_Y, op->rd(DI_SC2_NRWR_Y) | |
| (ppcfg->nrwr_mif->luma_y_start0 << 16) | |
| (ppcfg->nrwr_mif->luma_y_end0)); // start_y 0 end_y 239. |
| if (ppcfg->nrwr_mif->linear) |
| di_mif0_linear_wr_cfg(ppcfg->nrwr_mif, 0, op); |
| else |
| op->wr(DI_NRWR_CANVAS, ppcfg->nrwr_mif->canvas0_addr0); |
| op->wr(DI_SC2_NRWR_CTRL, (1 << 0) | // write mif en. |
| (0 << 1) | // bit10 mode |
| (0 << 2) | // little endian |
| (0 << 3) | // data ext enable |
| (5 << 4) | // word limit |
| (0 << 16) | // urgent |
| (0 << 17) | // swap cbcrworking in rgb mode =2: swap cbcr |
| (0 << 18) | // vconv working in rgb mode =2: |
| (0 << 20) | // hconv. output even pixel |
| (0 << 22) | // rgb mode =0, 422 YCBCR to one canvas. |
| (0 << 24) | // no gate clock |
| (0 << 25) | // canvas_sync enable |
| (2 << 26) | // burst lim |
| (1 << 30)); // 64-bits swap enable |
| op->wr(NR4_TOP_CTRL, |
| (0 << 20) | //reg_gclk_ctrl = reg_top_ctrl[31:20]; |
| (1 << 19) | //reg_text_en = reg_top_ctrl[19] ; |
| (1 << 18) | //reg_nr4_mcnr_en = reg_top_ctrl[18] ; |
| (1 << 17) | //reg_nr2_en = reg_top_ctrl[17] ; |
| (1 << 16) | //reg_nr4_en = reg_top_ctrl[16] ; |
| (1 << 15) | //reg_nr2_proc_en = reg_top_ctrl[15] ; |
| (0 << 14) | //reg_det3d_en = reg_top_ctrl[14] ; |
| (0 << 13) | //di_polar_en = reg_top_ctrl[13] ; |
| (0 << 12) | //reg_cfr_enable = reg_top_ctrl[12] ; |
| (7 << 9) | //reg_3dnr_en_l = reg_top_ctrl[11:9] ; // u3 |
| (7 << 6) | //reg_3dnr_en_r = reg_top_ctrl[8:6] ; // u3 |
| (1 << 5) | //reg_nr4_inbuf_ctrl = reg_top_ctrl[5] ; |
| (1 << 4) | //reg_nr4_snr2_en = reg_top_ctrl[4] ; |
| (0 << 3) | //reg_nr4_scene_change_en = reg_top_ctrl[3] ; |
| (1 << 2) | //nr2_sw_en = reg_top_ctrl[2] ; |
| (1 << 1) | //reg_cue_en = reg_top_ctrl[1] ; |
| (0 << 0)); //reg_nr4_scene_change_flg = reg_top_ctrl[0] ; |
| |
| // motion write mif |
| op->wr(MTNWR_X, (2 << 30) | (ppcfg->mtnwr_mif->start_x << 16) | |
| (ppcfg->mtnwr_mif->end_x)); // start_x 0 end_x 719. |
| op->wr(MTNWR_Y, (ppcfg->mtnwr_mif->start_y << 16) | |
| (ppcfg->mtnwr_mif->end_y)); // start_y 0 end_y 239. |
| op->wr(MTNWR_CAN_SIZE, |
| ((ppcfg->mtnwr_mif->end_x - ppcfg->mtnwr_mif->start_x) << 16) | |
| (ppcfg->mtnwr_mif->end_y - ppcfg->mtnwr_mif->start_y)); |
| op->wr(MTNWR_CTRL, ppcfg->mtnwr_mif->canvas_num | // canvas index. |
| (1 << 12)); // req_en. |
| |
| // config 1bit motion and mcdi mif (PRE) |
| set_mcdi_def(ppcfg->mcvecwr_mif, pre_hsize - 1, pre_vsize - 1, op); |
| set_mcdi_pre(ppcfg->mcinford_mif, |
| ppcfg->mcvecwr_mif, ppcfg->mcinfowr_mif, op); |
| set_cont_mif(ppcfg->contprd_mif, |
| ppcfg->contp2rd_mif, ppcfg->contwr_mif, op); |
| op->bwr(DI_MTN_CTRL1, ppcfg->cont_ini_en, 30, 1); |
| op->bwr(MCDI_CTRL_MODE, ppcfg->mcinfo_rd_en, 28, 1); |
| |
| /**********************************/ |
| /**** DI POST MIF CONFIG ********/ |
| /**********************************/ |
| //motion read mif |
| op->wr(MTNRD_SCOPE_X, |
| (ppcfg->mtnrd_mif->start_x) | (ppcfg->mtnrd_mif->end_x << 16)); |
| // start_x 0 end_x 719. |
| op->wr(MTNRD_SCOPE_Y, |
| (ppcfg->mtnrd_mif->start_y) | (ppcfg->mtnrd_mif->end_y << 16)); |
| // start_y 0 end_y 239. |
| op->wr(MTNRD_CTRL1, ppcfg->mtnrd_mif->canvas_num << 16 | //canvas index |
| 2 << 8 | //burst len = 2 |
| 0 << 6 | //little endian |
| 0 << 0);//pack mode |
| |
| //mc vector read mif |
| set_mcdi_post(ppcfg->mcvecrd_mif, op); |
| |
| // di post write |
| op->wr(DI_SC2_DIWR_X, (ppcfg->diwr_mif->luma_x_start0 << 16) | |
| (ppcfg->diwr_mif->luma_x_end0)); // start_x 0 end_x 719. |
| op->wr(DI_SC2_DIWR_Y, (ppcfg->diwr_mif->luma_y_start0 << 16) | |
| (ppcfg->diwr_mif->luma_y_end0)); // start_y 0 end_y 239. |
| if (ppcfg->diwr_mif->linear) |
| di_mif0_linear_wr_cfg(ppcfg->diwr_mif, 1, op); |
| else |
| op->wr(DI_DIWR_CANVAS, |
| ppcfg->diwr_mif->canvas0_addr0 | |
| (ppcfg->diwr_mif->canvas0_addr1 << 8)); |
| op->wr(DI_SC2_DIWR_CTRL, (1 << 0) | // write mif en. |
| (0 << 1) | // bit10 mode |
| (0 << 2) | // little endian |
| (0 << 3) | // data ext enable |
| (5 << 4) | // word limit |
| (0 << 16) | // urgent |
| (0 << 17) | // swap cbcrworking in rgb mode =2: swap cbcr |
| (0 << 18) | // vconv working in rgb mode =2: |
| (0 << 20) | // hconv. output even pixel |
| (0 << 22) | // rgb mode =0, 422 YCBCR to one canvas. |
| (0 << 24) | // no gate clock |
| (0 << 25) | // canvas_sync enable |
| (2 << 26) | // burst lim |
| (0 << 30)); // 64-bits swap enable |
| |
| /**********************************/ |
| /****** control REG config *******/ |
| /**********************************/ |
| op->bwr(LBUF_TOP_CTRL, 0, 20, 6); |
| op->bwr(LBUF_TOP_CTRL, 0, 17, 1);// fmt444 disable |
| |
| op->wr(DI_PRE_SIZE, (pre_hsize - 1) | ((pre_vsize - 1) << 16)); |
| op->wr(DI_POST_SIZE, (pre_hsize - 1) | ((pre_vsize * 2 - 1) << 16)); |
| |
| op->wr(DI_INTR_CTRL, (0 << 16) | // mask nrwr interrupt. |
| (0 << 17) | // enable mtnwr interrupt. |
| (0 << 18) | // mask diwr interrupt. |
| (1 << 19) | // mask hist check interrupt. |
| (0 << 20) | // mask cont interrupt. |
| (1 << 21) | // mask medi interrupt. |
| (0 << 22) | // mask vecwr interrupt. |
| (0 << 23) | // mask infwr interrupt. |
| (1 << 24) | // mask det3d interrupt. |
| (1 << 25) | // mask nrds write. |
| (1 << 30) | // mask both pre and post write done |
| 0x3ff); // clean all pending interrupt bits. |
| |
| op->wr(DI_PRE_CTRL, |
| (1 << 0) | // nr_en = pre_ctrl[0]; |
| (1 << 1) | // mtn_en = pre_ctrl[1]; |
| (1 << 2) | // check322p_en = pre_ctrl[2]; |
| (1 << 3) | // check222p_en = pre_ctrl[3]; |
| (1 << 4) | // check_after_nr = pre_ctrl[4]; |
| (0 << 5) | // chan2_hist_en = pre_ctrl[5]; |
| (1 << 6) | // mtn_after_nr = pre_ctrl[6]; |
| (0 << 7) | // pd_mtn_swap = pre_ctrl[7]; |
| (1 << 8) | |
| // di_buf3_en = pre_ctrl[8]; //mem, p2 field |
| (1 << 9) | |
| // di_buf2_en = pre_ctrl[9]; //chan2, p1 field |
| (0 << 10) | |
| // nr_wr_by = pre_ctrl[10]; |
| (2 << 11) | |
| // reg_tfbf_en = pre_ctrl[12:11];//reg_tfbf_en |
| (1 << 16) | |
| // reg_me_en = pre_ctrl[16];//mcdi |
| (1 << 17) | |
| // reg_me_autoen = pre_ctrl[17]; |
| (0 << 19) | |
| // pre_field_num_mcdi = pre_ctrl[19] ^ pre_field_num; |
| (0 << 20) | |
| // pre_field_num_pulldow= pre_ctrl[20] ^ pre_field_num; |
| (0 << 21) | |
| // pre_field_num_nr = pre_ctrl[21] ^ pre_field_num; |
| (0 << 23) | |
| // mode_422c444 = pre_ctrl[24:23]; |
| (0 << 26) | |
| // mode_444c422 = pre_ctrl[27:26]; |
| (ppcfg->pre_field_num << 29)); |
| // pre_field_num = pre_ctrl[29]; |
| |
| if (DIM_IS_REV(SC2, MAJOR)) |
| op->wr(MCDI_LMV_GAINTHD, (3 << 20)); |
| else if (DIM_IS_REV(SC2, SUB)) |
| set_sc2overlap_table(DI_BLEND_CTRL, (3 << 20), |
| 0, 32); |
| else |
| op->wr(DI_BLEND_CTRL, (3 << 20)); |
| op->wr(DI_POST_CTRL, |
| (1 << 0) | // di_post_en = post_ctrl[0]; |
| (1 << 1) | // di_blend_en = post_ctrl[1]; |
| (1 << 2) | // di_ei_en = post_ctrl[2]; |
| (1 << 3) | // di_mux_en = post_ctrl[3]; |
| (ppcfg->post_wr_en << 4) | // di_wr_bk_en = post_ctrl[4]; |
| (ppcfg->link_vpp << 5) | // di_vpp_out_en = post_ctrl[5]; |
| (0 << 6) | // reg_post_mb_en = post_ctrl[6]; |
| (0 << 10) | // di_post_drop_1st= post_ctrl[10]; |
| (0 << 11) | // di_post_repeat = post_ctrl[11]; |
| (!ppcfg->pre_field_num << 29)); |
| // post_field_num = post_ctrl[29]; |
| |
| op->wr(MCDI_MC_CRTL, 0xc0a01); |
| |
| op->bwr(DI_SC2_PRE_GL_THD, ppcfg->hold_line, 16, 6); |
| op->bwr(DI_SC2_POST_GL_THD, ppcfg->hold_line, 16, 6); |
| |
| op->wr(DI_TOP_PRE_CTRL, |
| (1 << 0) | // nrwr_path_sel = top_pre_ctrl[1:0]; |
| (0 << 2) | // afbce_path_sel = top_pre_ctrl[3:2]; |
| (0 << 4) | // afbc_vd_sel[2:0] = top_pre_ctrl[6:4]; |
| (1 << 10) | // nr_ch0_en = top_pre_ctrl[10]; |
| (0 << 12) | // pre_bypass_ctrl = top_pre_ctrl[19:12]; |
| (0 << 20) | // fix_disable_pre = top_pre_ctrl[21:20]; |
| (1 << 30)); // pre_frm_sel = top_pre_ctrl[31:30]; |
| //0:internal 1:pre-post link(pre timming) 2:viu 3:vcp(vdin) |
| |
| op->wr(DI_TOP_POST_CTRL, |
| (1 << 0) | |
| // diwr_path_sel =top_post_ctrl[1:0]; |
| (0 << 4) | |
| // afbc_vd_sel[5:3] =top_post_ctrl[6:4]; |
| (0 << 12) | |
| // post_bypass_ctrl = top_post_ctrl[19:12]; |
| (0 << 20) | |
| // fix_disable_post = top_post_ctrl[21:20]; |
| ((ppcfg->link_vpp ? 0 : 1) << 30)); |
| // post_frm_sel =top_post_ctrl[3]; |
| //0:viu 1:internal 2:pre-post link (post timming) |
| |
| //Wr_reg_bits(DI_TOP_CTRL,!di_link_vpp,0,1); |
| |
| if (ppcfg->link_vpp == 0) |
| op->wr(DI_SC2_PRE_GL_CTRL, 0x80200001); |
| } |
| |
| // the input data is 4:2:2, saved in field mode video. |
| static void enable_prepost_link_afbce(struct DI_PREPST_AFBC_S *pafcfg, |
| const struct reg_acc *opin) |
| { |
| int pre_hsize; |
| int pre_vsize; |
| const struct reg_acc *op; |
| |
| if (!opin) |
| op = &di_pre_regset; |
| else |
| op = opin; |
| |
| // clock gate |
| if (pafcfg->link_vpp == 0) |
| op->wr(DI_SC2_PRE_GL_CTRL, 0xc0200001); |
| |
| //open all mif |
| op->bwr(DI_TOP_CTRL, 0x2c688, 4, 18); |
| |
| /**** DI PRE MIF CONFIG ********/ |
| |
| pre_hsize = pafcfg->nrwr_afbc->enc_win_end_h - |
| pafcfg->nrwr_afbc->enc_win_bgn_h + 1;//todo |
| pre_vsize = pafcfg->nrwr_afbc->enc_win_end_v - |
| pafcfg->nrwr_afbc->enc_win_bgn_v + 1;//todo |
| |
| //printf("pre_scop : %d %d %d %d\n",di_nrwr_afbc->enc_win_bgn_h, |
| //di_nrwr_afbc->enc_win_end_h, |
| //di_nrwr_afbc->enc_win_bgn_v,di_nrwr_afbc->enc_win_end_v); |
| |
| //config read mif |
| set_afbcd_mult_simple(EAFBC_DEC2_DI, pafcfg->inp_afbc, op); |
| set_afbcd_mult_simple(EAFBC_DEC3_MEM, pafcfg->mem_afbc, op); |
| set_afbcd_mult_simple(EAFBC_DEC_CHAN2, pafcfg->chan2_afbc, op); |
| set_afbcd_mult_simple(EAFBC_DEC_IF1, pafcfg->if1_afbc, op); |
| |
| // set nr wr mif interface. |
| set_afbce_cfg_v1(1, 1, pafcfg->nrwr_afbc, op); |
| //int index, |
| //0:vdin_afbce 1:di_afbce0 2:di_afbce1 |
| //int enable ,//open afbce |
| //AFBCE_t *afbce |
| |
| op->wr(NR4_TOP_CTRL, |
| (0 << 20) | //reg_gclk_ctrl = reg_top_ctrl[31:20]; |
| (1 << 19) | //reg_text_en = reg_top_ctrl[19] ; |
| (1 << 18) | //reg_nr4_mcnr_en = reg_top_ctrl[18] ; |
| (1 << 17) | //reg_nr2_en = reg_top_ctrl[17] ; |
| (1 << 16) | //reg_nr4_en = reg_top_ctrl[16] ; |
| (1 << 15) | //reg_nr2_proc_en = reg_top_ctrl[15] ; |
| (0 << 14) | //reg_det3d_en = reg_top_ctrl[14] ; |
| (0 << 13) | //di_polar_en = reg_top_ctrl[13] ; |
| (0 << 12) | //reg_cfr_enable = reg_top_ctrl[12] ; |
| (7 << 9) | //reg_3dnr_en_l = reg_top_ctrl[11:9] ; // u3 |
| (7 << 6) | //reg_3dnr_en_r = reg_top_ctrl[8:6] ; // u3 |
| (1 << 5) | //reg_nr4_inbuf_ctrl = reg_top_ctrl[5] ; |
| (1 << 4) | //reg_nr4_snr2_en = reg_top_ctrl[4] ; |
| (0 << 3) | //reg_nr4_scene_change_en = reg_top_ctrl[3] ; |
| (1 << 2) | //nr2_sw_en = reg_top_ctrl[2] ; |
| (1 << 1) | //reg_cue_en = reg_top_ctrl[1] ; |
| (0 << 0)); //reg_nr4_scene_change_flg = reg_top_ctrl[0] ; |
| |
| // motion write mif |
| op->wr(MTNWR_X, (2 << 30) | (pafcfg->mtnwr_mif->start_x << 16) | |
| (pafcfg->mtnwr_mif->end_x)); // start_x 0 end_x 719. |
| op->wr(MTNWR_Y, (pafcfg->mtnwr_mif->start_y << 16) | |
| (pafcfg->mtnwr_mif->end_y)); // start_y 0 end_y 239. |
| op->wr(MTNWR_CAN_SIZE, |
| ((pafcfg->mtnwr_mif->end_x - pafcfg->mtnwr_mif->start_x) << 16) | |
| (pafcfg->mtnwr_mif->end_y - pafcfg->mtnwr_mif->start_y)); |
| op->wr(MTNWR_CTRL, pafcfg->mtnwr_mif->canvas_num | // canvas index. |
| (1 << 12)); // req_en. |
| |
| // config 1bit motion and mcdi mif (PRE) |
| set_mcdi_def(pafcfg->mcvecwr_mif, |
| pre_hsize - 1, pre_vsize - 1, op); |
| set_mcdi_pre(pafcfg->mcinford_mif, |
| pafcfg->mcvecwr_mif, pafcfg->mcinfowr_mif, op); |
| set_cont_mif(pafcfg->contprd_mif, |
| pafcfg->contp2rd_mif, pafcfg->contwr_mif, op); |
| op->bwr(DI_MTN_CTRL1, pafcfg->cont_ini_en, 30, 1); |
| op->bwr(MCDI_CTRL_MODE, pafcfg->mcinfo_rd_en, 28, 1); |
| |
| /**********************************/ |
| /**** DI POST MIF CONFIG ********/ |
| /**********************************/ |
| //motion read mif |
| op->wr(MTNRD_SCOPE_X, (pafcfg->mtnrd_mif->start_x) | |
| (pafcfg->mtnrd_mif->end_x << 16)); // start_x 0 end_x 719. |
| op->wr(MTNRD_SCOPE_Y, (pafcfg->mtnrd_mif->start_y) | |
| (pafcfg->mtnrd_mif->end_y << 16)); // start_y 0 end_y 239. |
| op->wr(MTNRD_CTRL1, pafcfg->mtnrd_mif->canvas_num << 16 | //canvas index |
| 2 << 8 | //burst len = 2 |
| 0 << 6 | //little endian |
| 0 << 0);//pack mode |
| |
| //mc vector read mif |
| set_mcdi_post(pafcfg->mcvecrd_mif, op); |
| |
| //enable DNR, and disable DNR chroma |
| //Wr_reg_bits(DNR_CTRL,0,9,1); //disable chroma |
| //Wr_reg_bits(DNR_CTRL,1,16,1); |
| //Wr_reg_bits(DNR_DM_CTRL,0,8,1); |
| |
| // di post write |
| //Wr(DI_DIWR_X, |
| //(di_diwr_mif->luma_x_start0 <<16) | (di_diwr_mif->luma_x_end0)); |
| // start_x 0 end_x 719. |
| //Wr(DI_DIWR_Y, |
| //(di_diwr_mif->luma_y_start0 <<16) | (di_diwr_mif->luma_y_end0)); |
| // start_y 0 end_y 239. |
| //Wr(DI_DIWR_CANVAS,di_diwr_mif->canvas0_addr0 | |
| //(di_diwr_mif->canvas0_addr1<<8)); |
| set_afbce_cfg_v1(2, 1, pafcfg->diwr_afbc, op); |
| //int index , |
| //0:vdin_afbce 1:di_afbce0 2:di_afbce1 |
| //int enable , |
| //open afbce |
| //AFBCE_t *afbce |
| |
| op->wr(DI_SC2_DIWR_CTRL, (1 << 0) | // write mif en. |
| (0 << 1) | // bit10 mode |
| (0 << 2) | // little endian |
| (0 << 3) | // data ext enable |
| (5 << 4) | // word limit |
| (0 << 16) | // urgent |
| (0 << 17) | // swap cbcrworking in rgb mode =2: swap cbcr |
| (0 << 18) | // vconv working in rgb mode =2: |
| (0 << 20) | // hconv. output even pixel |
| (0 << 22) | // rgb mode =0, 422 YCBCR to one canvas. |
| (0 << 24) | // no gate clock |
| (0 << 25) | // canvas_sync enable |
| (2 << 26) | // burst lim |
| (0 << 30)); // 64-bits swap enable |
| |
| /**********************************/ |
| /****** control REG config *******/ |
| /**********************************/ |
| op->bwr(LBUF_TOP_CTRL, 0, 20, 6); |
| op->bwr(LBUF_TOP_CTRL, 0, 17, 1);// fmt444 disable |
| |
| op->wr(DI_PRE_SIZE, (pre_hsize - 1) | ((pre_vsize - 1) << 16)); |
| op->wr(DI_POST_SIZE, (pre_hsize - 1) | ((pre_vsize * 2 - 1) << 16)); |
| |
| op->wr(DI_INTR_CTRL, (0 << 16) | // mask nrwr interrupt. |
| (0 << 17) | // enable mtnwr interrupt. |
| (0 << 18) | // mask diwr interrupt. |
| (1 << 19) | // mask hist check interrupt. |
| (0 << 20) | // mask cont interrupt. |
| (1 << 21) | // mask medi interrupt. |
| (0 << 22) | // mask vecwr interrupt. |
| (0 << 23) | // mask infwr interrupt. |
| (1 << 24) | // mask det3d interrupt. |
| (1 << 25) | // mask nrds write. |
| (1 << 30) | // mask both pre and post write done |
| 0x3ff); // clean all pending interrupt bits. |
| |
| op->wr(DI_PRE_CTRL, |
| (1 << 0) | // nr_en = pre_ctrl[0]; |
| (1 << 1) | // mtn_en = pre_ctrl[1]; |
| (1 << 2) | // check322p_en = pre_ctrl[2]; |
| (1 << 3) | // check222p_en = pre_ctrl[3]; |
| (1 << 4) | // check_after_nr = pre_ctrl[4]; |
| (0 << 5) | // chan2_hist_en = pre_ctrl[5]; |
| (1 << 6) | // mtn_after_nr = pre_ctrl[6]; |
| (0 << 7) | // pd_mtn_swap = pre_ctrl[7]; |
| (1 << 8) | |
| // di_buf3_en = pre_ctrl[8]; //mem, p2 field |
| (1 << 9) | |
| // di_buf2_en = pre_ctrl[9]; //chan2, p1 field |
| (0 << 10) | |
| // nr_wr_by = pre_ctrl[10]; |
| (2 << 11) | |
| // reg_tfbf_en = pre_ctrl[12:11];//reg_tfbf_en |
| (1 << 16) | |
| // reg_me_en = pre_ctrl[16];//mcdi |
| (1 << 17) | |
| // reg_me_autoen = pre_ctrl[17]; |
| (0 << 19) | |
| // pre_field_num_mcdi = pre_ctrl[19] ^ pre_field_num; |
| (0 << 20) | |
| // pre_field_num_pulldow= pre_ctrl[20] ^ pre_field_num; |
| (0 << 21) | |
| // pre_field_num_nr = pre_ctrl[21] ^ pre_field_num; |
| (0 << 23) | |
| // mode_422c444 = pre_ctrl[24:23]; |
| (0 << 26) | |
| // mode_444c422 = pre_ctrl[27:26]; |
| (pafcfg->pre_field_num << 29)); |
| // pre_field_num = pre_ctrl[29]; |
| |
| //Wr(DI_TOP_PRE_CTRL, |
| // (2 << 0 ) | // nrwr_path_sel |
| // (7 << 4 ) | // afbc_vd_sel |
| // (1 << 10 ) | // nr_ch0_en |
| // (0 << 12 ) | // afbc_gclk_ctrl |
| // (0 << 24 ) | // afbce_gclk_ctrl |
| // ((di_link_vpp?2:0)<< 30 ) ); |
| // pre_frm_sel = top_pre_ctrl[31:30]; |
| //0:internal 1:pre-post link 2:viu 3:vcp(vdin) |
| |
| if (DIM_IS_REV(SC2, MAJOR)) |
| op->wr(MCDI_LMV_GAINTHD, (3 << 20)); |
| else if (DIM_IS_REV(SC2, SUB)) |
| set_sc2overlap_table(DI_BLEND_CTRL, (3 << 20), |
| 0, 32); |
| else |
| op->wr(DI_BLEND_CTRL, (3 << 20)); |
| |
| op->wr(DI_POST_CTRL, |
| (1 << 0) | // di_post_en = post_ctrl[0]; |
| (1 << 1) | // di_blend_en = post_ctrl[1]; |
| (1 << 2) | // di_ei_en = post_ctrl[2]; |
| (1 << 3) | // di_mux_en = post_ctrl[3]; |
| (pafcfg->post_wr_en << 4) | |
| // di_wr_bk_en = post_ctrl[4]; |
| (pafcfg->link_vpp << 5) | |
| // di_vpp_out_en = post_ctrl[5]; |
| (0 << 6) | // reg_post_mb_en = post_ctrl[6]; |
| (0 << 10) | // di_post_drop_1st= post_ctrl[10]; |
| (0 << 11) | // di_post_repeat = post_ctrl[11]; |
| (!pafcfg->pre_field_num << 29)); |
| // post_field_num = post_ctrl[29]; |
| |
| op->wr(MCDI_MC_CRTL, 0xc0a01); |
| |
| op->bwr(DI_SC2_PRE_GL_THD, pafcfg->hold_line, 16, 6); |
| op->bwr(DI_SC2_POST_GL_THD, pafcfg->hold_line, 16, 6); |
| |
| op->wr(DI_TOP_PRE_CTRL, |
| (2 << 0) | // nrwr_path_sel = top_pre_ctrl[1:0]; |
| (7 << 4) | // afbc_vd_sel[2:0] = top_pre_ctrl[6:4]; |
| (1 << 10) | // nr_ch0_en = top_pre_ctrl[10]; |
| (0 << 12) | // pre_bypass_ctrl = top_pre_ctrl[19:12]; |
| (0 << 20) | // fix_disable_pre = top_pre_ctrl[21:20]; |
| (1 << 30)); |
| // pre_frm_sel= top_pre_ctrl[31:30]; |
| //0:internal 1:pre-post link 2:viu 3:vcp(vdin) |
| |
| op->wr(DI_TOP_POST_CTRL, |
| (2 << 0) | |
| // diwr_path_sel =top_post_ctrl[1:0]; |
| (7 << 4) | |
| // afbc_vd_sel[5:3] =top_post_ctrl[6:4]; |
| (0 << 12) | |
| // post_bypass_ctrl = top_post_ctrl[19:12]; |
| (0 << 20) | |
| // fix_disable_post = top_post_ctrl[21:20]; |
| ((pafcfg->link_vpp ? 0 : 1) << 30)); |
| // post_frm_sel =top_post_ctrl[3]; |
| //0:viu 1:internal 2:pre-post link (post timming) |
| |
| //Wr_reg_bits(DI_TOP_CTRL,!di_link_vpp,0,1); |
| |
| if (pafcfg->link_vpp == 0) |
| op->wr(DI_SC2_PRE_GL_CTRL, 0x80200001); |
| } |
| |
| void set_di_memcpy_rot(struct mem_cpy_s *cfg) |
| { |
| struct AFBCD_S *in_afbcd; |
| struct AFBCE_S *out_afbce; |
| struct DI_MIF_S *in_rdmif; |
| struct DI_SIM_MIF_s *out_wrmif; |
| bool afbc_en; |
| bool afbcd_rot = false; |
| // unsigned int hold_line = cfg->hold_line; |
| const struct reg_acc *op; |
| bool is_4k = false; |
| |
| //------------------ |
| unsigned int hsize_int; |
| unsigned int vsize_int; |
| //ary no use uint32_t m3_index; |
| unsigned int afbc_vd_sel = 0; |
| |
| if (!cfg) { |
| //PR_ERR("%s:cfg is null\n", __func__); |
| return; |
| } |
| in_afbcd = cfg->in_afbcd; |
| out_afbce = cfg->out_afbce; |
| in_rdmif = cfg->in_rdmif; |
| out_wrmif = cfg->out_wrmif; |
| afbc_en = cfg->afbc_en; |
| |
| if (!cfg->opin) |
| op = &di_pre_regset; |
| else |
| op = cfg->opin; |
| |
| dim_print("%s:\n", __func__); |
| op->wr(DI_SC2_POST_GL_CTRL, 0xc0200001); |
| #ifdef ARY_MARK |
| //disable all read mif |
| op->bwr(DI_TOP_CTRL, 0x3ffff, 4, 18); |
| #endif |
| //dim_print("%s:2\n", __func__); |
| |
| if (afbc_en) { |
| if (!in_afbcd || !out_afbce) { |
| //PR_ERR("%s:afbc_en[%d],noinput\n", __func__, afbc_en); |
| afbc_en = 0; |
| } |
| } else { |
| if (!in_rdmif || !out_wrmif) { |
| //PR_ERR("%s:2:input none\n", __func__); |
| return; |
| } |
| } |
| //dim_print("%s:3\n", __func__); |
| // config memory interface |
| if (afbc_en) { |
| hsize_int = out_afbce->enc_win_end_h - |
| out_afbce->enc_win_bgn_h + 1; |
| vsize_int = out_afbce->enc_win_end_v - |
| out_afbce->enc_win_bgn_v + 1; |
| |
| if (hsize_int > 1920 || vsize_int > 1920) |
| is_4k = true; |
| //set_afbcd_mult_simple_v1(3,in_afbcd); |
| //set_afbcd_mult_simple_v1(in_afbcd->index,in_afbcd); |
| |
| opl2()->afbcd_set(in_afbcd->index, in_afbcd, op); |
| |
| afbcd_rot = in_afbcd->rot_en; |
| set_afbce_cfg_v1(2, 1, out_afbce, op); |
| /*index, //0:vdin_afbce 1:di_afbce0 2:di_afbce1 */ |
| /*enable, //open afbce */ |
| } else { |
| set_di_mif_v1(in_rdmif, in_rdmif->mif_index, op); |
| |
| hsize_int = out_wrmif->end_x - out_wrmif->start_x + 1; |
| vsize_int = out_wrmif->end_y - out_wrmif->start_y + 1; |
| set_wrmif_simple_v3(out_wrmif, op, EDI_MIFSM_WR); |
| } |
| //dim_print("%s:4:\n", __func__); |
| #ifdef ARY_MARK |
| op->wr(DI_INTR_CTRL, (1 << 16) | // mask nrwr interrupt. |
| (1 << 17) | // enable mtnwr interrupt. |
| (0 << 18) | // mask diwr interrupt. |
| (1 << 19) | // mask hist check interrupt. |
| (1 << 20) | // mask cont interrupt. |
| (1 << 21) | // mask medi interrupt. |
| (1 << 22) | // mask vecwr interrupt. |
| (1 << 23) | // mask infwr interrupt. |
| (1 << 24) | // mask det3d interrupt. |
| (1 << 25) | // mask nrds write. |
| (1 << 30) | // mask both pre and post write done |
| 0x3ff); // clean all pending interrupt bits. |
| #endif |
| op->wr(DI_POST_SIZE, (hsize_int - 1) | ((vsize_int - 1) << 16)); |
| #ifdef ARY_MARK |
| afbc_vd_sel = afbc_en ? (1 << in_afbcd->index) : 0; |
| #else |
| if (in_afbcd) { |
| switch (in_afbcd->index) { |
| case EAFBC_DEC_IF0: |
| afbc_vd_sel = 0x02 << 3; |
| break; |
| case EAFBC_DEC_IF1: |
| afbc_vd_sel = 0x01 << 3; |
| break; |
| case EAFBC_DEC_IF2: |
| afbc_vd_sel = 0x04 << 3; |
| break; |
| default: |
| //PR_ERR("%s:index\n", __func__); |
| afbc_vd_sel = 0x02 << 3; |
| break; |
| } |
| } |
| #endif |
| //bypass en |
| op->wr(DI_POST_CTRL, |
| (1 << 0) | // di_post_en = post_ctrl[0]; |
| (0 << 1) | // di_blend_en = post_ctrl[1]; |
| (0 << 2) | // di_ei_en = post_ctrl[2]; |
| (0 << 3) | // di_mux_en = post_ctrl[3]; |
| (1 << 4) | // di_wr_bk_en = post_ctrl[4]; |
| (0 << 5) | // di_vpp_out_en = post_ctrl[5]; |
| (0 << 6) | // reg_post_mb_en = post_ctrl[6]; |
| (0 << 10) | // di_post_drop_1st= post_ctrl[10]; |
| (0 << 11) | // di_post_repeat = post_ctrl[11]; |
| (0 << 29)); // post_field_num = post_ctrl[29]; |
| |
| op->wr(DI_TOP_POST_CTRL, |
| /* diwr_path_sel = top_post_ctrl[1:0]; */ |
| ((afbc_en ? 2 : 1) << 0) | |
| /* afbc_vd_sel[5:3] = top_post_ctrl[6:4]; */ |
| ((afbc_en ? (afbc_vd_sel >> 3) : 0) << 4) | |
| /* afbcd_m[5:3] is_4k = top_post_ctrl[9:7] */ |
| (((afbcd_rot | is_4k) ? 1 : 0) << 7) | |
| /* post_bypass_ctrl = top_post_ctrl[19:12]; */ |
| (cfg->port << 12) | |
| /* fix_disable_post = top_post_ctrl[21:20]; */ |
| (0 << 20) | |
| /* post_frm_sel =top_post_ctrl[3];//0:viu 1:internal */ |
| (1 << 30)); |
| |
| if ((DIM_IS_IC_EF(T7) || DIM_IS_IC(S4)) && |
| (!IS_ERR_OR_NULL(in_afbcd))) { |
| if (in_afbcd->index == EAFBC_DEC_IF0) { |
| //op->bwr(AFBCDM_IF0_CTRL0,cfg->b.is_if0_4k,14,1); |
| //reg_use_4kram |
| op->bwr(AFBCDM_IF0_CTRL0, 1, 13, 1); |
| //reg_afbc_vd_sel //1:afbc_dec 0:nor_rdmif |
| } else if (in_afbcd->index == EAFBC_DEC_IF1) { |
| //op->bwr(AFBCDM_IF1_CTRL0,cfg->b.is_if1_4k,14,1); |
| //reg_use_4kram |
| op->bwr(AFBCDM_IF1_CTRL0, 1, 13, 1); |
| //reg_afbc_vd_sel //1:afbc_dec 0:nor_rdmif |
| } else if (in_afbcd->index == EAFBC_DEC_IF2) { |
| //op->bwr(AFBCDM_IF2_CTRL0,cfg->b.is_if2_4k,14,1); |
| //reg_use_4kram |
| op->bwr(AFBCDM_IF2_CTRL0, 1, 13, 1); |
| //reg_afbc_vd_sel //1:afbc_dec 0:nor_rdmif |
| } |
| } |
| |
| if (is_4k) |
| dim_sc2_4k_set(2); |
| #ifdef ARY_MARK |
| else |
| dim_sc2_4k_set(0); |
| #endif |
| #ifdef ARY_MARK |
| /* closr pr/post_link */ |
| op->bwr(DI_TOP_PRE_CTRL, 0, 30, 2); |
| |
| /* pre afbc_vd_sel[2:0] */ |
| op->bwr(DI_TOP_PRE_CTRL, afbc_vd_sel & 0x7, 4, 3); |
| |
| op->bwr(DI_TOP_CTRL, in_afbcd->index, 13, 3); |
| #endif |
| |
| // post start |
| op->wr(DI_SC2_POST_GL_CTRL, 0x80200001); |
| } |
| |
| /* ary add this for maybe from is non-afbc and out is afbc |
| * copy from set_di_memcpy_rot |
| */ |
| void set_di_memcpy(struct mem_cpy_s *cfg) |
| { |
| struct AFBCD_S *in_afbcd; |
| struct AFBCE_S *out_afbce; |
| struct DI_MIF_S *in_rdmif; |
| struct DI_SIM_MIF_s *out_wrmif; |
| bool afbc_en = false; |
| bool afbcd_rot = false; |
| // unsigned int hold_line = cfg->hold_line; |
| const struct reg_acc *op; |
| bool is_4k = false; |
| |
| //------------------ |
| unsigned int hsize_int; |
| unsigned int vsize_int; |
| //ary no use uint32_t m3_index; |
| unsigned int afbc_vd_sel = 0; |
| |
| if (!cfg) { |
| //PR_ERR("%s:cfg is null\n", __func__); |
| return; |
| } |
| in_afbcd = cfg->in_afbcd; |
| out_afbce = cfg->out_afbce; |
| in_rdmif = cfg->in_rdmif; |
| out_wrmif = cfg->out_wrmif; |
| |
| if (out_afbce) |
| afbc_en = true; |
| |
| if (!cfg->opin) |
| op = &di_pre_regset; |
| else |
| op = cfg->opin; |
| |
| dim_print("%s:\n", __func__); |
| op->wr(DI_SC2_POST_GL_CTRL, 0xc0200001); |
| |
| //dim_print("%s:2\n", __func__); |
| |
| // config memory interface |
| /* input */ |
| if (in_afbcd) { |
| //dbg_copy("inp:afbcd:\n"); |
| opl2()->afbcd_set(in_afbcd->index, in_afbcd, op); |
| } else { |
| dbg_copy("inp:mif:%d\n", in_rdmif->mif_index); |
| //set_di_mif_v1(in_rdmif, in_rdmif->mif_index, op); |
| opl1()->pre_mif_set(in_rdmif, in_rdmif->mif_index, NULL); |
| } |
| |
| if (out_afbce) { |
| dbg_copy("out:afbce:\n"); |
| hsize_int = out_afbce->enc_win_end_h - |
| out_afbce->enc_win_bgn_h + 1; |
| vsize_int = out_afbce->enc_win_end_v - |
| out_afbce->enc_win_bgn_v + 1; |
| |
| set_afbce_cfg_v1(2, 1, out_afbce, op); |
| /* index, 0:vdin_afbce 1:di_afbce0 2:di_afbce1 */ |
| /* enable, open afbce */ |
| } else { |
| dbg_copy("out:mif:\n"); |
| hsize_int = out_wrmif->end_x - out_wrmif->start_x + 1; |
| vsize_int = out_wrmif->end_y - out_wrmif->start_y + 1; |
| set_wrmif_simple_v3(out_wrmif, op, EDI_MIFSM_WR); |
| } |
| //dbg_copy("%s:4:\n", __func__); |
| |
| if (hsize_int > 1920 || vsize_int > 1920) |
| is_4k = true; |
| |
| op->wr(DI_POST_SIZE, (hsize_int - 1) | ((vsize_int - 1) << 16)); |
| |
| if (in_afbcd) { |
| switch (in_afbcd->index) { |
| case EAFBC_DEC_IF0: |
| afbc_vd_sel = 0x02 << 3; |
| break; |
| case EAFBC_DEC_IF1: |
| afbc_vd_sel = 0x01 << 3; |
| break; |
| case EAFBC_DEC_IF2: |
| afbc_vd_sel = 0x04 << 3; |
| break; |
| default: |
| //PR_ERR("%s:index\n", __func__); |
| afbc_vd_sel = 0x02 << 3; |
| break; |
| } |
| } |
| |
| //bypass en |
| op->wr(DI_POST_CTRL, |
| (1 << 0) | // di_post_en = post_ctrl[0]; |
| (0 << 1) | // di_blend_en = post_ctrl[1]; |
| (0 << 2) | // di_ei_en = post_ctrl[2]; |
| (0 << 3) | // di_mux_en = post_ctrl[3]; |
| (1 << 4) | // di_wr_bk_en = post_ctrl[4]; |
| (0 << 5) | // di_vpp_out_en = post_ctrl[5]; |
| (0 << 6) | // reg_post_mb_en = post_ctrl[6]; |
| (0 << 10) | // di_post_drop_1st= post_ctrl[10]; |
| (0 << 11) | // di_post_repeat = post_ctrl[11]; |
| (0 << 29)); // post_field_num = post_ctrl[29]; |
| |
| op->wr(DI_TOP_POST_CTRL, |
| /* diwr_path_sel = top_post_ctrl[1:0]; */ |
| ((afbc_en ? 2 : 1) << 0) | |
| /* afbc_vd_sel[5:3] = top_post_ctrl[6:4]; */ |
| ((afbc_en ? (afbc_vd_sel >> 3) : 0) << 4) | |
| /* afbcd_m[5:3] is_4k = top_post_ctrl[9:7] */ |
| (((afbcd_rot | is_4k) ? 1 : 0) << 7) | |
| /* post_bypass_ctrl = top_post_ctrl[19:12]; */ |
| (cfg->port << 12) | |
| /* fix_disable_post = top_post_ctrl[21:20];*/ |
| (0 << 20) | |
| /* post_frm_sel =top_post_ctrl[3];//0:viu 1:internal*/ |
| (1 << 30)); |
| |
| if (is_4k) |
| dim_sc2_4k_set(2); |
| |
| // post start |
| op->wr(DI_SC2_POST_GL_CTRL, 0x80200001); |
| } |
| |
| /*ary change for test on g12a*/ |
| void set_di_mif_v3(struct DI_MIF_S *mif, enum DI_MIF0_ID mif_index, |
| const struct reg_acc *opin) |
| { |
| u32 bytes_per_pixel = 0; |
| //0 = 1 byte per pixel,1 = 2 bytes per pixel,2 = 3 bytes per pixel |
| u32 demux_mode = 0; |
| u32 reset_bit = 1; |
| u32 chro_rpt_lastl_ctrl = 0; |
| u32 luma0_rpt_loop_start = 0; |
| u32 luma0_rpt_loop_end = 0; |
| u32 luma0_rpt_loop_pat = 0; |
| u32 vfmt_rpt_first = 0; |
| u32 chroma0_rpt_loop_start = 0; |
| u32 chroma0_rpt_loop_end = 0; |
| u32 chroma0_rpt_loop_pat = 0; |
| int hfmt_en = 1; |
| int hz_yc_ratio = 0; |
| int hz_ini_phase = 0; |
| int vfmt_en = 0; |
| int vt_yc_ratio = 0; |
| int vt_ini_phase = 0; |
| int y_length = 0; |
| int c_length = 0; |
| int hz_rpt = 0; |
| int vt_phase_step = 0;// = (16 >> vt_yc_ratio); |
| int urgent = mif->urgent; |
| int hold_line = mif->hold_line; |
| unsigned int off; |
| const unsigned int *reg; |
| const struct reg_acc *op; |
| int nrpt_phase0_en = 1; |
| unsigned int burst_len = 2; |
| |
| if (!opin) |
| op = &di_pre_regset; |
| else |
| op = opin; |
| |
| if (is_mask(SC2_REG_MSK_nr)) { /* dbg */ |
| op = &sc2reg; |
| PR_INF("%s:%s:\n", __func__, dim_get_mif_id_name(mif_index)); |
| } |
| |
| reg = mif_reg_get_v3(); |
| off = di_mif_add_get_offset_v3(mif_index); |
| |
| if (off == DIM_ERR || !reg) { |
| PR_ERR("%s:\n", __func__); |
| return; |
| } |
| dbg_ic("%s:id[%d]\n", __func__, mif_index); |
| if (mif->set_separate_en != 0 && mif->src_field_mode == 1) { |
| if (mif->video_mode == 0) |
| chro_rpt_lastl_ctrl = 1; |
| else |
| chro_rpt_lastl_ctrl = 0; |
| |
| luma0_rpt_loop_start = 1; |
| luma0_rpt_loop_end = 1; |
| chroma0_rpt_loop_start = 1; |
| chroma0_rpt_loop_end = 1; |
| luma0_rpt_loop_pat = 0x80; |
| chroma0_rpt_loop_pat = 0x80; |
| } else if (mif->set_separate_en != 0 && mif->src_field_mode == 0) { |
| if (mif->video_mode == 0) |
| chro_rpt_lastl_ctrl = 1; |
| else |
| chro_rpt_lastl_ctrl = 0; |
| |
| luma0_rpt_loop_start = 0; |
| luma0_rpt_loop_end = 0; |
| chroma0_rpt_loop_start = 0; |
| chroma0_rpt_loop_end = 0; |
| luma0_rpt_loop_pat = 0x0; |
| chroma0_rpt_loop_pat = 0x0; |
| } else if (mif->set_separate_en == 0 && mif->src_field_mode == 1) { |
| chro_rpt_lastl_ctrl = 0; |
| luma0_rpt_loop_start = 1; |
| luma0_rpt_loop_end = 1; |
| chroma0_rpt_loop_start = 0; |
| chroma0_rpt_loop_end = 0; |
| luma0_rpt_loop_pat = 0x80; |
| chroma0_rpt_loop_pat = 0x00; |
| op->wr(off + reg[MIF_LUMA_FIFO_SIZE], 0xC0); |
| } else { |
| chro_rpt_lastl_ctrl = 0; |
| luma0_rpt_loop_start = 0; |
| luma0_rpt_loop_end = 0; |
| chroma0_rpt_loop_start = 0; |
| chroma0_rpt_loop_end = 0; |
| luma0_rpt_loop_pat = 0x00; |
| chroma0_rpt_loop_pat = 0x00; |
| op->wr(off + reg[MIF_LUMA_FIFO_SIZE], 0xC0); |
| } |
| |
| if (DIM_IS_ICS(T5W)) { |
| //axi bus fifo from feijun.fan for t5w |
| op->wr(DI_SC2_IF0_LUMA_FIFO_SIZE, 0x80); |
| op->wr(DI_SC2_IF2_LUMA_FIFO_SIZE, 0x80); |
| } |
| |
| bytes_per_pixel = (mif->set_separate_en) ? |
| 0 : ((mif->video_mode == 2) ? 2 : 1); |
| |
| bytes_per_pixel = mif->bit_mode == 3 ? 1 : bytes_per_pixel; |
| // 10bit full pack or not |
| |
| demux_mode = (mif->set_separate_en == 0) ? |
| ((mif->video_mode == 1) ? 0 : 1) : 0; |
| |
| // ---------------------- |
| // General register |
| // ---------------------- |
| if (mif_index == DI_MIF0_ID_INP || mif->dbg_from_dec) { |
| if (mif->canvas_w % 32) |
| burst_len = 0; |
| else if (mif->canvas_w % 64) |
| burst_len = 1; |
| |
| if (mif->block_mode) { |
| if (burst_len >= 1) |
| burst_len = 1; |
| } else { |
| if (burst_len >= 2) |
| burst_len = 2; |
| } |
| } |
| dim_print("burst_len=%d\n", burst_len); |
| if (mif->linear) { |
| op->wr(off + reg[MIF_GEN_REG3], |
| 7 << 24 | |
| mif->block_mode << 22 | |
| mif->block_mode << 20 | |
| mif->block_mode << 18 | |
| burst_len << 14 | //2 << 1 | // use bst4 |
| burst_len << 12 | //2 << 1 | // use bst4 |
| mif->bit_mode << 8 | // bits_mode |
| 3 << 4 | // block length |
| burst_len << 1 | //2 << 1 | // use bst4 |
| mif->reg_swap << 0); //64 bit swap |
| } else { |
| op->wr(off + reg[MIF_GEN_REG3], |
| mif->bit_mode << 8 | // bits_mode |
| 3 << 4 | // block length |
| burst_len << 1 | //2 << 1 | // use bst4 |
| mif->reg_swap << 0); //64 bit swap |
| } |
| |
| if (!is_mask(SC2_REG_MSK_GEN_PRE)) { |
| op->wr(off + reg[MIF_GEN_REG], |
| (reset_bit << 29) | // reset on go field |
| (urgent << 28) | // chroma urgent bit |
| (urgent << 27) | // luma urgent bit. |
| (1 << 25) | // no dummy data. |
| (hold_line << 19) | // hold lines |
| (1 << 18) | // push dummy pixel |
| (demux_mode << 16) | // demux_mode |
| (bytes_per_pixel << 14) | |
| (mif->burst_size_cr << 12) | |
| (mif->burst_size_cb << 10) | |
| (mif->burst_size_y << 8) | |
| (chro_rpt_lastl_ctrl << 6) | |
| (mif->l_endian << 4) | /* 2020-12-29 ?*/ |
| ((mif->set_separate_en != 0) << 1) | |
| (1 << 0) // cntl_enable |
| ); |
| } |
| if (mif->set_separate_en == 2) { |
| // Enable NV12 Display |
| op->wr(off + reg[MIF_GEN_REG2], 1); |
| if (mif->cbcr_swap) |
| op->bwr(off + reg[MIF_GEN_REG2], 2, 0, 2); |
| } else { |
| op->wr(off + reg[MIF_GEN_REG2], 0); |
| } |
| |
| // reverse X and Y |
| op->bwr(off + reg[MIF_GEN_REG2], ((mif->rev_y << 1) | |
| (mif->rev_x)), 2, 2); |
| |
| // ---------------------- |
| // Canvas |
| // ---------------------- |
| if (mif->linear) |
| di_mif0_linear_rd_cfg(mif, mif_index, op); |
| else |
| op->wr(off + reg[MIF_CANVAS0], (mif->canvas0_addr2 << 16) | |
| // cntl_canvas0_addr2 |
| (mif->canvas0_addr1 << 8) | // cntl_canvas0_addr1 |
| (mif->canvas0_addr0 << 0) // cntl_canvas0_addr0 |
| ); |
| |
| // ---------------------- |
| // Picture 0 X/Y start,end |
| // ---------------------- |
| op->wr(off + reg[MIF_LUMA_X0], (mif->luma_x_end0 << 16) | |
| // cntl_luma_x_end0 |
| (mif->luma_x_start0 << 0) // cntl_luma_x_start0 |
| ); |
| op->wr(off + reg[MIF_LUMA_Y0], (mif->luma_y_end0 << 16) | |
| // cntl_luma_y_end0 |
| (mif->luma_y_start0 << 0) // cntl_luma_y_start0 |
| ); |
| op->wr(off + reg[MIF_CHROMA_X0], (mif->chroma_x_end0 << 16) | |
| (mif->chroma_x_start0 << 0) |
| ); |
| op->wr(off + reg[MIF_CHROMA_Y0], (mif->chroma_y_end0 << 16) | |
| (mif->chroma_y_start0 << 0) |
| ); |
| |
| // ---------------------- |
| // Repeat or skip |
| // ---------------------- |
| op->wr(off + reg[MIF_RPT_LOOP], (0 << 28) | |
| (0 << 24) | |
| (0 << 20) | |
| (0 << 16) | |
| (chroma0_rpt_loop_start << 12) | |
| (chroma0_rpt_loop_end << 8) | |
| (luma0_rpt_loop_start << 4) | |
| (luma0_rpt_loop_end << 0)); |
| |
| op->wr(off + reg[MIF_LUMA0_RPT_PAT], luma0_rpt_loop_pat); |
| op->wr(off + reg[MIF_CHROMA0_RPT_PAT], chroma0_rpt_loop_pat); |
| |
| // Dummy pixel value |
| op->wr(off + reg[MIF_DUMMY_PIXEL], 0x00808000); |
| if (mif->video_mode == 0) {// 4:2:0 block mode. |
| hfmt_en = 1; |
| hz_yc_ratio = 1; |
| hz_ini_phase = 0; |
| vfmt_en = 1; |
| vt_yc_ratio = 1; |
| vt_ini_phase = 0; |
| y_length = mif->luma_x_end0 - mif->luma_x_start0 + 1; |
| c_length = mif->chroma_x_end0 - mif->chroma_x_start0 + 1; |
| hz_rpt = 0; |
| } else if (mif->video_mode == 1) { |
| hfmt_en = 1; |
| hz_yc_ratio = 1; |
| hz_ini_phase = 0; |
| vfmt_en = 0; |
| vt_yc_ratio = 0; |
| vt_ini_phase = 0; |
| y_length = mif->luma_x_end0 - mif->luma_x_start0 + 1; |
| c_length = ((mif->luma_x_end0 >> 1) - |
| (mif->luma_x_start0 >> 1) + 1); |
| hz_rpt = 0; |
| } else if (mif->video_mode == 2) { |
| hfmt_en = 0; |
| hz_yc_ratio = 1; |
| hz_ini_phase = 0; |
| vfmt_en = 0; |
| vt_yc_ratio = 0; |
| vt_ini_phase = 0; |
| y_length = mif->luma_x_end0 - mif->luma_x_start0 + 1; |
| c_length = mif->luma_x_end0 - mif->luma_x_start0 + 1; |
| hz_rpt = 0; |
| } |
| vt_phase_step = (16 >> vt_yc_ratio); |
| |
| if (mif->set_separate_en != 0 && mif->src_field_mode == 1 && off == 0) { |
| vfmt_rpt_first = 1; |
| if (mif->output_field_num == 0) |
| vt_ini_phase = 0xe; |
| else |
| vt_ini_phase = 0xa; |
| |
| if (mif->src_prog) { |
| if (mif->output_field_num == 0) { |
| vt_ini_phase = 0xc; |
| } else { |
| vt_ini_phase = 0x4; |
| vfmt_rpt_first = 0; |
| } |
| } |
| nrpt_phase0_en = 0; |
| } |
| |
| op->wr(off + reg[MIF_FMT_CTRL], |
| (hz_rpt << 28) | //hz rpt pixel |
| (hz_ini_phase << 24) | //hz ini phase |
| (0 << 23) | //repeat p0 enable |
| (hz_yc_ratio << 21) | //hz yc ratio |
| (hfmt_en << 20) | //hz enable |
| (nrpt_phase0_en << 17) | //nrpt_phase0 enable |
| (vfmt_rpt_first << 16) | //repeat l0 enable |
| (0 << 12) | //skip line num |
| (vt_ini_phase << 8) | //vt ini phase |
| (vt_phase_step << 1) | //vt phase step (3.4) |
| (vfmt_en << 0) //vt enable |
| ); |
| |
| op->wr(off + reg[MIF_FMT_W], (y_length << 16) | |
| //hz format width |
| (c_length << 0)); //vt format width |
| } |
| |
| /**************************************************/ |
| void mif_reg_wr_v3(enum DI_MIF0_ID mif_index, const struct reg_acc *op, |
| unsigned int reg, unsigned int val) |
| { |
| unsigned int off; |
| |
| off = di_mif_add_get_offset_v3(mif_index); |
| op->wr((off + reg), val); |
| } |
| |
| unsigned int mif_reg_rd_v3(enum DI_MIF0_ID mif_index, const struct reg_acc *op, |
| unsigned int reg) |
| { |
| unsigned int off; |
| |
| off = di_mif_add_get_offset_v3(mif_index); |
| return op->rd(off + reg); |
| } |
| |
| static void hw_init_v3(void) |
| { |
| unsigned short fifo_size_vpp = 0xc0; |
| unsigned short fifo_size_di = 0xc0; |
| const struct reg_acc *op = &di_pre_regset; |
| unsigned int path_sel; |
| |
| if (DIM_IS_IC_EF(TXL)) { |
| /* vpp fifo max size on txl :128*3=384[0x180] */ |
| /* di fifo max size on txl :96*3=288[0x120] */ |
| fifo_size_vpp = 0x180; |
| fifo_size_di = 0x120; |
| } |
| |
| if (DIM_IS_IC_EF(SC2)) { |
| /*pre*/ |
| op->wr(DI_SC2_INP_LUMA_FIFO_SIZE, fifo_size_di); |
| op->wr(DI_SC2_MEM_LUMA_FIFO_SIZE, fifo_size_di); |
| op->wr(DI_SC2_CHAN2_LUMA_FIFO_SIZE, fifo_size_di); |
| |
| /*post*/ |
| //op->wr(DI_SC2_IF0_LUMA_FIFO_SIZE, fifo_size_di); |
| op->wr(DI_SC2_IF1_LUMA_FIFO_SIZE, fifo_size_di); |
| //op->wr(DI_SC2_IF2_LUMA_FIFO_SIZE, fifo_size_di); |
| |
| if (DIM_IS_ICS(T5W)) { |
| //axi bus fifo from feijun.fan for t5w |
| op->wr(DI_SC2_IF0_LUMA_FIFO_SIZE, 0x80); |
| op->wr(DI_SC2_IF2_LUMA_FIFO_SIZE, 0x80); |
| } else { |
| op->wr(DI_SC2_IF0_LUMA_FIFO_SIZE, fifo_size_di); |
| op->wr(DI_SC2_IF2_LUMA_FIFO_SIZE, fifo_size_di); |
| } |
| |
| path_sel = 1; |
| op->bwr(DI_TOP_PRE_CTRL, (path_sel & 0x3), 0, 2); |
| //post_path_sel |
| op->bwr(DI_TOP_POST_CTRL, (path_sel & 0x3), 0, 2); |
| //post_path_sel |
| //op->wr(DI_INTR_CTRL,0xcfff0000); |
| op->wr(DI_INTR_CTRL, 0xcffe0000); |
| |
| PR_INF("%s:\n", __func__); |
| PR_INF("\t0x%x:0x%x\n", DI_TOP_PRE_CTRL, |
| op->rd(DI_TOP_PRE_CTRL)); |
| PR_INF("\t0x%x:0x%x\n", DI_TOP_POST_CTRL, |
| op->rd(DI_TOP_POST_CTRL)); |
| PR_INF("\t0x%x:0x%x\n", DI_INTR_CTRL, op->rd(DI_INTR_CTRL)); |
| |
| } else if (DIM_IS_IC_EF(G12A)) { |
| /* pre */ |
| DIM_DI_WR(DI_INP_LUMA_FIFO_SIZE, fifo_size_di); |
| /* 17d8 is DI_INP_luma_fifo_size */ |
| DIM_DI_WR(DI_MEM_LUMA_FIFO_SIZE, fifo_size_di); |
| /* 17e5 is DI_MEM_luma_fifo_size */ |
| DIM_DI_WR(DI_CHAN2_LUMA_FIFO_SIZE, fifo_size_di); |
| |
| DIM_DI_WR(DI_IF1_LUMA_FIFO_SIZE, fifo_size_di); |
| /* 17f2 is DI_IF1_luma_fifo_size */ |
| DIM_DI_WR(DI_IF2_LUMA_FIFO_SIZE, fifo_size_di); |
| /* 201a is if2 fifo size */ |
| |
| } else { |
| /* video */ |
| DIM_DI_WR(VD1_IF0_LUMA_FIFO_SIZE, fifo_size_vpp); |
| DIM_DI_WR(VD2_IF0_LUMA_FIFO_SIZE, fifo_size_vpp); |
| /* 1a83 is vd2_if0_luma_fifo_size */ |
| |
| /* pre */ |
| DIM_DI_WR(DI_INP_LUMA_FIFO_SIZE, fifo_size_di); |
| /* 17d8 is DI_INP_luma_fifo_size */ |
| DIM_DI_WR(DI_MEM_LUMA_FIFO_SIZE, fifo_size_di); |
| /* 17e5 is DI_MEM_luma_fifo_size */ |
| DIM_DI_WR(DI_CHAN2_LUMA_FIFO_SIZE, fifo_size_di); |
| |
| /* post */ |
| DIM_DI_WR(DI_IF1_LUMA_FIFO_SIZE, fifo_size_di); |
| /* 17f2 is DI_IF1_luma_fifo_size */ |
| if (DIM_IS_IC_EF(TXL)) |
| DIM_DI_WR(DI_IF2_LUMA_FIFO_SIZE, fifo_size_di); |
| /* 201a is if2 fifo size */ |
| } |
| } |
| |
| static void di_pre_data_mif_ctrl_v3(bool enable) |
| { |
| const struct reg_acc *op = &di_pre_regset; |
| |
| if (DIM_IS_IC_BF(SC2)) { |
| PR_ERR("%s:\n", __func__); |
| return; |
| } |
| if (enable) { |
| if (dim_afds() && dim_afds()->is_used()) |
| dim_afds()->inp_sw(true); |
| |
| if (dim_afds() && !dim_afds()->is_used_chan2()) |
| op->bwr(DI_SC2_CHAN2_GEN_REG, 1, 0, 1); |
| |
| if (dim_afds() && !dim_afds()->is_used_mem()) |
| op->bwr(DI_SC2_MEM_GEN_REG, 1, 0, 1); |
| |
| if (dim_afds() && !dim_afds()->is_used_inp()) |
| op->bwr(DI_SC2_INP_GEN_REG, 1, 0, 1); |
| |
| /* nrwr no clk gate en=0 */ |
| /*DIM_RDMA_WR_BITS(DI_NRWR_CTRL, 0, 24, 1);*/ |
| } else { |
| /* nrwr no clk gate en=1 */ |
| /*DIM_RDMA_WR_BITS(DI_NRWR_CTRL, 1, 24, 1);*/ |
| /* nr wr req en =0 */ |
| op->bwr(DI_PRE_CTRL, 0, 0, 1); |
| |
| /* disable input mif*/ |
| |
| op->bwr(DI_SC2_CHAN2_GEN_REG, 0, 0, 1); |
| |
| op->bwr(DI_SC2_MEM_GEN_REG, 0, 0, 1); |
| |
| op->bwr(DI_SC2_INP_GEN_REG, 0, 0, 1); |
| |
| /* disable AFBC input */ |
| //if (afbc_is_used()) { |
| if (dim_afds() && dim_afds()->is_used()) { |
| //afbc_input_sw(false); |
| if (dim_afds()) |
| dim_afds()->inp_sw(false); |
| } |
| } |
| } |
| |
| /*below for post */ |
| static void post_mif_sw_v3(bool on, enum DI_MIF0_SEL sel) |
| { |
| const struct reg_acc *op = &di_pre_regset; |
| |
| if (DIM_IS_IC_BF(SC2)) { |
| PR_ERR("%s:\n", __func__); |
| return; |
| } |
| |
| if (on) { |
| if (sel & DI_MIF0_SEL_IF0) |
| op->bwr(DI_SC2_IF0_GEN_REG, 1, 0, 1); |
| if (sel & DI_MIF0_SEL_IF1) |
| op->bwr(DI_SC2_IF1_GEN_REG, 1, 0, 1); |
| if (sel & DI_MIF0_SEL_IF2) |
| op->bwr(DI_SC2_IF2_GEN_REG, 1, 0, 1); |
| |
| if ((sel & DI_MIF0_SEL_PST_ALL) == DI_MIF0_SEL_PST_ALL) |
| op->bwr(DI_POST_CTRL, 1, 4, 1); /*di_wr_bk_en*/ |
| } else { |
| if (sel & DI_MIF0_SEL_IF0) |
| op->bwr(DI_SC2_IF0_GEN_REG, 0, 0, 1); |
| if (sel & DI_MIF0_SEL_IF1) |
| op->bwr(DI_SC2_IF1_GEN_REG, 0, 0, 1); |
| if (sel & DI_MIF0_SEL_IF2) |
| op->bwr(DI_SC2_IF2_GEN_REG, 0, 0, 1); |
| |
| if ((sel & DI_MIF0_SEL_PST_ALL) == DI_MIF0_SEL_PST_ALL) |
| op->bwr(DI_POST_CTRL, 0, 4, 1); /*di_wr_bk_en*/ |
| } |
| dim_print("%s:%d\n", __func__, on); |
| } |
| |
| static void post_mif_rst_v3(enum DI_MIF0_SEL sel) |
| { |
| const struct reg_acc *op = &di_pre_regset; |
| |
| if (DIM_IS_IC_BF(SC2)) { |
| PR_ERR("%s:\n", __func__); |
| return; |
| } |
| //bit 31: enable free clk |
| //bit 30: sw reset : pulse bit |
| if (sel & DI_MIF0_SEL_IF0) |
| op->wr(DI_SC2_IF0_GEN_REG, 0x3 << 30); |
| |
| if (sel & DI_MIF0_SEL_IF1) |
| op->wr(DI_SC2_IF1_GEN_REG, 0x3 << 30); |
| if (sel & DI_MIF0_SEL_IF2) |
| op->wr(DI_SC2_IF2_GEN_REG, 0x3 << 30); |
| } |
| |
| static void post_mif_rev_v3(bool rev, enum DI_MIF0_SEL sel) |
| { |
| const struct reg_acc *op = &di_pre_regset; |
| |
| if (DIM_IS_IC_BF(SC2)) { |
| PR_ERR("%s:\n", __func__); |
| return; |
| } |
| |
| if (rev) { |
| if (sel & DI_MIF0_SEL_IF0) |
| op->bwr(DI_SC2_IF0_GEN_REG2, 3, 2, 2); |
| if (sel & DI_MIF0_SEL_IF1) |
| op->bwr(DI_SC2_IF1_GEN_REG2, 3, 2, 2); |
| if (sel & DI_MIF0_SEL_IF2) |
| op->bwr(DI_SC2_IF2_GEN_REG2, 3, 2, 2); |
| #ifdef MARK_SC2 // don't set vd1/vd2 |
| if (sel & DI_MIF0_SEL_VD1_IF0) |
| DIM_VSC_WR_MPG_BT(VD1_IF0_GEN_REG2, 0xf, 2, 4); |
| if (sel & DI_MIF0_SEL_VD2_IF0) |
| DIM_VSC_WR_MPG_BT(VD2_IF0_GEN_REG2, 0xf, 2, 4); |
| #endif |
| } else { |
| if (sel & DI_MIF0_SEL_IF0) |
| op->bwr(DI_SC2_IF0_GEN_REG2, 0, 2, 2); |
| if (sel & DI_MIF0_SEL_IF1) |
| op->bwr(DI_SC2_IF1_GEN_REG2, 0, 2, 2); |
| if (sel & DI_MIF0_SEL_IF2) |
| op->bwr(DI_SC2_IF2_GEN_REG2, 0, 2, 2); |
| #ifdef MARK_SC2 |
| if (sel & DI_MIF0_SEL_VD1_IF0) |
| DIM_VSC_WR_MPG_BT(VD1_IF0_GEN_REG2, 0, 2, 4); |
| if (sel & DI_MIF0_SEL_VD2_IF0) |
| DIM_VSC_WR_MPG_BT(VD2_IF0_GEN_REG2, 0, 2, 4); |
| #endif |
| } |
| } |
| |
| static void pst_mif_update_canvasid_v3(struct DI_MIF_S *mif, |
| enum DI_MIF0_ID mif_index, |
| const struct reg_acc *opin) |
| { |
| //const struct reg_acc *op = &sc2reg; |
| const struct reg_acc *op; |
| |
| if (!opin) |
| op = &di_pre_regset; |
| else |
| op = opin; |
| |
| if (DIM_IS_IC_BF(SC2)) { |
| PR_ERR("%s:\n", __func__); |
| return; |
| } |
| |
| if (mif->linear) { |
| di_mif0_linear_rd_cfg(mif, mif_index, op); |
| dbg_ic("%s:linar\n", __func__); |
| return; |
| } |
| switch (mif_index) { |
| case DI_MIF0_ID_IF1: |
| op->wr(DI_SC2_IF1_CANVAS0, |
| (mif->canvas0_addr2 << 16) | |
| (mif->canvas0_addr1 << 8) | |
| (mif->canvas0_addr0 << 0)); |
| |
| break; |
| case DI_MIF0_ID_IF0: |
| |
| op->wr(DI_SC2_IF0_CANVAS0, |
| (mif->canvas0_addr2 << 16) | |
| (mif->canvas0_addr1 << 8) | |
| (mif->canvas0_addr0 << 0)); |
| |
| break; |
| case DI_MIF0_ID_IF2: |
| op->wr(DI_SC2_IF2_CANVAS0, |
| (mif->canvas0_addr2 << |
| 16) | |
| (mif->canvas0_addr1 << |
| 8) | |
| (mif->canvas0_addr0 << |
| 0)); |
| break; |
| default: |
| PR_ERR("%s:overflow[%d]\n", __func__, mif_index); |
| break; |
| } |
| } |
| |
| static void post_bit_mode_cfg_v3(unsigned char if0, |
| unsigned char if1, |
| unsigned char if2, |
| unsigned char post_wr) |
| { |
| const struct reg_acc *op = &di_pre_regset; |
| |
| if (DIM_IS_IC_BF(SC2)) { |
| PR_ERR("%s:\n", __func__); |
| return; |
| } |
| |
| op->bwr(DI_SC2_IF0_GEN_REG3, if0 & 0x3, 8, 2); |
| |
| op->bwr(DI_SC2_IF1_GEN_REG3, if1 & 0x3, 8, 2); |
| op->bwr(DI_SC2_IF2_GEN_REG3, if2 & 0x3, 8, 2); |
| } |
| |
| #ifdef MARK_SC2 |
| void dim_hw_init_reg_sc2(void)/* this is debug for check speed*/ |
| { |
| unsigned short fifo_size_post = 0x120;/*feijun 08-02*/ |
| |
| if (DIM_IS_IC_EF(SC2)) { |
| DIM_DI_WR(DI_IF1_LUMA_FIFO_SIZE, fifo_size_post); |
| /* 17f2 is DI_IF1_luma_fifo_size */ |
| DIM_DI_WR(DI_IF2_LUMA_FIFO_SIZE, fifo_size_post); |
| DIM_DI_WR(DI_IF0_LUMA_FIFO_SIZE, fifo_size_post); |
| } |
| |
| PR_INF("%s, 0x%x\n", __func__, DIM_RDMA_RD(DI_IF0_LUMA_FIFO_SIZE)); |
| } |
| |
| #endif |
| |
| static void dbg_reg_pre_mif_print_v3(void) |
| { |
| const struct reg_acc *op = &di_pre_regset; |
| |
| if (DIM_IS_IC_BF(SC2)) { |
| PR_ERR("%s:\n", __func__); |
| return; |
| } |
| pr_info("DI_INP_GEN_REG=0x%x\n", op->rd(DI_SC2_INP_GEN_REG)); |
| pr_info("DI_MEM_GEN_REG=0x%x\n", op->rd(DI_SC2_MEM_GEN_REG)); |
| pr_info("DI_CHAN2_GEN_REG=0x%x\n", op->rd(DI_SC2_CHAN2_GEN_REG)); |
| } |
| |
| static void dbg_reg_pst_mif_print_v3(void) |
| { |
| const struct reg_acc *op = &di_pre_regset; |
| |
| if (DIM_IS_IC_BF(SC2)) { |
| PR_ERR("%s:\n", __func__); |
| return; |
| } |
| pr_info("DI_IF0_GEN_REG=0x%x\n", op->rd(DI_SC2_IF0_GEN_REG)); |
| pr_info("DI_IF1_GEN_REG=0x%x\n", op->rd(DI_SC2_IF1_GEN_REG)); |
| pr_info("DI_IF2_GEN_REG=0x%x\n", op->rd(DI_SC2_IF2_GEN_REG)); |
| } |
| |
| static void dbg_reg_pre_mif_v3_show(struct seq_file *s) |
| { |
| const struct reg_acc *op = &di_pre_regset; |
| |
| if (DIM_IS_IC_BF(SC2)) { |
| PR_ERR("%s:\n", __func__); |
| return; |
| } |
| seq_printf(s, "DI_INP_GEN_REG=0x%x\n", op->rd(DI_SC2_INP_GEN_REG)); |
| seq_printf(s, "DI_MEM_GEN_REG=0x%x\n", op->rd(DI_SC2_MEM_GEN_REG)); |
| seq_printf(s, "DI_CHAN2_GEN_REG=0x%x\n", op->rd(DI_SC2_CHAN2_GEN_REG)); |
| } |
| |
| static void dbg_reg_pst_mif_v3_show(struct seq_file *s) |
| { |
| const struct reg_acc *op = &di_pre_regset; |
| |
| if (DIM_IS_IC_BF(SC2)) { |
| PR_ERR("%s:\n", __func__); |
| return; |
| } |
| seq_printf(s, "DI_IF0_GEN_REG=0x%x\n", op->rd(DI_SC2_IF0_GEN_REG)); |
| seq_printf(s, "DI_IF1_GEN_REG=0x%x\n", op->rd(DI_SC2_IF1_GEN_REG)); |
| seq_printf(s, "DI_IF2_GEN_REG=0x%x\n", op->rd(DI_SC2_IF2_GEN_REG)); |
| } |
| |
| static void dbg_reg_pre_mif_print2_v3(void) |
| { |
| unsigned int i = 0; |
| const struct reg_acc *op = &di_pre_regset; |
| |
| if (DIM_IS_IC_BF(SC2)) { |
| PR_ERR("%s:\n", __func__); |
| return; |
| } |
| |
| //op->bwr(DI_SC2_INP_GEN_REG3, 3, 10, 2); |
| //op->bwr(DI_SC2_MEM_GEN_REG3, 3, 10, 2); |
| //op->bwr(DI_SC2_CHAN2_GEN_REG3, 3, 10, 2); |
| pr_info("mif:inp:\n"); |
| pr_info("\tDI_INP_GEN_REG2=0x%x.\n", op->rd(DI_SC2_INP_GEN_REG2)); |
| pr_info("\tDI_INP_GEN_REG3=0x%x.\n", op->rd(DI_SC2_INP_GEN_REG3)); |
| for (i = 0; i < 10; i++) |
| pr_info("\t\t0x%8x=0x%8x.\n", DI_SC2_INP_GEN_REG + i, |
| op->rd(DI_SC2_INP_GEN_REG + i)); |
| pr_info("mif:mem:\n"); |
| pr_info("\tDI_MEM_GEN_REG2=0x%x.\n", op->rd(DI_SC2_MEM_GEN_REG2)); |
| pr_info("\tDI_MEM_GEN_REG3=0x%x.\n", op->rd(DI_SC2_MEM_GEN_REG3)); |
| pr_info("\tDI_MEM_LUMA_FIFO_SIZE=0x%x.\n", |
| op->rd(DI_SC2_MEM_LUMA_FIFO_SIZE)); |
| for (i = 0; i < 10; i++) |
| pr_info("\t\t0x%8x=0x%8x.\n", DI_SC2_MEM_GEN_REG + i, |
| op->rd(DI_SC2_MEM_GEN_REG + i)); |
| pr_info("\tDI_CHAN2_GEN_REG2=0x%x.\n", op->rd(DI_SC2_CHAN2_GEN_REG2)); |
| pr_info("\tDI_CHAN2_GEN_REG3=0x%x.\n", op->rd(DI_SC2_CHAN2_GEN_REG3)); |
| pr_info("\tDI_CHAN2_LUMA_FIFO_SIZE=0x%x.\n", |
| op->rd(DI_SC2_CHAN2_LUMA_FIFO_SIZE)); |
| for (i = 0; i < 10; i++) |
| pr_info("\t\t0x%8x=0x%8x.\n", DI_SC2_CHAN2_GEN_REG + i, |
| op->rd(DI_SC2_CHAN2_GEN_REG + i)); |
| } |
| |
| static void dbg_reg_pst_mif_print2_v3(void) |
| { |
| const struct reg_acc *op = &di_pre_regset; |
| |
| if (DIM_IS_IC_BF(SC2)) { |
| PR_ERR("%s:\n", __func__); |
| return; |
| } |
| pr_info("VIU_MISC_CTRL0=0x%x\n", op->rd(VIU_MISC_CTRL0)); |
| #ifdef MARK_SC2 /* */ |
| pr_info("VD1_IF0_GEN_REG=0x%x\n", op->rd(VD1_IF0_GEN_REG)); |
| pr_info("VD1_IF0_GEN_REG2=0x%x\n", op->rd(VD1_IF0_GEN_REG2)); |
| pr_info("VD1_IF0_GEN_REG3=0x%x\n", op->rd(VD1_IF0_GEN_REG3)); |
| pr_info("VD1_IF0_LUMA_X0=0x%x\n", op->rd(VD1_IF0_LUMA_X0)); |
| pr_info("VD1_IF0_LUMA_Y0=0x%x\n", op->rd(VD1_IF0_LUMA_Y0)); |
| pr_info("VD1_IF0_CHROMA_X0=0x%x\n", op->rd(VD1_IF0_CHROMA_X0)); |
| pr_info("VD1_IF0_CHROMA_Y0=0x%x\n", op->rd(VD1_IF0_CHROMA_Y0)); |
| pr_info("VD1_IF0_LUMA_X1=0x%x\n", op->rd(VD1_IF0_LUMA_X1)); |
| pr_info("VD1_IF0_LUMA_Y1=0x%x\n", op->rd(VD1_IF0_LUMA_Y1)); |
| pr_info("VD1_IF0_CHROMA_X1=0x%x\n", op->rd(VD1_IF0_CHROMA_X1)); |
| pr_info("VD1_IF0_CHROMA_Y1=0x%x\n", op->rd(VD1_IF0_CHROMA_Y1)); |
| pr_info("VD1_IF0_REPEAT_LOOP=0x%x\n", op->rd(VD1_IF0_RPT_LOOP)); |
| pr_info("VD1_IF0_LUM0_RPT_PAT=0x%x\n", op->rd(VD1_IF0_LUMA0_RPT_PAT)); |
| pr_info("VD1_IF0_CHM0_RPT_PAT=0x%x\n", op->rd(VD1_IF0_CHROMA0_RPT_PAT)); |
| pr_info("VD1_IF0_LUMA_PSEL=0x%x\n", op->rd(VD1_IF0_LUMA_PSEL)); |
| pr_info("VD1_IF0_CHROMA_PSEL=0x%x\n", op->rd(VD1_IF0_CHROMA_PSEL)); |
| pr_info("VIU_VD1_FMT_CTRL=0x%x\n", op->rd(VIU_VD1_FMT_CTRL)); |
| pr_info("VIU_VD1_FMT_W=0x%x\n", op->rd(VIU_VD1_FMT_W)); |
| #endif |
| pr_info("DI_IF1_GEN_REG=0x%x\n", op->rd(DI_SC2_IF1_GEN_REG)); |
| pr_info("DI_IF1_GEN_REG2=0x%x\n", op->rd(DI_SC2_IF1_GEN_REG2)); |
| pr_info("DI_IF1_GEN_REG3=0x%x\n", op->rd(DI_SC2_IF1_GEN_REG3)); |
| pr_info("DI_IF1_CANVAS0=0x%x\n", op->rd(DI_SC2_IF1_CANVAS0)); |
| pr_info("DI_IF1_LUMA_X0=0x%x\n", op->rd(DI_SC2_IF1_LUMA_X0)); |
| pr_info("DI_IF1_LUMA_Y0=0x%x\n", op->rd(DI_SC2_IF1_LUMA_Y0)); |
| pr_info("DI_IF1_CHROMA_X0=0x%x\n", op->rd(DI_SC2_IF1_CHROMA_X0)); |
| pr_info("DI_IF1_CHROMA_Y0=0x%x\n", op->rd(DI_SC2_IF1_CHROMA_Y0)); |
| pr_info("DI_IF1_LMA0_RPT_PAT=0x%x\n", op->rd(DI_SC2_IF1_LUMA0_RPT_PAT)); |
| pr_info("DI_IF1_CHM0_RPT_PAT=0x%x\n", op->rd(DI_SC2_IF1_LUMA0_RPT_PAT)); |
| pr_info("DI_IF1_FMT_CTRL=0x%x\n", op->rd(DI_SC2_IF1_CFMT_CTRL)); |
| pr_info("DI_IF1_FMT_W=0x%x\n", op->rd(DI_SC2_IF1_CFMT_W)); |
| |
| pr_info("DI_IF2_GEN_REG=0x%x\n", op->rd(DI_SC2_IF2_GEN_REG)); |
| pr_info("DI_IF2_GEN_REG2=0x%x\n", op->rd(DI_SC2_IF2_GEN_REG2)); |
| pr_info("DI_IF2_GEN_REG3=0x%x\n", op->rd(DI_SC2_IF2_GEN_REG3)); |
| pr_info("DI_IF2_CANVAS0=0x%x\n", op->rd(DI_SC2_IF2_CANVAS0)); |
| pr_info("DI_IF2_LUMA_X0=0x%x\n", op->rd(DI_SC2_IF2_LUMA_X0)); |
| pr_info("DI_IF2_LUMA_Y0=0x%x\n", op->rd(DI_SC2_IF2_LUMA_Y0)); |
| pr_info("DI_IF2_CHROMA_X0=0x%x\n", op->rd(DI_SC2_IF2_CHROMA_X0)); |
| pr_info("DI_IF2_CHROMA_Y0=0x%x\n", op->rd(DI_SC2_IF2_CHROMA_Y0)); |
| pr_info("DI_IF2_LUM0_RPT_PAT=0x%x\n", op->rd(DI_SC2_IF2_LUMA0_RPT_PAT)); |
| pr_info("DI_IF2_CHM0_RPT_PAT=0x%x\n", op->rd(DI_SC2_IF2_LUMA0_RPT_PAT)); |
| pr_info("DI_IF2_FMT_CTRL=0x%x\n", op->rd(DI_SC2_IF2_CFMT_CTRL)); |
| pr_info("DI_IF2_FMT_W=0x%x\n", op->rd(DI_SC2_IF2_CFMT_W)); |
| |
| pr_info("DI_DIWR_Y=0x%x\n", op->rd(DI_SC2_DIWR_Y)); |
| pr_info("DI_DIWR_CTRL=0x%x", op->rd(DI_SC2_DIWR_CTRL)); |
| pr_info("DI_DIWR_X=0x%x.\n", op->rd(DI_SC2_DIWR_X)); |
| } |
| |
| /* this is for pre mif */ |
| void config_di_mif_v3(struct DI_MIF_S *di_mif, |
| enum DI_MIF0_ID mif_index, |
| struct di_buf_s *di_buf, |
| unsigned int ch) |
| { |
| struct di_pre_stru_s *ppre = get_pre_stru(ch); |
| |
| if (!di_buf) |
| return; |
| |
| di_mif->canvas0_addr0 = |
| di_buf->vframe->canvas0Addr & 0xff; |
| di_mif->canvas0_addr1 = |
| (di_buf->vframe->canvas0Addr >> 8) & 0xff; |
| di_mif->canvas0_addr2 = |
| (di_buf->vframe->canvas0Addr >> 16) & 0xff; |
| |
| if (dip_is_linear()) {//ary tmp, need add nv21 |
| //dbg_ic("%s:%d:linear\n", __func__, ); |
| di_mif->linear = 1; |
| //di_mif->addr0 = di_buf->nr_adr; |
| if (mif_index == DI_MIF0_ID_INP || di_mif->dbg_from_dec) { |
| dbg_ic("%s:inp not change addr\n", __func__); |
| } else { |
| di_mif->addr0 = di_buf->nr_adr; |
| di_mif->buf_crop_en = 1; |
| //di_mif->buf_hsize = 1920; //tmp |
| di_mif->buf_hsize = di_buf->buf_hsize; |
| |
| di_mif->block_mode = 0; |
| dbg_ic("%s:addr:0x%lx,hsize[%d]\n", __func__, |
| di_mif->addr0, |
| di_mif->buf_hsize); |
| } |
| } |
| //dbg_ic("%s:%d:linear:%d\n", __func__, mif_index, di_mif->linear); |
| // di_mif->nocompress = (di_buf->vframe->type & VIDTYPE_COMPRESS) ? 0 : 1; |
| |
| if (di_buf->vframe->bitdepth & BITDEPTH_Y10) { |
| if (di_buf->vframe->type & VIDTYPE_VIU_444) |
| di_mif->bit_mode = |
| (di_buf->vframe->bitdepth & FULL_PACK_422_MODE) ? |
| 3 : 2; |
| else if (di_buf->vframe->type & VIDTYPE_VIU_422) |
| di_mif->bit_mode = |
| (di_buf->vframe->bitdepth & FULL_PACK_422_MODE) ? |
| 3 : 1; |
| } else { |
| di_mif->bit_mode = 0; |
| } |
| if (di_buf->vframe->type & VIDTYPE_VIU_422) { |
| /* from vdin or local vframe */ |
| if ((!IS_PROG(di_buf->vframe->type)) || |
| ppre->prog_proc_type) { |
| di_mif->video_mode = 1; |
| di_mif->set_separate_en = 0; |
| di_mif->src_field_mode = 0; |
| di_mif->output_field_num = 0; |
| di_mif->luma_x_start0 = 0; |
| di_mif->luma_x_end0 = |
| di_buf->vframe->width - 1; |
| di_mif->luma_y_start0 = 0; |
| if (ppre->prog_proc_type) |
| di_mif->luma_y_end0 = |
| di_buf->vframe->height - 1; |
| else |
| di_mif->luma_y_end0 = |
| di_buf->vframe->height / 2 - 1; |
| di_mif->chroma_x_start0 = 0; |
| di_mif->chroma_x_end0 = 0; |
| di_mif->chroma_y_start0 = 0; |
| di_mif->chroma_y_end0 = 0; |
| di_mif->canvas0_addr0 = |
| di_buf->vframe->canvas0Addr & 0xff; |
| di_mif->canvas0_addr1 = |
| (di_buf->vframe->canvas0Addr >> 8) & 0xff; |
| di_mif->canvas0_addr2 = |
| (di_buf->vframe->canvas0Addr >> 16) & 0xff; |
| } |
| di_mif->reg_swap = 1; |
| di_mif->l_endian = 0; |
| di_mif->cbcr_swap = 0; |
| } else { |
| if (di_buf->vframe->type & VIDTYPE_VIU_444) |
| di_mif->video_mode = 2; |
| else |
| di_mif->video_mode = 0; |
| if (di_buf->vframe->type & |
| (VIDTYPE_VIU_NV21 | VIDTYPE_VIU_NV12)) |
| di_mif->set_separate_en = 2; |
| else |
| di_mif->set_separate_en = 1; |
| |
| if (IS_PROG(di_buf->vframe->type) && ppre->prog_proc_type) { |
| di_mif->src_field_mode = 0; |
| di_mif->output_field_num = 0; /* top */ |
| di_mif->luma_x_start0 = 0; |
| di_mif->luma_x_end0 = |
| di_buf->vframe->width - 1; |
| di_mif->luma_y_start0 = 0; |
| di_mif->luma_y_end0 = |
| di_buf->vframe->height - 1; |
| di_mif->chroma_x_start0 = 0; |
| di_mif->chroma_x_end0 = |
| di_buf->vframe->width / 2 - 1; |
| di_mif->chroma_y_start0 = 0; |
| di_mif->chroma_y_end0 = |
| (di_buf->vframe->height + 1) / 2 - 1; |
| } else if ((ppre->cur_inp_type & VIDTYPE_INTERLACE) && |
| (ppre->cur_inp_type & VIDTYPE_VIU_FIELD)) { |
| di_mif->src_prog = 0; |
| di_mif->src_field_mode = 0; |
| di_mif->output_field_num = 0; /* top */ |
| di_mif->luma_x_start0 = 0; |
| di_mif->luma_x_end0 = |
| di_buf->vframe->width - 1; |
| di_mif->luma_y_start0 = 0; |
| di_mif->luma_y_end0 = |
| di_buf->vframe->height / 2 - 1; |
| di_mif->chroma_x_start0 = 0; |
| di_mif->chroma_x_end0 = |
| di_buf->vframe->width / 2 - 1; |
| di_mif->chroma_y_start0 = 0; |
| di_mif->chroma_y_end0 = |
| di_buf->vframe->height / 4 - 1; |
| } else { |
| /*move to mp di_mif->src_prog = force_prog?1:0;*/ |
| if (ppre->cur_inp_type & VIDTYPE_INTERLACE) |
| di_mif->src_prog = 0; |
| else |
| di_mif->src_prog = |
| dimp_get(edi_mp_force_prog) ? 1 : 0; |
| di_mif->src_field_mode = 1; |
| if ((di_buf->vframe->type & VIDTYPE_TYPEMASK) == |
| VIDTYPE_INTERLACE_TOP) { |
| di_mif->output_field_num = 0; /* top */ |
| di_mif->luma_x_start0 = 0; |
| di_mif->luma_x_end0 = |
| di_buf->vframe->width - 1; |
| di_mif->luma_y_start0 = 0; |
| di_mif->luma_y_end0 = |
| di_buf->vframe->height - 1; |
| di_mif->chroma_x_start0 = 0; |
| di_mif->chroma_x_end0 = |
| di_buf->vframe->width / 2 - 1; |
| di_mif->chroma_y_start0 = 0; |
| di_mif->chroma_y_end0 = |
| (di_buf->vframe->height + 1) / 2 - 1; |
| } else { |
| di_mif->output_field_num = 1; |
| /* bottom */ |
| di_mif->luma_x_start0 = 0; |
| di_mif->luma_x_end0 = |
| di_buf->vframe->width - 1; |
| di_mif->luma_y_start0 = 1; |
| di_mif->luma_y_end0 = |
| di_buf->vframe->height - 1; |
| di_mif->chroma_x_start0 = 0; |
| di_mif->chroma_x_end0 = |
| di_buf->vframe->width / 2 - 1; |
| di_mif->chroma_y_start0 = |
| (di_mif->src_prog ? 0 : 1); |
| di_mif->chroma_y_end0 = |
| (di_buf->vframe->height + 1) / 2 - 1; |
| } |
| } |
| } |
| } |
| |
| static void post_dbg_contr_v3(void) |
| { |
| const struct reg_acc *op = &di_pre_regset; |
| |
| if (DIM_IS_IC_BF(SC2)) { |
| PR_ERR("%s:\n", __func__); |
| return; |
| } |
| /* bit [11:10]:cntl_dbg_mode*/ |
| op->bwr(DI_SC2_IF0_GEN_REG3, 1, 11, 1); |
| op->bwr(DI_SC2_IF1_GEN_REG3, 1, 11, 1); |
| op->bwr(DI_SC2_IF2_GEN_REG3, 1, 11, 1); |
| } |
| |
| static void di_post_set_flow_v3(unsigned int post_wr_en, |
| enum EDI_POST_FLOW step) |
| { |
| unsigned int val; |
| const struct reg_acc *op = &di_pre_regset; |
| |
| if (DIM_IS_IC_BF(SC2)) { |
| PR_ERR("%s:\n", __func__); |
| return; |
| } |
| |
| if (!post_wr_en) |
| return; |
| |
| switch (step) { |
| case EDI_POST_FLOW_STEP1_STOP: |
| /*val = (0xc0200000 | line_num_post_frst);*/ |
| val = (0xc0000000 | 1); |
| op->wr(DI_SC2_POST_GL_CTRL, val); |
| break; |
| case EDI_POST_FLOW_STEP2_START: |
| /*val = (0x80200000 | line_num_post_frst);*/ |
| val = (0x80200000 | 1); |
| op->wr(DI_SC2_POST_GL_CTRL, val); |
| break; |
| case EDI_POST_FLOW_STEP3_IRQ: |
| op->wr(DI_SC2_POST_GL_CTRL, 0x1); |
| /* DI_POST_CTRL |
| * disable wr back avoid pps sreay in g12a |
| * [7]: set 0; |
| */ |
| op->wr(DI_POST_CTRL, 0x80000001); /*ary sc2 ??*/ |
| op->wr(DI_SC2_POST_GL_CTRL, 0xc0000001); |
| break; |
| case EDI_POST_FLOW_STEP4_CP_START: |
| op->wr(DI_POST_CTRL, |
| (1 << 0) | /* di_post_en = post_ctrl[0]; */ |
| (0 << 1) | /* di_blend_en = post_ctrl[1]; */ |
| (0 << 2) | /* di_ei_en = post_ctrl[2]; */ |
| (0 << 3) | /* di_mux_en = post_ctrl[3]; */ |
| (1 << 4) | /* di_wr_bk_en = post_ctrl[4]; */ |
| (0 << 5) | /* di_vpp_out_en = post_ctrl[5]; */ |
| (0 << 6) | /* reg_post_mb_en = post_ctrl[6]; */ |
| (0 << 10) | /* di_post_drop_1st= post_ctrl[10]; */ |
| (0 << 11) | /* di_post_repeat = post_ctrl[11]; */ |
| (0 << 29)); /* post_field_num = post_ctrl[29]; */ |
| op->wr(DI_SC2_POST_GL_CTRL, 0x80200001); |
| break; |
| } |
| } |
| |
| static void hpre_gl_sw_v3(bool on) |
| { |
| const struct reg_acc *op = &di_pre_regset; |
| |
| if (DIM_IS_IC_BF(SC2)) { |
| PR_ERR("%s:\n", __func__); |
| return; |
| } |
| if (on) |
| op->wr(DI_SC2_PRE_GL_CTRL, |
| 0x80200000 | dimp_get(edi_mp_line_num_pre_frst)); |
| else |
| op->wr(DI_SC2_PRE_GL_CTRL, 0xc0000000); |
| } |
| |
| void hpre_timeout_read(void) |
| { |
| if (!DIM_IS_IC_EF(SC2)) |
| return; |
| dim_print("gl:0x%x:0x%x\n", DI_SC2_PRE_GL_CTRL, |
| DIM_RDMA_RD(DI_SC2_PRE_GL_CTRL)); |
| dim_print("c:0x%x:0x%x\n", DI_RO_PRE_DBG, DIM_RDMA_RD(DI_RO_PRE_DBG)); |
| dim_print("c:0x%x:0x%x\n", DI_RO_PRE_DBG, DIM_RDMA_RD(DI_RO_PRE_DBG)); |
| dim_print("c:0x%x:0x%x\n", DI_RO_PRE_DBG, DIM_RDMA_RD(DI_RO_PRE_DBG)); |
| dim_print("c:0x%x:0x%x\n", DI_RO_PRE_DBG, DIM_RDMA_RD(DI_RO_PRE_DBG)); |
| dim_print("c:0x%x:0x%x\n", DI_RO_PRE_DBG, DIM_RDMA_RD(DI_RO_PRE_DBG)); |
| dim_print("c:0x%x:0x%x\n", DI_RO_PRE_DBG, DIM_RDMA_RD(DI_RO_PRE_DBG)); |
| dim_print("c:0x%x:0x%x\n", DI_RO_PRE_DBG, DIM_RDMA_RD(DI_RO_PRE_DBG)); |
| dim_print("c:0x%x:0x%x\n", DI_RO_PRE_DBG, DIM_RDMA_RD(DI_RO_PRE_DBG)); |
| dim_print("c:0x%x:0x%x\n", DI_RO_PRE_DBG, DIM_RDMA_RD(DI_RO_PRE_DBG)); |
| } |
| |
| void hpst_timeout_read(void) |
| { |
| if (DIM_IS_IC_BF(SC2)) |
| return; |
| dim_print("c:0x%x:0x%x\n", DI_RO_POST_DBG, DIM_RDMA_RD(DI_RO_POST_DBG)); |
| dim_print("c:0x%x:0x%x\n", DI_RO_POST_DBG, DIM_RDMA_RD(DI_RO_POST_DBG)); |
| } |
| static void hpre_gl_thd_v3(void) |
| { |
| const struct reg_acc *op = &di_pre_regset; |
| |
| if (DIM_IS_IC_BF(SC2)) { |
| PR_ERR("%s:\n", __func__); |
| return; |
| } |
| |
| op->bwr(DI_SC2_PRE_GL_THD, |
| dimp_get(edi_mp_pre_hold_line), 16, 6); |
| } |
| |
| static void hpost_gl_thd_v3(unsigned int hold_line) |
| { |
| const struct reg_acc *op = &di_pre_regset; |
| |
| if (DIM_IS_IC_BF(SC2)) { |
| PR_ERR("%s:\n", __func__); |
| return; |
| } |
| |
| op->bwr(DI_SC2_POST_GL_THD, hold_line, 16, 5); |
| } |
| |
| void dim_sc2_contr_pre(union hw_sc2_ctr_pre_s *cfg) |
| { |
| const struct reg_acc *op = &di_pre_regset; |
| unsigned int val; |
| |
| if (is_mask(SC2_REG_MSK_nr)) { |
| PR_INF("%s:\n", __func__); |
| op = &sc2reg; |
| } |
| val = op->rd(DI_TOP_PRE_CTRL); |
| |
| /*clear*/ |
| val &= ~((3 << 0) | |
| (7 << 4) | |
| (7 << 7) | /* bit[9:7] */ |
| (3 << 30)); |
| |
| val |= ((cfg->b.mif_en << 0) | |
| (cfg->b.afbc_nr_en << 1) | |
| (cfg->b.afbc_inp << 4) | |
| (cfg->b.afbc_chan2 << 5) | |
| (cfg->b.afbc_mem << 6) | |
| //((cfg->b.is_4k ? 7 : 0) << 7) | |
| (cfg->b.is_inp_4k << 7) | |
| (cfg->b.is_chan2_4k << 8) | |
| (cfg->b.is_mem_4k << 9) | |
| (cfg->b.nr_ch0_en << 10) | |
| (cfg->b.pre_frm_sel << 30)); |
| |
| dim_print("%s:%s:0x%x:0x%x\n", __func__, |
| "DI_TOP_PRE_CTRL", |
| DI_TOP_PRE_CTRL, |
| val); |
| op->wr(DI_TOP_PRE_CTRL, val); |
| if (DIM_IS_IC_EF(T7)) { |
| op->bwr(AFBCDM_INP_CTRL0, cfg->b.is_inp_4k, 14, 1); |
| //reg_use_4kram |
| op->bwr(AFBCDM_INP_CTRL0, cfg->b.afbc_inp, 13, 1); |
| //reg_afbc_vd_sel //1:afbc_dec 0:nor_rdmif |
| |
| op->bwr(AFBCDM_CHAN2_CTRL0, cfg->b.is_chan2_4k, 14, 1); |
| //reg_use_4kram |
| op->bwr(AFBCDM_CHAN2_CTRL0, cfg->b.afbc_chan2, 13, 1); |
| //reg_afbc_vd_sel //1:afbc_dec 0:nor_rdmif |
| |
| op->bwr(AFBCDM_MEM_CTRL0, cfg->b.is_mem_4k, 14, 1); |
| //reg_use_4kram |
| op->bwr(AFBCDM_MEM_CTRL0, cfg->b.afbc_mem, 13, 1); |
| //reg_afbc_vd_sel //1:afbc_dec 0:nor_rdmif |
| } |
| dbg_ic("%s:afbc_mem[%d]\n", __func__, cfg->b.afbc_mem); |
| //dbg_reg_mem(40); |
| } |
| |
| /* |
| * 0 off: |
| * 1: pre afbce 4k |
| * 2: post afbce 4k |
| * for t5w only 1 afbce ,no need change ram, DI_TOP_CTRL1 bit3 need set to 0 |
| */ |
| void dim_sc2_4k_set(unsigned int mode_4k) |
| { |
| const struct reg_acc *op = &di_pre_regset; |
| |
| //dim_print("%s:mode[%d]\n", __func__); |
| if (!mode_4k) |
| op->wr(DI_TOP_CTRL1, 0x00000008); /*default*/ |
| else if (mode_4k == 1) |
| op->wr(DI_TOP_CTRL1, 0x00000004); /*default*/ |
| else if (mode_4k == 2) |
| op->wr(DI_TOP_CTRL1, 0x0000000c); /*default*/ |
| |
| if (DIM_IS_ICS(T5W))//from vlsi feijun for t5w |
| op->bwr(DI_TOP_CTRL1, 0, 3, 1); |
| } |
| |
| void dim_sc2_afbce_rst(unsigned int ec_nub) |
| { |
| const struct reg_acc *op = &di_pre_regset; |
| |
| //PR_INF("%s:[%d]\n", __func__, ec_nub); |
| if (ec_nub == 0) { |
| //bit 25: |
| op->bwr(DI_TOP_CTRL1, 1, 25, 1); /*default*/ |
| op->bwr(DI_TOP_CTRL1, 0, 25, 1); /*default*/ |
| } else { |
| op->bwr(DI_TOP_CTRL1, 1, 23, 1); /*default*/ |
| op->bwr(DI_TOP_CTRL1, 0, 23, 1); /*default*/ |
| } |
| } |
| |
| void dim_secure_pre_en(unsigned char ch) |
| { |
| if (get_datal()->ch_data[ch].is_tvp == 2) { |
| if (DIM_IS_IC_EF(SC2)) { |
| DIM_DI_WR(DI_PRE_SEC_IN, 0x3F);//secure |
| } else { |
| #ifdef CONFIG_AMLOGIC_TEE |
| tee_config_device_state(16, 1); |
| #endif |
| } |
| get_datal()->is_secure_pre = 2; |
| //dbg_mem2("%s:tvp3 pre SECURE:%d\n", __func__, ch); |
| } else { |
| if (DIM_IS_IC_EF(SC2)) { |
| DIM_DI_WR(DI_PRE_SEC_IN, 0x0); |
| } else { |
| #ifdef CONFIG_AMLOGIC_TEE |
| tee_config_device_state(16, 0); |
| #endif |
| } |
| get_datal()->is_secure_pre = 1; |
| //dbg_mem2("%s:tvp3 pre NOSECURE:%d\n", __func__, ch); |
| } |
| } |
| |
| void dim_secure_sw_pre(unsigned char ch) |
| { |
| if (DIM_IS_IC_BF(G12A)) |
| return; |
| //dbg_mem2("%s:tvp3 pre:%d\n", __func__, ch); |
| |
| if (get_datal()->is_secure_pre == 0)//first set |
| dim_secure_pre_en(ch); |
| else if (get_datal()->ch_data[ch].is_tvp != |
| get_datal()->is_secure_pre) |
| dim_secure_pre_en(ch); |
| } |
| |
| void dim_secure_pst_en(unsigned char ch) |
| { |
| if (get_datal()->ch_data[ch].is_tvp == 2) { |
| if (DIM_IS_IC_EF(SC2)) { |
| DIM_DI_WR(DI_POST_SEC_IN, 0x1F);//secure |
| } else { |
| #ifdef CONFIG_AMLOGIC_TEE |
| tee_config_device_state(17, 1); |
| #endif |
| } |
| get_datal()->is_secure_pst = 2; |
| //dbg_mem2("%s:tvp4 PST SECURE:%d\n", __func__, ch); |
| } else { |
| if (DIM_IS_IC_EF(SC2)) { |
| DIM_DI_WR(DI_POST_SEC_IN, 0x0); |
| } else { |
| #ifdef CONFIG_AMLOGIC_TEE |
| tee_config_device_state(17, 0); |
| #endif |
| } |
| get_datal()->is_secure_pst = 1; |
| //dbg_mem2("%s:tvp4 pST NOSECURE:%d\n", __func__, ch); |
| } |
| } |
| |
| void dim_secure_sw_post(unsigned char ch) |
| { |
| if (DIM_IS_IC_BF(G12A)) |
| return; |
| //dbg_mem2("%s:tvp4 post:%d\n", __func__, ch); |
| |
| if (get_datal()->is_secure_pst == 0)//first set |
| dim_secure_pst_en(ch); |
| else if (get_datal()->ch_data[ch].is_tvp != |
| get_datal()->is_secure_pst) |
| dim_secure_pst_en(ch); |
| } |
| |
| void dim_sc2_contr_pst(union hw_sc2_ctr_pst_s *cfg) |
| { |
| const struct reg_acc *op = &di_pre_regset; |
| unsigned int val; |
| |
| if (is_mask(SC2_REG_MSK_nr)) { |
| PR_INF("%s:\n", __func__); |
| op = &sc2reg; |
| } |
| |
| val = op->rd(DI_TOP_POST_CTRL); |
| |
| /*clear*/ |
| val &= ~((3 << 0) | |
| (7 << 4) | |
| (7 << 7) | /* bit[9:7] */ |
| (3 << 30)); |
| |
| val |= ((cfg->b.mif_en << 0) | |
| (cfg->b.afbc_wr << 1) | |
| (cfg->b.afbc_if1 << 4) | |
| (cfg->b.afbc_if0 << 5) | |
| (cfg->b.afbc_if2 << 6) | |
| //((cfg->b.is_4k ? 7 : 0) << 7) | |
| (cfg->b.is_if1_4k << 7) | |
| (cfg->b.is_if0_4k << 8) | |
| (cfg->b.is_if2_4k << 9) | |
| (cfg->b.post_frm_sel << 30)); |
| |
| op->wr(DI_TOP_POST_CTRL, val); |
| dim_print("%s:0x%x:0x%x\n", |
| "DI_TOP_POST_CTRL", |
| DI_TOP_POST_CTRL, |
| val); |
| if (DIM_IS_IC_EF(T7)) { |
| op->bwr(AFBCDM_IF0_CTRL0, cfg->b.is_if0_4k, 14, 1); |
| //reg_use_4kram |
| op->bwr(AFBCDM_IF0_CTRL0, cfg->b.afbc_if0, 13, 1); |
| //reg_afbc_vd_sel //1:afbc_dec 0:nor_rdmif |
| |
| op->bwr(AFBCDM_IF1_CTRL0, cfg->b.is_if1_4k, 14, 1); |
| //reg_use_4kram |
| op->bwr(AFBCDM_IF1_CTRL0, cfg->b.afbc_if1, 13, 1); |
| //reg_afbc_vd_sel //1:afbc_dec 0:nor_rdmif |
| |
| op->bwr(AFBCDM_IF2_CTRL0, cfg->b.is_if2_4k, 14, 1); |
| //reg_use_4kram |
| op->bwr(AFBCDM_IF2_CTRL0, cfg->b.afbc_if2, 13, 1); |
| //reg_afbc_vd_sel |
| //1:afbc_dec 0:nor_rdmif |
| } |
| } |
| |
| const struct dim_hw_opsv_s dim_ops_l1_v3 = { |
| .info = { |
| .name = "l1_sc2", |
| .update = "2020-06-01", |
| .main_version = 3, |
| .sub_version = 1, |
| }, |
| .pre_mif_set = set_di_mif_v3, |
| .pst_mif_set = set_di_mif_v3, |
| .pst_mif_update_csv = pst_mif_update_canvasid_v3, |
| .pre_mif_sw = di_pre_data_mif_ctrl_v3, |
| .pst_mif_sw = post_mif_sw_v3, |
| .pst_mif_rst = post_mif_rst_v3, |
| .pst_mif_rev = post_mif_rev_v3, |
| .pst_dbg_contr = post_dbg_contr_v3, |
| .pst_set_flow = di_post_set_flow_v3, |
| .pst_bit_mode_cfg = post_bit_mode_cfg_v3, |
| .wr_cfg_mif = wr_mif_cfg_v3, |
| .wr_cfg_mif_dvfm = wr_mif_cfg_by_dvfm, /* new from dw*/ |
| .wrmif_set = set_wrmif_simple_v3, |
| .shrk_set = set_shrk_ch, |
| .shrk_disable = set_shrk_disable, |
| .wrmif_sw_buf = NULL, |
| .wrmif_trig = NULL, |
| .wr_rst_protect = NULL, |
| .aisr_pre = NULL, |
| .aisr_disable = NULL, |
| .hw_init = hw_init_v3, |
| .pre_hold_block_txlx = NULL, |
| .pre_cfg_mif = config_di_mif_v3, |
| .dbg_reg_pre_mif_print = dbg_reg_pre_mif_print_v3, |
| .dbg_reg_pst_mif_print = dbg_reg_pst_mif_print_v3, |
| .dbg_reg_pre_mif_print2 = dbg_reg_pre_mif_print2_v3, |
| .dbg_reg_pst_mif_print2 = dbg_reg_pst_mif_print2_v3, |
| .dbg_reg_pre_mif_show = dbg_reg_pre_mif_v3_show, |
| .dbg_reg_pst_mif_show = dbg_reg_pst_mif_v3_show, |
| /*contrl*/ |
| .pre_gl_sw = hpre_gl_sw_v3, |
| .pre_gl_thd = hpre_gl_thd_v3, |
| .pst_gl_thd = hpost_gl_thd_v3, |
| .reg_mif_tab = { |
| [DI_MIF0_ID_INP] = &mif_contr_reg[DI_MIF0_ID_INP][0], |
| [DI_MIF0_ID_CHAN2] = &mif_contr_reg[DI_MIF0_ID_CHAN2][0], |
| [DI_MIF0_ID_MEM] = &mif_contr_reg[DI_MIF0_ID_MEM][0], |
| [DI_MIF0_ID_IF1] = &mif_contr_reg[DI_MIF0_ID_IF1][0], |
| [DI_MIF0_ID_IF0] = &mif_contr_reg[DI_MIF0_ID_IF0][0], |
| [DI_MIF0_ID_IF2] = &mif_contr_reg[DI_MIF0_ID_IF2][0], |
| }, |
| }; |
| |
| const struct dim_hw_opsv_s dim_ops_l1_v4 = { //for t7 |
| .info = { |
| .name = "l1_t7", |
| .update = "2020-12-28", |
| .main_version = 4, |
| .sub_version = 1, |
| }, |
| .pre_mif_set = set_di_mif_v3, |
| .pst_mif_set = set_di_mif_v3, |
| .pst_mif_update_csv = pst_mif_update_canvasid_v3, |
| .pre_mif_sw = di_pre_data_mif_ctrl_v3, |
| .pst_mif_sw = post_mif_sw_v3, |
| .pst_mif_rst = post_mif_rst_v3, |
| .pst_mif_rev = post_mif_rev_v3, |
| .pst_dbg_contr = post_dbg_contr_v3, |
| .pst_set_flow = di_post_set_flow_v3, |
| .pst_bit_mode_cfg = post_bit_mode_cfg_v3, |
| .wr_cfg_mif = wr_mif_cfg_v3, |
| .wr_cfg_mif_dvfm = wr_mif_cfg_by_dvfm, /* new from dw*/ |
| .wrmif_set = set_wrmif_simple_v3, |
| .wrmif_sw_buf = NULL, |
| .shrk_set = set_shrk_ch, |
| .shrk_disable = set_shrk_disable, |
| .pre_ma_mif_set = set_ma_pre_mif_t7, |
| .post_mtnrd_mif_set = set_post_mtnrd_mif_t7, |
| .pre_enable_mc = pre_enable_mc_t7, |
| .aisr_pre = dim_aisr_pre_cfg, |
| .aisr_disable = dim_aisr_disable, |
| .wrmif_trig = NULL, |
| .wr_rst_protect = NULL, |
| .hw_init = hw_init_v3, |
| .pre_hold_block_txlx = NULL, |
| .pre_cfg_mif = config_di_mif_v3, |
| .dbg_reg_pre_mif_print = dbg_reg_pre_mif_print_v3, |
| .dbg_reg_pst_mif_print = dbg_reg_pst_mif_print_v3, |
| .dbg_reg_pre_mif_print2 = dbg_reg_pre_mif_print2_v3, |
| .dbg_reg_pst_mif_print2 = dbg_reg_pst_mif_print2_v3, |
| .dbg_reg_pre_mif_show = dbg_reg_pre_mif_v3_show, |
| .dbg_reg_pst_mif_show = dbg_reg_pst_mif_v3_show, |
| /*contrl*/ |
| .pre_gl_sw = hpre_gl_sw_v3, |
| .pre_gl_thd = hpre_gl_thd_v3, |
| .pst_gl_thd = hpost_gl_thd_v3, |
| .reg_mif_tab = { |
| [DI_MIF0_ID_INP] = &mif_contr_reg[DI_MIF0_ID_INP][0], |
| [DI_MIF0_ID_CHAN2] = &mif_contr_reg[DI_MIF0_ID_CHAN2][0], |
| [DI_MIF0_ID_MEM] = &mif_contr_reg[DI_MIF0_ID_MEM][0], |
| [DI_MIF0_ID_IF1] = &mif_contr_reg[DI_MIF0_ID_IF1][0], |
| [DI_MIF0_ID_IF0] = &mif_contr_reg[DI_MIF0_ID_IF0][0], |
| [DI_MIF0_ID_IF2] = &mif_contr_reg[DI_MIF0_ID_IF2][0], |
| }, |
| .reg_mif_wr_tab = { |
| [EDI_MIFSM_NR] = ®_wrmif_v3[EDI_MIFSM_NR][0], |
| [EDI_MIFSM_WR] = ®_wrmif_v3[EDI_MIFSM_WR][0], |
| }, |
| .reg_mif_wr_bits_tab = ®_bits_wr[0], |
| .rtab_contr_bits_tab = &rtab_sc2_contr_bits_tab[0], |
| }; |
| |
| static const struct hw_ops_s dim_hw_v3_ops = { |
| .info = { |
| .name = "sc2", |
| .update = "2020-06-01", |
| .version_main = 3, |
| .version_sub = 1, |
| }, |
| .afbcd_set = set_afbcd_mult_simple, |
| .afbce_set = set_afbce_cfg_v1, |
| .wrmif_set = set_wrmif_simple, |
| .mult_wr = set_di_mult_write, |
| .pre_set = set_di_pre, |
| .post_set = set_di_post, |
| .prepost_link = enable_prepost_link, |
| .prepost_link_afbc = enable_prepost_link_afbce, |
| .memcpy_rot = set_di_memcpy_rot, |
| .memcpy = set_di_memcpy, |
| }; |
| |
| bool di_attach_ops_v3(const struct hw_ops_s **ops) |
| { |
| *ops = &dim_hw_v3_ops; |
| return true; |
| } |
| |