Merge "video-driver: add mmrm query support"

This commit is contained in:
qctecmdr
2021-10-22 14:37:00 -07:00
committed by Gerrit - the friendly Code Review server
4 changed files with 77 additions and 9 deletions

View File

@@ -341,6 +341,7 @@ enum msm_vidc_core_capability_type {
CLK_FREQ_THRESHOLD,
NON_FATAL_FAULTS,
ENC_AUTO_FRAMERATE,
MMRM,
CORE_CAP_MAX,
};

View File

@@ -170,6 +170,29 @@ static int msm_vidc_register_video_device(struct msm_vidc_core *core,
return 0;
}
static int msm_vidc_check_mmrm_support(struct msm_vidc_core *core)
{
int rc = 0;
if (!core || !core->capabilities) {
d_vpr_e("%s: invalid params\n", __func__);
return -EINVAL;
}
if (!core->capabilities[MMRM].value)
goto exit;
/* Todo: Dependency on MMRM driver changes */
// if (!mmrm_client_check_scaling_supported(MMRM_CLIENT_CLOCK, 0)) {
// d_vpr_e("%s: MMRM not supported\n", __func__);
// core->capabilities[MMRM].value = 0;
// }
exit:
d_vpr_h("%s: %d\n", __func__, core->capabilities[MMRM].value);
return rc;
}
static int msm_vidc_deinitialize_core(struct msm_vidc_core *core)
{
int rc = 0;
@@ -393,6 +416,12 @@ static int msm_vidc_probe_video_device(struct platform_device *pdev)
goto enc_reg_failed;
}
rc = msm_vidc_check_mmrm_support(core);
if (rc) {
d_vpr_e("Failed to check MMRM scaling support\n");
rc = 0; /* Ignore error */
}
core->debugfs_root = msm_vidc_debugfs_init_core(core);
if (!core->debugfs_root)
d_vpr_h("Failed to init debugfs core\n");

View File

@@ -662,11 +662,15 @@ int __set_clk_rate(struct msm_vidc_core *core,
struct mmrm_client *client;
/* not registered */
if (!core || !cl || !cl->mmrm_client) {
if (!core || !cl || !core->capabilities) {
d_vpr_e("%s: invalid params\n", __func__);
return -EINVAL;
}
client = cl->mmrm_client;
if (core->capabilities[MMRM].value && !cl->mmrm_client) {
d_vpr_e("%s: invalid mmrm client\n", __func__);
return -EINVAL;
}
/*
* This conversion is necessary since we are scaling clock values based on
@@ -681,13 +685,26 @@ int __set_clk_rate(struct msm_vidc_core *core,
return 0;
d_vpr_p("Scaling clock %s to %llu, prev %llu\n", cl->name, rate, cl->prev);
memset(&client_data, 0, sizeof(client_data));
client_data.num_hw_blocks = 1;
rc = mmrm_client_set_value(client, &client_data, rate);
if (rc) {
d_vpr_e("%s: Failed to set clock rate %llu %s: %d\n",
__func__, rate, cl->name, rc);
return rc;
if (core->capabilities[MMRM].value) {
/* set clock rate to mmrm driver */
client = cl->mmrm_client;
memset(&client_data, 0, sizeof(client_data));
client_data.num_hw_blocks = 1;
rc = mmrm_client_set_value(client, &client_data, rate);
if (rc) {
d_vpr_e("%s: Failed to set mmrm clock rate %llu %s: %d\n",
__func__, rate, cl->name, rc);
return rc;
}
} else {
/* set clock rate to clock driver */
rc = clk_set_rate(cl->clk, rate);
if (rc) {
d_vpr_e("%s: Failed to set clock rate %llu %s: %d\n",
__func__, rate, cl->name, rc);
return rc;
}
}
cl->prev = rate;
return rc;
@@ -1425,6 +1442,16 @@ static void __deregister_mmrm(struct msm_vidc_core *core)
{
struct clock_info *cl;
if (!core || !core->capabilities) {
d_vpr_e("%s: invalid params\n", __func__);
return;
}
if (!core->capabilities[MMRM].value) {
d_vpr_h("%s: MMRM not supported\n", __func__);
return;
}
venus_hfi_for_each_clock(core, cl) {
if (cl->has_scaling && cl->mmrm_client) {
mmrm_client_deregister(cl->mmrm_client);
@@ -1438,6 +1465,16 @@ static int __register_mmrm(struct msm_vidc_core *core)
int rc = 0;
struct clock_info *cl;
if (!core ||!core->capabilities) {
d_vpr_e("%s: invalid params\n", __func__);
return -EINVAL;
}
if (!core->capabilities[MMRM].value) {
d_vpr_h("%s: MMRM not supported\n", __func__);
return 0;
}
venus_hfi_for_each_clock(core, cl) {
struct mmrm_client_desc desc;
char *name = (char *)desc.client_info.desc.name;