diff --git a/drivers/soc/qcom/Kconfig b/drivers/soc/qcom/Kconfig index 1ce67325188b..39cb4b96deb7 100644 --- a/drivers/soc/qcom/Kconfig +++ b/drivers/soc/qcom/Kconfig @@ -543,4 +543,12 @@ config MSM_KERNEL_PROTECT_TEST read-only. This test is FATAL whether it passes or fails! Success is signaled by a stage-2 fault. +config MSM_CORE_CTL_HELPER + tristate "Core control helper functions for dynamically hotplug CPUs" + help + Provide helper functions for core control driver. Core control + driver dynamically hotplugs CPUs from kernel based on current + system load and state. It also supports limiting min and + max online CPUs from userspace. + source "drivers/soc/qcom/memshare/Kconfig" diff --git a/drivers/soc/qcom/Makefile b/drivers/soc/qcom/Makefile index 97e823d53244..d90a929bc95f 100644 --- a/drivers/soc/qcom/Makefile +++ b/drivers/soc/qcom/Makefile @@ -30,6 +30,7 @@ obj-$(CONFIG_MEM_SHARE_QMI_SERVICE) += memshare/ obj-$(CONFIG_MSM_PIL_SSR_GENERIC) += subsys-pil-tz.o obj-$(CONFIG_MSM_PIL_MSS_QDSP6V5) += pil-q6v5.o pil-msa.o pil-q6v5-mss.o obj-$(CONFIG_MSM_PIL) += peripheral-loader.o +obj-$(CONFIG_MSM_CORE_CTL_HELPER) += core_ctl_helper.o ifdef CONFIG_MSM_SUBSYSTEM_RESTART obj-y += subsystem_notif.o diff --git a/drivers/soc/qcom/core_ctl_helper.c b/drivers/soc/qcom/core_ctl_helper.c new file mode 100644 index 000000000000..3b25d9811cf7 --- /dev/null +++ b/drivers/soc/qcom/core_ctl_helper.c @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2014, 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 + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include +#include +#include +#include + +void core_ctl_block_hotplug(void) +{ + get_online_cpus(); +} +EXPORT_SYMBOL(core_ctl_block_hotplug); + +void core_ctl_unblock_hotplug(void) +{ + put_online_cpus(); +} +EXPORT_SYMBOL(core_ctl_unblock_hotplug); + +s64 core_ctl_get_time(void) +{ + return ktime_to_ms(ktime_get()); +} +EXPORT_SYMBOL(core_ctl_get_time); + +struct cpufreq_policy *core_ctl_get_policy(int cpu) +{ + return cpufreq_cpu_get(cpu); +} +EXPORT_SYMBOL(core_ctl_get_policy); + +void core_ctl_put_policy(struct cpufreq_policy *policy) +{ + cpufreq_cpu_put(policy); +} +EXPORT_SYMBOL(core_ctl_put_policy); + +struct device *core_ctl_find_cpu_device(unsigned cpu) +{ + return get_cpu_device(cpu); +} +EXPORT_SYMBOL(core_ctl_find_cpu_device); + +int __ref core_ctl_online_core(unsigned int cpu) +{ + return cpu_up(cpu); +} +EXPORT_SYMBOL(core_ctl_online_core); diff --git a/include/soc/qcom/core_ctl.h b/include/soc/qcom/core_ctl.h new file mode 100644 index 000000000000..01f55e53cd47 --- /dev/null +++ b/include/soc/qcom/core_ctl.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2014, 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 + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef __SOC_QCOM_CORE_CTL_H +#define __SOC_QCOM_CORE_CTL_H + +extern void core_ctl_block_hotplug(void); +extern void core_ctl_unblock_hotplug(void); +extern s64 core_ctl_get_time(void); +extern struct cpufreq_policy *core_ctl_get_policy(int cpu); +extern void core_ctl_put_policy(struct cpufreq_policy *policy); +extern struct device *core_ctl_find_cpu_device(unsigned cpu); +extern int core_ctl_online_core(unsigned int cpu); + +#endif