diff options
| -rw-r--r-- | drivers/devfreq/Kconfig | 9 | ||||
| -rw-r--r-- | drivers/devfreq/devfreq_spdm.c | 70 | ||||
| -rw-r--r-- | drivers/devfreq/devfreq_spdm.h | 25 | ||||
| -rw-r--r-- | drivers/devfreq/devfreq_spdm_debugfs.c | 111 | ||||
| -rw-r--r-- | drivers/devfreq/governor_spdm_bw_hyp.c | 160 |
5 files changed, 238 insertions, 137 deletions
diff --git a/drivers/devfreq/Kconfig b/drivers/devfreq/Kconfig index b391ea4f8b34..f47a54c122f9 100644 --- a/drivers/devfreq/Kconfig +++ b/drivers/devfreq/Kconfig @@ -187,6 +187,15 @@ config MSM_DEVFREQ_DEVBW agnostic interface to so that some of the devfreq governors can be shared across SoCs. +config SPDM_SCM + bool "MSM SPDM SCM based call support" + depends on DEVFREQ_SPDM + help + SPDM driver support the dcvs algorithm logic being accessed via + scm or hvc calls. This adds the support for SPDM interaction to + tz via SCM based call. If not selected then Hypervior interaction + will be activated. + config DEVFREQ_SPDM bool "MSM SPDM based bandwidth voting" depends on ARCH_MSM diff --git a/drivers/devfreq/devfreq_spdm.c b/drivers/devfreq/devfreq_spdm.c index 5646f84b5248..1b7027098fff 100644 --- a/drivers/devfreq/devfreq_spdm.c +++ b/drivers/devfreq/devfreq_spdm.c @@ -1,5 +1,5 @@ /* -*Copyright (c) 2014, The Linux Foundation. All rights reserved. +*Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. * *This program is free software; you can redistribute it and/or modify *it under the terms of the GNU General Public License version 2 and @@ -22,7 +22,6 @@ #include <linux/msm-bus.h> #include <linux/of.h> #include <linux/platform_device.h> -#include <soc/qcom/hvc.h> #include "governor.h" #include "devfreq_spdm.h" @@ -37,14 +36,16 @@ static void *spdm_ipc_log_ctxt; ipc_log_string(spdm_ipc_log_ctxt, x); \ } while (0) +#define COPY_SIZE(x, y) ((x) <= (y) ? (x) : (y)) + static int change_bw(struct device *dev, unsigned long *freq, u32 flags) { struct spdm_data *data = 0; int i; int next_idx; int ret = 0; - struct hvc_desc desc = { { 0 } }; - int hvc_status = 0; + struct spdm_args desc = { { 0 } }; + int ext_status = 0; if (!dev || !freq) return -EINVAL; @@ -70,10 +71,10 @@ 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 = 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); + ext_status = spdm_ext_call(&desc, 3); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); return ret; } @@ -243,15 +244,54 @@ no_pdata: return ret; } -int __spdm_hyp_call(u64 func_id, struct hvc_desc *desc) +int __spdm_hyp_call(struct spdm_args *args, int num_args) { - int ret = 0; + struct hvc_desc desc = { { 0 } }; + int status; - 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; + memcpy(desc.arg, args->arg, + COPY_SIZE(sizeof(desc.arg), sizeof(args->arg))); + SPDM_IPC_LOG("hvc call fn:0x%x, cmd:%llu, num_args:%d\n", + HVC_FN_SIP(SPDM_HYP_FNID), desc.arg[0], num_args); + + status = hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc); + + memcpy(args->ret, desc.ret, + COPY_SIZE(sizeof(args->ret), sizeof(desc.ret))); + SPDM_IPC_LOG("hvc return fn:0x%x cmd:%llu Ret[0]:%llu Ret[1]:%llu\n", + HVC_FN_SIP(SPDM_HYP_FNID), desc.arg[0], + desc.ret[0], desc.ret[1]); + return status; +} + +int __spdm_scm_call(struct spdm_args *args, int num_args) +{ + int status = 0; + + SPDM_IPC_LOG("%s:svc_id:%d,cmd_id:%d,cmd:%llu,num_args:%d\n", + __func__, SPDM_SCM_SVC_ID, SPDM_SCM_CMD_ID, + args->arg[0], num_args); + + if (!is_scm_armv8()) { + status = scm_call(SPDM_SCM_SVC_ID, SPDM_SCM_CMD_ID, args->arg, + sizeof(args->arg), args->ret, + sizeof(args->ret)); + } else { + struct scm_desc desc = {0}; + desc.arginfo = SCM_ARGS(num_args); + memcpy(desc.args, args->arg, + COPY_SIZE(sizeof(desc.args), sizeof(args->arg))); + + status = scm_call2(SCM_SIP_FNID(SPDM_SCM_SVC_ID, + SPDM_SCM_CMD_ID), &desc); + + memcpy(args->ret, desc.ret, + COPY_SIZE(sizeof(args->ret), sizeof(desc.ret))); + } + SPDM_IPC_LOG("%s:svc_id:%d,cmd_id:%d,cmd:%llu,Ret[0]:%llu,Ret[1]:%llu\n" + , __func__, SPDM_SCM_SVC_ID, SPDM_SCM_CMD_ID, args->arg[0], + args->ret[0], args->ret[1]); + return status; } static int probe(struct platform_device *pdev) diff --git a/drivers/devfreq/devfreq_spdm.h b/drivers/devfreq/devfreq_spdm.h index f08e63fd10e5..4f7fd1cd8ef4 100644 --- a/drivers/devfreq/devfreq_spdm.h +++ b/drivers/devfreq/devfreq_spdm.h @@ -1,5 +1,5 @@ /* -*Copyright (c) 2014, The Linux Foundation. All rights reserved. +*Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. * *This program is free software; you can redistribute it and/or modify *it under the terms of the GNU General Public License version 2 and @@ -15,6 +15,8 @@ #define DEVFREQ_SPDM_H #include <linux/list.h> +#include <soc/qcom/hvc.h> +#include <soc/qcom/scm.h> enum pl_levels { SPDM_PL1, SPDM_PL2, SPDM_PL3, SPDM_PL_COUNT }; enum actions { SPDM_UP, SPDM_DOWN }; @@ -83,7 +85,9 @@ extern void spdm_init_debugfs(struct device *dev); extern void spdm_remove_debugfs(struct spdm_data *data); #define SPDM_HYP_FNID 5 -/* CMD ID's for hypervisor */ +#define SPDM_SCM_SVC_ID 0x9 +#define SPDM_SCM_CMD_ID 0x4 +/* SPDM CMD ID's for hypervisor/SCM */ #define SPDM_CMD_GET_BW_ALL 1 #define SPDM_CMD_GET_BW_SPECIFIC 2 #define SPDM_CMD_ENABLE 3 @@ -103,7 +107,20 @@ 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 +#define SPDM_MAX_ARGS 6 +#define SPDM_MAX_RETS 3 +struct spdm_args { + u64 arg[SPDM_MAX_ARGS]; + u64 ret[SPDM_MAX_RETS]; +}; + +extern int __spdm_hyp_call(struct spdm_args *args, int num_args); +extern int __spdm_scm_call(struct spdm_args *args, int num_args); + +#ifdef CONFIG_SPDM_SCM +#define spdm_ext_call __spdm_scm_call +#else +#define spdm_ext_call __spdm_hyp_call +#endif #endif diff --git a/drivers/devfreq/devfreq_spdm_debugfs.c b/drivers/devfreq/devfreq_spdm_debugfs.c index ef7ac3323ce2..8ef329620a86 100644 --- a/drivers/devfreq/devfreq_spdm_debugfs.c +++ b/drivers/devfreq/devfreq_spdm_debugfs.c @@ -1,5 +1,5 @@ /* -*Copyright (c) 2014, The Linux Foundation. All rights reserved. +*Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. * *This program is free software; you can redistribute it and/or modify *it under the terms of the GNU General Public License version 2 and @@ -15,7 +15,6 @@ #include <linux/module.h> #include <linux/slab.h> #include <linux/uaccess.h> -#include <soc/qcom/hvc.h> #include "devfreq_spdm.h" static int spdm_open(struct inode *inode, struct file *file) @@ -29,7 +28,8 @@ static ssize_t pl_write(struct file *file, const char __user *data, { struct spdm_data *spdm_data = file->private_data; char *buf; - struct hvc_desc desc; + struct spdm_args desc = { { 0 } }; + int ext_status = 0; int i; buf = kzalloc(size, GFP_KERNEL); @@ -47,8 +47,10 @@ static ssize_t pl_write(struct file *file, const char __user *data, 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]; - if (hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc)) - pr_debug("check hvc logs"); + ext_status = spdm_ext_call(&desc, SPDM_PL_COUNT + 1); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); *offset += size; kfree(buf); return size; @@ -64,7 +66,8 @@ static ssize_t rejrate_low_write(struct file *file, const char __user *data, { struct spdm_data *spdm_data = file->private_data; char *buf; - struct hvc_desc desc; + struct spdm_args desc = { { 0 } }; + int ext_status = 0; buf = kzalloc(size, GFP_KERNEL); @@ -80,8 +83,10 @@ static ssize_t rejrate_low_write(struct file *file, const char __user *data, 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]; - if (hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc)) - pr_debug("check hvc logs"); + ext_status = spdm_ext_call(&desc, 4); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); *offset += size; kfree(buf); return size; @@ -97,7 +102,8 @@ static ssize_t rejrate_med_write(struct file *file, const char __user *data, { struct spdm_data *spdm_data = file->private_data; char *buf; - struct hvc_desc desc; + struct spdm_args desc = { { 0 } }; + int ext_status = 0; buf = kzalloc(size, GFP_KERNEL); @@ -112,8 +118,10 @@ static ssize_t rejrate_med_write(struct file *file, const char __user *data, 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]; - if (hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc)) - pr_debug("check hvc logs"); + ext_status = spdm_ext_call(&desc, 4); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); *offset += size; kfree(buf); return size; @@ -129,7 +137,8 @@ static ssize_t rejrate_high_write(struct file *file, const char __user *data, { struct spdm_data *spdm_data = file->private_data; char *buf; - struct hvc_desc desc; + struct spdm_args desc = { { 0 } }; + int ext_status = 0; buf = kzalloc(size, GFP_KERNEL); @@ -144,8 +153,10 @@ static ssize_t rejrate_high_write(struct file *file, const char __user *data, 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]; - if (hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc)) - pr_debug("check hvc logs"); + ext_status = spdm_ext_call(&desc, 4); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); *offset += size; kfree(buf); return size; @@ -161,7 +172,8 @@ static ssize_t resptime_low_write(struct file *file, const char __user *data, { struct spdm_data *spdm_data = file->private_data; char *buf; - struct hvc_desc desc; + struct spdm_args desc = { { 0 } }; + int ext_status = 0; buf = kzalloc(size, GFP_KERNEL); @@ -176,8 +188,10 @@ static ssize_t resptime_low_write(struct file *file, const char __user *data, 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]; - if (hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc)) - pr_debug("check hvc logs"); + ext_status = spdm_ext_call(&desc, 4); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); *offset += size; kfree(buf); return size; @@ -193,7 +207,8 @@ static ssize_t resptime_med_write(struct file *file, const char __user *data, { struct spdm_data *spdm_data = file->private_data; char *buf; - struct hvc_desc desc; + struct spdm_args desc = { { 0 } }; + int ext_status = 0; buf = kzalloc(size, GFP_KERNEL); @@ -208,8 +223,10 @@ static ssize_t resptime_med_write(struct file *file, const char __user *data, 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]; - if (hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc)) - pr_debug("check hvc logs"); + ext_status = spdm_ext_call(&desc, 4); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); *offset += size; kfree(buf); return size; @@ -225,7 +242,8 @@ static ssize_t resptime_high_write(struct file *file, const char __user *data, { struct spdm_data *spdm_data = file->private_data; char *buf; - struct hvc_desc desc; + struct spdm_args desc = { { 0 } }; + int ext_status = 0; buf = kzalloc(size, GFP_KERNEL); @@ -240,8 +258,10 @@ static ssize_t resptime_high_write(struct file *file, const char __user *data, 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]; - if (hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc)) - pr_debug("check hvc logs"); + ext_status = spdm_ext_call(&desc, 4); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); *offset += size; kfree(buf); return size; @@ -257,7 +277,8 @@ static ssize_t cciresptime_low_write(struct file *file, const char __user *data, { struct spdm_data *spdm_data = file->private_data; char *buf; - struct hvc_desc desc; + struct spdm_args desc = { { 0 } }; + int ext_status = 0; buf = kzalloc(size, GFP_KERNEL); @@ -272,8 +293,10 @@ static ssize_t cciresptime_low_write(struct file *file, const char __user *data, 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]; - if (hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc)) - pr_debug("check hvc logs"); + ext_status = spdm_ext_call(&desc, 4); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); *offset += size; kfree(buf); return size; @@ -289,7 +312,8 @@ static ssize_t cciresptime_med_write(struct file *file, const char __user *data, { struct spdm_data *spdm_data = file->private_data; char *buf; - struct hvc_desc desc; + struct spdm_args desc = { { 0 } }; + int ext_status = 0; buf = kzalloc(size, GFP_KERNEL); @@ -304,8 +328,10 @@ static ssize_t cciresptime_med_write(struct file *file, const char __user *data, 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]; - if (hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc)) - pr_debug("check hvc logs"); + ext_status = spdm_ext_call(&desc, 4); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); *offset += size; kfree(buf); return size; @@ -322,7 +348,8 @@ static ssize_t cciresptime_high_write(struct file *file, { struct spdm_data *spdm_data = file->private_data; char *buf; - struct hvc_desc desc; + struct spdm_args desc = { { 0 } }; + int ext_status = 0; buf = kzalloc(size, GFP_KERNEL); @@ -337,8 +364,10 @@ static ssize_t cciresptime_high_write(struct file *file, 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]; - if (hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc)) - pr_debug("check hvc logs"); + ext_status = spdm_ext_call(&desc, 4); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); *offset += size; kfree(buf); return size; @@ -354,7 +383,8 @@ static ssize_t cci_max_write(struct file *file, const char __user *data, { struct spdm_data *spdm_data = file->private_data; char *buf; - struct hvc_desc desc; + struct spdm_args desc = { { 0 } }; + int ext_status = 0; buf = kzalloc(size, GFP_KERNEL); @@ -367,8 +397,10 @@ static ssize_t cci_max_write(struct file *file, const char __user *data, desc.arg[0] = SPDM_CMD_CFG_MAXCCI; desc.arg[1] = spdm_data->spdm_client; desc.arg[2] = spdm_data->config_data.max_cci_freq; - if (hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc)) - pr_debug("check hvc logs"); + ext_status = spdm_ext_call(&desc, 3); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); *offset += size; kfree(buf); return size; @@ -384,7 +416,8 @@ static ssize_t vote_cfg_write(struct file *file, const char __user *data, { struct spdm_data *spdm_data = file->private_data; char *buf; - struct hvc_desc desc; + struct spdm_args desc = { { 0 } }; + int ext_status = 0; buf = kzalloc(size, GFP_KERNEL); @@ -403,8 +436,10 @@ static ssize_t vote_cfg_write(struct file *file, const char __user *data, 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; - if (hvc(HVC_FN_SIP(SPDM_HYP_FNID), &desc)) - pr_debug("check hvc logs"); + ext_status = spdm_ext_call(&desc, 6); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); *offset += size; kfree(buf); return size; diff --git a/drivers/devfreq/governor_spdm_bw_hyp.c b/drivers/devfreq/governor_spdm_bw_hyp.c index 319fb847e920..a97d0425926f 100644 --- a/drivers/devfreq/governor_spdm_bw_hyp.c +++ b/drivers/devfreq/governor_spdm_bw_hyp.c @@ -1,5 +1,5 @@ /* -*Copyright (c) 2014, The Linux Foundation. All rights reserved. +*Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. * *This program is free software; you can redistribute it and/or modify *it under the terms of the GNU General Public License version 2 and @@ -21,7 +21,6 @@ #include <linux/of.h> #include <linux/platform_device.h> #include <soc/qcom/rpm-smd.h> -#include <soc/qcom/hvc.h> #include "governor.h" #include "devfreq_spdm.h" @@ -74,15 +73,15 @@ static int disable_clocks(void) static irqreturn_t threaded_isr(int irq, void *dev_id) { struct spdm_data *data; - struct hvc_desc desc = { { 0 } }; - int hvc_status = 0; + struct spdm_args desc = { { 0 } }; + int ext_status = 0; /* call hyp to get bw_vote */ desc.arg[0] = SPDM_CMD_GET_BW_ALL; - 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); + ext_status = spdm_ext_call(&desc, 1); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); mutex_lock(&devfreqs_lock); list_for_each_entry(data, &devfreqs, list) { if (data->spdm_client == desc.ret[0]) { @@ -112,8 +111,8 @@ static int gov_spdm_hyp_target_bw(struct devfreq *devfreq, unsigned long *freq, struct devfreq_dev_status status; int ret = -EINVAL; int usage; - struct hvc_desc desc = { { 0 } }; - int hvc_status = 0; + struct spdm_args desc = { { 0 } }; + int ext_status = 0; if (!devfreq || !devfreq->profile || !devfreq->profile->get_dev_status) return ret; @@ -131,10 +130,10 @@ 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 = 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); + ext_status = spdm_ext_call(&desc, 2); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); *freq = desc.ret[0] >> 6; } @@ -144,8 +143,8 @@ static int gov_spdm_hyp_target_bw(struct devfreq *devfreq, unsigned long *freq, static int gov_spdm_hyp_eh(struct devfreq *devfreq, unsigned int event, void *data) { - struct hvc_desc desc = { { 0 } }; - int hvc_status = 0; + struct spdm_args desc = { { 0 } }; + int ext_status = 0; struct spdm_data *spdm_data = (struct spdm_data *)devfreq->data; int i; @@ -160,112 +159,113 @@ 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 = 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); + ext_status = spdm_ext_call(&desc, + spdm_data->config_data.num_ports + 3); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); desc.arg[0] = SPDM_CMD_CFG_FLTR; desc.arg[1] = spdm_data->spdm_client; 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 = 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); + ext_status = spdm_ext_call(&desc, 5); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); desc.arg[0] = SPDM_CMD_CFG_PL; 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 = 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); + ext_status = spdm_ext_call(&desc, SPDM_PL_COUNT + 1); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); desc.arg[0] = SPDM_CMD_CFG_REJRATE_LOW; 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 = 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); + ext_status = spdm_ext_call(&desc, 4); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); desc.arg[0] = SPDM_CMD_CFG_REJRATE_MED; 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 = 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); + ext_status = spdm_ext_call(&desc, 4); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); desc.arg[0] = SPDM_CMD_CFG_REJRATE_HIGH; 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 = 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); + ext_status = spdm_ext_call(&desc, 4); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); desc.arg[0] = SPDM_CMD_CFG_RESPTIME_LOW; 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 = 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); + ext_status = spdm_ext_call(&desc, 4); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); desc.arg[0] = SPDM_CMD_CFG_RESPTIME_MED; 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 = 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); + ext_status = spdm_ext_call(&desc, 4); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); desc.arg[0] = SPDM_CMD_CFG_RESPTIME_HIGH; 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 = 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); + ext_status = spdm_ext_call(&desc, 4); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); desc.arg[0] = SPDM_CMD_CFG_CCIRESPTIME_LOW; 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 = 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); + ext_status = spdm_ext_call(&desc, 4); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); desc.arg[0] = SPDM_CMD_CFG_CCIRESPTIME_MED; 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 = 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); + ext_status = spdm_ext_call(&desc, 4); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); desc.arg[0] = SPDM_CMD_CFG_CCIRESPTIME_HIGH; 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 = 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); + ext_status = spdm_ext_call(&desc, 4); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); 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 = 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); + ext_status = spdm_ext_call(&desc, 3); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); desc.arg[0] = SPDM_CMD_CFG_VOTES; desc.arg[1] = spdm_data->spdm_client; @@ -273,19 +273,19 @@ 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 = 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); + ext_status = spdm_ext_call(&desc, 6); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); /* call hyp enable/commit */ desc.arg[0] = SPDM_CMD_ENABLE; desc.arg[1] = spdm_data->spdm_client; desc.arg[2] = 0; - 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); + ext_status = spdm_ext_call(&desc, 3); + if (ext_status) { + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); mutex_lock(&devfreqs_lock); /* * the spdm device probe will fail so remove it from @@ -309,10 +309,10 @@ 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 = 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); + ext_status = spdm_ext_call(&desc, 2); + if (ext_status) + pr_err("External command %u failed with error %u", + (int)desc.arg[0], ext_status); break; case DEVFREQ_GOV_INTERVAL: |
