From: Albert Esteve <aesteve@redhat.com>
To: Bjorn Andersson <andersson@kernel.org>,
Konrad Dybcio <konradybcio@kernel.org>,
Philipp Zabel <p.zabel@pengutronix.de>,
Russell King <linux@armlinux.org.uk>,
"Rafael J. Wysocki" <rafael@kernel.org>,
Daniel Lezcano <daniel.lezcano@kernel.org>,
Christian Loehle <christian.loehle@arm.com>,
Maximilian Luz <luzmaximilian@gmail.com>,
Bartosz Golaszewski <brgl@kernel.org>,
Rob Clark <robin.clark@oss.qualcomm.com>,
Sean Paul <sean@poorly.run>,
Akhil P Oommen <akhilpo@oss.qualcomm.com>,
Dmitry Baryshkov <lumag@kernel.org>,
Abhinav Kumar <abhinav.kumar@linux.dev>,
Jessica Zhang <jesszhan0024@gmail.com>,
Marijn Suijten <marijn.suijten@somainline.org>,
David Airlie <airlied@gmail.com>,
Simona Vetter <simona@ffwll.ch>, Will Deacon <will@kernel.org>,
Robin Murphy <robin.murphy@arm.com>,
"Joerg Roedel (AMD)" <joro@8bytes.org>,
Thomas Gleixner <tglx@kernel.org>, Radu Rendec <radu@rendec.net>,
Vikash Garodia <vikash.garodia@oss.qualcomm.com>,
Dikshita Agarwal <dikshita.agarwal@oss.qualcomm.com>,
Bryan O'Donoghue <bod@kernel.org>,
Mauro Carvalho Chehab <mchehab@kernel.org>,
Srinivas Kandagatla <srini@kernel.org>,
Ekansh Gupta <ekansh.gupta@oss.qualcomm.com>,
Arnd Bergmann <arnd@arndb.de>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Jeff Johnson <jjohnson@kernel.org>,
Linus Walleij <linusw@kernel.org>,
Mathieu Poirier <mathieu.poirier@linaro.org>,
Amirreza Zarrabi <amirreza.zarrabi@oss.qualcomm.com>,
Jens Wiklander <jenswi@kernel.org>,
Sumit Garg <sumit.garg@kernel.org>,
Amit Kucheria <amitk@kernel.org>,
Thara Gopinath <thara.gopinath@gmail.com>,
Zhang Rui <rui.zhang@intel.com>,
Lukasz Luba <lukasz.luba@arm.com>,
Brian Norris <briannorris@chromium.org>,
Govind Singh <govinds@codeaurora.org>,
Niklas Cassel <niklas.cassel@linaro.org>,
Kalle Valo <kvalo@kernel.org>
Cc: linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org, linux-pm@vger.kernel.org,
dri-devel@lists.freedesktop.org,
freedreno@lists.freedesktop.org, iommu@lists.linux.dev,
linux-media@vger.kernel.org, linux-wireless@vger.kernel.org,
ath10k@lists.infradead.org, linux-gpio@vger.kernel.org,
linux-remoteproc@vger.kernel.org,
op-tee@lists.trustedfirmware.org,
Maxime Ripard <mripard@kernel.org>,
Albert Esteve <aesteve@redhat.com>
Subject: [PATCH 1/3] firmware: qcom: scm: pass qcom_scm to internal helpers
Date: Mon, 14 Sep 2026 14:41:54 +0200 [thread overview]
Message-ID: <20260914-scm-device-api-v1-1-3573e2596c51@redhat.com> (raw)
In-Reply-To: <20260914-scm-device-api-v1-0-3573e2596c51@redhat.com>
Thread struct qcom_scm through the driver's internal helpers
instead of reaching into the __scm singleton. Recover the
instance from the SCM device where a callback only provides
struct device or reset_controller_dev.
Exported function signatures are unchanged; the wrappers still
use __scm internally.
Signed-off-by: Albert Esteve <aesteve@redhat.com>
---
drivers/firmware/qcom/qcom_scm.c | 416 +++++++++++++++++++++++++--------------
1 file changed, 263 insertions(+), 153 deletions(-)
diff --git a/drivers/firmware/qcom/qcom_scm.c b/drivers/firmware/qcom/qcom_scm.c
index 3eaa4c9ccf3c..eac779f4855d 100644
--- a/drivers/firmware/qcom/qcom_scm.c
+++ b/drivers/firmware/qcom/qcom_scm.c
@@ -176,69 +176,69 @@ static const char * const download_mode_name[] = {
static struct qcom_scm *__scm;
-static int qcom_scm_clk_enable(void)
+static int qcom_scm_clk_enable(struct qcom_scm *scm)
{
int ret;
- ret = clk_prepare_enable(__scm->core_clk);
+ ret = clk_prepare_enable(scm->core_clk);
if (ret)
goto bail;
- ret = clk_prepare_enable(__scm->iface_clk);
+ ret = clk_prepare_enable(scm->iface_clk);
if (ret)
goto disable_core;
- ret = clk_prepare_enable(__scm->bus_clk);
+ ret = clk_prepare_enable(scm->bus_clk);
if (ret)
goto disable_iface;
return 0;
disable_iface:
- clk_disable_unprepare(__scm->iface_clk);
+ clk_disable_unprepare(scm->iface_clk);
disable_core:
- clk_disable_unprepare(__scm->core_clk);
+ clk_disable_unprepare(scm->core_clk);
bail:
return ret;
}
-static void qcom_scm_clk_disable(void)
+static void qcom_scm_clk_disable(struct qcom_scm *scm)
{
- clk_disable_unprepare(__scm->core_clk);
- clk_disable_unprepare(__scm->iface_clk);
- clk_disable_unprepare(__scm->bus_clk);
+ clk_disable_unprepare(scm->core_clk);
+ clk_disable_unprepare(scm->iface_clk);
+ clk_disable_unprepare(scm->bus_clk);
}
-static int qcom_scm_bw_enable(void)
+static int qcom_scm_bw_enable(struct qcom_scm *scm)
{
int ret = 0;
- if (!__scm->path)
+ if (!scm->path)
return 0;
- guard(mutex)(&__scm->scm_bw_lock);
+ guard(mutex)(&scm->scm_bw_lock);
- if (!__scm->scm_vote_count) {
- ret = icc_set_bw(__scm->path, 0, UINT_MAX);
+ if (!scm->scm_vote_count) {
+ ret = icc_set_bw(scm->path, 0, UINT_MAX);
if (ret < 0) {
- dev_err(__scm->dev, "failed to set bandwidth request\n");
+ dev_err(scm->dev, "failed to set bandwidth request\n");
return ret;
}
}
- __scm->scm_vote_count++;
+ scm->scm_vote_count++;
return 0;
}
-static void qcom_scm_bw_disable(void)
+static void qcom_scm_bw_disable(struct qcom_scm *scm)
{
- if (!__scm->path)
+ if (!scm->path)
return;
- mutex_lock(&__scm->scm_bw_lock);
- if (__scm->scm_vote_count-- == 1)
- icc_set_bw(__scm->path, 0, 0);
- mutex_unlock(&__scm->scm_bw_lock);
+ mutex_lock(&scm->scm_bw_lock);
+ if (scm->scm_vote_count-- == 1)
+ icc_set_bw(scm->path, 0, 0);
+ mutex_unlock(&scm->scm_bw_lock);
}
enum qcom_scm_convention qcom_scm_convention = SMC_CONVENTION_UNKNOWN;
@@ -252,7 +252,7 @@ struct qcom_tzmem_pool *qcom_scm_get_tzmem_pool(void)
return __scm->mempool;
}
-static enum qcom_scm_convention __get_convention(void)
+static enum qcom_scm_convention __get_convention(struct device *dev)
{
unsigned long flags;
struct qcom_scm_desc desc = {
@@ -294,7 +294,7 @@ static enum qcom_scm_convention __get_convention(void)
* early calls into the firmware on these SoCs so the device pointer
* will be valid here to check if the compatible matches.
*/
- if (of_device_is_compatible(__scm ? __scm->dev->of_node : NULL, "qcom,scm-sc7180")) {
+ if (of_device_is_compatible(dev ? dev->of_node : NULL, "qcom,scm-sc7180")) {
forced = true;
goto found;
}
@@ -332,7 +332,7 @@ static int qcom_scm_call(struct device *dev, const struct qcom_scm_desc *desc,
struct qcom_scm_res *res)
{
might_sleep();
- switch (__get_convention()) {
+ switch (__get_convention(dev)) {
case SMC_CONVENTION_ARM_32:
case SMC_CONVENTION_ARM_64:
return scm_smc_call(dev, desc, res, false);
@@ -357,7 +357,7 @@ static int qcom_scm_call_atomic(struct device *dev,
const struct qcom_scm_desc *desc,
struct qcom_scm_res *res)
{
- switch (__get_convention()) {
+ switch (__get_convention(dev)) {
case SMC_CONVENTION_ARM_32:
case SMC_CONVENTION_ARM_64:
return scm_smc_call(dev, desc, res, true);
@@ -381,7 +381,7 @@ static bool __qcom_scm_is_call_available(struct device *dev, u32 svc_id,
struct qcom_scm_res res;
desc.arginfo = QCOM_SCM_ARGS(1);
- switch (__get_convention()) {
+ switch (__get_convention(dev)) {
case SMC_CONVENTION_ARM_32:
case SMC_CONVENTION_ARM_64:
desc.args[0] = SCM_SMC_FNID(svc_id, cmd_id) |
@@ -400,7 +400,7 @@ static bool __qcom_scm_is_call_available(struct device *dev, u32 svc_id,
return ret ? false : !!res.result[0];
}
-static int qcom_scm_set_boot_addr(void *entry, const u8 *cpu_bits)
+static int qcom_scm_set_boot_addr(struct qcom_scm *scm, void *entry, const u8 *cpu_bits)
{
int cpu;
unsigned int flags = 0;
@@ -420,10 +420,10 @@ static int qcom_scm_set_boot_addr(void *entry, const u8 *cpu_bits)
desc.args[0] = flags;
desc.args[1] = virt_to_phys(entry);
- return qcom_scm_call_atomic(__scm ? __scm->dev : NULL, &desc, NULL);
+ return qcom_scm_call_atomic(scm ? scm->dev : NULL, &desc, NULL);
}
-static int qcom_scm_set_boot_addr_mc(void *entry, unsigned int flags)
+static int qcom_scm_set_boot_addr_mc(struct qcom_scm *scm, void *entry, unsigned int flags)
{
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_BOOT,
@@ -439,10 +439,10 @@ static int qcom_scm_set_boot_addr_mc(void *entry, unsigned int flags)
};
/* Need a device for DMA of the additional arguments */
- if (!__scm || __get_convention() == SMC_CONVENTION_LEGACY)
+ if (!scm || __get_convention(scm->dev) == SMC_CONVENTION_LEGACY)
return -EOPNOTSUPP;
- return qcom_scm_call(__scm->dev, &desc, NULL);
+ return qcom_scm_call(scm->dev, &desc, NULL);
}
/**
@@ -454,9 +454,11 @@ static int qcom_scm_set_boot_addr_mc(void *entry, unsigned int flags)
*/
int qcom_scm_set_warm_boot_addr(void *entry)
{
- if (qcom_scm_set_boot_addr_mc(entry, QCOM_SCM_BOOT_MC_FLAG_WARMBOOT))
+ struct qcom_scm *scm = __scm;
+
+ if (qcom_scm_set_boot_addr_mc(scm, entry, QCOM_SCM_BOOT_MC_FLAG_WARMBOOT))
/* Fallback to old SCM call */
- return qcom_scm_set_boot_addr(entry, qcom_scm_cpu_warm_bits);
+ return qcom_scm_set_boot_addr(scm, entry, qcom_scm_cpu_warm_bits);
return 0;
}
EXPORT_SYMBOL_GPL(qcom_scm_set_warm_boot_addr);
@@ -467,9 +469,11 @@ EXPORT_SYMBOL_GPL(qcom_scm_set_warm_boot_addr);
*/
int qcom_scm_set_cold_boot_addr(void *entry)
{
- if (qcom_scm_set_boot_addr_mc(entry, QCOM_SCM_BOOT_MC_FLAG_COLDBOOT))
+ struct qcom_scm *scm = __scm;
+
+ if (qcom_scm_set_boot_addr_mc(scm, entry, QCOM_SCM_BOOT_MC_FLAG_COLDBOOT))
/* Fallback to old SCM call */
- return qcom_scm_set_boot_addr(entry, qcom_scm_cpu_cold_bits);
+ return qcom_scm_set_boot_addr(scm, entry, qcom_scm_cpu_cold_bits);
return 0;
}
EXPORT_SYMBOL_GPL(qcom_scm_set_cold_boot_addr);
@@ -484,6 +488,8 @@ EXPORT_SYMBOL_GPL(qcom_scm_set_cold_boot_addr);
*/
void qcom_scm_cpu_power_down(u32 flags)
{
+ struct qcom_scm *scm = __scm;
+
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_BOOT,
.cmd = QCOM_SCM_BOOT_TERMINATE_PC,
@@ -492,11 +498,11 @@ void qcom_scm_cpu_power_down(u32 flags)
.owner = ARM_SMCCC_OWNER_SIP,
};
- qcom_scm_call_atomic(__scm ? __scm->dev : NULL, &desc, NULL);
+ qcom_scm_call_atomic(scm ? scm->dev : NULL, &desc, NULL);
}
EXPORT_SYMBOL_GPL(qcom_scm_cpu_power_down);
-static int qcom_scm_disable_sdi(void)
+static int qcom_scm_disable_sdi(struct qcom_scm *scm)
{
int ret;
struct qcom_scm_desc desc = {
@@ -509,17 +515,17 @@ static int qcom_scm_disable_sdi(void)
};
struct qcom_scm_res res;
- ret = qcom_scm_clk_enable();
+ ret = qcom_scm_clk_enable(scm);
if (ret)
return ret;
- ret = qcom_scm_call(__scm->dev, &desc, &res);
+ ret = qcom_scm_call(scm->dev, &desc, &res);
- qcom_scm_clk_disable();
+ qcom_scm_clk_disable(scm);
return ret ? : res.result[0];
}
-static int __qcom_scm_set_dload_mode(struct device *dev, bool enable)
+static int __qcom_scm_set_dload_mode(struct qcom_scm *scm, bool enable)
{
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_BOOT,
@@ -531,10 +537,11 @@ static int __qcom_scm_set_dload_mode(struct device *dev, bool enable)
desc.args[1] = enable ? QCOM_SCM_BOOT_SET_DLOAD_MODE : 0;
- return qcom_scm_call_atomic(__scm->dev, &desc, NULL);
+ return qcom_scm_call_atomic(scm->dev, &desc, NULL);
}
-static int qcom_scm_io_rmw(phys_addr_t addr, unsigned int mask, unsigned int val)
+static int qcom_scm_io_rmw(struct qcom_scm *scm, phys_addr_t addr,
+ unsigned int mask, unsigned int val)
{
unsigned int old;
unsigned int new;
@@ -554,11 +561,11 @@ static void qcom_scm_set_download_mode(struct qcom_scm *scm, u32 dload_mode)
int ret = 0;
if (scm->dload_mode_addr) {
- ret = qcom_scm_io_rmw(scm->dload_mode_addr, QCOM_DLOAD_MASK,
+ ret = qcom_scm_io_rmw(scm, scm->dload_mode_addr, QCOM_DLOAD_MASK,
FIELD_PREP(QCOM_DLOAD_MASK, dload_mode));
} else if (__qcom_scm_is_call_available(scm->dev, QCOM_SCM_SVC_BOOT,
QCOM_SCM_BOOT_SET_DLOAD_MODE)) {
- ret = __qcom_scm_set_dload_mode(scm->dev, !!dload_mode);
+ ret = __qcom_scm_set_dload_mode(scm, !!dload_mode);
} else if (dload_mode) {
dev_err(scm->dev,
"No available mechanism for setting download mode\n");
@@ -607,23 +614,24 @@ static int __qcom_scm_pas_init_image(struct device *dev, u32 pas_id,
.args[0] = pas_id,
.owner = ARM_SMCCC_OWNER_SIP,
};
+ struct qcom_scm *scm = dev_get_drvdata(dev);
int ret;
- ret = qcom_scm_clk_enable();
+ ret = qcom_scm_clk_enable(scm);
if (ret)
return ret;
- ret = qcom_scm_bw_enable();
+ ret = qcom_scm_bw_enable(scm);
if (ret)
goto disable_clk;
desc.args[1] = mdata_phys;
ret = qcom_scm_call(dev, &desc, res);
- qcom_scm_bw_disable();
+ qcom_scm_bw_disable(scm);
disable_clk:
- qcom_scm_clk_disable();
+ qcom_scm_clk_disable(scm);
return ret;
}
@@ -632,12 +640,13 @@ static int qcom_scm_pas_prep_and_init_image(struct device *dev,
struct qcom_pas_context *ctx,
const void *metadata, size_t size)
{
+ struct qcom_scm *scm = dev_get_drvdata(dev);
struct qcom_scm_res res;
phys_addr_t mdata_phys;
void *mdata_buf;
int ret;
- mdata_buf = qcom_tzmem_alloc(__scm->mempool, size, GFP_KERNEL);
+ mdata_buf = qcom_tzmem_alloc(scm->mempool, size, GFP_KERNEL);
if (!mdata_buf)
return -ENOMEM;
@@ -698,7 +707,9 @@ static int __qcom_scm_pas_init_image2(struct device *dev, u32 pas_id,
int qcom_scm_pas_init_image(u32 pas_id, const void *metadata, size_t size,
struct qcom_scm_pas_context *ctx)
{
- return __qcom_scm_pas_init_image2(__scm->dev, pas_id, metadata, size,
+ struct qcom_scm *scm = __scm;
+
+ return __qcom_scm_pas_init_image2(scm->dev, pas_id, metadata, size,
(struct qcom_pas_context *)ctx);
}
EXPORT_SYMBOL_GPL(qcom_scm_pas_init_image);
@@ -716,7 +727,9 @@ static void __qcom_scm_pas_metadata_release(struct device *dev,
void qcom_scm_pas_metadata_release(struct qcom_scm_pas_context *ctx)
{
- __qcom_scm_pas_metadata_release(__scm->dev,
+ struct qcom_scm *scm = __scm;
+
+ __qcom_scm_pas_metadata_release(scm->dev,
(struct qcom_pas_context *)ctx);
}
EXPORT_SYMBOL_GPL(qcom_scm_pas_metadata_release);
@@ -724,6 +737,7 @@ EXPORT_SYMBOL_GPL(qcom_scm_pas_metadata_release);
static int __qcom_scm_pas_mem_setup(struct device *dev, u32 pas_id,
phys_addr_t addr, phys_addr_t size)
{
+ struct qcom_scm *scm = dev_get_drvdata(dev);
int ret;
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_PIL,
@@ -736,26 +750,28 @@ static int __qcom_scm_pas_mem_setup(struct device *dev, u32 pas_id,
};
struct qcom_scm_res res;
- ret = qcom_scm_clk_enable();
+ ret = qcom_scm_clk_enable(scm);
if (ret)
return ret;
- ret = qcom_scm_bw_enable();
+ ret = qcom_scm_bw_enable(scm);
if (ret)
goto disable_clk;
ret = qcom_scm_call(dev, &desc, &res);
- qcom_scm_bw_disable();
+ qcom_scm_bw_disable(scm);
disable_clk:
- qcom_scm_clk_disable();
+ qcom_scm_clk_disable(scm);
return ret ? : res.result[0];
}
int qcom_scm_pas_mem_setup(u32 pas_id, phys_addr_t addr, phys_addr_t size)
{
- return __qcom_scm_pas_mem_setup(__scm->dev, pas_id, addr, size);
+ struct qcom_scm *scm = __scm;
+
+ return __qcom_scm_pas_mem_setup(scm->dev, pas_id, addr, size);
}
EXPORT_SYMBOL_GPL(qcom_scm_pas_mem_setup);
@@ -764,6 +780,7 @@ static void *__qcom_scm_pas_get_rsc_table(struct device *dev, u32 pas_id,
size_t input_rt_size,
size_t *output_rt_size)
{
+ struct qcom_scm *scm = dev_get_drvdata(dev);
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_PIL,
.cmd = QCOM_SCM_PIL_PAS_GET_RSCTABLE,
@@ -776,7 +793,7 @@ static void *__qcom_scm_pas_get_rsc_table(struct device *dev, u32 pas_id,
void *output_rt_tzm;
int ret;
- output_rt_tzm = qcom_tzmem_alloc(__scm->mempool, *output_rt_size, GFP_KERNEL);
+ output_rt_tzm = qcom_tzmem_alloc(scm->mempool, *output_rt_size, GFP_KERNEL);
if (!output_rt_tzm)
return ERR_PTR(-ENOMEM);
@@ -818,6 +835,7 @@ static void *__qcom_scm_pas_get_rsc_table2(struct device *dev,
size_t input_rt_size,
size_t *output_rt_size)
{
+ struct qcom_scm *scm = dev_get_drvdata(dev);
struct resource_table empty_rsc = {};
size_t size = SZ_16K;
void *output_rt_tzm;
@@ -825,11 +843,11 @@ static void *__qcom_scm_pas_get_rsc_table2(struct device *dev,
void *tbl_ptr;
int ret;
- ret = qcom_scm_clk_enable();
+ ret = qcom_scm_clk_enable(scm);
if (ret)
return ERR_PTR(ret);
- ret = qcom_scm_bw_enable();
+ ret = qcom_scm_bw_enable(scm);
if (ret)
goto disable_clk;
@@ -843,7 +861,7 @@ static void *__qcom_scm_pas_get_rsc_table2(struct device *dev,
input_rt_size = sizeof(empty_rsc);
}
- input_rt_tzm = qcom_tzmem_alloc(__scm->mempool, input_rt_size, GFP_KERNEL);
+ input_rt_tzm = qcom_tzmem_alloc(scm->mempool, input_rt_size, GFP_KERNEL);
if (!input_rt_tzm) {
ret = -ENOMEM;
goto disable_scm_bw;
@@ -879,10 +897,10 @@ static void *__qcom_scm_pas_get_rsc_table2(struct device *dev,
qcom_tzmem_free(input_rt_tzm);
disable_scm_bw:
- qcom_scm_bw_disable();
+ qcom_scm_bw_disable(scm);
disable_clk:
- qcom_scm_clk_disable();
+ qcom_scm_clk_disable(scm);
return ret ? ERR_PTR(ret) : tbl_ptr;
}
@@ -892,7 +910,9 @@ struct resource_table *qcom_scm_pas_get_rsc_table(struct qcom_scm_pas_context *c
size_t input_rt_size,
size_t *output_rt_size)
{
- return __qcom_scm_pas_get_rsc_table2(__scm->dev,
+ struct qcom_scm *scm = __scm;
+
+ return __qcom_scm_pas_get_rsc_table2(scm->dev,
(struct qcom_pas_context *)ctx,
input_rt, input_rt_size,
output_rt_size);
@@ -901,6 +921,7 @@ EXPORT_SYMBOL_GPL(qcom_scm_pas_get_rsc_table);
static int __qcom_scm_pas_auth_and_reset(struct device *dev, u32 pas_id)
{
+ struct qcom_scm *scm = dev_get_drvdata(dev);
int ret;
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_PIL,
@@ -911,26 +932,28 @@ static int __qcom_scm_pas_auth_and_reset(struct device *dev, u32 pas_id)
};
struct qcom_scm_res res;
- ret = qcom_scm_clk_enable();
+ ret = qcom_scm_clk_enable(scm);
if (ret)
return ret;
- ret = qcom_scm_bw_enable();
+ ret = qcom_scm_bw_enable(scm);
if (ret)
goto disable_clk;
ret = qcom_scm_call(dev, &desc, &res);
- qcom_scm_bw_disable();
+ qcom_scm_bw_disable(scm);
disable_clk:
- qcom_scm_clk_disable();
+ qcom_scm_clk_disable(scm);
return ret ? : res.result[0];
}
int qcom_scm_pas_auth_and_reset(u32 pas_id)
{
- return __qcom_scm_pas_auth_and_reset(__scm->dev, pas_id);
+ struct qcom_scm *scm = __scm;
+
+ return __qcom_scm_pas_auth_and_reset(scm->dev, pas_id);
}
EXPORT_SYMBOL_GPL(qcom_scm_pas_auth_and_reset);
@@ -964,7 +987,9 @@ static int __qcom_scm_pas_prepare_and_auth_reset(struct device *dev,
int qcom_scm_pas_prepare_and_auth_reset(struct qcom_scm_pas_context *ctx)
{
- return __qcom_scm_pas_prepare_and_auth_reset(__scm->dev,
+ struct qcom_scm *scm = __scm;
+
+ return __qcom_scm_pas_prepare_and_auth_reset(scm->dev,
(struct qcom_pas_context *)ctx);
}
EXPORT_SYMBOL_GPL(qcom_scm_pas_prepare_and_auth_reset);
@@ -990,12 +1015,15 @@ static int __qcom_scm_pas_set_remote_state(struct device *dev, u32 state,
int qcom_scm_set_remote_state(u32 state, u32 id)
{
- return __qcom_scm_pas_set_remote_state(__scm->dev, state, id);
+ struct qcom_scm *scm = __scm;
+
+ return __qcom_scm_pas_set_remote_state(scm->dev, state, id);
}
EXPORT_SYMBOL_GPL(qcom_scm_set_remote_state);
static int __qcom_scm_pas_shutdown(struct device *dev, u32 pas_id)
{
+ struct qcom_scm *scm = dev_get_drvdata(dev);
int ret;
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_PIL,
@@ -1006,26 +1034,28 @@ static int __qcom_scm_pas_shutdown(struct device *dev, u32 pas_id)
};
struct qcom_scm_res res;
- ret = qcom_scm_clk_enable();
+ ret = qcom_scm_clk_enable(scm);
if (ret)
return ret;
- ret = qcom_scm_bw_enable();
+ ret = qcom_scm_bw_enable(scm);
if (ret)
goto disable_clk;
ret = qcom_scm_call(dev, &desc, &res);
- qcom_scm_bw_disable();
+ qcom_scm_bw_disable(scm);
disable_clk:
- qcom_scm_clk_disable();
+ qcom_scm_clk_disable(scm);
return ret ? : res.result[0];
}
int qcom_scm_pas_shutdown(u32 pas_id)
{
- return __qcom_scm_pas_shutdown(__scm->dev, pas_id);
+ struct qcom_scm *scm = __scm;
+
+ return __qcom_scm_pas_shutdown(scm->dev, pas_id);
}
EXPORT_SYMBOL_GPL(qcom_scm_pas_shutdown);
@@ -1052,7 +1082,9 @@ static bool __qcom_scm_pas_supported(struct device *dev, u32 pas_id)
bool qcom_scm_pas_supported(u32 pas_id)
{
- return __qcom_scm_pas_supported(__scm->dev, pas_id);
+ struct qcom_scm *scm = __scm;
+
+ return __qcom_scm_pas_supported(scm->dev, pas_id);
}
EXPORT_SYMBOL_GPL(qcom_scm_pas_supported);
@@ -1075,16 +1107,16 @@ static struct qcom_pas_ops qcom_pas_ops_scm = {
*
* Returns true if PAS is available, otherwise false.
*/
-static bool qcom_scm_is_pas_available(void)
+static bool qcom_scm_is_pas_available(struct qcom_scm *scm)
{
- if (!__qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_PIL,
+ if (!__qcom_scm_is_call_available(scm->dev, QCOM_SCM_SVC_PIL,
QCOM_SCM_PIL_PAS_AUTH_AND_RESET))
return false;
return true;
}
-static int __qcom_scm_pas_mss_reset(struct device *dev, bool reset)
+static int __qcom_scm_pas_mss_reset(struct qcom_scm *scm, bool reset)
{
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_PIL,
@@ -1097,7 +1129,7 @@ static int __qcom_scm_pas_mss_reset(struct device *dev, bool reset)
struct qcom_scm_res res;
int ret;
- ret = qcom_scm_call(__scm->dev, &desc, &res);
+ ret = qcom_scm_call(scm->dev, &desc, &res);
return ret ? : res.result[0];
}
@@ -1105,19 +1137,23 @@ static int __qcom_scm_pas_mss_reset(struct device *dev, bool reset)
static int qcom_scm_pas_reset_assert(struct reset_controller_dev *rcdev,
unsigned long idx)
{
+ struct qcom_scm *scm = container_of(rcdev, struct qcom_scm, reset);
+
if (idx != 0)
return -EINVAL;
- return __qcom_scm_pas_mss_reset(__scm->dev, 1);
+ return __qcom_scm_pas_mss_reset(scm, 1);
}
static int qcom_scm_pas_reset_deassert(struct reset_controller_dev *rcdev,
unsigned long idx)
{
+ struct qcom_scm *scm = container_of(rcdev, struct qcom_scm, reset);
+
if (idx != 0)
return -EINVAL;
- return __qcom_scm_pas_mss_reset(__scm->dev, 0);
+ return __qcom_scm_pas_mss_reset(scm, 0);
}
static const struct reset_control_ops qcom_scm_pas_reset_ops = {
@@ -1127,6 +1163,8 @@ static const struct reset_control_ops qcom_scm_pas_reset_ops = {
int qcom_scm_io_readl(phys_addr_t addr, unsigned int *val)
{
+ struct qcom_scm *scm = __scm;
+
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_IO,
.cmd = QCOM_SCM_IO_READ,
@@ -1138,7 +1176,7 @@ int qcom_scm_io_readl(phys_addr_t addr, unsigned int *val)
int ret;
- ret = qcom_scm_call_atomic(__scm->dev, &desc, &res);
+ ret = qcom_scm_call_atomic(scm->dev, &desc, &res);
if (ret >= 0)
*val = res.result[0];
@@ -1148,6 +1186,8 @@ EXPORT_SYMBOL_GPL(qcom_scm_io_readl);
int qcom_scm_io_writel(phys_addr_t addr, unsigned int val)
{
+ struct qcom_scm *scm = __scm;
+
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_IO,
.cmd = QCOM_SCM_IO_WRITE,
@@ -1157,7 +1197,7 @@ int qcom_scm_io_writel(phys_addr_t addr, unsigned int val)
.owner = ARM_SMCCC_OWNER_SIP,
};
- return qcom_scm_call_atomic(__scm->dev, &desc, NULL);
+ return qcom_scm_call_atomic(scm->dev, &desc, NULL);
}
EXPORT_SYMBOL_GPL(qcom_scm_io_writel);
@@ -1169,13 +1209,17 @@ EXPORT_SYMBOL_GPL(qcom_scm_io_writel);
*/
bool qcom_scm_restore_sec_cfg_available(void)
{
- return __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_MP,
+ struct qcom_scm *scm = __scm;
+
+ return __qcom_scm_is_call_available(scm->dev, QCOM_SCM_SVC_MP,
QCOM_SCM_MP_RESTORE_SEC_CFG);
}
EXPORT_SYMBOL_GPL(qcom_scm_restore_sec_cfg_available);
int qcom_scm_restore_sec_cfg(u32 device_id, u32 spare)
{
+ struct qcom_scm *scm = __scm;
+
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_MP,
.cmd = QCOM_SCM_MP_RESTORE_SEC_CFG,
@@ -1187,7 +1231,7 @@ int qcom_scm_restore_sec_cfg(u32 device_id, u32 spare)
struct qcom_scm_res res;
int ret;
- ret = qcom_scm_call(__scm->dev, &desc, &res);
+ ret = qcom_scm_call(scm->dev, &desc, &res);
return ret ? : res.result[0];
}
@@ -1197,13 +1241,17 @@ EXPORT_SYMBOL_GPL(qcom_scm_restore_sec_cfg);
bool qcom_scm_set_gpu_smmu_aperture_is_available(void)
{
- return __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_MP,
+ struct qcom_scm *scm = __scm;
+
+ return __qcom_scm_is_call_available(scm->dev, QCOM_SCM_SVC_MP,
QCOM_SCM_MP_CP_SMMU_APERTURE_ID);
}
EXPORT_SYMBOL_GPL(qcom_scm_set_gpu_smmu_aperture_is_available);
int qcom_scm_set_gpu_smmu_aperture(unsigned int context_bank)
{
+ struct qcom_scm *scm = __scm;
+
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_MP,
.cmd = QCOM_SCM_MP_CP_SMMU_APERTURE_ID,
@@ -1215,12 +1263,14 @@ int qcom_scm_set_gpu_smmu_aperture(unsigned int context_bank)
.owner = ARM_SMCCC_OWNER_SIP
};
- return qcom_scm_call(__scm->dev, &desc, NULL);
+ return qcom_scm_call(scm->dev, &desc, NULL);
}
EXPORT_SYMBOL_GPL(qcom_scm_set_gpu_smmu_aperture);
int qcom_scm_iommu_secure_ptbl_size(u32 spare, size_t *size)
{
+ struct qcom_scm *scm = __scm;
+
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_MP,
.cmd = QCOM_SCM_MP_IOMMU_SECURE_PTBL_SIZE,
@@ -1231,7 +1281,7 @@ int qcom_scm_iommu_secure_ptbl_size(u32 spare, size_t *size)
struct qcom_scm_res res;
int ret;
- ret = qcom_scm_call(__scm->dev, &desc, &res);
+ ret = qcom_scm_call(scm->dev, &desc, &res);
if (size)
*size = res.result[0];
@@ -1242,6 +1292,8 @@ EXPORT_SYMBOL_GPL(qcom_scm_iommu_secure_ptbl_size);
int qcom_scm_iommu_secure_ptbl_init(u64 addr, u32 size, u32 spare)
{
+ struct qcom_scm *scm = __scm;
+
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_MP,
.cmd = QCOM_SCM_MP_IOMMU_SECURE_PTBL_INIT,
@@ -1254,7 +1306,7 @@ int qcom_scm_iommu_secure_ptbl_init(u64 addr, u32 size, u32 spare)
};
int ret;
- ret = qcom_scm_call(__scm->dev, &desc, NULL);
+ ret = qcom_scm_call(scm->dev, &desc, NULL);
/* the pg table has been initialized already, ignore the error */
if (ret == -EPERM)
@@ -1266,6 +1318,8 @@ EXPORT_SYMBOL_GPL(qcom_scm_iommu_secure_ptbl_init);
int qcom_scm_iommu_set_cp_pool_size(u32 spare, u32 size)
{
+ struct qcom_scm *scm = __scm;
+
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_MP,
.cmd = QCOM_SCM_MP_IOMMU_SET_CP_POOL_SIZE,
@@ -1275,7 +1329,7 @@ int qcom_scm_iommu_set_cp_pool_size(u32 spare, u32 size)
.owner = ARM_SMCCC_OWNER_SIP,
};
- return qcom_scm_call(__scm->dev, &desc, NULL);
+ return qcom_scm_call(scm->dev, &desc, NULL);
}
EXPORT_SYMBOL_GPL(qcom_scm_iommu_set_cp_pool_size);
@@ -1283,6 +1337,8 @@ int qcom_scm_mem_protect_video_var(u32 cp_start, u32 cp_size,
u32 cp_nonpixel_start,
u32 cp_nonpixel_size)
{
+ struct qcom_scm *scm = __scm;
+
int ret;
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_MP,
@@ -1297,7 +1353,7 @@ int qcom_scm_mem_protect_video_var(u32 cp_start, u32 cp_size,
};
struct qcom_scm_res res;
- ret = qcom_scm_call(__scm->dev, &desc, &res);
+ ret = qcom_scm_call(scm->dev, &desc, &res);
return ret ? : res.result[0];
}
@@ -1347,6 +1403,8 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz,
const struct qcom_scm_vmperm *newvm,
unsigned int dest_cnt)
{
+ struct qcom_scm *scm = __scm;
+
struct qcom_scm_current_perm_info *destvm;
struct qcom_scm_mem_map_info *mem_to_map;
phys_addr_t mem_to_map_phys;
@@ -1367,7 +1425,7 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz,
ptr_sz = ALIGN(src_sz, SZ_64) + ALIGN(mem_to_map_sz, SZ_64) +
ALIGN(dest_sz, SZ_64);
- void *ptr __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool,
+ void *ptr __free(qcom_tzmem) = qcom_tzmem_alloc(scm->mempool,
ptr_sz, GFP_KERNEL);
if (!ptr)
return -ENOMEM;
@@ -1400,10 +1458,10 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz,
next_vm |= BIT(newvm->vmid);
}
- ret = __qcom_scm_assign_mem(__scm->dev, mem_to_map_phys, mem_to_map_sz,
+ ret = __qcom_scm_assign_mem(scm->dev, mem_to_map_phys, mem_to_map_sz,
ptr_phys, src_sz, dest_phys, dest_sz);
if (ret) {
- dev_err(__scm->dev,
+ dev_err(scm->dev,
"Assign memory protection call failed %d\n", ret);
return ret;
}
@@ -1418,7 +1476,9 @@ EXPORT_SYMBOL_GPL(qcom_scm_assign_mem);
*/
bool qcom_scm_ocmem_lock_available(void)
{
- return __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_OCMEM,
+ struct qcom_scm *scm = __scm;
+
+ return __qcom_scm_is_call_available(scm->dev, QCOM_SCM_SVC_OCMEM,
QCOM_SCM_OCMEM_LOCK_CMD);
}
EXPORT_SYMBOL_GPL(qcom_scm_ocmem_lock_available);
@@ -1435,6 +1495,8 @@ EXPORT_SYMBOL_GPL(qcom_scm_ocmem_lock_available);
int qcom_scm_ocmem_lock(enum qcom_scm_ocmem_client id, u32 offset, u32 size,
u32 mode)
{
+ struct qcom_scm *scm = __scm;
+
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_OCMEM,
.cmd = QCOM_SCM_OCMEM_LOCK_CMD,
@@ -1445,7 +1507,7 @@ int qcom_scm_ocmem_lock(enum qcom_scm_ocmem_client id, u32 offset, u32 size,
.arginfo = QCOM_SCM_ARGS(4),
};
- return qcom_scm_call(__scm->dev, &desc, NULL);
+ return qcom_scm_call(scm->dev, &desc, NULL);
}
EXPORT_SYMBOL_GPL(qcom_scm_ocmem_lock);
@@ -1459,6 +1521,8 @@ EXPORT_SYMBOL_GPL(qcom_scm_ocmem_lock);
*/
int qcom_scm_ocmem_unlock(enum qcom_scm_ocmem_client id, u32 offset, u32 size)
{
+ struct qcom_scm *scm = __scm;
+
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_OCMEM,
.cmd = QCOM_SCM_OCMEM_UNLOCK_CMD,
@@ -1468,7 +1532,7 @@ int qcom_scm_ocmem_unlock(enum qcom_scm_ocmem_client id, u32 offset, u32 size)
.arginfo = QCOM_SCM_ARGS(3),
};
- return qcom_scm_call(__scm->dev, &desc, NULL);
+ return qcom_scm_call(scm->dev, &desc, NULL);
}
EXPORT_SYMBOL_GPL(qcom_scm_ocmem_unlock);
@@ -1480,9 +1544,11 @@ EXPORT_SYMBOL_GPL(qcom_scm_ocmem_unlock);
*/
bool qcom_scm_ice_available(void)
{
- return __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_ES,
+ struct qcom_scm *scm = __scm;
+
+ return __qcom_scm_is_call_available(scm->dev, QCOM_SCM_SVC_ES,
QCOM_SCM_ES_INVALIDATE_ICE_KEY) &&
- __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_ES,
+ __qcom_scm_is_call_available(scm->dev, QCOM_SCM_SVC_ES,
QCOM_SCM_ES_CONFIG_SET_ICE_KEY);
}
EXPORT_SYMBOL_GPL(qcom_scm_ice_available);
@@ -1501,6 +1567,8 @@ EXPORT_SYMBOL_GPL(qcom_scm_ice_available);
*/
int qcom_scm_ice_invalidate_key(u32 index)
{
+ struct qcom_scm *scm = __scm;
+
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_ES,
.cmd = QCOM_SCM_ES_INVALIDATE_ICE_KEY,
@@ -1509,7 +1577,7 @@ int qcom_scm_ice_invalidate_key(u32 index)
.owner = ARM_SMCCC_OWNER_SIP,
};
- return qcom_scm_call(__scm->dev, &desc, NULL);
+ return qcom_scm_call(scm->dev, &desc, NULL);
}
EXPORT_SYMBOL_GPL(qcom_scm_ice_invalidate_key);
@@ -1537,6 +1605,8 @@ EXPORT_SYMBOL_GPL(qcom_scm_ice_invalidate_key);
int qcom_scm_ice_set_key(u32 index, const u8 *key, u32 key_size,
enum qcom_scm_ice_cipher cipher, u32 data_unit_size)
{
+ struct qcom_scm *scm = __scm;
+
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_ES,
.cmd = QCOM_SCM_ES_CONFIG_SET_ICE_KEY,
@@ -1552,7 +1622,7 @@ int qcom_scm_ice_set_key(u32 index, const u8 *key, u32 key_size,
int ret;
- void *keybuf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool,
+ void *keybuf __free(qcom_tzmem) = qcom_tzmem_alloc(scm->mempool,
key_size,
GFP_KERNEL);
if (!keybuf)
@@ -1560,7 +1630,7 @@ int qcom_scm_ice_set_key(u32 index, const u8 *key, u32 key_size,
memcpy(keybuf, key, key_size);
desc.args[1] = qcom_tzmem_to_phys(keybuf);
- ret = qcom_scm_call(__scm->dev, &desc, NULL);
+ ret = qcom_scm_call(scm->dev, &desc, NULL);
memzero_explicit(keybuf, key_size);
@@ -1570,13 +1640,15 @@ EXPORT_SYMBOL_GPL(qcom_scm_ice_set_key);
bool qcom_scm_has_wrapped_key_support(void)
{
- return __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_ES,
+ struct qcom_scm *scm = __scm;
+
+ return __qcom_scm_is_call_available(scm->dev, QCOM_SCM_SVC_ES,
QCOM_SCM_ES_DERIVE_SW_SECRET) &&
- __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_ES,
+ __qcom_scm_is_call_available(scm->dev, QCOM_SCM_SVC_ES,
QCOM_SCM_ES_GENERATE_ICE_KEY) &&
- __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_ES,
+ __qcom_scm_is_call_available(scm->dev, QCOM_SCM_SVC_ES,
QCOM_SCM_ES_PREPARE_ICE_KEY) &&
- __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_ES,
+ __qcom_scm_is_call_available(scm->dev, QCOM_SCM_SVC_ES,
QCOM_SCM_ES_IMPORT_ICE_KEY);
}
EXPORT_SYMBOL_GPL(qcom_scm_has_wrapped_key_support);
@@ -1600,6 +1672,8 @@ EXPORT_SYMBOL_GPL(qcom_scm_has_wrapped_key_support);
int qcom_scm_derive_sw_secret(const u8 *eph_key, size_t eph_key_size,
u8 *sw_secret, size_t sw_secret_size)
{
+ struct qcom_scm *scm = __scm;
+
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_ES,
.cmd = QCOM_SCM_ES_DERIVE_SW_SECRET,
@@ -1609,13 +1683,13 @@ int qcom_scm_derive_sw_secret(const u8 *eph_key, size_t eph_key_size,
};
int ret;
- void *eph_key_buf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool,
+ void *eph_key_buf __free(qcom_tzmem) = qcom_tzmem_alloc(scm->mempool,
eph_key_size,
GFP_KERNEL);
if (!eph_key_buf)
return -ENOMEM;
- void *sw_secret_buf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool,
+ void *sw_secret_buf __free(qcom_tzmem) = qcom_tzmem_alloc(scm->mempool,
sw_secret_size,
GFP_KERNEL);
if (!sw_secret_buf)
@@ -1627,7 +1701,7 @@ int qcom_scm_derive_sw_secret(const u8 *eph_key, size_t eph_key_size,
desc.args[2] = qcom_tzmem_to_phys(sw_secret_buf);
desc.args[3] = sw_secret_size;
- ret = qcom_scm_call(__scm->dev, &desc, NULL);
+ ret = qcom_scm_call(scm->dev, &desc, NULL);
if (!ret)
memcpy(sw_secret, sw_secret_buf, sw_secret_size);
@@ -1650,6 +1724,8 @@ EXPORT_SYMBOL_GPL(qcom_scm_derive_sw_secret);
*/
int qcom_scm_generate_ice_key(u8 *lt_key, size_t lt_key_size)
{
+ struct qcom_scm *scm = __scm;
+
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_ES,
.cmd = QCOM_SCM_ES_GENERATE_ICE_KEY,
@@ -1658,7 +1734,7 @@ int qcom_scm_generate_ice_key(u8 *lt_key, size_t lt_key_size)
};
int ret;
- void *lt_key_buf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool,
+ void *lt_key_buf __free(qcom_tzmem) = qcom_tzmem_alloc(scm->mempool,
lt_key_size,
GFP_KERNEL);
if (!lt_key_buf)
@@ -1667,7 +1743,7 @@ int qcom_scm_generate_ice_key(u8 *lt_key, size_t lt_key_size)
desc.args[0] = qcom_tzmem_to_phys(lt_key_buf);
desc.args[1] = lt_key_size;
- ret = qcom_scm_call(__scm->dev, &desc, NULL);
+ ret = qcom_scm_call(scm->dev, &desc, NULL);
if (!ret)
memcpy(lt_key, lt_key_buf, lt_key_size);
@@ -1692,6 +1768,8 @@ EXPORT_SYMBOL_GPL(qcom_scm_generate_ice_key);
int qcom_scm_prepare_ice_key(const u8 *lt_key, size_t lt_key_size,
u8 *eph_key, size_t eph_key_size)
{
+ struct qcom_scm *scm = __scm;
+
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_ES,
.cmd = QCOM_SCM_ES_PREPARE_ICE_KEY,
@@ -1701,13 +1779,13 @@ int qcom_scm_prepare_ice_key(const u8 *lt_key, size_t lt_key_size,
};
int ret;
- void *lt_key_buf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool,
+ void *lt_key_buf __free(qcom_tzmem) = qcom_tzmem_alloc(scm->mempool,
lt_key_size,
GFP_KERNEL);
if (!lt_key_buf)
return -ENOMEM;
- void *eph_key_buf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool,
+ void *eph_key_buf __free(qcom_tzmem) = qcom_tzmem_alloc(scm->mempool,
eph_key_size,
GFP_KERNEL);
if (!eph_key_buf)
@@ -1719,7 +1797,7 @@ int qcom_scm_prepare_ice_key(const u8 *lt_key, size_t lt_key_size,
desc.args[2] = qcom_tzmem_to_phys(eph_key_buf);
desc.args[3] = eph_key_size;
- ret = qcom_scm_call(__scm->dev, &desc, NULL);
+ ret = qcom_scm_call(scm->dev, &desc, NULL);
if (!ret)
memcpy(eph_key, eph_key_buf, eph_key_size);
@@ -1745,6 +1823,8 @@ EXPORT_SYMBOL_GPL(qcom_scm_prepare_ice_key);
int qcom_scm_import_ice_key(const u8 *raw_key, size_t raw_key_size,
u8 *lt_key, size_t lt_key_size)
{
+ struct qcom_scm *scm = __scm;
+
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_ES,
.cmd = QCOM_SCM_ES_IMPORT_ICE_KEY,
@@ -1754,13 +1834,13 @@ int qcom_scm_import_ice_key(const u8 *raw_key, size_t raw_key_size,
};
int ret;
- void *raw_key_buf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool,
+ void *raw_key_buf __free(qcom_tzmem) = qcom_tzmem_alloc(scm->mempool,
raw_key_size,
GFP_KERNEL);
if (!raw_key_buf)
return -ENOMEM;
- void *lt_key_buf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool,
+ void *lt_key_buf __free(qcom_tzmem) = qcom_tzmem_alloc(scm->mempool,
lt_key_size,
GFP_KERNEL);
if (!lt_key_buf)
@@ -1772,7 +1852,7 @@ int qcom_scm_import_ice_key(const u8 *raw_key, size_t raw_key_size,
desc.args[2] = qcom_tzmem_to_phys(lt_key_buf);
desc.args[3] = lt_key_size;
- ret = qcom_scm_call(__scm->dev, &desc, NULL);
+ ret = qcom_scm_call(scm->dev, &desc, NULL);
if (!ret)
memcpy(lt_key, lt_key_buf, lt_key_size);
@@ -1789,16 +1869,18 @@ EXPORT_SYMBOL_GPL(qcom_scm_import_ice_key);
*/
bool qcom_scm_hdcp_available(void)
{
+ struct qcom_scm *scm = __scm;
+
bool avail;
- int ret = qcom_scm_clk_enable();
+ int ret = qcom_scm_clk_enable(scm);
if (ret)
return ret;
- avail = __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_HDCP,
+ avail = __qcom_scm_is_call_available(scm->dev, QCOM_SCM_SVC_HDCP,
QCOM_SCM_HDCP_INVOKE);
- qcom_scm_clk_disable();
+ qcom_scm_clk_disable(scm);
return avail;
}
@@ -1814,6 +1896,8 @@ EXPORT_SYMBOL_GPL(qcom_scm_hdcp_available);
*/
int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt, u32 *resp)
{
+ struct qcom_scm *scm = __scm;
+
int ret;
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_HDCP,
@@ -1838,14 +1922,14 @@ int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt, u32 *resp)
if (req_cnt > QCOM_SCM_HDCP_MAX_REQ_CNT)
return -ERANGE;
- ret = qcom_scm_clk_enable();
+ ret = qcom_scm_clk_enable(scm);
if (ret)
return ret;
- ret = qcom_scm_call(__scm->dev, &desc, &res);
+ ret = qcom_scm_call(scm->dev, &desc, &res);
*resp = res.result[0];
- qcom_scm_clk_disable();
+ qcom_scm_clk_disable(scm);
return ret;
}
@@ -1853,6 +1937,8 @@ EXPORT_SYMBOL_GPL(qcom_scm_hdcp_req);
int qcom_scm_iommu_set_pt_format(u32 sec_id, u32 ctx_num, u32 pt_fmt)
{
+ struct qcom_scm *scm = __scm;
+
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_SMMU_PROGRAM,
.cmd = QCOM_SCM_SMMU_PT_FORMAT,
@@ -1863,12 +1949,14 @@ int qcom_scm_iommu_set_pt_format(u32 sec_id, u32 ctx_num, u32 pt_fmt)
.owner = ARM_SMCCC_OWNER_SIP,
};
- return qcom_scm_call(__scm->dev, &desc, NULL);
+ return qcom_scm_call(scm->dev, &desc, NULL);
}
EXPORT_SYMBOL_GPL(qcom_scm_iommu_set_pt_format);
int qcom_scm_qsmmu500_wait_safe_toggle(bool en)
{
+ struct qcom_scm *scm = __scm;
+
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_SMMU_PROGRAM,
.cmd = QCOM_SCM_SMMU_CONFIG_ERRATA1,
@@ -1879,13 +1967,15 @@ int qcom_scm_qsmmu500_wait_safe_toggle(bool en)
};
- return qcom_scm_call_atomic(__scm->dev, &desc, NULL);
+ return qcom_scm_call_atomic(scm->dev, &desc, NULL);
}
EXPORT_SYMBOL_GPL(qcom_scm_qsmmu500_wait_safe_toggle);
bool qcom_scm_lmh_dcvsh_available(void)
{
- return __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_LMH, QCOM_SCM_LMH_LIMIT_DCVSH);
+ struct qcom_scm *scm = __scm;
+
+ return __qcom_scm_is_call_available(scm->dev, QCOM_SCM_SVC_LMH, QCOM_SCM_LMH_LIMIT_DCVSH);
}
EXPORT_SYMBOL_GPL(qcom_scm_lmh_dcvsh_available);
@@ -1927,6 +2017,8 @@ int qcom_scm_shm_bridge_create(u64 pfn_and_ns_perm_flags,
u64 ipfn_and_s_perm_flags, u64 size_and_flags,
u64 ns_vmids, u64 *handle)
{
+ struct qcom_scm *scm = __scm;
+
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_MP,
.cmd = QCOM_SCM_MP_SHM_BRIDGE_CREATE,
@@ -1942,7 +2034,7 @@ int qcom_scm_shm_bridge_create(u64 pfn_and_ns_perm_flags,
struct qcom_scm_res res;
int ret;
- ret = qcom_scm_call(__scm->dev, &desc, &res);
+ ret = qcom_scm_call(scm->dev, &desc, &res);
if (handle && !ret)
*handle = res.result[1];
@@ -1953,6 +2045,8 @@ EXPORT_SYMBOL_GPL(qcom_scm_shm_bridge_create);
int qcom_scm_shm_bridge_delete(u64 handle)
{
+ struct qcom_scm *scm = __scm;
+
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_MP,
.cmd = QCOM_SCM_MP_SHM_BRIDGE_DELETE,
@@ -1961,12 +2055,14 @@ int qcom_scm_shm_bridge_delete(u64 handle)
.arginfo = QCOM_SCM_ARGS(1, QCOM_SCM_VAL),
};
- return qcom_scm_call(__scm->dev, &desc, NULL);
+ return qcom_scm_call(scm->dev, &desc, NULL);
}
EXPORT_SYMBOL_GPL(qcom_scm_shm_bridge_delete);
int qcom_scm_lmh_profile_change(u32 profile_id)
{
+ struct qcom_scm *scm = __scm;
+
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_LMH,
.cmd = QCOM_SCM_LMH_LIMIT_PROFILE_CHANGE,
@@ -1975,13 +2071,15 @@ int qcom_scm_lmh_profile_change(u32 profile_id)
.owner = ARM_SMCCC_OWNER_SIP,
};
- return qcom_scm_call(__scm->dev, &desc, NULL);
+ return qcom_scm_call(scm->dev, &desc, NULL);
}
EXPORT_SYMBOL_GPL(qcom_scm_lmh_profile_change);
int qcom_scm_lmh_dcvsh(u32 payload_fn, u32 payload_reg, u32 payload_val,
u64 limit_node, u32 node_id, u64 version)
{
+ struct qcom_scm *scm = __scm;
+
int ret, payload_size = 5 * sizeof(u32);
struct qcom_scm_desc desc = {
@@ -1996,7 +2094,7 @@ int qcom_scm_lmh_dcvsh(u32 payload_fn, u32 payload_reg, u32 payload_val,
.owner = ARM_SMCCC_OWNER_SIP,
};
- u32 *payload_buf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool,
+ u32 *payload_buf __free(qcom_tzmem) = qcom_tzmem_alloc(scm->mempool,
payload_size,
GFP_KERNEL);
if (!payload_buf)
@@ -2010,7 +2108,7 @@ int qcom_scm_lmh_dcvsh(u32 payload_fn, u32 payload_reg, u32 payload_val,
desc.args[0] = qcom_tzmem_to_phys(payload_buf);
- ret = qcom_scm_call(__scm->dev, &desc, NULL);
+ ret = qcom_scm_call(scm->dev, &desc, NULL);
return ret;
}
@@ -2018,6 +2116,8 @@ EXPORT_SYMBOL_GPL(qcom_scm_lmh_dcvsh);
int qcom_scm_gpu_init_regs(u32 gpu_req)
{
+ struct qcom_scm *scm = __scm;
+
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_GPU,
.cmd = QCOM_SCM_SVC_GPU_INIT_REGS,
@@ -2026,7 +2126,7 @@ int qcom_scm_gpu_init_regs(u32 gpu_req)
.owner = ARM_SMCCC_OWNER_SIP,
};
- return qcom_scm_call(__scm->dev, &desc, NULL);
+ return qcom_scm_call(scm->dev, &desc, NULL);
}
EXPORT_SYMBOL_GPL(qcom_scm_gpu_init_regs);
@@ -2084,7 +2184,8 @@ static int qcom_scm_find_dload_address(struct device *dev, u64 *addr)
/* Lock for QSEECOM SCM call executions */
static DEFINE_MUTEX(qcom_scm_qseecom_call_lock);
-static int __qcom_scm_qseecom_call(const struct qcom_scm_desc *desc,
+static int __qcom_scm_qseecom_call(struct qcom_scm *scm,
+ const struct qcom_scm_desc *desc,
struct qcom_scm_qseecom_resp *res)
{
struct qcom_scm_res scm_res = {};
@@ -2096,7 +2197,7 @@ static int __qcom_scm_qseecom_call(const struct qcom_scm_desc *desc,
*/
lockdep_assert_held(&qcom_scm_qseecom_call_lock);
- status = qcom_scm_call(__scm->dev, desc, &scm_res);
+ status = qcom_scm_call(scm->dev, desc, &scm_res);
res->result = scm_res.result[0];
res->resp_type = scm_res.result[1];
@@ -2118,7 +2219,8 @@ static int __qcom_scm_qseecom_call(const struct qcom_scm_desc *desc,
*
* Return: Zero on success, nonzero on failure.
*/
-static int qcom_scm_qseecom_call(const struct qcom_scm_desc *desc,
+static int qcom_scm_qseecom_call(struct qcom_scm *scm,
+ const struct qcom_scm_desc *desc,
struct qcom_scm_qseecom_resp *res)
{
int status;
@@ -2130,15 +2232,15 @@ static int qcom_scm_qseecom_call(const struct qcom_scm_desc *desc,
*/
mutex_lock(&qcom_scm_qseecom_call_lock);
- status = __qcom_scm_qseecom_call(desc, res);
+ status = __qcom_scm_qseecom_call(scm, desc, res);
mutex_unlock(&qcom_scm_qseecom_call_lock);
- dev_dbg(__scm->dev, "%s: owner=%x, svc=%x, cmd=%x, result=%lld, type=%llx, data=%llx\n",
+ dev_dbg(scm->dev, "%s: owner=%x, svc=%x, cmd=%x, result=%lld, type=%llx, data=%llx\n",
__func__, desc->owner, desc->svc, desc->cmd, res->result,
res->resp_type, res->data);
if (status) {
- dev_err(__scm->dev, "qseecom: scm call failed with error %d\n", status);
+ dev_err(scm->dev, "qseecom: scm call failed with error %d\n", status);
return status;
}
@@ -2165,7 +2267,7 @@ static int qcom_scm_qseecom_call(const struct qcom_scm_desc *desc,
*
* Return: Zero on success, nonzero on failure.
*/
-static int qcom_scm_qseecom_get_version(u32 *version)
+static int qcom_scm_qseecom_get_version(struct qcom_scm *scm, u32 *version)
{
struct qcom_scm_desc desc = {};
struct qcom_scm_qseecom_resp res = {};
@@ -2178,7 +2280,7 @@ static int qcom_scm_qseecom_get_version(u32 *version)
desc.arginfo = QCOM_SCM_ARGS(1, QCOM_SCM_VAL);
desc.args[0] = feature;
- ret = qcom_scm_qseecom_call(&desc, &res);
+ ret = qcom_scm_qseecom_call(scm, &desc, &res);
if (ret)
return ret;
@@ -2200,6 +2302,8 @@ static int qcom_scm_qseecom_get_version(u32 *version)
*/
int qcom_scm_qseecom_app_get_id(const char *app_name, u32 *app_id)
{
+ struct qcom_scm *scm = __scm;
+
unsigned long name_buf_size = QSEECOM_MAX_APP_NAME_SIZE;
unsigned long app_name_len = strlen(app_name);
struct qcom_scm_desc desc = {};
@@ -2209,7 +2313,7 @@ int qcom_scm_qseecom_app_get_id(const char *app_name, u32 *app_id)
if (app_name_len >= name_buf_size)
return -EINVAL;
- char *name_buf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool,
+ char *name_buf __free(qcom_tzmem) = qcom_tzmem_alloc(scm->mempool,
name_buf_size,
GFP_KERNEL);
if (!name_buf)
@@ -2224,7 +2328,7 @@ int qcom_scm_qseecom_app_get_id(const char *app_name, u32 *app_id)
desc.args[0] = qcom_tzmem_to_phys(name_buf);
desc.args[1] = app_name_len;
- status = qcom_scm_qseecom_call(&desc, &res);
+ status = qcom_scm_qseecom_call(scm, &desc, &res);
if (status)
return status;
@@ -2262,6 +2366,8 @@ EXPORT_SYMBOL_GPL(qcom_scm_qseecom_app_get_id);
int qcom_scm_qseecom_app_send(u32 app_id, void *req, size_t req_size,
void *rsp, size_t rsp_size)
{
+ struct qcom_scm *scm = __scm;
+
struct qcom_scm_qseecom_resp res = {};
struct qcom_scm_desc desc = {};
phys_addr_t req_phys;
@@ -2283,7 +2389,7 @@ int qcom_scm_qseecom_app_send(u32 app_id, void *req, size_t req_size,
desc.args[3] = rsp_phys;
desc.args[4] = rsp_size;
- status = qcom_scm_qseecom_call(&desc, &res);
+ status = qcom_scm_qseecom_call(scm, &desc, &res);
if (status)
return status;
@@ -2363,7 +2469,7 @@ static int qcom_scm_qseecom_init(struct qcom_scm *scm)
* be safe as downstream sources indicate that the version query is
* neither blocking nor reentrant.
*/
- ret = qcom_scm_qseecom_get_version(&version);
+ ret = qcom_scm_qseecom_get_version(scm, &version);
if (ret)
return 0;
@@ -2420,6 +2526,8 @@ int qcom_scm_qtee_invoke_smc(phys_addr_t inbuf, size_t inbuf_size,
phys_addr_t outbuf, size_t outbuf_size,
u64 *result, u64 *response_type)
{
+ struct qcom_scm *scm = __scm;
+
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_SMCINVOKE,
.cmd = QCOM_SCM_SMCINVOKE_INVOKE,
@@ -2434,7 +2542,7 @@ int qcom_scm_qtee_invoke_smc(phys_addr_t inbuf, size_t inbuf_size,
struct qcom_scm_res res;
int ret;
- ret = qcom_scm_call(__scm->dev, &desc, &res);
+ ret = qcom_scm_call(scm->dev, &desc, &res);
if (ret)
return ret;
@@ -2462,6 +2570,8 @@ EXPORT_SYMBOL(qcom_scm_qtee_invoke_smc);
int qcom_scm_qtee_callback_response(phys_addr_t buf, size_t buf_size,
u64 *result, u64 *response_type)
{
+ struct qcom_scm *scm = __scm;
+
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_SMCINVOKE,
.cmd = QCOM_SCM_SMCINVOKE_CB_RSP,
@@ -2473,7 +2583,7 @@ int qcom_scm_qtee_callback_response(phys_addr_t buf, size_t buf_size,
struct qcom_scm_res res;
int ret;
- ret = qcom_scm_call(__scm->dev, &desc, &res);
+ ret = qcom_scm_call(scm->dev, &desc, &res);
if (ret)
return ret;
@@ -2902,9 +3012,9 @@ static int qcom_scm_probe(struct platform_device *pdev)
*/
smp_store_release(&__scm, scm);
- __get_convention();
+ __get_convention(scm->dev);
- if (qcom_scm_is_pas_available()) {
+ if (qcom_scm_is_pas_available(scm)) {
qcom_pas_ops_scm.dev = scm->dev;
qcom_pas_ops_register(&qcom_pas_ops_scm);
}
@@ -2920,7 +3030,7 @@ static int qcom_scm_probe(struct platform_device *pdev)
* Disable SDI if indicated by DT that it is enabled by default.
*/
if (of_property_read_bool(pdev->dev.of_node, "qcom,sdi-enabled") || !download_mode)
- qcom_scm_disable_sdi();
+ qcom_scm_disable_sdi(scm);
/*
* Initialize the QSEECOM interface.
--
2.55.0
next prev parent reply other threads:[~2026-09-14 12:42 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-14 12:41 [PATCH 0/3] firmware: qcom: scm: pass struct qcom_scm through the API Albert Esteve
2026-09-14 12:41 ` Albert Esteve [this message]
2026-09-14 12:41 ` [PATCH 2/3] firmware: qcom: scm: pass qcom_scm through the exported API Albert Esteve
2026-09-14 12:41 ` [PATCH 3/3] firmware: qcom: scm: drop the __scm global Albert Esteve
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260914-scm-device-api-v1-1-3573e2596c51@redhat.com \
--to=aesteve@redhat.com \
--cc=abhinav.kumar@linux.dev \
--cc=airlied@gmail.com \
--cc=akhilpo@oss.qualcomm.com \
--cc=amirreza.zarrabi@oss.qualcomm.com \
--cc=amitk@kernel.org \
--cc=andersson@kernel.org \
--cc=arnd@arndb.de \
--cc=ath10k@lists.infradead.org \
--cc=bod@kernel.org \
--cc=brgl@kernel.org \
--cc=briannorris@chromium.org \
--cc=christian.loehle@arm.com \
--cc=daniel.lezcano@kernel.org \
--cc=dikshita.agarwal@oss.qualcomm.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=ekansh.gupta@oss.qualcomm.com \
--cc=freedreno@lists.freedesktop.org \
--cc=govinds@codeaurora.org \
--cc=gregkh@linuxfoundation.org \
--cc=iommu@lists.linux.dev \
--cc=jenswi@kernel.org \
--cc=jesszhan0024@gmail.com \
--cc=jjohnson@kernel.org \
--cc=joro@8bytes.org \
--cc=konradybcio@kernel.org \
--cc=kvalo@kernel.org \
--cc=linusw@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-remoteproc@vger.kernel.org \
--cc=linux-wireless@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=lukasz.luba@arm.com \
--cc=lumag@kernel.org \
--cc=luzmaximilian@gmail.com \
--cc=marijn.suijten@somainline.org \
--cc=mathieu.poirier@linaro.org \
--cc=mchehab@kernel.org \
--cc=mripard@kernel.org \
--cc=niklas.cassel@linaro.org \
--cc=op-tee@lists.trustedfirmware.org \
--cc=p.zabel@pengutronix.de \
--cc=radu@rendec.net \
--cc=rafael@kernel.org \
--cc=robin.clark@oss.qualcomm.com \
--cc=robin.murphy@arm.com \
--cc=rui.zhang@intel.com \
--cc=sean@poorly.run \
--cc=simona@ffwll.ch \
--cc=srini@kernel.org \
--cc=sumit.garg@kernel.org \
--cc=tglx@kernel.org \
--cc=thara.gopinath@gmail.com \
--cc=vikash.garodia@oss.qualcomm.com \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®