summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorImran Khan <kimran@codeaurora.org>2017-01-10 17:31:53 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2017-03-27 03:09:05 -0700
commit93466ced5daf3b7c35092f7a24b50b17cb1ff75e (patch)
treed9fefe5c90840f9d0c2e437ef95fe6eeede63026
parent9d7f377c60108b2bec037de6dc3bc3d195bb66b2 (diff)
arm64: Modify support for 32bit app specific settings
Change support for 32bit app specific settings. The change made earlier was not correct for 8996pro devices so correct it to include all variants of 8996. Change-Id: Id6afad04ad316dd7a41743821b7cfd513db227e5 Signed-off-by: Imran Khan <kimran@codeaurora.org> Signed-off-by: Zhiqiang Tu <ztu@codeaurora.org>
-rw-r--r--arch/arm64/include/asm/app_api.h3
-rw-r--r--arch/arm64/kernel/app_api.c53
-rw-r--r--arch/arm64/kernel/app_setting.c6
-rw-r--r--kernel/sched/core.c2
4 files changed, 47 insertions, 17 deletions
diff --git a/arch/arm64/include/asm/app_api.h b/arch/arm64/include/asm/app_api.h
index 7032d636dab6..0e6a469cd683 100644
--- a/arch/arm64/include/asm/app_api.h
+++ b/arch/arm64/include/asm/app_api.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2016-2017, 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
@@ -44,6 +44,7 @@ extern void switch_32bit_app_setting_bit(struct task_struct *prev,
extern void apply_app_setting_bit(struct file *file);
extern bool use_app_setting;
extern bool use_32bit_app_setting;
+extern bool use_32bit_app_setting_pro;
#endif
#endif
diff --git a/arch/arm64/kernel/app_api.c b/arch/arm64/kernel/app_api.c
index 1b3732accd4b..e995bbf3c7b4 100644
--- a/arch/arm64/kernel/app_api.c
+++ b/arch/arm64/kernel/app_api.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2016-2017, 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
@@ -74,13 +74,24 @@ void set_app_setting_bit_for_32bit_apps(void)
uint64_t reg;
spin_lock_irqsave(&spinlock_32bit_app, flags);
- asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg));
- reg = reg | BIT(18);
- reg = reg & ~BIT(2);
- reg = reg | 0x3;
- isb();
- asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg));
- isb();
+ if (use_32bit_app_setting) {
+ asm volatile("mrs %0, S3_0_c15_c15_0 " : "=r" (reg));
+ reg = reg | BIT(24);
+ isb();
+ asm volatile("msr S3_0_c15_c15_0, %0" : : "r" (reg));
+ isb();
+ asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg));
+ reg = reg | BIT(18) | BIT(2) | BIT(0);
+ isb();
+ asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg));
+ isb();
+ } else if (use_32bit_app_setting_pro) {
+ asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg));
+ reg = reg | BIT(18);
+ isb();
+ asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg));
+ isb();
+ }
spin_unlock_irqrestore(&spinlock_32bit_app, flags);
}
EXPORT_SYMBOL(set_app_setting_bit_for_32bit_apps);
@@ -91,12 +102,26 @@ void clear_app_setting_bit_for_32bit_apps(void)
uint64_t reg;
spin_lock_irqsave(&spinlock_32bit_app, flags);
- asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg));
- reg = reg & ~BIT(18);
- reg = reg & ~0x3;
- isb();
- asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg));
- isb();
+ if (use_32bit_app_setting) {
+ asm volatile("mrs %0, S3_0_c15_c15_0 " : "=r" (reg));
+ reg = reg & ~BIT(24);
+ isb();
+ asm volatile("msr S3_0_c15_c15_0, %0" : : "r" (reg));
+ isb();
+ asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg));
+ reg = reg & ~BIT(18);
+ reg = reg & ~BIT(2);
+ reg = reg & ~BIT(0);
+ isb();
+ asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg));
+ isb();
+ } else if (use_32bit_app_setting_pro) {
+ asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg));
+ reg = reg & ~BIT(18);
+ isb();
+ asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg));
+ isb();
+ }
spin_unlock_irqrestore(&spinlock_32bit_app, flags);
}
EXPORT_SYMBOL(clear_app_setting_bit_for_32bit_apps);
diff --git a/arch/arm64/kernel/app_setting.c b/arch/arm64/kernel/app_setting.c
index 8e7aeab39edd..0c6b00317645 100644
--- a/arch/arm64/kernel/app_setting.c
+++ b/arch/arm64/kernel/app_setting.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2016-2017, 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
@@ -39,6 +39,10 @@ bool use_32bit_app_setting = true;
module_param(use_32bit_app_setting, bool, 0644);
MODULE_PARM_DESC(use_32bit_app_setting, "control use of 32 bit app specific settings");
+bool use_32bit_app_setting_pro;
+module_param(use_32bit_app_setting_pro, bool, 0644);
+MODULE_PARM_DESC(use_32bit_app_setting_pro, "control use of 32 bit app specific settings");
+
static int set_name(const char *str, struct kernel_param *kp)
{
int len = strlen(str);
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index d6e7a1d7168d..1803feb0006c 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -2730,7 +2730,7 @@ prepare_task_switch(struct rq *rq, struct task_struct *prev,
if (use_app_setting)
switch_app_setting_bit(prev, next);
- if (use_32bit_app_setting)
+ if (use_32bit_app_setting || use_32bit_app_setting_pro)
switch_32bit_app_setting_bit(prev, next);
#endif
}