diff --git a/msm/vidc/msm_vidc_bus_iris2.c b/msm/vidc/msm_vidc_bus_iris2.c index 1a9f92529438..4b5c4bdbfdc2 100644 --- a/msm/vidc/msm_vidc_bus_iris2.c +++ b/msm/vidc/msm_vidc_bus_iris2.c @@ -83,7 +83,7 @@ static unsigned long __calculate_decoder(struct vidc_bus_vote_data *d, lcu_size = d->lcu_size; - dpb_bpp = d->num_formats >= 1 ? __bpp(d->color_formats[0]) : INT_MAX; + dpb_bpp = __bpp(d->color_formats[0]); unified_dpb_opb = d->num_formats == 1; @@ -93,25 +93,12 @@ static unsigned long __calculate_decoder(struct vidc_bus_vote_data *d, opb_compression_enabled = d->num_formats >= 2 && __ubwc(d->color_formats[1]); - /* - * convert q16 number into integer and fractional part upto 2 places. - * ex : 105752 / 65536 = 1.61; 1.61 in q16 = 105752; - * integer part = 105752 / 65536 = 1; - * reminder = 105752 - 1 * 65536 = 40216; - * fractional part = 40216 * 100 / 65536 = 61; - * now converto to fp(1, 61, 100) for below code. - */ - - integer_part = d->compression_ratio >> 16; - frac_part = - ((d->compression_ratio - (integer_part << 16)) * 100) >> 16; - + integer_part = Q16_INT(d->compression_ratio); + frac_part = Q16_FRAC(d->compression_ratio); dpb_read_compression_factor = FP(integer_part, frac_part, 100); - integer_part = d->complexity_factor >> 16; - frac_part = - ((d->complexity_factor - (integer_part << 16)) * 100) >> 16; - + integer_part = Q16_INT(d->complexity_factor); + frac_part = Q16_FRAC(d->complexity_factor); motion_vector_complexity = FP(integer_part, frac_part, 100); dpb_write_compression_factor = dpb_read_compression_factor; @@ -134,7 +121,7 @@ static unsigned long __calculate_decoder(struct vidc_bus_vote_data *d, lcu_per_frame = DIV_ROUND_UP(width, lcu_size) * DIV_ROUND_UP(height, lcu_size); - bitrate = (d->bitrate + 1000000 - 1) / 1000000; + bitrate = DIV_ROUND_UP(d->bitrate, 1000000); bins_to_bit_factor = FP_INT(4); @@ -160,12 +147,15 @@ static unsigned long __calculate_decoder(struct vidc_bus_vote_data *d, collocated_bytes_per_lcu * fps), FP_INT(bps(1))); ddr.collocated_write = ddr.collocated_read; - y_bw_no_ubwc_8bpp = fp_div(fp_mult( - FP_INT((int)(width * height)), FP_INT((int)fps)), + y_bw_no_ubwc_8bpp = fp_div(FP_INT(width * height * fps), FP_INT(1000 * 1000)); - y_bw_no_ubwc_10bpp = fp_div(fp_mult(y_bw_no_ubwc_8bpp, FP_INT(256)), + + if (dpb_bpp != 8) { + y_bw_no_ubwc_10bpp = + fp_div(fp_mult(y_bw_no_ubwc_8bpp, FP_INT(256)), FP_INT(192)); - y_bw_10bpp_p010 = y_bw_no_ubwc_8bpp * 2; + y_bw_10bpp_p010 = y_bw_no_ubwc_8bpp * 2; + } ddr.dpb_read = dpb_bpp == 8 ? y_bw_no_ubwc_8bpp : y_bw_no_ubwc_10bpp; ddr.dpb_read = fp_div(fp_mult(ddr.dpb_read, @@ -194,8 +184,9 @@ static unsigned long __calculate_decoder(struct vidc_bus_vote_data *d, ddr.opb_write = fp_div(fp_mult(dpb_factor, ddr.opb_write), fp_mult(dpb_opb_scaling_ratio, opb_write_compression_factor)); - ddr.line_buffer_read = FP_INT(tnbr_per_lcu * - lcu_per_frame * fps / bps(1)); + ddr.line_buffer_read = + fp_div(FP_INT(tnbr_per_lcu * lcu_per_frame * fps), + FP_INT(bps(1))); ddr.line_buffer_write = ddr.line_buffer_read; if (llc_top_line_buf_enabled) { llc.line_buffer_read = ddr.line_buffer_read; @@ -309,14 +300,15 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d, llc_top_line_buf_enabled = false, llc_vpss_rot_line_buf_enabled = false; - fp_t bins_to_bit_factor, dpb_compression_factor, + unsigned int bins_to_bit_factor; + fp_t dpb_compression_factor, original_compression_factor, original_compression_factor_y, y_bw_no_ubwc_8bpp, y_bw_no_ubwc_10bpp, y_bw_10bpp_p010, input_compression_factor, downscaling_ratio, ref_y_read_bw_factor, ref_cbcr_read_bw_factor, - recon_write_bw_factor, mese_read_factor, + recon_write_bw_factor, total_ref_read_crcb, qsmmu_bw_overhead_factor; fp_t integer_part, frac_part; @@ -328,7 +320,6 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d, ref_read_y, ref_read_crcb, ref_write, ref_write_overlap, orig_read, line_buffer_read, line_buffer_write, - mese_read, mese_write, total; } ddr = {0}; @@ -352,31 +343,33 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d, downscaling_ratio = fp_div(FP_INT(d->input_width * d->input_height), FP_INT(d->output_width * d->output_height)); downscaling_ratio = max(downscaling_ratio, FP_ONE); - bitrate = d->bitrate > 0 ? d->bitrate / 1000000 : + bitrate = d->bitrate > 0 ? DIV_ROUND_UP(d->bitrate, 1000000) : __lut(width, height, fps)->bitrate; lcu_size = d->lcu_size; lcu_per_frame = DIV_ROUND_UP(width, lcu_size) * DIV_ROUND_UP(height, lcu_size); tnbr_per_lcu = 16; - y_bw_no_ubwc_8bpp = fp_div(fp_mult( - FP_INT((int)(width * height)), FP_INT(fps)), + dpb_bpp = __bpp(d->color_formats[0]); + + y_bw_no_ubwc_8bpp = fp_div(FP_INT(width * height * fps), FP_INT(1000 * 1000)); - y_bw_no_ubwc_10bpp = fp_div(fp_mult(y_bw_no_ubwc_8bpp, - FP_INT(256)), FP_INT(192)); - y_bw_10bpp_p010 = y_bw_no_ubwc_8bpp * 2; + + if (dpb_bpp != 8) { + y_bw_no_ubwc_10bpp = fp_div(fp_mult(y_bw_no_ubwc_8bpp, + FP_INT(256)), FP_INT(192)); + y_bw_10bpp_p010 = y_bw_no_ubwc_8bpp * 2; + } b_frames_enabled = d->b_frames_enabled; original_color_format = d->num_formats >= 1 ? d->color_formats[0] : HAL_UNUSED_COLOR; - dpb_bpp = d->num_formats >= 1 ? __bpp(d->color_formats[0]) : INT_MAX; - original_compression_enabled = __ubwc(original_color_format); work_mode_1 = d->work_mode == HFI_WORKMODE_1; low_power = d->power_mode == VIDC_POWER_LOW; - bins_to_bit_factor = FP_INT(4); + bins_to_bit_factor = 4; if (d->use_sys_cache) { llc_ref_chroma_cache_enabled = true; @@ -384,25 +377,12 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d, llc_vpss_rot_line_buf_enabled = true; } - /* - * Convert Q16 number into Integer and Fractional part upto 2 places. - * Ex : 105752 / 65536 = 1.61; 1.61 in Q16 = 105752; - * Integer part = 105752 / 65536 = 1; - * Reminder = 105752 - 1 * 65536 = 40216; - * Fractional part = 40216 * 100 / 65536 = 61; - * Now converto to FP(1, 61, 100) for below code. - */ - - integer_part = d->compression_ratio >> 16; - frac_part = - ((d->compression_ratio - (integer_part * 65536)) * 100) >> 16; - + integer_part = Q16_INT(d->compression_ratio); + frac_part = Q16_FRAC(d->compression_ratio); dpb_compression_factor = FP(integer_part, frac_part, 100); - integer_part = d->input_cr >> 16; - frac_part = - ((d->input_cr - (integer_part * 65536)) * 100) >> 16; - + integer_part = Q16_INT(d->input_cr); + frac_part = Q16_FRAC(d->input_cr); input_compression_factor = FP(integer_part, frac_part, 100); original_compression_factor = original_compression_factor_y = @@ -421,13 +401,7 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d, input_compression_factor; } - mese_read_factor = fp_div(FP_INT((width * height * fps)/4), - original_compression_factor_y); - mese_read_factor = fp_div(fp_mult(mese_read_factor, FP(2, 53, 100)), - FP_INT(1000 * 1000)); - - ddr.vsp_read = fp_div(fp_mult(FP_INT(bitrate), bins_to_bit_factor), - FP_INT(8)); + ddr.vsp_read = fp_div(FP_INT(bitrate * bins_to_bit_factor), FP_INT(8)); ddr.vsp_write = ddr.vsp_read + fp_div(FP_INT(bitrate), FP_INT(8)); collocated_bytes_per_lcu = lcu_size == 16 ? 16 : @@ -438,22 +412,21 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d, ddr.collocated_write = ddr.collocated_read; - ddr.ref_read_y = ddr.ref_read_crcb = dpb_bpp == 8 ? + ddr.ref_read_y = dpb_bpp == 8 ? y_bw_no_ubwc_8bpp : y_bw_no_ubwc_10bpp; + if (b_frames_enabled) + ddr.ref_read_y = ddr.ref_read_y * 2; + ddr.ref_read_y = fp_div(ddr.ref_read_y, dpb_compression_factor); + + ddr.ref_read_crcb = ddr.ref_read_y; + if (width != vertical_tile_width) { ddr.ref_read_y = fp_mult(ddr.ref_read_y, ref_y_read_bw_factor); } - ddr.ref_read_y = fp_div(ddr.ref_read_y, dpb_compression_factor); - if (b_frames_enabled) - ddr.ref_read_y = fp_mult(ddr.ref_read_y, FP_INT(2)); - ddr.ref_read_crcb = fp_mult(ddr.ref_read_crcb, FP(0, 50, 100)); - ddr.ref_read_crcb = fp_div(ddr.ref_read_crcb, dpb_compression_factor); - if (b_frames_enabled) - ddr.ref_read_crcb = fp_mult(ddr.ref_read_crcb, FP_INT(2)); if (llc_ref_chroma_cache_enabled) { total_ref_read_crcb = ddr.ref_read_crcb; @@ -478,8 +451,9 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d, if (rotation == 90 || rotation == 270) ddr.orig_read *= lcu_size == 32 ? (dpb_bpp == 8 ? 1 : 3) : 2; - ddr.line_buffer_read = FP_INT(tnbr_per_lcu * lcu_per_frame * - fps / bps(1)); + ddr.line_buffer_read = + fp_div(FP_INT(tnbr_per_lcu * lcu_per_frame * fps), + FP_INT(bps(1))); ddr.line_buffer_write = ddr.line_buffer_read; if (llc_top_line_buf_enabled) { @@ -487,24 +461,12 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d, ddr.line_buffer_read = ddr.line_buffer_write = FP_ZERO; } - ddr.mese_read = dpb_bpp == 8 ? y_bw_no_ubwc_8bpp : y_bw_no_ubwc_10bpp; - ddr.mese_read = fp_div(fp_mult(ddr.mese_read, FP(1, 37, 100)), - original_compression_factor_y) + mese_read_factor; - - ddr.mese_write = FP_INT((width * height)/512) + - fp_div(FP_INT((width * height)/4), - original_compression_factor_y) + - FP_INT((width * height)/128); - ddr.mese_write = fp_div(fp_mult(ddr.mese_write, FP_INT(fps)), - FP_INT(1000 * 1000)); - ddr.total = ddr.vsp_read + ddr.vsp_write + ddr.collocated_read + ddr.collocated_write + ddr.ref_read_y + ddr.ref_read_crcb + ddr.ref_write + ddr.ref_write_overlap + ddr.orig_read + - ddr.line_buffer_read + ddr.line_buffer_write + - ddr.mese_read + ddr.mese_write; + ddr.line_buffer_read + ddr.line_buffer_write; qsmmu_bw_overhead_factor = FP(1, 3, 100); ddr.total = fp_mult(ddr.total, qsmmu_bw_overhead_factor); @@ -540,13 +502,11 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d, {"DERIVED PARAMETERS", "", DUMP_HEADER_MAGIC}, {"lcu size", "%d", lcu_size}, {"bitrate (Mbit/sec)", "%lu", bitrate}, - {"bins to bit factor", DUMP_FP_FMT, bins_to_bit_factor}, + {"bins to bit factor", "%u", bins_to_bit_factor}, {"original compression factor", DUMP_FP_FMT, original_compression_factor}, {"original compression factor y", DUMP_FP_FMT, original_compression_factor_y}, - {"mese read factor", DUMP_FP_FMT, - mese_read_factor}, {"qsmmu_bw_overhead_factor", DUMP_FP_FMT, qsmmu_bw_overhead_factor}, {"bw for NV12 8bpc)", DUMP_FP_FMT, y_bw_no_ubwc_8bpp}, @@ -564,8 +524,6 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d, {"original read", DUMP_FP_FMT, ddr.orig_read}, {"line buffer read", DUMP_FP_FMT, ddr.line_buffer_read}, {"line buffer write", DUMP_FP_FMT, ddr.line_buffer_write}, - {"mese read", DUMP_FP_FMT, ddr.mese_read}, - {"mese write", DUMP_FP_FMT, ddr.mese_write}, {"INTERMEDIATE LLC B/W", "", DUMP_HEADER_MAGIC}, {"llc ref read crcb", DUMP_FP_FMT, llc.ref_read_crcb}, {"llc line buffer", DUMP_FP_FMT, llc.line_buffer}, diff --git a/msm/vidc/msm_vidc_internal.h b/msm/vidc/msm_vidc_internal.h index 5d8d165b82eb..795e52a96838 100644 --- a/msm/vidc/msm_vidc_internal.h +++ b/msm/vidc/msm_vidc_internal.h @@ -82,6 +82,17 @@ (((c) && (c)->core_ops && (c)->core_ops->op) ? \ ((c)->core_ops->op(__VA_ARGS__)) : 0) +/* + * Convert Q16 number into Integer and Fractional part upto 2 places. + * Ex : 105752 / 65536 = 1.61; 1.61 in Q16 = 105752; + * Integer part = 105752 / 65536 = 1; + * Reminder = 105752 * 0xFFFF = 40216; Last 16 bits. + * Fractional part = 40216 * 100 / 65536 = 61; + * Now convert to FP(1, 61, 100). + */ +#define Q16_INT(q) ((q) >> 16) +#define Q16_FRAC(q) ((((q) & 0xFFFF) * 100) >> 16) + struct msm_vidc_inst; enum vidc_ports {