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

Commit 5b540967 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "smcinvoke: Call correct apis on basis of device tree entry"

parents d452e9fd 038c930a
Loading
Loading
Loading
Loading
+33 −1
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (c) 2015,2020 The Linux Foundation. All rights reserved.
/* Copyright (c) 2015,2020-2021 The Linux Foundation. All rights reserved.
 */

#include <linux/io.h>
@@ -2020,6 +2020,38 @@ int __qcom_scm_request_encrypted_log(struct device *dev, phys_addr_t buf,
	return ret ? : desc.res[0];
}

int __qcom_scm_invoke_smc_legacy(struct device *dev, phys_addr_t in_buf,
        size_t in_buf_size, phys_addr_t out_buf, size_t out_buf_size,
        int32_t *result, u64 *response_type, unsigned int *data)
{
	int ret;
	struct qcom_scm_desc desc = {
		.svc = QCOM_SCM_SVC_SMCINVOKE,
		.cmd = QCOM_SCM_SMCINVOKE_INVOKE_LEGACY,
		.owner = ARM_SMCCC_OWNER_TRUSTED_OS
	};

	desc.args[0] = in_buf;
	desc.args[1] = in_buf_size;
	desc.args[2] = out_buf;
	desc.args[3] = out_buf_size;
	desc.arginfo = QCOM_SCM_ARGS(4, QCOM_SCM_RW, QCOM_SCM_VAL, QCOM_SCM_RW,
					QCOM_SCM_VAL);

	ret = qcom_scm_call(dev, &desc);

	if (result)
		*result = desc.res[1];

	if (response_type)
		*response_type = desc.res[0];

	if (data)
		*data = desc.res[2];

	return ret;
}

int __qcom_scm_invoke_smc(struct device *dev, phys_addr_t in_buf,
	size_t in_buf_size, phys_addr_t out_buf, size_t out_buf_size,
	int32_t *result, u64 *response_type, unsigned int *data)
+9 −0
Original line number Diff line number Diff line
@@ -980,6 +980,15 @@ int qcom_scm_request_encrypted_log(phys_addr_t buf, size_t len,
}
EXPORT_SYMBOL(qcom_scm_request_encrypted_log);

int qcom_scm_invoke_smc_legacy(phys_addr_t in_buf, size_t in_buf_size,
		phys_addr_t out_buf, size_t out_buf_size, int32_t *result,
		u64 *response_type, unsigned int *data)
{
	return __qcom_scm_invoke_smc_legacy(__scm->dev, in_buf, in_buf_size, out_buf,
		out_buf_size, result, response_type, data);
}
EXPORT_SYMBOL(qcom_scm_invoke_smc_legacy);

int qcom_scm_invoke_smc(phys_addr_t in_buf, size_t in_buf_size,
		phys_addr_t out_buf, size_t out_buf_size, int32_t *result,
		u64 *response_type, unsigned int *data)
+5 −1
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/* Copyright (c) 2010-2015,2020 The Linux Foundation. All rights reserved.
/* Copyright (c) 2010-2015,2020-2021 The Linux Foundation. All rights reserved.
 */
#ifndef __QCOM_SCM_INT_H
#define __QCOM_SCM_INT_H
@@ -260,8 +260,12 @@ extern int __qcom_scm_request_encrypted_log(struct device *dev, phys_addr_t buf,
extern int __qcom_scm_ice_restore_cfg(struct device *dev);

#define QCOM_SCM_SVC_SMCINVOKE		0x06
#define QCOM_SCM_SMCINVOKE_INVOKE_LEGACY   0x00
#define QCOM_SCM_SMCINVOKE_INVOKE	0x02
#define QCOM_SCM_SMCINVOKE_CB_RSP	0x01
extern int __qcom_scm_invoke_smc_legacy(struct device *dev, phys_addr_t in_buf,
		size_t in_buf_size, phys_addr_t out_buf, size_t out_buf_size,
		int32_t *result, u64 *response_type, unsigned int *data);
extern int __qcom_scm_invoke_smc(struct device *dev, phys_addr_t in_buf,
		size_t in_buf_size, phys_addr_t out_buf, size_t out_buf_size,
		int32_t *result, u64 *response_type, unsigned int *data);
+16 −5
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@
#include <linux/kref.h>
#include <linux/signal.h>
#include <linux/msm_ion.h>
#include <linux/of_platform.h>

#include <linux/qcom_scm.h>
#include <asm/cacheflush.h>
@@ -50,6 +51,7 @@
/* TZ defined values - Start */
#define SMCINVOKE_INVOKE_PARAM_ID       0x224
#define SMCINVOKE_CB_RSP_PARAM_ID       0x22
#define SMCINVOKE_INVOKE_CMD_LEGACY     0x32000600
#define SMCINVOKE_INVOKE_CMD            0x32000602
#define SMCINVOKE_CB_RSP_CMD            0x32000601
#define SMCINVOKE_RESULT_INBOUND_REQ_NEEDED 3
@@ -144,6 +146,7 @@ static uint16_t g_last_cb_server_id = CBOBJ_SERVER_ID_START;
static uint16_t g_last_mem_rgn_id, g_last_mem_map_obj_id;
static size_t g_max_cb_buf_size = SMCINVOKE_TZ_MIN_BUF_SIZE;
static unsigned int cb_reqs_inflight;
static bool legacy_smc_call;

static long smcinvoke_ioctl(struct file *, unsigned int, unsigned long);
static int smcinvoke_open(struct inode *, struct file *);
@@ -1228,6 +1231,9 @@ static int prepare_send_scm_msg(const uint8_t *in_buf, phys_addr_t in_paddr,
	if ((in_buf_len % PAGE_SIZE) != 0 || (out_buf_len % PAGE_SIZE) != 0)
		return -EINVAL;

	if (legacy_smc_call)
		cmd = SMCINVOKE_INVOKE_CMD_LEGACY;
	else
		cmd = SMCINVOKE_INVOKE_CMD;
	/*
	 * purpose of lock here is to ensure that any CB obj that may be going
@@ -1241,11 +1247,14 @@ static int prepare_send_scm_msg(const uint8_t *in_buf, phys_addr_t in_paddr,
	while (1) {
		mutex_lock(&g_smcinvoke_lock);

		if (cmd == SMCINVOKE_INVOKE_CMD)
		if (cmd == SMCINVOKE_INVOKE_CMD_LEGACY)
			ret = qcom_scm_invoke_smc_legacy(in_paddr, in_buf_len,
					out_paddr, out_buf_len,
					&req->result, &response_type, &data);
		else if (cmd == SMCINVOKE_INVOKE_CMD)
			ret = qcom_scm_invoke_smc(in_paddr, in_buf_len,
					out_paddr, out_buf_len,
						&req->result, &response_type,
						&data);
					&req->result, &response_type, &data);
		else
			ret = qcom_scm_invoke_callback_response(
					virt_to_phys(out_buf), out_buf_len,
@@ -2071,6 +2080,8 @@ static int smcinvoke_probe(struct platform_device *pdev)
		pr_err("dma_set_mask_and_coherent failed %d\n", rc);
		goto exit_destroy_device;
	}
	legacy_smc_call = of_property_read_bool((&pdev->dev)->of_node,
			"qcom,support-legacy_smc");

	return  0;

+6 −0
Original line number Diff line number Diff line
@@ -192,6 +192,9 @@ extern int qcom_scm_register_qsee_log_buf(phys_addr_t buf, size_t len);
extern int qcom_scm_query_encrypted_log_feature(u64 *enabled);
extern int qcom_scm_request_encrypted_log(phys_addr_t buf, size_t len,
						uint32_t log_id);
extern int qcom_scm_invoke_smc_legacy(phys_addr_t in_buf, size_t in_buf_size,
		phys_addr_t out_buf, size_t out_buf_size, int32_t *result,
		u64 *response_type, unsigned int *data);
extern int qcom_scm_invoke_smc(phys_addr_t in_buf, size_t in_buf_size,
		phys_addr_t out_buf, size_t out_buf_size, int32_t *result,
		u64 *response_type, unsigned int *data);
@@ -365,6 +368,9 @@ static inline int qcom_scm_query_encrypted_log_feature(u64 *enabled)
static inline int qcom_scm_request_encrypted_log(phys_addr_t buf, size_t len,
						uint32_t log_id)
		{ return -ENODEV; }
static inline int qcom_scm_invoke_smc_legacy(phys_addr_t in_buf, size_t in_buf_size,
		phys_addr_t out_buf, size_t out_buf_size, int32_t *result,
		u64 *request_type, unsigned int *data)  { return -ENODEV; }
static inline int qcom_scm_invoke_smc(phys_addr_t in_buf, size_t in_buf_size,
		phys_addr_t out_buf, size_t out_buf_size, int32_t *result,
		u64 *request_type, unsigned int *data)	{ return -ENODEV; }