xref: /rk3399_ARM-atf/plat/qti/qtiseclib/src/qtiseclib_cb_interface.c (revision 5bd9c17d023288e6b819fa3eecc01b7981399cfa)
1 /*
2  * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 #include <assert.h>
7 #include <stdarg.h>
8 #include <stdint.h>
9 #include <stdio.h>
10 #include <string.h>
11 
12 #include <arch.h>
13 #include <arch_helpers.h>
14 #include <bl31/bl31.h>
15 #include <context.h>
16 #include <drivers/arm/gicv3.h>
17 #include <drivers/delay_timer.h>
18 #include <lib/coreboot.h>
19 #include <lib/el3_runtime/context_mgmt.h>
20 #include <lib/spinlock.h>
21 #include <lib/xlat_tables/xlat_tables_v2.h>
22 
23 #include <platform.h>
24 #include <qti_plat.h>
25 #include <qtiseclib_cb_interface.h>
26 
27 void *qtiseclib_cb_memcpy(void *dst, const void *src, size_t len)
28 {
29 	return memcpy(dst, src, len);
30 }
31 
32 /* Printing logs below or equal LOG_LEVEL from QTISECLIB. */
33 void qtiseclib_cb_log(unsigned int loglvl, const char *fmt, ...)
34 {
35 	if (loglvl <= LOG_LEVEL) {
36 		va_list argp;
37 		static spinlock_t qti_log_lock;
38 		uint64_t uptime = read_cntpct_el0();
39 
40 		va_start(argp, fmt);
41 
42 		spin_lock(&qti_log_lock);
43 		printf("QTISECLIB [%x%08x]",
44 		       (uint32_t) ((uptime >> 32) & 0xFFFFFFFF),
45 		       (uint32_t) (uptime & 0xFFFFFFFF));
46 		vprintf(fmt, argp);
47 		putchar('\n');
48 		spin_unlock(&qti_log_lock);
49 
50 		va_end(argp);
51 	}
52 }
53 
54 void qtiseclib_cb_spin_lock(qtiseclib_cb_spinlock_t *lock)
55 {
56 	spin_lock((spinlock_t *) lock);
57 }
58 
59 void qtiseclib_cb_spin_unlock(qtiseclib_cb_spinlock_t *lock)
60 {
61 	spin_unlock((spinlock_t *) lock);
62 }
63 
64 unsigned int qtiseclib_cb_plat_my_core_pos(void)
65 {
66 	return plat_my_core_pos();
67 }
68 
69 int qtiseclib_cb_plat_core_pos_by_mpidr(u_register_t mpidr)
70 {
71 	return plat_core_pos_by_mpidr(mpidr);
72 }
73 
74 unsigned int qtiseclib_cb_plat_my_cluster_pos(void)
75 {
76 	return plat_qti_my_cluster_pos();
77 }
78 
79 /* GIC platform functions */
80 void qtiseclib_cb_gic_pcpu_init(void)
81 {
82 	plat_qti_gic_pcpu_init();
83 }
84 
85 void qtiseclib_cb_ic_raise_sgi(int sgi_num, u_register_t target)
86 {
87 	plat_ic_raise_el3_sgi(sgi_num, target);
88 }
89 
90 void qtiseclib_cb_set_spi_routing(unsigned int id, unsigned int irm,
91 				  u_register_t target)
92 {
93 	assert(QTI_GICV3_IRM_PE == GICV3_IRM_PE);
94 	assert(QTI_GICV3_IRM_ANY == GICV3_IRM_ANY);
95 	gic_set_spi_routing(id, irm, target);
96 }
97 
98 /* Crash reporting api's wrappers */
99 void qtiseclib_cb_switch_console_to_crash_state(void)
100 {
101 	console_switch_state(CONSOLE_FLAG_CRASH);
102 }
103 
104 void qtiseclib_cb_udelay(uint32_t usec)
105 {
106 	udelay(usec);
107 }
108 
109 #if QTI_SDI_BUILD
110 void qtiseclib_cb_get_ns_ctx(qtiseclib_dbg_a64_ctxt_regs_type *qti_ns_ctx)
111 {
112 	void *ctx;
113 
114 	ctx = cm_get_context(NON_SECURE);
115 
116 	qti_ns_ctx->spsr_el3 =
117 	    read_ctx_reg(get_el3state_ctx(ctx), CTX_SPSR_EL3);
118 	qti_ns_ctx->elr_el3 = read_ctx_reg(get_el3state_ctx(ctx), CTX_ELR_EL3);
119 
120 	qti_ns_ctx->spsr_el1 =
121 	    read_ctx_reg(get_el1_sysregs_ctx(ctx), CTX_SPSR_EL1);
122 	qti_ns_ctx->elr_el1 =
123 	    read_ctx_reg(get_el1_sysregs_ctx(ctx), CTX_ELR_EL1);
124 	qti_ns_ctx->sp_el1 = read_ctx_reg(get_el1_sysregs_ctx(ctx), CTX_SP_EL1);
125 
126 	qti_ns_ctx->x0 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X0);
127 	qti_ns_ctx->x1 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X1);
128 	qti_ns_ctx->x2 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X2);
129 	qti_ns_ctx->x3 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X3);
130 	qti_ns_ctx->x4 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X4);
131 	qti_ns_ctx->x5 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X5);
132 	qti_ns_ctx->x6 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X6);
133 	qti_ns_ctx->x7 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X7);
134 	qti_ns_ctx->x8 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X8);
135 	qti_ns_ctx->x9 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X9);
136 	qti_ns_ctx->x10 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X10);
137 	qti_ns_ctx->x11 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X11);
138 	qti_ns_ctx->x12 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X12);
139 	qti_ns_ctx->x13 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X13);
140 	qti_ns_ctx->x14 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X14);
141 	qti_ns_ctx->x15 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X15);
142 	qti_ns_ctx->x16 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X16);
143 	qti_ns_ctx->x17 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X17);
144 	qti_ns_ctx->x18 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X18);
145 	qti_ns_ctx->x19 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X19);
146 	qti_ns_ctx->x20 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X20);
147 	qti_ns_ctx->x21 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X21);
148 	qti_ns_ctx->x22 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X22);
149 	qti_ns_ctx->x23 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X23);
150 	qti_ns_ctx->x24 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X24);
151 	qti_ns_ctx->x25 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X25);
152 	qti_ns_ctx->x26 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X26);
153 	qti_ns_ctx->x27 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X27);
154 	qti_ns_ctx->x28 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X28);
155 	qti_ns_ctx->x29 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X29);
156 	qti_ns_ctx->x30 = read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_LR);
157 	qti_ns_ctx->sp_el0 =
158 	    read_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_SP_EL0);
159 }
160 
161 void qtiseclib_cb_flush_dcache_all(void)
162 {
163 	dcsw_op_all(DCCISW);
164 }
165 
166 int qtiseclib_cb_mmap_add_dynamic_region(unsigned long long base_pa,
167 					 size_t size,
168 					 qtiseclib_mmap_attr_t attr)
169 {
170 	unsigned int l_attr = 0;
171 
172 	if (attr == QTISECLIB_MAP_NS_RO_XN_DATA) {
173 		l_attr = MT_NS | MT_RO | MT_EXECUTE_NEVER;
174 	} else if (attr == QTISECLIB_MAP_RW_XN_NC_DATA) {
175 		l_attr = MT_RW | MT_NON_CACHEABLE | MT_EXECUTE_NEVER;
176 	} else if (attr == QTISECLIB_MAP_RW_XN_DATA) {
177 		l_attr = MT_RW | MT_EXECUTE_NEVER;
178 	}
179 	return qti_mmap_add_dynamic_region(base_pa, size, l_attr);
180 }
181 
182 int qtiseclib_cb_mmap_remove_dynamic_region(uintptr_t base_va, size_t size)
183 {
184 	return qti_mmap_remove_dynamic_region(base_va, size);
185 }
186 #endif
187 
188