mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-12 07:37:31 -04:00
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:
parent
ac0ba4c8f7
commit
fcc05b6aac
2 changed files with 58 additions and 89 deletions
|
|
@ -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},
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Reference in a new issue