.. | .. |
---|
1 | | -/* Copyright (c) 2010-2015, The Linux Foundation. All rights reserved. |
---|
2 | | - * |
---|
3 | | - * This program is free software; you can redistribute it and/or modify |
---|
4 | | - * it under the terms of the GNU General Public License version 2 and |
---|
5 | | - * only version 2 as published by the Free Software Foundation. |
---|
6 | | - * |
---|
7 | | - * This program is distributed in the hope that it will be useful, |
---|
8 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
9 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
10 | | - * GNU General Public License for more details. |
---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-only */ |
---|
| 2 | +/* Copyright (c) 2010-2015,2019 The Linux Foundation. All rights reserved. |
---|
11 | 3 | */ |
---|
12 | 4 | #ifndef __QCOM_SCM_INT_H |
---|
13 | 5 | #define __QCOM_SCM_INT_H |
---|
14 | 6 | |
---|
15 | | -#define QCOM_SCM_SVC_BOOT 0x1 |
---|
16 | | -#define QCOM_SCM_BOOT_ADDR 0x1 |
---|
17 | | -#define QCOM_SCM_SET_DLOAD_MODE 0x10 |
---|
18 | | -#define QCOM_SCM_BOOT_ADDR_MC 0x11 |
---|
19 | | -#define QCOM_SCM_SET_REMOTE_STATE 0xa |
---|
20 | | -extern int __qcom_scm_set_remote_state(struct device *dev, u32 state, u32 id); |
---|
21 | | -extern int __qcom_scm_set_dload_mode(struct device *dev, bool enable); |
---|
| 7 | +enum qcom_scm_convention { |
---|
| 8 | + SMC_CONVENTION_UNKNOWN, |
---|
| 9 | + SMC_CONVENTION_LEGACY, |
---|
| 10 | + SMC_CONVENTION_ARM_32, |
---|
| 11 | + SMC_CONVENTION_ARM_64, |
---|
| 12 | +}; |
---|
22 | 13 | |
---|
23 | | -#define QCOM_SCM_FLAG_HLOS 0x01 |
---|
24 | | -#define QCOM_SCM_FLAG_COLDBOOT_MC 0x02 |
---|
25 | | -#define QCOM_SCM_FLAG_WARMBOOT_MC 0x04 |
---|
26 | | -extern int __qcom_scm_set_warm_boot_addr(struct device *dev, void *entry, |
---|
27 | | - const cpumask_t *cpus); |
---|
28 | | -extern int __qcom_scm_set_cold_boot_addr(void *entry, const cpumask_t *cpus); |
---|
| 14 | +extern enum qcom_scm_convention qcom_scm_convention; |
---|
29 | 15 | |
---|
30 | | -#define QCOM_SCM_CMD_TERMINATE_PC 0x2 |
---|
| 16 | +#define MAX_QCOM_SCM_ARGS 10 |
---|
| 17 | +#define MAX_QCOM_SCM_RETS 3 |
---|
| 18 | + |
---|
| 19 | +enum qcom_scm_arg_types { |
---|
| 20 | + QCOM_SCM_VAL, |
---|
| 21 | + QCOM_SCM_RO, |
---|
| 22 | + QCOM_SCM_RW, |
---|
| 23 | + QCOM_SCM_BUFVAL, |
---|
| 24 | +}; |
---|
| 25 | + |
---|
| 26 | +#define QCOM_SCM_ARGS_IMPL(num, a, b, c, d, e, f, g, h, i, j, ...) (\ |
---|
| 27 | + (((a) & 0x3) << 4) | \ |
---|
| 28 | + (((b) & 0x3) << 6) | \ |
---|
| 29 | + (((c) & 0x3) << 8) | \ |
---|
| 30 | + (((d) & 0x3) << 10) | \ |
---|
| 31 | + (((e) & 0x3) << 12) | \ |
---|
| 32 | + (((f) & 0x3) << 14) | \ |
---|
| 33 | + (((g) & 0x3) << 16) | \ |
---|
| 34 | + (((h) & 0x3) << 18) | \ |
---|
| 35 | + (((i) & 0x3) << 20) | \ |
---|
| 36 | + (((j) & 0x3) << 22) | \ |
---|
| 37 | + ((num) & 0xf)) |
---|
| 38 | + |
---|
| 39 | +#define QCOM_SCM_ARGS(...) QCOM_SCM_ARGS_IMPL(__VA_ARGS__, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) |
---|
| 40 | + |
---|
| 41 | + |
---|
| 42 | +/** |
---|
| 43 | + * struct qcom_scm_desc |
---|
| 44 | + * @arginfo: Metadata describing the arguments in args[] |
---|
| 45 | + * @args: The array of arguments for the secure syscall |
---|
| 46 | + */ |
---|
| 47 | +struct qcom_scm_desc { |
---|
| 48 | + u32 svc; |
---|
| 49 | + u32 cmd; |
---|
| 50 | + u32 arginfo; |
---|
| 51 | + u64 args[MAX_QCOM_SCM_ARGS]; |
---|
| 52 | + u32 owner; |
---|
| 53 | +}; |
---|
| 54 | + |
---|
| 55 | +/** |
---|
| 56 | + * struct qcom_scm_res |
---|
| 57 | + * @result: The values returned by the secure syscall |
---|
| 58 | + */ |
---|
| 59 | +struct qcom_scm_res { |
---|
| 60 | + u64 result[MAX_QCOM_SCM_RETS]; |
---|
| 61 | +}; |
---|
| 62 | + |
---|
| 63 | +#define SCM_SMC_FNID(s, c) ((((s) & 0xFF) << 8) | ((c) & 0xFF)) |
---|
| 64 | +extern int __scm_smc_call(struct device *dev, const struct qcom_scm_desc *desc, |
---|
| 65 | + enum qcom_scm_convention qcom_convention, |
---|
| 66 | + struct qcom_scm_res *res, bool atomic); |
---|
| 67 | +#define scm_smc_call(dev, desc, res, atomic) \ |
---|
| 68 | + __scm_smc_call((dev), (desc), qcom_scm_convention, (res), (atomic)) |
---|
| 69 | + |
---|
| 70 | +#define SCM_LEGACY_FNID(s, c) (((s) << 10) | ((c) & 0x3ff)) |
---|
| 71 | +extern int scm_legacy_call_atomic(struct device *dev, |
---|
| 72 | + const struct qcom_scm_desc *desc, |
---|
| 73 | + struct qcom_scm_res *res); |
---|
| 74 | +extern int scm_legacy_call(struct device *dev, const struct qcom_scm_desc *desc, |
---|
| 75 | + struct qcom_scm_res *res); |
---|
| 76 | + |
---|
| 77 | +#define QCOM_SCM_SVC_BOOT 0x01 |
---|
| 78 | +#define QCOM_SCM_BOOT_SET_ADDR 0x01 |
---|
| 79 | +#define QCOM_SCM_BOOT_TERMINATE_PC 0x02 |
---|
| 80 | +#define QCOM_SCM_BOOT_SET_DLOAD_MODE 0x10 |
---|
| 81 | +#define QCOM_SCM_BOOT_SET_REMOTE_STATE 0x0a |
---|
31 | 82 | #define QCOM_SCM_FLUSH_FLAG_MASK 0x3 |
---|
32 | | -#define QCOM_SCM_CMD_CORE_HOTPLUGGED 0x10 |
---|
33 | | -extern void __qcom_scm_cpu_power_down(u32 flags); |
---|
34 | 83 | |
---|
35 | | -#define QCOM_SCM_SVC_IO 0x5 |
---|
36 | | -#define QCOM_SCM_IO_READ 0x1 |
---|
37 | | -#define QCOM_SCM_IO_WRITE 0x2 |
---|
38 | | -extern int __qcom_scm_io_readl(struct device *dev, phys_addr_t addr, unsigned int *val); |
---|
39 | | -extern int __qcom_scm_io_writel(struct device *dev, phys_addr_t addr, unsigned int val); |
---|
| 84 | +#define QCOM_SCM_SVC_PIL 0x02 |
---|
| 85 | +#define QCOM_SCM_PIL_PAS_INIT_IMAGE 0x01 |
---|
| 86 | +#define QCOM_SCM_PIL_PAS_MEM_SETUP 0x02 |
---|
| 87 | +#define QCOM_SCM_PIL_PAS_AUTH_AND_RESET 0x05 |
---|
| 88 | +#define QCOM_SCM_PIL_PAS_SHUTDOWN 0x06 |
---|
| 89 | +#define QCOM_SCM_PIL_PAS_IS_SUPPORTED 0x07 |
---|
| 90 | +#define QCOM_SCM_PIL_PAS_MSS_RESET 0x0a |
---|
40 | 91 | |
---|
41 | | -#define QCOM_SCM_SVC_INFO 0x6 |
---|
42 | | -#define QCOM_IS_CALL_AVAIL_CMD 0x1 |
---|
43 | | -extern int __qcom_scm_is_call_available(struct device *dev, u32 svc_id, |
---|
44 | | - u32 cmd_id); |
---|
| 92 | +#define QCOM_SCM_SVC_IO 0x05 |
---|
| 93 | +#define QCOM_SCM_IO_READ 0x01 |
---|
| 94 | +#define QCOM_SCM_IO_WRITE 0x02 |
---|
| 95 | + |
---|
| 96 | +#define QCOM_SCM_SVC_INFO 0x06 |
---|
| 97 | +#define QCOM_SCM_INFO_IS_CALL_AVAIL 0x01 |
---|
| 98 | + |
---|
| 99 | +#define QCOM_SCM_SVC_MP 0x0c |
---|
| 100 | +#define QCOM_SCM_MP_RESTORE_SEC_CFG 0x02 |
---|
| 101 | +#define QCOM_SCM_MP_IOMMU_SECURE_PTBL_SIZE 0x03 |
---|
| 102 | +#define QCOM_SCM_MP_IOMMU_SECURE_PTBL_INIT 0x04 |
---|
| 103 | +#define QCOM_SCM_MP_VIDEO_VAR 0x08 |
---|
| 104 | +#define QCOM_SCM_MP_ASSIGN 0x16 |
---|
| 105 | + |
---|
| 106 | +#define QCOM_SCM_SVC_OCMEM 0x0f |
---|
| 107 | +#define QCOM_SCM_OCMEM_LOCK_CMD 0x01 |
---|
| 108 | +#define QCOM_SCM_OCMEM_UNLOCK_CMD 0x02 |
---|
| 109 | + |
---|
| 110 | +#define QCOM_SCM_SVC_ES 0x10 /* Enterprise Security */ |
---|
| 111 | +#define QCOM_SCM_ES_INVALIDATE_ICE_KEY 0x03 |
---|
| 112 | +#define QCOM_SCM_ES_CONFIG_SET_ICE_KEY 0x04 |
---|
45 | 113 | |
---|
46 | 114 | #define QCOM_SCM_SVC_HDCP 0x11 |
---|
47 | | -#define QCOM_SCM_CMD_HDCP 0x01 |
---|
48 | | -extern int __qcom_scm_hdcp_req(struct device *dev, |
---|
49 | | - struct qcom_scm_hdcp_req *req, u32 req_cnt, u32 *resp); |
---|
| 115 | +#define QCOM_SCM_HDCP_INVOKE 0x01 |
---|
| 116 | + |
---|
| 117 | +#define QCOM_SCM_SVC_SMMU_PROGRAM 0x15 |
---|
| 118 | +#define QCOM_SCM_SMMU_CONFIG_ERRATA1 0x03 |
---|
| 119 | +#define QCOM_SCM_SMMU_CONFIG_ERRATA1_CLIENT_ALL 0x02 |
---|
50 | 120 | |
---|
51 | 121 | extern void __qcom_scm_init(void); |
---|
52 | | - |
---|
53 | | -#define QCOM_SCM_SVC_PIL 0x2 |
---|
54 | | -#define QCOM_SCM_PAS_INIT_IMAGE_CMD 0x1 |
---|
55 | | -#define QCOM_SCM_PAS_MEM_SETUP_CMD 0x2 |
---|
56 | | -#define QCOM_SCM_PAS_AUTH_AND_RESET_CMD 0x5 |
---|
57 | | -#define QCOM_SCM_PAS_SHUTDOWN_CMD 0x6 |
---|
58 | | -#define QCOM_SCM_PAS_IS_SUPPORTED_CMD 0x7 |
---|
59 | | -#define QCOM_SCM_PAS_MSS_RESET 0xa |
---|
60 | | -extern bool __qcom_scm_pas_supported(struct device *dev, u32 peripheral); |
---|
61 | | -extern int __qcom_scm_pas_init_image(struct device *dev, u32 peripheral, |
---|
62 | | - dma_addr_t metadata_phys); |
---|
63 | | -extern int __qcom_scm_pas_mem_setup(struct device *dev, u32 peripheral, |
---|
64 | | - phys_addr_t addr, phys_addr_t size); |
---|
65 | | -extern int __qcom_scm_pas_auth_and_reset(struct device *dev, u32 peripheral); |
---|
66 | | -extern int __qcom_scm_pas_shutdown(struct device *dev, u32 peripheral); |
---|
67 | | -extern int __qcom_scm_pas_mss_reset(struct device *dev, bool reset); |
---|
68 | 122 | |
---|
69 | 123 | /* common error codes */ |
---|
70 | 124 | #define QCOM_SCM_V2_EBUSY -12 |
---|
.. | .. |
---|
92 | 146 | } |
---|
93 | 147 | return -EINVAL; |
---|
94 | 148 | } |
---|
95 | | - |
---|
96 | | -#define QCOM_SCM_SVC_MP 0xc |
---|
97 | | -#define QCOM_SCM_RESTORE_SEC_CFG 2 |
---|
98 | | -extern int __qcom_scm_restore_sec_cfg(struct device *dev, u32 device_id, |
---|
99 | | - u32 spare); |
---|
100 | | -#define QCOM_SCM_IOMMU_SECURE_PTBL_SIZE 3 |
---|
101 | | -#define QCOM_SCM_IOMMU_SECURE_PTBL_INIT 4 |
---|
102 | | -extern int __qcom_scm_iommu_secure_ptbl_size(struct device *dev, u32 spare, |
---|
103 | | - size_t *size); |
---|
104 | | -extern int __qcom_scm_iommu_secure_ptbl_init(struct device *dev, u64 addr, |
---|
105 | | - u32 size, u32 spare); |
---|
106 | | -#define QCOM_MEM_PROT_ASSIGN_ID 0x16 |
---|
107 | | -extern int __qcom_scm_assign_mem(struct device *dev, |
---|
108 | | - phys_addr_t mem_region, size_t mem_sz, |
---|
109 | | - phys_addr_t src, size_t src_sz, |
---|
110 | | - phys_addr_t dest, size_t dest_sz); |
---|
111 | 149 | |
---|
112 | 150 | #endif |
---|