1 /* Copyright (c) 2010,2015, The Linux Foundation. All rights reserved.
2 * Copyright (C) 2015 Linaro Ltd.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 and
6 * only version 2 as published by the Free Software Foundation.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 #include <linux/slab.h>
21 #include <linux/module.h>
22 #include <linux/mutex.h>
23 #include <linux/errno.h>
24 #include <linux/err.h>
25 #include <linux/qcom_scm.h>
26 #include <linux/dma-mapping.h>
30 #define QCOM_SCM_FLAG_COLDBOOT_CPU0 0x00
31 #define QCOM_SCM_FLAG_COLDBOOT_CPU1 0x01
32 #define QCOM_SCM_FLAG_COLDBOOT_CPU2 0x08
33 #define QCOM_SCM_FLAG_COLDBOOT_CPU3 0x20
35 #define QCOM_SCM_FLAG_WARMBOOT_CPU0 0x04
36 #define QCOM_SCM_FLAG_WARMBOOT_CPU1 0x02
37 #define QCOM_SCM_FLAG_WARMBOOT_CPU2 0x10
38 #define QCOM_SCM_FLAG_WARMBOOT_CPU3 0x40
40 struct qcom_scm_entry
{
45 static struct qcom_scm_entry qcom_scm_wb
[] = {
46 { .flag
= QCOM_SCM_FLAG_WARMBOOT_CPU0
},
47 { .flag
= QCOM_SCM_FLAG_WARMBOOT_CPU1
},
48 { .flag
= QCOM_SCM_FLAG_WARMBOOT_CPU2
},
49 { .flag
= QCOM_SCM_FLAG_WARMBOOT_CPU3
},
52 static DEFINE_MUTEX(qcom_scm_lock
);
55 * struct qcom_scm_command - one SCM command buffer
56 * @len: total available memory for command and response
57 * @buf_offset: start of command buffer
58 * @resp_hdr_offset: start of response buffer
59 * @id: command to be executed
60 * @buf: buffer returned from qcom_scm_get_command_buffer()
62 * An SCM command is laid out in memory as follows:
64 * ------------------- <--- struct qcom_scm_command
66 * ------------------- <--- qcom_scm_get_command_buffer()
68 * ------------------- <--- struct qcom_scm_response and
69 * | response header | qcom_scm_command_to_response()
70 * ------------------- <--- qcom_scm_get_response_buffer()
74 * There can be arbitrary padding between the headers and buffers so
75 * you should always use the appropriate qcom_scm_get_*_buffer() routines
76 * to access the buffers in a safe manner.
78 struct qcom_scm_command
{
81 __le32 resp_hdr_offset
;
87 * struct qcom_scm_response - one SCM response buffer
88 * @len: total available memory for response
89 * @buf_offset: start of response data relative to start of qcom_scm_response
90 * @is_complete: indicates if the command has finished processing
92 struct qcom_scm_response
{
99 * qcom_scm_command_to_response() - Get a pointer to a qcom_scm_response
102 * Returns a pointer to a response for a command.
104 static inline struct qcom_scm_response
*qcom_scm_command_to_response(
105 const struct qcom_scm_command
*cmd
)
107 return (void *)cmd
+ le32_to_cpu(cmd
->resp_hdr_offset
);
111 * qcom_scm_get_command_buffer() - Get a pointer to a command buffer
114 * Returns a pointer to the command buffer of a command.
116 static inline void *qcom_scm_get_command_buffer(const struct qcom_scm_command
*cmd
)
118 return (void *)cmd
->buf
;
122 * qcom_scm_get_response_buffer() - Get a pointer to a response buffer
125 * Returns a pointer to a response buffer of a response.
127 static inline void *qcom_scm_get_response_buffer(const struct qcom_scm_response
*rsp
)
129 return (void *)rsp
+ le32_to_cpu(rsp
->buf_offset
);
132 static u32
smc(u32 cmd_addr
)
135 register u32 r0
asm("r0") = 1;
136 register u32 r1
asm("r1") = (u32
)&context_id
;
137 register u32 r2
asm("r2") = cmd_addr
;
145 ".arch_extension sec\n"
147 "smc #0 @ switch to secure world\n"
149 : "r" (r0
), "r" (r1
), "r" (r2
)
151 } while (r0
== QCOM_SCM_INTERRUPTED
);
157 * qcom_scm_call() - Send an SCM command
158 * @dev: struct device
159 * @svc_id: service identifier
160 * @cmd_id: command identifier
161 * @cmd_buf: command buffer
162 * @cmd_len: length of the command buffer
163 * @resp_buf: response buffer
164 * @resp_len: length of the response buffer
166 * Sends a command to the SCM and waits for the command to finish processing.
168 * A note on cache maintenance:
169 * Note that any buffers that are expected to be accessed by the secure world
170 * must be flushed before invoking qcom_scm_call and invalidated in the cache
171 * immediately after qcom_scm_call returns. Cache maintenance on the command
172 * and response buffers is taken care of by qcom_scm_call; however, callers are
173 * responsible for any other cached buffers passed over to the secure world.
175 static int qcom_scm_call(struct device
*dev
, u32 svc_id
, u32 cmd_id
,
176 const void *cmd_buf
, size_t cmd_len
, void *resp_buf
,
180 struct qcom_scm_command
*cmd
;
181 struct qcom_scm_response
*rsp
;
182 size_t alloc_len
= sizeof(*cmd
) + cmd_len
+ sizeof(*rsp
) + resp_len
;
185 cmd
= kzalloc(PAGE_ALIGN(alloc_len
), GFP_KERNEL
);
189 cmd
->len
= cpu_to_le32(alloc_len
);
190 cmd
->buf_offset
= cpu_to_le32(sizeof(*cmd
));
191 cmd
->resp_hdr_offset
= cpu_to_le32(sizeof(*cmd
) + cmd_len
);
193 cmd
->id
= cpu_to_le32((svc_id
<< 10) | cmd_id
);
195 memcpy(qcom_scm_get_command_buffer(cmd
), cmd_buf
, cmd_len
);
197 rsp
= qcom_scm_command_to_response(cmd
);
199 cmd_phys
= dma_map_single(dev
, cmd
, alloc_len
, DMA_TO_DEVICE
);
200 if (dma_mapping_error(dev
, cmd_phys
)) {
205 mutex_lock(&qcom_scm_lock
);
208 ret
= qcom_scm_remap_error(ret
);
209 mutex_unlock(&qcom_scm_lock
);
214 dma_sync_single_for_cpu(dev
, cmd_phys
+ sizeof(*cmd
) + cmd_len
,
215 sizeof(*rsp
), DMA_FROM_DEVICE
);
216 } while (!rsp
->is_complete
);
219 dma_sync_single_for_cpu(dev
, cmd_phys
+ sizeof(*cmd
) + cmd_len
+
220 le32_to_cpu(rsp
->buf_offset
),
221 resp_len
, DMA_FROM_DEVICE
);
222 memcpy(resp_buf
, qcom_scm_get_response_buffer(rsp
),
226 dma_unmap_single(dev
, cmd_phys
, alloc_len
, DMA_TO_DEVICE
);
231 #define SCM_CLASS_REGISTER (0x2 << 8)
232 #define SCM_MASK_IRQS BIT(5)
233 #define SCM_ATOMIC(svc, cmd, n) (((((svc) << 10)|((cmd) & 0x3ff)) << 12) | \
234 SCM_CLASS_REGISTER | \
239 * qcom_scm_call_atomic1() - Send an atomic SCM command with one argument
240 * @svc_id: service identifier
241 * @cmd_id: command identifier
242 * @arg1: first argument
244 * This shall only be used with commands that are guaranteed to be
245 * uninterruptable, atomic and SMP safe.
247 static s32
qcom_scm_call_atomic1(u32 svc
, u32 cmd
, u32 arg1
)
251 register u32 r0
asm("r0") = SCM_ATOMIC(svc
, cmd
, 1);
252 register u32 r1
asm("r1") = (u32
)&context_id
;
253 register u32 r2
asm("r2") = arg1
;
261 ".arch_extension sec\n"
263 "smc #0 @ switch to secure world\n"
265 : "r" (r0
), "r" (r1
), "r" (r2
)
271 * qcom_scm_call_atomic2() - Send an atomic SCM command with two arguments
272 * @svc_id: service identifier
273 * @cmd_id: command identifier
274 * @arg1: first argument
275 * @arg2: second argument
277 * This shall only be used with commands that are guaranteed to be
278 * uninterruptable, atomic and SMP safe.
280 static s32
qcom_scm_call_atomic2(u32 svc
, u32 cmd
, u32 arg1
, u32 arg2
)
284 register u32 r0
asm("r0") = SCM_ATOMIC(svc
, cmd
, 2);
285 register u32 r1
asm("r1") = (u32
)&context_id
;
286 register u32 r2
asm("r2") = arg1
;
287 register u32 r3
asm("r3") = arg2
;
296 ".arch_extension sec\n"
298 "smc #0 @ switch to secure world\n"
300 : "r" (r0
), "r" (r1
), "r" (r2
), "r" (r3
)
305 u32
qcom_scm_get_version(void)
308 static u32 version
= -1;
309 register u32 r0
asm("r0");
310 register u32 r1
asm("r1");
315 mutex_lock(&qcom_scm_lock
);
318 r1
= (u32
)&context_id
;
326 ".arch_extension sec\n"
328 "smc #0 @ switch to secure world\n"
329 : "=r" (r0
), "=r" (r1
)
332 } while (r0
== QCOM_SCM_INTERRUPTED
);
335 mutex_unlock(&qcom_scm_lock
);
339 EXPORT_SYMBOL(qcom_scm_get_version
);
342 * qcom_scm_set_cold_boot_addr() - Set the cold boot address for cpus
343 * @entry: Entry point function for the cpus
344 * @cpus: The cpumask of cpus that will use the entry point
346 * Set the cold boot address of the cpus. Any cpu outside the supported
347 * range would be removed from the cpu present mask.
349 int __qcom_scm_set_cold_boot_addr(void *entry
, const cpumask_t
*cpus
)
353 int scm_cb_flags
[] = {
354 QCOM_SCM_FLAG_COLDBOOT_CPU0
,
355 QCOM_SCM_FLAG_COLDBOOT_CPU1
,
356 QCOM_SCM_FLAG_COLDBOOT_CPU2
,
357 QCOM_SCM_FLAG_COLDBOOT_CPU3
,
360 if (!cpus
|| (cpus
&& cpumask_empty(cpus
)))
363 for_each_cpu(cpu
, cpus
) {
364 if (cpu
< ARRAY_SIZE(scm_cb_flags
))
365 flags
|= scm_cb_flags
[cpu
];
367 set_cpu_present(cpu
, false);
370 return qcom_scm_call_atomic2(QCOM_SCM_SVC_BOOT
, QCOM_SCM_BOOT_ADDR
,
371 flags
, virt_to_phys(entry
));
375 * qcom_scm_set_warm_boot_addr() - Set the warm boot address for cpus
376 * @entry: Entry point function for the cpus
377 * @cpus: The cpumask of cpus that will use the entry point
379 * Set the Linux entry point for the SCM to transfer control to when coming
380 * out of a power down. CPU power down may be executed on cpuidle or hotplug.
382 int __qcom_scm_set_warm_boot_addr(struct device
*dev
, void *entry
,
383 const cpumask_t
*cpus
)
394 * Reassign only if we are switching from hotplug entry point
395 * to cpuidle entry point or vice versa.
397 for_each_cpu(cpu
, cpus
) {
398 if (entry
== qcom_scm_wb
[cpu
].entry
)
400 flags
|= qcom_scm_wb
[cpu
].flag
;
403 /* No change in entry function */
407 cmd
.addr
= cpu_to_le32(virt_to_phys(entry
));
408 cmd
.flags
= cpu_to_le32(flags
);
409 ret
= qcom_scm_call(dev
, QCOM_SCM_SVC_BOOT
, QCOM_SCM_BOOT_ADDR
,
410 &cmd
, sizeof(cmd
), NULL
, 0);
412 for_each_cpu(cpu
, cpus
)
413 qcom_scm_wb
[cpu
].entry
= entry
;
420 * qcom_scm_cpu_power_down() - Power down the cpu
421 * @flags - Flags to flush cache
423 * This is an end point to power down cpu. If there was a pending interrupt,
424 * the control would return from this function, otherwise, the cpu jumps to the
425 * warm boot entry point set for this cpu upon reset.
427 void __qcom_scm_cpu_power_down(u32 flags
)
429 qcom_scm_call_atomic1(QCOM_SCM_SVC_BOOT
, QCOM_SCM_CMD_TERMINATE_PC
,
430 flags
& QCOM_SCM_FLUSH_FLAG_MASK
);
433 int __qcom_scm_is_call_available(struct device
*dev
, u32 svc_id
, u32 cmd_id
)
436 __le32 svc_cmd
= cpu_to_le32((svc_id
<< 10) | cmd_id
);
439 ret
= qcom_scm_call(dev
, QCOM_SCM_SVC_INFO
, QCOM_IS_CALL_AVAIL_CMD
,
440 &svc_cmd
, sizeof(svc_cmd
), &ret_val
,
445 return le32_to_cpu(ret_val
);
448 int __qcom_scm_hdcp_req(struct device
*dev
, struct qcom_scm_hdcp_req
*req
,
449 u32 req_cnt
, u32
*resp
)
451 if (req_cnt
> QCOM_SCM_HDCP_MAX_REQ_CNT
)
454 return qcom_scm_call(dev
, QCOM_SCM_SVC_HDCP
, QCOM_SCM_CMD_HDCP
,
455 req
, req_cnt
* sizeof(*req
), resp
, sizeof(*resp
));
458 void __qcom_scm_init(void)
462 bool __qcom_scm_pas_supported(struct device
*dev
, u32 peripheral
)
468 in
= cpu_to_le32(peripheral
);
469 ret
= qcom_scm_call(dev
, QCOM_SCM_SVC_PIL
,
470 QCOM_SCM_PAS_IS_SUPPORTED_CMD
,
474 return ret
? false : !!out
;
477 int __qcom_scm_pas_init_image(struct device
*dev
, u32 peripheral
,
478 dma_addr_t metadata_phys
)
487 request
.proc
= cpu_to_le32(peripheral
);
488 request
.image_addr
= cpu_to_le32(metadata_phys
);
490 ret
= qcom_scm_call(dev
, QCOM_SCM_SVC_PIL
,
491 QCOM_SCM_PAS_INIT_IMAGE_CMD
,
492 &request
, sizeof(request
),
493 &scm_ret
, sizeof(scm_ret
));
495 return ret
? : le32_to_cpu(scm_ret
);
498 int __qcom_scm_pas_mem_setup(struct device
*dev
, u32 peripheral
,
499 phys_addr_t addr
, phys_addr_t size
)
509 request
.proc
= cpu_to_le32(peripheral
);
510 request
.addr
= cpu_to_le32(addr
);
511 request
.len
= cpu_to_le32(size
);
513 ret
= qcom_scm_call(dev
, QCOM_SCM_SVC_PIL
,
514 QCOM_SCM_PAS_MEM_SETUP_CMD
,
515 &request
, sizeof(request
),
516 &scm_ret
, sizeof(scm_ret
));
518 return ret
? : le32_to_cpu(scm_ret
);
521 int __qcom_scm_pas_auth_and_reset(struct device
*dev
, u32 peripheral
)
527 in
= cpu_to_le32(peripheral
);
528 ret
= qcom_scm_call(dev
, QCOM_SCM_SVC_PIL
,
529 QCOM_SCM_PAS_AUTH_AND_RESET_CMD
,
533 return ret
? : le32_to_cpu(out
);
536 int __qcom_scm_pas_shutdown(struct device
*dev
, u32 peripheral
)
542 in
= cpu_to_le32(peripheral
);
543 ret
= qcom_scm_call(dev
, QCOM_SCM_SVC_PIL
,
544 QCOM_SCM_PAS_SHUTDOWN_CMD
,
548 return ret
? : le32_to_cpu(out
);
551 int __qcom_scm_pas_mss_reset(struct device
*dev
, bool reset
)
554 __le32 in
= cpu_to_le32(reset
);
557 ret
= qcom_scm_call(dev
, QCOM_SCM_SVC_PIL
, QCOM_SCM_PAS_MSS_RESET
,
561 return ret
? : le32_to_cpu(out
);