[PATCH v4 2/2] firmware: qcom: scm: Add support for ARM64 SoCs

Kumar Gala galak at codeaurora.org
Tue Apr 28 09:10:43 PDT 2015


> On Apr 28, 2015, at 8:11 AM, Christopher Covington <cov at codeaurora.org> wrote:
> 
> Hi Kumar,
> 
> On 04/27/2015 05:23 PM, Kumar Gala wrote:
> 
>> --- /dev/null
>> +++ b/drivers/firmware/qcom_scm-64.c
>> @@ -0,0 +1,465 @@
>> +/* 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
>> + * only version 2 as published by the Free Software Foundation.
>> + *
>> + * This program is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with this program; if not, write to the Free Software
>> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
>> + * 02110-1301, USA.
>> + */
>> +
>> +#include <linux/cpumask.h>
>> +#include <linux/delay.h>
>> +#include <linux/mutex.h>
>> +#include <linux/slab.h>
>> +#include <linux/types.h>
>> +#include <linux/qcom_scm.h>
>> +
>> +#include <asm/cacheflush.h>
>> +#include <asm/compiler.h>
>> +#include <asm/smp_plat.h>
>> +
>> +#include "qcom_scm.h"
>> +
>> +#define QCOM_SCM_SIP_FNID(s, c) (((((s) & 0xFF) << 8) | ((c) & 0xFF)) | 0x02000000)
>> +
>> +#define MAX_QCOM_SCM_ARGS 10
>> +#define MAX_QCOM_SCM_RETS 3
>> +
>> +#define QCOM_SCM_ARGS_IMPL(num, a, b, c, d, e, f, g, h, i, j, ...) (\
>> +			(((a) & 0xff) << 4) | \
>> +			(((b) & 0xff) << 6) | \
>> +			(((c) & 0xff) << 8) | \
>> +			(((d) & 0xff) << 10) | \
>> +			(((e) & 0xff) << 12) | \
>> +			(((f) & 0xff) << 14) | \
>> +			(((g) & 0xff) << 16) | \
>> +			(((h) & 0xff) << 18) | \
>> +			(((i) & 0xff) << 20) | \
>> +			(((j) & 0xff) << 22) | \
>> +			(num & 0xffff))
>> +
>> +#define QCOM_SCM_ARGS(...) QCOM_SCM_ARGS_IMPL(__VA_ARGS__, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
>> +
>> +/**
>> + * struct qcom_scm_desc
>> + * @arginfo: Metadata describing the arguments in args[]
>> + * @args: The array of arguments for the secure syscall
>> + * @ret: The values returned by the secure syscall
>> + * @extra_arg_buf: The buffer containing extra arguments
>> +		   (that don't fit in available registers)
>> + * @x5: The 4rd argument to the secure syscall or physical address of
>> +	extra_arg_buf
>> + */
>> +struct qcom_scm_desc {
>> +	u32 arginfo;
>> +	u64 args[MAX_QCOM_SCM_ARGS];
>> +	u64 ret[MAX_QCOM_SCM_RETS];
>> +
>> +	/* private */
>> +	void *extra_arg_buf;
>> +	u64 x5;
>> +};
>> +
>> +
>> +#define QCOM_SCM_ENOMEM		-5
>> +#define QCOM_SCM_EOPNOTSUPP	-4
>> +#define QCOM_SCM_EINVAL_ADDR	-3
>> +#define QCOM_SCM_EINVAL_ARG	-2
>> +#define QCOM_SCM_ERROR		-1
>> +#define QCOM_SCM_INTERRUPTED	1
>> +#define QCOM_SCM_EBUSY		-55
>> +#define QCOM_SCM_V2_EBUSY	-12
> 
> Any reason to duplicate ENOMEM through INTERRUPTED rather than put them in the
> common header?

No reason to duplicate them, just hadn’t noticed.

>> +static DEFINE_MUTEX(qcom_scm_lock);
>> +
>> +#define QCOM_SCM_EBUSY_WAIT_MS 30
>> +#define QCOM_SCM_EBUSY_MAX_RETRY 20
>> +
>> +#define N_EXT_QCOM_SCM_ARGS 7
>> +#define FIRST_EXT_ARG_IDX 3
>> +#define SMC_ATOMIC_SYSCALL 31
>> +#define N_REGISTER_ARGS (MAX_QCOM_SCM_ARGS - N_EXT_QCOM_SCM_ARGS + 1)
>> +#define SMC64_MASK 0x40000000
>> +#define SMC_ATOMIC_MASK 0x80000000
>> +#define IS_CALL_AVAIL_CMD 1
>> +
>> +#define R0_STR "x0"
>> +#define R1_STR "x1"
>> +#define R2_STR "x2"
>> +#define R3_STR "x3"
>> +#define R4_STR "x4"
>> +#define R5_STR "x5"
> 
> What is the purpose of these macros?

Probably left over from when those code was merged between 32 and 64-bit, I’ll just inline them.

Thanks for the review.

- k

-- 
Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project




More information about the linux-arm-kernel mailing list