msm: vidc: Align buffer size calculators with num_vpp_pipes

Buffer size calculators are dependent on pipe configuration
of the chipset. Ex: Kona has 4 pipes and lagoon has 1 pipe.
Hence aligning the buffer size calculators based on chipset
specific usage of pipes.

Change-Id: I8bb19efc4a80c7e17d9db3cf7d5f1151191b502e
Signed-off-by: Priyanka Gujjula <pgujjula@codeaurora.org>
Signed-off-by: Rakshitha Shakamuri <rshakamu@codeaurora.org>
This commit is contained in:
Rakshitha Shakamuri 2020-02-06 19:09:43 +05:30 • committed by Gerrit - the friendly Code Review server
commit 1cfa55008e
4 changed files with 111 additions and 93 deletions

View file

@ -60,7 +60,6 @@
#define VENUS_DMA_ALIGNMENT BUFFER_ALIGNMENT_SIZE(256)
#define NUM_OF_VPP_PIPES 4
#define MAX_FE_NBR_CTRL_LCU64_LINE_BUFFER_SIZE 64
#define MAX_FE_NBR_CTRL_LCU32_LINE_BUFFER_SIZE 64
#define MAX_FE_NBR_CTRL_LCU16_LINE_BUFFER_SIZE 64
@ -125,10 +124,9 @@
#define SIZE_HW_PIC(sizePerBuf) \
(NUM_HW_PIC_BUF * sizePerBuf)
#define H264_CABAC_HDR_RATIO_HD_TOT_NUM 1 /* 0.25 */
#define H264_CABAC_HDR_RATIO_HD_TOT_DEN 4
#define H264_CABAC_RES_RATIO_HD_TOT_NUM 3 /* 0.75 */
#define H264_CABAC_RES_RATIO_HD_TOT_DEN 4
#define H264_CABAC_HDR_RATIO_HD_TOT 1
#define H264_CABAC_RES_RATIO_HD_TOT 3
/*
* some content need more bin buffer, but limit buffer
* size for high resolution
@ -182,10 +180,9 @@
#define SIZE_H265D_QP(width, height) SIZE_H264D_QP(width, height)
#define H265_CABAC_HDR_RATIO_HD_TOT_NUM 1
#define H265_CABAC_HDR_RATIO_HD_TOT_DEN 2
#define H265_CABAC_RES_RATIO_HD_TOT_NUM 1
#define H265_CABAC_RES_RATIO_HD_TOT_DEN 2
#define H265_CABAC_HDR_RATIO_HD_TOT 2
#define H265_CABAC_RES_RATIO_HD_TOT 2
/*
* some content need more bin buffer, but limit buffer size
* for high resolution
@ -278,31 +275,36 @@ static inline u32 calculate_mpeg2d_scratch_size(struct msm_vidc_inst *inst,
u32 width, u32 height, bool is_interlaced);
static inline u32 calculate_enc_scratch_size(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 work_mode, u32 lcu_size);
u32 width, u32 height, u32 work_mode, u32 lcu_size, u32 num_vpp_pipes);
static inline u32 calculate_h264e_scratch_size(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 work_mode);
u32 width, u32 height, u32 work_mode, u32 num_vpp_pipes);
static inline u32 calculate_h265e_scratch_size(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 work_mode);
u32 width, u32 height, u32 work_mode, u32 num_vpp_pipes);
static inline u32 calculate_vp8e_scratch_size(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 work_mode);
u32 width, u32 height, u32 work_mode, u32 num_vpp_pipes);
static inline u32 calculate_h264d_scratch1_size(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 min_buf_count, bool split_mode_enabled);
u32 width, u32 height, u32 min_buf_count, bool split_mode_enabled,
u32 num_vpp_pipes);
static inline u32 calculate_h265d_scratch1_size(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 min_buf_count, bool split_mode_enabled);
u32 width, u32 height, u32 min_buf_count, bool split_mode_enabled,
u32 num_vpp_pipes);
static inline u32 calculate_vp8d_scratch1_size(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 min_buf_count, bool split_mode_enabled);
u32 width, u32 height, u32 min_buf_count, bool split_mode_enabled,
u32 num_vpp_pipes);
static inline u32 calculate_vp9d_scratch1_size(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 min_buf_count, bool split_mode_enabled);
u32 width, u32 height, u32 min_buf_count, bool split_mode_enabled,
u32 num_vpp_pipes);
static inline u32 calculate_mpeg2d_scratch1_size(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 min_buf_count, bool split_mode_enabled);
u32 width, u32 height, u32 min_buf_count, bool split_mode_enabled,
u32 num_vpp_pipes);
static inline u32 calculate_h264e_scratch1_size(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 num_ref, bool ten_bit);
u32 width, u32 height, u32 num_ref, bool ten_bit, u32 num_vpp_pipes);
static inline u32 calculate_h265e_scratch1_size(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 num_ref, bool ten_bit);
u32 width, u32 height, u32 num_ref, bool ten_bit, u32 num_vpp_pipes);
static inline u32 calculate_vp8e_scratch1_size(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 num_ref, bool ten_bit);
u32 width, u32 height, u32 num_ref, bool ten_bit, u32 num_vpp_pipes);
static inline u32 calculate_enc_scratch2_size(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 num_ref, bool ten_bit);
@ -369,14 +371,15 @@ static struct msm_vidc_enc_buff_size_calculators vp8e_calculators = {
int msm_vidc_get_decoder_internal_buffer_sizes(struct msm_vidc_inst *inst)
{
struct msm_vidc_dec_buff_size_calculators *dec_calculators;
u32 width, height, i, out_min_count;
u32 width, height, i, out_min_count, num_vpp_pipes;
struct v4l2_format *f;
if (!inst) {
if (!inst || !inst->core || !inst->core->platform_data) {
d_vpr_e("%s: Instance is null!", __func__);
return -EINVAL;
}
num_vpp_pipes = inst->core->platform_data->num_vpp_pipes;
f = &inst->fmts[INPUT_PORT].v4l2_fmt;
switch (f->fmt.pix_mp.pixelformat) {
case V4L2_PIX_FMT_H264:
@ -426,7 +429,8 @@ int msm_vidc_get_decoder_internal_buffer_sizes(struct msm_vidc_inst *inst)
curr_req->buffer_size =
dec_calculators->calculate_scratch1_size(
inst, width, height, out_min_count,
is_secondary_output_mode(inst));
is_secondary_output_mode(inst),
num_vpp_pipes);
valid_buffer_type = true;
} else if (curr_req->buffer_type ==
HAL_BUFFER_INTERNAL_PERSIST_1) {
@ -486,17 +490,18 @@ int msm_vidc_get_num_ref_frames(struct msm_vidc_inst *inst)
int msm_vidc_get_encoder_internal_buffer_sizes(struct msm_vidc_inst *inst)
{
struct msm_vidc_enc_buff_size_calculators *enc_calculators;
u32 width, height, i, num_ref;
u32 width, height, i, num_ref, num_vpp_pipes;
bool is_tenbit = false;
int num_bframes;
struct v4l2_ctrl *bframe;
struct v4l2_format *f;
if (!inst) {
if (!inst || !inst->core || !inst->core->platform_data) {
d_vpr_e("%s: Instance is null!", __func__);
return -EINVAL;
}
num_vpp_pipes = inst->core->platform_data->num_vpp_pipes;
f = &inst->fmts[OUTPUT_PORT].v4l2_fmt;
switch (f->fmt.pix_mp.pixelformat) {
case V4L2_PIX_FMT_H264:
@ -537,14 +542,15 @@ int msm_vidc_get_encoder_internal_buffer_sizes(struct msm_vidc_inst *inst)
curr_req->buffer_size =
enc_calculators->calculate_scratch_size(
inst, width, height,
inst->clk_data.work_mode);
inst->clk_data.work_mode,
num_vpp_pipes);
valid_buffer_type = true;
} else if (curr_req->buffer_type ==
HAL_BUFFER_INTERNAL_SCRATCH_1) {
curr_req->buffer_size =
enc_calculators->calculate_scratch1_size(
inst, width, height, num_ref,
is_tenbit);
is_tenbit, num_vpp_pipes);
valid_buffer_type = true;
} else if (curr_req->buffer_type ==
HAL_BUFFER_INTERNAL_SCRATCH_2) {
@ -987,7 +993,7 @@ u32 msm_vidc_calculate_enc_output_extra_size(struct msm_vidc_inst *inst)
return ALIGN(size, SZ_4K);
}
static inline u32 size_vpss_lb(u32 width, u32 height)
static inline u32 size_vpss_lb(u32 width, u32 height, u32 num_vpp_pipes)
{
u32 vpss_4tap_top_buffer_size, vpss_div2_top_buffer_size;
u32 vpss_4tap_left_buffer_size, vpss_div2_left_buffer_size;
@ -1009,7 +1015,7 @@ static inline u32 size_vpss_lb(u32 width, u32 height)
opb_lb_wr_llb_uv_buffer_size = opb_lb_wr_llb_y_buffer_size =
ALIGN((ALIGN(height, 16) / 2) *
64, BUFFER_ALIGNMENT_SIZE(32));
size = NUM_OF_VPP_PIPES * 2 * (vpss_4tap_top_buffer_size +
size = num_vpp_pipes * 2 * (vpss_4tap_top_buffer_size +
vpss_div2_top_buffer_size) +
2 * (vpss_4tap_left_buffer_size +
vpss_div2_left_buffer_size) +
@ -1073,7 +1079,8 @@ static inline u32 size_h264d_vpp_cmd_buf(u32 height)
return size;
}
static inline u32 hfi_iris2_h264d_non_comv_size(u32 width, u32 height)
static inline u32 hfi_iris2_h264d_non_comv_size(u32 width, u32 height,
u32 num_vpp_pipes)
{
u32 size;
u32 size_bse, size_vpp;
@ -1088,11 +1095,11 @@ static inline u32 hfi_iris2_h264d_non_comv_size(u32 width, u32 height)
ALIGN(SIZE_H264D_LB_FE_TOP_CTRL(width, height),
VENUS_DMA_ALIGNMENT) +
ALIGN(SIZE_H264D_LB_FE_LEFT_CTRL(width, height),
VENUS_DMA_ALIGNMENT) * NUM_OF_VPP_PIPES +
VENUS_DMA_ALIGNMENT) * num_vpp_pipes +
ALIGN(SIZE_H264D_LB_SE_TOP_CTRL(width, height),
VENUS_DMA_ALIGNMENT) +
ALIGN(SIZE_H264D_LB_SE_LEFT_CTRL(width, height),
VENUS_DMA_ALIGNMENT) * NUM_OF_VPP_PIPES +
VENUS_DMA_ALIGNMENT) * num_vpp_pipes +
ALIGN(SIZE_H264D_LB_PE_TOP_DATA(width, height),
VENUS_DMA_ALIGNMENT) +
ALIGN(SIZE_H264D_LB_VSP_TOP(width, height),
@ -1115,10 +1122,8 @@ static inline u32 size_h264d_hw_bin_buffer(u32 width, u32 height)
((BIN_BUFFER_THRESHOLD * 3) >> 1) :
((product * 3) >> 1);
size_bin_hdr = size_yuv * H264_CABAC_HDR_RATIO_HD_TOT_NUM /
H264_CABAC_HDR_RATIO_HD_TOT_DEN;
size_bin_res = size_yuv * H264_CABAC_RES_RATIO_HD_TOT_NUM /
H264_CABAC_RES_RATIO_HD_TOT_DEN;
size_bin_hdr = size_yuv * H264_CABAC_HDR_RATIO_HD_TOT;
size_bin_res = size_yuv * H264_CABAC_RES_RATIO_HD_TOT;
size_bin_hdr = ALIGN(size_bin_hdr, VENUS_DMA_ALIGNMENT);
size_bin_res = ALIGN(size_bin_res, VENUS_DMA_ALIGNMENT);
size = size_bin_hdr + size_bin_res;
@ -1132,12 +1137,10 @@ static inline u32 calculate_h264d_scratch_size(struct msm_vidc_inst *inst,
u32 aligned_height = ALIGN(height, BUFFER_ALIGNMENT_SIZE(16));
u32 size = 0;
if (!is_interlaced) {
if (!is_interlaced)
size = size_h264d_hw_bin_buffer(aligned_width, aligned_height);
size = size * NUM_OF_VPP_PIPES;
} else {
else
size = 0;
}
return size;
}
@ -1185,7 +1188,8 @@ static inline u32 hfi_iris2_h265d_comv_size(u32 width, u32 height,
return size;
}
static inline u32 hfi_iris2_h265d_non_comv_size(u32 width, u32 height)
static inline u32 hfi_iris2_h265d_non_comv_size(u32 width, u32 height,
u32 num_vpp_pipes)
{
u32 size_bse, size_vpp;
u32 size = 0;
@ -1205,9 +1209,9 @@ static inline u32 hfi_iris2_h265d_non_comv_size(u32 width, u32 height)
ALIGN(SIZE_H265D_LB_FE_TOP_CTRL(width, height),
VENUS_DMA_ALIGNMENT) +
ALIGN(SIZE_H265D_LB_FE_LEFT_CTRL(width, height),
VENUS_DMA_ALIGNMENT) * NUM_OF_VPP_PIPES +
VENUS_DMA_ALIGNMENT) * num_vpp_pipes +
ALIGN(SIZE_H265D_LB_SE_LEFT_CTRL(width, height),
VENUS_DMA_ALIGNMENT) * NUM_OF_VPP_PIPES +
VENUS_DMA_ALIGNMENT) * num_vpp_pipes +
ALIGN(SIZE_H265D_LB_SE_TOP_CTRL(width, height),
VENUS_DMA_ALIGNMENT) +
ALIGN(SIZE_H265D_LB_PE_TOP_DATA(width, height),
@ -1215,7 +1219,7 @@ static inline u32 hfi_iris2_h265d_non_comv_size(u32 width, u32 height)
ALIGN(SIZE_H265D_LB_VSP_TOP(width, height),
VENUS_DMA_ALIGNMENT) +
ALIGN(SIZE_H265D_LB_VSP_LEFT(width, height),
VENUS_DMA_ALIGNMENT) * NUM_OF_VPP_PIPES +
VENUS_DMA_ALIGNMENT) * num_vpp_pipes +
ALIGN(SIZE_H265D_LB_RECON_DMA_METADATA_WR(width, height),
VENUS_DMA_ALIGNMENT) * 4 +
ALIGN(SIZE_H265D_QP(width, height), VENUS_DMA_ALIGNMENT);
@ -1233,10 +1237,8 @@ static inline u32 size_h265d_hw_bin_buffer(u32 width, u32 height)
size_yuv = (product <= BIN_BUFFER_THRESHOLD) ?
((BIN_BUFFER_THRESHOLD * 3) >> 1) :
((product * 3) >> 1);
size_bin_hdr = size_yuv * H265_CABAC_HDR_RATIO_HD_TOT_NUM /
H265_CABAC_HDR_RATIO_HD_TOT_DEN;
size_bin_res = size_yuv * H265_CABAC_RES_RATIO_HD_TOT_NUM /
H265_CABAC_RES_RATIO_HD_TOT_DEN;
size_bin_hdr = size_yuv * H265_CABAC_HDR_RATIO_HD_TOT;
size_bin_res = size_yuv * H265_CABAC_RES_RATIO_HD_TOT;
size_bin_hdr = ALIGN(size_bin_hdr, VENUS_DMA_ALIGNMENT);
size_bin_res = ALIGN(size_bin_res, VENUS_DMA_ALIGNMENT);
size = size_bin_hdr + size_bin_res;
@ -1251,12 +1253,10 @@ static inline u32 calculate_h265d_scratch_size(struct msm_vidc_inst *inst,
u32 aligned_height = ALIGN(height, BUFFER_ALIGNMENT_SIZE(16));
u32 size = 0;
if (!is_interlaced) {
if (!is_interlaced)
size = size_h265d_hw_bin_buffer(aligned_width, aligned_height);
size = size * NUM_OF_VPP_PIPES;
} else {
else
size = 0;
}
return size;
}
@ -1299,7 +1299,7 @@ static inline u32 calculate_mpeg2d_scratch_size(struct msm_vidc_inst *inst,
}
static inline u32 calculate_enc_scratch_size(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 work_mode, u32 lcu_size)
u32 width, u32 height, u32 work_mode, u32 lcu_size, u32 num_vpp_pipes)
{
u32 aligned_width, aligned_height, bitstream_size;
u32 total_bitbin_buffers = 0, size_singlePipe, bitbin_size = 0;
@ -1319,7 +1319,10 @@ static inline u32 calculate_enc_scratch_size(struct msm_vidc_inst *inst,
bitstream_size = aligned_width * aligned_height * 3;
bitbin_size = ALIGN(bitstream_size, VENUS_DMA_ALIGNMENT);
}
size_singlePipe = bitbin_size / 2;
if (num_vpp_pipes > 2)
size_singlePipe = bitbin_size / 2;
else
size_singlePipe = bitbin_size;
if (inst->rc_type == RATE_CONTROL_LOSSLESS)
size_singlePipe <<= 1;
size_singlePipe = ALIGN(size_singlePipe, VENUS_DMA_ALIGNMENT);
@ -1328,7 +1331,7 @@ static inline u32 calculate_enc_scratch_size(struct msm_vidc_inst *inst,
padded_bin_size = ALIGN(size_singlePipe, VENUS_DMA_ALIGNMENT);
size_singlePipe = sao_bin_buffer_size + padded_bin_size;
size_singlePipe = ALIGN(size_singlePipe, VENUS_DMA_ALIGNMENT);
bitbin_size = size_singlePipe * NUM_OF_VPP_PIPES;
bitbin_size = size_singlePipe * num_vpp_pipes;
size = ALIGN(bitbin_size, VENUS_DMA_ALIGNMENT) * total_bitbin_buffers
+ 512;
@ -1336,50 +1339,56 @@ static inline u32 calculate_enc_scratch_size(struct msm_vidc_inst *inst,
}
static inline u32 calculate_h264e_scratch_size(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 work_mode)
u32 width, u32 height, u32 work_mode, u32 num_vpp_pipes)
{
return calculate_enc_scratch_size(inst, width, height, work_mode, 16);
return calculate_enc_scratch_size(inst, width, height, work_mode, 16,
num_vpp_pipes);
}
static inline u32 calculate_h265e_scratch_size(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 work_mode)
u32 width, u32 height, u32 work_mode, u32 num_vpp_pipes)
{
return calculate_enc_scratch_size(inst, width, height, work_mode, 32);
return calculate_enc_scratch_size(inst, width, height, work_mode, 32,
num_vpp_pipes);
}
static inline u32 calculate_vp8e_scratch_size(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 work_mode)
u32 width, u32 height, u32 work_mode, u32 num_vpp_pipes)
{
return calculate_enc_scratch_size(inst, width, height, work_mode, 16);
return calculate_enc_scratch_size(inst, width, height, work_mode, 16,
num_vpp_pipes);
}
static inline u32 calculate_h264d_scratch1_size(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 min_buf_count, bool split_mode_enabled)
u32 width, u32 height, u32 min_buf_count, bool split_mode_enabled,
u32 num_vpp_pipes)
{
u32 co_mv_size = 0, nonco_mv_size = 0;
u32 vpss_lb_size = 0;
u32 size = 0;
co_mv_size = hfi_iris2_h264d_comv_size(width, height, min_buf_count);
nonco_mv_size = hfi_iris2_h264d_non_comv_size(width, height);
nonco_mv_size = hfi_iris2_h264d_non_comv_size(width, height,
num_vpp_pipes);
if (split_mode_enabled)
vpss_lb_size = size_vpss_lb(width, height);
vpss_lb_size = size_vpss_lb(width, height, num_vpp_pipes);
size = co_mv_size + nonco_mv_size + vpss_lb_size;
return size;
}
static inline u32 calculate_h265d_scratch1_size(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 min_buf_count, bool split_mode_enabled)
u32 width, u32 height, u32 min_buf_count, bool split_mode_enabled,
u32 num_vpp_pipes)
{
u32 co_mv_size = 0, nonco_mv_size = 0;
u32 vpss_lb_size = 0;
u32 size = 0;
co_mv_size = hfi_iris2_h265d_comv_size(width, height, min_buf_count);
nonco_mv_size = hfi_iris2_h265d_non_comv_size(width, height);
nonco_mv_size =
hfi_iris2_h265d_non_comv_size(width, height, num_vpp_pipes);
if (split_mode_enabled)
vpss_lb_size = size_vpss_lb(width, height);
vpss_lb_size = size_vpss_lb(width, height, num_vpp_pipes);
size = co_mv_size + nonco_mv_size + vpss_lb_size +
HDR10_HIST_EXTRADATA_SIZE;
@ -1393,16 +1402,17 @@ static inline u32 hfi_iris2_vp8d_comv_size(u32 width, u32 height,
}
static inline u32 calculate_vp8d_scratch1_size(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 min_buf_count, bool split_mode_enabled)
u32 width, u32 height, u32 min_buf_count, bool split_mode_enabled,
u32 num_vpp_pipes)
{
u32 vpss_lb_size = 0;
u32 size = 0;
size = hfi_iris2_vp8d_comv_size(width, height, 0);
size += ALIGN(SIZE_VPXD_LB_FE_LEFT_CTRL(width, height),
VENUS_DMA_ALIGNMENT) * NUM_OF_VPP_PIPES +
VENUS_DMA_ALIGNMENT) * num_vpp_pipes +
ALIGN(SIZE_VPXD_LB_SE_LEFT_CTRL(width, height),
VENUS_DMA_ALIGNMENT) * NUM_OF_VPP_PIPES +
VENUS_DMA_ALIGNMENT) * num_vpp_pipes +
ALIGN(SIZE_VP8D_LB_VSP_TOP(width, height),
VENUS_DMA_ALIGNMENT) +
ALIGN(SIZE_VPXD_LB_FE_TOP_CTRL(width, height),
@ -1416,22 +1426,23 @@ static inline u32 calculate_vp8d_scratch1_size(struct msm_vidc_inst *inst,
ALIGN(SIZE_VP8D_LB_FE_TOP_DATA(width, height),
VENUS_DMA_ALIGNMENT);
if (split_mode_enabled)
vpss_lb_size = size_vpss_lb(width, height);
vpss_lb_size = size_vpss_lb(width, height, num_vpp_pipes);
size += vpss_lb_size;
return size;
}
static inline u32 calculate_vp9d_scratch1_size(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 min_buf_count, bool split_mode_enabled)
u32 width, u32 height, u32 min_buf_count, bool split_mode_enabled,
u32 num_vpp_pipes)
{
u32 vpss_lb_size = 0;
u32 size = 0;
size = ALIGN(SIZE_VPXD_LB_FE_LEFT_CTRL(width, height),
VENUS_DMA_ALIGNMENT) * NUM_OF_VPP_PIPES +
VENUS_DMA_ALIGNMENT) * num_vpp_pipes +
ALIGN(SIZE_VPXD_LB_SE_LEFT_CTRL(width, height),
VENUS_DMA_ALIGNMENT) * NUM_OF_VPP_PIPES +
VENUS_DMA_ALIGNMENT) * num_vpp_pipes +
ALIGN(SIZE_VP9D_LB_VSP_TOP(width, height),
VENUS_DMA_ALIGNMENT) +
ALIGN(SIZE_VPXD_LB_FE_TOP_CTRL(width, height),
@ -1445,22 +1456,23 @@ static inline u32 calculate_vp9d_scratch1_size(struct msm_vidc_inst *inst,
ALIGN(SIZE_VP9D_LB_FE_TOP_DATA(width, height),
VENUS_DMA_ALIGNMENT);
if (split_mode_enabled)
vpss_lb_size = size_vpss_lb(width, height);
vpss_lb_size = size_vpss_lb(width, height, num_vpp_pipes);
size += vpss_lb_size + HDR10_HIST_EXTRADATA_SIZE;
return size;
}
static inline u32 calculate_mpeg2d_scratch1_size(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 min_buf_count, bool split_mode_enabled)
u32 width, u32 height, u32 min_buf_count, bool split_mode_enabled,
u32 num_vpp_pipes)
{
u32 vpss_lb_size = 0;
u32 size = 0;
size = ALIGN(SIZE_VPXD_LB_FE_LEFT_CTRL(width, height),
VENUS_DMA_ALIGNMENT) * NUM_OF_VPP_PIPES +
VENUS_DMA_ALIGNMENT) * num_vpp_pipes +
ALIGN(SIZE_VPXD_LB_SE_LEFT_CTRL(width, height),
VENUS_DMA_ALIGNMENT) * NUM_OF_VPP_PIPES +
VENUS_DMA_ALIGNMENT) * num_vpp_pipes +
ALIGN(SIZE_VP8D_LB_VSP_TOP(width, height),
VENUS_DMA_ALIGNMENT) +
ALIGN(SIZE_VPXD_LB_FE_TOP_CTRL(width, height),
@ -1474,7 +1486,7 @@ static inline u32 calculate_mpeg2d_scratch1_size(struct msm_vidc_inst *inst,
ALIGN(SIZE_VP8D_LB_FE_TOP_DATA(width, height),
VENUS_DMA_ALIGNMENT);
if (split_mode_enabled)
vpss_lb_size = size_vpss_lb(width, height);
vpss_lb_size = size_vpss_lb(width, height, num_vpp_pipes);
size += vpss_lb_size;
return size;
@ -1630,27 +1642,27 @@ static inline u32 calculate_enc_scratch1_size(struct msm_vidc_inst *inst,
}
static inline u32 calculate_h264e_scratch1_size(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 num_ref, bool ten_bit)
u32 width, u32 height, u32 num_ref, bool ten_bit, u32 num_vpp_pipes)
{
return calculate_enc_scratch1_size(inst, width, height, 16,
num_ref, ten_bit, NUM_OF_VPP_PIPES, false);
num_ref, ten_bit, num_vpp_pipes, false);
}
static inline u32 calculate_h265e_scratch1_size(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 num_ref, bool ten_bit)
u32 width, u32 height, u32 num_ref, bool ten_bit, u32 num_vpp_pipes)
{
return calculate_enc_scratch1_size(inst, width, height, 32,
num_ref, ten_bit, NUM_OF_VPP_PIPES, true);
num_ref, ten_bit, num_vpp_pipes, true);
}
static inline u32 calculate_vp8e_scratch1_size(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 num_ref, bool ten_bit)
u32 width, u32 height, u32 num_ref, bool ten_bit, u32 num_vpp_pipes)
{
(void)num_vpp_pipes;
return calculate_enc_scratch1_size(inst, width, height, 16,
num_ref, ten_bit, 1, false);
}
static inline u32 hfi_ubwc_calc_metadata_plane_stride(u32 width,
u32 metadata_stride_multi, u32 tile_width_pels)
{

View file

@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2019, The Linux Foundation. All rights reserved.
* Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
*/
#ifndef __H_MSM_VIDC_BUFFER_MEM_DEFS_H__
@ -14,15 +14,17 @@ struct msm_vidc_dec_buff_size_calculators {
u32 (*calculate_scratch_size)(struct msm_vidc_inst *inst, u32 width,
u32 height, bool is_interlaced);
u32 (*calculate_scratch1_size)(struct msm_vidc_inst *inst, u32 width,
u32 height, u32 min_buf_count, bool split_mode_enabled);
u32 height, u32 min_buf_count, bool split_mode_enabled,
u32 num_vpp_pipes);
u32 (*calculate_persist1_size)(void);
};
struct msm_vidc_enc_buff_size_calculators {
u32 (*calculate_scratch_size)(struct msm_vidc_inst *inst, u32 width,
u32 height, u32 work_mode);
u32 height, u32 work_mode, u32 num_vpp_pipes);
u32 (*calculate_scratch1_size)(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 num_ref, bool ten_bit);
u32 width, u32 height, u32 num_ref, bool ten_bit,
u32 num_vpp_pipes);
u32 (*calculate_scratch2_size)(struct msm_vidc_inst *inst,
u32 width, u32 height, u32 num_ref, bool ten_bit);
u32 (*calculate_persist_size)(void);

View file

@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
*/
#ifndef _MSM_VIDC_INTERNAL_H_
@ -294,6 +294,7 @@ struct msm_vidc_platform_data {
unsigned int efuse_data_length;
unsigned int sku_version;
uint32_t vpu_ver;
uint32_t num_vpp_pipes;
struct msm_vidc_ubwc_config_data *ubwc_config;
};

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
* Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
*/
#include <linux/module.h>
@ -552,6 +552,7 @@ static struct msm_vidc_platform_data default_data = {
.efuse_data_length = 0,
.sku_version = 0,
.vpu_ver = VPU_VERSION_IRIS2,
.num_vpp_pipes = 0x4,
.ubwc_config = 0x0,
};
@ -567,6 +568,7 @@ static struct msm_vidc_platform_data lahaina_data = {
.efuse_data_length = 0,
.sku_version = 0,
.vpu_ver = VPU_VERSION_IRIS2,
.num_vpp_pipes = 0x4,
.ubwc_config = lahaina_ubwc_data,
.codecs = default_codecs,
.codecs_count = ARRAY_SIZE(default_codecs),
@ -586,6 +588,7 @@ static struct msm_vidc_platform_data bengal_data = {
.efuse_data_length = 0,
.sku_version = 0,
.vpu_ver = VPU_VERSION_AR50_LITE,
.num_vpp_pipes = 0x1,
.ubwc_config = 0x0,
.codecs = bengal_codecs,
.codecs_count = ARRAY_SIZE(bengal_codecs),