msm: vidc: Remove mese bw vote for video encoder

MESE BW vote is not applicable for Kona. We can reduce overall BW
requirement by removing this vote.

CRs-Fixed: 2487664
Change-Id: I7cd6e3937e8884a2e4790a49713bd33aaab9c4bf
Signed-off-by: Chinmay Sawarkar <chinmays@codeaurora.org>
This commit is contained in:
Chinmay Sawarkar 2019-05-10 12:27:11 -07:00
commit fcc05b6aac
2 changed files with 58 additions and 89 deletions

View file

@ -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},

View file

@ -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 {