/* * Copyright 2020 Rockchip Electronics Co. LTD * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define MODULE_TAG "vdpu34x_com" #include #include "mpp_log.h" #include "mpp_buffer.h" #include "mpp_common.h" #include "vdpu34x_com.h" static RK_U32 rcb_coeff[RCB_BUF_COUNT] = { [RCB_INTRA_ROW] = 6, /* RCB_INTRA_ROW_COEF */ [RCB_TRANSD_ROW] = 1, /* RCB_TRANSD_ROW_COEF */ [RCB_TRANSD_COL] = 1, /* RCB_TRANSD_COL_COEF */ [RCB_STRMD_ROW] = 3, /* RCB_STRMD_ROW_COEF */ [RCB_INTER_ROW] = 6, /* RCB_INTER_ROW_COEF */ [RCB_INTER_COL] = 3, /* RCB_INTER_COL_COEF */ [RCB_DBLK_ROW] = 22, /* RCB_DBLK_ROW_COEF */ [RCB_SAO_ROW] = 6, /* RCB_SAO_ROW_COEF */ [RCB_FBC_ROW] = 11, /* RCB_FBC_ROW_COEF */ [RCB_FILT_COL] = 67, /* RCB_FILT_COL_COEF */ }; static RK_S32 update_size_offset(Vdpu34xRcbInfo *info, RK_U32 reg, RK_S32 offset, RK_S32 len, RK_S32 idx) { RK_S32 buf_size = 0; buf_size = MPP_ALIGN(len * rcb_coeff[idx], RCB_ALLINE_SIZE); info[idx].reg = reg; info[idx].offset = offset; info[idx].size = buf_size; return buf_size; } RK_S32 get_rcb_buf_size(Vdpu34xRcbInfo *info, RK_S32 width, RK_S32 height) { RK_S32 offset = 0; offset += update_size_offset(info, 139, offset, width, RCB_DBLK_ROW); offset += update_size_offset(info, 133, offset, width, RCB_INTRA_ROW); offset += update_size_offset(info, 134, offset, width, RCB_TRANSD_ROW); offset += update_size_offset(info, 136, offset, width, RCB_STRMD_ROW); offset += update_size_offset(info, 137, offset, width, RCB_INTER_ROW); offset += update_size_offset(info, 140, offset, width, RCB_SAO_ROW); offset += update_size_offset(info, 141, offset, width, RCB_FBC_ROW); /* col rcb */ offset += update_size_offset(info, 135, offset, height, RCB_TRANSD_COL); offset += update_size_offset(info, 138, offset, height, RCB_INTER_COL); offset += update_size_offset(info, 142, offset, height, RCB_FILT_COL); return offset; } void vdpu34x_setup_rcb(Vdpu34xRegCommonAddr *reg, MppDev dev, MppBuffer buf, Vdpu34xRcbInfo *info) { MppDevRegOffsetCfg trans_cfg; RK_S32 fd = mpp_buffer_get_fd(buf); reg->reg139_rcb_dblk_base = fd; reg->reg133_rcb_intra_base = fd; reg->reg134_rcb_transd_row_base = fd; reg->reg136_rcb_streamd_row_base = fd; reg->reg137_rcb_inter_row_base = fd; reg->reg140_rcb_sao_base = fd; reg->reg141_rcb_fbc_base = fd; reg->reg135_rcb_transd_col_base = fd; reg->reg138_rcb_inter_col_base = fd; reg->reg142_rcb_filter_col_base = fd; if (info[RCB_DBLK_ROW].offset) { trans_cfg.reg_idx = 139; trans_cfg.offset = info[RCB_DBLK_ROW].offset; mpp_dev_ioctl(dev, MPP_DEV_REG_OFFSET, &trans_cfg); } if (info[RCB_INTRA_ROW].offset) { trans_cfg.reg_idx = 133; trans_cfg.offset = info[RCB_INTRA_ROW].offset; mpp_dev_ioctl(dev, MPP_DEV_REG_OFFSET, &trans_cfg); } if (info[RCB_TRANSD_ROW].offset) { trans_cfg.reg_idx = 134; trans_cfg.offset = info[RCB_TRANSD_ROW].offset; mpp_dev_ioctl(dev, MPP_DEV_REG_OFFSET, &trans_cfg); } if (info[RCB_STRMD_ROW].offset) { trans_cfg.reg_idx = 136; trans_cfg.offset = info[RCB_STRMD_ROW].offset; mpp_dev_ioctl(dev, MPP_DEV_REG_OFFSET, &trans_cfg); } if (info[RCB_INTER_ROW].offset) { trans_cfg.reg_idx = 137; trans_cfg.offset = info[RCB_INTER_ROW].offset; mpp_dev_ioctl(dev, MPP_DEV_REG_OFFSET, &trans_cfg); } if (info[RCB_SAO_ROW].offset) { trans_cfg.reg_idx = 140; trans_cfg.offset = info[RCB_SAO_ROW].offset; mpp_dev_ioctl(dev, MPP_DEV_REG_OFFSET, &trans_cfg); } if (info[RCB_FBC_ROW].offset) { trans_cfg.reg_idx = 141; trans_cfg.offset = info[RCB_FBC_ROW].offset; mpp_dev_ioctl(dev, MPP_DEV_REG_OFFSET, &trans_cfg); } if (info[RCB_TRANSD_COL].offset) { trans_cfg.reg_idx = 135; trans_cfg.offset = info[RCB_TRANSD_COL].offset; mpp_dev_ioctl(dev, MPP_DEV_REG_OFFSET, &trans_cfg); } if (info[RCB_INTER_COL].offset) { trans_cfg.reg_idx = 138; trans_cfg.offset = info[RCB_INTER_COL].offset; mpp_dev_ioctl(dev, MPP_DEV_REG_OFFSET, &trans_cfg); } if (info[RCB_FILT_COL].offset) { trans_cfg.reg_idx = 142; trans_cfg.offset = info[RCB_FILT_COL].offset; mpp_dev_ioctl(dev, MPP_DEV_REG_OFFSET, &trans_cfg); } } RK_S32 vdpu34x_compare_rcb_size(const void *a, const void *b) { RK_S32 val = 0; Vdpu34xRcbInfo *p0 = (Vdpu34xRcbInfo *)a; Vdpu34xRcbInfo *p1 = (Vdpu34xRcbInfo *)b; val = (p0->size > p1->size) ? -1 : 1; return val; } void vdpu34x_setup_statistic(Vdpu34xRegCommon *com, Vdpu34xRegStatistic *sta) { com->reg011.pix_range_detection_e = 1; memset(sta, 0, sizeof(*sta)); sta->reg256.axi_perf_work_e = 1; sta->reg256.axi_perf_clr_e = 1; sta->reg256.axi_cnt_type = 1; sta->reg257.addr_align_type = 1; /* set hurry */ sta->reg270.axi_rd_hurry_level = 3; sta->reg270.axi_wr_hurry_level = 1; sta->reg270.axi_wr_qos = 1; sta->reg270.axi_rd_qos = 3; sta->reg270.bus2mc_buffer_qos_level = 255; sta->reg271_wr_wait_cycle_qos = 0; }