aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-msm/scm.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-msm/scm.c')
-rw-r--r--arch/arm/mach-msm/scm.c58
1 files changed, 32 insertions, 26 deletions
diff --git a/arch/arm/mach-msm/scm.c b/arch/arm/mach-msm/scm.c
index f4b9bc90d6a7..cfa808dd4897 100644
--- a/arch/arm/mach-msm/scm.c
+++ b/arch/arm/mach-msm/scm.c
@@ -174,15 +174,18 @@ static u32 smc(u32 cmd_addr)
174 register u32 r0 asm("r0") = 1; 174 register u32 r0 asm("r0") = 1;
175 register u32 r1 asm("r1") = (u32)&context_id; 175 register u32 r1 asm("r1") = (u32)&context_id;
176 register u32 r2 asm("r2") = cmd_addr; 176 register u32 r2 asm("r2") = cmd_addr;
177 asm( 177 do {
178 __asmeq("%0", "r0") 178 asm volatile(
179 __asmeq("%1", "r0") 179 __asmeq("%0", "r0")
180 __asmeq("%2", "r1") 180 __asmeq("%1", "r0")
181 __asmeq("%3", "r2") 181 __asmeq("%2", "r1")
182 "smc #0 @ switch to secure world\n" 182 __asmeq("%3", "r2")
183 : "=r" (r0) 183 "smc #0 @ switch to secure world\n"
184 : "r" (r0), "r" (r1), "r" (r2) 184 : "=r" (r0)
185 : "r3"); 185 : "r" (r0), "r" (r1), "r" (r2)
186 : "r3");
187 } while (r0 == SCM_INTERRUPTED);
188
186 return r0; 189 return r0;
187} 190}
188 191
@@ -197,13 +200,9 @@ static int __scm_call(const struct scm_command *cmd)
197 * side in the buffer. 200 * side in the buffer.
198 */ 201 */
199 flush_cache_all(); 202 flush_cache_all();
200 do { 203 ret = smc(cmd_addr);
201 ret = smc(cmd_addr); 204 if (ret < 0)
202 if (ret < 0) { 205 ret = scm_remap_error(ret);
203 ret = scm_remap_error(ret);
204 break;
205 }
206 } while (ret == SCM_INTERRUPTED);
207 206
208 return ret; 207 return ret;
209} 208}
@@ -264,21 +263,28 @@ u32 scm_get_version(void)
264{ 263{
265 int context_id; 264 int context_id;
266 static u32 version = -1; 265 static u32 version = -1;
267 register u32 r0 asm("r0") = 0x1 << 8; 266 register u32 r0 asm("r0");
268 register u32 r1 asm("r1") = (u32)&context_id; 267 register u32 r1 asm("r1");
269 268
270 if (version != -1) 269 if (version != -1)
271 return version; 270 return version;
272 271
273 mutex_lock(&scm_lock); 272 mutex_lock(&scm_lock);
274 asm( 273
275 __asmeq("%0", "r1") 274 r0 = 0x1 << 8;
276 __asmeq("%1", "r0") 275 r1 = (u32)&context_id;
277 __asmeq("%2", "r1") 276 do {
278 "smc #0 @ switch to secure world\n" 277 asm volatile(
279 : "=r" (r1) 278 __asmeq("%0", "r0")
280 : "r" (r0), "r" (r1) 279 __asmeq("%1", "r1")
281 : "r2", "r3"); 280 __asmeq("%2", "r0")
281 __asmeq("%3", "r1")
282 "smc #0 @ switch to secure world\n"
283 : "=r" (r0), "=r" (r1)
284 : "r" (r0), "r" (r1)
285 : "r2", "r3");
286 } while (r0 == SCM_INTERRUPTED);
287
282 version = r1; 288 version = r1;
283 mutex_unlock(&scm_lock); 289 mutex_unlock(&scm_lock);
284 290