msm: vidc: Force venus to max if operating rate is INT_MAX

If client sets operating rate as INT_MAX, vote the highest
Venus clock and BW. This will allow operating the video session
at highest possible performance. DCVS & Batching is disabled.

CRs-Fixed: 2502809
Change-Id: I33e952f501a3ba6c1c8588ee319e10a586941d05
Signed-off-by: Chinmay Sawarkar <chinmays@codeaurora.org>
This commit is contained in:
Chinmay Sawarkar 2019-08-15 15:48:55 -07:00
parent 305725a1a9
commit 8f3af55bc5
6 changed files with 60 additions and 65 deletions

View File

@ -854,12 +854,12 @@ static int msm_cvp_frame_process(struct msm_vidc_inst *inst,
}
/*
* Special handling for operating rate 0xFFFFFFFF,
* Special handling for operating rate INT_MAX,
* client's intention is not to skip cvp preprocess
* based on operating rate, skip logic can still be
* executed based on framerate though.
*/
if (cvp->operating_rate == 0xFFFFFFFF)
if (cvp->operating_rate == INT_MAX)
operating_rate = fps_max << 16;
else
operating_rate = cvp->operating_rate;

View File

@ -382,7 +382,7 @@ static struct msm_vidc_ctrl msm_vdec_ctrls[] = {
.id = V4L2_CID_MPEG_VIDC_VIDEO_OPERATING_RATE,
.name = "Decoder Operating rate",
.type = V4L2_CTRL_TYPE_INTEGER,
.minimum = (MINIMUM_FPS << 16),
.minimum = (DEFAULT_FPS << 16),/* Power Vote min fps */
.maximum = INT_MAX,
.default_value = (DEFAULT_FPS << 16),
.step = 1,
@ -906,6 +906,9 @@ int msm_vdec_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
break;
case V4L2_CID_MPEG_VIDC_VIDEO_OPERATING_RATE:
inst->clk_data.operating_rate = ctrl->val;
inst->flags &= ~VIDC_TURBO;
if (ctrl->val == INT_MAX)
inst->flags |= VIDC_TURBO;
break;
case V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_MODE:
inst->clk_data.low_latency_mode = !!ctrl->val;

View File

@ -762,7 +762,7 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = {
.id = V4L2_CID_MPEG_VIDC_VIDEO_OPERATING_RATE,
.name = "Encoder Operating rate",
.type = V4L2_CTRL_TYPE_INTEGER,
.minimum = (MINIMUM_FPS << 16),
.minimum = (DEFAULT_FPS << 16),/* Power Vote min fps */
.maximum = INT_MAX,
.default_value = (DEFAULT_FPS << 16),
.step = 1,
@ -1601,6 +1601,10 @@ int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
break;
case V4L2_CID_MPEG_VIDC_VIDEO_OPERATING_RATE:
inst->clk_data.operating_rate = ctrl->val;
inst->flags &= ~VIDC_TURBO;
if (ctrl->val == INT_MAX)
inst->flags |= VIDC_TURBO;
if (inst->state < MSM_VIDC_LOAD_RESOURCES)
msm_vidc_calculate_buffer_counts(inst);
if (inst->state == MSM_VIDC_START_DONE) {

View File

@ -358,7 +358,7 @@ int msm_comm_vote_bus(struct msm_vidc_inst *inst)
if (inst->clk_data.buffer_counter < DCVS_FTB_WINDOW &&
inst->session_type != MSM_VIDC_CVP)
vote_data->power_mode = VIDC_POWER_TURBO;
if (msm_vidc_clock_voting || is_turbo)
if (msm_vidc_clock_voting || is_turbo || is_turbo_session(inst))
vote_data->power_mode = VIDC_POWER_TURBO;
if (inst->session_type == MSM_VIDC_CVP) {
@ -640,7 +640,7 @@ static unsigned long msm_vidc_calc_freq_ar50(struct msm_vidc_inst *inst,
dcvs = &inst->clk_data;
mbs_per_second = msm_comm_get_inst_load_per_core(inst,
LOAD_CALC_NO_QUIRKS);
LOAD_POWER);
fps = msm_vidc_get_fps(inst);
@ -726,7 +726,7 @@ static unsigned long msm_vidc_calc_freq_iris1(struct msm_vidc_inst *inst,
dcvs = &inst->clk_data;
mbs_per_second = msm_comm_get_inst_load_per_core(inst,
LOAD_CALC_NO_QUIRKS);
LOAD_POWER);
fps = msm_vidc_get_fps(inst);
@ -822,7 +822,7 @@ static unsigned long msm_vidc_calc_freq_iris2(struct msm_vidc_inst *inst,
dcvs = &inst->clk_data;
mbs_per_second = msm_comm_get_inst_load_per_core(inst,
LOAD_CALC_NO_QUIRKS);
LOAD_POWER);
fps = msm_vidc_get_fps(inst);
@ -1105,6 +1105,7 @@ int msm_dcvs_try_enable(struct msm_vidc_inst *inst)
inst->flags & VIDC_THUMBNAIL ||
inst->clk_data.low_latency_mode ||
inst->batch.enable ||
is_turbo_session(inst) ||
inst->rc_type == V4L2_MPEG_VIDEO_BITRATE_MODE_CQ);
dprintk(VIDC_HIGH|VIDC_PERF, "DCVS %s: %pK\n",
@ -1171,7 +1172,7 @@ void msm_clock_data_reset(struct msm_vidc_inst *inst)
core = inst->core;
dcvs = &inst->clk_data;
load = msm_comm_get_inst_load_per_core(inst, LOAD_CALC_NO_QUIRKS);
load = msm_comm_get_inst_load_per_core(inst, LOAD_POWER);
cycles = inst->clk_data.entry->vpp_cycles;
allowed_clks_tbl = core->resources.allowed_clks_tbl;
if (inst->session_type == MSM_VIDC_ENCODER) {
@ -1678,7 +1679,7 @@ static u32 get_core_load(struct msm_vidc_core *core,
continue;
}
current_inst_mbs_per_sec = msm_comm_get_inst_load_per_core(inst,
LOAD_CALC_NO_QUIRKS);
LOAD_POWER);
load += current_inst_mbs_per_sec * cycles /
inst->clk_data.work_route;
}
@ -1715,11 +1716,11 @@ int msm_vidc_decide_core_and_power_mode_iris1(struct msm_vidc_inst *inst)
inst->clk_data.entry->low_power_cycles :
inst->clk_data.entry->vpp_cycles;
cur_inst_load = (msm_comm_get_inst_load(inst, LOAD_CALC_NO_QUIRKS) *
cur_inst_load = (msm_comm_get_inst_load(inst, LOAD_POWER) *
inst->clk_data.entry->vpp_cycles)/inst->clk_data.work_route;
cur_inst_lp_load = (msm_comm_get_inst_load(inst,
LOAD_CALC_NO_QUIRKS) * lp_cycles)/inst->clk_data.work_route;
LOAD_POWER) * lp_cycles)/inst->clk_data.work_route;
mbpf = msm_vidc_get_mbs_per_frame(inst);
mbps = mbpf * msm_vidc_get_fps(inst);

View File

@ -775,7 +775,8 @@ exit:
return count;
}
static int msm_comm_get_mbs_per_sec(struct msm_vidc_inst *inst)
static int msm_comm_get_mbs_per_sec(struct msm_vidc_inst *inst,
enum load_calc_quirks quirks)
{
int input_port_mbs, output_port_mbs;
int fps;
@ -789,11 +790,15 @@ static int msm_comm_get_mbs_per_sec(struct msm_vidc_inst *inst)
output_port_mbs = NUM_MBS_PER_FRAME(f->fmt.pix_mp.width,
f->fmt.pix_mp.height);
if (inst->clk_data.operating_rate > inst->clk_data.frame_rate)
fps = (inst->clk_data.operating_rate >> 16) ?
inst->clk_data.operating_rate >> 16 : 1;
else
fps = inst->clk_data.frame_rate >> 16;
fps = inst->clk_data.frame_rate;
/* For admission control operating rate is ignored */
if (quirks == LOAD_POWER)
fps = max(inst->clk_data.operating_rate,
inst->clk_data.frame_rate);
/* In case of fps < 1 we assume 1 */
fps = max(fps >> 16, 1);
return max(input_port_mbs, output_port_mbs) * fps;
}
@ -809,40 +814,28 @@ int msm_comm_get_inst_load(struct msm_vidc_inst *inst,
inst->state < MSM_VIDC_STOP_DONE))
goto exit;
load = msm_comm_get_mbs_per_sec(inst);
if (is_thumbnail_session(inst)) {
if (quirks & LOAD_CALC_IGNORE_THUMBNAIL_LOAD)
load = 0;
}
if (is_turbo_session(inst)) {
if (!(quirks & LOAD_CALC_IGNORE_TURBO_LOAD))
load = inst->core->resources.max_load;
}
/* Clock and Load calculations for REALTIME/NON-REALTIME
* OPERATING RATE SET/NO OPERATING RATE SET
*
* | OPERATING RATE SET | OPERATING RATE NOT SET |
* ----------------|--------------------- |------------------------|
* REALTIME | load = res * op_rate | load = res * fps |
* | clk = res * op_rate | clk = res * fps |
* ----------------|----------------------|------------------------|
* NON-REALTIME | load = res * 1 fps | load = res * 1 fps |
* | clk = res * op_rate | clk = res * fps |
* ----------------|----------------------|------------------------|
* Operating rate will either Default or Client value.
* Session admission control will be based on Load.
* Power requests based of calculated Clock/Freq.
* ----------------|----------------------------|
* REALTIME | Admission Control Load = |
* | res * fps |
* | Power Request Load = |
* | res * max(op, fps)|
* ----------------|----------------------------|
* NON-REALTIME/ | Admission Control Load = 0 |
* THUMBNAIL | Power Request Load = |
* | res * max(op, fps)|
* ----------------|----------------------------|
*/
if (!is_realtime_session(inst) &&
(quirks & LOAD_CALC_IGNORE_NON_REALTIME_LOAD)) {
if (!(inst->clk_data.frame_rate >> 16)) {
dprintk(VIDC_LOW, "instance:%pK fps = 0\n", inst);
load = 0;
} else {
load = msm_comm_get_mbs_per_sec(inst) /
(inst->clk_data.frame_rate >> 16);
}
if ((is_thumbnail_session(inst) ||
!is_realtime_session(inst)) &&
quirks == LOAD_ADMISSION_CONTROL) {
load = 0;
} else {
load = msm_comm_get_mbs_per_sec(inst, quirks);
}
exit:
@ -861,7 +854,7 @@ int msm_comm_get_inst_load_per_core(struct msm_vidc_inst *inst,
return load;
}
int msm_comm_get_load(struct msm_vidc_core *core,
int msm_comm_get_device_load(struct msm_vidc_core *core,
enum session_type type, enum load_calc_quirks quirks)
{
struct msm_vidc_inst *inst = NULL;
@ -3277,9 +3270,7 @@ static int msm_vidc_load_resources(int flipped_state,
struct hfi_device *hdev;
int num_mbs_per_sec = 0, max_load_adj = 0;
struct msm_vidc_core *core;
enum load_calc_quirks quirks = LOAD_CALC_IGNORE_TURBO_LOAD |
LOAD_CALC_IGNORE_THUMBNAIL_LOAD |
LOAD_CALC_IGNORE_NON_REALTIME_LOAD;
enum load_calc_quirks quirks = LOAD_ADMISSION_CONTROL;
if (!inst || !inst->core || !inst->core->device) {
dprintk(VIDC_ERR, "%s invalid parameters\n", __func__);
@ -3298,8 +3289,8 @@ static int msm_vidc_load_resources(int flipped_state,
core = inst->core;
num_mbs_per_sec =
msm_comm_get_load(core, MSM_VIDC_DECODER, quirks) +
msm_comm_get_load(core, MSM_VIDC_ENCODER, quirks);
msm_comm_get_device_load(core, MSM_VIDC_DECODER, quirks) +
msm_comm_get_device_load(core, MSM_VIDC_ENCODER, quirks);
max_load_adj = core->resources.max_load +
inst->capability.cap[CAP_MBS_PER_FRAME].max;
@ -5629,15 +5620,13 @@ static int msm_vidc_check_mbpf_supported(struct msm_vidc_inst *inst)
static int msm_vidc_check_mbps_supported(struct msm_vidc_inst *inst)
{
int num_mbs_per_sec = 0, max_load_adj = 0;
enum load_calc_quirks quirks = LOAD_CALC_IGNORE_TURBO_LOAD |
LOAD_CALC_IGNORE_THUMBNAIL_LOAD |
LOAD_CALC_IGNORE_NON_REALTIME_LOAD;
enum load_calc_quirks quirks = LOAD_ADMISSION_CONTROL;
if (inst->state == MSM_VIDC_OPEN_DONE) {
max_load_adj = inst->core->resources.max_load;
num_mbs_per_sec = msm_comm_get_load(inst->core,
num_mbs_per_sec = msm_comm_get_device_load(inst->core,
MSM_VIDC_DECODER, quirks);
num_mbs_per_sec += msm_comm_get_load(inst->core,
num_mbs_per_sec += msm_comm_get_device_load(inst->core,
MSM_VIDC_ENCODER, quirks);
if (num_mbs_per_sec > max_load_adj) {
dprintk(VIDC_ERR,

View File

@ -33,10 +33,8 @@ struct getprop_buf {
};
enum load_calc_quirks {
LOAD_CALC_NO_QUIRKS = 0,
LOAD_CALC_IGNORE_TURBO_LOAD = 1 << 0,
LOAD_CALC_IGNORE_THUMBNAIL_LOAD = 1 << 1,
LOAD_CALC_IGNORE_NON_REALTIME_LOAD = 1 << 2,
LOAD_POWER = 0,
LOAD_ADMISSION_CONTROL = 1,
};
enum client_set_controls {
@ -241,7 +239,7 @@ int msm_comm_get_inst_load(struct msm_vidc_inst *inst,
enum load_calc_quirks quirks);
int msm_comm_get_inst_load_per_core(struct msm_vidc_inst *inst,
enum load_calc_quirks quirks);
int msm_comm_get_load(struct msm_vidc_core *core,
int msm_comm_get_device_load(struct msm_vidc_core *core,
enum session_type type, enum load_calc_quirks quirks);
int msm_comm_set_color_format(struct msm_vidc_inst *inst,
enum hal_buffer buffer_type, int fourcc);