Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 32f02102 authored by George Shen's avatar George Shen
Browse files

msm: cvp: Add CVP clock frequency control



Added debug node to control CVP clock frequency for profiling
and debugging purpose.

Change-Id: I0ee386fcc3590ec6b6fa246e289120da5da1abd0
Signed-off-by: default avatarGeorge Shen <sqiao@codeaurora.org>
parent 7159e284
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -1442,6 +1442,9 @@ static int __set_clocks(struct iris_hfi_device *device, u32 freq)
	iris_hfi_for_each_clock(device, cl) {
		if (cl->has_scaling) {/* has_scaling */
			device->clk_freq = freq;
			if (msm_cvp_clock_voting)
				freq = msm_cvp_clock_voting;

			rc = clk_set_rate(cl->clk, freq);
			if (rc) {
				dprintk(CVP_ERR,
+65 −4
Original line number Diff line number Diff line
@@ -6,7 +6,8 @@
#define CREATE_TRACE_POINTS
#define MAX_SSR_STRING_LEN 10
#include "msm_cvp_debug.h"
#include "cvp_hfi_api.h"
#include "msm_cvp_common.h"
#include "cvp_core_hfi.h"

int msm_cvp_debug = CVP_ERR | CVP_WARN | CVP_FW;
EXPORT_SYMBOL(msm_cvp_debug);
@@ -190,8 +191,6 @@ struct dentry *msm_cvp_debugfs_init_drv(void)
	__debugfs_create(u32, "debug_output", &msm_cvp_debug_out) &&
	__debugfs_create(bool, "disable_thermal_mitigation",
			&msm_cvp_thermal_mitigation_disabled) &&
	__debugfs_create(u32, "core_clock_voting",
			&msm_cvp_clock_voting) &&
	__debugfs_create(bool, "disable_cvp_syscache",
			&msm_cvp_syscache_disable);

@@ -209,6 +208,62 @@ struct dentry *msm_cvp_debugfs_init_drv(void)
	return NULL;
}

static int _clk_rate_set(void *data, u64 val)
{
	struct msm_cvp_core *core;
	struct cvp_hfi_device *dev;
	struct allowed_clock_rates_table *tbl = NULL;
	unsigned int tbl_size, i;

	core = list_first_entry(&cvp_driver->cores, struct msm_cvp_core, list);
	dev = core->device;
	tbl = core->resources.allowed_clks_tbl;
	tbl_size = core->resources.allowed_clks_tbl_size;

	if (val == 0) {
		struct iris_hfi_device *hdev = dev->hfi_device_data;

		msm_cvp_clock_voting = 0;
		call_hfi_op(dev, scale_clocks, hdev, hdev->clk_freq);
		return 0;
	}

	for (i = 0; i < tbl_size; i++)
		if (val <= tbl[i].clock_rate)
			break;

	if (i == tbl_size)
		msm_cvp_clock_voting = tbl[tbl_size-1].clock_rate;
	else
		msm_cvp_clock_voting = tbl[i].clock_rate;

	dprintk(CVP_WARN, "Override cvp_clk_rate with %d\n",
			msm_cvp_clock_voting);

	call_hfi_op(dev, scale_clocks, dev->hfi_device_data,
		msm_cvp_clock_voting);

	return 0;
}

static int _clk_rate_get(void *data, u64 *val)
{
	struct msm_cvp_core *core;
	struct iris_hfi_device *hdev;

	core = list_first_entry(&cvp_driver->cores, struct msm_cvp_core, list);
	hdev = core->device->hfi_device_data;
	if (msm_cvp_clock_voting)
		*val = msm_cvp_clock_voting;
	else
		*val = hdev->clk_freq;

	return 0;
}

DEFINE_DEBUGFS_ATTRIBUTE(clk_rate_fops, _clk_rate_get, _clk_rate_set, "%llu\n");


struct dentry *msm_cvp_debugfs_init_core(struct msm_cvp_core *core,
		struct dentry *parent)
{
@@ -235,6 +290,12 @@ struct dentry *msm_cvp_debugfs_init_core(struct msm_cvp_core *core,
		dprintk(CVP_ERR, "debugfs_create_file: fail\n");
		goto failed_create_dir;
	}
	if (!debugfs_create_file("clock_rate", 0644, dir,
			NULL, &clk_rate_fops)) {
		dprintk(CVP_ERR, "debugfs_create_file: clock_rate fail\n");
		goto failed_create_dir;
	}

failed_create_dir:
	return dir;
}
@@ -370,7 +431,7 @@ struct dentry *msm_cvp_debugfs_init_inst(struct msm_cvp_inst *inst,
	info = debugfs_create_file("info", 0444, dir,
			idata, &inst_info_fops);
	if (!info) {
		dprintk(CVP_ERR, "debugfs_create_file: fail\n");
		dprintk(CVP_ERR, "debugfs_create_file: info fail\n");
		goto failed_create_file;
	}