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

Commit 068491ae authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "devfreq: devfreq_spdm: Add IPC logging for hypervisor calls"

parents 02155415 f49a6d7f
Loading
Loading
Loading
Loading
+32 −1
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@
#include <linux/device.h>
#include <linux/devfreq.h>
#include <linux/init.h>
#include <linux/ipc_logging.h>
#include <linux/gfp.h>
#include <linux/list.h>
#include <linux/module.h>
@@ -26,7 +27,15 @@
#include "governor.h"
#include "devfreq_spdm.h"

static void *spdm_ipc_log_ctxt;
#define DEVFREQ_SPDM_DEFAULT_WINDOW_MS 100
#define SPDM_IPC_LOG_PAGES	5

#define SPDM_IPC_LOG(x...)	do { \
	pr_debug(x); \
	if (spdm_ipc_log_ctxt) \
		ipc_log_string(spdm_ipc_log_ctxt, x); \
} while (0)

static int change_bw(struct device *dev, unsigned long *freq, u32 flags)
{
@@ -61,7 +70,7 @@ update_thresholds:
	desc.arg[0] = SPDM_CMD_ENABLE;
	desc.arg[1] = data->spdm_client;
	desc.arg[2] = clk_get_rate(data->cci_clk);
	hvc_status = hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
	hvc_status = spdm_ext_call(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
	if (hvc_status)
		pr_err("HVC command %u failed with error %u", (int)desc.arg[0],
			hvc_status);
@@ -232,6 +241,17 @@ no_pdata:
	return ret;
}

int __spdm_hyp_call(u64 func_id, struct hvc_desc *desc)
{
	int ret = 0;

	SPDM_IPC_LOG("hvc call fn:0x%llx, cmd:%llu\n", func_id, desc->arg[0]);
	ret = hvc(func_id, desc);
	SPDM_IPC_LOG("hvc return fn:0x%llx cmd:%llu Ret[0]:%llu Ret[1]:%llu\n",
			func_id, desc->arg[0], desc->ret[0], desc->ret[1]);
	return ret;
}

static int probe(struct platform_device *pdev)
{
	struct spdm_data *data = 0;
@@ -280,6 +300,14 @@ static int probe(struct platform_device *pdev)
	}

	spdm_init_debugfs(&pdev->dev);
	spdm_ipc_log_ctxt = ipc_log_context_create(SPDM_IPC_LOG_PAGES,
							"devfreq_spdm", 0);

	if (IS_ERR_OR_NULL(spdm_ipc_log_ctxt)) {
		pr_err("%s: Failed to create IPC log context\n", __func__);
		spdm_ipc_log_ctxt = NULL;
	}


	return 0;

@@ -315,6 +343,9 @@ static int remove(struct platform_device *pdev)

	devm_kfree(&pdev->dev, data);

	if (spdm_ipc_log_ctxt)
		ipc_log_context_destroy(spdm_ipc_log_ctxt);

	return 0;
}

+3 −0
Original line number Diff line number Diff line
@@ -103,4 +103,7 @@ extern void spdm_remove_debugfs(struct spdm_data *data);
#define SPDM_CMD_CFG_MAXCCI 17
#define SPDM_CMD_CFG_VOTES 18

extern int __spdm_hyp_call(u64 func_id, struct hvc_desc *desc);
#define spdm_ext_call	__spdm_hyp_call

#endif
+18 −18
Original line number Diff line number Diff line
@@ -79,7 +79,7 @@ static irqreturn_t threaded_isr(int irq, void *dev_id)

	/* call hyp to get bw_vote */
	desc.arg[0] = SPDM_CMD_GET_BW_ALL;
	hvc_status = hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
	hvc_status = spdm_ext_call(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
	if (hvc_status)
		pr_err("HVC command %u failed with error %u", (int)desc.arg[0],
			hvc_status);
@@ -131,7 +131,7 @@ static int gov_spdm_hyp_target_bw(struct devfreq *devfreq, unsigned long *freq,
	} else {
		desc.arg[0] = SPDM_CMD_GET_BW_SPECIFIC;
		desc.arg[1] = ((struct spdm_data *)devfreq->data)->spdm_client;
		hvc_status = hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		hvc_status = spdm_ext_call(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		if (hvc_status)
			pr_err("HVC command %u failed with error %u",
				(int)desc.arg[0], hvc_status);
@@ -160,7 +160,7 @@ static int gov_spdm_hyp_eh(struct devfreq *devfreq, unsigned int event,
		desc.arg[2] = spdm_data->config_data.num_ports;
		for (i = 0; i < spdm_data->config_data.num_ports; i++)
			desc.arg[i+3] = spdm_data->config_data.ports[i];
		hvc_status = hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		hvc_status = spdm_ext_call(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		if (hvc_status)
			pr_err("HVC command %u failed with error %u",
				(int)desc.arg[0], hvc_status);
@@ -170,7 +170,7 @@ static int gov_spdm_hyp_eh(struct devfreq *devfreq, unsigned int event,
		desc.arg[2] = spdm_data->config_data.aup;
		desc.arg[3] = spdm_data->config_data.adown;
		desc.arg[4] = spdm_data->config_data.bucket_size;
		hvc_status = hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		hvc_status = spdm_ext_call(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		if (hvc_status)
			pr_err("HVC command %u failed with error %u",
				(int)desc.arg[0], hvc_status);
@@ -179,7 +179,7 @@ static int gov_spdm_hyp_eh(struct devfreq *devfreq, unsigned int event,
		desc.arg[1] = spdm_data->spdm_client;
		for (i = 0; i < SPDM_PL_COUNT - 1; i++)
			desc.arg[i+2] = spdm_data->config_data.pl_freqs[i];
		hvc_status = hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		hvc_status = spdm_ext_call(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		if (hvc_status)
			pr_err("HVC command %u failed with error %u",
				(int)desc.arg[0], hvc_status);
@@ -188,7 +188,7 @@ static int gov_spdm_hyp_eh(struct devfreq *devfreq, unsigned int event,
		desc.arg[1] = spdm_data->spdm_client;
		desc.arg[2] = spdm_data->config_data.reject_rate[0];
		desc.arg[3] = spdm_data->config_data.reject_rate[1];
		hvc_status = hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		hvc_status = spdm_ext_call(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		if (hvc_status)
			pr_err("HVC command %u failed with error %u",
				(int)desc.arg[0], hvc_status);
@@ -196,7 +196,7 @@ static int gov_spdm_hyp_eh(struct devfreq *devfreq, unsigned int event,
		desc.arg[1] = spdm_data->spdm_client;
		desc.arg[2] = spdm_data->config_data.reject_rate[2];
		desc.arg[3] = spdm_data->config_data.reject_rate[3];
		hvc_status = hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		hvc_status = spdm_ext_call(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		if (hvc_status)
			pr_err("HVC command %u failed with error %u",
				(int)desc.arg[0], hvc_status);
@@ -204,7 +204,7 @@ static int gov_spdm_hyp_eh(struct devfreq *devfreq, unsigned int event,
		desc.arg[1] = spdm_data->spdm_client;
		desc.arg[2] = spdm_data->config_data.reject_rate[4];
		desc.arg[3] = spdm_data->config_data.reject_rate[5];
		hvc_status = hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		hvc_status = spdm_ext_call(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		if (hvc_status)
			pr_err("HVC command %u failed with error %u",
				(int)desc.arg[0], hvc_status);
@@ -213,7 +213,7 @@ static int gov_spdm_hyp_eh(struct devfreq *devfreq, unsigned int event,
		desc.arg[1] = spdm_data->spdm_client;
		desc.arg[2] = spdm_data->config_data.response_time_us[0];
		desc.arg[3] = spdm_data->config_data.response_time_us[1];
		hvc_status = hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		hvc_status = spdm_ext_call(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		if (hvc_status)
			pr_err("HVC command %u failed with error %u",
				(int)desc.arg[0], hvc_status);
@@ -221,7 +221,7 @@ static int gov_spdm_hyp_eh(struct devfreq *devfreq, unsigned int event,
		desc.arg[1] = spdm_data->spdm_client;
		desc.arg[2] = spdm_data->config_data.response_time_us[2];
		desc.arg[3] = spdm_data->config_data.response_time_us[3];
		hvc_status = hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		hvc_status = spdm_ext_call(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		if (hvc_status)
			pr_err("HVC command %u failed with error %u",
				(int)desc.arg[0], hvc_status);
@@ -229,7 +229,7 @@ static int gov_spdm_hyp_eh(struct devfreq *devfreq, unsigned int event,
		desc.arg[1] = spdm_data->spdm_client;
		desc.arg[2] = spdm_data->config_data.response_time_us[4];
		desc.arg[3] = spdm_data->config_data.response_time_us[5];
		hvc_status = hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		hvc_status = spdm_ext_call(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		if (hvc_status)
			pr_err("HVC command %u failed with error %u",
				(int)desc.arg[0], hvc_status);
@@ -238,7 +238,7 @@ static int gov_spdm_hyp_eh(struct devfreq *devfreq, unsigned int event,
		desc.arg[1] = spdm_data->spdm_client;
		desc.arg[2] = spdm_data->config_data.cci_response_time_us[0];
		desc.arg[3] = spdm_data->config_data.cci_response_time_us[1];
		hvc_status = hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		hvc_status = spdm_ext_call(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		if (hvc_status)
			pr_err("HVC command %u failed with error %u",
				(int)desc.arg[0], hvc_status);
@@ -246,7 +246,7 @@ static int gov_spdm_hyp_eh(struct devfreq *devfreq, unsigned int event,
		desc.arg[1] = spdm_data->spdm_client;
		desc.arg[2] = spdm_data->config_data.cci_response_time_us[2];
		desc.arg[3] = spdm_data->config_data.cci_response_time_us[3];
		hvc_status = hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		hvc_status = spdm_ext_call(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		if (hvc_status)
			pr_err("HVC command %u failed with error %u",
				(int)desc.arg[0], hvc_status);
@@ -254,7 +254,7 @@ static int gov_spdm_hyp_eh(struct devfreq *devfreq, unsigned int event,
		desc.arg[1] = spdm_data->spdm_client;
		desc.arg[2] = spdm_data->config_data.cci_response_time_us[4];
		desc.arg[3] = spdm_data->config_data.cci_response_time_us[5];
		hvc_status = hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		hvc_status = spdm_ext_call(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		if (hvc_status)
			pr_err("HVC command %u failed with error %u",
				(int)desc.arg[0], hvc_status);
@@ -262,7 +262,7 @@ static int gov_spdm_hyp_eh(struct devfreq *devfreq, unsigned int event,
		desc.arg[0] = SPDM_CMD_CFG_MAXCCI;
		desc.arg[1] = spdm_data->spdm_client;
		desc.arg[2] = spdm_data->config_data.max_cci_freq;
		hvc_status = hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		hvc_status = spdm_ext_call(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		if (hvc_status)
			pr_err("HVC command %u failed with error %u",
				(int)desc.arg[0], hvc_status);
@@ -273,7 +273,7 @@ static int gov_spdm_hyp_eh(struct devfreq *devfreq, unsigned int event,
		desc.arg[3] = spdm_data->config_data.downstep;
		desc.arg[4] = spdm_data->config_data.max_vote;
		desc.arg[5] = spdm_data->config_data.up_step_multp;
		hvc_status = hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		hvc_status = spdm_ext_call(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		if (hvc_status)
			pr_err("HVC command %u failed with error %u",
				(int)desc.arg[0], hvc_status);
@@ -282,7 +282,7 @@ static int gov_spdm_hyp_eh(struct devfreq *devfreq, unsigned int event,
		desc.arg[0] = SPDM_CMD_ENABLE;
		desc.arg[1] = spdm_data->spdm_client;
		desc.arg[2] = 0;
		hvc_status = hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		hvc_status = spdm_ext_call(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		if (hvc_status) {
			pr_err("HVC command %u failed with error %u",
				(int)desc.arg[0], hvc_status);
@@ -309,7 +309,7 @@ static int gov_spdm_hyp_eh(struct devfreq *devfreq, unsigned int event,
		/* call hypvervisor to disable */
		desc.arg[0] = SPDM_CMD_DISABLE;
		desc.arg[1] = spdm_data->spdm_client;
		hvc_status = hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		hvc_status = spdm_ext_call(HVC_FN_SIP(SPDM_HYP_FNID), &desc);
		if (hvc_status)
			pr_err("HVC command %u failed with error %u",
				(int)desc.arg[0], hvc_status);