Browse Source

Merge "video-driver: add mmrm query support"

qctecmdr 3 years ago
parent
commit
4f953651a9

+ 1 - 0
driver/platform/waipio/src/msm_vidc_waipio.c

@@ -99,6 +99,7 @@ static struct msm_platform_core_capability core_data_waipio[] = {
 	{AV_SYNC_WINDOW_SIZE, 40},
 	{NON_FATAL_FAULTS, 1},
 	{ENC_AUTO_FRAMERATE, 1},
+	{MMRM, 1},
 };
 
 static struct msm_platform_inst_capability instance_data_waipio[] = {

+ 1 - 0
driver/vidc/inc/msm_vidc_internal.h

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

+ 29 - 0
driver/vidc/src/msm_vidc_probe.c

@@ -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");

+ 46 - 9
driver/vidc/src/venus_hfi.c

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