diff options
author | Imran Khan <kimran@codeaurora.org> | 2017-01-10 17:31:53 +0530 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-03-27 03:09:05 -0700 |
commit | 93466ced5daf3b7c35092f7a24b50b17cb1ff75e (patch) | |
tree | d9fefe5c90840f9d0c2e437ef95fe6eeede63026 | |
parent | 9d7f377c60108b2bec037de6dc3bc3d195bb66b2 (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.h | 3 | ||||
-rw-r--r-- | arch/arm64/kernel/app_api.c | 53 | ||||
-rw-r--r-- | arch/arm64/kernel/app_setting.c | 6 | ||||
-rw-r--r-- | kernel/sched/core.c | 2 |
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 } |