All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/5] cpufreq:boost: CPU Boost mode support
@ 2013-06-06  7:07 Lukasz Majewski
  2013-06-06  7:07 ` [PATCH 1/5] cpufreq: Define cpufreq_set_drv_attr_files() to add per CPU sysfs attributes Lukasz Majewski
                   ` (17 more replies)
  0 siblings, 18 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-06  7:07 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocky
  Cc: cpufreq, Linux PM list, Vincent Guittot, Lukasz Majewski,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano

This patch series introduces support for CPU overclocking technique 
called Boost. 

It is a follow up of a LAB governor proposal. Boost is a LAB component:
http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq

Boost unifies hardware based solution (e.g. Intel Nehalem) with
software oriented one (like the one done at Exynos).
For this reason cpufreq/freq_table code has been reorganized to exclude
common code.

Important design decisions:

- Boost related code is compiled-in unconditionally. I wanted to avoid
situation when a lot of #ifdef CONFIG_CPU_FREQ_BOOST are scattered at
cpufreq code (especially cpufreq.c large file)

- Only one cpufreq_boost instance is created at cpufreq driver file. 

- Boost can manage overclocking when many policies are istalled in
the system (this is a preparation for b.L)

- Boost sysfs attributies are seen only when cpufreq driver supports them.
They will not show up until either CONFIG_CPU_FREQ_BOOST or device tree
cpufreq "boost_mode" attribute is defined.

- No special spin_lock for Boost was created. The one from cpufreq was
reused.

- Low level boost trigger function (*low_level_boost function callback) is
necessary to "glue" together acpi-cpufreq boost with software based one.



Tested at: HW: Exynos 4412 3.10 linux
	   Compile tested x86_64 defconfig (acpi) - help with HW test 
		needed

Lukasz Majewski (5):
  cpufreq: Define cpufreq_set_drv_attr_files() to add per CPU sysfs
    attributes
  cpufreq:boost: Add support for software based CPU frequency boost
  cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common
    boost solution
  cpufreq:exynos:Extend exynos cpufreq driver to support boost
  cpufreq:boost:Kconfig: Enable boost support at Kconfig

 drivers/cpufreq/Kconfig          |    7 ++
 drivers/cpufreq/acpi-cpufreq.c   |   64 ++++++--------
 drivers/cpufreq/cpufreq.c        |  175 ++++++++++++++++++++++++++++++++++++--
 drivers/cpufreq/exynos-cpufreq.c |   48 +++++++++++
 drivers/cpufreq/freq_table.c     |   87 ++++++++++++++++++-
 include/linux/cpufreq.h          |   35 +++++++-
 6 files changed, 369 insertions(+), 47 deletions(-)

-- 
1.7.10.4


^ permalink raw reply	[flat|nested] 329+ messages in thread

* [PATCH 1/5] cpufreq: Define cpufreq_set_drv_attr_files() to add per CPU sysfs attributes
  2013-06-06  7:07 [PATCH 0/5] cpufreq:boost: CPU Boost mode support Lukasz Majewski
@ 2013-06-06  7:07 ` Lukasz Majewski
  2013-06-06  8:27   ` Viresh Kumar
  2013-06-06  7:07 ` [PATCH 2/5] cpufreq:boost: Add support for software based CPU frequency boost Lukasz Majewski
                   ` (16 subsequent siblings)
  17 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-06  7:07 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocky
  Cc: cpufreq, Linux PM list, Vincent Guittot, Lukasz Majewski,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano

The cpufreq_set_drv_attr_files() function creates sysfs file entry for
each available CPU. With it in place it is possible to add different
set of attributes without code duplication.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
---
 drivers/cpufreq/cpufreq.c |   23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 1b8a48e..ca74e27 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -730,12 +730,23 @@ static int cpufreq_add_dev_symlink(unsigned int cpu,
 	return ret;
 }
 
+static int cpufreq_set_drv_attr_files(struct cpufreq_policy *policy,
+				      struct freq_attr **drv_attr)
+{
+	while ((drv_attr) && (*drv_attr)) {
+		if (sysfs_create_file(&policy->kobj, &((*drv_attr)->attr)))
+			return 1;
+		drv_attr++;
+	}
+
+	return 0;
+}
+
 static int cpufreq_add_dev_interface(unsigned int cpu,
 				     struct cpufreq_policy *policy,
 				     struct device *dev)
 {
 	struct cpufreq_policy new_policy;
-	struct freq_attr **drv_attr;
 	unsigned long flags;
 	int ret = 0;
 	unsigned int j;
@@ -747,13 +758,9 @@ static int cpufreq_add_dev_interface(unsigned int cpu,
 		return ret;
 
 	/* set up files for this cpu device */
-	drv_attr = cpufreq_driver->attr;
-	while ((drv_attr) && (*drv_attr)) {
-		ret = sysfs_create_file(&policy->kobj, &((*drv_attr)->attr));
-		if (ret)
-			goto err_out_kobj_put;
-		drv_attr++;
-	}
+	if (cpufreq_set_drv_attr_files(policy, cpufreq_driver->attr))
+		goto err_out_kobj_put;
+
 	if (cpufreq_driver->get) {
 		ret = sysfs_create_file(&policy->kobj, &cpuinfo_cur_freq.attr);
 		if (ret)
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH 2/5] cpufreq:boost: Add support for software based CPU frequency boost
  2013-06-06  7:07 [PATCH 0/5] cpufreq:boost: CPU Boost mode support Lukasz Majewski
  2013-06-06  7:07 ` [PATCH 1/5] cpufreq: Define cpufreq_set_drv_attr_files() to add per CPU sysfs attributes Lukasz Majewski
@ 2013-06-06  7:07 ` Lukasz Majewski
  2013-06-06 10:53   ` Viresh Kumar
  2013-06-06  7:07 ` [PATCH 3/5] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
                   ` (15 subsequent siblings)
  17 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-06  7:07 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocky
  Cc: cpufreq, Linux PM list, Vincent Guittot, Lukasz Majewski,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano

This commit adds support for software based frequency boosting.
Exynos4 SoCs (e.g. 4x12) allow setting of frequency above its normal
condition limits. This can be done for some short time.

Overclocking (boost) support came from cpufreq driver (which is platform
dependent). Hence the data structure describing it is defined at its file.

To allow support for either SW and HW (Intel) based boosting, the cpufreq
core code has been extended to support both solutions.

The main boost switch has been put at /sys/devices/system/cpu/cpufreq/boost.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
---
 drivers/cpufreq/cpufreq.c    |  156 ++++++++++++++++++++++++++++++++++++++++++
 drivers/cpufreq/freq_table.c |   87 ++++++++++++++++++++++-
 include/linux/cpufreq.h      |   35 +++++++++-
 3 files changed, 275 insertions(+), 3 deletions(-)

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index ca74e27..8cf9a92 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -133,6 +133,11 @@ bool have_governor_per_policy(void)
 	return cpufreq_driver->have_governor_per_policy;
 }
 
+/**
+ * Global definition of cpufreq_boost structure
+ */
+struct cpufreq_boost *cpufreq_boost;
+
 static struct cpufreq_policy *__cpufreq_cpu_get(unsigned int cpu, bool sysfs)
 {
 	struct cpufreq_policy *data;
@@ -315,6 +320,45 @@ EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
 /*********************************************************************
  *                          SYSFS INTERFACE                          *
  *********************************************************************/
+ssize_t show_boost_status(struct kobject *kobj,
+				 struct attribute *attr, char *buf)
+{
+	struct cpufreq_boost *boost = cpufreq_boost;
+
+	if (!boost)
+		return -ENODEV;
+
+	return sprintf(buf, "%d\n", boost->status);
+}
+
+static ssize_t store_boost_status(struct kobject *kobj, struct attribute *attr,
+				  const char *buf, size_t count)
+{
+	struct cpufreq_boost *boost = cpufreq_boost;
+	struct cpufreq_policy *p;
+	int ret, enable;
+
+	if (!boost)
+		return -ENODEV;
+
+	ret = sscanf(buf, "%d", &enable);
+	if (ret != 1 || enable < 0 || enable > 1)
+		return -EINVAL;
+
+	/* Adjust all policies to support boost */
+	list_for_each_entry(p, &boost->policies, boost_list)
+		if (cpufreq_boost_trigger_state(p, enable)) {
+			pr_err("Cannot %sable boost (policy 0x%p)!\n",
+			       enable ? "en" : "dis", p);
+			return -EINVAL;
+		}
+
+	return count;
+}
+
+static struct global_attr global_boost = __ATTR(boost, 0644,
+						show_boost_status,
+						store_boost_status);
 
 static struct cpufreq_governor *__find_governor(const char *str_governor)
 {
@@ -761,6 +805,18 @@ static int cpufreq_add_dev_interface(unsigned int cpu,
 	if (cpufreq_set_drv_attr_files(policy, cpufreq_driver->attr))
 		goto err_out_kobj_put;
 
+	if (cpufreq_driver->boost) {
+		if (sysfs_create_file(cpufreq_global_kobject,
+				      &(global_boost.attr)))
+			pr_warn("could not register global boost sysfs file\n");
+		else
+			pr_debug("registered global boost sysfs file\n");
+
+		if (cpufreq_set_drv_attr_files(policy,
+					       cpufreq_driver->boost->attr))
+			goto err_out_kobj_put;
+	}
+
 	if (cpufreq_driver->get) {
 		ret = sysfs_create_file(&policy->kobj, &cpuinfo_cur_freq.attr);
 		if (ret)
@@ -923,6 +979,8 @@ static int cpufreq_add_dev(struct device *dev, struct subsys_interface *sif)
 	init_completion(&policy->kobj_unregister);
 	INIT_WORK(&policy->update, handle_update);
 
+	cpufreq_boost_init(policy);
+
 	/* call driver. From then on the cpufreq must be able
 	 * to accept all calls to ->verify and ->setpolicy for this CPU
 	 */
@@ -1860,6 +1918,100 @@ static struct notifier_block __refdata cpufreq_cpu_notifier = {
 };
 
 /*********************************************************************
+ *               BOOST						     *
+ *********************************************************************/
+int cpufreq_boost_trigger_state(struct cpufreq_policy *policy, int state)
+{
+	struct cpufreq_boost *boost;
+	unsigned long flags;
+	int ret = 0;
+
+	if (!policy || !policy->boost || !policy->boost->low_level_boost)
+		return -ENODEV;
+
+	boost = policy->boost;
+	write_lock_irqsave(&cpufreq_driver_lock, flags);
+
+	if (boost->status != state) {
+		policy->boost->status = state;
+		ret = boost->low_level_boost(policy, state);
+		if (ret) {
+			pr_err("BOOST cannot %sable low level code (%d)\n",
+			       state ? "en" : "dis", ret);
+			return ret;
+		}
+	}
+
+	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
+
+	pr_debug("cpufreq BOOST %sabled\n", state ? "en" : "dis");
+
+	return 0;
+}
+
+/**
+ * cpufreq_boost_notifier - notifier callback for cpufreq policy change.
+ *  <at> nb:	struct notifier_block * with callback info.
+ *  <at> event: value showing cpufreq event for which this function invoked.
+ *  <at> data: callback-specific data
+ */
+static int cpufreq_boost_notifier(struct notifier_block *nb,
+				  unsigned long event, void *data)
+{
+	struct cpufreq_policy *policy = data;
+
+	if (event == CPUFREQ_INCOMPATIBLE) {
+		if (!policy || !policy->boost)
+			return -ENODEV;
+
+		if (policy->boost->status == CPUFREQ_BOOST_EN) {
+			pr_info("NOTIFIER BOOST: MAX: %d e:%lu cpu: %d\n",
+				policy->max, event, policy->cpu);
+			cpufreq_boost_trigger_state(policy, 0);
+		}
+	}
+
+	return 0;
+}
+
+/* Notifier for cpufreq policy change */
+static struct notifier_block cpufreq_boost_notifier_block = {
+	.notifier_call = cpufreq_boost_notifier,
+};
+
+int cpufreq_boost_init(struct cpufreq_policy *policy)
+{
+	int ret = 0;
+
+	if (!policy)
+		return -EINVAL;
+
+	if (!cpufreq_driver->boost) {
+		pr_err("Boost mode not supported on this device\n");
+		return -ENODEV;
+	}
+
+	policy->boost = cpufreq_boost = cpufreq_driver->boost;
+
+	/* disable boost for newly created policy - as we e.g. change
+	   governor */
+	policy->boost->status = CPUFREQ_BOOST_DIS;
+
+	/* register policy notifier */
+	ret = cpufreq_register_notifier(&cpufreq_boost_notifier_block,
+					CPUFREQ_POLICY_NOTIFIER);
+	if (ret) {
+		pr_err("CPUFREQ BOOST notifier not registered.\n");
+		return ret;
+	}
+	/* add policy to policies list headed at struct cpufreq_boost */
+	list_add_tail(&policy->boost_list, &cpufreq_boost->policies);
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(cpufreq_boost_init);
+
+/*********************************************************************
  *               REGISTER / UNREGISTER CPUFREQ DRIVER                *
  *********************************************************************/
 
@@ -1954,6 +2106,10 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
 	pr_debug("unregistering driver %s\n", driver->name);
 
 	subsys_interface_unregister(&cpufreq_interface);
+
+	if (cpufreq_driver->boost)
+		sysfs_remove_file(cpufreq_global_kobject, &(global_boost.attr));
+
 	unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
 
 	write_lock_irqsave(&cpufreq_driver_lock, flags);
diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c
index d7a7966..0e95524 100644
--- a/drivers/cpufreq/freq_table.c
+++ b/drivers/cpufreq/freq_table.c
@@ -3,6 +3,8 @@
  *
  * Copyright (C) 2002 - 2003 Dominik Brodowski
  *
+ * Copyright (C) 2013 Lukasz Majewski <l.majewski@samsung.com>
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
@@ -20,6 +22,36 @@
  *                     FREQUENCY TABLE HELPERS                       *
  *********************************************************************/
 
+/*********************************************************************
+ *                     BOOST FREQ HELPERS                            *
+ *********************************************************************/
+static int cpufreq_frequency_table_skip_boost(struct cpufreq_policy *policy,
+					      unsigned int index)
+{
+	if (index == CPUFREQ_BOOST)
+		if (!policy->boost ||
+		    policy->boost->status == CPUFREQ_BOOST_DIS)
+			return 1;
+
+	return 0;
+}
+
+unsigned int
+cpufreq_frequency_table_boost_max(struct cpufreq_frequency_table *freq_table)
+{
+	int index, boost_freq_max;
+
+	for (index = 0, boost_freq_max = 0;
+		freq_table[index].frequency != CPUFREQ_TABLE_END; index++)
+		if (freq_table[index].index == CPUFREQ_BOOST) {
+			if (freq_table[index].frequency > boost_freq_max)
+				boost_freq_max = freq_table[index].frequency;
+		}
+
+	return boost_freq_max;
+}
+EXPORT_SYMBOL_GPL(cpufreq_frequency_table_boost_max);
+
 int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
 				    struct cpufreq_frequency_table *table)
 {
@@ -34,6 +66,10 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
 
 			continue;
 		}
+		if (cpufreq_frequency_table_skip_boost(policy,
+						       table[i].index))
+			continue;
+
 		pr_debug("table entry %u: %u kHz, %u index\n",
 					i, freq, table[i].index);
 		if (freq < min_freq)
@@ -70,6 +106,9 @@ int cpufreq_frequency_table_verify(struct cpufreq_policy *policy,
 		unsigned int freq = table[i].frequency;
 		if (freq == CPUFREQ_ENTRY_INVALID)
 			continue;
+		if (cpufreq_frequency_table_skip_boost(policy,
+						       table[i].index))
+			continue;
 		if ((freq >= policy->min) && (freq <= policy->max))
 			count++;
 		else if ((next_larger > freq) && (freq > policy->max))
@@ -122,6 +161,9 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
 		unsigned int freq = table[i].frequency;
 		if (freq == CPUFREQ_ENTRY_INVALID)
 			continue;
+		if (cpufreq_frequency_table_skip_boost(policy,
+						       table[i].index))
+			continue;
 		if ((freq < policy->min) || (freq > policy->max))
 			continue;
 		switch (relation) {
@@ -167,11 +209,15 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
 }
 EXPORT_SYMBOL_GPL(cpufreq_frequency_table_target);
 
+#define CPUFREQ_SHOW_NORMAL 0
+#define CPUFREQ_SHOW_BOOST  1
+
 static DEFINE_PER_CPU(struct cpufreq_frequency_table *, cpufreq_show_table);
 /**
  * show_available_freqs - show available frequencies for the specified CPU
  */
-static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
+static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf,
+				    int show_boost)
 {
 	unsigned int i = 0;
 	unsigned int cpu = policy->cpu;
@@ -186,22 +232,59 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
 	for (i = 0; (table[i].frequency != CPUFREQ_TABLE_END); i++) {
 		if (table[i].frequency == CPUFREQ_ENTRY_INVALID)
 			continue;
+
+		if (show_boost) {
+			if (table[i].index != CPUFREQ_BOOST)
+				continue;
+		} else {
+			if (cpufreq_frequency_table_skip_boost(policy,
+							       table[i].index))
+				continue;
+		}
+
 		count += sprintf(&buf[count], "%d ", table[i].frequency);
 	}
 	count += sprintf(&buf[count], "\n");
 
 	return count;
+}
 
+/**
+ * show_available_normal_freqs - show normal boost frequencies for
+ * the specified CPU
+ */
+static ssize_t show_available_normal_freqs(struct cpufreq_policy *policy,
+					  char *buf)
+{
+	return show_available_freqs(policy, buf, CPUFREQ_SHOW_NORMAL);
 }
 
 struct freq_attr cpufreq_freq_attr_scaling_available_freqs = {
 	.attr = { .name = "scaling_available_frequencies",
 		  .mode = 0444,
 		},
-	.show = show_available_freqs,
+	.show = show_available_normal_freqs,
 };
 EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_available_freqs);
 
+/**
+ * show_available_boost_freqs - show available boost frequencies for
+ * the specified CPU
+ */
+static ssize_t show_available_boost_freqs(struct cpufreq_policy *policy,
+					  char *buf)
+{
+	return show_available_freqs(policy, buf, CPUFREQ_SHOW_BOOST);
+}
+
+struct freq_attr cpufreq_freq_attr_boost_available_freqs = {
+	.attr = { .name = "scaling_boost_frequencies",
+		  .mode = 0444,
+		},
+	.show = show_available_boost_freqs,
+};
+EXPORT_SYMBOL_GPL(cpufreq_freq_attr_boost_available_freqs);
+
 /*
  * if you use these, you must assure that the frequency table is valid
  * all the time between get_attr and put_attr!
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index 037d36a..1294c8c 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -88,6 +88,25 @@ struct cpufreq_real_policy {
 	struct cpufreq_governor	*governor; /* see below */
 };
 
+#define CPUFREQ_BOOST_DIS            (0)
+#define CPUFREQ_BOOST_EN             (1)
+
+struct cpufreq_policy;
+struct cpufreq_boost {
+	unsigned int            max_boost_freq; /* maximum value of
+						 * boosted freq */
+	unsigned int            max_normal_freq; /* non boost max freq */
+	int                     status; /* status of boost */
+
+	/* boost sysfs attributies */
+	struct freq_attr	**attr;
+
+	/* low-level trigger for boost */
+	int (*low_level_boost) (struct cpufreq_policy *policy, int state);
+
+	struct list_head        policies;
+};
+
 struct cpufreq_policy {
 	/* CPUs sharing clock, require sw coordination */
 	cpumask_var_t		cpus;	/* Online CPUs only */
@@ -113,6 +132,9 @@ struct cpufreq_policy {
 
 	struct cpufreq_real_policy	user_policy;
 
+	struct cpufreq_boost    *boost;
+	struct list_head        boost_list;
+
 	struct kobject		kobj;
 	struct completion	kobj_unregister;
 };
@@ -262,6 +284,9 @@ struct cpufreq_driver {
 	int	(*suspend)	(struct cpufreq_policy *policy);
 	int	(*resume)	(struct cpufreq_policy *policy);
 	struct freq_attr	**attr;
+
+	/* platform specific boost support code */
+	struct cpufreq_boost	*boost;
 };
 
 /* flags */
@@ -277,7 +302,6 @@ struct cpufreq_driver {
 int cpufreq_register_driver(struct cpufreq_driver *driver_data);
 int cpufreq_unregister_driver(struct cpufreq_driver *driver_data);
 
-
 void cpufreq_notify_transition(struct cpufreq_policy *policy,
 		struct cpufreq_freqs *freqs, unsigned int state);
 
@@ -403,6 +427,9 @@ extern struct cpufreq_governor cpufreq_gov_conservative;
 #define CPUFREQ_ENTRY_INVALID ~0
 #define CPUFREQ_TABLE_END     ~1
 
+/* Define index for boost frequency */
+#define CPUFREQ_BOOST         ~2
+
 struct cpufreq_frequency_table {
 	unsigned int	index;     /* any */
 	unsigned int	frequency; /* kHz - doesn't need to be in ascending
@@ -421,11 +448,17 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
 				   unsigned int relation,
 				   unsigned int *index);
 
+unsigned int
+cpufreq_frequency_table_boost_max(struct cpufreq_frequency_table *freq_table);
+int cpufreq_boost_init(struct cpufreq_policy *policy);
+
 /* the following 3 funtions are for cpufreq core use only */
 struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu);
+int cpufreq_boost_trigger_state(struct cpufreq_policy *policy, int state);
 
 /* the following are really really optional */
 extern struct freq_attr cpufreq_freq_attr_scaling_available_freqs;
+extern struct freq_attr cpufreq_freq_attr_boost_available_freqs;
 
 void cpufreq_frequency_table_get_attr(struct cpufreq_frequency_table *table,
 				      unsigned int cpu);
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH 3/5] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution
  2013-06-06  7:07 [PATCH 0/5] cpufreq:boost: CPU Boost mode support Lukasz Majewski
  2013-06-06  7:07 ` [PATCH 1/5] cpufreq: Define cpufreq_set_drv_attr_files() to add per CPU sysfs attributes Lukasz Majewski
  2013-06-06  7:07 ` [PATCH 2/5] cpufreq:boost: Add support for software based CPU frequency boost Lukasz Majewski
@ 2013-06-06  7:07 ` Lukasz Majewski
  2013-06-06  7:07 ` [PATCH 4/5] cpufreq:exynos:Extend exynos cpufreq driver to support boost Lukasz Majewski
                   ` (14 subsequent siblings)
  17 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-06  7:07 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocky
  Cc: cpufreq, Linux PM list, Vincent Guittot, Lukasz Majewski,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano

The Intel's HW based boost solution needs to cooperate with common cpufreq
boost.

For this reason the sysfs handling code (/sys/devices/system/cpu/cpufreq/boost)
has been moved to a core cpufreq.c code.

The _store_boost() function has been redesigned to be used as low_level_boost
callback.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
---
 drivers/cpufreq/acpi-cpufreq.c |   64 ++++++++++++++++------------------------
 1 file changed, 26 insertions(+), 38 deletions(-)

diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c
index 11b8b4b..2c95540 100644
--- a/drivers/cpufreq/acpi-cpufreq.c
+++ b/drivers/cpufreq/acpi-cpufreq.c
@@ -133,20 +133,10 @@ static void boost_set_msrs(bool enable, const struct cpumask *cpumask)
 	wrmsr_on_cpus(cpumask, msr_addr, msrs);
 }
 
-static ssize_t _store_boost(const char *buf, size_t count)
+static int _store_boost(struct cpufreq_policy *policy, int val)
 {
-	int ret;
-	unsigned long val = 0;
-
-	if (!boost_supported)
-		return -EINVAL;
-
-	ret = kstrtoul(buf, 10, &val);
-	if (ret || (val > 1))
-		return -EINVAL;
-
 	if ((val && boost_enabled) || (!val && !boost_enabled))
-		return count;
+		return 0;
 
 	get_online_cpus();
 
@@ -157,30 +147,31 @@ static ssize_t _store_boost(const char *buf, size_t count)
 	boost_enabled = val;
 	pr_debug("Core Boosting %sabled.\n", val ? "en" : "dis");
 
-	return count;
+	return 0;
 }
 
-static ssize_t store_global_boost(struct kobject *kobj, struct attribute *attr,
-				  const char *buf, size_t count)
+static ssize_t store_boost(const char *buf, size_t count)
 {
-	return _store_boost(buf, count);
-}
+	int ret;
+	unsigned long val = 0;
 
-static ssize_t show_global_boost(struct kobject *kobj,
-				 struct attribute *attr, char *buf)
-{
-	return sprintf(buf, "%u\n", boost_enabled);
-}
+	if (!boost_supported)
+		return -EINVAL;
 
-static struct global_attr global_boost = __ATTR(boost, 0644,
-						show_global_boost,
-						store_global_boost);
+	ret = kstrtoul(buf, 10, &val);
+	if (ret || (val > 1))
+		return -EINVAL;
+
+	_store_boost(NULL, (int) val);
+
+	return count;
+}
 
 #ifdef CONFIG_X86_ACPI_CPUFREQ_CPB
 static ssize_t store_cpb(struct cpufreq_policy *policy, const char *buf,
 			 size_t count)
 {
-	return _store_boost(buf, count);
+	return store_boost(buf, count);
 }
 
 static ssize_t show_cpb(struct cpufreq_policy *policy, char *buf)
@@ -910,6 +901,11 @@ static struct freq_attr *acpi_cpufreq_attr[] = {
 	NULL,
 };
 
+static struct cpufreq_boost acpi_boost = {
+	.low_level_boost        = _store_boost,
+	.policies               = LIST_HEAD_INIT(acpi_boost.policies),
+};
+
 static struct cpufreq_driver acpi_cpufreq_driver = {
 	.verify		= acpi_cpufreq_verify,
 	.target		= acpi_cpufreq_target,
@@ -920,6 +916,9 @@ static struct cpufreq_driver acpi_cpufreq_driver = {
 	.name		= "acpi-cpufreq",
 	.owner		= THIS_MODULE,
 	.attr		= acpi_cpufreq_attr,
+#ifdef CONFIG_CPU_FREQ_BOOST
+	.boost		= &acpi_boost,
+#endif
 };
 
 static void __init acpi_cpufreq_boost_init(void)
@@ -941,22 +940,11 @@ static void __init acpi_cpufreq_boost_init(void)
 		register_cpu_notifier(&boost_nb);
 
 		put_online_cpus();
-	} else
-		global_boost.attr.mode = 0444;
-
-	/* We create the boost file in any case, though for systems without
-	 * hardware support it will be read-only and hardwired to return 0.
-	 */
-	if (sysfs_create_file(cpufreq_global_kobject, &(global_boost.attr)))
-		pr_warn(PFX "could not register global boost sysfs file\n");
-	else
-		pr_debug("registered global boost sysfs file\n");
+	}
 }
 
 static void __exit acpi_cpufreq_boost_exit(void)
 {
-	sysfs_remove_file(cpufreq_global_kobject, &(global_boost.attr));
-
 	if (msrs) {
 		unregister_cpu_notifier(&boost_nb);
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH 4/5] cpufreq:exynos:Extend exynos cpufreq driver to support boost
  2013-06-06  7:07 [PATCH 0/5] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                   ` (2 preceding siblings ...)
  2013-06-06  7:07 ` [PATCH 3/5] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
@ 2013-06-06  7:07 ` Lukasz Majewski
  2013-06-06  7:07 ` [PATCH 5/5] cpufreq:boost:Kconfig: Enable boost support at Kconfig Lukasz Majewski
                   ` (13 subsequent siblings)
  17 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-06  7:07 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocky
  Cc: cpufreq, Linux PM list, Vincent Guittot, Lukasz Majewski,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano

New structure - exynos_boost has been created to embrace the information
related to boost support.

The CONFIG_CPU_FREQ_BOOST flag is responsible for attaching the boost structure
to the cpufreq driver.
Setting exynos cpufreq driver .boost field to NULL, indicates that boost is
not supported.
Moreover device tree attribute "boost_mode" defines if exynos platform
support frequency overclocking (boost).

Moreover new attribute structure describing extra CPU features supported when boost
is enabled is also provided.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
---
 drivers/cpufreq/exynos-cpufreq.c |   48 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)

diff --git a/drivers/cpufreq/exynos-cpufreq.c b/drivers/cpufreq/exynos-cpufreq.c
index 3197d88..0b6fdf6 100644
--- a/drivers/cpufreq/exynos-cpufreq.c
+++ b/drivers/cpufreq/exynos-cpufreq.c
@@ -267,6 +267,38 @@ static struct freq_attr *exynos_cpufreq_attr[] = {
 	NULL,
 };
 
+/* per CPU boost attributes to be exported to sysfs */
+static struct freq_attr *exynos_cpufreq_boost_attr[] = {
+	&cpufreq_freq_attr_boost_available_freqs,
+	NULL,
+};
+
+/* low level code to enable/disable boost */
+static int
+exynos_cpufreq_boost_trigger(struct cpufreq_policy *policy, int state)
+{
+
+	if (!policy || !policy->boost)
+		return -ENODEV;
+
+	if (state) {
+		policy->boost->max_normal_freq = policy->max;
+		policy->max = policy->boost->max_boost_freq;
+		policy->cpuinfo.max_freq = policy->max;
+	} else {
+		policy->max = policy->boost->max_normal_freq;
+		policy->cpuinfo.max_freq = policy->max;
+	}
+
+	return 0;
+}
+
+static struct cpufreq_boost exynos_boost = {
+	.attr                   = exynos_cpufreq_boost_attr,
+	.low_level_boost        = exynos_cpufreq_boost_trigger,
+	.policies               = LIST_HEAD_INIT(exynos_boost.policies),
+};
+
 static struct cpufreq_driver exynos_driver = {
 	.flags		= CPUFREQ_STICKY,
 	.verify		= exynos_verify_speed,
@@ -276,6 +308,9 @@ static struct cpufreq_driver exynos_driver = {
 	.exit		= exynos_cpufreq_cpu_exit,
 	.name		= "exynos_cpufreq",
 	.attr		= exynos_cpufreq_attr,
+#ifdef CONFIG_CPU_FREQ_BOOST
+	.boost		= &exynos_boost,
+#endif
 #ifdef CONFIG_PM
 	.suspend	= exynos_cpufreq_suspend,
 	.resume		= exynos_cpufreq_resume,
@@ -359,6 +394,8 @@ static struct of_device_id exynos_cpufreq_of_match[] __initconst = {
 
 static int __init exynos_cpufreq_probe(struct platform_device *pdev)
 {
+	struct device_node *node = pdev->dev.of_node;
+
 	int ret = -EINVAL;
 
 	exynos_info = kzalloc(sizeof(struct exynos_dvfs_info), GFP_KERNEL);
@@ -390,6 +427,17 @@ static int __init exynos_cpufreq_probe(struct platform_device *pdev)
 		goto err_vdd_arm;
 	}
 
+	/* If boost_mode property not available - then NULL out the boost
+	   pointer to indicate thst boost is not supported*/
+	if (exynos_driver.boost) {
+		if (of_property_read_bool(node, "boost_mode"))
+			exynos_boost.max_boost_freq =
+				cpufreq_frequency_table_boost_max(
+						 exynos_info->freq_table);
+		else
+			exynos_driver.boost = NULL;
+	}
+
 	locking_frequency = exynos_getspeed(0);
 
 	register_pm_notifier(&exynos_cpufreq_nb);
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH 5/5] cpufreq:boost:Kconfig: Enable boost support at Kconfig
  2013-06-06  7:07 [PATCH 0/5] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                   ` (3 preceding siblings ...)
  2013-06-06  7:07 ` [PATCH 4/5] cpufreq:exynos:Extend exynos cpufreq driver to support boost Lukasz Majewski
@ 2013-06-06  7:07 ` Lukasz Majewski
  2013-06-06 14:49   ` Dave Jones
  2013-06-06 15:58   ` Borislav Petkov
  2013-06-11  9:03 ` [PATCH v2 0/3] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                   ` (12 subsequent siblings)
  17 siblings, 2 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-06  7:07 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocky
  Cc: cpufreq, Linux PM list, Vincent Guittot, Lukasz Majewski,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano

Enable/disable support for BOOST. New flag - CPU_FREQ_BOOST has been
defined for that.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
---
 drivers/cpufreq/Kconfig |    7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
index a1488f5..1007c5e 100644
--- a/drivers/cpufreq/Kconfig
+++ b/drivers/cpufreq/Kconfig
@@ -23,6 +23,13 @@ config CPU_FREQ_TABLE
 config CPU_FREQ_GOV_COMMON
 	bool
 
+config CPU_FREQ_BOOST
+	bool "CPU frequency boost support"
+	help
+	  Switch to enable support for frequency boost
+
+	  If in doubt, say N.
+
 config CPU_FREQ_STAT
 	tristate "CPU frequency translation statistics"
 	select CPU_FREQ_TABLE
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* Re: [PATCH 1/5] cpufreq: Define cpufreq_set_drv_attr_files() to add per CPU sysfs attributes
  2013-06-06  7:07 ` [PATCH 1/5] cpufreq: Define cpufreq_set_drv_attr_files() to add per CPU sysfs attributes Lukasz Majewski
@ 2013-06-06  8:27   ` Viresh Kumar
  2013-06-06  8:58     ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-06  8:27 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Lists linaro-kernel

On 6 June 2013 12:37, Lukasz Majewski <l.majewski@samsung.com> wrote:

> Subject: cpufreq: Define cpufreq_set_drv_attr_files() to add per CPU sysfs attributes

Its not per-cpu. We just add it for policy->cpu and other routines
actually create links.

> The cpufreq_set_drv_attr_files() function creates sysfs file entry for
> each available CPU. With it in place it is possible to add different
> set of attributes without code duplication.

Not for each available cpu but are linked to a policy->kobj and so
shows up on each policy->cpus.

> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> ---
>  drivers/cpufreq/cpufreq.c |   23 +++++++++++++++--------
>  1 file changed, 15 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> index 1b8a48e..ca74e27 100644
> --- a/drivers/cpufreq/cpufreq.c
> +++ b/drivers/cpufreq/cpufreq.c
> @@ -730,12 +730,23 @@ static int cpufreq_add_dev_symlink(unsigned int cpu,
>         return ret;
>  }
>
> +static int cpufreq_set_drv_attr_files(struct cpufreq_policy *policy,
> +                                     struct freq_attr **drv_attr)
> +{
> +       while ((drv_attr) && (*drv_attr)) {
> +               if (sysfs_create_file(&policy->kobj, &((*drv_attr)->attr)))
> +                       return 1;

You are changing the semantics here. We used to return error
value from sysfs_create_file() and you are returning 1.

> +               drv_attr++;

If drv_attr was valid initially, then drv_attr++ can't make it NULL.
So, we don't need to check validity of drv_attr for every loop.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH 1/5] cpufreq: Define cpufreq_set_drv_attr_files() to add per CPU sysfs attributes
  2013-06-06  8:27   ` Viresh Kumar
@ 2013-06-06  8:58     ` Lukasz Majewski
  2013-06-06  9:00       ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-06  8:58 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Lists linaro-kernel

Hi Viresh,

> On 6 June 2013 12:37, Lukasz Majewski <l.majewski@samsung.com> wrote:
> 
> > Subject: cpufreq: Define cpufreq_set_drv_attr_files() to add per
> > CPU sysfs attributes
> 
> Its not per-cpu. We just add it for policy->cpu and other routines
> actually create links.
> 
> > The cpufreq_set_drv_attr_files() function creates sysfs file entry
> > for each available CPU. With it in place it is possible to add
> > different set of attributes without code duplication.
> 
> Not for each available cpu but are linked to a policy->kobj and so
> shows up on each policy->cpus.

Yes, you are right here. Thanks for detailed explanation. Being
"per-cpu" comes from kobj embedded at policy, which has information
about cpus affected. 

> 
> > Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> > Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> > ---
> >  drivers/cpufreq/cpufreq.c |   23 +++++++++++++++--------
> >  1 file changed, 15 insertions(+), 8 deletions(-)
> >
> > diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> > index 1b8a48e..ca74e27 100644
> > --- a/drivers/cpufreq/cpufreq.c
> > +++ b/drivers/cpufreq/cpufreq.c
> > @@ -730,12 +730,23 @@ static int cpufreq_add_dev_symlink(unsigned
> > int cpu, return ret;
> >  }
> >
> > +static int cpufreq_set_drv_attr_files(struct cpufreq_policy
> > *policy,
> > +                                     struct freq_attr **drv_attr)
> > +{
> > +       while ((drv_attr) && (*drv_attr)) {
> > +               if (sysfs_create_file(&policy->kobj,
> > &((*drv_attr)->attr)))
> > +                       return 1;
> 
> You are changing the semantics here. We used to return error
> value from sysfs_create_file() and you are returning 1.

Yes, correct. The ret from sysfs_create_file shall be returned.
Returning 1 causes information lost.

> 
> > +               drv_attr++;
> 
> If drv_attr was valid initially, then drv_attr++ can't make it NULL.
> So, we don't need to check validity of drv_attr for every loop.

I'm confused here. 

So you want to check dev_attr for NULL just after:
drv_attr = cpufreq_driver->attr;
if (!drv_attr)
	goto error;

and skip the check at the while loop:
while ((drv_attr) && (*drv_attr)) 

to 

while ((*drv_attr))

Am I correct?


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH 1/5] cpufreq: Define cpufreq_set_drv_attr_files() to add per CPU sysfs attributes
  2013-06-06  8:58     ` Lukasz Majewski
@ 2013-06-06  9:00       ` Viresh Kumar
  2013-06-06  9:16         ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-06  9:00 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Lists linaro-kernel

On 6 June 2013 14:28, Lukasz Majewski <l.majewski@samsung.com> wrote:
> I'm confused here.
>
> So you want to check dev_attr for NULL just after:
> drv_attr = cpufreq_driver->attr;
> if (!drv_attr)
>         goto error;
>
> and skip the check at the while loop:
> while ((drv_attr) && (*drv_attr))
>
> to
>
> while ((*drv_attr))
>
> Am I correct?

Bingo!!

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH 1/5] cpufreq: Define cpufreq_set_drv_attr_files() to add per CPU sysfs attributes
  2013-06-06  9:00       ` Viresh Kumar
@ 2013-06-06  9:16         ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-06  9:16 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Lists linaro-kernel

Hi Viresh,

> On 6 June 2013 14:28, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > I'm confused here.
> >
> > So you want to check dev_attr for NULL just after:
> > drv_attr = cpufreq_driver->attr;
> > if (!drv_attr)
> >         goto error;
> >
> > and skip the check at the while loop:
> > while ((drv_attr) && (*drv_attr))
> >
> > to
> >
> > while ((*drv_attr))
> >
> > Am I correct?
> 
> Bingo!!

Ok, no problem :-)

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH 2/5] cpufreq:boost: Add support for software based CPU frequency boost
  2013-06-06  7:07 ` [PATCH 2/5] cpufreq:boost: Add support for software based CPU frequency boost Lukasz Majewski
@ 2013-06-06 10:53   ` Viresh Kumar
  2013-06-06 11:49     ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-06 10:53 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Lists linaro-kernel

Hi,

On 6 June 2013 12:37, Lukasz Majewski <l.majewski@samsung.com> wrote:
> This commit adds support for software based frequency boosting.
> Exynos4 SoCs (e.g. 4x12) allow setting of frequency above its normal
> condition limits. This can be done for some short time.
>
> Overclocking (boost) support came from cpufreq driver (which is platform
> dependent). Hence the data structure describing it is defined at its file.
>
> To allow support for either SW and HW (Intel) based boosting, the cpufreq
> core code has been extended to support both solutions.
>
> The main boost switch has been put at /sys/devices/system/cpu/cpufreq/boost.

Log requires some better paragraphs but I am not concerned about it for now.

> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> ---
>  drivers/cpufreq/cpufreq.c    |  156 ++++++++++++++++++++++++++++++++++++++++++
>  drivers/cpufreq/freq_table.c |   87 ++++++++++++++++++++++-
>  include/linux/cpufreq.h      |   35 +++++++++-
>  3 files changed, 275 insertions(+), 3 deletions(-)

My initial view on this patch is: "It is overly engineered and needs
to get simplified"

> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> index ca74e27..8cf9a92 100644
> --- a/drivers/cpufreq/cpufreq.c
> +++ b/drivers/cpufreq/cpufreq.c
> @@ -133,6 +133,11 @@ bool have_governor_per_policy(void)
>         return cpufreq_driver->have_governor_per_policy;
>  }
>
> +/**
> + * Global definition of cpufreq_boost structure
> + */
> +struct cpufreq_boost *cpufreq_boost;

Probably just a 'static bool' here cpufreq_boost_enabled. Which takes
care of selection from sysfs.

>  static struct cpufreq_governor *__find_governor(const char *str_governor)
>  {
> @@ -761,6 +805,18 @@ static int cpufreq_add_dev_interface(unsigned int cpu,
>         if (cpufreq_set_drv_attr_files(policy, cpufreq_driver->attr))
>                 goto err_out_kobj_put;
>
> +       if (cpufreq_driver->boost) {
> +               if (sysfs_create_file(cpufreq_global_kobject,
> +                                     &(global_boost.attr)))

This will report error for systems where we have two policy structures.
As we are creating something already present.

> +                       pr_warn("could not register global boost sysfs file\n");
> +               else
> +                       pr_debug("registered global boost sysfs file\n");

Please make all your prints to print function name too:

pr_debug("%s: foo\n", __func__, foo);

> +               if (cpufreq_set_drv_attr_files(policy,
> +                                              cpufreq_driver->boost->attr))

Why is this required? Why do we want platforms to add some files
in sysfs?

>  /*********************************************************************
> + *               BOOST                                              *
> + *********************************************************************/
> +int cpufreq_boost_trigger_state(struct cpufreq_policy *policy, int state)
> +{
> +       struct cpufreq_boost *boost;
> +       unsigned long flags;
> +       int ret = 0;
> +
> +       if (!policy || !policy->boost || !policy->boost->low_level_boost)
> +               return -ENODEV;
> +
> +       boost = policy->boost;
> +       write_lock_irqsave(&cpufreq_driver_lock, flags);
> +
> +       if (boost->status != state) {
> +               policy->boost->status = state;
> +               ret = boost->low_level_boost(policy, state);
> +               if (ret) {
> +                       pr_err("BOOST cannot %sable low level code (%d)\n",
> +                              state ? "en" : "dis", ret);
> +                       return ret;
> +               }
> +       }
> +
> +       write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> +
> +       pr_debug("cpufreq BOOST %sabled\n", state ? "en" : "dis");
> +
> +       return 0;
> +}
> +
> +/**
> + * cpufreq_boost_notifier - notifier callback for cpufreq policy change.
> + *  <at> nb:   struct notifier_block * with callback info.
> + *  <at> event: value showing cpufreq event for which this function invoked.
> + *  <at> data: callback-specific data
> + */
> +static int cpufreq_boost_notifier(struct notifier_block *nb,
> +                                 unsigned long event, void *data)
> +{
> +       struct cpufreq_policy *policy = data;
> +
> +       if (event == CPUFREQ_INCOMPATIBLE) {
> +               if (!policy || !policy->boost)
> +                       return -ENODEV;
> +
> +               if (policy->boost->status == CPUFREQ_BOOST_EN) {
> +                       pr_info("NOTIFIER BOOST: MAX: %d e:%lu cpu: %d\n",
> +                               policy->max, event, policy->cpu);
> +                       cpufreq_boost_trigger_state(policy, 0);
> +               }
> +       }
> +
> +       return 0;
> +}
> +
> +/* Notifier for cpufreq policy change */
> +static struct notifier_block cpufreq_boost_notifier_block = {
> +       .notifier_call = cpufreq_boost_notifier,
> +};
> +
> +int cpufreq_boost_init(struct cpufreq_policy *policy)
> +{
> +       int ret = 0;
> +
> +       if (!policy)
> +               return -EINVAL;

Heh, policy can't be NULL here.

> +       if (!cpufreq_driver->boost) {
> +               pr_err("Boost mode not supported on this device\n");

Wow!! You want to screw everybody else's logs with this message.
Its not a crime if you don't have boost mode supported :)

Actually this routine must be called only if cpufreq_driver->boost
is valid.

> +               return -ENODEV;
> +       }
> +
> +       policy->boost = cpufreq_boost = cpufreq_driver->boost;

Why are we copying same pointer to policy->boost? Driver is
passing pointer to a single memory location, just save it globally.

> +       /* disable boost for newly created policy - as we e.g. change
> +          governor */
> +       policy->boost->status = CPUFREQ_BOOST_DIS;

Drivers supporting boost may want boost to be enabled by default,
maybe without any sysfs calls.

> +       /* register policy notifier */
> +       ret = cpufreq_register_notifier(&cpufreq_boost_notifier_block,
> +                                       CPUFREQ_POLICY_NOTIFIER);
> +       if (ret) {
> +               pr_err("CPUFREQ BOOST notifier not registered.\n");
> +               return ret;
> +       }
> +       /* add policy to policies list headed at struct cpufreq_boost */
> +       list_add_tail(&policy->boost_list, &cpufreq_boost->policies);
> +
> +       return 0;
> +}
> +EXPORT_SYMBOL_GPL(cpufreq_boost_init);

Why do we need to maintain a list of boost here? notifiers? complex :(

> +/*********************************************************************
>   *               REGISTER / UNREGISTER CPUFREQ DRIVER                *
>   *********************************************************************/
>
> @@ -1954,6 +2106,10 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
>         pr_debug("unregistering driver %s\n", driver->name);
>
>         subsys_interface_unregister(&cpufreq_interface);
> +
> +       if (cpufreq_driver->boost)
> +               sysfs_remove_file(cpufreq_global_kobject, &(global_boost.attr));

You haven't removed this from policy. Memory leak.

>         unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
>
>         write_lock_irqsave(&cpufreq_driver_lock, flags);
> diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c
> index d7a7966..0e95524 100644
> --- a/drivers/cpufreq/freq_table.c
> +++ b/drivers/cpufreq/freq_table.c
> @@ -3,6 +3,8 @@
>   *
>   * Copyright (C) 2002 - 2003 Dominik Brodowski
>   *
> + * Copyright (C) 2013 Lukasz Majewski <l.majewski@samsung.com>
> + *

You shouldn't add it unless you did some major work on this file. You aren't
maintaining this file in 2013.

> +static int cpufreq_frequency_table_skip_boost(struct cpufreq_policy *policy,
> +                                             unsigned int index)
> +{
> +       if (index == CPUFREQ_BOOST)
> +               if (!policy->boost ||

This shouldn't be true. If index has got CPUFREQ_BOOST, then driver
has to support boost.

> +                   policy->boost->status == CPUFREQ_BOOST_DIS)
> +                       return 1;
> +
> +       return 0;
> +}
> +
> +unsigned int
> +cpufreq_frequency_table_boost_max(struct cpufreq_frequency_table *freq_table)
> +{
> +       int index, boost_freq_max;
> +
> +       for (index = 0, boost_freq_max = 0;
> +               freq_table[index].frequency != CPUFREQ_TABLE_END; index++)
> +               if (freq_table[index].index == CPUFREQ_BOOST) {
> +                       if (freq_table[index].frequency > boost_freq_max)
> +                               boost_freq_max = freq_table[index].frequency;
> +               }
> +
> +       return boost_freq_max;
> +}
> +EXPORT_SYMBOL_GPL(cpufreq_frequency_table_boost_max);

why do we need this?

>  /*
>   * if you use these, you must assure that the frequency table is valid
>   * all the time between get_attr and put_attr!
> diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
> index 037d36a..1294c8c 100644
> --- a/include/linux/cpufreq.h
> +++ b/include/linux/cpufreq.h
> @@ -88,6 +88,25 @@ struct cpufreq_real_policy {
>         struct cpufreq_governor *governor; /* see below */
>  };
>
> +#define CPUFREQ_BOOST_DIS            (0)
> +#define CPUFREQ_BOOST_EN             (1)

You don't need these.. Just create variable as bool and 0 & 1 would
be fine.

> +struct cpufreq_policy;
> +struct cpufreq_boost {
> +       unsigned int            max_boost_freq; /* maximum value of
> +                                                * boosted freq */
> +       unsigned int            max_normal_freq; /* non boost max freq */
> +       int                     status; /* status of boost */
> +
> +       /* boost sysfs attributies */
> +       struct freq_attr        **attr;
> +
> +       /* low-level trigger for boost */
> +       int (*low_level_boost) (struct cpufreq_policy *policy, int state);
> +
> +       struct list_head        policies;
> +};

We don't need it. Just add two more fields to cpufreq_driver:
- have_boost_freqs and low_level_boost (maybe a better name.
What's its use?)

>  struct cpufreq_policy {
>         /* CPUs sharing clock, require sw coordination */
>         cpumask_var_t           cpus;   /* Online CPUs only */
> @@ -113,6 +132,9 @@ struct cpufreq_policy {
>
>         struct cpufreq_real_policy      user_policy;
>
> +       struct cpufreq_boost    *boost;
> +       struct list_head        boost_list;

We don't need both of these.

>         struct kobject          kobj;
>         struct completion       kobj_unregister;
>  };

> @@ -277,7 +302,6 @@ struct cpufreq_driver {
>  int cpufreq_register_driver(struct cpufreq_driver *driver_data);
>  int cpufreq_unregister_driver(struct cpufreq_driver *driver_data);
>
> -

??

>  void cpufreq_notify_transition(struct cpufreq_policy *policy,
>                 struct cpufreq_freqs *freqs, unsigned int state);
>
> @@ -403,6 +427,9 @@ extern struct cpufreq_governor cpufreq_gov_conservative;
>  #define CPUFREQ_ENTRY_INVALID ~0
>  #define CPUFREQ_TABLE_END     ~1
>
> +/* Define index for boost frequency */
> +#define CPUFREQ_BOOST         ~2

s/CPUFREQ_BOOST/CPUFREQ_BOOST_FREQ

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH 2/5] cpufreq:boost: Add support for software based CPU frequency boost
  2013-06-06 10:53   ` Viresh Kumar
@ 2013-06-06 11:49     ` Lukasz Majewski
  2013-06-06 15:46       ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-06 11:49 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Lists linaro-kernel

Hi Viresh,

> Hi,
> 
> On 6 June 2013 12:37, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > This commit adds support for software based frequency boosting.
> > Exynos4 SoCs (e.g. 4x12) allow setting of frequency above its normal
> > condition limits. This can be done for some short time.
> >
> > Overclocking (boost) support came from cpufreq driver (which is
> > platform dependent). Hence the data structure describing it is
> > defined at its file.
> >
> > To allow support for either SW and HW (Intel) based boosting, the
> > cpufreq core code has been extended to support both solutions.
> >
> > The main boost switch has been put
> > at /sys/devices/system/cpu/cpufreq/boost.
> 
> Log requires some better paragraphs but I am not concerned about it
> for now.
> 
> > Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> > Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> > ---
> >  drivers/cpufreq/cpufreq.c    |  156
> > ++++++++++++++++++++++++++++++++++++++++++
> > drivers/cpufreq/freq_table.c |   87 ++++++++++++++++++++++-
> > include/linux/cpufreq.h      |   35 +++++++++- 3 files changed, 275
> > insertions(+), 3 deletions(-)
> 
> My initial view on this patch is: "It is overly engineered and needs
> to get simplified"
> 
> > diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> > index ca74e27..8cf9a92 100644
> > --- a/drivers/cpufreq/cpufreq.c
> > +++ b/drivers/cpufreq/cpufreq.c
> > @@ -133,6 +133,11 @@ bool have_governor_per_policy(void)
> >         return cpufreq_driver->have_governor_per_policy;
> >  }
> >
> > +/**
> > + * Global definition of cpufreq_boost structure
> > + */
> > +struct cpufreq_boost *cpufreq_boost;
> 
> Probably just a 'static bool' here cpufreq_boost_enabled. Which takes
> care of selection from sysfs.

The pointer to struct cpufreq_boost is needed for further reference
(as it is now done with struct cpufreq_driver pointer - *cpufreq_driver
- defined at cpufreq.c file).


> 
> >  static struct cpufreq_governor *__find_governor(const char
> > *str_governor) {
> > @@ -761,6 +805,18 @@ static int cpufreq_add_dev_interface(unsigned
> > int cpu, if (cpufreq_set_drv_attr_files(policy,
> > cpufreq_driver->attr)) goto err_out_kobj_put;
> >
> > +       if (cpufreq_driver->boost) {
> > +               if (sysfs_create_file(cpufreq_global_kobject,
> > +                                     &(global_boost.attr)))
> 
> This will report error for systems where we have two policy
> structures. As we are creating something already present.
Good point, thanks.

> 
> > +                       pr_warn("could not register global boost
> > sysfs file\n");
> > +               else
> > +                       pr_debug("registered global boost sysfs
> > file\n");
> 
> Please make all your prints to print function name too:
> 
> pr_debug("%s: foo\n", __func__, foo);

OK.

> 
> > +               if (cpufreq_set_drv_attr_files(policy,
> > +
> > cpufreq_driver->boost->attr))
> 
> Why is this required? Why do we want platforms to add some files
> in sysfs?

There are two kinds of attributes, which are exported by boost:

1. global boost (/sys/devices/system/cpu/cpufreq/boost)

2. attributes describing cpufreq abilities when boost is available
(/sys/devices/syste/cpu/cpu0/cpufreq/):
	- scaling_boost_frequencies - which will show over clocked
	  frequencies
	- the scaling_available_frequencies will also display boosted
	  frequency (when boost enabled)

Information from 2. is cpufreq_driver dependent. And that information
shouldn't been displayed when boost is not available



> 
> >  /*********************************************************************
> > + *
> > BOOST                                              *
> > +
> > *********************************************************************/
> > +int cpufreq_boost_trigger_state(struct cpufreq_policy *policy, int
> > state) +{
> > +       struct cpufreq_boost *boost;
> > +       unsigned long flags;
> > +       int ret = 0;
> > +
> > +       if (!policy || !policy->boost
> > || !policy->boost->low_level_boost)
> > +               return -ENODEV;
> > +
> > +       boost = policy->boost;
> > +       write_lock_irqsave(&cpufreq_driver_lock, flags);
> > +
> > +       if (boost->status != state) {
> > +               policy->boost->status = state;
> > +               ret = boost->low_level_boost(policy, state);
> > +               if (ret) {
> > +                       pr_err("BOOST cannot %sable low level code
> > (%d)\n",
> > +                              state ? "en" : "dis", ret);
> > +                       return ret;
> > +               }
> > +       }
> > +
> > +       write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> > +
> > +       pr_debug("cpufreq BOOST %sabled\n", state ? "en" : "dis");
> > +
> > +       return 0;
> > +}
> > +
> > +/**
> > + * cpufreq_boost_notifier - notifier callback for cpufreq policy
> > change.
> > + *  <at> nb:   struct notifier_block * with callback info.
> > + *  <at> event: value showing cpufreq event for which this
> > function invoked.
> > + *  <at> data: callback-specific data
> > + */
> > +static int cpufreq_boost_notifier(struct notifier_block *nb,
> > +                                 unsigned long event, void *data)
> > +{
> > +       struct cpufreq_policy *policy = data;
> > +
> > +       if (event == CPUFREQ_INCOMPATIBLE) {
> > +               if (!policy || !policy->boost)
> > +                       return -ENODEV;
> > +
> > +               if (policy->boost->status == CPUFREQ_BOOST_EN) {
> > +                       pr_info("NOTIFIER BOOST: MAX: %d e:%lu cpu:
> > %d\n",
> > +                               policy->max, event, policy->cpu);
> > +                       cpufreq_boost_trigger_state(policy, 0);
> > +               }
> > +       }
> > +
> > +       return 0;
> > +}
> > +
> > +/* Notifier for cpufreq policy change */
> > +static struct notifier_block cpufreq_boost_notifier_block = {
> > +       .notifier_call = cpufreq_boost_notifier,
> > +};
> > +
> > +int cpufreq_boost_init(struct cpufreq_policy *policy)
> > +{
> > +       int ret = 0;
> > +
> > +       if (!policy)
> > +               return -EINVAL;
> 
> Heh, policy can't be NULL here.

Extra precautions :-). I will remove it.

> 
> > +       if (!cpufreq_driver->boost) {
> > +               pr_err("Boost mode not supported on this device\n");
> 
> Wow!! You want to screw everybody else's logs with this message.
> Its not a crime if you don't have boost mode supported :)

Hmm, I've exaggerated a bit here.... :)

> 
> Actually this routine must be called only if cpufreq_driver->boost
> is valid.
> 
> > +               return -ENODEV;
> > +       }
> > +
> > +       policy->boost = cpufreq_boost = cpufreq_driver->boost;
> 
> Why are we copying same pointer to policy->boost? Driver is
> passing pointer to a single memory location, just save it globally.

This needs some explanation.

The sysfs entry presented at [1] doesn't bring any useful information
to reuse (like *policy). For this reason the global cpufreq_boost
pointer is needed.

However to efficiently manage the boost, it is necessary to keep per
policy pointer to the only struct cpufreq_boost instance (defined at
cpufreq_driver code).

> 
> > +       /* disable boost for newly created policy - as we e.g.
> > change
> > +          governor */
> > +       policy->boost->status = CPUFREQ_BOOST_DIS;
> 
> Drivers supporting boost may want boost to be enabled by default,
> maybe without any sysfs calls.

This can be done by setting the struct cpufreq_boost status field to
CPUFREQ_BOOST_EN at cpufreq driver code (when boost structure is
defined)

> 
> > +       /* register policy notifier */
> > +       ret =
> > cpufreq_register_notifier(&cpufreq_boost_notifier_block,
> > +                                       CPUFREQ_POLICY_NOTIFIER);
> > +       if (ret) {
> > +               pr_err("CPUFREQ BOOST notifier not registered.\n");
> > +               return ret;
> > +       }
> > +       /* add policy to policies list headed at struct
> > cpufreq_boost */
> > +       list_add_tail(&policy->boost_list,
> > &cpufreq_boost->policies); +
> > +       return 0;
> > +}
> > +EXPORT_SYMBOL_GPL(cpufreq_boost_init);
> 
> Why do we need to maintain a list of boost here? notifiers? complex :(

Notifier is needed to disable boost when policy is changed (for
example when we change from ondemand/lab to performance governor).

I wanted to avoid the situation when boost stays enabled across
different governors.

The list of in system available policies is defined to allow boost
enable/disable for all policies available (by changing for example
policy->max field).

If we decide, that we will support only one policy (as it is now at
e.g. Exynos), the list is unnecessary here.

> 
> > +/*********************************************************************
> >   *               REGISTER / UNREGISTER CPUFREQ
> > DRIVER                *
> > *********************************************************************/
> >
> > @@ -1954,6 +2106,10 @@ int cpufreq_unregister_driver(struct
> > cpufreq_driver *driver) pr_debug("unregistering driver %s\n",
> > driver->name);
> >
> >         subsys_interface_unregister(&cpufreq_interface);
> > +
> > +       if (cpufreq_driver->boost)
> > +               sysfs_remove_file(cpufreq_global_kobject,
> > &(global_boost.attr));
> 
> You haven't removed this from policy. Memory leak.

Yes, you are right.

> 
> >         unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
> >
> >         write_lock_irqsave(&cpufreq_driver_lock, flags);
> > diff --git a/drivers/cpufreq/freq_table.c
> > b/drivers/cpufreq/freq_table.c index d7a7966..0e95524 100644
> > --- a/drivers/cpufreq/freq_table.c
> > +++ b/drivers/cpufreq/freq_table.c
> > @@ -3,6 +3,8 @@
> >   *
> >   * Copyright (C) 2002 - 2003 Dominik Brodowski
> >   *
> > + * Copyright (C) 2013 Lukasz Majewski <l.majewski@samsung.com>
> > + *
> 
> You shouldn't add it unless you did some major work on this file. You
> aren't maintaining this file in 2013.

OK, I will remove the entry.

> 
> > +static int cpufreq_frequency_table_skip_boost(struct
> > cpufreq_policy *policy,
> > +                                             unsigned int index)
> > +{
> > +       if (index == CPUFREQ_BOOST)
> > +               if (!policy->boost ||
> 
> This shouldn't be true. If index has got CPUFREQ_BOOST, then driver
> has to support boost.

Correct me if I'm wrong here, but in my understanding the boost shall be
only supported when both CPUFREQ_BOOST index is defined in a freq_table
and boost.state = CPUFREQ_BOOST_EN is set.

Setting of CPUFREQ_BOOST shouldn't by default allow to use over
clocking frequency. 

> 
> > +                   policy->boost->status == CPUFREQ_BOOST_DIS)
> > +                       return 1;
> > +
> > +       return 0;
> > +}
> > +
> > +unsigned int
> > +cpufreq_frequency_table_boost_max(struct cpufreq_frequency_table
> > *freq_table) +{
> > +       int index, boost_freq_max;
> > +
> > +       for (index = 0, boost_freq_max = 0;
> > +               freq_table[index].frequency != CPUFREQ_TABLE_END;
> > index++)
> > +               if (freq_table[index].index == CPUFREQ_BOOST) {
> > +                       if (freq_table[index].frequency >
> > boost_freq_max)
> > +                               boost_freq_max =
> > freq_table[index].frequency;
> > +               }
> > +
> > +       return boost_freq_max;
> > +}
> > +EXPORT_SYMBOL_GPL(cpufreq_frequency_table_boost_max);
> 
> why do we need this?

To evaluate the maximal boost frequency from the frequency table. It is
then used as a delimiter (when LAB cooperates with thermal framework).

> 
> >  /*
> >   * if you use these, you must assure that the frequency table is
> > valid
> >   * all the time between get_attr and put_attr!
> > diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
> > index 037d36a..1294c8c 100644
> > --- a/include/linux/cpufreq.h
> > +++ b/include/linux/cpufreq.h
> > @@ -88,6 +88,25 @@ struct cpufreq_real_policy {
> >         struct cpufreq_governor *governor; /* see below */
> >  };
> >
> > +#define CPUFREQ_BOOST_DIS            (0)
> > +#define CPUFREQ_BOOST_EN             (1)
> 
> You don't need these.. Just create variable as bool and 0 & 1 would
> be fine.

Yes, this seems to be a clearer solution.

> 
> > +struct cpufreq_policy;
> > +struct cpufreq_boost {
> > +       unsigned int            max_boost_freq; /* maximum value of
> > +                                                * boosted freq */
> > +       unsigned int            max_normal_freq; /* non boost max
> > freq */
> > +       int                     status; /* status of boost */
> > +
> > +       /* boost sysfs attributies */
> > +       struct freq_attr        **attr;
> > +
> > +       /* low-level trigger for boost */
> > +       int (*low_level_boost) (struct cpufreq_policy *policy, int
> > state); +
> > +       struct list_head        policies;
> > +};
> 
> We don't need it. Just add two more fields to cpufreq_driver:
> - have_boost_freqs and low_level_boost (maybe a better name.
> What's its use?)

The separate struct cpufreq_boost was created to explicitly separate
boost fields from cpufreq_driver structure. 

If in your opinion this structure is redundant, I can remove it and
extend cpufreq_driver structure.

> 
> >  struct cpufreq_policy {
> >         /* CPUs sharing clock, require sw coordination */
> >         cpumask_var_t           cpus;   /* Online CPUs only */
> > @@ -113,6 +132,9 @@ struct cpufreq_policy {
> >
> >         struct cpufreq_real_policy      user_policy;
> >
> > +       struct cpufreq_boost    *boost;
> > +       struct list_head        boost_list;
> 
> We don't need both of these.

*boost pointer is necessary when one wants to enable/disable boost from
e.g governor code (which operates mostly on struct cpufreq_policy
*policy pointers).

The boost_list is necessary to connect policies in a list. 

> 
> >         struct kobject          kobj;
> >         struct completion       kobj_unregister;
> >  };
> 
> > @@ -277,7 +302,6 @@ struct cpufreq_driver {
> >  int cpufreq_register_driver(struct cpufreq_driver *driver_data);
> >  int cpufreq_unregister_driver(struct cpufreq_driver *driver_data);
> >
> > -
> 
> ??
> 
> >  void cpufreq_notify_transition(struct cpufreq_policy *policy,
> >                 struct cpufreq_freqs *freqs, unsigned int state);
> >
> > @@ -403,6 +427,9 @@ extern struct cpufreq_governor
> > cpufreq_gov_conservative; #define CPUFREQ_ENTRY_INVALID ~0
> >  #define CPUFREQ_TABLE_END     ~1
> >
> > +/* Define index for boost frequency */
> > +#define CPUFREQ_BOOST         ~2
> 
> s/CPUFREQ_BOOST/CPUFREQ_BOOST_FREQ

Ok, will be changed to something more descriptive. 

Thanks for thorough review :-)

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH 5/5] cpufreq:boost:Kconfig: Enable boost support at Kconfig
  2013-06-06  7:07 ` [PATCH 5/5] cpufreq:boost:Kconfig: Enable boost support at Kconfig Lukasz Majewski
@ 2013-06-06 14:49   ` Dave Jones
  2013-06-06 15:14     ` Lukasz Majewski
  2013-06-06 15:58   ` Borislav Petkov
  1 sibling, 1 reply; 329+ messages in thread
From: Dave Jones @ 2013-06-06 14:49 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Viresh Kumar, Rafael J. Wysocky, cpufreq, Linux PM list,
	Vincent Guittot, Jonghwa Lee, Myungjoo Ham, linux-kernel,
	Lukasz Majewski, Andre Przywara, Daniel Lezcano

On Thu, Jun 06, 2013 at 09:07:52AM +0200, Lukasz Majewski wrote:

 > +config CPU_FREQ_BOOST
 > +	bool "CPU frequency boost support"
 > +	help
 > +	  Switch to enable support for frequency boost
 > +
 > +	  If in doubt, say N.
 > +

This help text is devoid of any useful information.

On what platforms ? What's the upside/downside ? Why is it an option ?

	Dave


^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH 5/5] cpufreq:boost:Kconfig: Enable boost support at Kconfig
  2013-06-06 14:49   ` Dave Jones
@ 2013-06-06 15:14     ` Lukasz Majewski
  2013-06-06 15:21       ` Dave Jones
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-06 15:14 UTC (permalink / raw)
  To: Dave Jones
  Cc: Viresh Kumar, Rafael J. Wysocky, cpufreq, Linux PM list,
	Vincent Guittot, Jonghwa Lee, Myungjoo Ham, linux-kernel,
	Lukasz Majewski, Andre Przywara, Daniel Lezcano

Hi Dave,

> On Thu, Jun 06, 2013 at 09:07:52AM +0200, Lukasz Majewski wrote:
> 
>  > +config CPU_FREQ_BOOST
>  > +	bool "CPU frequency boost support"
>  > +	help
>  > +	  Switch to enable support for frequency boost
>  > +
>  > +	  If in doubt, say N.
>  > +
> 
> This help text is devoid of any useful information.
> 
> On what platforms ? What's the upside/downside ? Why is it an option ?

I shall be more verbose here.

The boost option is supposed to provide one solution to control
software based (like is is done with Samsung Exynos4 SoC) and hardware
based (like Intel's Turbo Boost feature) boost.

Support for Intel's boost is already in mainline. Therefore I aimed to
extend cpufreq to also manage software based solutions (e.g. Exynos).


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH 5/5] cpufreq:boost:Kconfig: Enable boost support at Kconfig
  2013-06-06 15:14     ` Lukasz Majewski
@ 2013-06-06 15:21       ` Dave Jones
  2013-06-06 15:48         ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Dave Jones @ 2013-06-06 15:21 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Viresh Kumar, Rafael J. Wysocky, cpufreq, Linux PM list,
	Vincent Guittot, Jonghwa Lee, Myungjoo Ham, linux-kernel,
	Lukasz Majewski, Andre Przywara, Daniel Lezcano

On Thu, Jun 06, 2013 at 05:14:31PM +0200, Lukasz Majewski wrote:
 > Hi Dave,
 > 
 > > On Thu, Jun 06, 2013 at 09:07:52AM +0200, Lukasz Majewski wrote:
 > > 
 > >  > +config CPU_FREQ_BOOST
 > >  > +	bool "CPU frequency boost support"
 > >  > +	help
 > >  > +	  Switch to enable support for frequency boost
 > >  > +
 > >  > +	  If in doubt, say N.
 > >  > +
 > > 
 > > This help text is devoid of any useful information.
 > > 
 > > On what platforms ? What's the upside/downside ? Why is it an option ?
 > 
 > I shall be more verbose here.
 > 
 > The boost option is supposed to provide one solution to control
 > software based (like is is done with Samsung Exynos4 SoC) and hardware
 > based (like Intel's Turbo Boost feature) boost.
 > 
 > Support for Intel's boost is already in mainline. Therefore I aimed to
 > extend cpufreq to also manage software based solutions (e.g. Exynos).

Given CPUFREQ is available on more platforms than X86/ARM, this option
could also use a depends.

	Dave


^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH 2/5] cpufreq:boost: Add support for software based CPU frequency boost
  2013-06-06 11:49     ` Lukasz Majewski
@ 2013-06-06 15:46       ` Viresh Kumar
  2013-06-07 13:27         ` Lukasz Majewski
  2013-06-07 14:43         ` Lukasz Majewski
  0 siblings, 2 replies; 329+ messages in thread
From: Viresh Kumar @ 2013-06-06 15:46 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Lists linaro-kernel

On 6 June 2013 17:19, Lukasz Majewski <l.majewski@samsung.com> wrote:
>> On 6 June 2013 12:37, Lukasz Majewski <l.majewski@samsung.com> wrote:

>> > cpufreq_driver->boost->attr))
>>
>> Why is this required? Why do we want platforms to add some files
>> in sysfs?
>
> There are two kinds of attributes, which are exported by boost:
>
> 1. global boost (/sys/devices/system/cpu/cpufreq/boost)
>
> 2. attributes describing cpufreq abilities when boost is available
> (/sys/devices/syste/cpu/cpu0/cpufreq/):
>         - scaling_boost_frequencies - which will show over clocked
>           frequencies
>         - the scaling_available_frequencies will also display boosted
>           frequency (when boost enabled)
>
> Information from 2. is cpufreq_driver dependent. And that information
> shouldn't been displayed when boost is not available

This is not how I wanted this to be coded. Lets keep things simple:
- Implement it in the way cpufreq_freq_attr_scaling_available_freqs
  is implemented. And then drivers which need to see boost freqs
  can add it in their attr.

>> > +       policy->boost = cpufreq_boost = cpufreq_driver->boost;
>>
>> Why are we copying same pointer to policy->boost? Driver is
>> passing pointer to a single memory location, just save it globally.
>
> This needs some explanation.
>
> The sysfs entry presented at [1] doesn't bring any useful information
> to reuse (like *policy). For this reason the global cpufreq_boost
> pointer is needed.
>
> However to efficiently manage the boost, it is necessary to keep per
> policy pointer to the only struct cpufreq_boost instance (defined at
> cpufreq_driver code).

No we don't need to screw struct cpufreq_policy with it.
Just need two variables here:
- cpufreq_driver->boost: If driver supports boost or not.
- If above is true then a global bool variable that will say boost is
  enabled from sysfs or not.

>> > +       /* disable boost for newly created policy - as we e.g.
>> > change
>> > +          governor */
>> > +       policy->boost->status = CPUFREQ_BOOST_DIS;
>>
>> Drivers supporting boost may want boost to be enabled by default,
>> maybe without any sysfs calls.
>
> This can be done by setting the struct cpufreq_boost status field to
> CPUFREQ_BOOST_EN at cpufreq driver code (when boost structure is
> defined)

This really isn't driver dependent.. But user dependent. Maybe lets
keep it disabled and people can enable it from sysfs.

>> Why do we need to maintain a list of boost here? notifiers? complex :(
>
> Notifier is needed to disable boost when policy is changed (for
> example when we change from ondemand/lab to performance governor).
>
> I wanted to avoid the situation when boost stays enabled across
> different governors.
>
> The list of in system available policies is defined to allow boost
> enable/disable for all policies available (by changing for example
> policy->max field).
>
> If we decide, that we will support only one policy (as it is now at
> e.g. Exynos), the list is unnecessary here.

What we discussed last in your earlier patchset was:
- Keep boost feature separate from governors.
- If it is enabled, then any governor can use it (if they want).
- Lets not disable it if governor is changed. user must do it explicitly.

>> > +static int cpufreq_frequency_table_skip_boost(struct
>> > cpufreq_policy *policy,
>> > +                                             unsigned int index)
>> > +{
>> > +       if (index == CPUFREQ_BOOST)
>> > +               if (!policy->boost ||
>>
>> This shouldn't be true. If index has got CPUFREQ_BOOST, then driver
>> has to support boost.
>
> Correct me if I'm wrong here, but in my understanding the boost shall be
> only supported when both CPUFREQ_BOOST index is defined in a freq_table
> and boost.state = CPUFREQ_BOOST_EN is set.
>
> Setting of CPUFREQ_BOOST shouldn't by default allow to use over
> clocking frequency.

For cpufreq core boost is enabled as soon as cpufreq_driver->boost is
true. We can have additional checks to see if there is atleast one
boost frequency but can skip this too.

>> why do we need this?
>
> To evaluate the maximal boost frequency from the frequency table. It is
> then used as a delimiter (when LAB cooperates with thermal framework).

Introduce this with LAB then.. Lets keep it as simple as possible for now.
One step at a time.

>> > +struct cpufreq_boost {
>> > +       unsigned int            max_boost_freq; /* maximum value of
>> > +                                                * boosted freq */
>> > +       unsigned int            max_normal_freq; /* non boost max
>> > freq */
>> > +       int                     status; /* status of boost */
>> > +
>> > +       /* boost sysfs attributies */
>> > +       struct freq_attr        **attr;
>> > +
>> > +       /* low-level trigger for boost */
>> > +       int (*low_level_boost) (struct cpufreq_policy *policy, int
>> > state); +
>> > +       struct list_head        policies;
>> > +};
>>
>> We don't need it. Just add two more fields to cpufreq_driver:
>> - have_boost_freqs and low_level_boost (maybe a better name.
>> What's its use?)
>
> The separate struct cpufreq_boost was created to explicitly separate
> boost fields from cpufreq_driver structure.
>
> If in your opinion this structure is redundant, I can remove it and
> extend cpufreq_driver structure.

I am not against a structure (as putting related stuff in a struct is always
better), but against so many fields in it to make things complicated.

I will only keep have_boost_freqs and low_level_boost. Remove
everything else.

> *boost pointer is necessary when one wants to enable/disable boost from
> e.g governor code (which operates mostly on struct cpufreq_policy
> *policy pointers).

We don't need to do this. boost can only be disabled from userspace by
user. No intervention from governor.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH 5/5] cpufreq:boost:Kconfig: Enable boost support at Kconfig
  2013-06-06 15:21       ` Dave Jones
@ 2013-06-06 15:48         ` Viresh Kumar
  0 siblings, 0 replies; 329+ messages in thread
From: Viresh Kumar @ 2013-06-06 15:48 UTC (permalink / raw)
  To: Dave Jones
  Cc: Lukasz Majewski, Viresh Kumar, Rafael J. Wysocky, cpufreq,
	Linux PM list, Vincent Guittot, Jonghwa Lee, Myungjoo Ham,
	linux-kernel, Lukasz Majewski, Andre Przywara, Daniel Lezcano

On 6 June 2013 20:51, Dave Jones <davej@redhat.com> wrote:
> Given CPUFREQ is available on more platforms than X86/ARM, this option
> could also use a depends.

It should be disabled by default, so please add default n.
But we don't need a depends here as everybody is open to use
it. Its a core feature.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH 5/5] cpufreq:boost:Kconfig: Enable boost support at Kconfig
  2013-06-06  7:07 ` [PATCH 5/5] cpufreq:boost:Kconfig: Enable boost support at Kconfig Lukasz Majewski
  2013-06-06 14:49   ` Dave Jones
@ 2013-06-06 15:58   ` Borislav Petkov
  2013-06-10 13:20     ` Lukasz Majewski
  1 sibling, 1 reply; 329+ messages in thread
From: Borislav Petkov @ 2013-06-06 15:58 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Viresh Kumar, Rafael J. Wysocky, cpufreq, Linux PM list,
	Vincent Guittot, Jonghwa Lee, Myungjoo Ham, linux-kernel,
	Lukasz Majewski, Andre Przywara, Daniel Lezcano

On Thu, Jun 06, 2013 at 09:07:52AM +0200, Lukasz Majewski wrote:
> Enable/disable support for BOOST. New flag - CPU_FREQ_BOOST has been
> defined for that.

What's the reason for this? Why would you want to not compile-in the
boosting code?

Also, at least on x86, even with this feature disabled, the CPU will
boost by default unless you fiddle with it through the MSRs as root.

-- 
Regards/Gruss,
    Boris.

Sent from a fat crate under my desk. Formatting is fine.
--

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH 2/5] cpufreq:boost: Add support for software based CPU frequency boost
  2013-06-06 15:46       ` Viresh Kumar
@ 2013-06-07 13:27         ` Lukasz Majewski
  2013-06-07 14:13           ` Viresh Kumar
  2013-06-07 14:43         ` Lukasz Majewski
  1 sibling, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-07 13:27 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Lists linaro-kernel

Hi Viresh,

> On 6 June 2013 17:19, Lukasz Majewski <l.majewski@samsung.com> wrote:
> >> On 6 June 2013 12:37, Lukasz Majewski <l.majewski@samsung.com>
> >> wrote:
> 
> >> > cpufreq_driver->boost->attr))
> >>
> >> Why is this required? Why do we want platforms to add some files
> >> in sysfs?
> >
> > There are two kinds of attributes, which are exported by boost:
> >
> > 1. global boost (/sys/devices/system/cpu/cpufreq/boost)
> >
> > 2. attributes describing cpufreq abilities when boost is available
> > (/sys/devices/syste/cpu/cpu0/cpufreq/):
> >         - scaling_boost_frequencies - which will show over clocked
> >           frequencies
> >         - the scaling_available_frequencies will also display
> > boosted frequency (when boost enabled)
> >
> > Information from 2. is cpufreq_driver dependent. And that
> > information shouldn't been displayed when boost is not available
> 
> This is not how I wanted this to be coded. Lets keep things simple:
> - Implement it in the way cpufreq_freq_attr_scaling_available_freqs
>   is implemented. And then drivers which need to see boost freqs
>   can add it in their attr.
> 
> >> > +       policy->boost = cpufreq_boost = cpufreq_driver->boost;
> >>
> >> Why are we copying same pointer to policy->boost? Driver is
> >> passing pointer to a single memory location, just save it globally.
> >
> > This needs some explanation.
> >
> > The sysfs entry presented at [1] doesn't bring any useful
> > information to reuse (like *policy). For this reason the global
> > cpufreq_boost pointer is needed.
> >
> > However to efficiently manage the boost, it is necessary to keep per
> > policy pointer to the only struct cpufreq_boost instance (defined at
> > cpufreq_driver code).
> 
> No we don't need to screw struct cpufreq_policy with it.
> Just need two variables here:
> - cpufreq_driver->boost: If driver supports boost or not.
> - If above is true then a global bool variable that will say boost is
>   enabled from sysfs or not.
> 
> >> > +       /* disable boost for newly created policy - as we e.g.
> >> > change
> >> > +          governor */
> >> > +       policy->boost->status = CPUFREQ_BOOST_DIS;
> >>
> >> Drivers supporting boost may want boost to be enabled by default,
> >> maybe without any sysfs calls.
> >
> > This can be done by setting the struct cpufreq_boost status field to
> > CPUFREQ_BOOST_EN at cpufreq driver code (when boost structure is
> > defined)
> 
> This really isn't driver dependent.. But user dependent. Maybe lets
> keep it disabled and people can enable it from sysfs.
> 
> >> Why do we need to maintain a list of boost here? notifiers?
> >> complex :(
> >
> > Notifier is needed to disable boost when policy is changed (for
> > example when we change from ondemand/lab to performance governor).
> >
> > I wanted to avoid the situation when boost stays enabled across
> > different governors.
> >
> > The list of in system available policies is defined to allow boost
> > enable/disable for all policies available (by changing for example
> > policy->max field).
> >
> > If we decide, that we will support only one policy (as it is now at
> > e.g. Exynos), the list is unnecessary here.
> 
> What we discussed last in your earlier patchset was:
> - Keep boost feature separate from governors.
> - If it is enabled, then any governor can use it (if they want).
> - Lets not disable it if governor is changed. user must do it
> explicitly.
> 
> >> > +static int cpufreq_frequency_table_skip_boost(struct
> >> > cpufreq_policy *policy,
> >> > +                                             unsigned int index)
> >> > +{
> >> > +       if (index == CPUFREQ_BOOST)
> >> > +               if (!policy->boost ||
> >>
> >> This shouldn't be true. If index has got CPUFREQ_BOOST, then driver
> >> has to support boost.
> >
> > Correct me if I'm wrong here, but in my understanding the boost
> > shall be only supported when both CPUFREQ_BOOST index is defined in
> > a freq_table and boost.state = CPUFREQ_BOOST_EN is set.
> >
> > Setting of CPUFREQ_BOOST shouldn't by default allow to use over
> > clocking frequency.
> 
> For cpufreq core boost is enabled as soon as cpufreq_driver->boost is
> true. We can have additional checks to see if there is atleast one
> boost frequency but can skip this too.
> 
> >> why do we need this?
> >
> > To evaluate the maximal boost frequency from the frequency table.
> > It is then used as a delimiter (when LAB cooperates with thermal
> > framework).
> 
> Introduce this with LAB then.. Lets keep it as simple as possible for
> now. One step at a time.
> 
> >> > +struct cpufreq_boost {
> >> > +       unsigned int            max_boost_freq; /* maximum value
> >> > of
> >> > +                                                * boosted freq
> >> > */
> >> > +       unsigned int            max_normal_freq; /* non boost max
> >> > freq */
> >> > +       int                     status; /* status of boost */
> >> > +
> >> > +       /* boost sysfs attributies */
> >> > +       struct freq_attr        **attr;
> >> > +
> >> > +       /* low-level trigger for boost */
> >> > +       int (*low_level_boost) (struct cpufreq_policy *policy,
> >> > int state); +
> >> > +       struct list_head        policies;
> >> > +};
> >>
> >> We don't need it. Just add two more fields to cpufreq_driver:
> >> - have_boost_freqs and low_level_boost (maybe a better name.
> >> What's its use?)
> >
> > The separate struct cpufreq_boost was created to explicitly separate
> > boost fields from cpufreq_driver structure.
> >
> > If in your opinion this structure is redundant, I can remove it and
> > extend cpufreq_driver structure.
> 
> I am not against a structure (as putting related stuff in a struct is
> always better), but against so many fields in it to make things
> complicated.
> 
> I will only keep have_boost_freqs and low_level_boost. Remove
> everything else.

I would prefer to have following fields in the cpufreq_boost structure:
struct cpufreq_boost {
	unsigned int	max_boost_freq; /*boost max freq*/
	unsigned int 	max_normal_freq; /*max normal freq
	int (*low_level_boost) (int state);
	bool boost_en;  /* indicate if boost is enabled */
}

The max_{boost|normal}_freq fields will be filed at 
ret = cpufreq_driver->init(policy);

Thanks to them I will avoid calling many times routine, which extracts
from freq_table maximal boost and normal frequencies.

I could define those variables in the exynos-cpufreq.c driver, but I
think, that they are more suitable to be embedded at cpufreq_boost
structure.


> 
> > *boost pointer is necessary when one wants to enable/disable boost
> > from e.g governor code (which operates mostly on struct
> > cpufreq_policy *policy pointers).
> 
> We don't need to do this. boost can only be disabled from userspace by
> user. No intervention from governor.



-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH 2/5] cpufreq:boost: Add support for software based CPU frequency boost
  2013-06-07 13:27         ` Lukasz Majewski
@ 2013-06-07 14:13           ` Viresh Kumar
  2013-06-07 14:34             ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-07 14:13 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Lists linaro-kernel

Hi Lukasz,

On 7 June 2013 18:57, Lukasz Majewski <l.majewski@samsung.com> wrote:

I hope you agreed to all the other comments I gave as I don't see an
explicit reply below each of these. I have seen people missing these
in past, so what would be better to do is:
- either reply below each one of them and say yes or no..
- Or write once below many comments and say: All above comments
are accepted.

So, that Reviewer is assured that you haven't missed anything.

> I would prefer to have following fields in the cpufreq_boost structure:
> struct cpufreq_boost {
>         unsigned int    max_boost_freq; /*boost max freq*/
>         unsigned int    max_normal_freq; /*max normal freq
>         int (*low_level_boost) (int state);
>         bool boost_en;  /* indicate if boost is enabled */
> }
>
> The max_{boost|normal}_freq fields will be filed at
> ret = cpufreq_driver->init(policy);
>
> Thanks to them I will avoid calling many times routine, which extracts
> from freq_table maximal boost and normal frequencies.
>
> I could define those variables in the exynos-cpufreq.c driver, but I
> think, that they are more suitable to be embedded at cpufreq_boost
> structure.

I understand that you need these variables (I will still look how you are
using them in next version). But they are per policy and driver isn't
responsible for maintaining them. If they are required then cpufreq
core must find them out and keep in struct cpufreq_policy (as they
are policy dependent)..

So, remove this structure from cpufreq_driver and embed variables
directly.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH 2/5] cpufreq:boost: Add support for software based CPU frequency boost
  2013-06-07 14:13           ` Viresh Kumar
@ 2013-06-07 14:34             ` Lukasz Majewski
  2013-06-07 14:44               ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-07 14:34 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Lists linaro-kernel

Hi Viresh,

> Hi Lukasz,
> 
> On 7 June 2013 18:57, Lukasz Majewski <l.majewski@samsung.com> wrote:
> 
> I hope you agreed to all the other comments I gave as I don't see an
> explicit reply below each of these. I have seen people missing these
> in past, so what would be better to do is:
> - either reply below each one of them and say yes or no..
> - Or write once below many comments and say: All above comments
> are accepted.
> 
> So, that Reviewer is assured that you haven't missed anything.
> 

Thanks for reminding :-).

I've read through all the comments. I'm redesigning now the driver to
remove redundant code.


> > I would prefer to have following fields in the cpufreq_boost
> > structure: struct cpufreq_boost {
> >         unsigned int    max_boost_freq; /*boost max freq*/
> >         unsigned int    max_normal_freq; /*max normal freq
> >         int (*low_level_boost) (int state);
> >         bool boost_en;  /* indicate if boost is enabled */
> > }
> >
> > The max_{boost|normal}_freq fields will be filed at
> > ret = cpufreq_driver->init(policy);
> >
> > Thanks to them I will avoid calling many times routine, which
> > extracts from freq_table maximal boost and normal frequencies.
> >
> > I could define those variables in the exynos-cpufreq.c driver, but I
> > think, that they are more suitable to be embedded at cpufreq_boost
> > structure.
> 
> I understand that you need these variables (I will still look how you
> are using them in next version). But they are per policy and driver
> isn't responsible for maintaining them. If they are required then
> cpufreq core must find them out and keep in struct cpufreq_policy (as
> they are policy dependent)..
> 
> So, remove this structure from cpufreq_driver and embed variables
> directly.

After refactoring the code. I admit, that we shall embed the struct
cpu_boost fields directly to the coufreq_driver. There is no point to
create structure with 2 fields.

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH 2/5] cpufreq:boost: Add support for software based CPU frequency boost
  2013-06-06 15:46       ` Viresh Kumar
  2013-06-07 13:27         ` Lukasz Majewski
@ 2013-06-07 14:43         ` Lukasz Majewski
  1 sibling, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-07 14:43 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Lists linaro-kernel

Hi Viresh,

> On 6 June 2013 17:19, Lukasz Majewski <l.majewski@samsung.com> wrote:
> >> On 6 June 2013 12:37, Lukasz Majewski <l.majewski@samsung.com>
> >> wrote:
> 
> >> > cpufreq_driver->boost->attr))
> >>
> >> Why is this required? Why do we want platforms to add some files
> >> in sysfs?
> >
> > There are two kinds of attributes, which are exported by boost:
> >
> > 1. global boost (/sys/devices/system/cpu/cpufreq/boost)
> >
> > 2. attributes describing cpufreq abilities when boost is available
> > (/sys/devices/syste/cpu/cpu0/cpufreq/):
> >         - scaling_boost_frequencies - which will show over clocked
> >           frequencies
> >         - the scaling_available_frequencies will also display
> > boosted frequency (when boost enabled)
> >
> > Information from 2. is cpufreq_driver dependent. And that
> > information shouldn't been displayed when boost is not available
> 
> This is not how I wanted this to be coded. Lets keep things simple:
> - Implement it in the way cpufreq_freq_attr_scaling_available_freqs
>   is implemented. And then drivers which need to see boost freqs
>   can add it in their attr.

I've added scaling_boost_frequencies to cpufreq_driver attr.

However, I would keep the boost attributes definition in the freq_table
file (as I've proposed in my patch).

> 
> >> > +       policy->boost = cpufreq_boost = cpufreq_driver->boost;
> >>
> >> Why are we copying same pointer to policy->boost? Driver is
> >> passing pointer to a single memory location, just save it globally.
> >
> > This needs some explanation.
> >
> > The sysfs entry presented at [1] doesn't bring any useful
> > information to reuse (like *policy). For this reason the global
> > cpufreq_boost pointer is needed.
> >
> > However to efficiently manage the boost, it is necessary to keep per
> > policy pointer to the only struct cpufreq_boost instance (defined at
> > cpufreq_driver code).
> 
> No we don't need to screw struct cpufreq_policy with it.
> Just need two variables here:
> - cpufreq_driver->boost: If driver supports boost or not.

This will be done as above.

> - If above is true then a global bool variable that will say boost is
>   enabled from sysfs or not.

One global flag will be defined at cpufreq.c to indicate if global
boost sysfs attr has been created.



> 
> >> > +       /* disable boost for newly created policy - as we e.g.
> >> > change
> >> > +          governor */
> >> > +       policy->boost->status = CPUFREQ_BOOST_DIS;
> >>
> >> Drivers supporting boost may want boost to be enabled by default,
> >> maybe without any sysfs calls.
> >
> > This can be done by setting the struct cpufreq_boost status field to
> > CPUFREQ_BOOST_EN at cpufreq driver code (when boost structure is
> > defined)
> 
> This really isn't driver dependent.. But user dependent. Maybe lets
> keep it disabled and people can enable it from sysfs.

The cpufreq_driver struct will have boost_en field. This will allow
keep boost state (it is similar to global boost_enable at
acpi-cpufreq.c).

> 
> >> Why do we need to maintain a list of boost here? notifiers?
> >> complex :(
> >
> > Notifier is needed to disable boost when policy is changed (for
> > example when we change from ondemand/lab to performance governor).
> >
> > I wanted to avoid the situation when boost stays enabled across
> > different governors.
> >
> > The list of in system available policies is defined to allow boost
> > enable/disable for all policies available (by changing for example
> > policy->max field).
> >
> > If we decide, that we will support only one policy (as it is now at
> > e.g. Exynos), the list is unnecessary here.
> 
> What we discussed last in your earlier patchset was:
> - Keep boost feature separate from governors.
Ok.

> - If it is enabled, then any governor can use it (if they want).

Ok, lets do it in this way

> - Lets not disable it if governor is changed. user must do it
> explicitly.

Ok, agree (notifier removed).

> 
> >> > +static int cpufreq_frequency_table_skip_boost(struct
> >> > cpufreq_policy *policy,
> >> > +                                             unsigned int index)
> >> > +{
> >> > +       if (index == CPUFREQ_BOOST)
> >> > +               if (!policy->boost ||
> >>
> >> This shouldn't be true. If index has got CPUFREQ_BOOST, then driver
> >> has to support boost.
> >
> > Correct me if I'm wrong here, but in my understanding the boost
> > shall be only supported when both CPUFREQ_BOOST index is defined in
> > a freq_table and boost.state = CPUFREQ_BOOST_EN is set.
> >
> > Setting of CPUFREQ_BOOST shouldn't by default allow to use over
> > clocking frequency.
> 
> For cpufreq core boost is enabled as soon as cpufreq_driver->boost is
> true. We can have additional checks to see if there is atleast one
> boost frequency but can skip this too.

Checks are needed to read max_normal frequency and max boost frequency
from frequency table.

In exynos cpufreq_driver->init() I will disable boost.

> 
> >> why do we need this?
> >
> > To evaluate the maximal boost frequency from the frequency table.
> > It is then used as a delimiter (when LAB cooperates with thermal
> > framework).
> 
> Introduce this with LAB then.. Lets keep it as simple as possible for
> now. One step at a time.

Sorry, I have LAB in back of my head. For now I'm forgetting about
it :-) [*]

> 
> >> > +struct cpufreq_boost {
> >> > +       unsigned int            max_boost_freq; /* maximum value
> >> > of
> >> > +                                                * boosted freq
> >> > */
> >> > +       unsigned int            max_normal_freq; /* non boost max
> >> > freq */
> >> > +       int                     status; /* status of boost */
> >> > +
> >> > +       /* boost sysfs attributies */
> >> > +       struct freq_attr        **attr;
> >> > +
> >> > +       /* low-level trigger for boost */
> >> > +       int (*low_level_boost) (struct cpufreq_policy *policy,
> >> > int state); +
> >> > +       struct list_head        policies;
> >> > +};
> >>
> >> We don't need it. Just add two more fields to cpufreq_driver:
> >> - have_boost_freqs and low_level_boost (maybe a better name.
> >> What's its use?)
> >
> > The separate struct cpufreq_boost was created to explicitly separate
> > boost fields from cpufreq_driver structure.
> >
> > If in your opinion this structure is redundant, I can remove it and
> > extend cpufreq_driver structure.
> 
> I am not against a structure (as putting related stuff in a struct is
> always better), but against so many fields in it to make things
> complicated.
> 
> I will only keep have_boost_freqs and low_level_boost. Remove
> everything else.

As I've written at other mail. This struct will have only two fields,
so I will embed those fields at cpufreq_driver.

> 
> > *boost pointer is necessary when one wants to enable/disable boost
> > from e.g governor code (which operates mostly on struct
> > cpufreq_policy *policy pointers).
> 
> We don't need to do this. boost can only be disabled from userspace by
> user. No intervention from governor.

Let's got for that option (as I've promissed at [*] :-) ).

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH 2/5] cpufreq:boost: Add support for software based CPU frequency boost
  2013-06-07 14:34             ` Lukasz Majewski
@ 2013-06-07 14:44               ` Viresh Kumar
  0 siblings, 0 replies; 329+ messages in thread
From: Viresh Kumar @ 2013-06-07 14:44 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Lists linaro-kernel

On 7 June 2013 20:04, Lukasz Majewski <l.majewski@samsung.com> wrote:
> After refactoring the code. I admit, that we shall embed the struct
> cpu_boost fields directly to the coufreq_driver. There is no point to
> create structure with 2 fields.

Great!! I will wait for your next version.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH 5/5] cpufreq:boost:Kconfig: Enable boost support at Kconfig
  2013-06-06 15:58   ` Borislav Petkov
@ 2013-06-10 13:20     ` Lukasz Majewski
  2013-06-10 13:22       ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-10 13:20 UTC (permalink / raw)
  To: Borislav Petkov, Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano

Hi,

> On Thu, Jun 06, 2013 at 09:07:52AM +0200, Lukasz Majewski wrote:
> > Enable/disable support for BOOST. New flag - CPU_FREQ_BOOST has been
> > defined for that.
> 
> What's the reason for this? Why would you want to not compile-in the
> boosting code?

I think that this flag could be removed and the "boost" could be
compiled-in permanently.

Viresh, what is your opinion?

> 
> Also, at least on x86, even with this feature disabled, the CPU will
> boost by default unless you fiddle with it through the MSRs as root.
> 

So this is a good argument for removing this flag from Kconfig.


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH 5/5] cpufreq:boost:Kconfig: Enable boost support at Kconfig
  2013-06-10 13:20     ` Lukasz Majewski
@ 2013-06-10 13:22       ` Viresh Kumar
  2013-06-10 13:42         ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-10 13:22 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Borislav Petkov, Rafael J. Wysocky, cpufreq, Linux PM list,
	Vincent Guittot, Jonghwa Lee, Myungjoo Ham, linux-kernel,
	Lukasz Majewski, Andre Przywara, Daniel Lezcano

On 10 June 2013 18:50, Lukasz Majewski <l.majewski@samsung.com> wrote:
> Hi,
>
>> On Thu, Jun 06, 2013 at 09:07:52AM +0200, Lukasz Majewski wrote:
>> > Enable/disable support for BOOST. New flag - CPU_FREQ_BOOST has been
>> > defined for that.
>>
>> What's the reason for this? Why would you want to not compile-in the
>> boosting code?
>
> I think that this flag could be removed and the "boost" could be
> compiled-in permanently.
>
> Viresh, what is your opinion?

Yes, Borislav is correct. I haven't actually reviewed these last patches as
I saw lots of issues with first one :)

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH 5/5] cpufreq:boost:Kconfig: Enable boost support at Kconfig
  2013-06-10 13:22       ` Viresh Kumar
@ 2013-06-10 13:42         ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-10 13:42 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Borislav Petkov, Rafael J. Wysocky, cpufreq, Linux PM list,
	Vincent Guittot, Jonghwa Lee, Myungjoo Ham, linux-kernel,
	Lukasz Majewski, Andre Przywara, Daniel Lezcano

Hi Viresh,

> On 10 June 2013 18:50, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > Hi,
> >
> >> On Thu, Jun 06, 2013 at 09:07:52AM +0200, Lukasz Majewski wrote:
> >> > Enable/disable support for BOOST. New flag - CPU_FREQ_BOOST has
> >> > been defined for that.
> >>
> >> What's the reason for this? Why would you want to not compile-in
> >> the boosting code?
> >
> > I think that this flag could be removed and the "boost" could be
> > compiled-in permanently.
> >
> > Viresh, what is your opinion?
> 
> Yes, Borislav is correct. I haven't actually reviewed these last
> patches as I saw lots of issues with first one :)

Ok, thanks :-)

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* [PATCH v2 0/3] cpufreq:boost: CPU Boost mode support
  2013-06-06  7:07 [PATCH 0/5] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                   ` (4 preceding siblings ...)
  2013-06-06  7:07 ` [PATCH 5/5] cpufreq:boost:Kconfig: Enable boost support at Kconfig Lukasz Majewski
@ 2013-06-11  9:03 ` Lukasz Majewski
  2013-06-11  9:03   ` [PATCH v2 1/3] cpufreq:boost: CPU frequency boost code unification for software and hardware solutions Lukasz Majewski
                     ` (3 more replies)
  2013-06-14  7:38 ` [PATCH v3 " Lukasz Majewski
                   ` (11 subsequent siblings)
  17 siblings, 4 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-11  9:03 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocky
  Cc: cpufreq, Linux PM list, Vincent Guittot, Lukasz Majewski,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

This patch series introduces support for CPU overclocking technique
called Boost.

It is a follow up of a LAB governor proposal. Boost is a LAB component:
http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq

Boost unifies hardware based solution (e.g. Intel Nehalem) with
software oriented one (like the one done at Exynos).
For this reason cpufreq/freq_table code has been reorganized to include
common code.

Important design decisions:

- Boost related code is compiled-in unconditionally and disabled by default
The cpufreq_driver is responsibile for providing low_level_boost callback

- struct cpufreq_driver has been extended with boost related fields

- Boost sysfs attributies are seen only when cpufreq driver supports them.
They will not show up until either cpufreq_driver defines low_level_boost 
callback or device tree's cpufreq "boost_mode" attribute is defined.

- No special spin_lock for Boost was created. The one from cpufreq_driver
was reused.

- Low level boost trigger function (*low_level_boost function callback) is
necessary to "glue" together acpi-cpufreq boost with software based one.



Tested at: HW: 
	Exynos 4412 3.10 linux 
	Exynos 4210 3.10 linux
Compile tested x86_64 defconfig (acpi) - help with HW (Intel Nehalem) test
 needed


Two patches were abandoned (comparing to v1):
[PATCH 1/5] cpufreq: Define cpufreq_set_drv_attr_files() to add per CPU sysfs attributes
[PATCH 5/5] cpufreq:boost:Kconfig: Enable boost support at Kconfig

For detailed changelog please look into relevant patches

Lukasz Majewski (3):
  cpufreq:boost: CPU frequency boost code unification for software and
    hardware solutions
  cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common
    boost solution
  cpufreq:exynos:Extend Exynos cpufreq driver to support boost
    framework

 drivers/cpufreq/acpi-cpufreq.c   |   72 ++++++++++++++------------------------
 drivers/cpufreq/cpufreq.c        |   69 ++++++++++++++++++++++++++++++++++++
 drivers/cpufreq/exynos-cpufreq.c |   49 ++++++++++++++++++++++++--
 drivers/cpufreq/freq_table.c     |   57 ++++++++++++++++++++++++++++--
 include/linux/cpufreq.h          |   12 +++++++
 5 files changed, 209 insertions(+), 50 deletions(-)

-- 
1.7.10.4


^ permalink raw reply	[flat|nested] 329+ messages in thread

* [PATCH v2 1/3] cpufreq:boost: CPU frequency boost code unification for software and hardware solutions
  2013-06-11  9:03 ` [PATCH v2 0/3] cpufreq:boost: CPU Boost mode support Lukasz Majewski
@ 2013-06-11  9:03   ` Lukasz Majewski
  2013-06-12  5:09     ` Viresh Kumar
  2013-06-11  9:03   ` [PATCH v2 2/3] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
                     ` (2 subsequent siblings)
  3 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-11  9:03 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocky
  Cc: cpufreq, Linux PM list, Vincent Guittot, Lukasz Majewski,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

This commit adds support for software based frequency boosting.
Some SoC (like Exynos4 - e.g. 4x12) allow setting frequency above
its normal condition limits. Such a change shall be only done for a short
time.

Overclocking (boost) support is essentially provided by platform
dependent cpufreq driver.

This commit unifies support for SW and HW (Intel) over clocking solutions
in the core cpufreq driver. Previously the "boost" sysfs attribute was
defined at acpi driver code.
By default boost is disabled. One global attribute is available at:
/sys/devices/system/cpu/cpufreq/boost.
It only shows up when cpufreq driver supports overclocking.
Under the hood frequencies dedicated for boosting are marked with a
special flag (CPUFREQ_BOOST_FREQ) at driver's frequency table.
It is the user's concern to enable/disable overclocking with proper call to
sysfs.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v2:
- Removal of cpufreq_boost structure and move its fields to cpufreq_driver
  structure
- Flag to indicate if global boost attribute is already defined
- Extent the pr_{err|debbug} functions to show current function names
---
 drivers/cpufreq/cpufreq.c    |   69 ++++++++++++++++++++++++++++++++++++++++++
 drivers/cpufreq/freq_table.c |   57 ++++++++++++++++++++++++++++++++--
 include/linux/cpufreq.h      |   12 ++++++++
 3 files changed, 136 insertions(+), 2 deletions(-)

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 1b8a48e..98ba5f1 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -40,6 +40,7 @@
  * also protects the cpufreq_cpu_data array.
  */
 static struct cpufreq_driver *cpufreq_driver;
+static bool cpufreq_boost_sysfs_defined;
 static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data);
 #ifdef CONFIG_HOTPLUG_CPU
 /* This one keeps track of the previously set governor of a removed CPU */
@@ -315,6 +316,33 @@ EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
 /*********************************************************************
  *                          SYSFS INTERFACE                          *
  *********************************************************************/
+ssize_t show_boost_status(struct kobject *kobj,
+				 struct attribute *attr, char *buf)
+{
+	return sprintf(buf, "%d\n", cpufreq_driver->boost_en);
+}
+
+static ssize_t store_boost_status(struct kobject *kobj, struct attribute *attr,
+				  const char *buf, size_t count)
+{
+	int ret, enable;
+
+	ret = sscanf(buf, "%d", &enable);
+	if (ret != 1 || enable < 0 || enable > 1)
+		return -EINVAL;
+
+	if (cpufreq_boost_trigger_state(enable)) {
+		pr_err("%s: Cannot %sable boost!\n", __func__,
+		       enable ? "en" : "dis");
+		return -EINVAL;
+	}
+
+	return count;
+}
+
+static struct global_attr global_boost = __ATTR(boost, 0644,
+						show_boost_status,
+						store_boost_status);
 
 static struct cpufreq_governor *__find_governor(const char *str_governor)
 {
@@ -754,6 +782,17 @@ static int cpufreq_add_dev_interface(unsigned int cpu,
 			goto err_out_kobj_put;
 		drv_attr++;
 	}
+	if (cpufreq_driver->low_level_boost && !cpufreq_boost_sysfs_defined) {
+		ret = sysfs_create_file(cpufreq_global_kobject,
+					&(global_boost.attr));
+		if (ret) {
+			pr_err("%s: cannot register global boost sysfs file\n",
+				__func__);
+			goto err_out_kobj_put;
+		}
+		cpufreq_boost_sysfs_defined = 1;
+	}
+
 	if (cpufreq_driver->get) {
 		ret = sysfs_create_file(&policy->kobj, &cpuinfo_cur_freq.attr);
 		if (ret)
@@ -1853,6 +1892,30 @@ static struct notifier_block __refdata cpufreq_cpu_notifier = {
 };
 
 /*********************************************************************
+ *               BOOST						     *
+ *********************************************************************/
+int cpufreq_boost_trigger_state(int state)
+{
+	int ret = 0;
+
+	if (!cpufreq_driver->low_level_boost)
+		return -ENODEV;
+
+	if (cpufreq_driver->boost_en != state) {
+		ret = cpufreq_driver->low_level_boost(state);
+		if (ret) {
+			pr_err("%s: BOOST cannot %sable low level code (%d)\n",
+			       __func__, state ? "en" : "dis", ret);
+			return ret;
+		}
+	}
+
+	pr_debug("%s: cpufreq BOOST %sabled\n", __func__, state ? "en" : "dis");
+
+	return 0;
+}
+
+/*********************************************************************
  *               REGISTER / UNREGISTER CPUFREQ DRIVER                *
  *********************************************************************/
 
@@ -1947,6 +2010,12 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
 	pr_debug("unregistering driver %s\n", driver->name);
 
 	subsys_interface_unregister(&cpufreq_interface);
+
+	if (cpufreq_driver->low_level_boost && cpufreq_boost_sysfs_defined) {
+		sysfs_remove_file(cpufreq_global_kobject, &(global_boost.attr));
+		cpufreq_boost_sysfs_defined = 0;
+	}
+
 	unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
 
 	write_lock_irqsave(&cpufreq_driver_lock, flags);
diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c
index d7a7966..4e4f692 100644
--- a/drivers/cpufreq/freq_table.c
+++ b/drivers/cpufreq/freq_table.c
@@ -20,6 +20,27 @@
  *                     FREQUENCY TABLE HELPERS                       *
  *********************************************************************/
 
+unsigned int
+cpufreq_frequency_table_max(struct cpufreq_frequency_table *freq_table,
+			    int boost)
+{
+	int i = 0, boost_freq_max = 0, freq_max = 0;
+
+	for (; freq_table[i].frequency != CPUFREQ_TABLE_END; i++) {
+		if (freq_table[i].index == CPUFREQ_BOOST_FREQ) {
+			if (freq_table[i].frequency > boost_freq_max)
+				boost_freq_max = freq_table[i].frequency;
+		} else {
+			if (freq_table[i].frequency > freq_max)
+				freq_max = freq_table[i].frequency;
+		}
+	}
+
+	return boost ? boost_freq_max : freq_max;
+
+}
+EXPORT_SYMBOL_GPL(cpufreq_frequency_table_max);
+
 int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
 				    struct cpufreq_frequency_table *table)
 {
@@ -171,7 +192,8 @@ static DEFINE_PER_CPU(struct cpufreq_frequency_table *, cpufreq_show_table);
 /**
  * show_available_freqs - show available frequencies for the specified CPU
  */
-static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
+static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf,
+				    int show_boost)
 {
 	unsigned int i = 0;
 	unsigned int cpu = policy->cpu;
@@ -186,22 +208,53 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
 	for (i = 0; (table[i].frequency != CPUFREQ_TABLE_END); i++) {
 		if (table[i].frequency == CPUFREQ_ENTRY_INVALID)
 			continue;
+		if (show_boost)
+			if (table[i].index != CPUFREQ_BOOST_FREQ)
+				continue;
+
 		count += sprintf(&buf[count], "%d ", table[i].frequency);
 	}
 	count += sprintf(&buf[count], "\n");
 
 	return count;
+}
 
+/**
+ * show_available_normal_freqs - show normal boost frequencies for
+ * the specified CPU
+ */
+static ssize_t show_available_normal_freqs(struct cpufreq_policy *policy,
+					   char *buf)
+{
+	return show_available_freqs(policy, buf, 0);
 }
 
 struct freq_attr cpufreq_freq_attr_scaling_available_freqs = {
 	.attr = { .name = "scaling_available_frequencies",
 		  .mode = 0444,
 		},
-	.show = show_available_freqs,
+	.show = show_available_normal_freqs,
 };
 EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_available_freqs);
 
+/**
+ * show_available_boost_freqs - show available boost frequencies for
+ * the specified CPU
+ */
+static ssize_t show_available_boost_freqs(struct cpufreq_policy *policy,
+					  char *buf)
+{
+	return show_available_freqs(policy, buf, 1);
+}
+
+struct freq_attr cpufreq_freq_attr_boost_available_freqs = {
+	.attr = { .name = "scaling_boost_frequencies",
+		  .mode = 0444,
+		},
+	.show = show_available_boost_freqs,
+};
+EXPORT_SYMBOL_GPL(cpufreq_freq_attr_boost_available_freqs);
+
 /*
  * if you use these, you must assure that the frequency table is valid
  * all the time between get_attr and put_attr!
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index 037d36a..d045da2 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -262,6 +262,10 @@ struct cpufreq_driver {
 	int	(*suspend)	(struct cpufreq_policy *policy);
 	int	(*resume)	(struct cpufreq_policy *policy);
 	struct freq_attr	**attr;
+
+	/* platform specific boost support code */
+	bool                    boost_en;
+	int (*low_level_boost)  (int state);
 };
 
 /* flags */
@@ -403,6 +407,9 @@ extern struct cpufreq_governor cpufreq_gov_conservative;
 #define CPUFREQ_ENTRY_INVALID ~0
 #define CPUFREQ_TABLE_END     ~1
 
+/* Define index for boost frequency */
+#define CPUFREQ_BOOST_FREQ    ~2
+
 struct cpufreq_frequency_table {
 	unsigned int	index;     /* any */
 	unsigned int	frequency; /* kHz - doesn't need to be in ascending
@@ -421,11 +428,16 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
 				   unsigned int relation,
 				   unsigned int *index);
 
+unsigned int
+cpufreq_frequency_table_max(struct cpufreq_frequency_table *freq_table, int);
+int cpufreq_boost_trigger_state(int state);
+
 /* the following 3 funtions are for cpufreq core use only */
 struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu);
 
 /* the following are really really optional */
 extern struct freq_attr cpufreq_freq_attr_scaling_available_freqs;
+extern struct freq_attr cpufreq_freq_attr_boost_available_freqs;
 
 void cpufreq_frequency_table_get_attr(struct cpufreq_frequency_table *table,
 				      unsigned int cpu);
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v2 2/3] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution
  2013-06-11  9:03 ` [PATCH v2 0/3] cpufreq:boost: CPU Boost mode support Lukasz Majewski
  2013-06-11  9:03   ` [PATCH v2 1/3] cpufreq:boost: CPU frequency boost code unification for software and hardware solutions Lukasz Majewski
@ 2013-06-11  9:03   ` Lukasz Majewski
  2013-06-11  9:03   ` [PATCH v2 3/3] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
  2013-06-12  5:15   ` [PATCH v2 0/3] cpufreq:boost: CPU Boost mode support Viresh Kumar
  3 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-11  9:03 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocky
  Cc: cpufreq, Linux PM list, Vincent Guittot, Lukasz Majewski,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

The Intel's hardware based boost solution driver has been changed to cooperate with
common cpufreq boost framework.

The global sysfs boost attribute entry code (/sys/devices/system/cpu/cpufreq/boost)
has been moved to a core cpufreq code. This attribute is now only visible,
when cpufreq driver supports it.
Global flags (boost_enabled and boost_supported) were replaced with boost_en
flag and low_level_boost pointer presence at cpufreq driver structure.

The _store_boost() function has been redesigned to be used as low_level_boost
callback.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v2:
- Replace boost_enabled and boost_supported global flags with proper entries
at struct cpufreq_driver.
- Removal of struct cpufreq_boost
---
 drivers/cpufreq/acpi-cpufreq.c |   72 +++++++++++++++-------------------------
 1 file changed, 26 insertions(+), 46 deletions(-)

diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c
index 11b8b4b..a15c999 100644
--- a/drivers/cpufreq/acpi-cpufreq.c
+++ b/drivers/cpufreq/acpi-cpufreq.c
@@ -80,7 +80,6 @@ static struct acpi_processor_performance __percpu *acpi_perf_data;
 static struct cpufreq_driver acpi_cpufreq_driver;
 
 static unsigned int acpi_pstate_strict;
-static bool boost_enabled, boost_supported;
 static struct msr __percpu *msrs;
 
 static bool boost_state(unsigned int cpu)
@@ -133,20 +132,11 @@ static void boost_set_msrs(bool enable, const struct cpumask *cpumask)
 	wrmsr_on_cpus(cpumask, msr_addr, msrs);
 }
 
-static ssize_t _store_boost(const char *buf, size_t count)
+static int _store_boost(int val)
 {
-	int ret;
-	unsigned long val = 0;
-
-	if (!boost_supported)
-		return -EINVAL;
-
-	ret = kstrtoul(buf, 10, &val);
-	if (ret || (val > 1))
-		return -EINVAL;
-
-	if ((val && boost_enabled) || (!val && !boost_enabled))
-		return count;
+	if ((val && acpi_cpufreq_driver.boost_en) ||
+	    (!val && !acpi_cpufreq_driver.boost_en))
+		return 0;
 
 	get_online_cpus();
 
@@ -154,38 +144,39 @@ static ssize_t _store_boost(const char *buf, size_t count)
 
 	put_online_cpus();
 
-	boost_enabled = val;
+	acpi_cpufreq_driver.boost_en = val;
 	pr_debug("Core Boosting %sabled.\n", val ? "en" : "dis");
 
-	return count;
+	return 0;
 }
 
-static ssize_t store_global_boost(struct kobject *kobj, struct attribute *attr,
-				  const char *buf, size_t count)
+static ssize_t store_boost(const char *buf, size_t count)
 {
-	return _store_boost(buf, count);
-}
+	int ret;
+	unsigned long val = 0;
 
-static ssize_t show_global_boost(struct kobject *kobj,
-				 struct attribute *attr, char *buf)
-{
-	return sprintf(buf, "%u\n", boost_enabled);
-}
+	if (!acpi_cpufreq_driver.low_level_boost)
+		return -EINVAL;
+
+	ret = kstrtoul(buf, 10, &val);
+	if (ret || (val > 1))
+		return -EINVAL;
 
-static struct global_attr global_boost = __ATTR(boost, 0644,
-						show_global_boost,
-						store_global_boost);
+	_store_boost((int) val);
+
+	return count;
+}
 
 #ifdef CONFIG_X86_ACPI_CPUFREQ_CPB
 static ssize_t store_cpb(struct cpufreq_policy *policy, const char *buf,
 			 size_t count)
 {
-	return _store_boost(buf, count);
+	return store_boost(buf, count);
 }
 
 static ssize_t show_cpb(struct cpufreq_policy *policy, char *buf)
 {
-	return sprintf(buf, "%u\n", boost_enabled);
+	return sprintf(buf, "%u\n", acpi_cpufreq_driver.boost_en);
 }
 
 static struct freq_attr cpb = __ATTR(cpb, 0644, show_cpb, store_cpb);
@@ -571,7 +562,7 @@ static int boost_notify(struct notifier_block *nb, unsigned long action,
 	switch (action) {
 	case CPU_UP_PREPARE:
 	case CPU_UP_PREPARE_FROZEN:
-		boost_set_msrs(boost_enabled, cpumask);
+		boost_set_msrs(acpi_cpufreq_driver.boost_en, cpumask);
 		break;
 
 	case CPU_DOWN_PREPARE:
@@ -930,33 +921,22 @@ static void __init acpi_cpufreq_boost_init(void)
 		if (!msrs)
 			return;
 
-		boost_supported = true;
-		boost_enabled = boost_state(0);
+		acpi_cpufreq_driver.low_level_boost = &_store_boost;
+		acpi_cpufreq_driver.boost_en = boost_state(0);
 
 		get_online_cpus();
 
 		/* Force all MSRs to the same value */
-		boost_set_msrs(boost_enabled, cpu_online_mask);
+		boost_set_msrs(acpi_cpufreq_driver.boost_en, cpu_online_mask);
 
 		register_cpu_notifier(&boost_nb);
 
 		put_online_cpus();
-	} else
-		global_boost.attr.mode = 0444;
-
-	/* We create the boost file in any case, though for systems without
-	 * hardware support it will be read-only and hardwired to return 0.
-	 */
-	if (sysfs_create_file(cpufreq_global_kobject, &(global_boost.attr)))
-		pr_warn(PFX "could not register global boost sysfs file\n");
-	else
-		pr_debug("registered global boost sysfs file\n");
+	}
 }
 
 static void __exit acpi_cpufreq_boost_exit(void)
 {
-	sysfs_remove_file(cpufreq_global_kobject, &(global_boost.attr));
-
 	if (msrs) {
 		unregister_cpu_notifier(&boost_nb);
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v2 3/3] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework
  2013-06-11  9:03 ` [PATCH v2 0/3] cpufreq:boost: CPU Boost mode support Lukasz Majewski
  2013-06-11  9:03   ` [PATCH v2 1/3] cpufreq:boost: CPU frequency boost code unification for software and hardware solutions Lukasz Majewski
  2013-06-11  9:03   ` [PATCH v2 2/3] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
@ 2013-06-11  9:03   ` Lukasz Majewski
  2013-06-26 11:05     ` Viresh Kumar
  2013-06-12  5:15   ` [PATCH v2 0/3] cpufreq:boost: CPU Boost mode support Viresh Kumar
  3 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-11  9:03 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocky
  Cc: cpufreq, Linux PM list, Vincent Guittot, Lukasz Majewski,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

The struct cpufreq_driver has been extended to embrace the information
related to boost support.

When "boost_mode" device tree attribute is defined for a platform, the
low_level_boost pointer is filled with proper address. The
.low_level_boost field filled to NULL, indicates that boost is not
supported.

Operations of exynos_cpufreq_boost_trigger() function are protected with
"local" mutex.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v2:
- Removal of struct cpufreq_boost
- Removal of the CONFIG_CPU_FREQ_BOOST flag
- low_level_boost with valid address when boost is supported
---
 drivers/cpufreq/exynos-cpufreq.c |   49 ++++++++++++++++++++++++++++++++++++--
 1 file changed, 47 insertions(+), 2 deletions(-)

diff --git a/drivers/cpufreq/exynos-cpufreq.c b/drivers/cpufreq/exynos-cpufreq.c
index 3197d88..8cf5636 100644
--- a/drivers/cpufreq/exynos-cpufreq.c
+++ b/drivers/cpufreq/exynos-cpufreq.c
@@ -33,6 +33,7 @@ static struct cpufreq_freqs freqs;
 static unsigned int locking_frequency;
 static bool frequency_locked;
 static DEFINE_MUTEX(cpufreq_lock);
+static struct cpufreq_cpuinfo *cpufreq_cpu_info;
 
 static int exynos_verify_speed(struct cpufreq_policy *policy)
 {
@@ -154,6 +155,7 @@ out:
 	return ret;
 }
 
+static struct cpufreq_driver exynos_driver;
 static int exynos_target(struct cpufreq_policy *policy,
 			  unsigned int target_freq,
 			  unsigned int relation)
@@ -244,6 +246,9 @@ static struct notifier_block exynos_cpufreq_nb = {
 
 static int exynos_cpufreq_cpu_init(struct cpufreq_policy *policy)
 {
+	unsigned int max_freq;
+	int ret;
+
 	policy->cur = policy->min = policy->max = exynos_getspeed(policy->cpu);
 
 	cpufreq_frequency_table_get_attr(exynos_info->freq_table, policy->cpu);
@@ -253,7 +258,19 @@ static int exynos_cpufreq_cpu_init(struct cpufreq_policy *policy)
 
 	cpumask_setall(policy->cpus);
 
-	return cpufreq_frequency_table_cpuinfo(policy, exynos_info->freq_table);
+	ret = cpufreq_frequency_table_cpuinfo(policy, exynos_info->freq_table);
+	if (ret)
+		return ret;
+
+	if (exynos_driver.low_level_boost) {
+		/* disable boost by default */
+		max_freq = cpufreq_frequency_table_max(exynos_info->freq_table,
+						       0);
+		policy->cpuinfo.max_freq = policy->max = max_freq;
+		cpufreq_cpu_info = &policy->cpuinfo;
+	}
+
+	return 0;
 }
 
 static int exynos_cpufreq_cpu_exit(struct cpufreq_policy *policy)
@@ -264,9 +281,32 @@ static int exynos_cpufreq_cpu_exit(struct cpufreq_policy *policy)
 
 static struct freq_attr *exynos_cpufreq_attr[] = {
 	&cpufreq_freq_attr_scaling_available_freqs,
+	&cpufreq_freq_attr_boost_available_freqs,
 	NULL,
 };
 
+static int exynos_cpufreq_boost_trigger(int state)
+{
+	struct cpufreq_policy *policy = container_of(cpufreq_cpu_info,
+						     struct cpufreq_policy,
+						     cpuinfo);
+	unsigned int max_freq;
+
+	mutex_lock(&cpufreq_lock);
+	exynos_driver.boost_en = state;
+
+	/* Recalculate maximal frequency */
+	max_freq = cpufreq_frequency_table_max(exynos_info->freq_table,
+					       exynos_driver.boost_en);
+
+	if (policy->max != max_freq)
+		policy->cpuinfo.max_freq = policy->max = max_freq;
+
+	mutex_unlock(&cpufreq_lock);
+
+	return 0;
+}
+
 static struct cpufreq_driver exynos_driver = {
 	.flags		= CPUFREQ_STICKY,
 	.verify		= exynos_verify_speed,
@@ -275,7 +315,7 @@ static struct cpufreq_driver exynos_driver = {
 	.init		= exynos_cpufreq_cpu_init,
 	.exit		= exynos_cpufreq_cpu_exit,
 	.name		= "exynos_cpufreq",
-	.attr		= exynos_cpufreq_attr,
+	.attr	= exynos_cpufreq_attr,
 #ifdef CONFIG_PM
 	.suspend	= exynos_cpufreq_suspend,
 	.resume		= exynos_cpufreq_resume,
@@ -359,6 +399,8 @@ static struct of_device_id exynos_cpufreq_of_match[] __initconst = {
 
 static int __init exynos_cpufreq_probe(struct platform_device *pdev)
 {
+	struct device_node *node = pdev->dev.of_node;
+
 	int ret = -EINVAL;
 
 	exynos_info = kzalloc(sizeof(struct exynos_dvfs_info), GFP_KERNEL);
@@ -391,6 +433,9 @@ static int __init exynos_cpufreq_probe(struct platform_device *pdev)
 	}
 
 	locking_frequency = exynos_getspeed(0);
+	if (of_property_read_bool(node, "boost_mode"))
+		exynos_driver.low_level_boost =
+			&exynos_cpufreq_boost_trigger;
 
 	register_pm_notifier(&exynos_cpufreq_nb);
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* Re: [PATCH v2 1/3] cpufreq:boost: CPU frequency boost code unification for software and hardware solutions
  2013-06-11  9:03   ` [PATCH v2 1/3] cpufreq:boost: CPU frequency boost code unification for software and hardware solutions Lukasz Majewski
@ 2013-06-12  5:09     ` Viresh Kumar
  2013-06-12  7:39       ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-12  5:09 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

Hi,

Change subject to: "cpufreq: Add boost frequency support in core"

On 11 June 2013 14:33, Lukasz Majewski <l.majewski@samsung.com> wrote:
> This commit adds support for software based frequency boosting.

No. It adds support for both software and hardware boosting. So just
write: This commit adds boost frequency support in cpufreq core (Hardware
& Software).

> Some SoC (like Exynos4 - e.g. 4x12) allow setting frequency above
> its normal condition limits. Such a change shall be only done for a short

s/condition/operation
s/change/mode
s/done/used

> time.
>
> Overclocking (boost) support is essentially provided by platform
> dependent cpufreq driver.
>
> This commit unifies support for SW and HW (Intel) over clocking solutions
> in the core cpufreq driver. Previously the "boost" sysfs attribute was
> defined at acpi driver code.
> By default boost is disabled. One global attribute is available at:
> /sys/devices/system/cpu/cpufreq/boost.

Enter a blank line here.

> It only shows up when cpufreq driver supports overclocking.
> Under the hood frequencies dedicated for boosting are marked with a
> special flag (CPUFREQ_BOOST_FREQ) at driver's frequency table.
> It is the user's concern to enable/disable overclocking with proper call to
> sysfs.

Good.

> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
>
> ---
> Changes for v2:
> - Removal of cpufreq_boost structure and move its fields to cpufreq_driver
>   structure
> - Flag to indicate if global boost attribute is already defined
> - Extent the pr_{err|debbug} functions to show current function names
> ---

You don't have to manually add "---" here. Just keep a blank line instead.

>  drivers/cpufreq/cpufreq.c    |   69 ++++++++++++++++++++++++++++++++++++++++++
>  drivers/cpufreq/freq_table.c |   57 ++++++++++++++++++++++++++++++++--
>  include/linux/cpufreq.h      |   12 ++++++++
>  3 files changed, 136 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> index 1b8a48e..98ba5f1 100644
> --- a/drivers/cpufreq/cpufreq.c
> +++ b/drivers/cpufreq/cpufreq.c
> @@ -40,6 +40,7 @@
>   * also protects the cpufreq_cpu_data array.
>   */
>  static struct cpufreq_driver *cpufreq_driver;
> +static bool cpufreq_boost_sysfs_defined;
>  static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data);
>  #ifdef CONFIG_HOTPLUG_CPU
>  /* This one keeps track of the previously set governor of a removed CPU */
> @@ -315,6 +316,33 @@ EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
>  /*********************************************************************
>   *                          SYSFS INTERFACE                          *
>   *********************************************************************/
> +ssize_t show_boost_status(struct kobject *kobj,
> +                                struct attribute *attr, char *buf)
> +{
> +       return sprintf(buf, "%d\n", cpufreq_driver->boost_en);

This isn't correct. It shows if cpufreq driver supports boost or
not and it should show if boost is enabled from sysfs when
cpufreq driver supports boost.

> +}
> +
> +static ssize_t store_boost_status(struct kobject *kobj, struct attribute *attr,
> +                                 const char *buf, size_t count)
> +{
> +       int ret, enable;
> +
> +       ret = sscanf(buf, "%d", &enable);
> +       if (ret != 1 || enable < 0 || enable > 1)
> +               return -EINVAL;
> +
> +       if (cpufreq_boost_trigger_state(enable)) {
> +               pr_err("%s: Cannot %sable boost!\n", __func__,
> +                      enable ? "en" : "dis");

%sable doesn't look very much readable. Use complete strings:
"enable" and "disable".

> +               return -EINVAL;
> +       }
> +
> +       return count;
> +}
> +
> +static struct global_attr global_boost = __ATTR(boost, 0644,
> +                                               show_boost_status,
> +                                               store_boost_status);

User define_one_global_rw.

>  static struct cpufreq_governor *__find_governor(const char *str_governor)
>  {
> @@ -754,6 +782,17 @@ static int cpufreq_add_dev_interface(unsigned int cpu,

Why not do this in cpufreq_register_driver()?

>                         goto err_out_kobj_put;
>                 drv_attr++;
>         }
> +       if (cpufreq_driver->low_level_boost && !cpufreq_boost_sysfs_defined) {

I thought low_level_boost() is a function which will only be supported
for drivers
using hardware boost feature, like intel. And so we must have used boost_en
here.

> +               ret = sysfs_create_file(cpufreq_global_kobject,
> +                                       &(global_boost.attr));

cpufreq_sysfs_create_file(), check 2361be23666232dbb4851a527f466c4cbf5340fc
for details.

> +               if (ret) {
> +                       pr_err("%s: cannot register global boost sysfs file\n",
> +                               __func__);
> +                       goto err_out_kobj_put;
> +               }
> +               cpufreq_boost_sysfs_defined = 1;
> +       }
> +
>         if (cpufreq_driver->get) {
>                 ret = sysfs_create_file(&policy->kobj, &cpuinfo_cur_freq.attr);
>                 if (ret)
> @@ -1853,6 +1892,30 @@ static struct notifier_block __refdata cpufreq_cpu_notifier = {
>  };
>
>  /*********************************************************************
> + *               BOOST                                              *
> + *********************************************************************/
> +int cpufreq_boost_trigger_state(int state)
> +{
> +       int ret = 0;
> +
> +       if (!cpufreq_driver->low_level_boost)
> +               return -ENODEV;

I am certainly not aligned with your design. What's the
use of this field? And please update documentation too for these
new entries in cpufreq_driver structure.

> +       if (cpufreq_driver->boost_en != state) {

So, you are using boost_en to see if boost is enabled from sysfs?
Then you have put it at wrong place.

I thought there would be three variables:
- cpufreq_driver->boost_supported: boost is enabled for driver
- cpufreq_driver->low_level_boost(): to set desired boost state
(Only for hardware boosting)
- boost_enabled: global variable in cpufreq.c file, used only if
cpufreq_driver->boost_supported is true.


> diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c
> index d7a7966..4e4f692 100644
> --- a/drivers/cpufreq/freq_table.c
> +++ b/drivers/cpufreq/freq_table.c
> @@ -20,6 +20,27 @@
>   *                     FREQUENCY TABLE HELPERS                       *
>   *********************************************************************/
>
> +unsigned int
> +cpufreq_frequency_table_max(struct cpufreq_frequency_table *freq_table,
> +                           int boost)
> +{
> +       int i = 0, boost_freq_max = 0, freq_max = 0;
> +
> +       for (; freq_table[i].frequency != CPUFREQ_TABLE_END; i++) {
> +               if (freq_table[i].index == CPUFREQ_BOOST_FREQ) {
> +                       if (freq_table[i].frequency > boost_freq_max)
> +                               boost_freq_max = freq_table[i].frequency;

Do above only when boost==true and below when boost==false.

> +               } else {
> +                       if (freq_table[i].frequency > freq_max)
> +                               freq_max = freq_table[i].frequency;
> +               }
> +       }
> +
> +       return boost ? boost_freq_max : freq_max;
> +
> +}
> +EXPORT_SYMBOL_GPL(cpufreq_frequency_table_max);
> +
>  int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
>                                     struct cpufreq_frequency_table *table)
>  {
> @@ -171,7 +192,8 @@ static DEFINE_PER_CPU(struct cpufreq_frequency_table *, cpufreq_show_table);
>  /**
>   * show_available_freqs - show available frequencies for the specified CPU
>   */
> -static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
> +static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf,
> +                                   int show_boost)
>  {
>         unsigned int i = 0;
>         unsigned int cpu = policy->cpu;
> @@ -186,22 +208,53 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
>         for (i = 0; (table[i].frequency != CPUFREQ_TABLE_END); i++) {
>                 if (table[i].frequency == CPUFREQ_ENTRY_INVALID)
>                         continue;
> +               if (show_boost)
> +                       if (table[i].index != CPUFREQ_BOOST_FREQ)
> +                               continue;
> +

Looks wrong. You will show boost freqs when show_boost is false.

>                 count += sprintf(&buf[count], "%d ", table[i].frequency);
>         }
>         count += sprintf(&buf[count], "\n");
>
>         return count;
> +}
>
> +/**
> + * show_available_normal_freqs - show normal boost frequencies for
> + * the specified CPU
> + */
> +static ssize_t show_available_normal_freqs(struct cpufreq_policy *policy,
> +                                          char *buf)
> +{
> +       return show_available_freqs(policy, buf, 0);
>  }
>
>  struct freq_attr cpufreq_freq_attr_scaling_available_freqs = {
>         .attr = { .name = "scaling_available_frequencies",
>                   .mode = 0444,
>                 },
> -       .show = show_available_freqs,
> +       .show = show_available_normal_freqs,
>  };
>  EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_available_freqs);
>
> +/**
> + * show_available_boost_freqs - show available boost frequencies for
> + * the specified CPU
> + */
> +static ssize_t show_available_boost_freqs(struct cpufreq_policy *policy,
> +                                         char *buf)
> +{
> +       return show_available_freqs(policy, buf, 1);
> +}
> +
> +struct freq_attr cpufreq_freq_attr_boost_available_freqs = {
> +       .attr = { .name = "scaling_boost_frequencies",
> +                 .mode = 0444,
> +               },
> +       .show = show_available_boost_freqs,
> +};
> +EXPORT_SYMBOL_GPL(cpufreq_freq_attr_boost_available_freqs);
> +

Code redundancy can be reduced by creating a macro for declaring
**_availabe_freqs, its attributes and export symbol.

>  /*
>   * if you use these, you must assure that the frequency table is valid
>   * all the time between get_attr and put_attr!

With this patch alone, we would be using boost frequencies even in
normal cases where we haven't enabled boost.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v2 0/3] cpufreq:boost: CPU Boost mode support
  2013-06-11  9:03 ` [PATCH v2 0/3] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                     ` (2 preceding siblings ...)
  2013-06-11  9:03   ` [PATCH v2 3/3] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
@ 2013-06-12  5:15   ` Viresh Kumar
  2013-06-12  6:00     ` Lukasz Majewski
  3 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-12  5:15 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

On 11 June 2013 14:33, Lukasz Majewski <l.majewski@samsung.com> wrote:
> This patch series introduces support for CPU overclocking technique
> called Boost.
>
> It is a follow up of a LAB governor proposal. Boost is a LAB component:
> http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq
>
> Boost unifies hardware based solution (e.g. Intel Nehalem) with
> software oriented one (like the one done at Exynos).
> For this reason cpufreq/freq_table code has been reorganized to include
> common code.

To be honest, I haven't given a review to patches 2/3 and 3/3 as I am
concerned more about 1/3.

Maybe you can just send v3 of 1/3. 2/3 and 3/3 can be sent when we have
finalized 2/3 and 3/3 's version.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v2 0/3] cpufreq:boost: CPU Boost mode support
  2013-06-12  5:15   ` [PATCH v2 0/3] cpufreq:boost: CPU Boost mode support Viresh Kumar
@ 2013-06-12  6:00     ` Lukasz Majewski
  2013-06-12  6:05       ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-12  6:00 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

Hi Viresh,

> On 11 June 2013 14:33, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > This patch series introduces support for CPU overclocking technique
> > called Boost.
> >
> > It is a follow up of a LAB governor proposal. Boost is a LAB
> > component:
> > http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq
> >
> > Boost unifies hardware based solution (e.g. Intel Nehalem) with
> > software oriented one (like the one done at Exynos).
> > For this reason cpufreq/freq_table code has been reorganized to
> > include common code.
> 
> To be honest, I haven't given a review to patches 2/3 and 3/3 as I am
> concerned more about 1/3.

As you pointed out in the other mail 1/3 has its own issues, but I
think that patches 2/3 and 3/3 are an integral part of the boost
support and bring better overall overview to the design.

> 
> Maybe you can just send v3 of 1/3. 2/3 and 3/3 can be sent when we
> have finalized 2/3 and 3/3 's version.

I'd opt for sending the whole patchset (it shouldn't be so difficult to
adjust those patches), since it is easier for me to test.



-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v2 0/3] cpufreq:boost: CPU Boost mode support
  2013-06-12  6:00     ` Lukasz Majewski
@ 2013-06-12  6:05       ` Viresh Kumar
  0 siblings, 0 replies; 329+ messages in thread
From: Viresh Kumar @ 2013-06-12  6:05 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

On 12 June 2013 11:30, Lukasz Majewski <l.majewski@samsung.com> wrote:
> As you pointed out in the other mail 1/3 has its own issues, but I
> think that patches 2/3 and 3/3 are an integral part of the boost
> support and bring better overall overview to the design.

Yes they are. Undoubtedly.

>> Maybe you can just send v3 of 1/3. 2/3 and 3/3 can be sent when we
>> have finalized 2/3 and 3/3 's version.
>
> I'd opt for sending the whole patchset (it shouldn't be so difficult to
> adjust those patches), since it is easier for me to test.

Okay.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v2 1/3] cpufreq:boost: CPU frequency boost code unification for software and hardware solutions
  2013-06-12  5:09     ` Viresh Kumar
@ 2013-06-12  7:39       ` Lukasz Majewski
  2013-06-12  8:09         ` Viresh Kumar
  2013-06-12 11:23         ` Rafael J. Wysocki
  0 siblings, 2 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-12  7:39 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

Hi Viresh,

> Hi,
> 
> Change subject to: "cpufreq: Add boost frequency support in core"

Ok.

> 
> On 11 June 2013 14:33, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > This commit adds support for software based frequency boosting.
> 
> No. It adds support for both software and hardware boosting. So just
> write: This commit adds boost frequency support in cpufreq core
> (Hardware & Software).

Ok.
> 
> > Some SoC (like Exynos4 - e.g. 4x12) allow setting frequency above
> > its normal condition limits. Such a change shall be only done for a
> > short
> 
> s/condition/operation
> s/change/mode
> s/done/used
> 

Ok.

> > time.
> >
> > Overclocking (boost) support is essentially provided by platform
> > dependent cpufreq driver.
> >
> > This commit unifies support for SW and HW (Intel) over clocking
> > solutions in the core cpufreq driver. Previously the "boost" sysfs
> > attribute was defined at acpi driver code.
> > By default boost is disabled. One global attribute is available at:
> > /sys/devices/system/cpu/cpufreq/boost.
> 
> Enter a blank line here.

Ok

> 
> > It only shows up when cpufreq driver supports overclocking.
> > Under the hood frequencies dedicated for boosting are marked with a
> > special flag (CPUFREQ_BOOST_FREQ) at driver's frequency table.
> > It is the user's concern to enable/disable overclocking with proper
> > call to sysfs.
> 
> Good.
> 
> > Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> > Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> >
> > --- 
    ^^^^
[*] this --- was added manually by me.

> > Changes for v2:
> > - Removal of cpufreq_boost structure and move its fields to
> > cpufreq_driver structure
> > - Flag to indicate if global boost attribute is already defined
> > - Extent the pr_{err|debbug} functions to show current function
> > names ---
> 
> You don't have to manually add "---" here. Just keep a blank line
> instead.

One "---" is added by git automatically. The [*] was added to distinct
the changelog from rest of the commit. At least older versions of GIT
required this to not include changelog to commit messages.

> 
> >  drivers/cpufreq/cpufreq.c    |   69
> > ++++++++++++++++++++++++++++++++++++++++++
> > drivers/cpufreq/freq_table.c |   57
> > ++++++++++++++++++++++++++++++++-- include/linux/cpufreq.h      |
> > 12 ++++++++ 3 files changed, 136 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> > index 1b8a48e..98ba5f1 100644
> > --- a/drivers/cpufreq/cpufreq.c
> > +++ b/drivers/cpufreq/cpufreq.c
> > @@ -40,6 +40,7 @@
> >   * also protects the cpufreq_cpu_data array.
> >   */
> >  static struct cpufreq_driver *cpufreq_driver;
> > +static bool cpufreq_boost_sysfs_defined;
> >  static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data);
> >  #ifdef CONFIG_HOTPLUG_CPU
> >  /* This one keeps track of the previously set governor of a
> > removed CPU */ @@ -315,6 +316,33 @@
> > EXPORT_SYMBOL_GPL(cpufreq_notify_transition); /*********************************************************************
> >   *                          SYSFS
> > INTERFACE                          *
> > *********************************************************************/
> > +ssize_t show_boost_status(struct kobject *kobj,
> > +                                struct attribute *attr, char *buf)
> > +{
> > +       return sprintf(buf, "%d\n", cpufreq_driver->boost_en);
> 
> This isn't correct. It shows if cpufreq driver supports boost or
> not and it should show if boost is enabled from sysfs when
> cpufreq driver supports boost.

The cpufreq_driver->low_level_boost() is only valid when cpufreq driver
supports boost. Otherwise it is NULL. Thereof you will not see those
attributes exported to /sysfs until cpufreq driver supports boost. 

When "boost" attribute is exported - then it returns state of boosting
(if it is enabled or not).

> 
> > +}
> > +
> > +static ssize_t store_boost_status(struct kobject *kobj, struct
> > attribute *attr,
> > +                                 const char *buf, size_t count)
> > +{
> > +       int ret, enable;
> > +
> > +       ret = sscanf(buf, "%d", &enable);
> > +       if (ret != 1 || enable < 0 || enable > 1)
> > +               return -EINVAL;
> > +
> > +       if (cpufreq_boost_trigger_state(enable)) {
> > +               pr_err("%s: Cannot %sable boost!\n", __func__,
> > +                      enable ? "en" : "dis");
> 
> %sable doesn't look very much readable. Use complete strings:
> "enable" and "disable".

Ok.

> 
> > +               return -EINVAL;
> > +       }
> > +
> > +       return count;
> > +}
> > +
> > +static struct global_attr global_boost = __ATTR(boost, 0644,
> > +                                               show_boost_status,
> > +                                               store_boost_status);
> 
> User define_one_global_rw.

Ok, will reuse available macros (this code was taken directly from
acpi-cpufreq.c file).

> 
> >  static struct cpufreq_governor *__find_governor(const char
> > *str_governor) {
> > @@ -754,6 +782,17 @@ static int cpufreq_add_dev_interface(unsigned
> > int cpu,
> 
> Why not do this in cpufreq_register_driver()?

Good point. I will move this code to cpufreq_register_driver.

> 
> >                         goto err_out_kobj_put;
> >                 drv_attr++;
> >         }
> > +       if (cpufreq_driver->low_level_boost
> > && !cpufreq_boost_sysfs_defined) {
> 
> I thought low_level_boost() is a function which will only be supported
> for drivers
> using hardware boost feature, like intel.

I think that we shall give users some flexibility and don't assume that
low_level_boost is only used for one solution/vendor.

It is also needed with software controlled boost. Please refer to patch
3/3. 

> And so we must have used
> boost_en here.

boost_en has two meanings:
0 - either boost disabled or not supported (when low_level_boost=NULL).
1 - boost is enabled.

> 
> > +               ret = sysfs_create_file(cpufreq_global_kobject,
> > +                                       &(global_boost.attr));
> 
> cpufreq_sysfs_create_file(), check
> 2361be23666232dbb4851a527f466c4cbf5340fc for details.

Ok, I will rebase those changes to newest
kernel/git/rafael/linux-pm.git ,branch
kernel_pm/pm-cpufreq

> 
> > +               if (ret) {
> > +                       pr_err("%s: cannot register global boost
> > sysfs file\n",
> > +                               __func__);
> > +                       goto err_out_kobj_put;
> > +               }
> > +               cpufreq_boost_sysfs_defined = 1;
> > +       }
> > +
> >         if (cpufreq_driver->get) {
> >                 ret = sysfs_create_file(&policy->kobj,
> > &cpuinfo_cur_freq.attr); if (ret)
> > @@ -1853,6 +1892,30 @@ static struct notifier_block __refdata
> > cpufreq_cpu_notifier = { };
> >
> >  /*********************************************************************
> > + *
> > BOOST                                              *
> > +
> > *********************************************************************/
> > +int cpufreq_boost_trigger_state(int state) +{
> > +       int ret = 0;
> > +
> > +       if (!cpufreq_driver->low_level_boost)
> > +               return -ENODEV;
> 
> I am certainly not aligned with your design. What's the
> use of this field? 

I had to rewrite a bit :-) patches since we decided to drop struct
cpufreq_boost.

I've added two fields to cpufreq_driver:
 - low_level_boost: 
	* When boost is not supported (default) it is set to NULL. This
	  field has two purposes: Indicates if boost is available on
	  the system and provides address of low level callback
	* When cpufreq driver assigns pointer to this field,
	  it means that it is supported

 - boost_en:
	* It shows if boost is enabled or disabled/not supported to the
	  rest of the system.

> And please update documentation too for these
> new entries in cpufreq_driver structure.

Ok I will extend it.

> 
> > +       if (cpufreq_driver->boost_en != state) {
> 
> So, you are using boost_en to see if boost is enabled from sysfs?
> Then you have put it at wrong place.

I check if boost is already enabled. 

> 
> I thought there would be three variables:
> - cpufreq_driver->boost_supported: boost is enabled for driver

For this purpose I check the low_level_boost pointer if it's NULL or
not.

> - cpufreq_driver->low_level_boost(): to set desired boost state
> (Only for hardware boosting)

It has two purposes (as described above) and can be used (defined) by
software and hardware boost solutions.

> - boost_enabled: global variable in cpufreq.c file, used only if
> cpufreq_driver->boost_supported is true.

I think that boost enabled flag shall be defined at cpufreq driver
(please look into acpi_cpufreq.c - which used another set of global
flags). 
It will then provide one flag for cpufreq.c (core) and drivers.

However I've added one global flag: cpufreq_boost_sysfs_defined 
which indicates if /sys/devices/system/cpu/cpufreq/boost attribute has
been already defined (to prevent multiple definitions attempts).

> 
> 
> > diff --git a/drivers/cpufreq/freq_table.c
> > b/drivers/cpufreq/freq_table.c index d7a7966..4e4f692 100644
> > --- a/drivers/cpufreq/freq_table.c
> > +++ b/drivers/cpufreq/freq_table.c
> > @@ -20,6 +20,27 @@
> >   *                     FREQUENCY TABLE
> > HELPERS                       *
> > *********************************************************************/
> >
> > +unsigned int
> > +cpufreq_frequency_table_max(struct cpufreq_frequency_table
> > *freq_table,
> > +                           int boost)
> > +{
> > +       int i = 0, boost_freq_max = 0, freq_max = 0;
> > +
> > +       for (; freq_table[i].frequency != CPUFREQ_TABLE_END; i++) {
> > +               if (freq_table[i].index == CPUFREQ_BOOST_FREQ) {
> > +                       if (freq_table[i].frequency >
> > boost_freq_max)
> > +                               boost_freq_max =
> > freq_table[i].frequency;
> 
> Do above only when boost==true and below when boost==false.

Ok.

> 
> > +               } else {
> > +                       if (freq_table[i].frequency > freq_max)
> > +                               freq_max = freq_table[i].frequency;
> > +               }
> > +       }
> > +
> > +       return boost ? boost_freq_max : freq_max;
> > +
> > +}
> > +EXPORT_SYMBOL_GPL(cpufreq_frequency_table_max);
> > +
> >  int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
> >                                     struct cpufreq_frequency_table
> > *table) {
> > @@ -171,7 +192,8 @@ static DEFINE_PER_CPU(struct
> > cpufreq_frequency_table *, cpufreq_show_table); /**
> >   * show_available_freqs - show available frequencies for the
> > specified CPU */
> > -static ssize_t show_available_freqs(struct cpufreq_policy *policy,
> > char *buf) +static ssize_t show_available_freqs(struct
> > cpufreq_policy *policy, char *buf,
> > +                                   int show_boost)
> >  {
> >         unsigned int i = 0;
> >         unsigned int cpu = policy->cpu;
> > @@ -186,22 +208,53 @@ static ssize_t show_available_freqs(struct
> > cpufreq_policy *policy, char *buf) for (i = 0;
> > (table[i].frequency != CPUFREQ_TABLE_END); i++) { if
> > (table[i].frequency == CPUFREQ_ENTRY_INVALID) continue;
> > +               if (show_boost)
> > +                       if (table[i].index != CPUFREQ_BOOST_FREQ)
> > +                               continue;
> > +
> 
> Looks wrong. You will show boost freqs when show_boost is false.

My purpose here is to display frequencies only tagged with
CPUFREQ_BOOST_FREQ and when show_boost is true. 

When show_boost is false, the operation of the function is unchanged.


> 
> >                 count += sprintf(&buf[count], "%d ",
> > table[i].frequency); }
> >         count += sprintf(&buf[count], "\n");
> >
> >         return count;
> > +}
> >
> > +/**
> > + * show_available_normal_freqs - show normal boost frequencies for
> > + * the specified CPU
> > + */
> > +static ssize_t show_available_normal_freqs(struct cpufreq_policy
> > *policy,
> > +                                          char *buf)
> > +{
> > +       return show_available_freqs(policy, buf, 0);
> >  }
> >
> >  struct freq_attr cpufreq_freq_attr_scaling_available_freqs = {
> >         .attr = { .name = "scaling_available_frequencies",
> >                   .mode = 0444,
> >                 },
> > -       .show = show_available_freqs,
> > +       .show = show_available_normal_freqs,
> >  };
> >  EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_available_freqs);
> >
> > +/**
> > + * show_available_boost_freqs - show available boost frequencies
> > for
> > + * the specified CPU
> > + */
> > +static ssize_t show_available_boost_freqs(struct cpufreq_policy
> > *policy,
> > +                                         char *buf)
> > +{
> > +       return show_available_freqs(policy, buf, 1);
> > +}
> > +
> > +struct freq_attr cpufreq_freq_attr_boost_available_freqs = {
> > +       .attr = { .name = "scaling_boost_frequencies",
> > +                 .mode = 0444,
> > +               },
> > +       .show = show_available_boost_freqs,
> > +};
> > +EXPORT_SYMBOL_GPL(cpufreq_freq_attr_boost_available_freqs);
> > +
> 
> Code redundancy can be reduced by creating a macro for declaring
> **_availabe_freqs, its attributes and export symbol.

Yes, you are right here. Those two structures only differ with
different names.

> 
> >  /*
> >   * if you use these, you must assure that the frequency table is
> > valid
> >   * all the time between get_attr and put_attr!
> 
> With this patch alone, we would be using boost frequencies even in
> normal cases where we haven't enabled boost.

Correct me if I'm wrong here, but the
cpufreq_freq_attr_boost_available_freqs will be added to cpufreq
driver's freq_attr table (i.e. *exynos_cpufreq_attr[]). 
It is cpufreq driver's responsibility to add this attribute. By default
all other drivers add only cpufreq_freq_attr_boost_available_freqs.


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v2 1/3] cpufreq:boost: CPU frequency boost code unification for software and hardware solutions
  2013-06-12  7:39       ` Lukasz Majewski
@ 2013-06-12  8:09         ` Viresh Kumar
  2013-06-12  9:09           ` Lukasz Majewski
  2013-06-12 11:23         ` Rafael J. Wysocki
  1 sibling, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-12  8:09 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

On 12 June 2013 13:09, Lukasz Majewski <l.majewski@samsung.com> wrote:
> Hi Viresh,

Hi Lukasz,

>> Hi,

Please don't remove the line which says, who wrote last mail at what time.
These >, >>, >>>, >>>>, ... have a meaning. They help us understand who
wrote what in bottom posting. And as you removed my line, nobody can see
who wrote above "Hi" to you :)

>> You don't have to manually add "---" here. Just keep a blank line
>> instead.
>
> One "---" is added by git automatically. The [*] was added to distinct
> the changelog from rest of the commit. At least older versions of GIT
> required this to not include changelog to commit messages.

You don't have to add an extra "---" line. Just write your changelog
after "---" added by git and give a blank line between your last
changelog line and below ones (probably just to make it more
readable and not a must, but i am not sure).

>> >  drivers/cpufreq/cpufreq.c    |   69
>> > ++++++++++++++++++++++++++++++++++++++++++
>> > drivers/cpufreq/freq_table.c |   57
>> > ++++++++++++++++++++++++++++++++-- include/linux/cpufreq.h      |
>> > 12 ++++++++ 3 files changed, 136 insertions(+), 2 deletions(-)

> I think that we shall give users some flexibility and don't assume that
> low_level_boost is only used for one solution/vendor.
>
> It is also needed with software controlled boost. Please refer to patch
> 3/3.

You didn't get me. I am not asking to keep it only for Intel. But keep
this variable as is (s/low_level_boost/set_boost_freq), and make it
optional. So, few drivers can implement it but not everybody is required
to.

So, Add another variable: boost_supported, which will tell cpufreq core
that boost is supported by governor or not.

And a global variable in cpufreq.c boost_enabled to track status of
what user has requested.

> However I've added one global flag: cpufreq_boost_sysfs_defined
> which indicates if /sys/devices/system/cpu/cpufreq/boost attribute has
> been already defined (to prevent multiple definitions attempts).

You don't need this variable anymore as sysfs create file is now
moved to cpufreq_register_driver(), so this can't be called twice.

>> > char *buf) +static ssize_t show_available_freqs(struct
>> > cpufreq_policy *policy, char *buf,
>> > +                                   int show_boost)
>> >  {
>> >         unsigned int i = 0;
>> >         unsigned int cpu = policy->cpu;
>> > @@ -186,22 +208,53 @@ static ssize_t show_available_freqs(struct
>> > cpufreq_policy *policy, char *buf) for (i = 0;
>> > (table[i].frequency != CPUFREQ_TABLE_END); i++) { if
>> > (table[i].frequency == CPUFREQ_ENTRY_INVALID) continue;
>> > +               if (show_boost)
>> > +                       if (table[i].index != CPUFREQ_BOOST_FREQ)
>> > +                               continue;
>> > +
>>
>> Looks wrong. You will show boost freqs when show_boost is false.
>
> My purpose here is to display frequencies only tagged with
> CPUFREQ_BOOST_FREQ and when show_boost is true.
>
> When show_boost is false, the operation of the function is unchanged.

Which is wrong. When show_boost is false, it means that user don't
want to see boost frequencies and so you should skip them.

>> With this patch alone, we would be using boost frequencies even in
>> normal cases where we haven't enabled boost.
>
> Correct me if I'm wrong here, but the
> cpufreq_freq_attr_boost_available_freqs will be added to cpufreq
> driver's freq_attr table (i.e. *exynos_cpufreq_attr[]).
> It is cpufreq driver's responsibility to add this attribute. By default
> all other drivers add only cpufreq_freq_attr_boost_available_freqs.

You are just talking about showing boost freqs in sysfs. I am talking
about the frequencies that governors will select when boost is
disabled from sysfs. Because we don't skip boost frequencies in
target() routines, we will set them as and when governor requests
them.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v2 1/3] cpufreq:boost: CPU frequency boost code unification for software and hardware solutions
  2013-06-12  8:09         ` Viresh Kumar
@ 2013-06-12  9:09           ` Lukasz Majewski
  2013-06-12  9:25             ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-12  9:09 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

On Wed, 12 Jun 2013 13:39:18 +0530, Viresh Kumar wrote:

Hi Viresh,

> On 12 June 2013 13:09, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > Hi Viresh,
> 
> Hi Lukasz,
> 
> >> Hi,
> 
> Please don't remove the line which says, who wrote last mail at what
> time. These >, >>, >>>, >>>>, ... have a meaning. They help us
> understand who wrote what in bottom posting. And as you removed my
> line, nobody can see who wrote above "Hi" to you :)

Ok, mailer adjusted.

> 
> >> You don't have to manually add "---" here. Just keep a blank line
> >> instead.
> >
> > One "---" is added by git automatically. The [*] was added to
> > distinct the changelog from rest of the commit. At least older
> > versions of GIT required this to not include changelog to commit
> > messages.
> 
> You don't have to add an extra "---" line. Just write your changelog
> after "---" added by git and give a blank line between your last
> changelog line and below ones (probably just to make it more
> readable and not a must, but i am not sure).

I got your point. If you prefer, I will stick to it. No problem.

As a side note:

In the other open source project (u-boot) we use the pattern which I've
used previously. It has one big advantage - I can edit change log at
git gui (just below sign-of-by). It is simply more convenient for
me :-). Those changes between "---" are simply skipped by git am
afterwards.

> 
> >> >  drivers/cpufreq/cpufreq.c    |   69
> >> > ++++++++++++++++++++++++++++++++++++++++++
> >> > drivers/cpufreq/freq_table.c |   57
> >> > ++++++++++++++++++++++++++++++++-- include/linux/cpufreq.h      |
> >> > 12 ++++++++ 3 files changed, 136 insertions(+), 2 deletions(-)
> 
> > I think that we shall give users some flexibility and don't assume
> > that low_level_boost is only used for one solution/vendor.
> >
> > It is also needed with software controlled boost. Please refer to
> > patch 3/3.
> 
> You didn't get me. I am not asking to keep it only for Intel. But keep
> this variable as is (s/low_level_boost/set_boost_freq), and make it
> optional. So, few drivers can implement it but not everybody is
> required to.

The low_level_boost (set_boost_freq)[*] is optional. However it seems to
me, that the burden of changing available set of frequencies (when
boost is enabled) must be put to cpufreq driver anyway. 

Without this function [*] defined, we cannot enable frequency boosting. 

> 
> So, Add another variable: boost_supported, which will tell cpufreq
> core that boost is supported by governor or not.
				  ^^^^^^^shouldn't it be cpufreq driver?

Ok, boost_supported seems needed. In my opinion it shall be defined at
cpufreq_driver structure (since it provides boosting infrastructure
anyway).

> 
> And a global variable in cpufreq.c boost_enabled to track status of
> what user has requested.

I think, that boost_enable shall be also defined at cpufreq driver (as
proposed in the patch). We keep pointer to cpufreq driver at cpufreq.c
anyway. Moreover, boost_enable flag is already defined at
acpi-cpufreq.c (as static). We will have two flags for the same
purpose. 

> 
> > However I've added one global flag: cpufreq_boost_sysfs_defined
> > which indicates if /sys/devices/system/cpu/cpufreq/boost attribute
> > has been already defined (to prevent multiple definitions attempts).
> 
> You don't need this variable anymore as sysfs create file is now
> moved to cpufreq_register_driver(), so this can't be called twice.

Yes, in this situation the cpufreq_boost_sysfs_defined flag is
redundant.

> 
> >> > char *buf) +static ssize_t show_available_freqs(struct
> >> > cpufreq_policy *policy, char *buf,
> >> > +                                   int show_boost)
> >> >  {
> >> >         unsigned int i = 0;
> >> >         unsigned int cpu = policy->cpu;
> >> > @@ -186,22 +208,53 @@ static ssize_t show_available_freqs(struct
> >> > cpufreq_policy *policy, char *buf) for (i = 0;
> >> > (table[i].frequency != CPUFREQ_TABLE_END); i++) { if
> >> > (table[i].frequency == CPUFREQ_ENTRY_INVALID) continue;
> >> > +               if (show_boost)
> >> > +                       if (table[i].index != CPUFREQ_BOOST_FREQ)
> >> > +                               continue;
> >> > +
> >>
> >> Looks wrong. You will show boost freqs when show_boost is false.
> >
> > My purpose here is to display frequencies only tagged with
> > CPUFREQ_BOOST_FREQ and when show_boost is true.
> >
> > When show_boost is false, the operation of the function is
> > unchanged.
> 
> Which is wrong. When show_boost is false, it means that user don't
> want to see boost frequencies and so you should skip them.

So we want as follows:
show_boost = 1 ---> show only frequencies tagged as CPUFREQ_BOOST_FREQ
show_boost = 0 ---> show only "normal" (non boost) frequencies

> 
> >> With this patch alone, we would be using boost frequencies even in
> >> normal cases where we haven't enabled boost.
> >
> > Correct me if I'm wrong here, but the
> > cpufreq_freq_attr_boost_available_freqs will be added to cpufreq
> > driver's freq_attr table (i.e. *exynos_cpufreq_attr[]).
> > It is cpufreq driver's responsibility to add this attribute. By
> > default all other drivers add only
> > cpufreq_freq_attr_boost_available_freqs.
> 
> You are just talking about showing boost freqs in sysfs. I am talking
> about the frequencies that governors will select when boost is
> disabled from sysfs. Because we don't skip boost frequencies in
> target() routines, we will set them as and when governor requests
> them.

I think, that it is the main issue here and it shall be cleared out:

Frequencies marked as: CPUFREQ_BOOST_FREQ are added permanently to the
freq_table. 
That is the distinction to the original overclocking patch posted with
LAB, where freq_boost structure was modified and boost frequencies were
either valid or invalid.

Then we can in SW control boost in two ways:
1. change policy->max value (to the maximal boost frequency) - as it is
done now (v3) at Exynos. This is the simple solution (patch 3/3)

2. Modify all freq_table helper functions to be aware of boost and
skip boost frequencies when boost_enable = 0. (as it was done at v2).
This requires code modification at freq_table.c and reevaluation of
policy. 

Maybe you have any other idea?


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v2 1/3] cpufreq:boost: CPU frequency boost code unification for software and hardware solutions
  2013-06-12  9:09           ` Lukasz Majewski
@ 2013-06-12  9:25             ` Viresh Kumar
  2013-06-12 12:30               ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-12  9:25 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

On 12 June 2013 14:39, Lukasz Majewski <l.majewski@samsung.com> wrote:
> On Wed, 12 Jun 2013 13:39:18 +0530, Viresh Kumar wrote:
>> On 12 June 2013 13:09, Lukasz Majewski <l.majewski@samsung.com> wrote:

>> You don't have to add an extra "---" line. Just write your changelog
>> after "---" added by git and give a blank line between your last
>> changelog line and below ones (probably just to make it more
>> readable and not a must, but i am not sure).
>
> I got your point. If you prefer, I will stick to it. No problem.

Its not how I prefer it, but how everybody does it :)

> As a side note:
>
> In the other open source project (u-boot) we use the pattern which I've
> used previously. It has one big advantage - I can edit change log at
> git gui (just below sign-of-by). It is simply more convenient for
> me :-). Those changes between "---" are simply skipped by git am
> afterwards.

Yes, I am still asking you to follow the same steps:

git send-email --annotate ***patches***

and then write whatever you don't want to be logged by git am after
the "---" already present in the patch.

>> >> >  drivers/cpufreq/cpufreq.c    |   69
>> >> > ++++++++++++++++++++++++++++++++++++++++++
>> >> > drivers/cpufreq/freq_table.c |   57
>> >> > ++++++++++++++++++++++++++++++++-- include/linux/cpufreq.h      |
>> >> > 12 ++++++++ 3 files changed, 136 insertions(+), 2 deletions(-)
>>
>> > I think that we shall give users some flexibility and don't assume
>> > that low_level_boost is only used for one solution/vendor.
>> >
>> > It is also needed with software controlled boost. Please refer to
>> > patch 3/3.
>>
>> You didn't get me. I am not asking to keep it only for Intel. But keep
>> this variable as is (s/low_level_boost/set_boost_freq), and make it
>> optional. So, few drivers can implement it but not everybody is
>> required to.
>
> The low_level_boost (set_boost_freq)[*] is optional. However it seems to
> me, that the burden of changing available set of frequencies (when
> boost is enabled) must be put to cpufreq driver anyway.

Driver shouldn't play with boost freqs at runtime. This has to be handled
by cpufreq core. The only thing cpufreq driver must be doing in
low_level_boost or set_boost_freq (as what I suggested it to be), is
to set the boost frequency requested by core. And so this routine would
only be defined by drivers that have a special way of setting boost
frequencies. For others ->target() routine should be able to set all
freqs, boost or non boost.

> Without this function [*] defined, we cannot enable frequency boosting.

why?

>> So, Add another variable: boost_supported, which will tell cpufreq
>> core that boost is supported by governor or not.
>                                   ^^^^^^^shouldn't it be cpufreq driver?

Yeah, sorry :(

> Ok, boost_supported seems needed. In my opinion it shall be defined at
> cpufreq_driver structure (since it provides boosting infrastructure
> anyway).

that's what I asked.

>> And a global variable in cpufreq.c boost_enabled to track status of
>> what user has requested.
>
> I think, that boost_enable shall be also defined at cpufreq driver (as
> proposed in the patch).

Not really. Driver should only care about if it supports boost or not.
If it is enabled/disabled by sysfs or not should be kept inside core
in a global variable.

Moreover, if we have 5-6 cpufreq drivers compiled in (for multi-arch
compiled kernels), we will save memory wasted by this variable if
it is present in cpufreq_driver.

> Moreover, boost_enable flag is already defined at
> acpi-cpufreq.c (as static). We will have two flags for the same
> purpose.

No, we don't have to. Just expose another API from cpufreq core
to get status of boost.

> So we want as follows:
> show_boost = 1 ---> show only frequencies tagged as CPUFREQ_BOOST_FREQ
> show_boost = 0 ---> show only "normal" (non boost) frequencies

Yes.

>> You are just talking about showing boost freqs in sysfs. I am talking
>> about the frequencies that governors will select when boost is
>> disabled from sysfs. Because we don't skip boost frequencies in
>> target() routines, we will set them as and when governor requests
>> them.
>
> I think, that it is the main issue here and it shall be cleared out:
>
> Frequencies marked as: CPUFREQ_BOOST_FREQ are added permanently to the
> freq_table.
> That is the distinction to the original overclocking patch posted with
>> LAB, where freq_boost structure was modified and boost frequencies were
> either valid or invalid.

Yes.

> Then we can in SW control boost in two ways:
> 1. change policy->max value (to the maximal boost frequency) - as it is
> done now (v3) at Exynos. This is the simple solution (patch 3/3)

Drivers aren't supposed to set policy->max. It should be taken care
of by core or freq_table.c file.

> 2. Modify all freq_table helper functions to be aware of boost and
> skip boost frequencies when boost_enable = 0. (as it was done at v2).
> This requires code modification at freq_table.c and reevaluation of
> policy.

Yes, the core must be aware of it and must take the right decision
here. So, we need to take care of boost freq in freq_table.c

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v2 1/3] cpufreq:boost: CPU frequency boost code unification for software and hardware solutions
  2013-06-12  7:39       ` Lukasz Majewski
  2013-06-12  8:09         ` Viresh Kumar
@ 2013-06-12 11:23         ` Rafael J. Wysocki
  2013-06-12 11:40           ` Lukasz Majewski
  1 sibling, 1 reply; 329+ messages in thread
From: Rafael J. Wysocki @ 2013-06-12 11:23 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Viresh Kumar, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

On Wednesday, June 12, 2013 09:39:38 AM Lukasz Majewski wrote:
> Hi Viresh,
> 
> > Hi,
> > 
> > Change subject to: "cpufreq: Add boost frequency support in core"
> 
> Ok.
> 
> > 
> > On 11 June 2013 14:33, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > > This commit adds support for software based frequency boosting.
> > 
> > No. It adds support for both software and hardware boosting. So just
> > write: This commit adds boost frequency support in cpufreq core
> > (Hardware & Software).
> 
> Ok.
> > 
> > > Some SoC (like Exynos4 - e.g. 4x12) allow setting frequency above
> > > its normal condition limits. Such a change shall be only done for a
> > > short
> > 
> > s/condition/operation
> > s/change/mode
> > s/done/used
> > 
> 
> Ok.
> 
> > > time.
> > >
> > > Overclocking (boost) support is essentially provided by platform
> > > dependent cpufreq driver.
> > >
> > > This commit unifies support for SW and HW (Intel) over clocking
> > > solutions in the core cpufreq driver. Previously the "boost" sysfs
> > > attribute was defined at acpi driver code.
> > > By default boost is disabled. One global attribute is available at:
> > > /sys/devices/system/cpu/cpufreq/boost.
> > 
> > Enter a blank line here.
> 
> Ok
> 
> > 
> > > It only shows up when cpufreq driver supports overclocking.
> > > Under the hood frequencies dedicated for boosting are marked with a
> > > special flag (CPUFREQ_BOOST_FREQ) at driver's frequency table.
> > > It is the user's concern to enable/disable overclocking with proper
> > > call to sysfs.
> > 
> > Good.
> > 
> > > Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> > > Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> > >
> > > --- 
>     ^^^^
> [*] this --- was added manually by me.
> 
> > > Changes for v2:
> > > - Removal of cpufreq_boost structure and move its fields to
> > > cpufreq_driver structure
> > > - Flag to indicate if global boost attribute is already defined
> > > - Extent the pr_{err|debbug} functions to show current function
> > > names ---
> > 
> > You don't have to manually add "---" here. Just keep a blank line
> > instead.
> 
> One "---" is added by git automatically. The [*] was added to distinct
> the changelog from rest of the commit. At least older versions of GIT
> required this to not include changelog to commit messages.

Which doesn't matter anyway.  None of them will show up in git log, so don't
worry. :-)

[...]

> 
> > And so we must have used
> > boost_en here.
> 
> boost_en has two meanings:
> 0 - either boost disabled or not supported (when low_level_boost=NULL).
> 1 - boost is enabled.

Gosh, please don't do that.  Use *two* flags, one meaning "supported" and the
second meaning "enabled".

Thanks,
Rafael


-- 
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v2 1/3] cpufreq:boost: CPU frequency boost code unification for software and hardware solutions
  2013-06-12 11:23         ` Rafael J. Wysocki
@ 2013-06-12 11:40           ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-12 11:40 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Viresh Kumar, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

On Wed, 12 Jun 2013 13:23:20 +0200, Rafael J. Wysocki wrote:

Hi Rafael,

> On Wednesday, June 12, 2013 09:39:38 AM Lukasz Majewski wrote:
> > Hi Viresh,
> > 
> > > Hi,
> > > 
> > > Change subject to: "cpufreq: Add boost frequency support in core"
> > 
> > Ok.
> > 
> > > 
> > > On 11 June 2013 14:33, Lukasz Majewski <l.majewski@samsung.com>
> > > wrote:
> > > > This commit adds support for software based frequency boosting.
> > > 
> > > No. It adds support for both software and hardware boosting. So
> > > just write: This commit adds boost frequency support in cpufreq
> > > core (Hardware & Software).
> > 
> > Ok.
> > > 
> > > > Some SoC (like Exynos4 - e.g. 4x12) allow setting frequency
> > > > above its normal condition limits. Such a change shall be only
> > > > done for a short
> > > 
> > > s/condition/operation
> > > s/change/mode
> > > s/done/used
> > > 
> > 
> > Ok.
> > 
> > > > time.
> > > >
> > > > Overclocking (boost) support is essentially provided by platform
> > > > dependent cpufreq driver.
> > > >
> > > > This commit unifies support for SW and HW (Intel) over clocking
> > > > solutions in the core cpufreq driver. Previously the "boost"
> > > > sysfs attribute was defined at acpi driver code.
> > > > By default boost is disabled. One global attribute is available
> > > > at: /sys/devices/system/cpu/cpufreq/boost.
> > > 
> > > Enter a blank line here.
> > 
> > Ok
> > 
> > > 
> > > > It only shows up when cpufreq driver supports overclocking.
> > > > Under the hood frequencies dedicated for boosting are marked
> > > > with a special flag (CPUFREQ_BOOST_FREQ) at driver's frequency
> > > > table. It is the user's concern to enable/disable overclocking
> > > > with proper call to sysfs.
> > > 
> > > Good.
> > > 
> > > > Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> > > > Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> > > >
> > > > --- 
> >     ^^^^
> > [*] this --- was added manually by me.
> > 
> > > > Changes for v2:
> > > > - Removal of cpufreq_boost structure and move its fields to
> > > > cpufreq_driver structure
> > > > - Flag to indicate if global boost attribute is already defined
> > > > - Extent the pr_{err|debbug} functions to show current function
> > > > names ---
> > > 
> > > You don't have to manually add "---" here. Just keep a blank line
> > > instead.
> > 
> > One "---" is added by git automatically. The [*] was added to
> > distinct the changelog from rest of the commit. At least older
> > versions of GIT required this to not include changelog to commit
> > messages.
> 
> Which doesn't matter anyway.  None of them will show up in git log,
> so don't worry. :-)

:-)

> 
> [...]
> 
> > 
> > > And so we must have used
> > > boost_en here.
> > 
> > boost_en has two meanings:
> > 0 - either boost disabled or not supported (when
> > low_level_boost=NULL). 1 - boost is enabled.
> 
> Gosh, please don't do that.  Use *two* flags, one meaning "supported"
> and the second meaning "enabled".

That was already pointed out by Viresh. I will stick to his
guidelines :-).

> 
> Thanks,
> Rafael
> 
> 



-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v2 1/3] cpufreq:boost: CPU frequency boost code unification for software and hardware solutions
  2013-06-12  9:25             ` Viresh Kumar
@ 2013-06-12 12:30               ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-12 12:30 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

On Wed, 12 Jun 2013 14:55:45 +0530, Viresh Kumar wrote:
> On 12 June 2013 14:39, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > On Wed, 12 Jun 2013 13:39:18 +0530, Viresh Kumar wrote:
> >> On 12 June 2013 13:09, Lukasz Majewski <l.majewski@samsung.com>
> >> wrote:
> 
> >> You don't have to add an extra "---" line. Just write your
> >> changelog after "---" added by git and give a blank line between
> >> your last changelog line and below ones (probably just to make it
> >> more readable and not a must, but i am not sure).
> >
> > I got your point. If you prefer, I will stick to it. No problem.
> 
> Its not how I prefer it, but how everybody does it :)

Ok, :-)

> 
> > As a side note:
> >
> > In the other open source project (u-boot) we use the pattern which
> > I've used previously. It has one big advantage - I can edit change
> > log at git gui (just below sign-of-by). It is simply more
> > convenient for me :-). Those changes between "---" are simply
> > skipped by git am afterwards.
> 
> Yes, I am still asking you to follow the same steps:
> 
> git send-email --annotate ***patches***
> 
> and then write whatever you don't want to be logged by git am after
> the "---" already present in the patch.

Ok,

> 
> >> >> >  drivers/cpufreq/cpufreq.c    |   69
> >> >> > ++++++++++++++++++++++++++++++++++++++++++
> >> >> > drivers/cpufreq/freq_table.c |   57
> >> >> > ++++++++++++++++++++++++++++++++--
> >> >> > include/linux/cpufreq.h      | 12 ++++++++ 3 files changed,
> >> >> > 136 insertions(+), 2 deletions(-)
> >>
> >> > I think that we shall give users some flexibility and don't
> >> > assume that low_level_boost is only used for one solution/vendor.
> >> >
> >> > It is also needed with software controlled boost. Please refer to
> >> > patch 3/3.
> >>
> >> You didn't get me. I am not asking to keep it only for Intel. But
> >> keep this variable as is (s/low_level_boost/set_boost_freq), and
> >> make it optional. So, few drivers can implement it but not
> >> everybody is required to.
> >
> > The low_level_boost (set_boost_freq)[*] is optional. However it
> > seems to me, that the burden of changing available set of
> > frequencies (when boost is enabled) must be put to cpufreq driver
> > anyway.
> 
> Driver shouldn't play with boost freqs at runtime. This has to be
> handled by cpufreq core. The only thing cpufreq driver must be doing
> in low_level_boost or set_boost_freq (as what I suggested it to be),

So you want the set_boost_freq to not be used with software based
boosting. Ok.

> is to set the boost frequency requested by core. And so this routine
> would only be defined by drivers that have a special way of setting
> boost frequencies. For others ->target() routine should be able to
> set all freqs, boost or non boost.
> 
> > Without this function [*] defined, we cannot enable frequency
> > boosting.
> 
> why?

Hmm, please read my further comment.

> 
> >> So, Add another variable: boost_supported, which will tell cpufreq
> >> core that boost is supported by governor or not.
> >                                   ^^^^^^^shouldn't it be cpufreq
> > driver?
> 
> Yeah, sorry :(

Ok.

> 
> > Ok, boost_supported seems needed. In my opinion it shall be defined
> > at cpufreq_driver structure (since it provides boosting
> > infrastructure anyway).
> 
> that's what I asked.

Ok :-) .

> 
> >> And a global variable in cpufreq.c boost_enabled to track status of
> >> what user has requested.
> >
> > I think, that boost_enable shall be also defined at cpufreq driver
> > (as proposed in the patch).
> 
> Not really. Driver should only care about if it supports boost or not.
> If it is enabled/disabled by sysfs or not should be kept inside core
> in a global variable.

Ok,

> 
> Moreover, if we have 5-6 cpufreq drivers compiled in (for multi-arch
> compiled kernels), we will save memory wasted by this variable if
> it is present in cpufreq_driver.

Ok. I didn't thought about this use case. Agree.

> 
> > Moreover, boost_enable flag is already defined at
> > acpi-cpufreq.c (as static). We will have two flags for the same
> > purpose.
> 
> No, we don't have to. Just expose another API from cpufreq core
> to get status of boost.

Ok.

> 
> > So we want as follows:
> > show_boost = 1 ---> show only frequencies tagged as
> > CPUFREQ_BOOST_FREQ show_boost = 0 ---> show only "normal" (non
> > boost) frequencies
> 
> Yes.

Ok,

> 
> >> You are just talking about showing boost freqs in sysfs. I am
> >> talking about the frequencies that governors will select when
> >> boost is disabled from sysfs. Because we don't skip boost
> >> frequencies in target() routines, we will set them as and when
> >> governor requests them.
> >
> > I think, that it is the main issue here and it shall be cleared out:
> >
> > Frequencies marked as: CPUFREQ_BOOST_FREQ are added permanently to
> > the freq_table.
> > That is the distinction to the original overclocking patch posted
> > with
> >> LAB, where freq_boost structure was modified and boost frequencies
> >> were
> > either valid or invalid.
> 
> Yes.
> 
> > Then we can in SW control boost in two ways:
> > 1. change policy->max value (to the maximal boost frequency) - as
> > it is done now (v3) at Exynos. This is the simple solution (patch
> > 3/3)
> 
> Drivers aren't supposed to set policy->max. It should be taken care
> of by core or freq_table.c file.

This seems the right thing, but it would require some functions defined
at freq_table.c to be extended to accept bool "boost" parameter (which
would not consider freqs tagged as CPUFREQ_BOOST_FREQ).
Then each per cpu policy, shall be read and its max freq shall be
updated when someone enables boost from sysfs (at
cpufreq_boost_trigger_state).

This is my idea to manage boost mode from core code. Am I right?



> 
> > 2. Modify all freq_table helper functions to be aware of boost and
> > skip boost frequencies when boost_enable = 0. (as it was done at
> > v2). This requires code modification at freq_table.c and
> > reevaluation of policy.
> 
> Yes, the core must be aware of it and must take the right decision
> here. So, we need to take care of boost freq in freq_table.c

Ok. Then we agreed :-).

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* [PATCH v3 0/3] cpufreq:boost: CPU Boost mode support
  2013-06-06  7:07 [PATCH 0/5] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                   ` (5 preceding siblings ...)
  2013-06-11  9:03 ` [PATCH v2 0/3] cpufreq:boost: CPU Boost mode support Lukasz Majewski
@ 2013-06-14  7:38 ` Lukasz Majewski
  2013-06-14  7:38   ` [PATCH v3 1/3] cpufreq: Add boost frequency support in core Lukasz Majewski
                     ` (3 more replies)
  2013-06-19 17:12 ` [PATCH v4 0/7] " Lukasz Majewski
                   ` (10 subsequent siblings)
  17 siblings, 4 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-14  7:38 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocky
  Cc: cpufreq, Linux PM list, Vincent Guittot, Lukasz Majewski,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

This patch series introduces support for CPU overclocking technique
called Boost.

It is a follow up of a LAB governor proposal. Boost is a LAB component:
http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq

Boost unifies hardware based solution (e.g. Intel Nehalem) with
software oriented one (like the one done at Exynos).
For this reason cpufreq/freq_table code has been reorganized to include
common code.

Important design decisions:

- Boost related code is compiled-in unconditionally and disabled by default
The cpufreq_driver is responsibile for providing set_boost_freq callback
(if needed)

- struct cpufreq_driver has been extended with boost related fields:
	-- boost_supported - when driver supports boosting
	-- set_boost_freq - callback to function, which is necessary to
	   enable boost at the processor (like it is done at Intel)
	
- Boost sysfs attributies are seen only when cpufreq driver supports them.
They will not show up until either cpufreq_driver defines boost_supported 
flag or device tree's cpufreq "boost_mode" attribute.

- No special spin_lock for Boost was created. The one from cpufreq_driver
was reused.

- The Boost code doesn't rely on any policy. When boost state is changed,
then policies attached to each CPU are updated.


Tested at: HW:
        Exynos 4412 3.10 linux
        Exynos 4210 3.10 linux
Compile tested x86_64 defconfig (acpi) - help with HW (Intel Nehalem) test
 needed


Lukasz Majewski (3):
  cpufreq: Add boost frequency support in core
  cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common
    boost solution
  cpufreq:exynos:Extend Exynos cpufreq driver to support boost
    framework

 arch/arm/mach-s3c24xx/cpufreq.c              |    2 +-
 arch/powerpc/platforms/pasemi/cpufreq.c      |    2 +-
 arch/powerpc/platforms/powermac/cpufreq_32.c |    2 +-
 arch/powerpc/platforms/powermac/cpufreq_64.c |    2 +-
 drivers/cpufreq/acpi-cpufreq.c               |   62 +++++++-----------
 drivers/cpufreq/arm_big_little.c             |    3 +-
 drivers/cpufreq/blackfin-cpufreq.c           |    2 +-
 drivers/cpufreq/cpufreq-cpu0.c               |    2 +-
 drivers/cpufreq/cpufreq.c                    |   87 ++++++++++++++++++++++++++
 drivers/cpufreq/cris-artpec3-cpufreq.c       |    2 +-
 drivers/cpufreq/cris-etraxfs-cpufreq.c       |    2 +-
 drivers/cpufreq/davinci-cpufreq.c            |    2 +-
 drivers/cpufreq/dbx500-cpufreq.c             |    2 +-
 drivers/cpufreq/e_powersaver.c               |    3 +-
 drivers/cpufreq/elanfreq.c                   |    2 +-
 drivers/cpufreq/exynos-cpufreq.c             |    7 ++-
 drivers/cpufreq/exynos5440-cpufreq.c         |    2 +-
 drivers/cpufreq/freq_table.c                 |   44 ++++++++++---
 drivers/cpufreq/ia64-acpi-cpufreq.c          |    2 +-
 drivers/cpufreq/imx6q-cpufreq.c              |    2 +-
 drivers/cpufreq/kirkwood-cpufreq.c           |    3 +-
 drivers/cpufreq/longhaul.c                   |    2 +-
 drivers/cpufreq/loongson2_cpufreq.c          |    2 +-
 drivers/cpufreq/maple-cpufreq.c              |    2 +-
 drivers/cpufreq/omap-cpufreq.c               |    2 +-
 drivers/cpufreq/p4-clockmod.c                |    2 +-
 drivers/cpufreq/powernow-k6.c                |    2 +-
 drivers/cpufreq/powernow-k7.c                |    2 +-
 drivers/cpufreq/powernow-k8.c                |    2 +-
 drivers/cpufreq/ppc_cbe_cpufreq.c            |    2 +-
 drivers/cpufreq/pxa2xx-cpufreq.c             |    4 +-
 drivers/cpufreq/pxa3xx-cpufreq.c             |    2 +-
 drivers/cpufreq/s3c2416-cpufreq.c            |    2 +-
 drivers/cpufreq/s3c64xx-cpufreq.c            |    2 +-
 drivers/cpufreq/s5pv210-cpufreq.c            |    2 +-
 drivers/cpufreq/sc520_freq.c                 |    2 +-
 drivers/cpufreq/sh-cpufreq.c                 |    2 +-
 drivers/cpufreq/sparc-us2e-cpufreq.c         |    2 +-
 drivers/cpufreq/sparc-us3-cpufreq.c          |    2 +-
 drivers/cpufreq/spear-cpufreq.c              |    3 +-
 drivers/cpufreq/speedstep-centrino.c         |    2 +-
 drivers/cpufreq/speedstep-ich.c              |    2 +-
 drivers/cpufreq/speedstep-smi.c              |    2 +-
 drivers/cpufreq/tegra-cpufreq.c              |    4 +-
 include/linux/cpufreq.h                      |   18 +++++-
 45 files changed, 211 insertions(+), 95 deletions(-)

-- 
1.7.10.4


^ permalink raw reply	[flat|nested] 329+ messages in thread

* [PATCH v3 1/3] cpufreq: Add boost frequency support in core
  2013-06-14  7:38 ` [PATCH v3 " Lukasz Majewski
@ 2013-06-14  7:38   ` Lukasz Majewski
  2013-06-17  5:43     ` Viresh Kumar
  2013-06-14  7:38   ` [PATCH v3 2/3] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
                     ` (2 subsequent siblings)
  3 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-14  7:38 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocky
  Cc: cpufreq, Linux PM list, Vincent Guittot, Lukasz Majewski,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

This commit adds boost frequency support in cpufreq core (Hardware &
Software).
Some SoC (like Exynos4 - e.g. 4x12) allow setting frequency above
its normal operation limits. Such a mode shall be only used for a short
time.

Overclocking (boost) support is essentially provided by platform
dependent cpufreq driver.

This commit unifies support for SW and HW (Intel) over clocking solutions
in the core cpufreq driver. Previously the "boost" sysfs attribute was
defined at acpi driver code.
By default boost is disabled. One global attribute is available at:
/sys/devices/system/cpu/cpufreq/boost.

It only shows up when cpufreq driver supports overclocking.
Under the hood frequencies dedicated for boosting are marked with a
special flag (CPUFREQ_BOOST_FREQ) at driver's frequency table.
It is the user's concern to enable/disable overclocking with proper call to
sysfs.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

Changes for v2:
- Removal of cpufreq_boost structure and move its fields to cpufreq_driver
  structure
- Flag to indicate if global boost attribute is already defined
- Extent the pr_{err|debbug} functions to show current function names

Changes for v3:
- Method for reading boost status
- Removal of cpufreq_frequency_table_max()
- Extent cpufreq_frequency_table_cpuinfo() to support boost parameter
- boost_supported flag added to cpufreq_driver struct
- "boost" sysfs attribute control flag removed
- One global flag describing state of the boost defined at cpufreq core
- Rename cpufreq_driver's low_level_boost field to set_boost_freq()
- Usage of cpufreq_sysfs_{remove|add}_file() routines

---
 arch/arm/mach-s3c24xx/cpufreq.c              |    2 +-
 arch/powerpc/platforms/pasemi/cpufreq.c      |    2 +-
 arch/powerpc/platforms/powermac/cpufreq_32.c |    2 +-
 arch/powerpc/platforms/powermac/cpufreq_64.c |    2 +-
 drivers/cpufreq/acpi-cpufreq.c               |    2 +-
 drivers/cpufreq/arm_big_little.c             |    3 +-
 drivers/cpufreq/blackfin-cpufreq.c           |    2 +-
 drivers/cpufreq/cpufreq-cpu0.c               |    2 +-
 drivers/cpufreq/cpufreq.c                    |   87 ++++++++++++++++++++++++++
 drivers/cpufreq/cris-artpec3-cpufreq.c       |    2 +-
 drivers/cpufreq/cris-etraxfs-cpufreq.c       |    2 +-
 drivers/cpufreq/davinci-cpufreq.c            |    2 +-
 drivers/cpufreq/dbx500-cpufreq.c             |    2 +-
 drivers/cpufreq/e_powersaver.c               |    3 +-
 drivers/cpufreq/elanfreq.c                   |    2 +-
 drivers/cpufreq/exynos-cpufreq.c             |    3 +-
 drivers/cpufreq/exynos5440-cpufreq.c         |    2 +-
 drivers/cpufreq/freq_table.c                 |   44 ++++++++++---
 drivers/cpufreq/ia64-acpi-cpufreq.c          |    2 +-
 drivers/cpufreq/imx6q-cpufreq.c              |    2 +-
 drivers/cpufreq/kirkwood-cpufreq.c           |    3 +-
 drivers/cpufreq/longhaul.c                   |    2 +-
 drivers/cpufreq/loongson2_cpufreq.c          |    2 +-
 drivers/cpufreq/maple-cpufreq.c              |    2 +-
 drivers/cpufreq/omap-cpufreq.c               |    2 +-
 drivers/cpufreq/p4-clockmod.c                |    2 +-
 drivers/cpufreq/powernow-k6.c                |    2 +-
 drivers/cpufreq/powernow-k7.c                |    2 +-
 drivers/cpufreq/powernow-k8.c                |    2 +-
 drivers/cpufreq/ppc_cbe_cpufreq.c            |    2 +-
 drivers/cpufreq/pxa2xx-cpufreq.c             |    4 +-
 drivers/cpufreq/pxa3xx-cpufreq.c             |    2 +-
 drivers/cpufreq/s3c2416-cpufreq.c            |    2 +-
 drivers/cpufreq/s3c64xx-cpufreq.c            |    2 +-
 drivers/cpufreq/s5pv210-cpufreq.c            |    2 +-
 drivers/cpufreq/sc520_freq.c                 |    2 +-
 drivers/cpufreq/sh-cpufreq.c                 |    2 +-
 drivers/cpufreq/sparc-us2e-cpufreq.c         |    2 +-
 drivers/cpufreq/sparc-us3-cpufreq.c          |    2 +-
 drivers/cpufreq/spear-cpufreq.c              |    3 +-
 drivers/cpufreq/speedstep-centrino.c         |    2 +-
 drivers/cpufreq/speedstep-ich.c              |    2 +-
 drivers/cpufreq/speedstep-smi.c              |    2 +-
 drivers/cpufreq/tegra-cpufreq.c              |    4 +-
 include/linux/cpufreq.h                      |   18 +++++-
 45 files changed, 187 insertions(+), 55 deletions(-)

diff --git a/arch/arm/mach-s3c24xx/cpufreq.c b/arch/arm/mach-s3c24xx/cpufreq.c
index 3c0e78e..882fcb5 100644
--- a/arch/arm/mach-s3c24xx/cpufreq.c
+++ b/arch/arm/mach-s3c24xx/cpufreq.c
@@ -387,7 +387,7 @@ static int s3c_cpufreq_init(struct cpufreq_policy *policy)
 	policy->cpuinfo.transition_latency = cpu_cur.info->latency;
 
 	if (ftab)
-		cpufreq_frequency_table_cpuinfo(policy, ftab);
+		cpufreq_frequency_table_cpuinfo(policy, ftab, 0);
 
 	return 0;
 }
diff --git a/arch/powerpc/platforms/pasemi/cpufreq.c b/arch/powerpc/platforms/pasemi/cpufreq.c
index be1e795..3d2fcc7 100644
--- a/arch/powerpc/platforms/pasemi/cpufreq.c
+++ b/arch/powerpc/platforms/pasemi/cpufreq.c
@@ -223,7 +223,7 @@ static int pas_cpufreq_cpu_init(struct cpufreq_policy *policy)
 	/* this ensures that policy->cpuinfo_min and policy->cpuinfo_max
 	 * are set correctly
 	 */
-	return cpufreq_frequency_table_cpuinfo(policy, pas_freqs);
+	return cpufreq_frequency_table_cpuinfo(policy, pas_freqs, 0);
 
 out_unmap_sdcpwr:
 	iounmap(sdcpwr_mapbase);
diff --git a/arch/powerpc/platforms/powermac/cpufreq_32.c b/arch/powerpc/platforms/powermac/cpufreq_32.c
index 3104fad..f9805c6 100644
--- a/arch/powerpc/platforms/powermac/cpufreq_32.c
+++ b/arch/powerpc/platforms/powermac/cpufreq_32.c
@@ -408,7 +408,7 @@ static int pmac_cpufreq_cpu_init(struct cpufreq_policy *policy)
 	policy->cur = cur_freq;
 
 	cpufreq_frequency_table_get_attr(pmac_cpu_freqs, policy->cpu);
-	return cpufreq_frequency_table_cpuinfo(policy, pmac_cpu_freqs);
+	return cpufreq_frequency_table_cpuinfo(policy, pmac_cpu_freqs, 0);
 }
 
 static u32 read_gpio(struct device_node *np)
diff --git a/arch/powerpc/platforms/powermac/cpufreq_64.c b/arch/powerpc/platforms/powermac/cpufreq_64.c
index 7ba4234..cb7869b 100644
--- a/arch/powerpc/platforms/powermac/cpufreq_64.c
+++ b/arch/powerpc/platforms/powermac/cpufreq_64.c
@@ -365,7 +365,7 @@ static int g5_cpufreq_cpu_init(struct cpufreq_policy *policy)
 	cpufreq_frequency_table_get_attr(g5_cpu_freqs, policy->cpu);
 
 	return cpufreq_frequency_table_cpuinfo(policy,
-		g5_cpu_freqs);
+					       g5_cpu_freqs, 0);
 }
 
 
diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c
index 2845566..abca529 100644
--- a/drivers/cpufreq/acpi-cpufreq.c
+++ b/drivers/cpufreq/acpi-cpufreq.c
@@ -819,7 +819,7 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
 	data->freq_table[valid_states].frequency = CPUFREQ_TABLE_END;
 	perf->state = 0;
 
-	result = cpufreq_frequency_table_cpuinfo(policy, data->freq_table);
+	result = cpufreq_frequency_table_cpuinfo(policy, data->freq_table, 0);
 	if (result)
 		goto err_freqfree;
 
diff --git a/drivers/cpufreq/arm_big_little.c b/drivers/cpufreq/arm_big_little.c
index 5d7f53f..f06567e 100644
--- a/drivers/cpufreq/arm_big_little.c
+++ b/drivers/cpufreq/arm_big_little.c
@@ -167,7 +167,8 @@ static int bL_cpufreq_init(struct cpufreq_policy *policy)
 	if (ret)
 		return ret;
 
-	ret = cpufreq_frequency_table_cpuinfo(policy, freq_table[cur_cluster]);
+	ret = cpufreq_frequency_table_cpuinfo(policy, freq_table[cur_cluster],
+					      0);
 	if (ret) {
 		dev_err(cpu_dev, "CPU %d, cluster: %d invalid freq table\n",
 				policy->cpu, cur_cluster);
diff --git a/drivers/cpufreq/blackfin-cpufreq.c b/drivers/cpufreq/blackfin-cpufreq.c
index 995511e80..65fc627 100644
--- a/drivers/cpufreq/blackfin-cpufreq.c
+++ b/drivers/cpufreq/blackfin-cpufreq.c
@@ -211,7 +211,7 @@ static int __bfin_cpu_init(struct cpufreq_policy *policy)
 
 	policy->cur = cclk;
 	cpufreq_frequency_table_get_attr(bfin_freq_table, policy->cpu);
-	return cpufreq_frequency_table_cpuinfo(policy, bfin_freq_table);
+	return cpufreq_frequency_table_cpuinfo(policy, bfin_freq_table, 0);
 }
 
 static struct freq_attr *bfin_freq_attr[] = {
diff --git a/drivers/cpufreq/cpufreq-cpu0.c b/drivers/cpufreq/cpufreq-cpu0.c
index ad1fde2..fd2f5f3 100644
--- a/drivers/cpufreq/cpufreq-cpu0.c
+++ b/drivers/cpufreq/cpufreq-cpu0.c
@@ -128,7 +128,7 @@ static int cpu0_cpufreq_init(struct cpufreq_policy *policy)
 {
 	int ret;
 
-	ret = cpufreq_frequency_table_cpuinfo(policy, freq_table);
+	ret = cpufreq_frequency_table_cpuinfo(policy, freq_table, 0);
 	if (ret) {
 		pr_err("invalid frequency table: %d\n", ret);
 		return ret;
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 2ce86ed..02e57db 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -40,6 +40,7 @@
  * also protects the cpufreq_cpu_data array.
  */
 static struct cpufreq_driver *cpufreq_driver;
+static bool cpufreq_boost_enabled;
 static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data);
 #ifdef CONFIG_HOTPLUG_CPU
 /* This one keeps track of the previously set governor of a removed CPU */
@@ -315,6 +316,30 @@ EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
 /*********************************************************************
  *                          SYSFS INTERFACE                          *
  *********************************************************************/
+ssize_t show_boost(struct kobject *kobj,
+				 struct attribute *attr, char *buf)
+{
+	return sprintf(buf, "%d\n", cpufreq_boost_enabled);
+}
+
+static ssize_t store_boost(struct kobject *kobj, struct attribute *attr,
+				  const char *buf, size_t count)
+{
+	int ret, enable;
+
+	ret = sscanf(buf, "%d", &enable);
+	if (ret != 1 || enable < 0 || enable > 1)
+		return -EINVAL;
+
+	if (cpufreq_boost_trigger_state(enable)) {
+		pr_err("%s: Cannot %sable boost!\n", __func__,
+		       enable ? "en" : "dis");
+		return -EINVAL;
+	}
+
+	return count;
+}
+define_one_global_rw(boost);
 
 static struct cpufreq_governor *__find_governor(const char *str_governor)
 {
@@ -1896,6 +1921,55 @@ static struct notifier_block __refdata cpufreq_cpu_notifier = {
 };
 
 /*********************************************************************
+ *               BOOST						     *
+ *********************************************************************/
+int cpufreq_boost_trigger_state(int state)
+{
+	struct cpufreq_frequency_table *freq_table;
+	struct cpufreq_policy *policy;
+	unsigned long flags;
+	int ret = 0, cpu;
+
+	if (!cpufreq_driver->boost_supported)
+		return -ENODEV;
+
+	if (cpufreq_boost_enabled != state) {
+		if (cpufreq_driver->set_boost_freq) {
+			ret = cpufreq_driver->set_boost_freq(state);
+			if (ret) {
+				pr_err("%s: BOOST cannot enable (%d)\n",
+				       __func__, ret);
+				return ret;
+			}
+		}
+
+		for_each_possible_cpu(cpu) {
+			policy = cpufreq_cpu_get(cpu);
+			freq_table = cpufreq_frequency_get_table(cpu);
+			if (policy && freq_table) {
+				write_lock_irqsave(&cpufreq_driver_lock, flags);
+				cpufreq_frequency_table_cpuinfo(policy,
+								freq_table,
+								state);
+				cpufreq_boost_enabled = state;
+				write_unlock_irqrestore(&cpufreq_driver_lock,
+							flags);
+			}
+		}
+	}
+
+	pr_debug("%s: cpufreq BOOST %s\n", __func__,
+		 state ? "enabled" : "disabled");
+
+	return 0;
+}
+
+int cpufreq_boost_state(void)
+{
+	return cpufreq_boost_enabled;
+}
+
+/*********************************************************************
  *               REGISTER / UNREGISTER CPUFREQ DRIVER                *
  *********************************************************************/
 
@@ -1934,6 +2008,15 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 	cpufreq_driver = driver_data;
 	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
 
+	if (cpufreq_driver->boost_supported) {
+		ret = cpufreq_sysfs_create_file(&(boost.attr));
+		if (ret) {
+			pr_err("%s: cannot register global boost sysfs file\n",
+				__func__);
+			goto err_null_driver;
+		}
+	}
+
 	ret = subsys_interface_register(&cpufreq_interface);
 	if (ret)
 		goto err_null_driver;
@@ -1990,6 +2073,10 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
 	pr_debug("unregistering driver %s\n", driver->name);
 
 	subsys_interface_unregister(&cpufreq_interface);
+
+	if (cpufreq_driver->boost_supported)
+		cpufreq_sysfs_remove_file(&(boost.attr));
+
 	unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
 
 	write_lock_irqsave(&cpufreq_driver_lock, flags);
diff --git a/drivers/cpufreq/cris-artpec3-cpufreq.c b/drivers/cpufreq/cris-artpec3-cpufreq.c
index ee142c4..a50b6f5 100644
--- a/drivers/cpufreq/cris-artpec3-cpufreq.c
+++ b/drivers/cpufreq/cris-artpec3-cpufreq.c
@@ -82,7 +82,7 @@ static int cris_freq_cpu_init(struct cpufreq_policy *policy)
 	policy->cpuinfo.transition_latency = 1000000; /* 1ms */
 	policy->cur = cris_freq_get_cpu_frequency(0);
 
-	result = cpufreq_frequency_table_cpuinfo(policy, cris_freq_table);
+	result = cpufreq_frequency_table_cpuinfo(policy, cris_freq_table, 0);
 	if (result)
 		return (result);
 
diff --git a/drivers/cpufreq/cris-etraxfs-cpufreq.c b/drivers/cpufreq/cris-etraxfs-cpufreq.c
index 1295223..3e09693 100644
--- a/drivers/cpufreq/cris-etraxfs-cpufreq.c
+++ b/drivers/cpufreq/cris-etraxfs-cpufreq.c
@@ -81,7 +81,7 @@ static int cris_freq_cpu_init(struct cpufreq_policy *policy)
 	policy->cpuinfo.transition_latency = 1000000;	/* 1ms */
 	policy->cur = cris_freq_get_cpu_frequency(0);
 
-	result = cpufreq_frequency_table_cpuinfo(policy, cris_freq_table);
+	result = cpufreq_frequency_table_cpuinfo(policy, cris_freq_table, 0);
 	if (result)
 		return (result);
 
diff --git a/drivers/cpufreq/davinci-cpufreq.c b/drivers/cpufreq/davinci-cpufreq.c
index c33c76c..e1ec64f 100644
--- a/drivers/cpufreq/davinci-cpufreq.c
+++ b/drivers/cpufreq/davinci-cpufreq.c
@@ -137,7 +137,7 @@ static int davinci_cpu_init(struct cpufreq_policy *policy)
 
 	policy->cur = davinci_getspeed(0);
 
-	result = cpufreq_frequency_table_cpuinfo(policy, freq_table);
+	result = cpufreq_frequency_table_cpuinfo(policy, freq_table, 0);
 	if (result) {
 		pr_err("%s: cpufreq_frequency_table_cpuinfo() failed",
 				__func__);
diff --git a/drivers/cpufreq/dbx500-cpufreq.c b/drivers/cpufreq/dbx500-cpufreq.c
index 6ec6539..30b89eb 100644
--- a/drivers/cpufreq/dbx500-cpufreq.c
+++ b/drivers/cpufreq/dbx500-cpufreq.c
@@ -87,7 +87,7 @@ static int __cpuinit dbx500_cpufreq_init(struct cpufreq_policy *policy)
 	int res;
 
 	/* get policy fields based on the table */
-	res = cpufreq_frequency_table_cpuinfo(policy, freq_table);
+	res = cpufreq_frequency_table_cpuinfo(policy, freq_table, 0);
 	if (!res)
 		cpufreq_frequency_table_get_attr(freq_table, policy->cpu);
 	else {
diff --git a/drivers/cpufreq/e_powersaver.c b/drivers/cpufreq/e_powersaver.c
index 37380fb..1eea205 100644
--- a/drivers/cpufreq/e_powersaver.c
+++ b/drivers/cpufreq/e_powersaver.c
@@ -400,7 +400,8 @@ static int eps_cpu_init(struct cpufreq_policy *policy)
 	policy->cpuinfo.transition_latency = 140000; /* 844mV -> 700mV in ns */
 	policy->cur = fsb * current_multiplier;
 
-	ret = cpufreq_frequency_table_cpuinfo(policy, &centaur->freq_table[0]);
+	ret = cpufreq_frequency_table_cpuinfo(policy, &centaur->freq_table[0],
+					      0);
 	if (ret) {
 		kfree(centaur);
 		return ret;
diff --git a/drivers/cpufreq/elanfreq.c b/drivers/cpufreq/elanfreq.c
index 658d860..6700524 100644
--- a/drivers/cpufreq/elanfreq.c
+++ b/drivers/cpufreq/elanfreq.c
@@ -223,7 +223,7 @@ static int elanfreq_cpu_init(struct cpufreq_policy *policy)
 	policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL;
 	policy->cur = elanfreq_get_cpu_frequency(0);
 
-	result = cpufreq_frequency_table_cpuinfo(policy, elanfreq_table);
+	result = cpufreq_frequency_table_cpuinfo(policy, elanfreq_table, 0);
 	if (result)
 		return result;
 
diff --git a/drivers/cpufreq/exynos-cpufreq.c b/drivers/cpufreq/exynos-cpufreq.c
index 3197d88..32ec2f6 100644
--- a/drivers/cpufreq/exynos-cpufreq.c
+++ b/drivers/cpufreq/exynos-cpufreq.c
@@ -253,7 +253,8 @@ static int exynos_cpufreq_cpu_init(struct cpufreq_policy *policy)
 
 	cpumask_setall(policy->cpus);
 
-	return cpufreq_frequency_table_cpuinfo(policy, exynos_info->freq_table);
+	return cpufreq_frequency_table_cpuinfo(policy, exynos_info->freq_table,
+					       0);
 }
 
 static int exynos_cpufreq_cpu_exit(struct cpufreq_policy *policy)
diff --git a/drivers/cpufreq/exynos5440-cpufreq.c b/drivers/cpufreq/exynos5440-cpufreq.c
index 0c74018..936e239 100644
--- a/drivers/cpufreq/exynos5440-cpufreq.c
+++ b/drivers/cpufreq/exynos5440-cpufreq.c
@@ -323,7 +323,7 @@ static int exynos_cpufreq_cpu_init(struct cpufreq_policy *policy)
 {
 	int ret;
 
-	ret = cpufreq_frequency_table_cpuinfo(policy, dvfs_info->freq_table);
+	ret = cpufreq_frequency_table_cpuinfo(policy, dvfs_info->freq_table, 0);
 	if (ret) {
 		dev_err(dvfs_info->dev, "Invalid frequency table: %d\n", ret);
 		return ret;
diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c
index d7a7966..f1a4d785 100644
--- a/drivers/cpufreq/freq_table.c
+++ b/drivers/cpufreq/freq_table.c
@@ -21,7 +21,8 @@
  *********************************************************************/
 
 int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
-				    struct cpufreq_frequency_table *table)
+				    struct cpufreq_frequency_table *table,
+				    int boost)
 {
 	unsigned int min_freq = ~0;
 	unsigned int max_freq = 0;
@@ -31,9 +32,11 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
 		unsigned int freq = table[i].frequency;
 		if (freq == CPUFREQ_ENTRY_INVALID) {
 			pr_debug("table entry %u is invalid, skipping\n", i);
-
 			continue;
 		}
+		if (!boost && table[i].index == CPUFREQ_BOOST_FREQ)
+			continue;
+
 		pr_debug("table entry %u: %u kHz, %u index\n",
 					i, freq, table[i].index);
 		if (freq < min_freq)
@@ -171,7 +174,8 @@ static DEFINE_PER_CPU(struct cpufreq_frequency_table *, cpufreq_show_table);
 /**
  * show_available_freqs - show available frequencies for the specified CPU
  */
-static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
+static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf,
+				    int show_boost)
 {
 	unsigned int i = 0;
 	unsigned int cpu = policy->cpu;
@@ -186,22 +190,42 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
 	for (i = 0; (table[i].frequency != CPUFREQ_TABLE_END); i++) {
 		if (table[i].frequency == CPUFREQ_ENTRY_INVALID)
 			continue;
+		if (show_boost && table[i].index != CPUFREQ_BOOST_FREQ)
+			continue;
+		if (!show_boost && table[i].index == CPUFREQ_BOOST_FREQ)
+			continue;
+
 		count += sprintf(&buf[count], "%d ", table[i].frequency);
 	}
 	count += sprintf(&buf[count], "\n");
 
 	return count;
-
 }
 
-struct freq_attr cpufreq_freq_attr_scaling_available_freqs = {
-	.attr = { .name = "scaling_available_frequencies",
-		  .mode = 0444,
-		},
-	.show = show_available_freqs,
-};
+/**
+ * show_scaling_available_frequencies - show normal boost frequencies for
+ * the specified CPU
+ */
+static ssize_t scaling_available_frequencies_show(struct cpufreq_policy *policy,
+						  char *buf)
+{
+	return show_available_freqs(policy, buf, 0);
+}
+cpufreq_attr_available_freq(scaling_available);
 EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_available_freqs);
 
+/**
+ * show_available_boost_freqs - show available boost frequencies for
+ * the specified CPU
+ */
+static ssize_t scaling_boost_frequencies_show(struct cpufreq_policy *policy,
+					      char *buf)
+{
+	return show_available_freqs(policy, buf, 1);
+}
+cpufreq_attr_available_freq(scaling_boost);
+EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_boost_freqs);
+
 /*
  * if you use these, you must assure that the frequency table is valid
  * all the time between get_attr and put_attr!
diff --git a/drivers/cpufreq/ia64-acpi-cpufreq.c b/drivers/cpufreq/ia64-acpi-cpufreq.c
index c0075db..7a29a92 100644
--- a/drivers/cpufreq/ia64-acpi-cpufreq.c
+++ b/drivers/cpufreq/ia64-acpi-cpufreq.c
@@ -335,7 +335,7 @@ acpi_cpufreq_cpu_init (
 		}
 	}
 
-	result = cpufreq_frequency_table_cpuinfo(policy, data->freq_table);
+	result = cpufreq_frequency_table_cpuinfo(policy, data->freq_table, 0);
 	if (result) {
 		goto err_freqfree;
 	}
diff --git a/drivers/cpufreq/imx6q-cpufreq.c b/drivers/cpufreq/imx6q-cpufreq.c
index b78bc35..9d09c29 100644
--- a/drivers/cpufreq/imx6q-cpufreq.c
+++ b/drivers/cpufreq/imx6q-cpufreq.c
@@ -172,7 +172,7 @@ static int imx6q_cpufreq_init(struct cpufreq_policy *policy)
 {
 	int ret;
 
-	ret = cpufreq_frequency_table_cpuinfo(policy, freq_table);
+	ret = cpufreq_frequency_table_cpuinfo(policy, freq_table, 0);
 	if (ret) {
 		dev_err(cpu_dev, "invalid frequency table: %d\n", ret);
 		return ret;
diff --git a/drivers/cpufreq/kirkwood-cpufreq.c b/drivers/cpufreq/kirkwood-cpufreq.c
index b2644af..03b95bd 100644
--- a/drivers/cpufreq/kirkwood-cpufreq.c
+++ b/drivers/cpufreq/kirkwood-cpufreq.c
@@ -131,7 +131,8 @@ static int kirkwood_cpufreq_cpu_init(struct cpufreq_policy *policy)
 	policy->cpuinfo.transition_latency = 5000; /* 5uS */
 	policy->cur = kirkwood_cpufreq_get_cpu_frequency(0);
 
-	result = cpufreq_frequency_table_cpuinfo(policy, kirkwood_freq_table);
+	result = cpufreq_frequency_table_cpuinfo(policy, kirkwood_freq_table,
+						 0);
 	if (result)
 		return result;
 
diff --git a/drivers/cpufreq/longhaul.c b/drivers/cpufreq/longhaul.c
index b448638..ef2cea3 100644
--- a/drivers/cpufreq/longhaul.c
+++ b/drivers/cpufreq/longhaul.c
@@ -921,7 +921,7 @@ static int __cpuinit longhaul_cpu_init(struct cpufreq_policy *policy)
 	policy->cpuinfo.transition_latency = 200000;	/* nsec */
 	policy->cur = calc_speed(longhaul_get_cpu_mult());
 
-	ret = cpufreq_frequency_table_cpuinfo(policy, longhaul_table);
+	ret = cpufreq_frequency_table_cpuinfo(policy, longhaul_table, 0);
 	if (ret)
 		return ret;
 
diff --git a/drivers/cpufreq/loongson2_cpufreq.c b/drivers/cpufreq/loongson2_cpufreq.c
index d539127..fc8bcbb 100644
--- a/drivers/cpufreq/loongson2_cpufreq.c
+++ b/drivers/cpufreq/loongson2_cpufreq.c
@@ -136,7 +136,7 @@ static int loongson2_cpufreq_cpu_init(struct cpufreq_policy *policy)
 					 policy->cpu);
 
 	return cpufreq_frequency_table_cpuinfo(policy,
-					    &loongson2_clockmod_table[0]);
+					       &loongson2_clockmod_table[0], 0);
 }
 
 static int loongson2_cpufreq_verify(struct cpufreq_policy *policy)
diff --git a/drivers/cpufreq/maple-cpufreq.c b/drivers/cpufreq/maple-cpufreq.c
index cdd6291..1b35285 100644
--- a/drivers/cpufreq/maple-cpufreq.c
+++ b/drivers/cpufreq/maple-cpufreq.c
@@ -184,7 +184,7 @@ static int maple_cpufreq_cpu_init(struct cpufreq_policy *policy)
 	cpufreq_frequency_table_get_attr(maple_cpu_freqs, policy->cpu);
 
 	return cpufreq_frequency_table_cpuinfo(policy,
-		maple_cpu_freqs);
+					       maple_cpu_freqs, 0);
 }
 
 
diff --git a/drivers/cpufreq/omap-cpufreq.c b/drivers/cpufreq/omap-cpufreq.c
index 0279d18..30473ae 100644
--- a/drivers/cpufreq/omap-cpufreq.c
+++ b/drivers/cpufreq/omap-cpufreq.c
@@ -191,7 +191,7 @@ static int __cpuinit omap_cpu_init(struct cpufreq_policy *policy)
 
 	atomic_inc_return(&freq_table_users);
 
-	result = cpufreq_frequency_table_cpuinfo(policy, freq_table);
+	result = cpufreq_frequency_table_cpuinfo(policy, freq_table, 0);
 	if (result)
 		goto fail_table;
 
diff --git a/drivers/cpufreq/p4-clockmod.c b/drivers/cpufreq/p4-clockmod.c
index 421ef37..8f36e69 100644
--- a/drivers/cpufreq/p4-clockmod.c
+++ b/drivers/cpufreq/p4-clockmod.c
@@ -239,7 +239,7 @@ static int cpufreq_p4_cpu_init(struct cpufreq_policy *policy)
 	policy->cpuinfo.transition_latency = 10000001;
 	policy->cur = stock_freq;
 
-	return cpufreq_frequency_table_cpuinfo(policy, &p4clockmod_table[0]);
+	return cpufreq_frequency_table_cpuinfo(policy, &p4clockmod_table[0], 0);
 }
 
 
diff --git a/drivers/cpufreq/powernow-k6.c b/drivers/cpufreq/powernow-k6.c
index ea0222a..4ffe7d5 100644
--- a/drivers/cpufreq/powernow-k6.c
+++ b/drivers/cpufreq/powernow-k6.c
@@ -167,7 +167,7 @@ static int powernow_k6_cpu_init(struct cpufreq_policy *policy)
 	policy->cpuinfo.transition_latency = 200000;
 	policy->cur = busfreq * max_multiplier;
 
-	result = cpufreq_frequency_table_cpuinfo(policy, clock_ratio);
+	result = cpufreq_frequency_table_cpuinfo(policy, clock_ratio, 0);
 	if (result)
 		return result;
 
diff --git a/drivers/cpufreq/powernow-k7.c b/drivers/cpufreq/powernow-k7.c
index 53888da..73c8345 100644
--- a/drivers/cpufreq/powernow-k7.c
+++ b/drivers/cpufreq/powernow-k7.c
@@ -683,7 +683,7 @@ static int __cpuinit powernow_cpu_init(struct cpufreq_policy *policy)
 
 	cpufreq_frequency_table_get_attr(powernow_table, policy->cpu);
 
-	return cpufreq_frequency_table_cpuinfo(policy, powernow_table);
+	return cpufreq_frequency_table_cpuinfo(policy, powernow_table, 0);
 }
 
 static int powernow_cpu_exit(struct cpufreq_policy *policy)
diff --git a/drivers/cpufreq/powernow-k8.c b/drivers/cpufreq/powernow-k8.c
index b828efe..67d3283 100644
--- a/drivers/cpufreq/powernow-k8.c
+++ b/drivers/cpufreq/powernow-k8.c
@@ -1156,7 +1156,7 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
 	pr_debug("policy current frequency %d kHz\n", pol->cur);
 
 	/* min/max the cpu is capable of */
-	if (cpufreq_frequency_table_cpuinfo(pol, data->powernow_table)) {
+	if (cpufreq_frequency_table_cpuinfo(pol, data->powernow_table), 0) {
 		printk(KERN_ERR FW_BUG PFX "invalid powernow_table\n");
 		powernow_k8_cpu_exit_acpi(data);
 		kfree(data->powernow_table);
diff --git a/drivers/cpufreq/ppc_cbe_cpufreq.c b/drivers/cpufreq/ppc_cbe_cpufreq.c
index e577a1d..b50d9f1 100644
--- a/drivers/cpufreq/ppc_cbe_cpufreq.c
+++ b/drivers/cpufreq/ppc_cbe_cpufreq.c
@@ -127,7 +127,7 @@ static int cbe_cpufreq_cpu_init(struct cpufreq_policy *policy)
 
 	/* this ensures that policy->cpuinfo_min
 	 * and policy->cpuinfo_max are set correctly */
-	return cpufreq_frequency_table_cpuinfo(policy, cbe_freqs);
+	return cpufreq_frequency_table_cpuinfo(policy, cbe_freqs, 0);
 }
 
 static int cbe_cpufreq_cpu_exit(struct cpufreq_policy *policy)
diff --git a/drivers/cpufreq/pxa2xx-cpufreq.c b/drivers/cpufreq/pxa2xx-cpufreq.c
index 9e5bc8e..cd5d74a 100644
--- a/drivers/cpufreq/pxa2xx-cpufreq.c
+++ b/drivers/cpufreq/pxa2xx-cpufreq.c
@@ -453,10 +453,10 @@ static int pxa_cpufreq_init(struct cpufreq_policy *policy)
 		find_freq_tables(&pxa255_freq_table, &pxa255_freqs);
 		pr_info("PXA255 cpufreq using %s frequency table\n",
 			pxa255_turbo_table ? "turbo" : "run");
-		cpufreq_frequency_table_cpuinfo(policy, pxa255_freq_table);
+		cpufreq_frequency_table_cpuinfo(policy, pxa255_freq_table, 0);
 	}
 	else if (cpu_is_pxa27x())
-		cpufreq_frequency_table_cpuinfo(policy, pxa27x_freq_table);
+		cpufreq_frequency_table_cpuinfo(policy, pxa27x_freq_table, 0);
 
 	printk(KERN_INFO "PXA CPU frequency change support initialized\n");
 
diff --git a/drivers/cpufreq/pxa3xx-cpufreq.c b/drivers/cpufreq/pxa3xx-cpufreq.c
index 15d60f8..c16d3f8 100644
--- a/drivers/cpufreq/pxa3xx-cpufreq.c
+++ b/drivers/cpufreq/pxa3xx-cpufreq.c
@@ -108,7 +108,7 @@ static int setup_freqs_table(struct cpufreq_policy *policy,
 	pxa3xx_freqs_num = num;
 	pxa3xx_freqs_table = table;
 
-	return cpufreq_frequency_table_cpuinfo(policy, table);
+	return cpufreq_frequency_table_cpuinfo(policy, table, 0);
 }
 
 static void __update_core_freq(struct pxa3xx_freq_info *info)
diff --git a/drivers/cpufreq/s3c2416-cpufreq.c b/drivers/cpufreq/s3c2416-cpufreq.c
index 4f1881e..ea2b626 100644
--- a/drivers/cpufreq/s3c2416-cpufreq.c
+++ b/drivers/cpufreq/s3c2416-cpufreq.c
@@ -494,7 +494,7 @@ static int __init s3c2416_cpufreq_driver_init(struct cpufreq_policy *policy)
 	policy->cpuinfo.transition_latency = (500 * 1000) +
 					     s3c_freq->regulator_latency;
 
-	ret = cpufreq_frequency_table_cpuinfo(policy, s3c_freq->freq_table);
+	ret = cpufreq_frequency_table_cpuinfo(policy, s3c_freq->freq_table, 0);
 	if (ret)
 		goto err_freq_table;
 
diff --git a/drivers/cpufreq/s3c64xx-cpufreq.c b/drivers/cpufreq/s3c64xx-cpufreq.c
index 27cacb5..137d29b 100644
--- a/drivers/cpufreq/s3c64xx-cpufreq.c
+++ b/drivers/cpufreq/s3c64xx-cpufreq.c
@@ -247,7 +247,7 @@ static int s3c64xx_cpufreq_driver_init(struct cpufreq_policy *policy)
 	 */
 	policy->cpuinfo.transition_latency = (500 * 1000) + regulator_latency;
 
-	ret = cpufreq_frequency_table_cpuinfo(policy, s3c64xx_freq_table);
+	ret = cpufreq_frequency_table_cpuinfo(policy, s3c64xx_freq_table, 0);
 	if (ret != 0) {
 		pr_err("Failed to configure frequency table: %d\n",
 		       ret);
diff --git a/drivers/cpufreq/s5pv210-cpufreq.c b/drivers/cpufreq/s5pv210-cpufreq.c
index 5c77570..8b7c790 100644
--- a/drivers/cpufreq/s5pv210-cpufreq.c
+++ b/drivers/cpufreq/s5pv210-cpufreq.c
@@ -557,7 +557,7 @@ static int __init s5pv210_cpu_init(struct cpufreq_policy *policy)
 
 	policy->cpuinfo.transition_latency = 40000;
 
-	return cpufreq_frequency_table_cpuinfo(policy, s5pv210_freq_table);
+	return cpufreq_frequency_table_cpuinfo(policy, s5pv210_freq_table, 0);
 
 out_dmc1:
 	clk_put(dmc0_clk);
diff --git a/drivers/cpufreq/sc520_freq.c b/drivers/cpufreq/sc520_freq.c
index f740b13..d809fd0 100644
--- a/drivers/cpufreq/sc520_freq.c
+++ b/drivers/cpufreq/sc520_freq.c
@@ -117,7 +117,7 @@ static int sc520_freq_cpu_init(struct cpufreq_policy *policy)
 	policy->cpuinfo.transition_latency = 1000000; /* 1ms */
 	policy->cur = sc520_freq_get_cpu_frequency(0);
 
-	result = cpufreq_frequency_table_cpuinfo(policy, sc520_freq_table);
+	result = cpufreq_frequency_table_cpuinfo(policy, sc520_freq_table, 0);
 	if (result)
 		return result;
 
diff --git a/drivers/cpufreq/sh-cpufreq.c b/drivers/cpufreq/sh-cpufreq.c
index 73adb64..c064d7c 100644
--- a/drivers/cpufreq/sh-cpufreq.c
+++ b/drivers/cpufreq/sh-cpufreq.c
@@ -120,7 +120,7 @@ static int sh_cpufreq_cpu_init(struct cpufreq_policy *policy)
 	if (freq_table) {
 		int result;
 
-		result = cpufreq_frequency_table_cpuinfo(policy, freq_table);
+		result = cpufreq_frequency_table_cpuinfo(policy, freq_table, 0);
 		if (!result)
 			cpufreq_frequency_table_get_attr(freq_table, cpu);
 	} else {
diff --git a/drivers/cpufreq/sparc-us2e-cpufreq.c b/drivers/cpufreq/sparc-us2e-cpufreq.c
index 306ae46..c0345c4 100644
--- a/drivers/cpufreq/sparc-us2e-cpufreq.c
+++ b/drivers/cpufreq/sparc-us2e-cpufreq.c
@@ -324,7 +324,7 @@ static int __init us2e_freq_cpu_init(struct cpufreq_policy *policy)
 	policy->cpuinfo.transition_latency = 0;
 	policy->cur = clock_tick;
 
-	return cpufreq_frequency_table_cpuinfo(policy, table);
+	return cpufreq_frequency_table_cpuinfo(policy, table, 0);
 }
 
 static int us2e_freq_cpu_exit(struct cpufreq_policy *policy)
diff --git a/drivers/cpufreq/sparc-us3-cpufreq.c b/drivers/cpufreq/sparc-us3-cpufreq.c
index c71ee14..27a03b6 100644
--- a/drivers/cpufreq/sparc-us3-cpufreq.c
+++ b/drivers/cpufreq/sparc-us3-cpufreq.c
@@ -181,7 +181,7 @@ static int __init us3_freq_cpu_init(struct cpufreq_policy *policy)
 	policy->cpuinfo.transition_latency = 0;
 	policy->cur = clock_tick;
 
-	return cpufreq_frequency_table_cpuinfo(policy, table);
+	return cpufreq_frequency_table_cpuinfo(policy, table, 0);
 }
 
 static int us3_freq_cpu_exit(struct cpufreq_policy *policy)
diff --git a/drivers/cpufreq/spear-cpufreq.c b/drivers/cpufreq/spear-cpufreq.c
index 156829f..517e19c 100644
--- a/drivers/cpufreq/spear-cpufreq.c
+++ b/drivers/cpufreq/spear-cpufreq.c
@@ -178,7 +178,8 @@ static int spear_cpufreq_init(struct cpufreq_policy *policy)
 {
 	int ret;
 
-	ret = cpufreq_frequency_table_cpuinfo(policy, spear_cpufreq.freq_tbl);
+	ret = cpufreq_frequency_table_cpuinfo(policy, spear_cpufreq.freq_tbl,
+					      0);
 	if (ret) {
 		pr_err("cpufreq_frequency_table_cpuinfo() failed");
 		return ret;
diff --git a/drivers/cpufreq/speedstep-centrino.c b/drivers/cpufreq/speedstep-centrino.c
index 618e6f4..85b981b 100644
--- a/drivers/cpufreq/speedstep-centrino.c
+++ b/drivers/cpufreq/speedstep-centrino.c
@@ -403,7 +403,7 @@ static int centrino_cpu_init(struct cpufreq_policy *policy)
 	pr_debug("centrino_cpu_init: cur=%dkHz\n", policy->cur);
 
 	ret = cpufreq_frequency_table_cpuinfo(policy,
-		per_cpu(centrino_model, policy->cpu)->op_points);
+			per_cpu(centrino_model, policy->cpu)->op_points, 0);
 	if (ret)
 		return (ret);
 
diff --git a/drivers/cpufreq/speedstep-ich.c b/drivers/cpufreq/speedstep-ich.c
index e2e5aa9..711c973 100644
--- a/drivers/cpufreq/speedstep-ich.c
+++ b/drivers/cpufreq/speedstep-ich.c
@@ -349,7 +349,7 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy)
 	/* cpuinfo and default policy values */
 	policy->cur = speed;
 
-	result = cpufreq_frequency_table_cpuinfo(policy, speedstep_freqs);
+	result = cpufreq_frequency_table_cpuinfo(policy, speedstep_freqs, 0);
 	if (result)
 		return result;
 
diff --git a/drivers/cpufreq/speedstep-smi.c b/drivers/cpufreq/speedstep-smi.c
index f5a6b70..569e75e 100644
--- a/drivers/cpufreq/speedstep-smi.c
+++ b/drivers/cpufreq/speedstep-smi.c
@@ -329,7 +329,7 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy)
 	policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL;
 	policy->cur = speed;
 
-	result = cpufreq_frequency_table_cpuinfo(policy, speedstep_freqs);
+	result = cpufreq_frequency_table_cpuinfo(policy, speedstep_freqs, 0);
 	if (result)
 		return result;
 
diff --git a/drivers/cpufreq/tegra-cpufreq.c b/drivers/cpufreq/tegra-cpufreq.c
index c74c0e1..8bf95e0 100644
--- a/drivers/cpufreq/tegra-cpufreq.c
+++ b/drivers/cpufreq/tegra-cpufreq.c
@@ -216,7 +216,7 @@ static int tegra_cpu_init(struct cpufreq_policy *policy)
 	clk_prepare_enable(emc_clk);
 	clk_prepare_enable(cpu_clk);
 
-	cpufreq_frequency_table_cpuinfo(policy, freq_table);
+	cpufreq_frequency_table_cpuinfo(policy, freq_table, 0);
 	cpufreq_frequency_table_get_attr(freq_table, policy->cpu);
 	policy->cur = tegra_getspeed(policy->cpu);
 	target_cpu_speed[policy->cpu] = policy->cur;
@@ -234,7 +234,7 @@ static int tegra_cpu_init(struct cpufreq_policy *policy)
 
 static int tegra_cpu_exit(struct cpufreq_policy *policy)
 {
-	cpufreq_frequency_table_cpuinfo(policy, freq_table);
+	cpufreq_frequency_table_cpuinfo(policy, freq_table, 0);
 	clk_disable_unprepare(emc_clk);
 	return 0;
 }
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index ab1932c..027442d 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -266,6 +266,10 @@ struct cpufreq_driver {
 	int	(*suspend)	(struct cpufreq_policy *policy);
 	int	(*resume)	(struct cpufreq_policy *policy);
 	struct freq_attr	**attr;
+
+	/* platform specific boost support code */
+	bool                    boost_supported;
+	int (*set_boost_freq)   (int state);
 };
 
 /* flags */
@@ -318,6 +322,10 @@ __ATTR(_name, _perm, show_##_name, NULL)
 static struct freq_attr _name =			\
 __ATTR(_name, 0644, show_##_name, store_##_name)
 
+#define cpufreq_attr_available_freq(_name)	  \
+struct freq_attr cpufreq_freq_attr_##_name##_freqs =     \
+__ATTR_RO(_name##_frequencies)
+
 struct global_attr {
 	struct attribute attr;
 	ssize_t (*show)(struct kobject *kobj,
@@ -407,6 +415,9 @@ extern struct cpufreq_governor cpufreq_gov_conservative;
 #define CPUFREQ_ENTRY_INVALID ~0
 #define CPUFREQ_TABLE_END     ~1
 
+/* Define index for boost frequency */
+#define CPUFREQ_BOOST_FREQ    ~2
+
 struct cpufreq_frequency_table {
 	unsigned int	index;     /* any */
 	unsigned int	frequency; /* kHz - doesn't need to be in ascending
@@ -414,7 +425,8 @@ struct cpufreq_frequency_table {
 };
 
 int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
-				    struct cpufreq_frequency_table *table);
+				    struct cpufreq_frequency_table *table,
+				    int boost);
 
 int cpufreq_frequency_table_verify(struct cpufreq_policy *policy,
 				   struct cpufreq_frequency_table *table);
@@ -425,11 +437,15 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
 				   unsigned int relation,
 				   unsigned int *index);
 
+int cpufreq_boost_trigger_state(int state);
+int cpufreq_boost_state(void);
+
 /* the following 3 funtions are for cpufreq core use only */
 struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu);
 
 /* the following are really really optional */
 extern struct freq_attr cpufreq_freq_attr_scaling_available_freqs;
+extern struct freq_attr cpufreq_freq_attr_scaling_boost_freqs;
 
 void cpufreq_frequency_table_get_attr(struct cpufreq_frequency_table *table,
 				      unsigned int cpu);
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v3 2/3] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution
  2013-06-14  7:38 ` [PATCH v3 " Lukasz Majewski
  2013-06-14  7:38   ` [PATCH v3 1/3] cpufreq: Add boost frequency support in core Lukasz Majewski
@ 2013-06-14  7:38   ` Lukasz Majewski
  2013-06-14  7:39   ` [PATCH v3 3/3] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
  2013-06-17  3:20   ` [PATCH v3 0/3] cpufreq:boost: CPU Boost mode support Viresh Kumar
  3 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-14  7:38 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocky
  Cc: cpufreq, Linux PM list, Vincent Guittot, Lukasz Majewski,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

The Intel's hardware based boost solution driver has been changed to cooperate with
common cpufreq boost framework.

The global sysfs boost attribute entry code (/sys/devices/system/cpu/cpufreq/boost)
has been moved to a core cpufreq code. This attribute is now only visible,
when cpufreq driver supports it.
The boost supported global flag was replaced with the one defined at acpi's
cpufreq driver.

The _store_boost() function has been redesigned to be used as set_boost_freq
callback.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

Changes for v2:
- Replace boost_enabled and boost_supported global flags with proper entries
at struct cpufreq_driver.
- Removal of struct cpufreq_boost

Changes for v3:
- Bring back boost_enabled as a global flag
- Move boost_supported to cpufreq_driver structure

---
 drivers/cpufreq/acpi-cpufreq.c |   60 ++++++++++++++--------------------------
 1 file changed, 20 insertions(+), 40 deletions(-)

diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c
index abca529..9cd528e 100644
--- a/drivers/cpufreq/acpi-cpufreq.c
+++ b/drivers/cpufreq/acpi-cpufreq.c
@@ -80,7 +80,7 @@ static struct acpi_processor_performance __percpu *acpi_perf_data;
 static struct cpufreq_driver acpi_cpufreq_driver;
 
 static unsigned int acpi_pstate_strict;
-static bool boost_enabled, boost_supported;
+static bool boost_enabled;
 static struct msr __percpu *msrs;
 
 static bool boost_state(unsigned int cpu)
@@ -133,20 +133,10 @@ static void boost_set_msrs(bool enable, const struct cpumask *cpumask)
 	wrmsr_on_cpus(cpumask, msr_addr, msrs);
 }
 
-static ssize_t _store_boost(const char *buf, size_t count)
+static int _store_boost(int val)
 {
-	int ret;
-	unsigned long val = 0;
-
-	if (!boost_supported)
-		return -EINVAL;
-
-	ret = kstrtoul(buf, 10, &val);
-	if (ret || (val > 1))
-		return -EINVAL;
-
 	if ((val && boost_enabled) || (!val && !boost_enabled))
-		return count;
+		return 0;
 
 	get_online_cpus();
 
@@ -157,30 +147,31 @@ static ssize_t _store_boost(const char *buf, size_t count)
 	boost_enabled = val;
 	pr_debug("Core Boosting %sabled.\n", val ? "en" : "dis");
 
-	return count;
+	return 0;
 }
 
-static ssize_t store_global_boost(struct kobject *kobj, struct attribute *attr,
-				  const char *buf, size_t count)
+static ssize_t store_boost(const char *buf, size_t count)
 {
-	return _store_boost(buf, count);
-}
+	int ret;
+	unsigned long val = 0;
 
-static ssize_t show_global_boost(struct kobject *kobj,
-				 struct attribute *attr, char *buf)
-{
-	return sprintf(buf, "%u\n", boost_enabled);
-}
+	if (!acpi_cpufreq_driver.boost_supported)
+		return -EINVAL;
+
+	ret = kstrtoul(buf, 10, &val);
+	if (ret || (val > 1))
+		return -EINVAL;
 
-static struct global_attr global_boost = __ATTR(boost, 0644,
-						show_global_boost,
-						store_global_boost);
+	_store_boost((int) val);
+
+	return count;
+}
 
 #ifdef CONFIG_X86_ACPI_CPUFREQ_CPB
 static ssize_t store_cpb(struct cpufreq_policy *policy, const char *buf,
 			 size_t count)
 {
-	return _store_boost(buf, count);
+	return store_boost(buf, count);
 }
 
 static ssize_t show_cpb(struct cpufreq_policy *policy, char *buf)
@@ -930,8 +921,8 @@ static void __init acpi_cpufreq_boost_init(void)
 		if (!msrs)
 			return;
 
-		boost_supported = true;
 		boost_enabled = boost_state(0);
+		acpi_cpufreq_driver.boost_supported = true;
 
 		get_online_cpus();
 
@@ -941,22 +932,11 @@ static void __init acpi_cpufreq_boost_init(void)
 		register_cpu_notifier(&boost_nb);
 
 		put_online_cpus();
-	} else
-		global_boost.attr.mode = 0444;
-
-	/* We create the boost file in any case, though for systems without
-	 * hardware support it will be read-only and hardwired to return 0.
-	 */
-	if (cpufreq_sysfs_create_file(&(global_boost.attr)))
-		pr_warn(PFX "could not register global boost sysfs file\n");
-	else
-		pr_debug("registered global boost sysfs file\n");
+	}
 }
 
 static void __exit acpi_cpufreq_boost_exit(void)
 {
-	cpufreq_sysfs_remove_file(&(global_boost.attr));
-
 	if (msrs) {
 		unregister_cpu_notifier(&boost_nb);
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v3 3/3] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework
  2013-06-14  7:38 ` [PATCH v3 " Lukasz Majewski
  2013-06-14  7:38   ` [PATCH v3 1/3] cpufreq: Add boost frequency support in core Lukasz Majewski
  2013-06-14  7:38   ` [PATCH v3 2/3] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
@ 2013-06-14  7:39   ` Lukasz Majewski
  2013-06-17  3:20   ` [PATCH v3 0/3] cpufreq:boost: CPU Boost mode support Viresh Kumar
  3 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-14  7:39 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocky
  Cc: cpufreq, Linux PM list, Vincent Guittot, Lukasz Majewski,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

The struct cpufreq_driver has been extended to embrace the information
related to boost support.

When "boost_mode" device tree attribute is defined for a platform, the
boost_supported flag is set. Moreover boost related attributes were
exported.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

Changes for v2:
- Removal of struct cpufreq_boost
- Removal of the CONFIG_CPU_FREQ_BOOST flag
- low_level_boost with valid address when boost is supported

Changes for v3:
- Remove low level boost code
- Move boost management code to cpufreq core code
- Use boost_supported flag to indicate if driver supports over clocking

---
 drivers/cpufreq/exynos-cpufreq.c |    4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/cpufreq/exynos-cpufreq.c b/drivers/cpufreq/exynos-cpufreq.c
index 32ec2f6..0420d47 100644
--- a/drivers/cpufreq/exynos-cpufreq.c
+++ b/drivers/cpufreq/exynos-cpufreq.c
@@ -265,6 +265,7 @@ static int exynos_cpufreq_cpu_exit(struct cpufreq_policy *policy)
 
 static struct freq_attr *exynos_cpufreq_attr[] = {
 	&cpufreq_freq_attr_scaling_available_freqs,
+	&cpufreq_freq_attr_scaling_boost_freqs,
 	NULL,
 };
 
@@ -360,6 +361,7 @@ static struct of_device_id exynos_cpufreq_of_match[] __initconst = {
 
 static int __init exynos_cpufreq_probe(struct platform_device *pdev)
 {
+	struct device_node *node = pdev->dev.of_node;
 	int ret = -EINVAL;
 
 	exynos_info = kzalloc(sizeof(struct exynos_dvfs_info), GFP_KERNEL);
@@ -392,6 +394,8 @@ static int __init exynos_cpufreq_probe(struct platform_device *pdev)
 	}
 
 	locking_frequency = exynos_getspeed(0);
+	if (of_property_read_bool(node, "boost_mode"))
+		exynos_driver.boost_supported = 1;
 
 	register_pm_notifier(&exynos_cpufreq_nb);
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* Re: [PATCH v3 0/3] cpufreq:boost: CPU Boost mode support
  2013-06-14  7:38 ` [PATCH v3 " Lukasz Majewski
                     ` (2 preceding siblings ...)
  2013-06-14  7:39   ` [PATCH v3 3/3] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
@ 2013-06-17  3:20   ` Viresh Kumar
  2013-06-17  5:41     ` Lukasz Majewski
  3 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-17  3:20 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

On 14 June 2013 13:08, Lukasz Majewski <l.majewski@samsung.com> wrote:
>  arch/arm/mach-s3c24xx/cpufreq.c              |    2 +-
>  arch/powerpc/platforms/pasemi/cpufreq.c      |    2 +-
>  arch/powerpc/platforms/powermac/cpufreq_32.c |    2 +-
>  arch/powerpc/platforms/powermac/cpufreq_64.c |    2 +-
>  drivers/cpufreq/acpi-cpufreq.c               |   62 +++++++-----------
>  drivers/cpufreq/arm_big_little.c             |    3 +-
>  drivers/cpufreq/blackfin-cpufreq.c           |    2 +-
>  drivers/cpufreq/cpufreq-cpu0.c               |    2 +-
>  drivers/cpufreq/cpufreq.c                    |   87 ++++++++++++++++++++++++++
>  drivers/cpufreq/cris-artpec3-cpufreq.c       |    2 +-
>  drivers/cpufreq/cris-etraxfs-cpufreq.c       |    2 +-
>  drivers/cpufreq/davinci-cpufreq.c            |    2 +-
>  drivers/cpufreq/dbx500-cpufreq.c             |    2 +-
>  drivers/cpufreq/e_powersaver.c               |    3 +-
>  drivers/cpufreq/elanfreq.c                   |    2 +-
>  drivers/cpufreq/exynos-cpufreq.c             |    7 ++-
>  drivers/cpufreq/exynos5440-cpufreq.c         |    2 +-
>  drivers/cpufreq/freq_table.c                 |   44 ++++++++++---
>  drivers/cpufreq/ia64-acpi-cpufreq.c          |    2 +-
>  drivers/cpufreq/imx6q-cpufreq.c              |    2 +-
>  drivers/cpufreq/kirkwood-cpufreq.c           |    3 +-
>  drivers/cpufreq/longhaul.c                   |    2 +-
>  drivers/cpufreq/loongson2_cpufreq.c          |    2 +-
>  drivers/cpufreq/maple-cpufreq.c              |    2 +-
>  drivers/cpufreq/omap-cpufreq.c               |    2 +-
>  drivers/cpufreq/p4-clockmod.c                |    2 +-
>  drivers/cpufreq/powernow-k6.c                |    2 +-
>  drivers/cpufreq/powernow-k7.c                |    2 +-
>  drivers/cpufreq/powernow-k8.c                |    2 +-
>  drivers/cpufreq/ppc_cbe_cpufreq.c            |    2 +-
>  drivers/cpufreq/pxa2xx-cpufreq.c             |    4 +-
>  drivers/cpufreq/pxa3xx-cpufreq.c             |    2 +-
>  drivers/cpufreq/s3c2416-cpufreq.c            |    2 +-
>  drivers/cpufreq/s3c64xx-cpufreq.c            |    2 +-
>  drivers/cpufreq/s5pv210-cpufreq.c            |    2 +-
>  drivers/cpufreq/sc520_freq.c                 |    2 +-
>  drivers/cpufreq/sh-cpufreq.c                 |    2 +-
>  drivers/cpufreq/sparc-us2e-cpufreq.c         |    2 +-
>  drivers/cpufreq/sparc-us3-cpufreq.c          |    2 +-
>  drivers/cpufreq/spear-cpufreq.c              |    3 +-
>  drivers/cpufreq/speedstep-centrino.c         |    2 +-
>  drivers/cpufreq/speedstep-ich.c              |    2 +-
>  drivers/cpufreq/speedstep-smi.c              |    2 +-
>  drivers/cpufreq/tegra-cpufreq.c              |    4 +-
>  include/linux/cpufreq.h                      |   18 +++++-
>  45 files changed, 211 insertions(+), 95 deletions(-)

Wow!! I am shocked to see these many files getting updated :)

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v3 0/3] cpufreq:boost: CPU Boost mode support
  2013-06-17  3:20   ` [PATCH v3 0/3] cpufreq:boost: CPU Boost mode support Viresh Kumar
@ 2013-06-17  5:41     ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-17  5:41 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

On Mon, 17 Jun 2013 08:50:30 +0530, Viresh Kumar wrote:

> On 14 June 2013 13:08, Lukasz Majewski <l.majewski@samsung.com> wrote:
> >  arch/arm/mach-s3c24xx/cpufreq.c              |    2 +-
> >  arch/powerpc/platforms/pasemi/cpufreq.c      |    2 +-
> >  arch/powerpc/platforms/powermac/cpufreq_32.c |    2 +-
> >  arch/powerpc/platforms/powermac/cpufreq_64.c |    2 +-
> >  drivers/cpufreq/acpi-cpufreq.c               |   62
> > +++++++----------- drivers/cpufreq/arm_big_little.c
> > |    3 +- drivers/cpufreq/blackfin-cpufreq.c           |    2 +-
> >  drivers/cpufreq/cpufreq-cpu0.c               |    2 +-
> >  drivers/cpufreq/cpufreq.c                    |   87
> > ++++++++++++++++++++++++++
> > drivers/cpufreq/cris-artpec3-cpufreq.c       |    2 +-
> > drivers/cpufreq/cris-etraxfs-cpufreq.c       |    2 +-
> > drivers/cpufreq/davinci-cpufreq.c            |    2 +-
> > drivers/cpufreq/dbx500-cpufreq.c             |    2 +-
> > drivers/cpufreq/e_powersaver.c               |    3 +-
> > drivers/cpufreq/elanfreq.c                   |    2 +-
> > drivers/cpufreq/exynos-cpufreq.c             |    7 ++-
> > drivers/cpufreq/exynos5440-cpufreq.c         |    2 +-
> > drivers/cpufreq/freq_table.c                 |   44 ++++++++++---
> > drivers/cpufreq/ia64-acpi-cpufreq.c          |    2 +-
> > drivers/cpufreq/imx6q-cpufreq.c              |    2 +-
> > drivers/cpufreq/kirkwood-cpufreq.c           |    3 +-
> > drivers/cpufreq/longhaul.c                   |    2 +-
> > drivers/cpufreq/loongson2_cpufreq.c          |    2 +-
> > drivers/cpufreq/maple-cpufreq.c              |    2 +-
> > drivers/cpufreq/omap-cpufreq.c               |    2 +-
> > drivers/cpufreq/p4-clockmod.c                |    2 +-
> > drivers/cpufreq/powernow-k6.c                |    2 +-
> > drivers/cpufreq/powernow-k7.c                |    2 +-
> > drivers/cpufreq/powernow-k8.c                |    2 +-
> > drivers/cpufreq/ppc_cbe_cpufreq.c            |    2 +-
> > drivers/cpufreq/pxa2xx-cpufreq.c             |    4 +-
> > drivers/cpufreq/pxa3xx-cpufreq.c             |    2 +-
> > drivers/cpufreq/s3c2416-cpufreq.c            |    2 +-
> > drivers/cpufreq/s3c64xx-cpufreq.c            |    2 +-
> > drivers/cpufreq/s5pv210-cpufreq.c            |    2 +-
> > drivers/cpufreq/sc520_freq.c                 |    2 +-
> > drivers/cpufreq/sh-cpufreq.c                 |    2 +-
> > drivers/cpufreq/sparc-us2e-cpufreq.c         |    2 +-
> > drivers/cpufreq/sparc-us3-cpufreq.c          |    2 +-
> > drivers/cpufreq/spear-cpufreq.c              |    3 +-
> > drivers/cpufreq/speedstep-centrino.c         |    2 +-
> > drivers/cpufreq/speedstep-ich.c              |    2 +-
> > drivers/cpufreq/speedstep-smi.c              |    2 +-
> > drivers/cpufreq/tegra-cpufreq.c              |    4 +-
> > include/linux/cpufreq.h                      |   18 +++++- 45 files
> > changed, 211 insertions(+), 95 deletions(-)
> 
> Wow!! I am shocked to see these many files getting updated :)

Hmm, CPUFREQ framework is quite popular :-). 

Changing this one particular function, seemed to be the best solution.

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v3 1/3] cpufreq: Add boost frequency support in core
  2013-06-14  7:38   ` [PATCH v3 1/3] cpufreq: Add boost frequency support in core Lukasz Majewski
@ 2013-06-17  5:43     ` Viresh Kumar
  2013-06-17  7:15       ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-17  5:43 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

On 14 June 2013 13:08, Lukasz Majewski <l.majewski@samsung.com> wrote:
> Changes for v2:
> - Removal of cpufreq_boost structure and move its fields to cpufreq_driver
>   structure
> - Flag to indicate if global boost attribute is already defined
> - Extent the pr_{err|debbug} functions to show current function names
>
> Changes for v3:
> - Method for reading boost status
> - Removal of cpufreq_frequency_table_max()
> - Extent cpufreq_frequency_table_cpuinfo() to support boost parameter
> - boost_supported flag added to cpufreq_driver struct
> - "boost" sysfs attribute control flag removed
> - One global flag describing state of the boost defined at cpufreq core
> - Rename cpufreq_driver's low_level_boost field to set_boost_freq()
> - Usage of cpufreq_sysfs_{remove|add}_file() routines

Latest change log first please.

> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> index 2ce86ed..02e57db 100644
> --- a/drivers/cpufreq/cpufreq.c
> +++ b/drivers/cpufreq/cpufreq.c
> @@ -40,6 +40,7 @@
>   * also protects the cpufreq_cpu_data array.
>   */
>  static struct cpufreq_driver *cpufreq_driver;
> +static bool cpufreq_boost_enabled;
>  static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data);
>  #ifdef CONFIG_HOTPLUG_CPU
>  /* This one keeps track of the previously set governor of a removed CPU */
> @@ -315,6 +316,30 @@ EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
>  /*********************************************************************
>   *                          SYSFS INTERFACE                          *
>   *********************************************************************/
> +ssize_t show_boost(struct kobject *kobj,
> +                                struct attribute *attr, char *buf)
> +{
> +       return sprintf(buf, "%d\n", cpufreq_boost_enabled);
> +}
> +
> +static ssize_t store_boost(struct kobject *kobj, struct attribute *attr,
> +                                 const char *buf, size_t count)
> +{
> +       int ret, enable;
> +
> +       ret = sscanf(buf, "%d", &enable);
> +       if (ret != 1 || enable < 0 || enable > 1)
> +               return -EINVAL;
> +
> +       if (cpufreq_boost_trigger_state(enable)) {
> +               pr_err("%s: Cannot %sable boost!\n", __func__,
> +                      enable ? "en" : "dis");

Please don't use %sable as discussed earlier.

> +               return -EINVAL;
> +       }
> +
> +       return count;
> +}
> +define_one_global_rw(boost);
>
>  static struct cpufreq_governor *__find_governor(const char *str_governor)
>  {
> @@ -1896,6 +1921,55 @@ static struct notifier_block __refdata cpufreq_cpu_notifier = {
>  };
>
>  /*********************************************************************
> + *               BOOST                                              *
> + *********************************************************************/
> +int cpufreq_boost_trigger_state(int state)
> +{
> +       struct cpufreq_frequency_table *freq_table;
> +       struct cpufreq_policy *policy;
> +       unsigned long flags;
> +       int ret = 0, cpu;
> +
> +       if (!cpufreq_driver->boost_supported)
> +               return -ENODEV;

This can't happen. sysfs directory is present only when we
have boost supported.

> +       if (cpufreq_boost_enabled != state) {
> +               if (cpufreq_driver->set_boost_freq) {
> +                       ret = cpufreq_driver->set_boost_freq(state);

I thought this routine was for setting boost frequency and not
for enabling boost feature. If boost has to be enabled separately
then this routine must take care of it while setting freq.

So, in other words, this must not be called here.

> +                       if (ret) {
> +                               pr_err("%s: BOOST cannot enable (%d)\n",
> +                                      __func__, ret);
> +                               return ret;
> +                       }
> +               }
> +
> +               for_each_possible_cpu(cpu) {
> +                       policy = cpufreq_cpu_get(cpu);

In case this code is required, it would make more sense to keep list
of all available policies, which we can iterate through.

> +                       freq_table = cpufreq_frequency_get_table(cpu);
> +                       if (policy && freq_table) {
> +                               write_lock_irqsave(&cpufreq_driver_lock, flags);
> +                               cpufreq_frequency_table_cpuinfo(policy,
> +                                                               freq_table,
> +                                                               state);

We obviously don't need the last param to this routine and so bunch
of changes you did in this patch.

cpufreq_frequency_table_cpuinfo() can itself check if boost is enabled
or not.

> +                               cpufreq_boost_enabled = state;
> +                               write_unlock_irqrestore(&cpufreq_driver_lock,
> +                                                       flags);
> +                       }
> +               }

I am not sure if this is required at all. Or what complications can be
there when we update max/min on the fly here.

> +       }
> +
> +       pr_debug("%s: cpufreq BOOST %s\n", __func__,
> +                state ? "enabled" : "disabled");
> +
> +       return 0;
> +}
> +
> +int cpufreq_boost_state(void)

s/cpufreq_boost_state/cpufreq_boost_enabled

> +{
> +       return cpufreq_boost_enabled;

s/cpufreq_boost_enabled/boost_enabled

> +}
> +
> +/*********************************************************************
>   *               REGISTER / UNREGISTER CPUFREQ DRIVER                *
>   *********************************************************************/
>
> @@ -1934,6 +2008,15 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
>         cpufreq_driver = driver_data;
>         write_unlock_irqrestore(&cpufreq_driver_lock, flags);
>
> +       if (cpufreq_driver->boost_supported) {
> +               ret = cpufreq_sysfs_create_file(&(boost.attr));
> +               if (ret) {
> +                       pr_err("%s: cannot register global boost sysfs file\n",
> +                               __func__);
> +                       goto err_null_driver;
> +               }
> +       }
> +
>         ret = subsys_interface_register(&cpufreq_interface);
>         if (ret)
>                 goto err_null_driver;
> @@ -1990,6 +2073,10 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
>         pr_debug("unregistering driver %s\n", driver->name);
>
>         subsys_interface_unregister(&cpufreq_interface);
> +
> +       if (cpufreq_driver->boost_supported)
> +               cpufreq_sysfs_remove_file(&(boost.attr));
> +
>         unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
>
>         write_lock_irqsave(&cpufreq_driver_lock, flags);

This part looked good :)

> diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c
> index d7a7966..f1a4d785 100644
> --- a/drivers/cpufreq/freq_table.c
> +++ b/drivers/cpufreq/freq_table.c
> @@ -21,7 +21,8 @@
>   *********************************************************************/
>
>  int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
> -                                   struct cpufreq_frequency_table *table)
> +                                   struct cpufreq_frequency_table *table,
> +                                   int boost)
>  {
>         unsigned int min_freq = ~0;
>         unsigned int max_freq = 0;
> @@ -31,9 +32,11 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
>                 unsigned int freq = table[i].frequency;
>                 if (freq == CPUFREQ_ENTRY_INVALID) {
>                         pr_debug("table entry %u is invalid, skipping\n", i);
> -
>                         continue;
>                 }
> +               if (!boost && table[i].index == CPUFREQ_BOOST_FREQ)
> +                       continue;
> +
>                 pr_debug("table entry %u: %u kHz, %u index\n",
>                                         i, freq, table[i].index);
>                 if (freq < min_freq)
> @@ -171,7 +174,8 @@ static DEFINE_PER_CPU(struct cpufreq_frequency_table *, cpufreq_show_table);
>  /**
>   * show_available_freqs - show available frequencies for the specified CPU
>   */
> -static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
> +static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf,
> +                                   int show_boost)
>  {
>         unsigned int i = 0;
>         unsigned int cpu = policy->cpu;
> @@ -186,22 +190,42 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
>         for (i = 0; (table[i].frequency != CPUFREQ_TABLE_END); i++) {
>                 if (table[i].frequency == CPUFREQ_ENTRY_INVALID)
>                         continue;
> +               if (show_boost && table[i].index != CPUFREQ_BOOST_FREQ)
> +                       continue;
> +               if (!show_boost && table[i].index == CPUFREQ_BOOST_FREQ)
> +                       continue;

Maybe, this instead of above two if statements:

if (show_boost ^ (table[i].index == CPUFREQ_BOOST_FREQ))
    continue

>                 count += sprintf(&buf[count], "%d ", table[i].frequency);
>         }
>         count += sprintf(&buf[count], "\n");
>
>         return count;
> -
>  }
>
> -struct freq_attr cpufreq_freq_attr_scaling_available_freqs = {
> -       .attr = { .name = "scaling_available_frequencies",
> -                 .mode = 0444,
> -               },
> -       .show = show_available_freqs,
> -};
> +/**
> + * show_scaling_available_frequencies - show normal boost frequencies for

s/boost /

> + * the specified CPU
> + */
> +static ssize_t scaling_available_frequencies_show(struct cpufreq_policy *policy,
> +                                                 char *buf)
> +{
> +       return show_available_freqs(policy, buf, 0);
> +}
> +cpufreq_attr_available_freq(scaling_available);
>  EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_available_freqs);
>
> +/**
> + * show_available_boost_freqs - show available boost frequencies for
> + * the specified CPU
> + */
> +static ssize_t scaling_boost_frequencies_show(struct cpufreq_policy *policy,
> +                                             char *buf)
> +{
> +       return show_available_freqs(policy, buf, 1);
> +}
> +cpufreq_attr_available_freq(scaling_boost);
> +EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_boost_freqs);
> +
>  /*
>   * if you use these, you must assure that the frequency table is valid
>   * all the time between get_attr and put_attr!

> diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
> index ab1932c..027442d 100644
> --- a/include/linux/cpufreq.h
> +++ b/include/linux/cpufreq.h
> @@ -266,6 +266,10 @@ struct cpufreq_driver {
>         int     (*suspend)      (struct cpufreq_policy *policy);
>         int     (*resume)       (struct cpufreq_policy *policy);
>         struct freq_attr        **attr;
> +
> +       /* platform specific boost support code */
> +       bool                    boost_supported;
> +       int (*set_boost_freq)   (int state);
>  };
>
>  /* flags */
> @@ -318,6 +322,10 @@ __ATTR(_name, _perm, show_##_name, NULL)
>  static struct freq_attr _name =                        \
>  __ATTR(_name, 0644, show_##_name, store_##_name)
>
> +#define cpufreq_attr_available_freq(_name)       \
> +struct freq_attr cpufreq_freq_attr_##_name##_freqs =     \
> +__ATTR_RO(_name##_frequencies)

What is this doing in cpufreq.h? It will only be used by freq_table.c file.


Again, I couldn't see how boost freqs are getting used? You have
probably made them part of normal freq range here and so they
might be used during normal operations. But we wanted it to be
used only when we have few cpus on... etc.. Where is that logic?

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v3 1/3] cpufreq: Add boost frequency support in core
  2013-06-17  5:43     ` Viresh Kumar
@ 2013-06-17  7:15       ` Lukasz Majewski
  2013-06-17  7:43         ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-17  7:15 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

On Mon, 17 Jun 2013 11:13:18 +0530, Viresh Kumar wrote:
> On 14 June 2013 13:08, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > Changes for v2:
> > - Removal of cpufreq_boost structure and move its fields to
> > cpufreq_driver structure
> > - Flag to indicate if global boost attribute is already defined
> > - Extent the pr_{err|debbug} functions to show current function
> > names
> >
> > Changes for v3:
> > - Method for reading boost status
> > - Removal of cpufreq_frequency_table_max()
> > - Extent cpufreq_frequency_table_cpuinfo() to support boost
> > parameter
> > - boost_supported flag added to cpufreq_driver struct
> > - "boost" sysfs attribute control flag removed
> > - One global flag describing state of the boost defined at cpufreq
> > core
> > - Rename cpufreq_driver's low_level_boost field to set_boost_freq()
> > - Usage of cpufreq_sysfs_{remove|add}_file() routines
> 
> Latest change log first please.

Ok.

> 
> > diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> > index 2ce86ed..02e57db 100644
> > --- a/drivers/cpufreq/cpufreq.c
> > +++ b/drivers/cpufreq/cpufreq.c
> > @@ -40,6 +40,7 @@
> >   * also protects the cpufreq_cpu_data array.
> >   */
> >  static struct cpufreq_driver *cpufreq_driver;
> > +static bool cpufreq_boost_enabled;
> >  static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data);
> >  #ifdef CONFIG_HOTPLUG_CPU
> >  /* This one keeps track of the previously set governor of a
> > removed CPU */ @@ -315,6 +316,30 @@
> > EXPORT_SYMBOL_GPL(cpufreq_notify_transition); /*********************************************************************
> >   *                          SYSFS
> > INTERFACE                          *
> > *********************************************************************/
> > +ssize_t show_boost(struct kobject *kobj,
> > +                                struct attribute *attr, char *buf)
> > +{
> > +       return sprintf(buf, "%d\n", cpufreq_boost_enabled);
> > +}
> > +
> > +static ssize_t store_boost(struct kobject *kobj, struct attribute
> > *attr,
> > +                                 const char *buf, size_t count)
> > +{
> > +       int ret, enable;
> > +
> > +       ret = sscanf(buf, "%d", &enable);
> > +       if (ret != 1 || enable < 0 || enable > 1)
> > +               return -EINVAL;
> > +
> > +       if (cpufreq_boost_trigger_state(enable)) {
> > +               pr_err("%s: Cannot %sable boost!\n", __func__,
> > +                      enable ? "en" : "dis");
> 
> Please don't use %sable as discussed earlier.

My bad. I've overlooked this one.

> 
> > +               return -EINVAL;
> > +       }
> > +
> > +       return count;
> > +}
> > +define_one_global_rw(boost);
> >
> >  static struct cpufreq_governor *__find_governor(const char
> > *str_governor) {
> > @@ -1896,6 +1921,55 @@ static struct notifier_block __refdata
> > cpufreq_cpu_notifier = { };
> >
> >  /*********************************************************************
> > + *
> > BOOST                                              *
> > +
> > *********************************************************************/
> > +int cpufreq_boost_trigger_state(int state) +{
> > +       struct cpufreq_frequency_table *freq_table;
> > +       struct cpufreq_policy *policy;
> > +       unsigned long flags;
> > +       int ret = 0, cpu;
> > +
> > +       if (!cpufreq_driver->boost_supported)
> > +               return -ENODEV;
> 
> This can't happen. sysfs directory is present only when we
> have boost supported.

I know, that we shall not look into the future. But this method will be
used when somebody would like to enable boost from kernel. Let's say
new governor or such :-). 

I can remove this and add it later, but I think, that it is safer to
add it straightaway.

> 
> > +       if (cpufreq_boost_enabled != state) {
> > +               if (cpufreq_driver->set_boost_freq) {
> > +                       ret = cpufreq_driver->set_boost_freq(state);
> 
> I thought this routine was for setting boost frequency and not
> for enabling boost feature. If boost has to be enabled separately
> then this routine must take care of it while setting freq.
> 
> So, in other words, this must not be called here.

This function explicitly follows current logic of acpi-cpufreq.c.

I would like to avoid modifying legacy/working code as much as
possible (especially when I hadn't yet received any feedback about
acpi-cpufreq.c file changes).


> 
> > +                       if (ret) {
> > +                               pr_err("%s: BOOST cannot enable
> > (%d)\n",
> > +                                      __func__, ret);
> > +                               return ret;
> > +                       }
> > +               }
> > +
> > +               for_each_possible_cpu(cpu) {
> > +                       policy = cpufreq_cpu_get(cpu);
> 
> In case this code is required, it would make more sense to keep list
> of all available policies, which we can iterate through.

Maybe I don't get the big picture, but why we cannot iterate
through possible CPUs? At least one shall have valid policy and
freq_table combination. 

I've already proposed list of all policies (at v1), but we decided to
abandon this idea.

In which way list is better than iteration through all possible per-cpu
variables, which store policies?


> 
> > +                       freq_table =
> > cpufreq_frequency_get_table(cpu);
> > +                       if (policy && freq_table) {
> > +
> > write_lock_irqsave(&cpufreq_driver_lock, flags);
> > +
> > cpufreq_frequency_table_cpuinfo(policy,
> > +
> > freq_table,
> > +
> > state);
> 
> We obviously don't need the last param to this routine and so bunch
> of changes you did in this patch.
> 
> cpufreq_frequency_table_cpuinfo() can itself check if boost is enabled
> or not.

Yes, you are right. We can check if boost is supported and enabled
inside this function.

> 
> > +                               cpufreq_boost_enabled = state;
> > +
> > write_unlock_irqrestore(&cpufreq_driver_lock,
> > +                                                       flags);
> > +                       }
> > +               }
> 
> I am not sure if this is required at all. Or what complications can be
> there when we update max/min on the fly here.

Correct me if I'm wrong, but I'm using scripts for tests which run
simultaneously and enables/disables boost feature. I don't recall if
there is a lock at sysfs, which would prevent from simultaneous write
to the "boost" sysfs attribute. 

I will doubble check that.

> 
> > +       }
> > +
> > +       pr_debug("%s: cpufreq BOOST %s\n", __func__,
> > +                state ? "enabled" : "disabled");
> > +
> > +       return 0;
> > +}
> > +
> > +int cpufreq_boost_state(void)
> 
> s/cpufreq_boost_state/cpufreq_boost_enabled

OK.

> 
> > +{
> > +       return cpufreq_boost_enabled;
> 
> s/cpufreq_boost_enabled/boost_enabled
> 
> > +}
> > +
> > +/*********************************************************************
> >   *               REGISTER / UNREGISTER CPUFREQ
> > DRIVER                *
> > *********************************************************************/
> >
> > @@ -1934,6 +2008,15 @@ int cpufreq_register_driver(struct
> > cpufreq_driver *driver_data) cpufreq_driver = driver_data;
> >         write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> >
> > +       if (cpufreq_driver->boost_supported) {
> > +               ret = cpufreq_sysfs_create_file(&(boost.attr));
> > +               if (ret) {
> > +                       pr_err("%s: cannot register global boost
> > sysfs file\n",
> > +                               __func__);
> > +                       goto err_null_driver;
> > +               }
> > +       }
> > +
> >         ret = subsys_interface_register(&cpufreq_interface);
> >         if (ret)
> >                 goto err_null_driver;
> > @@ -1990,6 +2073,10 @@ int cpufreq_unregister_driver(struct
> > cpufreq_driver *driver) pr_debug("unregistering driver %s\n",
> > driver->name);
> >
> >         subsys_interface_unregister(&cpufreq_interface);
> > +
> > +       if (cpufreq_driver->boost_supported)
> > +               cpufreq_sysfs_remove_file(&(boost.attr));
> > +
> >         unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
> >
> >         write_lock_irqsave(&cpufreq_driver_lock, flags);
> 
> This part looked good :)
> 
> > diff --git a/drivers/cpufreq/freq_table.c
> > b/drivers/cpufreq/freq_table.c index d7a7966..f1a4d785 100644
> > --- a/drivers/cpufreq/freq_table.c
> > +++ b/drivers/cpufreq/freq_table.c
> > @@ -21,7 +21,8 @@
> >   *********************************************************************/
> >
> >  int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
> > -                                   struct cpufreq_frequency_table
> > *table)
> > +                                   struct cpufreq_frequency_table
> > *table,
> > +                                   int boost)
> >  {
> >         unsigned int min_freq = ~0;
> >         unsigned int max_freq = 0;
> > @@ -31,9 +32,11 @@ int cpufreq_frequency_table_cpuinfo(struct
> > cpufreq_policy *policy, unsigned int freq = table[i].frequency;
> >                 if (freq == CPUFREQ_ENTRY_INVALID) {
> >                         pr_debug("table entry %u is invalid,
> > skipping\n", i); -
> >                         continue;
> >                 }
> > +               if (!boost && table[i].index == CPUFREQ_BOOST_FREQ)
> > +                       continue;
> > +
> >                 pr_debug("table entry %u: %u kHz, %u index\n",
> >                                         i, freq, table[i].index);
> >                 if (freq < min_freq)
> > @@ -171,7 +174,8 @@ static DEFINE_PER_CPU(struct
> > cpufreq_frequency_table *, cpufreq_show_table); /**
> >   * show_available_freqs - show available frequencies for the
> > specified CPU */
> > -static ssize_t show_available_freqs(struct cpufreq_policy *policy,
> > char *buf) +static ssize_t show_available_freqs(struct
> > cpufreq_policy *policy, char *buf,
> > +                                   int show_boost)
> >  {
> >         unsigned int i = 0;
> >         unsigned int cpu = policy->cpu;
> > @@ -186,22 +190,42 @@ static ssize_t show_available_freqs(struct
> > cpufreq_policy *policy, char *buf) for (i = 0;
> > (table[i].frequency != CPUFREQ_TABLE_END); i++) { if
> > (table[i].frequency == CPUFREQ_ENTRY_INVALID) continue;
> > +               if (show_boost && table[i].index !=
> > CPUFREQ_BOOST_FREQ)
> > +                       continue;
> > +               if (!show_boost && table[i].index ==
> > CPUFREQ_BOOST_FREQ)
> > +                       continue;
> 
> Maybe, this instead of above two if statements:
> 
> if (show_boost ^ (table[i].index == CPUFREQ_BOOST_FREQ))
>     continue

Yes. Good point.

> 
> >                 count += sprintf(&buf[count], "%d ",
> > table[i].frequency); }
> >         count += sprintf(&buf[count], "\n");
> >
> >         return count;
> > -
> >  }
> >
> > -struct freq_attr cpufreq_freq_attr_scaling_available_freqs = {
> > -       .attr = { .name = "scaling_available_frequencies",
> > -                 .mode = 0444,
> > -               },
> > -       .show = show_available_freqs,
> > -};
> > +/**
> > + * show_scaling_available_frequencies - show normal boost
> > frequencies for
> 
> s/boost /

Ok.

> 
> > + * the specified CPU
> > + */
> > +static ssize_t scaling_available_frequencies_show(struct
> > cpufreq_policy *policy,
> > +                                                 char *buf)
> > +{
> > +       return show_available_freqs(policy, buf, 0);
> > +}
> > +cpufreq_attr_available_freq(scaling_available);
> >  EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_available_freqs);
> >
> > +/**
> > + * show_available_boost_freqs - show available boost frequencies
> > for
> > + * the specified CPU
> > + */
> > +static ssize_t scaling_boost_frequencies_show(struct
> > cpufreq_policy *policy,
> > +                                             char *buf)
> > +{
> > +       return show_available_freqs(policy, buf, 1);
> > +}
> > +cpufreq_attr_available_freq(scaling_boost);
> > +EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_boost_freqs);
> > +
> >  /*
> >   * if you use these, you must assure that the frequency table is
> > valid
> >   * all the time between get_attr and put_attr!
> 
> > diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
> > index ab1932c..027442d 100644
> > --- a/include/linux/cpufreq.h
> > +++ b/include/linux/cpufreq.h
> > @@ -266,6 +266,10 @@ struct cpufreq_driver {
> >         int     (*suspend)      (struct cpufreq_policy *policy);
> >         int     (*resume)       (struct cpufreq_policy *policy);
> >         struct freq_attr        **attr;
> > +
> > +       /* platform specific boost support code */
> > +       bool                    boost_supported;
> > +       int (*set_boost_freq)   (int state);
> >  };
> >
> >  /* flags */
> > @@ -318,6 +322,10 @@ __ATTR(_name, _perm, show_##_name, NULL)
> >  static struct freq_attr _name =                        \
> >  __ATTR(_name, 0644, show_##_name, store_##_name)
> >
> > +#define cpufreq_attr_available_freq(_name)       \
> > +struct freq_attr cpufreq_freq_attr_##_name##_freqs =     \
> > +__ATTR_RO(_name##_frequencies)
> 
> What is this doing in cpufreq.h? It will only be used by freq_table.c
> file.

I wanted to add those #defines to the place where other similar ones
are placed.

I can put it to freq_table.c.

> 
> 
> Again, I couldn't see how boost freqs are getting used? You have
> probably made them part of normal freq range here and so they
> might be used during normal operations. But we wanted it to be
> used only when we have few cpus on... etc.. Where is that logic?

The logic is as follow:
- cpufreq_driver exports .attr field. When driver supports boost then
  two attributes are exported (even when boost is not enabled, but
  supported):
	- scaling_available_frequencies (only normal frequencies - this
	  attribute is unchanged)
	- scaling_boost_frequencies - list possible boost frequencies. 
  
When boost is not supported - then only scaling_available_frequencies
is exported (as it is done now). 

Please refer to patch 3/3.

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v3 1/3] cpufreq: Add boost frequency support in core
  2013-06-17  7:15       ` Lukasz Majewski
@ 2013-06-17  7:43         ` Viresh Kumar
  2013-06-17  9:08           ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-17  7:43 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

On 17 June 2013 12:45, Lukasz Majewski <l.majewski@samsung.com> wrote:
> On Mon, 17 Jun 2013 11:13:18 +0530, Viresh Kumar wrote:
>> On 14 June 2013 13:08, Lukasz Majewski <l.majewski@samsung.com> wrote:

>> > +int cpufreq_boost_trigger_state(int state) +{

>> > +       if (!cpufreq_driver->boost_supported)
>> > +               return -ENODEV;
>>
>> This can't happen. sysfs directory is present only when we
>> have boost supported.
>
> I know, that we shall not look into the future. But this method will be
> used when somebody would like to enable boost from kernel. Let's say
> new governor or such :-).

We don't know if that would be acceptable or not as of now.

> I can remove this and add it later, but I think, that it is safer to
> add it straightaway.

Remove it for now.

>>
>> > +       if (cpufreq_boost_enabled != state) {
>> > +               if (cpufreq_driver->set_boost_freq) {
>> > +                       ret = cpufreq_driver->set_boost_freq(state);
>>
>> I thought this routine was for setting boost frequency and not
>> for enabling boost feature. If boost has to be enabled separately
>> then this routine must take care of it while setting freq.
>>
>> So, in other words, this must not be called here.
>
> This function explicitly follows current logic of acpi-cpufreq.c.
>
> I would like to avoid modifying legacy/working code as much as
> possible (especially when I hadn't yet received any feedback about
> acpi-cpufreq.c file changes).

Hmm.. I saw that code now. You are talking about: boost_set_msrs ??

So, this function has nothing to do with set_boost_freq() but
enable_boost(). Rename your function similarly and keep this code.

>> > +                       if (ret) {
>> > +                               pr_err("%s: BOOST cannot enable
>> > (%d)\n",
>> > +                                      __func__, ret);
>> > +                               return ret;
>> > +                       }
>> > +               }
>> > +
>> > +               for_each_possible_cpu(cpu) {
>> > +                       policy = cpufreq_cpu_get(cpu);
>>
>> In case this code is required, it would make more sense to keep list
>> of all available policies, which we can iterate through.
>
> Maybe I don't get the big picture, but why we cannot iterate
> through possible CPUs? At least one shall have valid policy and
> freq_table combination.

Many cpus share same policy structure and so iterating over all of them
isn't a very good idea. Either keep a mask of cpus already iterated,
copy policy->cpus to it on each iteration. If a cpu is already done
skip loop for it.

OR keep a list of policies. I would prefer the later (do it in a separate
patch), as this can be used later too.

> I've already proposed list of all policies (at v1), but we decided to
> abandon this idea.

I don't remember why it was there but reason wasn't good enough to
keep it.

>> I am not sure if this is required at all. Or what complications can be
>> there when we update max/min on the fly here.
>
> Correct me if I'm wrong, but I'm using scripts for tests which run
> simultaneously and enables/disables boost feature. I don't recall if
> there is a lock at sysfs, which would prevent from simultaneous write
> to the "boost" sysfs attribute.
>
> I will doubble check that.

It isn't about a crash but how cpufreq subsystem works. I will think over
it later too, for now you can keep it.

>> > +{
>> > +       return cpufreq_boost_enabled;
>>
>> s/cpufreq_boost_enabled/boost_enabled

??

>> > @@ -318,6 +322,10 @@ __ATTR(_name, _perm, show_##_name, NULL)
>> >  static struct freq_attr _name =                        \
>> >  __ATTR(_name, 0644, show_##_name, store_##_name)
>> >
>> > +#define cpufreq_attr_available_freq(_name)       \
>> > +struct freq_attr cpufreq_freq_attr_##_name##_freqs =     \
>> > +__ATTR_RO(_name##_frequencies)
>>
>> What is this doing in cpufreq.h? It will only be used by freq_table.c
>> file.
>
> I wanted to add those #defines to the place where other similar ones
> are placed.

That's not how these or any other declaration should be placed. By adding
these to cpufreq.h, you are inviting other parts of kernel to use them.
Which we don't want.

> I can put it to freq_table.c.

Thanks.

>> Again, I couldn't see how boost freqs are getting used? You have
>> probably made them part of normal freq range here and so they
>> might be used during normal operations. But we wanted it to be
>> used only when we have few cpus on... etc.. Where is that logic?
>
> The logic is as follow:
> - cpufreq_driver exports .attr field. When driver supports boost then
>   two attributes are exported (even when boost is not enabled, but
>   supported):
>         - scaling_available_frequencies (only normal frequencies - this
>           attribute is unchanged)
>         - scaling_boost_frequencies - list possible boost frequencies.
>
> When boost is not supported - then only scaling_available_frequencies
> is exported (as it is done now).

You are missing the whole point behind keeping this patchset. Its not
about how to expose boost freqs to sysfs (that's what you are talking
about) but to use these frequencies on the fly. Some part of kernel
code would be setting these frequencies in real hardware. Who will
set these frequencies? On what basis? How do we ensure we don't
burn your chip?

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v3 1/3] cpufreq: Add boost frequency support in core
  2013-06-17  7:43         ` Viresh Kumar
@ 2013-06-17  9:08           ` Lukasz Majewski
  2013-06-17  9:18               ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-17  9:08 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Amit Daniel Kachhap

On Mon, 17 Jun 2013 09:43:27 +0200, Viresh Kumar wrote:
> On 17 June 2013 12:45, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > On Mon, 17 Jun 2013 11:13:18 +0530, Viresh Kumar wrote:
> >> On 14 June 2013 13:08, Lukasz Majewski <l.majewski@samsung.com>
> >> wrote:
> 
> >> > +int cpufreq_boost_trigger_state(int state) +{
> 
> >> > +       if (!cpufreq_driver->boost_supported)
> >> > +               return -ENODEV;
> >>
> >> This can't happen. sysfs directory is present only when we
> >> have boost supported.
> >
> > I know, that we shall not look into the future. But this method
> > will be used when somebody would like to enable boost from kernel.
> > Let's say new governor or such :-).
> 
> We don't know if that would be acceptable or not as of now.
> 
> > I can remove this and add it later, but I think, that it is safer to
> > add it straightaway.
> 
> Remove it for now.

Ok.

> 
> >>
> >> > +       if (cpufreq_boost_enabled != state) {
> >> > +               if (cpufreq_driver->set_boost_freq) {
> >> > +                       ret =
> >> > cpufreq_driver->set_boost_freq(state);
> >>
> >> I thought this routine was for setting boost frequency and not
> >> for enabling boost feature. If boost has to be enabled separately
> >> then this routine must take care of it while setting freq.
> >>
> >> So, in other words, this must not be called here.
> >
> > This function explicitly follows current logic of acpi-cpufreq.c.
> >
> > I would like to avoid modifying legacy/working code as much as
> > possible (especially when I hadn't yet received any feedback about
> > acpi-cpufreq.c file changes).
> 
> Hmm.. I saw that code now. You are talking about: boost_set_msrs ??
> 
> So, this function has nothing to do with set_boost_freq() but
> enable_boost(). Rename your function similarly and keep this code.

Ok.

> 
> >> > +                       if (ret) {
> >> > +                               pr_err("%s: BOOST cannot enable
> >> > (%d)\n",
> >> > +                                      __func__, ret);
> >> > +                               return ret;
> >> > +                       }
> >> > +               }
> >> > +
> >> > +               for_each_possible_cpu(cpu) {
> >> > +                       policy = cpufreq_cpu_get(cpu);
> >>
> >> In case this code is required, it would make more sense to keep
> >> list of all available policies, which we can iterate through.
> >
> > Maybe I don't get the big picture, but why we cannot iterate
> > through possible CPUs? At least one shall have valid policy and
> > freq_table combination.
> 
> Many cpus share same policy structure and so iterating over all of
> them isn't a very good idea. Either keep a mask of cpus already
> iterated, copy policy->cpus to it on each iteration. If a cpu is
> already done skip loop for it.

This is the situation, which I wanted to avoid. Policy has the
policy->cpus mask already implemented, but we don't know how/where to
hook to them (one solution would be to start from cpu0, but for some
reason I'm reluctant to do it in this way).

> 
> OR keep a list of policies. I would prefer the later (do it in a
> separate patch), as this can be used later too.

I will declare a boost_policy list at cpufreq.c. Then I will add policy
to it, when cpufreq_add_dev() is called.

> 
> > I've already proposed list of all policies (at v1), but we decided
> > to abandon this idea.
> 
> I don't remember why it was there but reason wasn't good enough to
> keep it.

:-). Lets try with list.

> 
> >> I am not sure if this is required at all. Or what complications
> >> can be there when we update max/min on the fly here.
> >
> > Correct me if I'm wrong, but I'm using scripts for tests which run
> > simultaneously and enables/disables boost feature. I don't recall if
> > there is a lock at sysfs, which would prevent from simultaneous
> > write to the "boost" sysfs attribute.
> >
> > I will doubble check that.
> 
> It isn't about a crash but how cpufreq subsystem works. I will think
> over it later too, for now you can keep it.

OK.

> 
> >> > +{
> >> > +       return cpufreq_boost_enabled;
> >>
> >> s/cpufreq_boost_enabled/boost_enabled
> 
> ??

I will change the name.

> 
> >> > @@ -318,6 +322,10 @@ __ATTR(_name, _perm, show_##_name, NULL)
> >> >  static struct freq_attr _name =                        \
> >> >  __ATTR(_name, 0644, show_##_name, store_##_name)
> >> >
> >> > +#define cpufreq_attr_available_freq(_name)       \
> >> > +struct freq_attr cpufreq_freq_attr_##_name##_freqs =     \
> >> > +__ATTR_RO(_name##_frequencies)
> >>
> >> What is this doing in cpufreq.h? It will only be used by
> >> freq_table.c file.
> >
> > I wanted to add those #defines to the place where other similar ones
> > are placed.
> 
> That's not how these or any other declaration should be placed. By
> adding these to cpufreq.h, you are inviting other parts of kernel to
> use them. Which we don't want.
> 
> > I can put it to freq_table.c.
> 
> Thanks.

Ok. I will keep the code local.

> 
> >> Again, I couldn't see how boost freqs are getting used? You have
> >> probably made them part of normal freq range here and so they
> >> might be used during normal operations. But we wanted it to be
> >> used only when we have few cpus on... etc.. Where is that logic?
> >
> > The logic is as follow:
> > - cpufreq_driver exports .attr field. When driver supports boost
> > then two attributes are exported (even when boost is not enabled,
> > but supported):
> >         - scaling_available_frequencies (only normal frequencies -
> > this attribute is unchanged)
> >         - scaling_boost_frequencies - list possible boost
> > frequencies.
> >
> > When boost is not supported - then only
> > scaling_available_frequencies is exported (as it is done now).
> 
> You are missing the whole point behind keeping this patchset. Its not
> about how to expose boost freqs to sysfs (that's what you are talking
> about) but to use these frequencies on the fly. 

Two separate things:

1. I think, that scaling_available_frequencies [*] attribute has to
   stay unchanged (this is how userspace sees the API). Linus would
   we very unhappy :-) if we had changed public API.

   x86 guys, please correct me, but I think that [*] will be not
   changed (expanded) when Intel's HW boost is enabled at acpi-cpufreq.c
   code.

   The scaling_boost_frequencies is only visible when driver (and
   probably soc maintainer) is ready to handle boosting. It shows over
   clocked frequencies.

2. How we would control boost?
   - To enable this you must mark IDs for some freqs as
     CPUFREQ_BOOST_FREQ.
   - The cpufreq_boost.boost_supported flag needs to be true (set at
     cpufreq driver code)
   - One needs to enable boosting by sysfs or call
     cpufreq_boost_trigger_state(1); The latter will not work when
     cpufreq_driver->boost_supported is not set.

I assume that when somebody takes those three above steps, then he is
aware that boost is working on his machine.

How one can control the boost? I'm now (on my setup) using thermal
subsystem. I set proper trip points and when one of them is met, then
boost is disabled. Moreover the thermal governor (stepwise) also
reduces frequency.

It works stable with v3.10 (with 3.8 there were some bugs - now they
are fixed).


The core acpi-cpufreq.c code hadn't been changed by me, so I assume
that it will work as before.

> Some part of kernel
> code would be setting these frequencies in real hardware. Who will
> set these frequencies? 

Those freqs are set by ->target() callback (when allowed)

> On what basis? How do we ensure we don't
> burn your chip?

Thermal subsystem is a good example here. Another may be a
governor, or even scheduler.


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v3 1/3] cpufreq: Add boost frequency support in core
  2013-06-17  9:08           ` Lukasz Majewski
@ 2013-06-17  9:18               ` Viresh Kumar
  0 siblings, 0 replies; 329+ messages in thread
From: Viresh Kumar @ 2013-06-17  9:18 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Amit Daniel Kachhap

On 17 June 2013 14:38, Lukasz Majewski <l.majewski@samsung.com> wrote:
> On Mon, 17 Jun 2013 09:43:27 +0200, Viresh Kumar wrote:

>> Many cpus share same policy structure and so iterating over all of
>> them isn't a very good idea. Either keep a mask of cpus already
>> iterated, copy policy->cpus to it on each iteration. If a cpu is
>> already done skip loop for it.
>
> This is the situation, which I wanted to avoid. Policy has the
> policy->cpus mask already implemented, but we don't know how/where to
> hook to them (one solution would be to start from cpu0, but for some
> reason I'm reluctant to do it in this way).

We could have started from any cpu. Result and performance would have
been same.

>> OR keep a list of policies. I would prefer the later (do it in a
>> separate patch), as this can be used later too.
>
> I will declare a boost_policy list at cpufreq.c. Then I will add policy
> to it, when cpufreq_add_dev() is called.

This list doesn't have anything to do with boost. Its just a list of
all policies.

>> >> Again, I couldn't see how boost freqs are getting used? You have
>> >> probably made them part of normal freq range here and so they
>> >> might be used during normal operations. But we wanted it to be
>> >> used only when we have few cpus on... etc.. Where is that logic?
>> >
>> > The logic is as follow:
>> > - cpufreq_driver exports .attr field. When driver supports boost
>> > then two attributes are exported (even when boost is not enabled,
>> > but supported):
>> >         - scaling_available_frequencies (only normal frequencies -
>> > this attribute is unchanged)
>> >         - scaling_boost_frequencies - list possible boost
>> > frequencies.
>> >
>> > When boost is not supported - then only
>> > scaling_available_frequencies is exported (as it is done now).
>>
>> You are missing the whole point behind keeping this patchset. Its not
>> about how to expose boost freqs to sysfs (that's what you are talking
>> about) but to use these frequencies on the fly.
>
> Two separate things:
>
> 1. I think, that scaling_available_frequencies [*] attribute has to
>    stay unchanged (this is how userspace sees the API). Linus would
>    we very unhappy :-) if we had changed public API.

I never asked to modify it. :)

>    x86 guys, please correct me, but I think that [*] will be not
>    changed (expanded) when Intel's HW boost is enabled at acpi-cpufreq.c
>    code.
>
>    The scaling_boost_frequencies is only visible when driver (and
>    probably soc maintainer) is ready to handle boosting. It shows over
>    clocked frequencies.

Correct.

> 2. How we would control boost?
>    - To enable this you must mark IDs for some freqs as
>      CPUFREQ_BOOST_FREQ.
>    - The cpufreq_boost.boost_supported flag needs to be true (set at
>      cpufreq driver code)
>    - One needs to enable boosting by sysfs or call
>      cpufreq_boost_trigger_state(1); The latter will not work when
>      cpufreq_driver->boost_supported is not set.
>
> I assume that when somebody takes those three above steps, then he is
> aware that boost is working on his machine.

All good until now.

> How one can control the boost? I'm now (on my setup) using thermal
> subsystem. I set proper trip points and when one of them is met, then
> boost is disabled. Moreover the thermal governor (stepwise) also
> reduces frequency.
>
> It works stable with v3.10 (with 3.8 there were some bugs - now they
> are fixed).
>
>
> The core acpi-cpufreq.c code hadn't been changed by me, so I assume
> that it will work as before.

That should adapt your patch in your patchset.

>> Some part of kernel
>> code would be setting these frequencies in real hardware. Who will
>> set these frequencies?
>
> Those freqs are set by ->target() callback (when allowed)

>From sysfs?? I thought we are going to have some automatic control
of this stuff from inside kernel. Userspace can't control when to run
on boost freqs.

>> On what basis? How do we ensure we don't
>> burn your chip?
>
> Thermal subsystem is a good example here. Another may be a
> governor, or even scheduler.

So, you are enabling boost from sysfs when your thermal framework
says, you can do it?

That's not going to work. There should be something inside kernel to
take care of this stuff. Otherwise a user may switch on boost accidentally
and may burn his chip.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v3 1/3] cpufreq: Add boost frequency support in core
@ 2013-06-17  9:18               ` Viresh Kumar
  0 siblings, 0 replies; 329+ messages in thread
From: Viresh Kumar @ 2013-06-17  9:18 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Amit Daniel Kachhap

On 17 June 2013 14:38, Lukasz Majewski <l.majewski@samsung.com> wrote:
> On Mon, 17 Jun 2013 09:43:27 +0200, Viresh Kumar wrote:

>> Many cpus share same policy structure and so iterating over all of
>> them isn't a very good idea. Either keep a mask of cpus already
>> iterated, copy policy->cpus to it on each iteration. If a cpu is
>> already done skip loop for it.
>
> This is the situation, which I wanted to avoid. Policy has the
> policy->cpus mask already implemented, but we don't know how/where to
> hook to them (one solution would be to start from cpu0, but for some
> reason I'm reluctant to do it in this way).

We could have started from any cpu. Result and performance would have
been same.

>> OR keep a list of policies. I would prefer the later (do it in a
>> separate patch), as this can be used later too.
>
> I will declare a boost_policy list at cpufreq.c. Then I will add policy
> to it, when cpufreq_add_dev() is called.

This list doesn't have anything to do with boost. Its just a list of
all policies.

>> >> Again, I couldn't see how boost freqs are getting used? You have
>> >> probably made them part of normal freq range here and so they
>> >> might be used during normal operations. But we wanted it to be
>> >> used only when we have few cpus on... etc.. Where is that logic?
>> >
>> > The logic is as follow:
>> > - cpufreq_driver exports .attr field. When driver supports boost
>> > then two attributes are exported (even when boost is not enabled,
>> > but supported):
>> >         - scaling_available_frequencies (only normal frequencies -
>> > this attribute is unchanged)
>> >         - scaling_boost_frequencies - list possible boost
>> > frequencies.
>> >
>> > When boost is not supported - then only
>> > scaling_available_frequencies is exported (as it is done now).
>>
>> You are missing the whole point behind keeping this patchset. Its not
>> about how to expose boost freqs to sysfs (that's what you are talking
>> about) but to use these frequencies on the fly.
>
> Two separate things:
>
> 1. I think, that scaling_available_frequencies [*] attribute has to
>    stay unchanged (this is how userspace sees the API). Linus would
>    we very unhappy :-) if we had changed public API.

I never asked to modify it. :)

>    x86 guys, please correct me, but I think that [*] will be not
>    changed (expanded) when Intel's HW boost is enabled at acpi-cpufreq.c
>    code.
>
>    The scaling_boost_frequencies is only visible when driver (and
>    probably soc maintainer) is ready to handle boosting. It shows over
>    clocked frequencies.

Correct.

> 2. How we would control boost?
>    - To enable this you must mark IDs for some freqs as
>      CPUFREQ_BOOST_FREQ.
>    - The cpufreq_boost.boost_supported flag needs to be true (set at
>      cpufreq driver code)
>    - One needs to enable boosting by sysfs or call
>      cpufreq_boost_trigger_state(1); The latter will not work when
>      cpufreq_driver->boost_supported is not set.
>
> I assume that when somebody takes those three above steps, then he is
> aware that boost is working on his machine.

All good until now.

> How one can control the boost? I'm now (on my setup) using thermal
> subsystem. I set proper trip points and when one of them is met, then
> boost is disabled. Moreover the thermal governor (stepwise) also
> reduces frequency.
>
> It works stable with v3.10 (with 3.8 there were some bugs - now they
> are fixed).
>
>
> The core acpi-cpufreq.c code hadn't been changed by me, so I assume
> that it will work as before.

That should adapt your patch in your patchset.

>> Some part of kernel
>> code would be setting these frequencies in real hardware. Who will
>> set these frequencies?
>
> Those freqs are set by ->target() callback (when allowed)

From sysfs?? I thought we are going to have some automatic control
of this stuff from inside kernel. Userspace can't control when to run
on boost freqs.

>> On what basis? How do we ensure we don't
>> burn your chip?
>
> Thermal subsystem is a good example here. Another may be a
> governor, or even scheduler.

So, you are enabling boost from sysfs when your thermal framework
says, you can do it?

That's not going to work. There should be something inside kernel to
take care of this stuff. Otherwise a user may switch on boost accidentally
and may burn his chip.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v3 1/3] cpufreq: Add boost frequency support in core
  2013-06-17  9:18               ` Viresh Kumar
@ 2013-06-17  9:58                 ` Lukasz Majewski
  -1 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-17  9:58 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Amit Daniel Kachhap

On Mon, 17 Jun 2013 14:48:51 +0530, Viresh Kumar wrote:
> On 17 June 2013 14:38, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > On Mon, 17 Jun 2013 09:43:27 +0200, Viresh Kumar wrote:
> 
> >> Many cpus share same policy structure and so iterating over all of
> >> them isn't a very good idea. Either keep a mask of cpus already
> >> iterated, copy policy->cpus to it on each iteration. If a cpu is
> >> already done skip loop for it.
> >
> > This is the situation, which I wanted to avoid. Policy has the
> > policy->cpus mask already implemented, but we don't know how/where
> > to hook to them (one solution would be to start from cpu0, but for
> > some reason I'm reluctant to do it in this way).
> 
> We could have started from any cpu. Result and performance would have
> been same.

Yes. But I don't want to hardcode anything. Especially starting CPU
number.

> 
> >> OR keep a list of policies. I would prefer the later (do it in a
> >> separate patch), as this can be used later too.
> >
> > I will declare a boost_policy list at cpufreq.c. Then I will add
> > policy to it, when cpufreq_add_dev() is called.
> 
> This list doesn't have anything to do with boost. Its just a list of
> all policies.

Ok, I see.
> 
> >> >> Again, I couldn't see how boost freqs are getting used? You have
> >> >> probably made them part of normal freq range here and so they
> >> >> might be used during normal operations. But we wanted it to be
> >> >> used only when we have few cpus on... etc.. Where is that logic?
> >> >
> >> > The logic is as follow:
> >> > - cpufreq_driver exports .attr field. When driver supports boost
> >> > then two attributes are exported (even when boost is not enabled,
> >> > but supported):
> >> >         - scaling_available_frequencies (only normal frequencies
> >> > - this attribute is unchanged)
> >> >         - scaling_boost_frequencies - list possible boost
> >> > frequencies.
> >> >
> >> > When boost is not supported - then only
> >> > scaling_available_frequencies is exported (as it is done now).
> >>
> >> You are missing the whole point behind keeping this patchset. Its
> >> not about how to expose boost freqs to sysfs (that's what you are
> >> talking about) but to use these frequencies on the fly.
> >
> > Two separate things:
> >
> > 1. I think, that scaling_available_frequencies [*] attribute has to
> >    stay unchanged (this is how userspace sees the API). Linus would
> >    we very unhappy :-) if we had changed public API.
> 
> I never asked to modify it. :)

:-)

> 
> >    x86 guys, please correct me, but I think that [*] will be not
> >    changed (expanded) when Intel's HW boost is enabled at
> > acpi-cpufreq.c code.
> >
> >    The scaling_boost_frequencies is only visible when driver (and
> >    probably soc maintainer) is ready to handle boosting. It shows
> > over clocked frequencies.
> 
> Correct.

Ok.

> 
> > 2. How we would control boost?
> >    - To enable this you must mark IDs for some freqs as
> >      CPUFREQ_BOOST_FREQ.
> >    - The cpufreq_boost.boost_supported flag needs to be true (set at
> >      cpufreq driver code)
> >    - One needs to enable boosting by sysfs or call
> >      cpufreq_boost_trigger_state(1); The latter will not work when
> >      cpufreq_driver->boost_supported is not set.
> >
> > I assume that when somebody takes those three above steps, then he
> > is aware that boost is working on his machine.
> 
> All good until now.

Ok.

> 
> > How one can control the boost? I'm now (on my setup) using thermal
> > subsystem. I set proper trip points and when one of them is met,
> > then boost is disabled. Moreover the thermal governor (stepwise)
> > also reduces frequency.
> >
> > It works stable with v3.10 (with 3.8 there were some bugs - now they
> > are fixed).
> >
> >
> > The core acpi-cpufreq.c code hadn't been changed by me, so I assume
> > that it will work as before.
> 
> That should adapt your patch in your patchset.
> 
> >> Some part of kernel
> >> code would be setting these frequencies in real hardware. Who will
> >> set these frequencies?
> >
> > Those freqs are set by ->target() callback (when allowed)

The ->target() [*] is called when governor calls it. I didn't change any
of this behaviour. 

> 
> From sysfs?? I thought we are going to have some automatic control
> of this stuff from inside kernel. 

>From sysfs I just enable the boost. I do not order from userpace the
cpufreq to run with a particular (boosted) frequency.

When I enable boost - I ask (politely) the cpufreq core to reevaluate
policies and when applicable increase policy->max.

Then governor can use this new frequencies for normal operation.

> Userspace can't control when to run
> on boost freqs.

The control, if boost frequency shall be used or not, is done by
governor when load is appropriate.

> 
> >> On what basis? How do we ensure we don't
> >> burn your chip?
> >
> > Thermal subsystem is a good example here. Another may be a
> > governor, or even scheduler.
> 
> So, you are enabling boost from sysfs when your thermal framework
> says, you can do it?

No. I'm enabling boost from sysfs (modify policies). This does not mean
that boost frequency is run.

If governor decides, that it shall use boost freq - then it will use
it. 
When during heavy workload (and running boost freq), the trip point for
thermal is being passed, the boost shall be disabled. 
Moreover stepwise will also reduce frequency with which SoC runs.

> 
> That's not going to work. There should be something inside kernel to
> take care of this stuff. Otherwise a user may switch on boost
> accidentally and may burn his chip.

User can by mistake enable boost. But then she/he needs to load SoC to
the maximum (to enable policy->max). After heating up the SoC - the
thermal goes in and disables boost and reduces frequency to cool down
the device.

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v3 1/3] cpufreq: Add boost frequency support in core
@ 2013-06-17  9:58                 ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-17  9:58 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Amit Daniel Kachhap

On Mon, 17 Jun 2013 14:48:51 +0530, Viresh Kumar wrote:
> On 17 June 2013 14:38, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > On Mon, 17 Jun 2013 09:43:27 +0200, Viresh Kumar wrote:
> 
> >> Many cpus share same policy structure and so iterating over all of
> >> them isn't a very good idea. Either keep a mask of cpus already
> >> iterated, copy policy->cpus to it on each iteration. If a cpu is
> >> already done skip loop for it.
> >
> > This is the situation, which I wanted to avoid. Policy has the
> > policy->cpus mask already implemented, but we don't know how/where
> > to hook to them (one solution would be to start from cpu0, but for
> > some reason I'm reluctant to do it in this way).
> 
> We could have started from any cpu. Result and performance would have
> been same.

Yes. But I don't want to hardcode anything. Especially starting CPU
number.

> 
> >> OR keep a list of policies. I would prefer the later (do it in a
> >> separate patch), as this can be used later too.
> >
> > I will declare a boost_policy list at cpufreq.c. Then I will add
> > policy to it, when cpufreq_add_dev() is called.
> 
> This list doesn't have anything to do with boost. Its just a list of
> all policies.

Ok, I see.
> 
> >> >> Again, I couldn't see how boost freqs are getting used? You have
> >> >> probably made them part of normal freq range here and so they
> >> >> might be used during normal operations. But we wanted it to be
> >> >> used only when we have few cpus on... etc.. Where is that logic?
> >> >
> >> > The logic is as follow:
> >> > - cpufreq_driver exports .attr field. When driver supports boost
> >> > then two attributes are exported (even when boost is not enabled,
> >> > but supported):
> >> >         - scaling_available_frequencies (only normal frequencies
> >> > - this attribute is unchanged)
> >> >         - scaling_boost_frequencies - list possible boost
> >> > frequencies.
> >> >
> >> > When boost is not supported - then only
> >> > scaling_available_frequencies is exported (as it is done now).
> >>
> >> You are missing the whole point behind keeping this patchset. Its
> >> not about how to expose boost freqs to sysfs (that's what you are
> >> talking about) but to use these frequencies on the fly.
> >
> > Two separate things:
> >
> > 1. I think, that scaling_available_frequencies [*] attribute has to
> >    stay unchanged (this is how userspace sees the API). Linus would
> >    we very unhappy :-) if we had changed public API.
> 
> I never asked to modify it. :)

:-)

> 
> >    x86 guys, please correct me, but I think that [*] will be not
> >    changed (expanded) when Intel's HW boost is enabled at
> > acpi-cpufreq.c code.
> >
> >    The scaling_boost_frequencies is only visible when driver (and
> >    probably soc maintainer) is ready to handle boosting. It shows
> > over clocked frequencies.
> 
> Correct.

Ok.

> 
> > 2. How we would control boost?
> >    - To enable this you must mark IDs for some freqs as
> >      CPUFREQ_BOOST_FREQ.
> >    - The cpufreq_boost.boost_supported flag needs to be true (set at
> >      cpufreq driver code)
> >    - One needs to enable boosting by sysfs or call
> >      cpufreq_boost_trigger_state(1); The latter will not work when
> >      cpufreq_driver->boost_supported is not set.
> >
> > I assume that when somebody takes those three above steps, then he
> > is aware that boost is working on his machine.
> 
> All good until now.

Ok.

> 
> > How one can control the boost? I'm now (on my setup) using thermal
> > subsystem. I set proper trip points and when one of them is met,
> > then boost is disabled. Moreover the thermal governor (stepwise)
> > also reduces frequency.
> >
> > It works stable with v3.10 (with 3.8 there were some bugs - now they
> > are fixed).
> >
> >
> > The core acpi-cpufreq.c code hadn't been changed by me, so I assume
> > that it will work as before.
> 
> That should adapt your patch in your patchset.
> 
> >> Some part of kernel
> >> code would be setting these frequencies in real hardware. Who will
> >> set these frequencies?
> >
> > Those freqs are set by ->target() callback (when allowed)

The ->target() [*] is called when governor calls it. I didn't change any
of this behaviour. 

> 
> From sysfs?? I thought we are going to have some automatic control
> of this stuff from inside kernel. 

From sysfs I just enable the boost. I do not order from userpace the
cpufreq to run with a particular (boosted) frequency.

When I enable boost - I ask (politely) the cpufreq core to reevaluate
policies and when applicable increase policy->max.

Then governor can use this new frequencies for normal operation.

> Userspace can't control when to run
> on boost freqs.

The control, if boost frequency shall be used or not, is done by
governor when load is appropriate.

> 
> >> On what basis? How do we ensure we don't
> >> burn your chip?
> >
> > Thermal subsystem is a good example here. Another may be a
> > governor, or even scheduler.
> 
> So, you are enabling boost from sysfs when your thermal framework
> says, you can do it?

No. I'm enabling boost from sysfs (modify policies). This does not mean
that boost frequency is run.

If governor decides, that it shall use boost freq - then it will use
it. 
When during heavy workload (and running boost freq), the trip point for
thermal is being passed, the boost shall be disabled. 
Moreover stepwise will also reduce frequency with which SoC runs.

> 
> That's not going to work. There should be something inside kernel to
> take care of this stuff. Otherwise a user may switch on boost
> accidentally and may burn his chip.

User can by mistake enable boost. But then she/he needs to load SoC to
the maximum (to enable policy->max). After heating up the SoC - the
thermal goes in and disables boost and reduces frequency to cool down
the device.

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v3 1/3] cpufreq: Add boost frequency support in core
  2013-06-17  9:58                 ` Lukasz Majewski
  (?)
@ 2013-06-17 13:10                 ` Viresh Kumar
  2013-06-17 13:51                   ` Lukasz Majewski
  -1 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-17 13:10 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Amit Daniel Kachhap

On 17 June 2013 15:28, Lukasz Majewski <l.majewski@samsung.com> wrote:
> Yes. But I don't want to hardcode anything. Especially starting CPU
> number.

There is nothing wrong with it. for_each_online_cpu() is good enough
on these cases.

>> > How one can control the boost? I'm now (on my setup) using thermal
>> > subsystem. I set proper trip points and when one of them is met,
>> > then boost is disabled. Moreover the thermal governor (stepwise)
>> > also reduces frequency.
>> >
>> > It works stable with v3.10 (with 3.8 there were some bugs - now they
>> > are fixed).
>> >
>> >
>> > The core acpi-cpufreq.c code hadn't been changed by me, so I assume
>> > that it will work as before.
>>
>> That should adapt your patch in your patchset.

??

>> From sysfs?? I thought we are going to have some automatic control
>> of this stuff from inside kernel.
>
> From sysfs I just enable the boost. I do not order from userpace the
> cpufreq to run with a particular (boosted) frequency.
>
> When I enable boost - I ask (politely) the cpufreq core to reevaluate
> policies and when applicable increase policy->max.
>
> Then governor can use this new frequencies for normal operation.

So, with your current patchset in, ondemand or conservative governors
will start using boost frequencies. Which might burn your chip.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v3 1/3] cpufreq: Add boost frequency support in core
  2013-06-17 13:10                 ` Viresh Kumar
@ 2013-06-17 13:51                   ` Lukasz Majewski
  2013-06-18  6:42                     ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-17 13:51 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Amit Daniel Kachhap

On Mon, 17 Jun 2013 18:40:50 +0530, Viresh Kumar wrote:
> On 17 June 2013 15:28, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > Yes. But I don't want to hardcode anything. Especially starting CPU
> > number.
> 
> There is nothing wrong with it. for_each_online_cpu() is good enough
> on these cases.

I've already changed this code to use list of policies.

I will send this at v4.

> 
> >> > How one can control the boost? I'm now (on my setup) using
> >> > thermal subsystem. I set proper trip points and when one of them
> >> > is met, then boost is disabled. Moreover the thermal governor
> >> > (stepwise) also reduces frequency.
> >> >
> >> > It works stable with v3.10 (with 3.8 there were some bugs - now
> >> > they are fixed).
> >> >
> >> >
> >> > The core acpi-cpufreq.c code hadn't been changed by me, so I
> >> > assume that it will work as before.
> >>
> >> That should adapt your patch in your patchset.

Could you explain what do you mean? 


> 
> ??
> 
> >> From sysfs?? I thought we are going to have some automatic control
> >> of this stuff from inside kernel.
> >
> > From sysfs I just enable the boost. I do not order from userpace the
> > cpufreq to run with a particular (boosted) frequency.
> >
> > When I enable boost - I ask (politely) the cpufreq core to
> > reevaluate policies and when applicable increase policy->max.
> >
> > Then governor can use this new frequencies for normal operation.
> 
> So, with your current patchset in, ondemand or conservative governors
> will start using boost frequencies. Which might burn your chip.

Two scenarios:
1. Thermal framework is compiled in and enabled (for exynos/other SoC)
-> trip point is reached -> boost is disabled -> frequency is reduced ->
SoC is cooled down.

I think, that thermal framework is a good "safe valve" here.


2. Thermal framework is disabled and user has enabled boost and used
ondemand / conservative governor. 
Then execute gzip < /dev/urandom > /dev/null & (on all cores).

Then yes, chip will hang/burn due to crossing operating point (or burn).


What other means of control (despite of thermal) would you consider
applicable? 

What comes to my mind is modifying governor logic to count how long the
CPU run with boost enabled and then disable it. 

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v3 1/3] cpufreq: Add boost frequency support in core
  2013-06-17 13:51                   ` Lukasz Majewski
@ 2013-06-18  6:42                     ` Viresh Kumar
  2013-06-18  8:24                       ` Lukasz Majewski
  2013-06-18 13:26                       ` Rafael J. Wysocki
  0 siblings, 2 replies; 329+ messages in thread
From: Viresh Kumar @ 2013-06-18  6:42 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Amit Daniel Kachhap

On 17 June 2013 19:21, Lukasz Majewski <l.majewski@samsung.com> wrote:
> On Mon, 17 Jun 2013 18:40:50 +0530, Viresh Kumar wrote:
>> >> > The core acpi-cpufreq.c code hadn't been changed by me, so I
>> >> > assume that it will work as before.
>> >>
>> >> That should adapt your patch in your patchset.
>
> Could you explain what do you mean?

Update acpi-cpufreq to use your infrastructure.

>> >> From sysfs?? I thought we are going to have some automatic control
>> >> of this stuff from inside kernel.
>> >
>> > From sysfs I just enable the boost. I do not order from userpace the
>> > cpufreq to run with a particular (boosted) frequency.
>> >
>> > When I enable boost - I ask (politely) the cpufreq core to
>> > reevaluate policies and when applicable increase policy->max.
>> >
>> > Then governor can use this new frequencies for normal operation.
>>
>> So, with your current patchset in, ondemand or conservative governors
>> will start using boost frequencies. Which might burn your chip.
>
> Two scenarios:
> 1. Thermal framework is compiled in and enabled (for exynos/other SoC)
> -> trip point is reached -> boost is disabled -> frequency is reduced ->
> SoC is cooled down.
>
> I think, that thermal framework is a good "safe valve" here.

Even in this case boost shouldn't have been enabled by default.
Its not only about burning the chip but more than that.

According to my understanding, boost was important for power
saving. In case a high load can be managed by a single cpu with
boost freqs, then its better to use boost freqs rather than bringing
another cpu up.

Normally boost freqs are not so useful if we talk about powersaving,
as their energy consumption is much higher with not so great impact
on performance.

That's why when this thread started we talked about boost only when
one cpu is operational. But with your patch all cores can use boost
freq and thermal will come into picture just to save the chip.

That's wrong. This isn't why we invented boost here. Otherwise you
just don't need boost feature at all for your SoC. Just make these
freqs as available freqs and let thermal control policy->max/min
to save your chip.

> 2. Thermal framework is disabled and user has enabled boost and used
> ondemand / conservative governor.
> Then execute gzip < /dev/urandom > /dev/null & (on all cores).
>
> Then yes, chip will hang/burn due to crossing operating point (or burn).
>
>
> What other means of control (despite of thermal) would you consider
> applicable?
>
> What comes to my mind is modifying governor logic to count how long the
> CPU run with boost enabled and then disable it.

Its not about how long.. One cpu type can work longer with boost freq
compared to other.

What we probably need is:
- Enabled boost from sysfs if required (now below steps will come into
  picture)
- See how many cpus are running, if only one then start using boost freqs
- Now thermal should be come into picture to save chip in case a single
cpu running at boost can burn it out.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v3 1/3] cpufreq: Add boost frequency support in core
  2013-06-18  6:42                     ` Viresh Kumar
@ 2013-06-18  8:24                       ` Lukasz Majewski
  2013-06-18  8:40                         ` Viresh Kumar
  2013-06-18 13:26                       ` Rafael J. Wysocki
  1 sibling, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-18  8:24 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Amit Daniel Kachhap

On Tue, 18 Jun 2013 08:42:13 +0200, Viresh Kumar wrote:
> On 17 June 2013 19:21, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > On Mon, 17 Jun 2013 18:40:50 +0530, Viresh Kumar wrote:
> >> >> > The core acpi-cpufreq.c code hadn't been changed by me, so I
> >> >> > assume that it will work as before.
> >> >>
> >> >> That should adapt your patch in your patchset.
> >
> > Could you explain what do you mean?
> 
> Update acpi-cpufreq to use your infrastructure.

Ach... It is already done, since I always post acpi related patch to
the boost series :-).

> 
> >> >> From sysfs?? I thought we are going to have some automatic
> >> >> control of this stuff from inside kernel.
> >> >
> >> > From sysfs I just enable the boost. I do not order from userpace
> >> > the cpufreq to run with a particular (boosted) frequency.
> >> >
> >> > When I enable boost - I ask (politely) the cpufreq core to
> >> > reevaluate policies and when applicable increase policy->max.
> >> >
> >> > Then governor can use this new frequencies for normal operation.
> >>
> >> So, with your current patchset in, ondemand or conservative
> >> governors will start using boost frequencies. Which might burn
> >> your chip.
> >
> > Two scenarios:
> > 1. Thermal framework is compiled in and enabled (for exynos/other
> > SoC) -> trip point is reached -> boost is disabled -> frequency is
> > reduced -> SoC is cooled down.
> >
> > I think, that thermal framework is a good "safe valve" here.
> 
> Even in this case boost shouldn't have been enabled by default.
> Its not only about burning the chip but more than that.
> 
> According to my understanding, boost was important for power
> saving. In case a high load can be managed by a single cpu with
> boost freqs, then its better to use boost freqs rather than bringing
> another cpu up.
> 
> Normally boost freqs are not so useful if we talk about powersaving,
> as their energy consumption is much higher with not so great impact
> on performance.
> 
> That's why when this thread started we talked about boost only when
> one cpu is operational. But with your patch all cores can use boost
> freq and thermal will come into picture just to save the chip.

I agree here.

> 
> That's wrong. This isn't why we invented boost here. Otherwise you
> just don't need boost feature at all for your SoC. Just make these
> freqs as available freqs and let thermal control policy->max/min
> to save your chip.

Also I agree.

> 
> > 2. Thermal framework is disabled and user has enabled boost and used
> > ondemand / conservative governor.
> > Then execute gzip < /dev/urandom > /dev/null & (on all cores).
> >
> > Then yes, chip will hang/burn due to crossing operating point (or
> > burn).
> >
> >
> > What other means of control (despite of thermal) would you consider
> > applicable?
> >
> > What comes to my mind is modifying governor logic to count how long
> > the CPU run with boost enabled and then disable it.
> 
> Its not about how long.. One cpu type can work longer with boost freq
> compared to other.
> 
> What we probably need is:
> - Enabled boost from sysfs if required (now below steps will come into
>   picture)
> - See how many cpus are running, if only one then start using boost
> freqs

You are right here. 

I'd like to propose following solution:
1. For acpi (where boost_enable come into play) - do not consider
number of active cpus (this is done in HW anyway)

2. For SW solution evaluate how many CPUs are running. If only one is
running then allow enabling boost from sysfs. 

But following situation is also possible: User enable boost when one
core is only running and then for some reason other core is woken up.
What shall be done then?
Shall we then disable boost immediately when cpufreq detects that
more than one core is running? Or leave this situation to be handled by
thermal subsystem?

As a side note:
Logic proposed at point 2, is already implemented at LAB
(enable LAB only when one core is running and disable it when more
than one come into play).


> - Now thermal should be come into picture to save chip in case a
> single cpu running at boost can burn it out.

I will extent v4 to embrace code which switches off boost at thermal.

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v3 1/3] cpufreq: Add boost frequency support in core
  2013-06-18  8:24                       ` Lukasz Majewski
@ 2013-06-18  8:40                         ` Viresh Kumar
  2013-06-18  9:12                           ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-18  8:40 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Amit Daniel Kachhap

On 18 June 2013 13:54, Lukasz Majewski <l.majewski@samsung.com> wrote:
> On Tue, 18 Jun 2013 08:42:13 +0200, Viresh Kumar wrote:

>> Its not about how long.. One cpu type can work longer with boost freq
>> compared to other.
>>
>> What we probably need is:
>> - Enabled boost from sysfs if required (now below steps will come into
>>   picture)
>> - See how many cpus are running, if only one then start using boost
>> freqs
>
> You are right here.
>
> I'd like to propose following solution:
> 1. For acpi (where boost_enable come into play) - do not consider
> number of active cpus (this is done in HW anyway)
>
> 2. For SW solution evaluate how many CPUs are running. If only one is
> running then allow enabling boost from sysfs.

Looks fine.

> But following situation is also possible: User enable boost when one
> core is only running and then for some reason other core is woken up.
> What shall be done then?
> Shall we then disable boost immediately when cpufreq detects that
> more than one core is running? Or leave this situation to be handled by
> thermal subsystem?

Obviously disable boost ASAP. Every SoC might not have a thermal
framework glue to do it.

> As a side note:
> Logic proposed at point 2, is already implemented at LAB
> (enable LAB only when one core is running and disable it when more
> than one come into play).

Hmm.. So, eventually that will go away now :)

>> - Now thermal should be come into picture to save chip in case a
>> single cpu running at boost can burn it out.
>
> I will extent v4 to embrace code which switches off boost at thermal.

Gud.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v3 1/3] cpufreq: Add boost frequency support in core
  2013-06-18  8:40                         ` Viresh Kumar
@ 2013-06-18  9:12                           ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-18  9:12 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Amit Daniel Kachhap

On Tue, 18 Jun 2013 14:10:28 +0530, Viresh Kumar wrote:
> On 18 June 2013 13:54, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > On Tue, 18 Jun 2013 08:42:13 +0200, Viresh Kumar wrote:
> 
> >> Its not about how long.. One cpu type can work longer with boost
> >> freq compared to other.
> >>
> >> What we probably need is:
> >> - Enabled boost from sysfs if required (now below steps will come
> >> into picture)
> >> - See how many cpus are running, if only one then start using boost
> >> freqs
> >
> > You are right here.
> >
> > I'd like to propose following solution:
> > 1. For acpi (where boost_enable come into play) - do not consider
> > number of active cpus (this is done in HW anyway)
> >
> > 2. For SW solution evaluate how many CPUs are running. If only one
> > is running then allow enabling boost from sysfs.
> 
> Looks fine.

Ok,

> 
> > But following situation is also possible: User enable boost when one
> > core is only running and then for some reason other core is woken
> > up. What shall be done then?
> > Shall we then disable boost immediately when cpufreq detects that
> > more than one core is running? Or leave this situation to be
> > handled by thermal subsystem?
> 
> Obviously disable boost ASAP. Every SoC might not have a thermal
> framework glue to do it.

Implementation of counting number of idle CPUs would impose extending
the cpufreq core itself. Do you have any hints how this can be done in
a neat way?

I suspect, that porting the LAB solution to the cpufreq core may be not
easy. I think that the best place for it would be governor core code.

> 
> > As a side note:
> > Logic proposed at point 2, is already implemented at LAB
> > (enable LAB only when one core is running and disable it when more
> > than one come into play).
> 
> Hmm.. So, eventually that will go away now :)

But this is not the only functionality, which LAB posses :-).

> 
> >> - Now thermal should be come into picture to save chip in case a
> >> single cpu running at boost can burn it out.
> >
> > I will extent v4 to embrace code which switches off boost at
> > thermal.
> 
> Gud.

Ok.

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v3 1/3] cpufreq: Add boost frequency support in core
  2013-06-18  6:42                     ` Viresh Kumar
  2013-06-18  8:24                       ` Lukasz Majewski
@ 2013-06-18 13:26                       ` Rafael J. Wysocki
  2013-06-18 13:44                         ` Lukasz Majewski
  2013-06-20  5:01                         ` Viresh Kumar
  1 sibling, 2 replies; 329+ messages in thread
From: Rafael J. Wysocki @ 2013-06-18 13:26 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Lukasz Majewski, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Amit Daniel Kachhap

On Tuesday, June 18, 2013 12:12:13 PM Viresh Kumar wrote:
> On 17 June 2013 19:21, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > On Mon, 17 Jun 2013 18:40:50 +0530, Viresh Kumar wrote:
> >> >> > The core acpi-cpufreq.c code hadn't been changed by me, so I
> >> >> > assume that it will work as before.
> >> >>
> >> >> That should adapt your patch in your patchset.
> >
> > Could you explain what do you mean?
> 
> Update acpi-cpufreq to use your infrastructure.
> 
> >> >> From sysfs?? I thought we are going to have some automatic control
> >> >> of this stuff from inside kernel.
> >> >
> >> > From sysfs I just enable the boost. I do not order from userpace the
> >> > cpufreq to run with a particular (boosted) frequency.
> >> >
> >> > When I enable boost - I ask (politely) the cpufreq core to
> >> > reevaluate policies and when applicable increase policy->max.
> >> >
> >> > Then governor can use this new frequencies for normal operation.
> >>
> >> So, with your current patchset in, ondemand or conservative governors
> >> will start using boost frequencies. Which might burn your chip.
> >
> > Two scenarios:
> > 1. Thermal framework is compiled in and enabled (for exynos/other SoC)
> > -> trip point is reached -> boost is disabled -> frequency is reduced ->
> > SoC is cooled down.
> >
> > I think, that thermal framework is a good "safe valve" here.
> 
> Even in this case boost shouldn't have been enabled by default.
> Its not only about burning the chip but more than that.
> 
> According to my understanding, boost was important for power
> saving. In case a high load can be managed by a single cpu with
> boost freqs, then its better to use boost freqs rather than bringing
> another cpu up.

Do you mean the 'boost' sysfs attribute or the 'turbo frequencies' concept?

> Normally boost freqs are not so useful if we talk about powersaving,
> as their energy consumption is much higher with not so great impact
> on performance.

Er, er, please be careful here.  The impact on performance may be sufficient
for deep C-states to become relevant in some cases.

> That's why when this thread started we talked about boost only when
> one cpu is operational. But with your patch all cores can use boost
> freq and thermal will come into picture just to save the chip.

Well, that's why on x86 turbo is controlled by hardware that takes care of
keeping things within the chip's thermal limits.

> That's wrong. This isn't why we invented boost here. Otherwise you
> just don't need boost feature at all for your SoC. Just make these
> freqs as available freqs and let thermal control policy->max/min
> to save your chip.

The 'boost' attribute added by acpi-cpufreq means "let the hardware use turbo
frequencies".

I'd recommend you both to read Documentation/cpu-freq/boost.txt now. :-)

I think we can extend the meaning to "let turbo frequencies be used", but if
we need software to play the role of the hardware's thermal control, we need
to be very careful.

> > 2. Thermal framework is disabled and user has enabled boost and used
> > ondemand / conservative governor.
> > Then execute gzip < /dev/urandom > /dev/null & (on all cores).
> >
> > Then yes, chip will hang/burn due to crossing operating point (or burn).
> >
> >
> > What other means of control (despite of thermal) would you consider
> > applicable?
> >
> > What comes to my mind is modifying governor logic to count how long the
> > CPU run with boost enabled and then disable it.
> 
> Its not about how long.. One cpu type can work longer with boost freq
> compared to other.
> 
> What we probably need is:
> - Enabled boost from sysfs if required (now below steps will come into
>   picture)

This has to be compatible with the existing stuff.

> - See how many cpus are running, if only one then start using boost freqs
> - Now thermal should be come into picture to save chip in case a single
> cpu running at boost can burn it out.

I'd say there needs to be a separate controller/monitor for that that will
know what the chip's thermal limit is and how that relates to how fast the
CPU core(s) may run and for how much time.  I'm not sure it is sufficient
to "wait for thermal to kick in" here, because you may need to slow down
things in advance (i.e. before thermal sensors tell you there's too much heat,
because that may be too late already).

Thanks,
Rafael


-- 
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v3 1/3] cpufreq: Add boost frequency support in core
  2013-06-18 13:26                       ` Rafael J. Wysocki
@ 2013-06-18 13:44                         ` Lukasz Majewski
  2013-06-19  7:16                           ` Lukasz Majewski
  2013-06-20  5:05                           ` Viresh Kumar
  2013-06-20  5:01                         ` Viresh Kumar
  1 sibling, 2 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-18 13:44 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Viresh Kumar, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Amit Daniel Kachhap

On Tue, 18 Jun 2013 15:26:16 +0200, Rafael J. Wysocki wrote:
> On Tuesday, June 18, 2013 12:12:13 PM Viresh Kumar wrote:
> > On 17 June 2013 19:21, Lukasz Majewski <l.majewski@samsung.com>
> > wrote:
> > > On Mon, 17 Jun 2013 18:40:50 +0530, Viresh Kumar wrote:
> > >> >> > The core acpi-cpufreq.c code hadn't been changed by me, so I
> > >> >> > assume that it will work as before.
> > >> >>
> > >> >> That should adapt your patch in your patchset.
> > >
> > > Could you explain what do you mean?
> > 
> > Update acpi-cpufreq to use your infrastructure.
> > 
> > >> >> From sysfs?? I thought we are going to have some automatic
> > >> >> control of this stuff from inside kernel.
> > >> >
> > >> > From sysfs I just enable the boost. I do not order from
> > >> > userpace the cpufreq to run with a particular (boosted)
> > >> > frequency.
> > >> >
> > >> > When I enable boost - I ask (politely) the cpufreq core to
> > >> > reevaluate policies and when applicable increase policy->max.
> > >> >
> > >> > Then governor can use this new frequencies for normal
> > >> > operation.
> > >>
> > >> So, with your current patchset in, ondemand or conservative
> > >> governors will start using boost frequencies. Which might burn
> > >> your chip.
> > >
> > > Two scenarios:
> > > 1. Thermal framework is compiled in and enabled (for exynos/other
> > > SoC) -> trip point is reached -> boost is disabled -> frequency
> > > is reduced -> SoC is cooled down.
> > >
> > > I think, that thermal framework is a good "safe valve" here.
> > 
> > Even in this case boost shouldn't have been enabled by default.
> > Its not only about burning the chip but more than that.
> > 
> > According to my understanding, boost was important for power
> > saving. In case a high load can be managed by a single cpu with
> > boost freqs, then its better to use boost freqs rather than bringing
> > another cpu up.
> 
> Do you mean the 'boost' sysfs attribute or the 'turbo frequencies'
> concept?
> 
> > Normally boost freqs are not so useful if we talk about powersaving,
> > as their energy consumption is much higher with not so great impact
> > on performance.
> 
> Er, er, please be careful here.  The impact on performance may be
> sufficient for deep C-states to become relevant in some cases.
> 
> > That's why when this thread started we talked about boost only when
> > one cpu is operational. But with your patch all cores can use boost
> > freq and thermal will come into picture just to save the chip.
> 
> Well, that's why on x86 turbo is controlled by hardware that takes
> care of keeping things within the chip's thermal limits.

And this is the reason why I don't want to overly change acpi-cpufreq.c
code. :-)

> 
> > That's wrong. This isn't why we invented boost here. Otherwise you
> > just don't need boost feature at all for your SoC. Just make these
> > freqs as available freqs and let thermal control policy->max/min
> > to save your chip.
> 
> The 'boost' attribute added by acpi-cpufreq means "let the hardware
> use turbo frequencies".

This is HW managed. We only enable the switch and then simply forget
about it.

> 
> I'd recommend you both to read Documentation/cpu-freq/boost.txt
> now. :-)


According to the documentation:
"Reading the file is always supported, even if the processor does not
support boosting. In this case the file will be read-only and always
reads as "0""

Hmm, in the proposed patch set, the "boost" attribute is only exported
when cpufreq driver sets boost_supported flag. 



> 
> I think we can extend the meaning to "let turbo frequencies be used",
> but if we need software to play the role of the hardware's thermal
> control, we need to be very careful.
> 
> > > 2. Thermal framework is disabled and user has enabled boost and
> > > used ondemand / conservative governor.
> > > Then execute gzip < /dev/urandom > /dev/null & (on all cores).
> > >
> > > Then yes, chip will hang/burn due to crossing operating point (or
> > > burn).
> > >
> > >
> > > What other means of control (despite of thermal) would you
> > > consider applicable?
> > >
> > > What comes to my mind is modifying governor logic to count how
> > > long the CPU run with boost enabled and then disable it.
> > 
> > Its not about how long.. One cpu type can work longer with boost
> > freq compared to other.
> > 
> > What we probably need is:
> > - Enabled boost from sysfs if required (now below steps will come
> > into picture)
> 
> This has to be compatible with the existing stuff.
> 
> > - See how many cpus are running, if only one then start using boost
> > freqs
> > - Now thermal should be come into picture to save chip in case a
> > single cpu running at boost can burn it out.
> 
> I'd say there needs to be a separate controller/monitor for that that
> will know what the chip's thermal limit is and how that relates to
> how fast the CPU core(s) may run and for how much time.  I'm not sure
> it is sufficient to "wait for thermal to kick in" here, because you
> may need to slow down things in advance (i.e. before thermal sensors
> tell you there's too much heat, because that may be too late already).

I think that thermal subsystem shall be the second option to disable SW
boosting.

The main control shall be done inside the cpufreq core. The idea to
disable boost when more than one core is active is rational.

I'm going to implement this concept at v4.

> 
> Thanks,
> Rafael
> 
> 



-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v3 1/3] cpufreq: Add boost frequency support in core
  2013-06-18 13:44                         ` Lukasz Majewski
@ 2013-06-19  7:16                           ` Lukasz Majewski
  2013-06-20  5:11                             ` Viresh Kumar
  2013-06-20  5:05                           ` Viresh Kumar
  1 sibling, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-19  7:16 UTC (permalink / raw)
  To: Rafael J. Wysocki, Viresh Kumar
  Cc: Lukasz Majewski, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Amit Daniel Kachhap

On Tue, 18 Jun 2013 15:44:56 +0200, Lukasz Majewski wrote:

Dear Viesh, Rafael,

> > 
> > I'd recommend you both to read Documentation/cpu-freq/boost.txt
> > now. :-)  
> 
> 
> According to the documentation:
> "Reading the file is always supported, even if the processor does not
> support boosting. In this case the file will be read-only and always
> reads as "0""
> 
> Hmm, in the proposed patch set, the "boost" attribute is only exported
> when cpufreq driver sets boost_supported flag. 

I would like to clarify the above issue. 

When I've discussed with Viresh previous version of this patch, we have
agreed, that "boost" sysfs attribute [*]:
/sys/devices/system/cpu/cpufreq/boost

would be only visible when boost_supported flag is set at cpufreq
driver. 

When acpi-cpufreq driver doesn't support boost, the attribute [*]
won't be exported at all. This contradicts the documentation and legacy
acpi-cpufreq behaviour. 

Since I'm affraid to break API (with all its consequences :-) ), I would
like to be sure that this is OK, and thereof I'm allowed to rewrite
documentation accordingly.

I simply need explicit permission from both maintainers :-).

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* [PATCH v4 0/7] cpufreq:boost: CPU Boost mode support
  2013-06-06  7:07 [PATCH 0/5] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                   ` (6 preceding siblings ...)
  2013-06-14  7:38 ` [PATCH v3 " Lukasz Majewski
@ 2013-06-19 17:12 ` Lukasz Majewski
  2013-06-19 17:12   ` [PATCH v4 1/7] cpufreq: Store cpufreq policies in a list Lukasz Majewski
                     ` (7 more replies)
  2013-07-04  8:50 ` [PATCH v5 " Lukasz Majewski
                   ` (9 subsequent siblings)
  17 siblings, 8 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-19 17:12 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocky
  Cc: cpufreq, Linux PM list, Vincent Guittot, Lukasz Majewski,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

This patch series introduces support for CPU overclocking technique
called Boost.

It is a follow up of a LAB governor proposal. Boost is a LAB component:
http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq

Boost unifies hardware based solution (e.g. Intel Nehalem) with
software oriented one (like the one done at Exynos).
For this reason cpufreq/freq_table code has been reorganized to include
common code.

Important design decisions:

- Boost related code is compiled-in unconditionally and disabled by default
The cpufreq_driver is responsibile for setting boost_supported flag and
providing enable_boost callback(if HW support is needed)

- struct cpufreq_driver has been extended with boost related fields:
        -- boost_supported - when driver supports boosting
        -- enable_boost - callback to function, which is necessary to
           enable boost in the processor (like it is done at Intel)

- Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost) is always
provided.
It will be read only, until either cpufreq_driver defines boost_supported
flag or device tree's cpufreq "boost_mode" attribute is defined. It is
consistent with legacy acpi API.

- No special spin_lock for Boost was created. The one from cpufreq core
was reused.

- All available policies are now stored in a list.

- The Boost code doesn't rely on any policy. When boost state is changed,
then the policy list is iterated and proper adjustements are done.

- Number of busy cpus (with load > 90%) is calculated and exported as a
global sysfs attribute.

- The SW based boost can be only enabled when up to one core is regarded as 
a "busy" one. For safety reasons boost is disabled when more cores comes 
into play.

- To improve safety level, the thermal framework is also extended to disable
software boosting, when thermal trip point is reached.

New patches for v4:
cpufreq: Store cpufreq policies in a list
cpufreq: Calculate number of busy CPUs
cpufreq: Enable software boost only when up to one busy core is running
thermal:boost: Disable boost when trip point is reached

Tested at: HW:
        Exynos 4412 3.10 linux
        Exynos 4210 3.10 linux
Compile tested x86_64 defconfig (acpi) - help with HW (Intel Nehalem) test
 needed


Lukasz Majewski (7):
  cpufreq: Store cpufreq policies in a list
  cpufreq: Add boost frequency support in core
  cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common
    boost solution
  cpufreq:exynos:Extend Exynos cpufreq driver to support boost
    framework
  cpufreq: Calculate number of busy CPUs
  cpufreq: Enable software boost only when up to one busy core is
    running
  thermal:boost: Disable boost when trip point is reached

 drivers/cpufreq/acpi-cpufreq.c     |   61 ++++++-----------
 drivers/cpufreq/cpufreq.c          |  132 ++++++++++++++++++++++++++++++++++++
 drivers/cpufreq/cpufreq_governor.c |    4 ++
 drivers/cpufreq/exynos-cpufreq.c   |    4 ++
 drivers/cpufreq/freq_table.c       |   43 ++++++++++--
 drivers/thermal/cpu_cooling.c      |    3 +
 include/linux/cpufreq.h            |   15 ++++
 7 files changed, 215 insertions(+), 47 deletions(-)

-- 
1.7.10.4


^ permalink raw reply	[flat|nested] 329+ messages in thread

* [PATCH v4 1/7] cpufreq: Store cpufreq policies in a list
  2013-06-19 17:12 ` [PATCH v4 0/7] " Lukasz Majewski
@ 2013-06-19 17:12   ` Lukasz Majewski
  2013-06-26 10:35     ` Viresh Kumar
  2013-06-19 17:12   ` [PATCH v4 2/7] cpufreq: Add boost frequency support in core Lukasz Majewski
                     ` (6 subsequent siblings)
  7 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-19 17:12 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocky
  Cc: cpufreq, Linux PM list, Vincent Guittot, Lukasz Majewski,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

Policies available in a cpufreq framework are now linked together. They are
accessible via cpufreq_policy_list defined at cpufreq core.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

Changes for v4:
- New patch
---
 drivers/cpufreq/cpufreq.c |    3 +++
 include/linux/cpufreq.h   |    1 +
 2 files changed, 4 insertions(+)

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 2ce86ed..665e641 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -46,6 +46,7 @@ static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data);
 static DEFINE_PER_CPU(char[CPUFREQ_NAME_LEN], cpufreq_cpu_governor);
 #endif
 static DEFINE_RWLOCK(cpufreq_driver_lock);
+static LIST_HEAD(cpufreq_policy_list);
 
 /*
  * cpu_policy_rwsem is a per CPU reader-writer semaphore designed to cure
@@ -989,6 +990,7 @@ static int cpufreq_add_dev(struct device *dev, struct subsys_interface *sif)
 	}
 #endif
 
+	list_add(&policy->policy_list, &cpufreq_policy_list);
 	ret = cpufreq_add_dev_interface(cpu, policy, dev);
 	if (ret)
 		goto err_out_unregister;
@@ -1992,6 +1994,7 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
 	subsys_interface_unregister(&cpufreq_interface);
 	unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
 
+	list_del(&cpufreq_policy_list);
 	write_lock_irqsave(&cpufreq_driver_lock, flags);
 	cpufreq_driver = NULL;
 	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index ab1932c..5348981 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -117,6 +117,7 @@ struct cpufreq_policy {
 
 	struct cpufreq_real_policy	user_policy;
 
+	struct list_head        policy_list;
 	struct kobject		kobj;
 	struct completion	kobj_unregister;
 };
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v4 2/7] cpufreq: Add boost frequency support in core
  2013-06-19 17:12 ` [PATCH v4 0/7] " Lukasz Majewski
  2013-06-19 17:12   ` [PATCH v4 1/7] cpufreq: Store cpufreq policies in a list Lukasz Majewski
@ 2013-06-19 17:12   ` Lukasz Majewski
  2013-06-19 17:48     ` Dirk Brandewie
                       ` (2 more replies)
  2013-06-19 17:12   ` [PATCH v4 3/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
                     ` (5 subsequent siblings)
  7 siblings, 3 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-19 17:12 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocky
  Cc: cpufreq, Linux PM list, Vincent Guittot, Lukasz Majewski,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

This commit adds boost frequency support in cpufreq core (Hardware &
Software).
Some SoC (like Exynos4 - e.g. 4x12) allow setting frequency above
its normal operation limits. Such a mode shall be only used for a short
time.

Overclocking (boost) support is essentially provided by platform
dependent cpufreq driver.

This commit unifies support for SW and HW (Intel) over clocking solutions
in the core cpufreq driver. Previously the "boost" sysfs attribute was
defined at acpi driver code.
Boost sysfs attribute is always exported (to support legacy API). By
default boost is exported as read only. One global attribute is available at:
/sys/devices/system/cpu/cpufreq/boost.

Under the hood frequencies dedicated for boosting are marked with a
special flag (CPUFREQ_BOOST_FREQ) at driver's frequency table.
It is the user's concern to enable/disable overclocking with proper call to
sysfs.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

Changes for v4:
- Remove boost parameter from cpufreq_frequency_table_cpuinfo() function
- Introduce cpufreq_boost_supported() method
- Use of cpufreq_boost_supported() and cpufreq_boost_enabled() to decide
  if frequency shall be skipped
- Rename set_boost_freq() to enable_boost()
- cpufreq_attr_available_freq() moved to freq_table.c
- Use policy list to get access to cpufreq policies
- Rename global boost flag (cpufreq_boost_enabled -> boost_enabled)
- pr_err corrected ( %sable)
- Remove sanity check at cpufreq_boost_trigger_state() entrance [to test if
  boost is supported]
- Use either HW (boost_enable) callback or SW managed boost
- Introduce new cpufreq_boost_trigger_state_sw() method to handle boost
  at SW.
- Protect boost_enabled manipulation with lock
- Always export boost attribute (preserve legacy behaviour). When boost
  is not supported this attribute is read only

Changes for v3:
- Method for reading boost status
- Removal of cpufreq_frequency_table_max()
- Extent cpufreq_frequency_table_cpuinfo() to support boost parameter
- boost_supported flag added to cpufreq_driver struct
- "boost" sysfs attribute control flag removed
- One global flag describing state of the boost defined at cpufreq core
- Rename cpufreq_driver's low_level_boost field to set_boost_freq()
- Usage of cpufreq_sysfs_{remove|add}_file() routines

Changes for v2:
- Removal of cpufreq_boost structure and move its fields to cpufreq_driver
  structure
- Flag to indicate if global boost attribute is already defined
- Extent the pr_{err|debbug} functions to show current function names
---
 drivers/cpufreq/cpufreq.c    |   95 ++++++++++++++++++++++++++++++++++++++++++
 drivers/cpufreq/freq_table.c |   43 +++++++++++++++----
 include/linux/cpufreq.h      |   11 +++++
 3 files changed, 142 insertions(+), 7 deletions(-)

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 665e641..9141d33 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -40,6 +40,7 @@
  * also protects the cpufreq_cpu_data array.
  */
 static struct cpufreq_driver *cpufreq_driver;
+static bool boost_enabled;
 static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data);
 #ifdef CONFIG_HOTPLUG_CPU
 /* This one keeps track of the previously set governor of a removed CPU */
@@ -316,6 +317,29 @@ EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
 /*********************************************************************
  *                          SYSFS INTERFACE                          *
  *********************************************************************/
+ssize_t show_boost(struct kobject *kobj,
+				 struct attribute *attr, char *buf)
+{
+	return sprintf(buf, "%d\n", boost_enabled);
+}
+
+static ssize_t store_boost(struct kobject *kobj, struct attribute *attr,
+				  const char *buf, size_t count)
+{
+	int ret, enable;
+
+	ret = sscanf(buf, "%d", &enable);
+	if (ret != 1 || enable < 0 || enable > 1)
+		return -EINVAL;
+
+	if (cpufreq_boost_trigger_state(enable)) {
+		pr_err("%s: Cannot enable boost!\n", __func__);
+		return -EINVAL;
+	}
+
+	return count;
+}
+define_one_global_rw(boost);
 
 static struct cpufreq_governor *__find_governor(const char *str_governor)
 {
@@ -1898,6 +1922,65 @@ static struct notifier_block __refdata cpufreq_cpu_notifier = {
 };
 
 /*********************************************************************
+ *               BOOST						     *
+ *********************************************************************/
+static int cpufreq_boost_trigger_state_sw(void)
+{
+	struct cpufreq_frequency_table *freq_table;
+	struct cpufreq_policy *policy;
+	int ret = -EINVAL;
+
+	list_for_each_entry(policy, &cpufreq_policy_list, policy_list) {
+		freq_table = cpufreq_frequency_get_table(policy->cpu);
+		if (freq_table)
+			ret = cpufreq_frequency_table_cpuinfo(policy,
+							freq_table);
+	}
+
+	return ret;
+
+}
+int cpufreq_boost_trigger_state(int state)
+{
+	unsigned long flags;
+	int ret = 0;
+
+	if (boost_enabled != state) {
+		write_lock_irqsave(&cpufreq_driver_lock, flags);
+		boost_enabled = state;
+		if (cpufreq_driver->enable_boost)
+			ret = cpufreq_driver->enable_boost(state);
+		else
+			ret = cpufreq_boost_trigger_state_sw();
+
+		if (ret) {
+			boost_enabled = 0;
+			write_unlock_irqrestore(&cpufreq_driver_lock, flags);
+			pr_err("%s: BOOST cannot enable (%d)\n",
+			       __func__, ret);
+
+			return ret;
+		}
+		write_unlock_irqrestore(&cpufreq_driver_lock, flags);
+
+		pr_debug("%s: cpufreq BOOST %s\n", __func__,
+			 state ? "enabled" : "disabled");
+	}
+
+	return 0;
+}
+
+int cpufreq_boost_supported(void)
+{
+	return cpufreq_driver->boost_supported;
+}
+
+int cpufreq_boost_enabled(void)
+{
+	return boost_enabled;
+}
+
+/*********************************************************************
  *               REGISTER / UNREGISTER CPUFREQ DRIVER                *
  *********************************************************************/
 
@@ -1936,6 +2019,16 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 	cpufreq_driver = driver_data;
 	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
 
+	if (!cpufreq_driver->boost_supported)
+		boost.attr.mode = 0444;
+
+	ret = cpufreq_sysfs_create_file(&(boost.attr));
+	if (ret) {
+		pr_err("%s: cannot register global boost sysfs file\n",
+		       __func__);
+		goto err_null_driver;
+	}
+
 	ret = subsys_interface_register(&cpufreq_interface);
 	if (ret)
 		goto err_null_driver;
@@ -1992,6 +2085,8 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
 	pr_debug("unregistering driver %s\n", driver->name);
 
 	subsys_interface_unregister(&cpufreq_interface);
+
+	cpufreq_sysfs_remove_file(&(boost.attr));
 	unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
 
 	list_del(&cpufreq_policy_list);
diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c
index d7a7966..9c8e71e 100644
--- a/drivers/cpufreq/freq_table.c
+++ b/drivers/cpufreq/freq_table.c
@@ -34,6 +34,11 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
 
 			continue;
 		}
+		if (cpufreq_boost_supported())
+			if (!cpufreq_boost_enabled()
+			    && table[i].index == CPUFREQ_BOOST_FREQ)
+				continue;
+
 		pr_debug("table entry %u: %u kHz, %u index\n",
 					i, freq, table[i].index);
 		if (freq < min_freq)
@@ -171,7 +176,8 @@ static DEFINE_PER_CPU(struct cpufreq_frequency_table *, cpufreq_show_table);
 /**
  * show_available_freqs - show available frequencies for the specified CPU
  */
-static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
+static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf,
+				    int show_boost)
 {
 	unsigned int i = 0;
 	unsigned int cpu = policy->cpu;
@@ -186,6 +192,9 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
 	for (i = 0; (table[i].frequency != CPUFREQ_TABLE_END); i++) {
 		if (table[i].frequency == CPUFREQ_ENTRY_INVALID)
 			continue;
+		if (show_boost ^ (table[i].index == CPUFREQ_BOOST_FREQ))
+			continue;
+
 		count += sprintf(&buf[count], "%d ", table[i].frequency);
 	}
 	count += sprintf(&buf[count], "\n");
@@ -194,14 +203,34 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
 
 }
 
-struct freq_attr cpufreq_freq_attr_scaling_available_freqs = {
-	.attr = { .name = "scaling_available_frequencies",
-		  .mode = 0444,
-		},
-	.show = show_available_freqs,
-};
+#define cpufreq_attr_available_freq(_name)	  \
+struct freq_attr cpufreq_freq_attr_##_name##_freqs =     \
+__ATTR_RO(_name##_frequencies)
+
+/**
+ * show_scaling_available_frequencies - show normal boost frequencies for
+ * the specified CPU
+ */
+static ssize_t scaling_available_frequencies_show(struct cpufreq_policy *policy,
+						  char *buf)
+{
+	return show_available_freqs(policy, buf, 0);
+}
+cpufreq_attr_available_freq(scaling_available);
 EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_available_freqs);
 
+/**
+ * show_available_boost_freqs - show available boost frequencies for
+ * the specified CPU
+ */
+static ssize_t scaling_boost_frequencies_show(struct cpufreq_policy *policy,
+					      char *buf)
+{
+	return show_available_freqs(policy, buf, 1);
+}
+cpufreq_attr_available_freq(scaling_boost);
+EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_boost_freqs);
+
 /*
  * if you use these, you must assure that the frequency table is valid
  * all the time between get_attr and put_attr!
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index 5348981..4783c4c 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -267,6 +267,10 @@ struct cpufreq_driver {
 	int	(*suspend)	(struct cpufreq_policy *policy);
 	int	(*resume)	(struct cpufreq_policy *policy);
 	struct freq_attr	**attr;
+
+	/* platform specific boost support code */
+	bool                    boost_supported;
+	int (*enable_boost)    (int state);
 };
 
 /* flags */
@@ -408,6 +412,9 @@ extern struct cpufreq_governor cpufreq_gov_conservative;
 #define CPUFREQ_ENTRY_INVALID ~0
 #define CPUFREQ_TABLE_END     ~1
 
+/* Define index for boost frequency */
+#define CPUFREQ_BOOST_FREQ    ~2
+
 struct cpufreq_frequency_table {
 	unsigned int	index;     /* any */
 	unsigned int	frequency; /* kHz - doesn't need to be in ascending
@@ -426,11 +433,15 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
 				   unsigned int relation,
 				   unsigned int *index);
 
+int cpufreq_boost_trigger_state(int state);
+int cpufreq_boost_supported(void);
+int cpufreq_boost_enabled(void);
 /* the following 3 funtions are for cpufreq core use only */
 struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu);
 
 /* the following are really really optional */
 extern struct freq_attr cpufreq_freq_attr_scaling_available_freqs;
+extern struct freq_attr cpufreq_freq_attr_scaling_boost_freqs;
 
 void cpufreq_frequency_table_get_attr(struct cpufreq_frequency_table *table,
 				      unsigned int cpu);
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v4 3/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution
  2013-06-19 17:12 ` [PATCH v4 0/7] " Lukasz Majewski
  2013-06-19 17:12   ` [PATCH v4 1/7] cpufreq: Store cpufreq policies in a list Lukasz Majewski
  2013-06-19 17:12   ` [PATCH v4 2/7] cpufreq: Add boost frequency support in core Lukasz Majewski
@ 2013-06-19 17:12   ` Lukasz Majewski
  2013-06-26 11:03     ` Viresh Kumar
  2013-06-19 17:12   ` [PATCH v4 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
                     ` (4 subsequent siblings)
  7 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-19 17:12 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocky
  Cc: cpufreq, Linux PM list, Vincent Guittot, Lukasz Majewski,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

The Intel's hardware based boost solution driver has been changed to cooperate with
common cpufreq boost framework.

The global sysfs boost attribute entry code (/sys/devices/system/cpu/cpufreq/boost)
has been moved to a core cpufreq code. This attribute is always visible.
When cpufreq driver doesn't support boost, it is read only.
The boost supported global flag was replaced with the one defined at acpi's
cpufreq driver.

The _store_boost() function has been redesigned to be used as set_boost_freq
callback.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

Changes for v4:
- add _store_boost to acpi_cpufreq_driver structure

Changes for v3:
- Bring back boost_enabled as a global flag
- Move boost_supported to cpufreq_driver structure

Changes for v2:
- Replace boost_enabled and boost_supported global flags with proper entries
at struct cpufreq_driver.
- Removal of struct cpufreq_boost
---
 drivers/cpufreq/acpi-cpufreq.c |   61 ++++++++++++++--------------------------
 1 file changed, 21 insertions(+), 40 deletions(-)

diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c
index 2845566..f33a3c9 100644
--- a/drivers/cpufreq/acpi-cpufreq.c
+++ b/drivers/cpufreq/acpi-cpufreq.c
@@ -80,7 +80,7 @@ static struct acpi_processor_performance __percpu *acpi_perf_data;
 static struct cpufreq_driver acpi_cpufreq_driver;
 
 static unsigned int acpi_pstate_strict;
-static bool boost_enabled, boost_supported;
+static bool boost_enabled;
 static struct msr __percpu *msrs;
 
 static bool boost_state(unsigned int cpu)
@@ -133,20 +133,10 @@ static void boost_set_msrs(bool enable, const struct cpumask *cpumask)
 	wrmsr_on_cpus(cpumask, msr_addr, msrs);
 }
 
-static ssize_t _store_boost(const char *buf, size_t count)
+static int _store_boost(int val)
 {
-	int ret;
-	unsigned long val = 0;
-
-	if (!boost_supported)
-		return -EINVAL;
-
-	ret = kstrtoul(buf, 10, &val);
-	if (ret || (val > 1))
-		return -EINVAL;
-
 	if ((val && boost_enabled) || (!val && !boost_enabled))
-		return count;
+		return 0;
 
 	get_online_cpus();
 
@@ -157,30 +147,31 @@ static ssize_t _store_boost(const char *buf, size_t count)
 	boost_enabled = val;
 	pr_debug("Core Boosting %sabled.\n", val ? "en" : "dis");
 
-	return count;
+	return 0;
 }
 
-static ssize_t store_global_boost(struct kobject *kobj, struct attribute *attr,
-				  const char *buf, size_t count)
+static ssize_t store_boost(const char *buf, size_t count)
 {
-	return _store_boost(buf, count);
-}
+	int ret;
+	unsigned long val = 0;
 
-static ssize_t show_global_boost(struct kobject *kobj,
-				 struct attribute *attr, char *buf)
-{
-	return sprintf(buf, "%u\n", boost_enabled);
-}
+	if (!acpi_cpufreq_driver.boost_supported)
+		return -EINVAL;
+
+	ret = kstrtoul(buf, 10, &val);
+	if (ret || (val > 1))
+		return -EINVAL;
 
-static struct global_attr global_boost = __ATTR(boost, 0644,
-						show_global_boost,
-						store_global_boost);
+	_store_boost((int) val);
+
+	return count;
+}
 
 #ifdef CONFIG_X86_ACPI_CPUFREQ_CPB
 static ssize_t store_cpb(struct cpufreq_policy *policy, const char *buf,
 			 size_t count)
 {
-	return _store_boost(buf, count);
+	return store_boost(buf, count);
 }
 
 static ssize_t show_cpb(struct cpufreq_policy *policy, char *buf)
@@ -920,6 +911,7 @@ static struct cpufreq_driver acpi_cpufreq_driver = {
 	.name		= "acpi-cpufreq",
 	.owner		= THIS_MODULE,
 	.attr		= acpi_cpufreq_attr,
+	.enable_boost   = _store_boost,
 };
 
 static void __init acpi_cpufreq_boost_init(void)
@@ -930,8 +922,8 @@ static void __init acpi_cpufreq_boost_init(void)
 		if (!msrs)
 			return;
 
-		boost_supported = true;
 		boost_enabled = boost_state(0);
+		acpi_cpufreq_driver.boost_supported = true;
 
 		get_online_cpus();
 
@@ -941,22 +933,11 @@ static void __init acpi_cpufreq_boost_init(void)
 		register_cpu_notifier(&boost_nb);
 
 		put_online_cpus();
-	} else
-		global_boost.attr.mode = 0444;
-
-	/* We create the boost file in any case, though for systems without
-	 * hardware support it will be read-only and hardwired to return 0.
-	 */
-	if (cpufreq_sysfs_create_file(&(global_boost.attr)))
-		pr_warn(PFX "could not register global boost sysfs file\n");
-	else
-		pr_debug("registered global boost sysfs file\n");
+	}
 }
 
 static void __exit acpi_cpufreq_boost_exit(void)
 {
-	cpufreq_sysfs_remove_file(&(global_boost.attr));
-
 	if (msrs) {
 		unregister_cpu_notifier(&boost_nb);
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v4 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework
  2013-06-19 17:12 ` [PATCH v4 0/7] " Lukasz Majewski
                     ` (2 preceding siblings ...)
  2013-06-19 17:12   ` [PATCH v4 3/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
@ 2013-06-19 17:12   ` Lukasz Majewski
  2013-06-27  8:58     ` Viresh Kumar
  2013-06-19 17:12   ` [PATCH v4 5/7] cpufreq: Calculate number of busy CPUs Lukasz Majewski
                     ` (3 subsequent siblings)
  7 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-19 17:12 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocky
  Cc: cpufreq, Linux PM list, Vincent Guittot, Lukasz Majewski,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

The struct cpufreq_driver has been extended to embrace the information
related to boost support.

When "boost_mode" device tree attribute is defined for a platform, the
boost_supported flag is set. Moreover boost related attributes were
exported.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

Changes for v4:
- None

Changes for v3:
- Remove low level boost code
- Move boost management code to cpufreq core code
- Use boost_supported flag to indicate if driver supports over clocking

Changes for v2:
- Removal of struct cpufreq_boost
- Removal of the CONFIG_CPU_FREQ_BOOST flag
- low_level_boost with valid address when boost is supported
---
 drivers/cpufreq/exynos-cpufreq.c |    4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/cpufreq/exynos-cpufreq.c b/drivers/cpufreq/exynos-cpufreq.c
index 3197d88..b0e424e 100644
--- a/drivers/cpufreq/exynos-cpufreq.c
+++ b/drivers/cpufreq/exynos-cpufreq.c
@@ -264,6 +264,7 @@ static int exynos_cpufreq_cpu_exit(struct cpufreq_policy *policy)
 
 static struct freq_attr *exynos_cpufreq_attr[] = {
 	&cpufreq_freq_attr_scaling_available_freqs,
+	&cpufreq_freq_attr_scaling_boost_freqs,
 	NULL,
 };
 
@@ -359,6 +360,7 @@ static struct of_device_id exynos_cpufreq_of_match[] __initconst = {
 
 static int __init exynos_cpufreq_probe(struct platform_device *pdev)
 {
+	struct device_node *node = pdev->dev.of_node;
 	int ret = -EINVAL;
 
 	exynos_info = kzalloc(sizeof(struct exynos_dvfs_info), GFP_KERNEL);
@@ -391,6 +393,8 @@ static int __init exynos_cpufreq_probe(struct platform_device *pdev)
 	}
 
 	locking_frequency = exynos_getspeed(0);
+	if (of_property_read_bool(node, "boost_mode"))
+		exynos_driver.boost_supported = 1;
 
 	register_pm_notifier(&exynos_cpufreq_nb);
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v4 5/7] cpufreq: Calculate number of busy CPUs
  2013-06-19 17:12 ` [PATCH v4 0/7] " Lukasz Majewski
                     ` (3 preceding siblings ...)
  2013-06-19 17:12   ` [PATCH v4 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
@ 2013-06-19 17:12   ` Lukasz Majewski
  2013-06-19 18:01     ` Dirk Brandewie
  2013-06-27  9:36     ` Viresh Kumar
  2013-06-19 17:12   ` [PATCH v4 6/7] cpufreq: Enable software boost only when up to one busy core is running Lukasz Majewski
                     ` (2 subsequent siblings)
  7 siblings, 2 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-19 17:12 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocky
  Cc: cpufreq, Linux PM list, Vincent Guittot, Lukasz Majewski,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

In the core governor code, per cpu load value is calculated. This patch
uses it to mark processor as a "busy" one, when load value is higher than
90%.

New cpufreq sysfs attribute is created (busy_cpus). It is read only
and provides information about number of actually busy CPU.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

Changes for v4:
- New patch
---
 drivers/cpufreq/cpufreq.c          |   31 ++++++++++++++++++++++++++++++-
 drivers/cpufreq/cpufreq_governor.c |    1 +
 include/linux/cpufreq.h            |    3 +++
 3 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 9141d33..f785273 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -48,6 +48,7 @@ static DEFINE_PER_CPU(char[CPUFREQ_NAME_LEN], cpufreq_cpu_governor);
 #endif
 static DEFINE_RWLOCK(cpufreq_driver_lock);
 static LIST_HEAD(cpufreq_policy_list);
+static cpumask_t cpufreq_busy_cpus;
 
 /*
  * cpu_policy_rwsem is a per CPU reader-writer semaphore designed to cure
@@ -317,6 +318,13 @@ EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
 /*********************************************************************
  *                          SYSFS INTERFACE                          *
  *********************************************************************/
+ssize_t show_busy_cpus(struct kobject *kobj,
+				 struct attribute *attr, char *buf)
+{
+	return sprintf(buf, "%d\n", cpufreq_num_busy_cpu());
+}
+define_one_global_ro(busy_cpus);
+
 ssize_t show_boost(struct kobject *kobj,
 				 struct attribute *attr, char *buf)
 {
@@ -1980,6 +1988,17 @@ int cpufreq_boost_enabled(void)
 	return boost_enabled;
 }
 
+int cpufreq_num_busy_cpu(void)
+{
+	return cpumask_weight(&cpufreq_busy_cpus);
+}
+
+void cpufreq_set_busy_cpu(int cpu, int val)
+{
+	val ? cpumask_set_cpu(cpu, &cpufreq_busy_cpus) :
+		cpumask_clear_cpu(cpu, &cpufreq_busy_cpus);
+}
+
 /*********************************************************************
  *               REGISTER / UNREGISTER CPUFREQ DRIVER                *
  *********************************************************************/
@@ -2019,6 +2038,13 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 	cpufreq_driver = driver_data;
 	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
 
+	ret = cpufreq_sysfs_create_file(&(busy_cpus.attr));
+	if (ret) {
+		pr_err("%s: cannot register global busy_cpus sysfs file\n",
+		       __func__);
+		goto err_null_driver;
+	}
+
 	if (!cpufreq_driver->boost_supported)
 		boost.attr.mode = 0444;
 
@@ -2026,7 +2052,7 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 	if (ret) {
 		pr_err("%s: cannot register global boost sysfs file\n",
 		       __func__);
-		goto err_null_driver;
+		goto err_busy_idle_unreg;
 	}
 
 	ret = subsys_interface_register(&cpufreq_interface);
@@ -2058,6 +2084,8 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 	return 0;
 err_if_unreg:
 	subsys_interface_unregister(&cpufreq_interface);
+err_busy_idle_unreg:
+	cpufreq_sysfs_remove_file(&(busy_cpus.attr));
 err_null_driver:
 	write_lock_irqsave(&cpufreq_driver_lock, flags);
 	cpufreq_driver = NULL;
@@ -2086,6 +2114,7 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
 
 	subsys_interface_unregister(&cpufreq_interface);
 
+	cpufreq_sysfs_remove_file(&(busy_cpus.attr));
 	cpufreq_sysfs_remove_file(&(boost.attr));
 	unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
 
diff --git a/drivers/cpufreq/cpufreq_governor.c b/drivers/cpufreq/cpufreq_governor.c
index 077cea7..3402533 100644
--- a/drivers/cpufreq/cpufreq_governor.c
+++ b/drivers/cpufreq/cpufreq_governor.c
@@ -148,6 +148,7 @@ void dbs_check_cpu(struct dbs_data *dbs_data, int cpu)
 			continue;
 
 		load = 100 * (wall_time - idle_time) / wall_time;
+		cpufreq_set_busy_cpu(j, load > 90 ? 1 : 0);
 
 		if (dbs_data->cdata->governor == GOV_ONDEMAND) {
 			int freq_avg = __cpufreq_driver_getavg(policy, j);
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index 4783c4c..536abfc 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -436,6 +436,9 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
 int cpufreq_boost_trigger_state(int state);
 int cpufreq_boost_supported(void);
 int cpufreq_boost_enabled(void);
+
+void cpufreq_set_busy_cpu(int cpu, int val);
+int cpufreq_num_busy_cpu(void);
 /* the following 3 funtions are for cpufreq core use only */
 struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu);
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v4 6/7] cpufreq: Enable software boost only when up to one busy core is running
  2013-06-19 17:12 ` [PATCH v4 0/7] " Lukasz Majewski
                     ` (4 preceding siblings ...)
  2013-06-19 17:12   ` [PATCH v4 5/7] cpufreq: Calculate number of busy CPUs Lukasz Majewski
@ 2013-06-19 17:12   ` Lukasz Majewski
  2013-06-19 17:12   ` [PATCH v4 7/7] thermal:boost: Disable boost when trip point is reached Lukasz Majewski
  2013-06-26  7:48   ` [PATCH v4 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
  7 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-19 17:12 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocky
  Cc: cpufreq, Linux PM list, Vincent Guittot, Lukasz Majewski,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

This patch adds protection from accidental enable of boost at systems,
which supports software boosting.

Boost software mode can be only enabled when up to one busy (with heavy
load) core is available on the system. Such approach brings extra
protection from over heating.

Moreover the boost is automatically disabled, when cpufreq core detects
more busy cores.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

Changes for v4:
- New patch
---
 drivers/cpufreq/cpufreq.c          |    9 +++++++--
 drivers/cpufreq/cpufreq_governor.c |    3 +++
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index f785273..59d2cac 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -1932,12 +1932,17 @@ static struct notifier_block __refdata cpufreq_cpu_notifier = {
 /*********************************************************************
  *               BOOST						     *
  *********************************************************************/
-static int cpufreq_boost_trigger_state_sw(void)
+static int cpufreq_boost_trigger_state_sw(int state)
 {
 	struct cpufreq_frequency_table *freq_table;
 	struct cpufreq_policy *policy;
 	int ret = -EINVAL;
 
+	if (state && cpufreq_num_busy_cpu() > 1) {
+		boost_enabled = 0;
+		return 0;
+	}
+
 	list_for_each_entry(policy, &cpufreq_policy_list, policy_list) {
 		freq_table = cpufreq_frequency_get_table(policy->cpu);
 		if (freq_table)
@@ -1959,7 +1964,7 @@ int cpufreq_boost_trigger_state(int state)
 		if (cpufreq_driver->enable_boost)
 			ret = cpufreq_driver->enable_boost(state);
 		else
-			ret = cpufreq_boost_trigger_state_sw();
+			ret = cpufreq_boost_trigger_state_sw(state);
 
 		if (ret) {
 			boost_enabled = 0;
diff --git a/drivers/cpufreq/cpufreq_governor.c b/drivers/cpufreq/cpufreq_governor.c
index 3402533..9383ab9 100644
--- a/drivers/cpufreq/cpufreq_governor.c
+++ b/drivers/cpufreq/cpufreq_governor.c
@@ -162,6 +162,9 @@ void dbs_check_cpu(struct dbs_data *dbs_data, int cpu)
 			max_load = load;
 	}
 
+	if (cpufreq_boost_supported() && cpufreq_num_busy_cpu() > 1)
+		cpufreq_boost_trigger_state(0);
+
 	dbs_data->cdata->gov_check_cpu(cpu, max_load);
 }
 EXPORT_SYMBOL_GPL(dbs_check_cpu);
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v4 7/7] thermal:boost: Disable boost when trip point is reached
  2013-06-19 17:12 ` [PATCH v4 0/7] " Lukasz Majewski
                     ` (5 preceding siblings ...)
  2013-06-19 17:12   ` [PATCH v4 6/7] cpufreq: Enable software boost only when up to one busy core is running Lukasz Majewski
@ 2013-06-19 17:12   ` Lukasz Majewski
  2013-06-26  7:48   ` [PATCH v4 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
  7 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-19 17:12 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocky
  Cc: cpufreq, Linux PM list, Vincent Guittot, Lukasz Majewski,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

This patch provides support for disabling cpufreq's boost
feature when thermal trip point is reached.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

Changes for v4:
- New patch
---
 drivers/thermal/cpu_cooling.c |    3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/thermal/cpu_cooling.c b/drivers/thermal/cpu_cooling.c
index c94bf2e..3bdd870 100644
--- a/drivers/thermal/cpu_cooling.c
+++ b/drivers/thermal/cpu_cooling.c
@@ -323,6 +323,9 @@ static int cpufreq_thermal_notifier(struct notifier_block *nb,
 	if (cpumask_test_cpu(policy->cpu, &notify_device->allowed_cpus))
 		max_freq = notify_device->cpufreq_val;
 
+	if (cpufreq_boost_supported())
+		cpufreq_boost_trigger_state(0);
+
 	/* Never exceed user_policy.max */
 	if (max_freq > policy->user_policy.max)
 		max_freq = policy->user_policy.max;
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 2/7] cpufreq: Add boost frequency support in core
  2013-06-19 17:12   ` [PATCH v4 2/7] cpufreq: Add boost frequency support in core Lukasz Majewski
@ 2013-06-19 17:48     ` Dirk Brandewie
  2013-06-19 20:31       ` Lukasz Majewski
  2013-06-20  5:13     ` Viresh Kumar
  2013-06-26 10:54     ` Viresh Kumar
  2 siblings, 1 reply; 329+ messages in thread
From: Dirk Brandewie @ 2013-06-19 17:48 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Viresh Kumar, Rafael J. Wysocky, cpufreq, Linux PM list,
	Vincent Guittot, Jonghwa Lee, Myungjoo Ham, linux-kernel,
	Lukasz Majewski, Andre Przywara, Daniel Lezcano, Kukjin Kim,
	Zhang Rui, Eduardo Valentin, dirk.brandewie

On 06/19/2013 10:12 AM, Lukasz Majewski wrote:
> This commit adds boost frequency support in cpufreq core (Hardware &

> +/*********************************************************************
>    *               REGISTER / UNREGISTER CPUFREQ DRIVER                *
>    *********************************************************************/
>
> @@ -1936,6 +2019,16 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
>   	cpufreq_driver = driver_data;
>   	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
>
> +	if (!cpufreq_driver->boost_supported)
> +		boost.attr.mode = 0444;
> +
> +	ret = cpufreq_sysfs_create_file(&(boost.attr));
> +	if (ret) {
> +		pr_err("%s: cannot register global boost sysfs file\n",
> +		       __func__);
> +		goto err_null_driver;
> +	}
> +

I do not think the boost sysfs should be created at all if boost is not
supported.

For intel_pstate the read-only boost would be there for no reason and would
cause confusion on the part of the user IMHO

>   	ret = subsys_interface_register(&cpufreq_interface);
>   	if (ret)
>   		goto err_null_driver;
> @@ -1992,6 +2085,8 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
>   	pr_debug("unregistering driver %s\n", driver->name);
>
>   	subsys_interface_unregister(&cpufreq_interface);
> +
> +	cpufreq_sysfs_remove_file(&(boost.attr));
>   	unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
>


^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 5/7] cpufreq: Calculate number of busy CPUs
  2013-06-19 17:12   ` [PATCH v4 5/7] cpufreq: Calculate number of busy CPUs Lukasz Majewski
@ 2013-06-19 18:01     ` Dirk Brandewie
  2013-06-19 20:58       ` Lukasz Majewski
  2013-06-27  9:36     ` Viresh Kumar
  1 sibling, 1 reply; 329+ messages in thread
From: Dirk Brandewie @ 2013-06-19 18:01 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Viresh Kumar, Rafael J. Wysocky, cpufreq, Linux PM list,
	Vincent Guittot, Jonghwa Lee, Myungjoo Ham, linux-kernel,
	Lukasz Majewski, Andre Przywara, Daniel Lezcano, Kukjin Kim,
	Zhang Rui, Eduardo Valentin, dirk.brandewie

On 06/19/2013 10:12 AM, Lukasz Majewski wrote:
> In the core governor code, per cpu load value is calculated. This patch
> uses it to mark processor as a "busy" one, when load value is higher than
> 90%.
>
> New cpufreq sysfs attribute is created (busy_cpus). It is read only
> and provides information about number of actually busy CPU.
>

What is the intended use of this interface?

For drivers that have internal governors it will be misleading/wrong

--Dirk
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
>
> Changes for v4:
> - New patch
> ---
>   drivers/cpufreq/cpufreq.c          |   31 ++++++++++++++++++++++++++++++-
>   drivers/cpufreq/cpufreq_governor.c |    1 +
>   include/linux/cpufreq.h            |    3 +++
>   3 files changed, 34 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> index 9141d33..f785273 100644
> --- a/drivers/cpufreq/cpufreq.c
> +++ b/drivers/cpufreq/cpufreq.c
> @@ -48,6 +48,7 @@ static DEFINE_PER_CPU(char[CPUFREQ_NAME_LEN], cpufreq_cpu_governor);
>   #endif
>   static DEFINE_RWLOCK(cpufreq_driver_lock);
>   static LIST_HEAD(cpufreq_policy_list);
> +static cpumask_t cpufreq_busy_cpus;
>
>   /*
>    * cpu_policy_rwsem is a per CPU reader-writer semaphore designed to cure
> @@ -317,6 +318,13 @@ EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
>   /*********************************************************************
>    *                          SYSFS INTERFACE                          *
>    *********************************************************************/
> +ssize_t show_busy_cpus(struct kobject *kobj,
> +				 struct attribute *attr, char *buf)
> +{
> +	return sprintf(buf, "%d\n", cpufreq_num_busy_cpu());
> +}
> +define_one_global_ro(busy_cpus);
> +
>   ssize_t show_boost(struct kobject *kobj,
>   				 struct attribute *attr, char *buf)
>   {
> @@ -1980,6 +1988,17 @@ int cpufreq_boost_enabled(void)
>   	return boost_enabled;
>   }
>
> +int cpufreq_num_busy_cpu(void)
> +{
> +	return cpumask_weight(&cpufreq_busy_cpus);
> +}
> +
> +void cpufreq_set_busy_cpu(int cpu, int val)
> +{
> +	val ? cpumask_set_cpu(cpu, &cpufreq_busy_cpus) :
> +		cpumask_clear_cpu(cpu, &cpufreq_busy_cpus);
> +}
> +
>   /*********************************************************************
>    *               REGISTER / UNREGISTER CPUFREQ DRIVER                *
>    *********************************************************************/
> @@ -2019,6 +2038,13 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
>   	cpufreq_driver = driver_data;
>   	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
>
> +	ret = cpufreq_sysfs_create_file(&(busy_cpus.attr));
> +	if (ret) {
> +		pr_err("%s: cannot register global busy_cpus sysfs file\n",
> +		       __func__);
> +		goto err_null_driver;
> +	}
> +
>   	if (!cpufreq_driver->boost_supported)
>   		boost.attr.mode = 0444;
>
> @@ -2026,7 +2052,7 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
>   	if (ret) {
>   		pr_err("%s: cannot register global boost sysfs file\n",
>   		       __func__);
> -		goto err_null_driver;
> +		goto err_busy_idle_unreg;
>   	}
>
>   	ret = subsys_interface_register(&cpufreq_interface);
> @@ -2058,6 +2084,8 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
>   	return 0;
>   err_if_unreg:
>   	subsys_interface_unregister(&cpufreq_interface);
> +err_busy_idle_unreg:
> +	cpufreq_sysfs_remove_file(&(busy_cpus.attr));
>   err_null_driver:
>   	write_lock_irqsave(&cpufreq_driver_lock, flags);
>   	cpufreq_driver = NULL;
> @@ -2086,6 +2114,7 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
>
>   	subsys_interface_unregister(&cpufreq_interface);
>
> +	cpufreq_sysfs_remove_file(&(busy_cpus.attr));
>   	cpufreq_sysfs_remove_file(&(boost.attr));
>   	unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
>
> diff --git a/drivers/cpufreq/cpufreq_governor.c b/drivers/cpufreq/cpufreq_governor.c
> index 077cea7..3402533 100644
> --- a/drivers/cpufreq/cpufreq_governor.c
> +++ b/drivers/cpufreq/cpufreq_governor.c
> @@ -148,6 +148,7 @@ void dbs_check_cpu(struct dbs_data *dbs_data, int cpu)
>   			continue;
>
>   		load = 100 * (wall_time - idle_time) / wall_time;
> +		cpufreq_set_busy_cpu(j, load > 90 ? 1 : 0);
>
>   		if (dbs_data->cdata->governor == GOV_ONDEMAND) {
>   			int freq_avg = __cpufreq_driver_getavg(policy, j);
> diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
> index 4783c4c..536abfc 100644
> --- a/include/linux/cpufreq.h
> +++ b/include/linux/cpufreq.h
> @@ -436,6 +436,9 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
>   int cpufreq_boost_trigger_state(int state);
>   int cpufreq_boost_supported(void);
>   int cpufreq_boost_enabled(void);
> +
> +void cpufreq_set_busy_cpu(int cpu, int val);
> +int cpufreq_num_busy_cpu(void);
>   /* the following 3 funtions are for cpufreq core use only */
>   struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu);
>
>


^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 2/7] cpufreq: Add boost frequency support in core
  2013-06-19 17:48     ` Dirk Brandewie
@ 2013-06-19 20:31       ` Lukasz Majewski
  2013-06-19 22:25         ` Rafael J. Wysocki
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-19 20:31 UTC (permalink / raw)
  To: Dirk Brandewie
  Cc: Lukasz Majewski, Viresh Kumar, Rafael J. Wysocky, cpufreq,
	Linux PM list, Vincent Guittot, Jonghwa Lee, Myungjoo Ham,
	linux-kernel, Andre Przywara, Daniel Lezcano, Kukjin Kim,
	Zhang Rui, Eduardo Valentin

On Wed, 19 Jun 2013 10:48:53 -0700
Dirk Brandewie <dirk.brandewie@gmail.com> wrote:

> On 06/19/2013 10:12 AM, Lukasz Majewski wrote:
> > This commit adds boost frequency support in cpufreq core (Hardware &
> 
> > +/*********************************************************************
> >    *               REGISTER / UNREGISTER CPUFREQ
> > DRIVER                *
> > *********************************************************************/
> >
> > @@ -1936,6 +2019,16 @@ int cpufreq_register_driver(struct
> > cpufreq_driver *driver_data) cpufreq_driver = driver_data;
> >   	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> >
> > +	if (!cpufreq_driver->boost_supported)
> > +		boost.attr.mode = 0444;
> > +
> > +	ret = cpufreq_sysfs_create_file(&(boost.attr));
> > +	if (ret) {
> > +		pr_err("%s: cannot register global boost sysfs
> > file\n",
> > +		       __func__);
> > +		goto err_null_driver;
> > +	}
> > +
> 
> I do not think the boost sysfs should be created at all if boost is
> not supported.

This was my first thought. But unfortunately this "boost" attribute is
always exported at acpi-cpufreq.c and in my opinion is part of a
legacy API.

I totally agree with the idea of exporting boost only when supported,
but I would like to know the community opinion about this (especially
Viresh and Rafael shall speak up).

> 
> For intel_pstate the read-only boost would be there for no reason and
> would cause confusion on the part of the user IMHO

You are probably right here. However I don't know what was the
original rationale behind exporting this attribute as read only. 

> 
> >   	ret = subsys_interface_register(&cpufreq_interface);
> >   	if (ret)
> >   		goto err_null_driver;
> > @@ -1992,6 +2085,8 @@ int cpufreq_unregister_driver(struct
> > cpufreq_driver *driver) pr_debug("unregistering driver %s\n",
> > driver->name);
> >
> >   	subsys_interface_unregister(&cpufreq_interface);
> > +
> > +	cpufreq_sysfs_remove_file(&(boost.attr));
> >   	unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
> >
> 

Best regards,

Lukasz Majewski


^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 5/7] cpufreq: Calculate number of busy CPUs
  2013-06-19 18:01     ` Dirk Brandewie
@ 2013-06-19 20:58       ` Lukasz Majewski
  2013-06-19 22:26         ` Rafael J. Wysocki
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-19 20:58 UTC (permalink / raw)
  To: Dirk Brandewie
  Cc: Lukasz Majewski, Viresh Kumar, Rafael J. Wysocky, cpufreq,
	Linux PM list, Vincent Guittot, Jonghwa Lee, Myungjoo Ham,
	linux-kernel, Andre Przywara, Daniel Lezcano, Kukjin Kim,
	Zhang Rui, Eduardo Valentin, l.majewski

On Wed, 19 Jun 2013 11:01:07 -0700
Dirk Brandewie <dirk.brandewie@gmail.com> wrote:

> On 06/19/2013 10:12 AM, Lukasz Majewski wrote:
> > In the core governor code, per cpu load value is calculated. This
> > patch uses it to mark processor as a "busy" one, when load value is
> > higher than 90%.
> >
> > New cpufreq sysfs attribute is created (busy_cpus). It is read only
> > and provides information about number of actually busy CPU.
> >
> 
> What is the intended use of this interface?

The kernel API would be handy with boost managed by software (like it is
done with exynos) and with LAB governor.

The intention is to have two save valves for boost:

1. Enable SW controlled boost only when we have just one busy CPU.

2. Use the Thermal subsystem to switch off SW managed boost when it
detects that SoC is overheating.

The problem with 2 is that, the boost code is compiled in to the cpufreq
core (no CONFIG_BOOST flag). Thereof we cannot guarantee, that thermal
would be always enabled (the KConfig select option). 
I think that thermal subsystem is a suitable place to disable SW boost
at emergency. However in my opinion this is not enough and precaution
defined at 1 is needed. 

I can remove exporting the "busy_cpu" sysfs attribute if you think, that
it would confuse userspace. Its purpose is mainly informational.

> 
> For drivers that have internal governors it will be misleading/wrong

Would you be so kind and give me an example of such an internal
governor?

Maybe I've overlooked some important information/usecase.

> 
> --Dirk
> > Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> > Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> >
> > Changes for v4:
> > - New patch
> > ---
> >   drivers/cpufreq/cpufreq.c          |   31
> > ++++++++++++++++++++++++++++++- drivers/cpufreq/cpufreq_governor.c
> > |    1 + include/linux/cpufreq.h            |    3 +++
> >   3 files changed, 34 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> > index 9141d33..f785273 100644
> > --- a/drivers/cpufreq/cpufreq.c
> > +++ b/drivers/cpufreq/cpufreq.c
> > @@ -48,6 +48,7 @@ static DEFINE_PER_CPU(char[CPUFREQ_NAME_LEN],
> > cpufreq_cpu_governor); #endif
> >   static DEFINE_RWLOCK(cpufreq_driver_lock);
> >   static LIST_HEAD(cpufreq_policy_list);
> > +static cpumask_t cpufreq_busy_cpus;
> >
> >   /*
> >    * cpu_policy_rwsem is a per CPU reader-writer semaphore designed
> > to cure @@ -317,6 +318,13 @@
> > EXPORT_SYMBOL_GPL(cpufreq_notify_transition); /*********************************************************************
> >    *                          SYSFS
> > INTERFACE                          *
> > *********************************************************************/
> > +ssize_t show_busy_cpus(struct kobject *kobj,
> > +				 struct attribute *attr, char *buf)
> > +{
> > +	return sprintf(buf, "%d\n", cpufreq_num_busy_cpu());
> > +}
> > +define_one_global_ro(busy_cpus);
> > +
> >   ssize_t show_boost(struct kobject *kobj,
> >   				 struct attribute *attr, char
> > *buf) {
> > @@ -1980,6 +1988,17 @@ int cpufreq_boost_enabled(void)
> >   	return boost_enabled;
> >   }
> >
> > +int cpufreq_num_busy_cpu(void)
> > +{
> > +	return cpumask_weight(&cpufreq_busy_cpus);
> > +}
> > +
> > +void cpufreq_set_busy_cpu(int cpu, int val)
> > +{
> > +	val ? cpumask_set_cpu(cpu, &cpufreq_busy_cpus) :
> > +		cpumask_clear_cpu(cpu, &cpufreq_busy_cpus);
> > +}
> > +
> >   /*********************************************************************
> >    *               REGISTER / UNREGISTER CPUFREQ
> > DRIVER                *
> > *********************************************************************/
> > @@ -2019,6 +2038,13 @@ int cpufreq_register_driver(struct
> > cpufreq_driver *driver_data) cpufreq_driver = driver_data;
> > write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> >
> > +	ret = cpufreq_sysfs_create_file(&(busy_cpus.attr));
> > +	if (ret) {
> > +		pr_err("%s: cannot register global busy_cpus sysfs
> > file\n",
> > +		       __func__);
> > +		goto err_null_driver;
> > +	}
> > +
> >   	if (!cpufreq_driver->boost_supported)
> >   		boost.attr.mode = 0444;
> >
> > @@ -2026,7 +2052,7 @@ int cpufreq_register_driver(struct
> > cpufreq_driver *driver_data) if (ret) {
> >   		pr_err("%s: cannot register global boost sysfs
> > file\n", __func__);
> > -		goto err_null_driver;
> > +		goto err_busy_idle_unreg;
> >   	}
> >
> >   	ret = subsys_interface_register(&cpufreq_interface);
> > @@ -2058,6 +2084,8 @@ int cpufreq_register_driver(struct
> > cpufreq_driver *driver_data) return 0;
> >   err_if_unreg:
> >   	subsys_interface_unregister(&cpufreq_interface);
> > +err_busy_idle_unreg:
> > +	cpufreq_sysfs_remove_file(&(busy_cpus.attr));
> >   err_null_driver:
> >   	write_lock_irqsave(&cpufreq_driver_lock, flags);
> >   	cpufreq_driver = NULL;
> > @@ -2086,6 +2114,7 @@ int cpufreq_unregister_driver(struct
> > cpufreq_driver *driver)
> >
> >   	subsys_interface_unregister(&cpufreq_interface);
> >
> > +	cpufreq_sysfs_remove_file(&(busy_cpus.attr));
> >   	cpufreq_sysfs_remove_file(&(boost.attr));
> >   	unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
> >
> > diff --git a/drivers/cpufreq/cpufreq_governor.c
> > b/drivers/cpufreq/cpufreq_governor.c index 077cea7..3402533 100644
> > --- a/drivers/cpufreq/cpufreq_governor.c
> > +++ b/drivers/cpufreq/cpufreq_governor.c
> > @@ -148,6 +148,7 @@ void dbs_check_cpu(struct dbs_data *dbs_data,
> > int cpu) continue;
> >
> >   		load = 100 * (wall_time - idle_time) / wall_time;
> > +		cpufreq_set_busy_cpu(j, load > 90 ? 1 : 0);
> >
> >   		if (dbs_data->cdata->governor == GOV_ONDEMAND) {
> >   			int freq_avg =
> > __cpufreq_driver_getavg(policy, j); diff --git
> > a/include/linux/cpufreq.h b/include/linux/cpufreq.h index
> > 4783c4c..536abfc 100644 --- a/include/linux/cpufreq.h
> > +++ b/include/linux/cpufreq.h
> > @@ -436,6 +436,9 @@ int cpufreq_frequency_table_target(struct
> > cpufreq_policy *policy, int cpufreq_boost_trigger_state(int state);
> >   int cpufreq_boost_supported(void);
> >   int cpufreq_boost_enabled(void);
> > +
> > +void cpufreq_set_busy_cpu(int cpu, int val);
> > +int cpufreq_num_busy_cpu(void);
> >   /* the following 3 funtions are for cpufreq core use only */
> >   struct cpufreq_frequency_table
> > *cpufreq_frequency_get_table(unsigned int cpu);
> >
> >
> 
Best regards,

Lukasz Majewski

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 2/7] cpufreq: Add boost frequency support in core
  2013-06-19 20:31       ` Lukasz Majewski
@ 2013-06-19 22:25         ` Rafael J. Wysocki
  2013-07-17  7:58           ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Rafael J. Wysocki @ 2013-06-19 22:25 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Dirk Brandewie, Lukasz Majewski, Viresh Kumar, cpufreq,
	Linux PM list, Vincent Guittot, Jonghwa Lee, Myungjoo Ham,
	linux-kernel, Andre Przywara, Daniel Lezcano, Kukjin Kim,
	Zhang Rui, Eduardo Valentin

On Wednesday, June 19, 2013 10:31:02 PM Lukasz Majewski wrote:
> On Wed, 19 Jun 2013 10:48:53 -0700
> Dirk Brandewie <dirk.brandewie@gmail.com> wrote:
> 
> > On 06/19/2013 10:12 AM, Lukasz Majewski wrote:
> > > This commit adds boost frequency support in cpufreq core (Hardware &
> > 
> > > +/*********************************************************************
> > >    *               REGISTER / UNREGISTER CPUFREQ
> > > DRIVER                *
> > > *********************************************************************/
> > >
> > > @@ -1936,6 +2019,16 @@ int cpufreq_register_driver(struct
> > > cpufreq_driver *driver_data) cpufreq_driver = driver_data;
> > >   	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> > >
> > > +	if (!cpufreq_driver->boost_supported)
> > > +		boost.attr.mode = 0444;
> > > +
> > > +	ret = cpufreq_sysfs_create_file(&(boost.attr));
> > > +	if (ret) {
> > > +		pr_err("%s: cannot register global boost sysfs
> > > file\n",
> > > +		       __func__);
> > > +		goto err_null_driver;
> > > +	}
> > > +
> > 
> > I do not think the boost sysfs should be created at all if boost is
> > not supported.
> 
> This was my first thought. But unfortunately this "boost" attribute is
> always exported at acpi-cpufreq.c and in my opinion is part of a
> legacy API.
> 
> I totally agree with the idea of exporting boost only when supported,
> but I would like to know the community opinion about this (especially
> Viresh and Rafael shall speak up).

Simple: Export it only when supported.

Thanks,
Rafael


-- 
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 5/7] cpufreq: Calculate number of busy CPUs
  2013-06-19 20:58       ` Lukasz Majewski
@ 2013-06-19 22:26         ` Rafael J. Wysocki
  0 siblings, 0 replies; 329+ messages in thread
From: Rafael J. Wysocki @ 2013-06-19 22:26 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Dirk Brandewie, Lukasz Majewski, Viresh Kumar, cpufreq,
	Linux PM list, Vincent Guittot, Jonghwa Lee, Myungjoo Ham,
	linux-kernel, Andre Przywara, Daniel Lezcano, Kukjin Kim,
	Zhang Rui, Eduardo Valentin, l.majewski

On Wednesday, June 19, 2013 10:58:32 PM Lukasz Majewski wrote:
> On Wed, 19 Jun 2013 11:01:07 -0700
> Dirk Brandewie <dirk.brandewie@gmail.com> wrote:
> 
> > On 06/19/2013 10:12 AM, Lukasz Majewski wrote:
> > > In the core governor code, per cpu load value is calculated. This
> > > patch uses it to mark processor as a "busy" one, when load value is
> > > higher than 90%.
> > >
> > > New cpufreq sysfs attribute is created (busy_cpus). It is read only
> > > and provides information about number of actually busy CPU.
> > >
> > 
> > What is the intended use of this interface?
> 
> The kernel API would be handy with boost managed by software (like it is
> done with exynos) and with LAB governor.
> 
> The intention is to have two save valves for boost:
> 
> 1. Enable SW controlled boost only when we have just one busy CPU.
> 
> 2. Use the Thermal subsystem to switch off SW managed boost when it
> detects that SoC is overheating.
> 
> The problem with 2 is that, the boost code is compiled in to the cpufreq
> core (no CONFIG_BOOST flag). Thereof we cannot guarantee, that thermal
> would be always enabled (the KConfig select option). 
> I think that thermal subsystem is a suitable place to disable SW boost
> at emergency. However in my opinion this is not enough and precaution
> defined at 1 is needed. 
> 
> I can remove exporting the "busy_cpu" sysfs attribute if you think, that
> it would confuse userspace. Its purpose is mainly informational.
> 
> > 
> > For drivers that have internal governors it will be misleading/wrong
> 
> Would you be so kind and give me an example of such an internal
> governor?
> 
> Maybe I've overlooked some important information/usecase.

Please look at intel_pstate.c.

Thanks,
Rafael


-- 
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v3 1/3] cpufreq: Add boost frequency support in core
  2013-06-18 13:26                       ` Rafael J. Wysocki
  2013-06-18 13:44                         ` Lukasz Majewski
@ 2013-06-20  5:01                         ` Viresh Kumar
  2013-06-20 10:04                           ` Lukasz Majewski
  1 sibling, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-20  5:01 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Lukasz Majewski, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Amit Daniel Kachhap

On 18 June 2013 18:56, Rafael J. Wysocki <rjw@sisk.pl> wrote:
> On Tuesday, June 18, 2013 12:12:13 PM Viresh Kumar wrote:
>> On 17 June 2013 19:21, Lukasz Majewski <l.majewski@samsung.com> wrote:

>> According to my understanding, boost was important for power
>> saving. In case a high load can be managed by a single cpu with
>> boost freqs, then its better to use boost freqs rather than bringing
>> another cpu up.
>
> Do you mean the 'boost' sysfs attribute or the 'turbo frequencies' concept?

I thought they are the. Probably not, but I am not sure about the
difference.

>> Normally boost freqs are not so useful if we talk about powersaving,
>> as their energy consumption is much higher with not so great impact
>> on performance.
>
> Er, er, please be careful here.  The impact on performance may be sufficient
> for deep C-states to become relevant in some cases.

Hmm.

>> That's why when this thread started we talked about boost only when
>> one cpu is operational. But with your patch all cores can use boost
>> freq and thermal will come into picture just to save the chip.
>
> Well, that's why on x86 turbo is controlled by hardware that takes care of
> keeping things within the chip's thermal limits.

Yeah.

>> That's wrong. This isn't why we invented boost here. Otherwise you
>> just don't need boost feature at all for your SoC. Just make these
>> freqs as available freqs and let thermal control policy->max/min
>> to save your chip.
>
> The 'boost' attribute added by acpi-cpufreq means "let the hardware use turbo
> frequencies".
>
> I'd recommend you both to read Documentation/cpu-freq/boost.txt now. :-)

I did it now :)

> I think we can extend the meaning to "let turbo frequencies be used", but if
> we need software to play the role of the hardware's thermal control, we need
> to be very careful.

Exactly. There are two variants now:
- Hardware boost: x86: Don't do any trick in software to prevent hardware
from boosting... Let the hardware take control as it is today
- Software boost: The initial idea from Lukasz was about using boost only
when one cpu is used. That's the impression I had in mind. And it looked
sensible too to some extent. BUT there is a great chance that any mistake
can burn chips, so we need to be extremely careful.

>> What we probably need is:
>> - Enabled boost from sysfs if required (now below steps will come into
>>   picture)
>
> This has to be compatible with the existing stuff.

Sure.

>> - See how many cpus are running, if only one then start using boost freqs
>> - Now thermal should be come into picture to save chip in case a single
>> cpu running at boost can burn it out.
>
> I'd say there needs to be a separate controller/monitor for that that will
> know what the chip's thermal limit is and how that relates to how fast the
> CPU core(s) may run and for how much time.  I'm not sure it is sufficient
> to "wait for thermal to kick in" here, because you may need to slow down
> things in advance (i.e. before thermal sensors tell you there's too much heat,
> because that may be too late already).

That's why I wasn't sure about software boosting initially. But at the same
time a thermal sensor might be good enough. They just have to be programmed
accordingly, so that they fire a bit in advance before things are out of
control. :)

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v3 1/3] cpufreq: Add boost frequency support in core
  2013-06-18 13:44                         ` Lukasz Majewski
  2013-06-19  7:16                           ` Lukasz Majewski
@ 2013-06-20  5:05                           ` Viresh Kumar
  1 sibling, 0 replies; 329+ messages in thread
From: Viresh Kumar @ 2013-06-20  5:05 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Amit Daniel Kachhap

On 18 June 2013 19:14, Lukasz Majewski <l.majewski@samsung.com> wrote:
> On Tue, 18 Jun 2013 15:26:16 +0200, Rafael J. Wysocki wrote:
>> On Tuesday, June 18, 2013 12:12:13 PM Viresh Kumar wrote:
>> > On 17 June 2013 19:21, Lukasz Majewski <l.majewski@samsung.com>

>> Well, that's why on x86 turbo is controlled by hardware that takes
>> care of keeping things within the chip's thermal limits.
>
> And this is the reason why I don't want to overly change acpi-cpufreq.c
> code. :-)

We need to keep both hardware/software boost features at the same place
in core, they may behave differently though. That's why I wanted you
to do that.

> I think that thermal subsystem shall be the second option to disable SW
> boosting.
>
> The main control shall be done inside the cpufreq core. The idea to
> disable boost when more than one core is active is rational.

But then, it might not be enough. A single core can make your SoC
very hot.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v3 1/3] cpufreq: Add boost frequency support in core
  2013-06-19  7:16                           ` Lukasz Majewski
@ 2013-06-20  5:11                             ` Viresh Kumar
  2013-06-20  6:41                               ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-20  5:11 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Amit Daniel Kachhap

On 19 June 2013 12:46, Lukasz Majewski <l.majewski@samsung.com> wrote:
> I would like to clarify the above issue.
>
> When I've discussed with Viresh previous version of this patch, we have
> agreed, that "boost" sysfs attribute [*]:
> /sys/devices/system/cpu/cpufreq/boost
>
> would be only visible when boost_supported flag is set at cpufreq
> driver.

Yes.

> When acpi-cpufreq driver doesn't support boost, the attribute [*]
> won't be exported at all. This contradicts the documentation and legacy
> acpi-cpufreq behaviour.

No they aren't contradictory. What the documentation meant was:
acpi-cpufreq driver is used by lots of different x86 processors. Now
all processors might not support boost inside x86 also. And for them
we will keep 'boost' file readonly. This is done by following statement

	if (boot_cpu_has(X86_FEATURE_CPB) || boot_cpu_has(X86_FEATURE_IDA)) {
		boost_supported = true;
                ....
	} else
		global_boost.attr.mode = 0444;

Documentation file doesn't talk about any other cpufreq driver, for
them there is no concept like boost.

You need to preserve this functionality.

> Since I'm affraid to break API (with all its consequences :-) ), I would
> like to be sure that this is OK, and thereof I'm allowed to rewrite
> documentation accordingly.
>
> I simply need explicit permission from both maintainers :-).

For me its okay to rewrite documentation.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 2/7] cpufreq: Add boost frequency support in core
  2013-06-19 17:12   ` [PATCH v4 2/7] cpufreq: Add boost frequency support in core Lukasz Majewski
  2013-06-19 17:48     ` Dirk Brandewie
@ 2013-06-20  5:13     ` Viresh Kumar
  2013-06-20 20:03       ` Rafael J. Wysocki
  2013-06-26 10:54     ` Viresh Kumar
  2 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-20  5:13 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

On 19 June 2013 22:42, Lukasz Majewski <l.majewski@samsung.com> wrote:

> Boost sysfs attribute is always exported (to support legacy API). By
> default boost is exported as read only. One global attribute is available at:
> /sys/devices/system/cpu/cpufreq/boost.

You asked me and Rafael a question and posted your next version without
even waiting for our replies? That will waste your time and ours too
reviewing it.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v3 1/3] cpufreq: Add boost frequency support in core
  2013-06-20  5:11                             ` Viresh Kumar
@ 2013-06-20  6:41                               ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-20  6:41 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Amit Daniel Kachhap

On Thu, 20 Jun 2013 10:41:41 +0530, Viresh Kumar wrote:
> On 19 June 2013 12:46, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > I would like to clarify the above issue.
> >
> > When I've discussed with Viresh previous version of this patch, we
> > have agreed, that "boost" sysfs attribute [*]:
> > /sys/devices/system/cpu/cpufreq/boost
> >
> > would be only visible when boost_supported flag is set at cpufreq
> > driver.
> 
> Yes.
> 
> > When acpi-cpufreq driver doesn't support boost, the attribute [*]
> > won't be exported at all. This contradicts the documentation and
> > legacy acpi-cpufreq behaviour.
> 
> No they aren't contradictory. What the documentation meant was:
> acpi-cpufreq driver is used by lots of different x86 processors. Now
> all processors might not support boost inside x86 also. And for them
> we will keep 'boost' file readonly. This is done by following
> statement

Thanks for explanation.

> 
> 	if (boot_cpu_has(X86_FEATURE_CPB) ||
> boot_cpu_has(X86_FEATURE_IDA)) { boost_supported = true;
>                 ....
> 	} else
> 		global_boost.attr.mode = 0444;

Grrr.... So simple and obvious solution [1]. 

> 
> Documentation file doesn't talk about any other cpufreq driver, for
> them there is no concept like boost.
> 
> You need to preserve this functionality.

Yes the idea [1], solves problem with legacy API.

> 
> > Since I'm affraid to break API (with all its consequences :-) ), I
> > would like to be sure that this is OK, and thereof I'm allowed to
> > rewrite documentation accordingly.
> >
> > I simply need explicit permission from both maintainers :-).
> 
> For me its okay to rewrite documentation.

I will extent documentation about the SW managed boost.

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v3 1/3] cpufreq: Add boost frequency support in core
  2013-06-20  5:01                         ` Viresh Kumar
@ 2013-06-20 10:04                           ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-20 10:04 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki
  Cc: cpufreq, Linux PM list, Vincent Guittot, Jonghwa Lee,
	Myungjoo Ham, linux-kernel, Lukasz Majewski, Andre Przywara,
	Daniel Lezcano, Kukjin Kim, Amit Daniel Kachhap

On Thu, 20 Jun 2013 10:31:30 +0530, Viresh Kumar wrote:
> > I'd say there needs to be a separate controller/monitor for that
> > that will know what the chip's thermal limit is and how that
> > relates to how fast the CPU core(s) may run and for how much time.
> > I'm not sure it is sufficient to "wait for thermal to kick in"
> > here, because you may need to slow down things in advance (i.e.
> > before thermal sensors tell you there's too much heat, because that
> > may be too late already).  
> 
> That's why I wasn't sure about software boosting initially. But at
> the same time a thermal sensor might be good enough. They just have
> to be programmed accordingly, so that they fire a bit in advance
> before things are out of control. :)

I think that thermal subsystem shall disable boost when SoC is heated
up.

The problem is to guarantee, that thermal will be always enabled and
correctly configured when software based boost is ready to run.


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 2/7] cpufreq: Add boost frequency support in core
  2013-06-20  5:13     ` Viresh Kumar
@ 2013-06-20 20:03       ` Rafael J. Wysocki
  2013-06-21  6:23         ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Rafael J. Wysocki @ 2013-06-20 20:03 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Lukasz Majewski, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

On Thursday, June 20, 2013 10:43:08 AM Viresh Kumar wrote:
> On 19 June 2013 22:42, Lukasz Majewski <l.majewski@samsung.com> wrote:
> 
> > Boost sysfs attribute is always exported (to support legacy API). By
> > default boost is exported as read only. One global attribute is available at:
> > /sys/devices/system/cpu/cpufreq/boost.
> 
> You asked me and Rafael a question and posted your next version without
> even waiting for our replies? That will waste your time and ours too
> reviewing it.

I believe I replied to that (in a different branch of the thread).

And the reply was: Do not expose if not supported.

Thanks,
Rafael


-- 
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 2/7] cpufreq: Add boost frequency support in core
  2013-06-20 20:03       ` Rafael J. Wysocki
@ 2013-06-21  6:23         ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-21  6:23 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Viresh Kumar, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

On Thu, 20 Jun 2013 22:03:45 +0200, Rafael J. Wysocki wrote:

Hi Rafael,

> On Thursday, June 20, 2013 10:43:08 AM Viresh Kumar wrote:
> > On 19 June 2013 22:42, Lukasz Majewski <l.majewski@samsung.com>
> > wrote:
> > 
> > > Boost sysfs attribute is always exported (to support legacy API).
> > > By default boost is exported as read only. One global attribute
> > > is available at: /sys/devices/system/cpu/cpufreq/boost.
> > 
> > You asked me and Rafael a question and posted your next version
> > without even waiting for our replies? That will waste your time and
> > ours too reviewing it.
> 
> I believe I replied to that (in a different branch of the thread).
> 
> And the reply was: Do not expose if not supported.

Thanks for reply. Understood :-)

> 
> Thanks,
> Rafael
> 
> 



-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 0/7] cpufreq:boost: CPU Boost mode support
  2013-06-19 17:12 ` [PATCH v4 0/7] " Lukasz Majewski
                     ` (6 preceding siblings ...)
  2013-06-19 17:12   ` [PATCH v4 7/7] thermal:boost: Disable boost when trip point is reached Lukasz Majewski
@ 2013-06-26  7:48   ` Lukasz Majewski
  2013-06-26  7:52     ` Viresh Kumar
  7 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-26  7:48 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Lukasz Majewski, Rafael J. Wysocky, cpufreq, Linux PM list,
	Vincent Guittot, Jonghwa Lee, Myungjoo Ham, linux-kernel,
	Lukasz Majewski, Andre Przywara, Daniel Lezcano, Kukjin Kim,
	Zhang Rui, Eduardo Valentin

Hi Viresh,

> This patch series introduces support for CPU overclocking technique
> called Boost.
> 
> It is a follow up of a LAB governor proposal. Boost is a LAB
> component:
> http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq
> 
> Boost unifies hardware based solution (e.g. Intel Nehalem) with
> software oriented one (like the one done at Exynos).
> For this reason cpufreq/freq_table code has been reorganized to
> include common code.
> 
> Important design decisions:
> 
> - Boost related code is compiled-in unconditionally and disabled by
> default The cpufreq_driver is responsibile for setting
> boost_supported flag and providing enable_boost callback(if HW
> support is needed)
> 
> - struct cpufreq_driver has been extended with boost related fields:
>         -- boost_supported - when driver supports boosting
>         -- enable_boost - callback to function, which is necessary to
>            enable boost in the processor (like it is done at Intel)
> 
> - Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost) is
> always provided.
> It will be read only, until either cpufreq_driver defines
> boost_supported flag or device tree's cpufreq "boost_mode" attribute
> is defined. It is consistent with legacy acpi API.
> 
> - No special spin_lock for Boost was created. The one from cpufreq
> core was reused.
> 
> - All available policies are now stored in a list.
> 
> - The Boost code doesn't rely on any policy. When boost state is
> changed, then the policy list is iterated and proper adjustements are
> done.
> 
> - Number of busy cpus (with load > 90%) is calculated and exported as
> a global sysfs attribute.
> 
> - The SW based boost can be only enabled when up to one core is
> regarded as a "busy" one. For safety reasons boost is disabled when
> more cores comes into play.
> 
> - To improve safety level, the thermal framework is also extended to
> disable software boosting, when thermal trip point is reached.
> 
> New patches for v4:
> cpufreq: Store cpufreq policies in a list
> cpufreq: Calculate number of busy CPUs
> cpufreq: Enable software boost only when up to one busy core is
> running thermal:boost: Disable boost when trip point is reached
> 
> Tested at: HW:
>         Exynos 4412 3.10 linux
>         Exynos 4210 3.10 linux
> Compile tested x86_64 defconfig (acpi) - help with HW (Intel Nehalem)
> test needed
> 

If this is not a problem, I'd like to kindly ask You to review those
patches.

Rafael has expressed his opinion about "boost" attribute clearly at the
other mail (as a response to v4 patches):
"Simple: Export it only when supported."

Despite the change about the "boost" attribute visibility there were
many other changes, which deserve maintainer's look.



> 
> Lukasz Majewski (7):
>   cpufreq: Store cpufreq policies in a list
>   cpufreq: Add boost frequency support in core
>   cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common
>     boost solution
>   cpufreq:exynos:Extend Exynos cpufreq driver to support boost
>     framework
>   cpufreq: Calculate number of busy CPUs
>   cpufreq: Enable software boost only when up to one busy core is
>     running
>   thermal:boost: Disable boost when trip point is reached
> 
>  drivers/cpufreq/acpi-cpufreq.c     |   61 ++++++-----------
>  drivers/cpufreq/cpufreq.c          |  132
> ++++++++++++++++++++++++++++++++++++
> drivers/cpufreq/cpufreq_governor.c |    4 ++
> drivers/cpufreq/exynos-cpufreq.c   |    4 ++
> drivers/cpufreq/freq_table.c       |   43 ++++++++++--
> drivers/thermal/cpu_cooling.c      |    3 +
> include/linux/cpufreq.h            |   15 ++++ 7 files changed, 215
> insertions(+), 47 deletions(-)
> 



-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 0/7] cpufreq:boost: CPU Boost mode support
  2013-06-26  7:48   ` [PATCH v4 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
@ 2013-06-26  7:52     ` Viresh Kumar
  0 siblings, 0 replies; 329+ messages in thread
From: Viresh Kumar @ 2013-06-26  7:52 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

On Wed, Jun 26, 2013 at 1:18 PM, Lukasz Majewski <l.majewski@samsung.com> wrote:
> If this is not a problem, I'd like to kindly ask You to review those
> patches.
>
> Rafael has expressed his opinion about "boost" attribute clearly at the
> other mail (as a response to v4 patches):
> "Simple: Export it only when supported."
>
> Despite the change about the "boost" attribute visibility there were
> many other changes, which deserve maintainer's look.

I haven't got time to review it until now.. I will try to do it this week.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 1/7] cpufreq: Store cpufreq policies in a list
  2013-06-19 17:12   ` [PATCH v4 1/7] cpufreq: Store cpufreq policies in a list Lukasz Majewski
@ 2013-06-26 10:35     ` Viresh Kumar
  2013-06-26 10:54       ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-26 10:35 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

On 19 June 2013 22:42, Lukasz Majewski <l.majewski@samsung.com> wrote:
> Policies available in a cpufreq framework are now linked together. They are
> accessible via cpufreq_policy_list defined at cpufreq core.
>
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
>
> Changes for v4:
> - New patch

You need to write changelog after ---, so that it doesn't get commited.

> ---
>  drivers/cpufreq/cpufreq.c |    3 +++
>  include/linux/cpufreq.h   |    1 +
>  2 files changed, 4 insertions(+)
>
> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> index 2ce86ed..665e641 100644
> --- a/drivers/cpufreq/cpufreq.c
> +++ b/drivers/cpufreq/cpufreq.c
> @@ -46,6 +46,7 @@ static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data);
>  static DEFINE_PER_CPU(char[CPUFREQ_NAME_LEN], cpufreq_cpu_governor);
>  #endif
>  static DEFINE_RWLOCK(cpufreq_driver_lock);
> +static LIST_HEAD(cpufreq_policy_list);
>
>  /*
>   * cpu_policy_rwsem is a per CPU reader-writer semaphore designed to cure
> @@ -989,6 +990,7 @@ static int cpufreq_add_dev(struct device *dev, struct subsys_interface *sif)
>         }
>  #endif
>
> +       list_add(&policy->policy_list, &cpufreq_policy_list);
>         ret = cpufreq_add_dev_interface(cpu, policy, dev);
>         if (ret)
>                 goto err_out_unregister;

what about handling error cases?

> @@ -1992,6 +1994,7 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
>         subsys_interface_unregister(&cpufreq_interface);
>         unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
>
> +       list_del(&cpufreq_policy_list);
>         write_lock_irqsave(&cpufreq_driver_lock, flags);
>         cpufreq_driver = NULL;
>         write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
> index ab1932c..5348981 100644
> --- a/include/linux/cpufreq.h
> +++ b/include/linux/cpufreq.h
> @@ -117,6 +117,7 @@ struct cpufreq_policy {
>
>         struct cpufreq_real_policy      user_policy;
>
> +       struct list_head        policy_list;
>         struct kobject          kobj;
>         struct completion       kobj_unregister;

--
viresh

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 1/7] cpufreq: Store cpufreq policies in a list
  2013-06-26 10:35     ` Viresh Kumar
@ 2013-06-26 10:54       ` Lukasz Majewski
  2013-06-26 10:56         ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-26 10:54 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin, t.figa

On 26 Jun 2013 16:05:12,Viresh Kumar <viresh.kumar@linaro.org> wrote:
> On 19 June 2013 22:42, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > Policies available in a cpufreq framework are now linked together.
> > They are accessible via cpufreq_policy_list defined at cpufreq core.
> >
> > Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> > Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> >
> > Changes for v4:
> > - New patch
> 
> You need to write changelog after ---, so that it doesn't get
> commited.
> 
> > ---

So here <---> I will put change log for v5.


> >  drivers/cpufreq/cpufreq.c |    3 +++
> >  include/linux/cpufreq.h   |    1 +
> >  2 files changed, 4 insertions(+)
> >
> > diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> > index 2ce86ed..665e641 100644
> > --- a/drivers/cpufreq/cpufreq.c
> > +++ b/drivers/cpufreq/cpufreq.c
> > @@ -46,6 +46,7 @@ static DEFINE_PER_CPU(struct cpufreq_policy *,
> > cpufreq_cpu_data); static DEFINE_PER_CPU(char[CPUFREQ_NAME_LEN],
> > cpufreq_cpu_governor); #endif
> >  static DEFINE_RWLOCK(cpufreq_driver_lock);
> > +static LIST_HEAD(cpufreq_policy_list);
> >
> >  /*
> >   * cpu_policy_rwsem is a per CPU reader-writer semaphore designed
> > to cure @@ -989,6 +990,7 @@ static int cpufreq_add_dev(struct
> > device *dev, struct subsys_interface *sif) }
> >  #endif
> >
> > +       list_add(&policy->policy_list, &cpufreq_policy_list);
> >         ret = cpufreq_add_dev_interface(cpu, policy, dev);
> >         if (ret)

I will add list_del(&cpufreq_policy_list);
here.

> >                 goto err_out_unregister;
> 
> what about handling error cases?

Thanks for spotting.

> 
> > @@ -1992,6 +1994,7 @@ int cpufreq_unregister_driver(struct
> > cpufreq_driver *driver)
> > subsys_interface_unregister(&cpufreq_interface);
> > unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
> >
> > +       list_del(&cpufreq_policy_list);
> >         write_lock_irqsave(&cpufreq_driver_lock, flags);
> >         cpufreq_driver = NULL;
> >         write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> > diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
> > index ab1932c..5348981 100644
> > --- a/include/linux/cpufreq.h
> > +++ b/include/linux/cpufreq.h
> > @@ -117,6 +117,7 @@ struct cpufreq_policy {
> >
> >         struct cpufreq_real_policy      user_policy;
> >
> > +       struct list_head        policy_list;
> >         struct kobject          kobj;
> >         struct completion       kobj_unregister;
> 
> --
> viresh



-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 2/7] cpufreq: Add boost frequency support in core
  2013-06-19 17:12   ` [PATCH v4 2/7] cpufreq: Add boost frequency support in core Lukasz Majewski
  2013-06-19 17:48     ` Dirk Brandewie
  2013-06-20  5:13     ` Viresh Kumar
@ 2013-06-26 10:54     ` Viresh Kumar
  2013-06-26 12:54       ` Lukasz Majewski
  2013-06-27 15:55       ` Lukasz Majewski
  2 siblings, 2 replies; 329+ messages in thread
From: Viresh Kumar @ 2013-06-26 10:54 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

On 19 June 2013 22:42, Lukasz Majewski <l.majewski@samsung.com> wrote:
> Boost sysfs attribute is always exported (to support legacy API). By
> default boost is exported as read only. One global attribute is available at:
> /sys/devices/system/cpu/cpufreq/boost.

I assume you are going to fix this as discussed in other threads.

> Changes for v4:
> - Remove boost parameter from cpufreq_frequency_table_cpuinfo() function
> - Introduce cpufreq_boost_supported() method
> - Use of cpufreq_boost_supported() and cpufreq_boost_enabled() to decide
>   if frequency shall be skipped
> - Rename set_boost_freq() to enable_boost()
> - cpufreq_attr_available_freq() moved to freq_table.c
> - Use policy list to get access to cpufreq policies
> - Rename global boost flag (cpufreq_boost_enabled -> boost_enabled)
> - pr_err corrected ( %sable)
> - Remove sanity check at cpufreq_boost_trigger_state() entrance [to test if
>   boost is supported]
> - Use either HW (boost_enable) callback or SW managed boost
> - Introduce new cpufreq_boost_trigger_state_sw() method to handle boost
>   at SW.
> - Protect boost_enabled manipulation with lock
> - Always export boost attribute (preserve legacy behaviour). When boost
>   is not supported this attribute is read only

Very well written changelog. But write it after ---

> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> index 665e641..9141d33 100644
> --- a/drivers/cpufreq/cpufreq.c
> +++ b/drivers/cpufreq/cpufreq.c
> @@ -40,6 +40,7 @@
>   * also protects the cpufreq_cpu_data array.
>   */
>  static struct cpufreq_driver *cpufreq_driver;
> +static bool boost_enabled;
>  static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data);
>  #ifdef CONFIG_HOTPLUG_CPU
>  /* This one keeps track of the previously set governor of a removed CPU */
> @@ -316,6 +317,29 @@ EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
>  /*********************************************************************
>   *                          SYSFS INTERFACE                          *
>   *********************************************************************/
> +ssize_t show_boost(struct kobject *kobj,
> +                                struct attribute *attr, char *buf)
> +{
> +       return sprintf(buf, "%d\n", boost_enabled);
> +}
> +
> +static ssize_t store_boost(struct kobject *kobj, struct attribute *attr,
> +                                 const char *buf, size_t count)
> +{
> +       int ret, enable;
> +
> +       ret = sscanf(buf, "%d", &enable);
> +       if (ret != 1 || enable < 0 || enable > 1)
> +               return -EINVAL;
> +
> +       if (cpufreq_boost_trigger_state(enable)) {
> +               pr_err("%s: Cannot enable boost!\n", __func__);
> +               return -EINVAL;
> +       }

Probably do boost_enabled = true here.

> +       return count;
> +}
> +define_one_global_rw(boost);

>  /*********************************************************************
> + *               BOOST                                              *
> + *********************************************************************/
> +static int cpufreq_boost_trigger_state_sw(void)
> +{
> +       struct cpufreq_frequency_table *freq_table;
> +       struct cpufreq_policy *policy;
> +       int ret = -EINVAL;
> +
> +       list_for_each_entry(policy, &cpufreq_policy_list, policy_list) {
> +               freq_table = cpufreq_frequency_get_table(policy->cpu);
> +               if (freq_table)
> +                       ret = cpufreq_frequency_table_cpuinfo(policy,
> +                                                       freq_table);
> +       }
> +
> +       return ret;
> +
> +}

add blank line here.

> +int cpufreq_boost_trigger_state(int state)
> +{
> +       unsigned long flags;
> +       int ret = 0;
> +
> +       if (boost_enabled != state) {
> +               write_lock_irqsave(&cpufreq_driver_lock, flags);
> +               boost_enabled = state;
> +               if (cpufreq_driver->enable_boost)
> +                       ret = cpufreq_driver->enable_boost(state);
> +               else
> +                       ret = cpufreq_boost_trigger_state_sw();
> +
> +               if (ret) {
> +                       boost_enabled = 0;
> +                       write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> +                       pr_err("%s: BOOST cannot enable (%d)\n",
> +                              __func__, ret);
> +
> +                       return ret;
> +               }
> +               write_unlock_irqrestore(&cpufreq_driver_lock, flags);

You can rewrite if (ret) and unlock() code to make it less redundant.
unlock and return ret at the end and write other stuff before it.

> +               pr_debug("%s: cpufreq BOOST %s\n", __func__,
> +                        state ? "enabled" : "disabled");
> +       }
> +
> +       return 0;
> +}
> +
> +int cpufreq_boost_supported(void)
> +{
> +       return cpufreq_driver->boost_supported;
> +}
> +
> +int cpufreq_boost_enabled(void)
> +{
> +       return boost_enabled;
> +}

EXPORT_SYMBOL_GPL ??

> +/*********************************************************************
>   *               REGISTER / UNREGISTER CPUFREQ DRIVER                *
>   *********************************************************************/
>
> @@ -1936,6 +2019,16 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
>         cpufreq_driver = driver_data;
>         write_unlock_irqrestore(&cpufreq_driver_lock, flags);
>
> +       if (!cpufreq_driver->boost_supported)
> +               boost.attr.mode = 0444;
> +
> +       ret = cpufreq_sysfs_create_file(&(boost.attr));
> +       if (ret) {
> +               pr_err("%s: cannot register global boost sysfs file\n",
> +                      __func__);
> +               goto err_null_driver;
> +       }

This would change.

>         ret = subsys_interface_register(&cpufreq_interface);
>         if (ret)
>                 goto err_null_driver;
> @@ -1992,6 +2085,8 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
>         pr_debug("unregistering driver %s\n", driver->name);
>
>         subsys_interface_unregister(&cpufreq_interface);
> +
> +       cpufreq_sysfs_remove_file(&(boost.attr));
>         unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
>
>         list_del(&cpufreq_policy_list);
> diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c
> index d7a7966..9c8e71e 100644
> --- a/drivers/cpufreq/freq_table.c
> +++ b/drivers/cpufreq/freq_table.c
> @@ -34,6 +34,11 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
>
>                         continue;
>                 }
> +               if (cpufreq_boost_supported())

Probably remove this check. Assume somebody while testing exynos,
just sent boost_supported as false. Then you will not skip this frequency
and may burn your chip :)

> +                       if (!cpufreq_boost_enabled()
> +                           && table[i].index == CPUFREQ_BOOST_FREQ)
> +                               continue;

This should be enough.

>                 pr_debug("table entry %u: %u kHz, %u index\n",
>                                         i, freq, table[i].index);
>                 if (freq < min_freq)
> @@ -171,7 +176,8 @@ static DEFINE_PER_CPU(struct cpufreq_frequency_table *, cpufreq_show_table);
>  /**
>   * show_available_freqs - show available frequencies for the specified CPU
>   */
> -static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
> +static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf,
> +                                   int show_boost)
>  {
>         unsigned int i = 0;
>         unsigned int cpu = policy->cpu;
> @@ -186,6 +192,9 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
>         for (i = 0; (table[i].frequency != CPUFREQ_TABLE_END); i++) {
>                 if (table[i].frequency == CPUFREQ_ENTRY_INVALID)
>                         continue;

Add a comment here describing your complex logic.

> +               if (show_boost ^ (table[i].index == CPUFREQ_BOOST_FREQ))
> +                       continue;
> +
>                 count += sprintf(&buf[count], "%d ", table[i].frequency);
>         }
>         count += sprintf(&buf[count], "\n");
> @@ -194,14 +203,34 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
>
>  }
>
> -struct freq_attr cpufreq_freq_attr_scaling_available_freqs = {
> -       .attr = { .name = "scaling_available_frequencies",
> -                 .mode = 0444,
> -               },
> -       .show = show_available_freqs,
> -};
> +#define cpufreq_attr_available_freq(_name)       \
> +struct freq_attr cpufreq_freq_attr_##_name##_freqs =     \
> +__ATTR_RO(_name##_frequencies)
> +
> +/**
> + * show_scaling_available_frequencies - show normal boost frequencies for

You missed this comment earlier. boost??

> + * the specified CPU
> + */
> +static ssize_t scaling_available_frequencies_show(struct cpufreq_policy *policy,
> +                                                 char *buf)
> +{
> +       return show_available_freqs(policy, buf, 0);
> +}
> +cpufreq_attr_available_freq(scaling_available);
>  EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_available_freqs);
>
> +/**
> + * show_available_boost_freqs - show available boost frequencies for
> + * the specified CPU
> + */
> +static ssize_t scaling_boost_frequencies_show(struct cpufreq_policy *policy,
> +                                             char *buf)
> +{
> +       return show_available_freqs(policy, buf, 1);
> +}
> +cpufreq_attr_available_freq(scaling_boost);
> +EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_boost_freqs);
> +
>  /*
>   * if you use these, you must assure that the frequency table is valid
>   * all the time between get_attr and put_attr!
> diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
> index 5348981..4783c4c 100644
> --- a/include/linux/cpufreq.h
> +++ b/include/linux/cpufreq.h
> @@ -267,6 +267,10 @@ struct cpufreq_driver {
>         int     (*suspend)      (struct cpufreq_policy *policy);
>         int     (*resume)       (struct cpufreq_policy *policy);
>         struct freq_attr        **attr;
> +
> +       /* platform specific boost support code */
> +       bool                    boost_supported;
> +       int (*enable_boost)    (int state);
>  };
>
>  /* flags */
> @@ -408,6 +412,9 @@ extern struct cpufreq_governor cpufreq_gov_conservative;
>  #define CPUFREQ_ENTRY_INVALID ~0
>  #define CPUFREQ_TABLE_END     ~1
>
> +/* Define index for boost frequency */
> +#define CPUFREQ_BOOST_FREQ    ~2
> +
>  struct cpufreq_frequency_table {
>         unsigned int    index;     /* any */
>         unsigned int    frequency; /* kHz - doesn't need to be in ascending
> @@ -426,11 +433,15 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
>                                    unsigned int relation,
>                                    unsigned int *index);
>
> +int cpufreq_boost_trigger_state(int state);

Why is this present here?

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 1/7] cpufreq: Store cpufreq policies in a list
  2013-06-26 10:54       ` Lukasz Majewski
@ 2013-06-26 10:56         ` Viresh Kumar
  2013-06-26 11:04           ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-26 10:56 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin, t.figa

On 26 June 2013 16:24, Lukasz Majewski <l.majewski@samsung.com> wrote:
>> > ---
>
> So here <---> I will put change log for v5.

correct.

>> >         ret = cpufreq_add_dev_interface(cpu, policy, dev);
>> >         if (ret)
>
> I will add list_del(&cpufreq_policy_list);
> here.

May not be sufficient. You must do it once at the end of this routine.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 3/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution
  2013-06-19 17:12   ` [PATCH v4 3/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
@ 2013-06-26 11:03     ` Viresh Kumar
  2013-06-26 12:17       ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-26 11:03 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

On 19 June 2013 22:42, Lukasz Majewski <l.majewski@samsung.com> wrote:
> diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c

>  static unsigned int acpi_pstate_strict;
> -static bool boost_enabled, boost_supported;
> +static bool boost_enabled;

Instead of this variable use cpufreq_boost_enabled() directly.

And then this patch may change as well..

I couldn't find any more issues with this patch but some Intel guy must
review it.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 1/7] cpufreq: Store cpufreq policies in a list
  2013-06-26 10:56         ` Viresh Kumar
@ 2013-06-26 11:04           ` Lukasz Majewski
  2013-06-26 11:08             ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-26 11:04 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin, t.figa

On Wed, 26 Jun 2013 16:26:30 +0530, Viresh Kumar wrote:
> On 26 June 2013 16:24, Lukasz Majewski <l.majewski@samsung.com> wrote:
> >> > ---
> >
> > So here <---> I will put change log for v5.
> 
> correct.

OK.

> 
> >> >         ret = cpufreq_add_dev_interface(cpu, policy, dev);
> >> >         if (ret)
> >
> > I will add list_del(&cpufreq_policy_list);
> > here.
> 
> May not be sufficient. You must do it once at the end of this routine.

Then I will add this code below:

err_out_kobj_put:
	list_del(&cpufreq_policy_list);
	[rest of error path]

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v2 3/3] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework
  2013-06-11  9:03   ` [PATCH v2 3/3] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
@ 2013-06-26 11:05     ` Viresh Kumar
  2013-06-26 13:58       ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-26 11:05 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

On 11 June 2013 14:33, Lukasz Majewski <l.majewski@samsung.com> wrote:
> The struct cpufreq_driver has been extended to embrace the information
> related to boost support.
>
> When "boost_mode" device tree attribute is defined for a platform, the
> low_level_boost pointer is filled with proper address. The
> .low_level_boost field filled to NULL, indicates that boost is not
> supported.

This patch is still few generations back :)

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 1/7] cpufreq: Store cpufreq policies in a list
  2013-06-26 11:04           ` Lukasz Majewski
@ 2013-06-26 11:08             ` Viresh Kumar
  2013-06-26 12:15               ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-26 11:08 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin, t.figa

On 26 June 2013 16:34, Lukasz Majewski <l.majewski@samsung.com> wrote:
> err_out_kobj_put:
>         list_del(&cpufreq_policy_list);
>         [rest of error path]

I couldn't find err_out_kobj_put in existing code :)

BTW, just add to the list only once everything passed.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 1/7] cpufreq: Store cpufreq policies in a list
  2013-06-26 11:08             ` Viresh Kumar
@ 2013-06-26 12:15               ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-26 12:15 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin, t.figa

On Wed, 26 Jun 2013 16:38:15 +0530, Viresh Kumar wrote:

> On 26 June 2013 16:34, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > err_out_kobj_put:
> >         list_del(&cpufreq_policy_list);
> >         [rest of error path]
> 
> I couldn't find err_out_kobj_put in existing code :)
> 
> BTW, just add to the list only once everything passed.

Ok, we can do it like that :-)

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 3/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution
  2013-06-26 11:03     ` Viresh Kumar
@ 2013-06-26 12:17       ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-26 12:17 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

On Wed, 26 Jun 2013 16:33:30 +0530, Viresh Kumar wrote:
> On 19 June 2013 22:42, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > diff --git a/drivers/cpufreq/acpi-cpufreq.c
> > b/drivers/cpufreq/acpi-cpufreq.c
> 
> >  static unsigned int acpi_pstate_strict;
> > -static bool boost_enabled, boost_supported;
> > +static bool boost_enabled;
> 
> Instead of this variable use cpufreq_boost_enabled() directly.

OK.

> 
> And then this patch may change as well..
> 
> I couldn't find any more issues with this patch but some Intel guy
> must review it.

Yes, indeed Intel review is welcome.
-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 2/7] cpufreq: Add boost frequency support in core
  2013-06-26 10:54     ` Viresh Kumar
@ 2013-06-26 12:54       ` Lukasz Majewski
  2013-06-26 14:02         ` Lukasz Majewski
  2013-06-27  9:02         ` Viresh Kumar
  2013-06-27 15:55       ` Lukasz Majewski
  1 sibling, 2 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-26 12:54 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin, t.figa

On Wed, 26 Jun 2013 16:24:32 +0530, Viresh Kumar wrote:
> On 19 June 2013 22:42, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > Boost sysfs attribute is always exported (to support legacy API). By
> > default boost is exported as read only. One global attribute is
> > available at: /sys/devices/system/cpu/cpufreq/boost.
> 
> I assume you are going to fix this as discussed in other threads.
Yes. Boost attribute will be visible only when boost is supported.

> 
> > Changes for v4:
> > - Remove boost parameter from cpufreq_frequency_table_cpuinfo()
> > function
> > - Introduce cpufreq_boost_supported() method
> > - Use of cpufreq_boost_supported() and cpufreq_boost_enabled() to
> > decide if frequency shall be skipped
> > - Rename set_boost_freq() to enable_boost()
> > - cpufreq_attr_available_freq() moved to freq_table.c
> > - Use policy list to get access to cpufreq policies
> > - Rename global boost flag (cpufreq_boost_enabled -> boost_enabled)
> > - pr_err corrected ( %sable)
> > - Remove sanity check at cpufreq_boost_trigger_state() entrance [to
> > test if boost is supported]
> > - Use either HW (boost_enable) callback or SW managed boost
> > - Introduce new cpufreq_boost_trigger_state_sw() method to handle
> > boost at SW.
> > - Protect boost_enabled manipulation with lock
> > - Always export boost attribute (preserve legacy behaviour). When
> > boost is not supported this attribute is read only
> 
> Very well written changelog. But write it after ---

I will stick to the rule proposed at patch 1/4, ver 4.

> 
> > diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> > index 665e641..9141d33 100644
> > --- a/drivers/cpufreq/cpufreq.c
> > +++ b/drivers/cpufreq/cpufreq.c
> > @@ -40,6 +40,7 @@
> >   * also protects the cpufreq_cpu_data array.
> >   */
> >  static struct cpufreq_driver *cpufreq_driver;
> > +static bool boost_enabled;
> >  static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data);
> >  #ifdef CONFIG_HOTPLUG_CPU
> >  /* This one keeps track of the previously set governor of a
> > removed CPU */ @@ -316,6 +317,29 @@
> > EXPORT_SYMBOL_GPL(cpufreq_notify_transition); /*********************************************************************
> >   *                          SYSFS
> > INTERFACE                          *
> > *********************************************************************/
> > +ssize_t show_boost(struct kobject *kobj,
> > +                                struct attribute *attr, char *buf)
> > +{
> > +       return sprintf(buf, "%d\n", boost_enabled);
> > +}
> > +
> > +static ssize_t store_boost(struct kobject *kobj, struct attribute
> > *attr,
> > +                                 const char *buf, size_t count)
> > +{
> > +       int ret, enable;
> > +
> > +       ret = sscanf(buf, "%d", &enable);
> > +       if (ret != 1 || enable < 0 || enable > 1)
> > +               return -EINVAL;
> > +
> > +       if (cpufreq_boost_trigger_state(enable)) {
> > +               pr_err("%s: Cannot enable boost!\n", __func__);
> > +               return -EINVAL;
> > +       }
> 
> Probably do boost_enabled = true here.

I would prefer to set boot_enabled at
cpufreq_boost_trigger_state() method. It is closer to the 
cpufreq_driver->enable_boost and cpufreq_boost_trigger_state_sw();
functions, which do change the freq.

> 
> > +       return count;
> > +}
> > +define_one_global_rw(boost);
> 
> >  /*********************************************************************
> > + *
> > BOOST                                              *
> > +
> > *********************************************************************/
> > +static int cpufreq_boost_trigger_state_sw(void) +{
> > +       struct cpufreq_frequency_table *freq_table;
> > +       struct cpufreq_policy *policy;
> > +       int ret = -EINVAL;
> > +
> > +       list_for_each_entry(policy, &cpufreq_policy_list,
> > policy_list) {
> > +               freq_table =
> > cpufreq_frequency_get_table(policy->cpu);
> > +               if (freq_table)
> > +                       ret =
> > cpufreq_frequency_table_cpuinfo(policy,
> > +                                                       freq_table);
> > +       }
> > +
> > +       return ret;
> > +
> > +}
> 
> add blank line here.

OK.

> 
> > +int cpufreq_boost_trigger_state(int state)
> > +{
> > +       unsigned long flags;
> > +       int ret = 0;
> > +
> > +       if (boost_enabled != state) {
> > +               write_lock_irqsave(&cpufreq_driver_lock, flags);
> > +               boost_enabled = state;
> > +               if (cpufreq_driver->enable_boost)
> > +                       ret = cpufreq_driver->enable_boost(state);
						  ^^^^^^^^^^^^^
					I would prefer to change this
					name to enable_boost_hw
It is more informative, since it is tailored to hw based boost (Intel).

> > +               else
> > +                       ret = cpufreq_boost_trigger_state_sw();
> > +
> > +               if (ret) {
> > +                       boost_enabled = 0;
> > +
> > write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> > +                       pr_err("%s: BOOST cannot enable (%d)\n",
> > +                              __func__, ret);
> > +
> > +                       return ret;
> > +               }
> > +               write_unlock_irqrestore(&cpufreq_driver_lock,
> > flags);
> 
> You can rewrite if (ret) and unlock() code to make it less redundant.
> unlock and return ret at the end and write other stuff before it.

I will rewrite it as follow:

if (ret)
	boost_enabled = 0;
		
write_unlock_irqrestore(&cpufreq_driver_lock, flags);
pr_debug("%s: cpufreq BOOST %s\n", __func__,
		 state ? "enabled" : "disabled");

return ret;

> 
> > +               pr_debug("%s: cpufreq BOOST %s\n", __func__,
> > +                        state ? "enabled" : "disabled");
> > +       }
> > +
> > +       return 0;
> > +}
> > +
> > +int cpufreq_boost_supported(void)
> > +{
> > +       return cpufreq_driver->boost_supported;
> > +}
> > +
> > +int cpufreq_boost_enabled(void)
> > +{
> > +       return boost_enabled;
> > +}
> 
> EXPORT_SYMBOL_GPL ??

I will export cpufreq_boost_enabled() and cpufreq_boost_supported()

> 
> > +/*********************************************************************
> >   *               REGISTER / UNREGISTER CPUFREQ
> > DRIVER                *
> > *********************************************************************/
> >
> > @@ -1936,6 +2019,16 @@ int cpufreq_register_driver(struct
> > cpufreq_driver *driver_data) cpufreq_driver = driver_data;
> >         write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> >
> > +       if (!cpufreq_driver->boost_supported)
> > +               boost.attr.mode = 0444;
            Will be removed ^^^^^^^^^^^^^^^
> > +
> > +       ret = cpufreq_sysfs_create_file(&(boost.attr));
> > +       if (ret) {
> > +               pr_err("%s: cannot register global boost sysfs
> > file\n",
> > +                      __func__);
> > +               goto err_null_driver;
> > +       }
> 
> This would change.

This will be only exported when cpufreq_boost_supported() is true.

> 
> >         ret = subsys_interface_register(&cpufreq_interface);
> >         if (ret)
> >                 goto err_null_driver;
> > @@ -1992,6 +2085,8 @@ int cpufreq_unregister_driver(struct
> > cpufreq_driver *driver) pr_debug("unregistering driver %s\n",
> > driver->name);
> >
> >         subsys_interface_unregister(&cpufreq_interface);
> > +
> > +       cpufreq_sysfs_remove_file(&(boost.attr));
> >         unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
> >
> >         list_del(&cpufreq_policy_list);
> > diff --git a/drivers/cpufreq/freq_table.c
> > b/drivers/cpufreq/freq_table.c index d7a7966..9c8e71e 100644
> > --- a/drivers/cpufreq/freq_table.c
> > +++ b/drivers/cpufreq/freq_table.c
> > @@ -34,6 +34,11 @@ int cpufreq_frequency_table_cpuinfo(struct
> > cpufreq_policy *policy,
> >
> >                         continue;
> >                 }
> > +               if (cpufreq_boost_supported())
> 
> Probably remove this check. Assume somebody while testing exynos,
> just sent boost_supported as false. Then you will not skip this
> frequency and may burn your chip :)

OK.

> 
> > +                       if (!cpufreq_boost_enabled()
> > +                           && table[i].index == CPUFREQ_BOOST_FREQ)
> > +                               continue;
> 
> This should be enough.

Let's only rely on the cpufreq_boost_enabled() test here.

> 
> >                 pr_debug("table entry %u: %u kHz, %u index\n",
> >                                         i, freq, table[i].index);
> >                 if (freq < min_freq)
> > @@ -171,7 +176,8 @@ static DEFINE_PER_CPU(struct
> > cpufreq_frequency_table *, cpufreq_show_table); /**
> >   * show_available_freqs - show available frequencies for the
> > specified CPU */
> > -static ssize_t show_available_freqs(struct cpufreq_policy *policy,
> > char *buf) +static ssize_t show_available_freqs(struct
> > cpufreq_policy *policy, char *buf,
> > +                                   int show_boost)
> >  {
> >         unsigned int i = 0;
> >         unsigned int cpu = policy->cpu;
> > @@ -186,6 +192,9 @@ static ssize_t show_available_freqs(struct
> > cpufreq_policy *policy, char *buf) for (i = 0;
> > (table[i].frequency != CPUFREQ_TABLE_END); i++) { if
> > (table[i].frequency == CPUFREQ_ENTRY_INVALID) continue;
> 
> Add a comment here describing your complex logic.

OK.

> 
> > +               if (show_boost ^ (table[i].index ==
> > CPUFREQ_BOOST_FREQ))
> > +                       continue;
> > +
> >                 count += sprintf(&buf[count], "%d ",
> > table[i].frequency); }
> >         count += sprintf(&buf[count], "\n");
> > @@ -194,14 +203,34 @@ static ssize_t show_available_freqs(struct
> > cpufreq_policy *policy, char *buf)
> >
> >  }
> >
> > -struct freq_attr cpufreq_freq_attr_scaling_available_freqs = {
> > -       .attr = { .name = "scaling_available_frequencies",
> > -                 .mode = 0444,
> > -               },
> > -       .show = show_available_freqs,
> > -};
> > +#define cpufreq_attr_available_freq(_name)       \
> > +struct freq_attr cpufreq_freq_attr_##_name##_freqs =     \
> > +__ATTR_RO(_name##_frequencies)
> > +
> > +/**
> > + * show_scaling_available_frequencies - show normal boost
> > frequencies for
> 
> You missed this comment earlier. boost??

My mistake. This will be corrected.

> 
> > + * the specified CPU
> > + */
> > +static ssize_t scaling_available_frequencies_show(struct
> > cpufreq_policy *policy,
> > +                                                 char *buf)
> > +{
> > +       return show_available_freqs(policy, buf, 0);
> > +}
> > +cpufreq_attr_available_freq(scaling_available);
> >  EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_available_freqs);
> >
> > +/**
> > + * show_available_boost_freqs - show available boost frequencies
> > for
> > + * the specified CPU
> > + */
> > +static ssize_t scaling_boost_frequencies_show(struct
> > cpufreq_policy *policy,
> > +                                             char *buf)
> > +{
> > +       return show_available_freqs(policy, buf, 1);
> > +}
> > +cpufreq_attr_available_freq(scaling_boost);
> > +EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_boost_freqs);
> > +
> >  /*
> >   * if you use these, you must assure that the frequency table is
> > valid
> >   * all the time between get_attr and put_attr!
> > diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
> > index 5348981..4783c4c 100644
> > --- a/include/linux/cpufreq.h
> > +++ b/include/linux/cpufreq.h
> > @@ -267,6 +267,10 @@ struct cpufreq_driver {
> >         int     (*suspend)      (struct cpufreq_policy *policy);
> >         int     (*resume)       (struct cpufreq_policy *policy);
> >         struct freq_attr        **attr;
> > +
> > +       /* platform specific boost support code */
> > +       bool                    boost_supported;
> > +       int (*enable_boost)    (int state);
> >  };
> >
> >  /* flags */
> > @@ -408,6 +412,9 @@ extern struct cpufreq_governor
> > cpufreq_gov_conservative; #define CPUFREQ_ENTRY_INVALID ~0
> >  #define CPUFREQ_TABLE_END     ~1
> >
> > +/* Define index for boost frequency */
> > +#define CPUFREQ_BOOST_FREQ    ~2
> > +
> >  struct cpufreq_frequency_table {
> >         unsigned int    index;     /* any */
> >         unsigned int    frequency; /* kHz - doesn't need to be in
> > ascending @@ -426,11 +433,15 @@ int
> > cpufreq_frequency_table_target(struct cpufreq_policy *policy,
> > unsigned int relation, unsigned int *index);
> >
> > +int cpufreq_boost_trigger_state(int state);
> 
> Why is this present here?

We had agreed to talk only about cpufreq :-).

This declaration will be removed.

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v2 3/3] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework
  2013-06-26 11:05     ` Viresh Kumar
@ 2013-06-26 13:58       ` Lukasz Majewski
  2013-06-27  4:02         ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-26 13:58 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

On Wed, 26 Jun 2013 16:35:32 +0530, Viresh Kumar wrote:
> On 11 June 2013 14:33, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > The struct cpufreq_driver has been extended to embrace the
> > information related to boost support.
> >
> > When "boost_mode" device tree attribute is defined for a platform,
> > the low_level_boost pointer is filled with proper address. The
> > .low_level_boost field filled to NULL, indicates that boost is not
> > supported.
> 
> This patch is still few generations back :)

But this is v2 version of boost patches.

Please also review:
[PATCH v4 4/7]
[PATCH v4 5/7]
[PATCH v4 6/7]
[PATCH v4 7/7] - disable boost at thermal framework



-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 2/7] cpufreq: Add boost frequency support in core
  2013-06-26 12:54       ` Lukasz Majewski
@ 2013-06-26 14:02         ` Lukasz Majewski
  2013-06-27  9:02         ` Viresh Kumar
  1 sibling, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-26 14:02 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Lukasz Majewski, Rafael J. Wysocky, cpufreq, Linux PM list,
	Vincent Guittot, Jonghwa Lee, Myungjoo Ham, linux-kernel,
	Lukasz Majewski, Andre Przywara, Daniel Lezcano, Kukjin Kim,
	Zhang Rui, Eduardo Valentin, t.figa

On Wed, 26 Jun 2013 14:54:12 +0200, Lukasz Majewski wrote:
> > >
> > > +int cpufreq_boost_trigger_state(int state);  
> > 
> > Why is this present here?  
> 
> We had agreed to talk only about cpufreq :-).
> 
> This declaration will be removed.

Correction:

This declaration is needed for allowing disabling cpufreq boost at
thermal subsystem (please refer to [PATCH v4 7/7]).


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v2 3/3] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework
  2013-06-26 13:58       ` Lukasz Majewski
@ 2013-06-27  4:02         ` Viresh Kumar
  2013-06-27  6:31           ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-27  4:02 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

On 26 June 2013 19:28, Lukasz Majewski <l.majewski@samsung.com> wrote:
> On Wed, 26 Jun 2013 16:35:32 +0530, Viresh Kumar wrote:
>> This patch is still few generations back :)
>
> But this is v2 version of boost patches.

My mistake....

> Please also review:
> [PATCH v4 4/7]
> [PATCH v4 5/7]
> [PATCH v4 6/7]
> [PATCH v4 7/7] - disable boost at thermal framework

don't worry I will review everything. I went home after reviewing half
of the patches.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v2 3/3] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework
  2013-06-27  4:02         ` Viresh Kumar
@ 2013-06-27  6:31           ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-27  6:31 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim

On Thu, 27 Jun 2013 09:32:56 +0530, Viresh Kumar wrote:

> On 26 June 2013 19:28, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > On Wed, 26 Jun 2013 16:35:32 +0530, Viresh Kumar wrote:
> >> This patch is still few generations back :)
> >
> > But this is v2 version of boost patches.
> 
> My mistake....
> 
> > Please also review:
> > [PATCH v4 4/7]
> > [PATCH v4 5/7]
> > [PATCH v4 6/7]
> > [PATCH v4 7/7] - disable boost at thermal framework
> 
> don't worry I will review everything. I went home after reviewing half
> of the patches.

Ok, Thanks.

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework
  2013-06-19 17:12   ` [PATCH v4 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
@ 2013-06-27  8:58     ` Viresh Kumar
  2013-06-27  9:08       ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-27  8:58 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

On 19 June 2013 22:42, Lukasz Majewski <l.majewski@samsung.com> wrote:
> The struct cpufreq_driver has been extended to embrace the information
> related to boost support.
>
> When "boost_mode" device tree attribute is defined for a platform, the
> boost_supported flag is set. Moreover boost related attributes were
> exported.
>
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
>
> Changes for v4:
> - None
>
> Changes for v3:
> - Remove low level boost code
> - Move boost management code to cpufreq core code
> - Use boost_supported flag to indicate if driver supports over clocking
>
> Changes for v2:
> - Removal of struct cpufreq_boost
> - Removal of the CONFIG_CPU_FREQ_BOOST flag
> - low_level_boost with valid address when boost is supported
> ---
>  drivers/cpufreq/exynos-cpufreq.c |    4 ++++
>  1 file changed, 4 insertions(+)

Yes, this looks fine..

I will Ack the whole series in the end, so no individual acks :)

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 2/7] cpufreq: Add boost frequency support in core
  2013-06-26 12:54       ` Lukasz Majewski
  2013-06-26 14:02         ` Lukasz Majewski
@ 2013-06-27  9:02         ` Viresh Kumar
  2013-06-27  9:48           ` Lukasz Majewski
  1 sibling, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-27  9:02 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin, t.figa

On 26 June 2013 18:24, Lukasz Majewski <l.majewski@samsung.com> wrote:
> On Wed, 26 Jun 2013 16:24:32 +0530, Viresh Kumar wrote:
>> On 19 June 2013 22:42, Lukasz Majewski <l.majewski@samsung.com> wrote:

>> > +static ssize_t store_boost(struct kobject *kobj, struct attribute
>> > *attr,
>> > +                                 const char *buf, size_t count)
>> > +{
>> > +       int ret, enable;
>> > +
>> > +       ret = sscanf(buf, "%d", &enable);
>> > +       if (ret != 1 || enable < 0 || enable > 1)
>> > +               return -EINVAL;
>> > +
>> > +       if (cpufreq_boost_trigger_state(enable)) {
>> > +               pr_err("%s: Cannot enable boost!\n", __func__);
>> > +               return -EINVAL;
>> > +       }
>>
>> Probably do boost_enabled = true here.
>
> I would prefer to set boot_enabled at
> cpufreq_boost_trigger_state() method. It is closer to the
> cpufreq_driver->enable_boost and cpufreq_boost_trigger_state_sw();
> functions, which do change the freq.

I said that as this will be more inclined towards the purpose of
this routine. This routine should store boost as show_boost()
is returning it. So, what would be better is if you just return
0 or err from cpufreq_boost_trigger_state() and then set boost
here. This will also solve your problem where you revert back
to older boost value for failure cases.

>> > +                       ret = cpufreq_driver->enable_boost(state);
>                                                   ^^^^^^^^^^^^^
>                                         I would prefer to change this
>                                         name to enable_boost_hw
> It is more informative, since it is tailored to hw based boost (Intel).

Ok

>> > +               else
>> > +                       ret = cpufreq_boost_trigger_state_sw();

then why not enable_boost_sw() here? that would be more
relevant.

> I will rewrite it as follow:
>
> if (ret)
>         boost_enabled = 0;
>
> write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> pr_debug("%s: cpufreq BOOST %s\n", __func__,
>                  state ? "enabled" : "disabled");

So, you will not print error but current state? Probably
printing error is better.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework
  2013-06-27  8:58     ` Viresh Kumar
@ 2013-06-27  9:08       ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-27  9:08 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

On Thu, 27 Jun 2013 14:28:11 +0530, Viresh Kumar wrote:

> On 19 June 2013 22:42, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > The struct cpufreq_driver has been extended to embrace the
> > information related to boost support.
> >
> > When "boost_mode" device tree attribute is defined for a platform,
> > the boost_supported flag is set. Moreover boost related attributes
> > were exported.
> >
> > Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> > Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> >
> > Changes for v4:
> > - None
> >
> > Changes for v3:
> > - Remove low level boost code
> > - Move boost management code to cpufreq core code
> > - Use boost_supported flag to indicate if driver supports over
> > clocking
> >
> > Changes for v2:
> > - Removal of struct cpufreq_boost
> > - Removal of the CONFIG_CPU_FREQ_BOOST flag
> > - low_level_boost with valid address when boost is supported
> > ---
> >  drivers/cpufreq/exynos-cpufreq.c |    4 ++++
> >  1 file changed, 4 insertions(+)
> 
> Yes, this looks fine..
> 
> I will Ack the whole series in the end, so no individual acks :)

Ok.

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 5/7] cpufreq: Calculate number of busy CPUs
  2013-06-19 17:12   ` [PATCH v4 5/7] cpufreq: Calculate number of busy CPUs Lukasz Majewski
  2013-06-19 18:01     ` Dirk Brandewie
@ 2013-06-27  9:36     ` Viresh Kumar
  2013-06-27 10:58       ` Lukasz Majewski
  1 sibling, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-27  9:36 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

On 19 June 2013 22:42, Lukasz Majewski <l.majewski@samsung.com> wrote:
> In the core governor code, per cpu load value is calculated. This patch
> uses it to mark processor as a "busy" one, when load value is higher than
> 90%.

How can we take this assumption. What about a cpu which is only 70-80%
busy? So, we would be running at around 70% of policy->max.. Now at
this point you want to enable boost frequency and so that will happen for
all cores... Wouldn't that burn your chip?

> New cpufreq sysfs attribute is created (busy_cpus). It is read only
> and provides information about number of actually busy CPU.

Not required.

> diff --git a/drivers/cpufreq/cpufreq_governor.c b/drivers/cpufreq/cpufreq_governor.c
> index 077cea7..3402533 100644
> --- a/drivers/cpufreq/cpufreq_governor.c
> +++ b/drivers/cpufreq/cpufreq_governor.c
> @@ -148,6 +148,7 @@ void dbs_check_cpu(struct dbs_data *dbs_data, int cpu)
>                         continue;
>
>                 load = 100 * (wall_time - idle_time) / wall_time;
> +               cpufreq_set_busy_cpu(j, load > 90 ? 1 : 0);

do this only when boost is enabled.

>                 if (dbs_data->cdata->governor == GOV_ONDEMAND) {
>                         int freq_avg = __cpufreq_driver_getavg(policy, j);

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 2/7] cpufreq: Add boost frequency support in core
  2013-06-27  9:02         ` Viresh Kumar
@ 2013-06-27  9:48           ` Lukasz Majewski
  2013-06-27 10:25             ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-27  9:48 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin, t.figa

On Thu, 27 Jun 2013 14:32:57 +0530, Viresh Kumar wrote:
> On 26 June 2013 18:24, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > On Wed, 26 Jun 2013 16:24:32 +0530, Viresh Kumar wrote:
> >> On 19 June 2013 22:42, Lukasz Majewski <l.majewski@samsung.com>
> >> wrote:
> 
> >> > +static ssize_t store_boost(struct kobject *kobj, struct
> >> > attribute *attr,
> >> > +                                 const char *buf, size_t count)
> >> > +{
> >> > +       int ret, enable;
> >> > +
> >> > +       ret = sscanf(buf, "%d", &enable);
> >> > +       if (ret != 1 || enable < 0 || enable > 1)
> >> > +               return -EINVAL;
> >> > +
> >> > +       if (cpufreq_boost_trigger_state(enable)) {
> >> > +               pr_err("%s: Cannot enable boost!\n", __func__);
> >> > +               return -EINVAL;
> >> > +       }
> >>
> >> Probably do boost_enabled = true here.
> >
> > I would prefer to set boot_enabled at
> > cpufreq_boost_trigger_state() method. It is closer to the
> > cpufreq_driver->enable_boost and cpufreq_boost_trigger_state_sw();
> > functions, which do change the freq.
> 
> I said that as this will be more inclined towards the purpose of
> this routine. This routine should store boost as show_boost()
> is returning it. So, what would be better is if you just return
> 0 or err from cpufreq_boost_trigger_state() and then set boost
> here. This will also solve your problem where you revert back
> to older boost value for failure cases.

I thought about this idea, but at cpufreq_boost_trigger_state_sw()
I iterate through all available policies and call
cpufreq_frequency_table_cpuinfo()[*] on them. In this routine [*] I use 
cpufreq_boost_enabled() [**] route to search for maximal (boost)
frequency.
The [**] reads boost_enabled flag, which shall be updated before. When
this search fails, then I restore the old value of boost_enabled. 

> 
> >> > +                       ret =
> >> > cpufreq_driver->enable_boost(state);
> >                                                   ^^^^^^^^^^^^^
> >                                         I would prefer to change
> > this name to enable_boost_hw
> > It is more informative, since it is tailored to hw based boost
> > (Intel).
> 
> Ok

OK.

> 
> >> > +               else
> >> > +                       ret = cpufreq_boost_trigger_state_sw();
> 
> then why not enable_boost_sw() here? that would be more
> relevant.

Could you be more specific here?

The distinction here is done on purpose:

You can either call cpufreq_driver->enable_boost for HW controlled
boost or cpufreq_boost_trigger_state_sw() for SW controlled one.

I could write:
	if (cpufreq_driver->enable_boost)
		ret = cpufreq_driver->enable_boost(state);

	ret = cpufreq_boost_trigger_state_sw();

But then for Intel CPUs I will iterate over its policies to seek for
CPUFREQ_BOOST_FREQ marked frequencies without any purpose, since HW is
taking care of boosting. 

> 
> > I will rewrite it as follow:
> >
> > if (ret)
> >         boost_enabled = 0;
> >
> > write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> > pr_debug("%s: cpufreq BOOST %s\n", __func__,
> >                  state ? "enabled" : "disabled");
> 
> So, you will not print error but current state? Probably
> printing error is better.

I will change it to:

write_unlock_irqrestore(&cpufreq_driver_lock, flags);
if (ret)
	pr_err("%s: BOOST cannot enable (%d)\n",
			       __func__, ret);

return ret;

I want to avoid time consuming operations (like print) with holding
lock (and boost_enabled shall be modified under lock).

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 2/7] cpufreq: Add boost frequency support in core
  2013-06-27  9:48           ` Lukasz Majewski
@ 2013-06-27 10:25             ` Viresh Kumar
  2013-06-27 11:07               ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-27 10:25 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin, t.figa

On 27 June 2013 15:18, Lukasz Majewski <l.majewski@samsung.com> wrote:
> On Thu, 27 Jun 2013 14:32:57 +0530, Viresh Kumar wrote:

> I thought about this idea, but at cpufreq_boost_trigger_state_sw()
> I iterate through all available policies and call
> cpufreq_frequency_table_cpuinfo()[*] on them. In this routine [*] I use
> cpufreq_boost_enabled() [**] route to search for maximal (boost)
> frequency.
> The [**] reads boost_enabled flag, which shall be updated before. When
> this search fails, then I restore the old value of boost_enabled.

Ok.

>> >> > +               else
>> >> > +                       ret = cpufreq_boost_trigger_state_sw();
>>
>> then why not enable_boost_sw() here? that would be more
>> relevant.
>
> Could you be more specific here?

I meant rename cpufreq_boost_trigger_state_sw() to
enable_boost_sw() :)

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 5/7] cpufreq: Calculate number of busy CPUs
  2013-06-27  9:36     ` Viresh Kumar
@ 2013-06-27 10:58       ` Lukasz Majewski
  2013-06-27 11:16         ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-27 10:58 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocky
  Cc: cpufreq, Linux PM list, Vincent Guittot, Jonghwa Lee,
	Myungjoo Ham, linux-kernel, Lukasz Majewski, Andre Przywara,
	Daniel Lezcano, Kukjin Kim, Zhang Rui, Eduardo Valentin

On Thu, 27 Jun 2013 15:06:43 +0530, Viresh Kumar wrote:
> On 19 June 2013 22:42, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > In the core governor code, per cpu load value is calculated. This
> > patch uses it to mark processor as a "busy" one, when load value is
> > higher than 90%.
> 
> How can we take this assumption. What about a cpu which is only 70-80%
> busy [*]? 

Do you have any idea of how to precisely set the load threshold?

As a side note:

I've thought about this patch for some time and for me it looks like we
are mixing policy (number of busy CPUs) with abilities, which shall be
provided by the driver (boost). 
Additionally, we can only roughly "estimate" [*] when boost shall run
and when it shall be turned off.

I think that, we shall leave this management [*] to the thermal
framework. This framework is designed exactly to protect from over
heating (it uses the same freq_table for passive CPU cooling) with
several trip points -> e.g. 40 deg (disable boost), 75 deg (impose max
freq as 1.0 GHz to cool down, 90 deg (shutdown immediately).
Please refer to PATH v4 7/7.

Unfortunately, since we dropped Kconfig flag for BOOST we cannot
impose "select THERMAL_FRAMEWORK", when flag for BOOST is enabled at
Kconfig.

Ideally kernel shall not even build when CONFIG_CPUFREQ_BOOST Kconfig
flag is set and thermal for target architecture is not correctly
configured (including proper trip points).




> So, we would be running at around 70% of policy->max.. Now at
> this point you want to enable boost frequency and so that will happen
> for all cores... Wouldn't that burn your chip?

As I've written above, we can only estimate here. Even with the same
manufacturer at one SoC revision BOOST will work with 95% of policy max
but the other revision will work stable only with 70%.

> 
> > New cpufreq sysfs attribute is created (busy_cpus). It is read only
> > and provides information about number of actually busy CPU.
> 
> Not required.

This attribute seems helpful for debug.

> 
> > diff --git a/drivers/cpufreq/cpufreq_governor.c
> > b/drivers/cpufreq/cpufreq_governor.c index 077cea7..3402533 100644
> > --- a/drivers/cpufreq/cpufreq_governor.c
> > +++ b/drivers/cpufreq/cpufreq_governor.c
> > @@ -148,6 +148,7 @@ void dbs_check_cpu(struct dbs_data *dbs_data,
> > int cpu) continue;
> >
> >                 load = 100 * (wall_time - idle_time) / wall_time;
> > +               cpufreq_set_busy_cpu(j, load > 90 ? 1 : 0);
> 
> do this only when boost is enabled.

Please read above side note.

> 
> >                 if (dbs_data->cdata->governor == GOV_ONDEMAND) {
> >                         int freq_avg =
> > __cpufreq_driver_getavg(policy, j);


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 2/7] cpufreq: Add boost frequency support in core
  2013-06-27 10:25             ` Viresh Kumar
@ 2013-06-27 11:07               ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-27 11:07 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin, t.figa

On Thu, 27 Jun 2013 15:55:26 +0530, Viresh Kumar wrote:
> On 27 June 2013 15:18, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > On Thu, 27 Jun 2013 14:32:57 +0530, Viresh Kumar wrote:
> 
> > I thought about this idea, but at cpufreq_boost_trigger_state_sw()
> > I iterate through all available policies and call
> > cpufreq_frequency_table_cpuinfo()[*] on them. In this routine [*] I
> > use cpufreq_boost_enabled() [**] route to search for maximal (boost)
> > frequency.
> > The [**] reads boost_enabled flag, which shall be updated before.
> > When this search fails, then I restore the old value of
> > boost_enabled.
> 
> Ok.

OK
> 
> >> >> > +               else
> >> >> > +                       ret =
> >> >> > cpufreq_boost_trigger_state_sw();
> >>
> >> then why not enable_boost_sw() here? that would be more
> >> relevant.
> >
> > Could you be more specific here?
> 
> I meant rename cpufreq_boost_trigger_state_sw() to
> enable_boost_sw() :)

No problem:
- For SW there will be 
	cpufreq_boost_trigger_state_sw() renamed to enable_boost_sw()

- For HW:
	cpufreq_driver->enable_boost(state) renamed to
		cpufreq_driver->enable_boost_hw(); 

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 5/7] cpufreq: Calculate number of busy CPUs
  2013-06-27 10:58       ` Lukasz Majewski
@ 2013-06-27 11:16         ` Viresh Kumar
  2013-06-27 14:42           ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-27 11:16 UTC (permalink / raw)
  To: Rafael J. Wysocky, Lukasz Majewski
  Cc: cpufreq, Linux PM list, Vincent Guittot, Jonghwa Lee,
	Myungjoo Ham, linux-kernel, Lukasz Majewski, Andre Przywara,
	Daniel Lezcano, Kukjin Kim, Zhang Rui, Eduardo Valentin

@Rafael: We need you to jump into this discussion now, I don't
have a good idea about what we should do :)

On 27 June 2013 16:28, Lukasz Majewski <l.majewski@samsung.com> wrote:
> Do you have any idea of how to precisely set the load threshold?

I thought we are talking about cpu being in idle state.

> As a side note:
>
> I've thought about this patch for some time and for me it looks like we
> are mixing policy (number of busy CPUs) with abilities, which shall be
> provided by the driver (boost).
> Additionally, we can only roughly "estimate" [*] when boost shall run
> and when it shall be turned off.

This is another problem in the patch you sent. User would simply
enable or disable boost feature from userspace only once.

Now, if you disable it at high temperatures then its responsibility
to enable it again. Which you are missing.

> I think that, we shall leave this management [*] to the thermal
> framework. This framework is designed exactly to protect from over
> heating (it uses the same freq_table for passive CPU cooling) with
> several trip points -> e.g. 40 deg (disable boost), 75 deg (impose max
> freq as 1.0 GHz to cool down, 90 deg (shutdown immediately).
> Please refer to PATH v4 7/7.

There might be platforms where overheating isn't a issue with boost,
if it is only enabled while only one cpu is in use.

> Unfortunately, since we dropped Kconfig flag for BOOST we cannot
> impose "select THERMAL_FRAMEWORK", when flag for BOOST is enabled at
> Kconfig.

Not a big deal, we can get that in if required.

> Ideally kernel shall not even build when CONFIG_CPUFREQ_BOOST Kconfig
> flag is set and thermal for target architecture is not correctly
> configured (including proper trip points).

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 5/7] cpufreq: Calculate number of busy CPUs
  2013-06-27 11:16         ` Viresh Kumar
@ 2013-06-27 14:42           ` Lukasz Majewski
  2013-06-28  3:50             ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-27 14:42 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

On Thu, 27 Jun 2013 16:46:44 +0530, Viresh Kumar wrote:
> @Rafael: We need you to jump into this discussion now, I don't
> have a good idea about what we should do :)
> 
> On 27 June 2013 16:28, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > Do you have any idea of how to precisely set the load threshold?
> 
> I thought we are talking about cpu being in idle state.

If we _drop_ the idea with thermal subsystem to disable the boost,
the logic as far as I've understood shall here be as follow:

Only enable BOOST when one CPU load > THRESHOLD_MAX and other CPUs <
THRESHOLD_MIN

THRESHOLD_MIN & THRESHOLD_MAX are SoC specific. 

In my opinion the above constrain imposes policy to the cpufreq driver.

> 
> > As a side note:
> >
> > I've thought about this patch for some time and for me it looks
> > like we are mixing policy (number of busy CPUs) with abilities,
> > which shall be provided by the driver (boost).
> > Additionally, we can only roughly "estimate" [*] when boost shall
> > run and when it shall be turned off.
> 
> This is another problem in the patch you sent. User would simply
> enable or disable boost feature from userspace only once.

The above statement is definitely true for Intel. There HW manage the
frequency.

> 
> Now, if you disable it at high temperatures then its responsibility
> to enable it again. Which you are missing.

So thermal or "other solution" [*] shall disable boost when overheated
and enable it back when things cool down.

[*] @ Viresh & Rafael do you have any idea about the "other solution"
here?


> 
> > I think that, we shall leave this management [*] to the thermal
> > framework. This framework is designed exactly to protect from over
> > heating (it uses the same freq_table for passive CPU cooling) with
> > several trip points -> e.g. 40 deg (disable boost), 75 deg (impose
> > max freq as 1.0 GHz to cool down, 90 deg (shutdown immediately).
> > Please refer to PATH v4 7/7.
> 
> There might be platforms where overheating isn't a issue with boost,
> if it is only enabled while only one cpu is in use.

Could you elaborate more on this?

I thought, that with multi core one needs to keep itself inside
power/thermal dissipation envelope. 

> 
> > Unfortunately, since we dropped Kconfig flag for BOOST we cannot
> > impose "select THERMAL_FRAMEWORK", when flag for BOOST is enabled at
> > Kconfig.
> 
> Not a big deal, we can get that in if required.
> 
> > Ideally kernel shall not even build when CONFIG_CPUFREQ_BOOST
> > Kconfig flag is set and thermal for target architecture is not
> > correctly configured (including proper trip points).

This would prevent situation when somebody made a mistake and
had enabled boost, but for some reason had forgotten to
configure/enable thermal subsystem.

Moreover Kconfig's CONFIG_CPUFREQ_BOOST flag would indicate that user
enabled boost for some reason and he/she (presumably) knows what is
doing.


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 2/7] cpufreq: Add boost frequency support in core
  2013-06-26 10:54     ` Viresh Kumar
  2013-06-26 12:54       ` Lukasz Majewski
@ 2013-06-27 15:55       ` Lukasz Majewski
  2013-06-28  3:40         ` Viresh Kumar
  1 sibling, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-27 15:55 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

On Wed, 26 Jun 2013 16:24:32 +0530, Viresh Kumar wrote:

> > +int cpufreq_boost_trigger_state(int state)
> > +{
> > +       unsigned long flags;
> > +       int ret = 0;
> > +
> > +       if (boost_enabled != state) {
> > +               write_lock_irqsave(&cpufreq_driver_lock, flags);
> > +               boost_enabled = state;
> > +               if (cpufreq_driver->enable_boost)
> > +                       ret = cpufreq_driver->enable_boost(state);
> > +               else
> > +                       ret = cpufreq_boost_trigger_state_sw();

I will use only one call to cpufreq_driver->enable_boost(state) [*] with
either cpufreq_boost_enable_sw() (function with SW boost handling) or
 the one provided by cpufreq driver.

Only when cpufreq driver doesn't provide [*], it will be filled with
"default" cpufreq_boost_enable_sw().

> > +
> > +               if (ret) {
> > +                       boost_enabled = 0;
> > +
> > write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> > +                       pr_err("%s: BOOST cannot enable (%d)\n",
> > +                              __func__, ret);
> > +
> > +                       return ret;
> > +               }
> > +               write_unlock_irqrestore(&cpufreq_driver_lock,
> > flags);  


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 2/7] cpufreq: Add boost frequency support in core
  2013-06-27 15:55       ` Lukasz Majewski
@ 2013-06-28  3:40         ` Viresh Kumar
  2013-06-28  6:49           ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-28  3:40 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

On 27 June 2013 21:25, Lukasz Majewski <l.majewski@samsung.com> wrote:
> On Wed, 26 Jun 2013 16:24:32 +0530, Viresh Kumar wrote:
>> > +       if (boost_enabled != state) {
>> > +               write_lock_irqsave(&cpufreq_driver_lock, flags);
>> > +               boost_enabled = state;
>> > +               if (cpufreq_driver->enable_boost)
>> > +                       ret = cpufreq_driver->enable_boost(state);
>> > +               else
>> > +                       ret = cpufreq_boost_trigger_state_sw();
>
> I will use only one call to cpufreq_driver->enable_boost(state) [*] with
> either cpufreq_boost_enable_sw() (function with SW boost handling) or
>  the one provided by cpufreq driver.
>
> Only when cpufreq driver doesn't provide [*], it will be filled with
> "default" cpufreq_boost_enable_sw().

I didn't get it completely. You are saying you will send a function pointer
now?

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 5/7] cpufreq: Calculate number of busy CPUs
  2013-06-27 14:42           ` Lukasz Majewski
@ 2013-06-28  3:50             ` Viresh Kumar
  2013-06-28  6:54               ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-28  3:50 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

On 27 June 2013 20:12, Lukasz Majewski <l.majewski@samsung.com> wrote:
> On Thu, 27 Jun 2013 16:46:44 +0530, Viresh Kumar wrote:
>> @Rafael: We need you to jump into this discussion now, I don't
>> have a good idea about what we should do :)
>>
>> On 27 June 2013 16:28, Lukasz Majewski <l.majewski@samsung.com> wrote:
>> > Do you have any idea of how to precisely set the load threshold?
>>
>> I thought we are talking about cpu being in idle state.
>
> If we _drop_ the idea with thermal subsystem to disable the boost,
> the logic as far as I've understood shall here be as follow:
>
> Only enable BOOST when one CPU load > THRESHOLD_MAX and other CPUs <
> THRESHOLD_MIN

Again, I thought that we are talking about cpus being completely idle.
i.e. in WFI (wait for interrupt) or deeper states.

> THRESHOLD_MIN & THRESHOLD_MAX are SoC specific.
>
> In my opinion the above constrain imposes policy to the cpufreq driver.

Hmm.

> So thermal or "other solution" [*] shall disable boost when overheated
> and enable it back when things cool down.

yeah..

> [*] @ Viresh & Rafael do you have any idea about the "other solution"
> here?

Not really sure :)

>> There might be platforms where overheating isn't a issue with boost,
>> if it is only enabled while only one cpu is in use.
>
> Could you elaborate more on this?

I meant platforms where chip doesn't heat up much when only one core
is in use and is using boost frequency. So, they may not require support
for thermal layer at all.. But I am not aware of what the ground reality is. If
such systems can be possible or not.

> This would prevent situation when somebody made a mistake and
> had enabled boost, but for some reason had forgotten to
> configure/enable thermal subsystem.
>
> Moreover Kconfig's CONFIG_CPUFREQ_BOOST flag would indicate that user
> enabled boost for some reason and he/she (presumably) knows what is
> doing.

Yeah.. And drivers like ACPI cpufreq and exynos can simply do a select
from their Kconfig entries so that user isn't required to select them.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 2/7] cpufreq: Add boost frequency support in core
  2013-06-28  3:40         ` Viresh Kumar
@ 2013-06-28  6:49           ` Lukasz Majewski
  2013-06-28  6:51             ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-28  6:49 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

On Fri, 28 Jun 2013 09:10:53 +0530, Viresh Kumar wrote:
> On 27 June 2013 21:25, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > On Wed, 26 Jun 2013 16:24:32 +0530, Viresh Kumar wrote:
> >> > +       if (boost_enabled != state) {
> >> > +               write_lock_irqsave(&cpufreq_driver_lock, flags);
> >> > +               boost_enabled = state;
> >> > +               if (cpufreq_driver->enable_boost)
> >> > +                       ret =
> >> > cpufreq_driver->enable_boost(state);
> >> > +               else
> >> > +                       ret = cpufreq_boost_trigger_state_sw();
> >
> > I will use only one call to cpufreq_driver->enable_boost(state) [*]
> > with either cpufreq_boost_enable_sw() (function with SW boost
> > handling) or the one provided by cpufreq driver.
> >
> > Only when cpufreq driver doesn't provide [*], it will be filled with
> > "default" cpufreq_boost_enable_sw().
> 
> I didn't get it completely. You are saying you will send a function
> pointer now?

No, I will use:

if (boost_enabled != state) {
	write_lock_irqsave(&cpufreq_driver_lock, flags);
	boost_enabled = state;

	ret = cpufreq_driver->enable_boost(state);
	^^^^^^^^^^^^^^^^^^^^ only one callback call
	if (ret)
		boost_enabled = 0;

	write_unlock_irqrestore(&cpufreq_driver_lock, flags);

	if (ret)
		pr_err("%s: BOOST cannot enable (%d)\n",
		       __func__, ret);
}

and @ cpufreq_register_driver() I will add following line:

if (!cpufreq_driver->enable_boost)
	cpufreq_driver->enable_boost = &cpufreq_boost_enable_sw;

When cpufreq driver doesn't define callback for enable_boost it will be
filled with default SW cpufreq_boost_enable_sw callback.



-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 2/7] cpufreq: Add boost frequency support in core
  2013-06-28  6:49           ` Lukasz Majewski
@ 2013-06-28  6:51             ` Viresh Kumar
  2013-06-28  7:31               ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-06-28  6:51 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

On 28 June 2013 12:19, Lukasz Majewski <l.majewski@samsung.com> wrote:
> No, I will use:
>
> if (boost_enabled != state) {
>         write_lock_irqsave(&cpufreq_driver_lock, flags);
>         boost_enabled = state;
>
>         ret = cpufreq_driver->enable_boost(state);
>         ^^^^^^^^^^^^^^^^^^^^ only one callback call
>         if (ret)
>                 boost_enabled = 0;
>
>         write_unlock_irqrestore(&cpufreq_driver_lock, flags);
>
>         if (ret)
>                 pr_err("%s: BOOST cannot enable (%d)\n",
>                        __func__, ret);
> }
>
> and @ cpufreq_register_driver() I will add following line:
>
> if (!cpufreq_driver->enable_boost)
>         cpufreq_driver->enable_boost = &cpufreq_boost_enable_sw;
>
> When cpufreq driver doesn't define callback for enable_boost it will be
> filled with default SW cpufreq_boost_enable_sw callback.

That's some smart  code. Good. :)

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 5/7] cpufreq: Calculate number of busy CPUs
  2013-06-28  3:50             ` Viresh Kumar
@ 2013-06-28  6:54               ` Lukasz Majewski
  2013-07-01  8:15                 ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-28  6:54 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

On Fri, 28 Jun 2013 09:20:40 +0530, Viresh Kumar wrote:
> On 27 June 2013 20:12, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > On Thu, 27 Jun 2013 16:46:44 +0530, Viresh Kumar wrote:
> >> @Rafael: We need you to jump into this discussion now, I don't
> >> have a good idea about what we should do :)
> >>
> >> On 27 June 2013 16:28, Lukasz Majewski <l.majewski@samsung.com>
> >> wrote:
> >> > Do you have any idea of how to precisely set the load threshold?
> >>
> >> I thought we are talking about cpu being in idle state.
> >
> > If we _drop_ the idea with thermal subsystem to disable the boost,
> > the logic as far as I've understood shall here be as follow:
> >
> > Only enable BOOST when one CPU load > THRESHOLD_MAX and other CPUs <
> > THRESHOLD_MIN
> 
> Again, I thought that we are talking about cpus being completely idle.
> i.e. in WFI (wait for interrupt) or deeper states.
> 
> > THRESHOLD_MIN & THRESHOLD_MAX are SoC specific.
> >
> > In my opinion the above constrain imposes policy to the cpufreq
> > driver.
> 
> Hmm.
> 
> > So thermal or "other solution" [*] shall disable boost when
> > overheated and enable it back when things cool down.
> 
> yeah..

For me thermal is a good candidate to enable boost again. I only need
to find a proper place for it.

> 
> > [*] @ Viresh & Rafael do you have any idea about the "other
> > solution" here?
> 
> Not really sure :)

Not any single one? Then I would like to propose thermal.

> 
> >> There might be platforms where overheating isn't a issue with
> >> boost, if it is only enabled while only one cpu is in use.
> >
> > Could you elaborate more on this?
> 
> I meant platforms where chip doesn't heat up much when only one core
> is in use and is using boost frequency. So, they may not require
> support for thermal layer at all.. But I am not aware of what the
> ground reality is. If such systems can be possible or not.

Ok.

> 
> > This would prevent situation when somebody made a mistake and
> > had enabled boost, but for some reason had forgotten to
> > configure/enable thermal subsystem.
> >
> > Moreover Kconfig's CONFIG_CPUFREQ_BOOST flag would indicate that
> > user enabled boost for some reason and he/she (presumably) knows
> > what is doing.
> 
> Yeah.. And drivers like ACPI cpufreq and exynos can simply do a select
> from their Kconfig entries so that user isn't required to select them.

Automatic select is not a good option. My goal would be here to define
BOOST as NO by default (at lease for SW managed ones). And allow user
to enable it explicitly.


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 2/7] cpufreq: Add boost frequency support in core
  2013-06-28  6:51             ` Viresh Kumar
@ 2013-06-28  7:31               ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-06-28  7:31 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

On Fri, 28 Jun 2013 12:21:21 +0530, Viresh Kumar wrote:

> On 28 June 2013 12:19, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > No, I will use:
> >
> > if (boost_enabled != state) {
> >         write_lock_irqsave(&cpufreq_driver_lock, flags);
> >         boost_enabled = state;
> >
> >         ret = cpufreq_driver->enable_boost(state);
> >         ^^^^^^^^^^^^^^^^^^^^ only one callback call
> >         if (ret)
> >                 boost_enabled = 0;
> >
> >         write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> >
> >         if (ret)
> >                 pr_err("%s: BOOST cannot enable (%d)\n",
> >                        __func__, ret);
> > }
> >
> > and @ cpufreq_register_driver() I will add following line:
> >
> > if (!cpufreq_driver->enable_boost)
> >         cpufreq_driver->enable_boost = &cpufreq_boost_enable_sw;
> >
> > When cpufreq driver doesn't define callback for enable_boost it
> > will be filled with default SW cpufreq_boost_enable_sw callback.
> 
> That's some smart  code. Good. :)

OK

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 5/7] cpufreq: Calculate number of busy CPUs
  2013-06-28  6:54               ` Lukasz Majewski
@ 2013-07-01  8:15                 ` Lukasz Majewski
  2013-07-04  5:06                   ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-01  8:15 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocky
  Cc: Lukasz Majewski, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

On Fri, 28 Jun 2013 08:54:57 +0200, Lukasz Majewski wrote:
> > > So thermal or "other solution" [*] shall disable boost when
> > > overheated and enable it back when things cool down.  
> > 
> > yeah..  
> 
> For me thermal is a good candidate to enable boost again. I only need
> to find a proper place for it.

Unfortunately, after careful investigation it turned out, that thermal
is suited to disable boost when overheating is detected. (since it uses
thermal subsystem interrupt to take action).

The problem is with enabling boost again, since thermal (at least at my
board) only reacts on TMU (thermal) interrupt. Thermal thread may be
started, but I don't regard this as a good solution (to extra bloat
thermal).

> 
> >   
> > > [*] @ Viresh & Rafael do you have any idea about the "other
> > > solution" here?  
> > 
> > Not really sure :)  
> 
> Not any single one? Then I would like to propose thermal.
> 

Does anybody have any idea here? As written above, thermal is suitable
to disable boost.

I'd like to bring those three options under discussion:

1. boost attr is always exported -> do not enable boost automatically
   when disabled by thermal (as it was proposed at v4).

2. boost attr is always exported -> find a way to enable boost after
   emergency disablement when thermal detects overheating (newest
   proposition). 

3. boost attr only exported at x86 (when supported)
   boost attr NOT exported via sysfs for SW controlled boost (e.g.
   Exynos ARM).

   Then we only enable/disable boost at kernel and don't need to take
   care of the user space interaction. This scenario is my use case. I
   hadn't planned to expose boost to userspace and use it with LAB as a
   kernel API.


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 5/7] cpufreq: Calculate number of busy CPUs
  2013-07-01  8:15                 ` Lukasz Majewski
@ 2013-07-04  5:06                   ` Viresh Kumar
  2013-07-04  5:43                     ` Lukasz Majewski
  2013-07-04 12:50                     ` Rafael J. Wysocki
  0 siblings, 2 replies; 329+ messages in thread
From: Viresh Kumar @ 2013-07-04  5:06 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

Hi Lukasz,

Sorry for being late. Actually I didn't had an answer to your mail
and wanted to go through it with some fresh mind. This is my
first mail this morning, lets see if I can bring something good
into the discussion.

On 1 July 2013 13:45, Lukasz Majewski <l.majewski@samsung.com> wrote:
> Does anybody have any idea here? As written above, thermal is suitable
> to disable boost.

See, one thing is very clear. User space applications aren't responsible
for enabling boost again and again. There has to be a internal mechanism
inside kernel for that.

> I'd like to bring those three options under discussion:
>
> 1. boost attr is always exported -> do not enable boost automatically
>    when disabled by thermal (as it was proposed at v4).

So, that's a problem. I see one more solution to that.
- Create another Macro in cpufreq.c which would contain the time
after which we will autoenable boost.
- So, suppose thermal disabled it due to high temperature (Lets not
change value of sysfs variable boost_enable, but create another
variable like: skip_boost: which means skip boost temporarily).
- Thermal would enable this variable skip_boost.
- Then we will continue to get requests for next frequency and will
check eveytime if we have exceeded time for autoenabling boost.
- If yes, then we disable this variable and start boosting again..
- Then thermal can disable it again later.

This variable (time for autoenable) looks to be more platform
dependent for now, but lets don't make it like that unless somebody
needs it.

> 2. boost attr is always exported -> find a way to enable boost after
>    emergency disablement when thermal detects overheating (newest
>    proposition).

My solution above probably.

> 3. boost attr only exported at x86 (when supported)
>    boost attr NOT exported via sysfs for SW controlled boost (e.g.
>    Exynos ARM).
>
>    Then we only enable/disable boost at kernel and don't need to take
>    care of the user space interaction. This scenario is my use case. I
>    hadn't planned to expose boost to userspace and use it with LAB as a
>    kernel API.

Userspace must have control of this feature after kernel is built. That kernel
image may run for ever without changing in a product.

@Rafael: How crazy do you think my solution is? :)

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 5/7] cpufreq: Calculate number of busy CPUs
  2013-07-04  5:06                   ` Viresh Kumar
@ 2013-07-04  5:43                     ` Lukasz Majewski
  2013-07-04  6:28                       ` Viresh Kumar
  2013-07-04 12:50                     ` Rafael J. Wysocki
  1 sibling, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-04  5:43 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

On Thu, 04 Jul 2013 10:36:53 +0530, Viresh Kumar wrote:
> Hi Lukasz,
> 
> Sorry for being late. Actually I didn't had an answer to your mail
> and wanted to go through it with some fresh mind. This is my
> first mail this morning, lets see if I can bring something good
> into the discussion.
> 
> On 1 July 2013 13:45, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > Does anybody have any idea here? As written above, thermal is
> > suitable to disable boost.
> 
> See, one thing is very clear. User space applications aren't
> responsible for enabling boost again and again. There has to be a
> internal mechanism inside kernel for that.
> 
> > I'd like to bring those three options under discussion:
> >
> > 1. boost attr is always exported -> do not enable boost
> > automatically when disabled by thermal (as it was proposed at v4).
> 
> So, that's a problem. I see one more solution to that.
> - Create another Macro in cpufreq.c which would contain the time
> after which we will autoenable boost.
> - So, suppose thermal disabled it due to high temperature (Lets not
> change value of sysfs variable boost_enable, but create another
> variable like: skip_boost: which means skip boost temporarily).
> - Thermal would enable this variable skip_boost.
> - Then we will continue to get requests for next frequency and will
> check eveytime if we have exceeded time for autoenabling boost.
> - If yes, then we disable this variable and start boosting again..
> - Then thermal can disable it again later.
> 
> This variable (time for autoenable) looks to be more platform
> dependent for now, but lets don't make it like that unless somebody
> needs it.
> 
> > 2. boost attr is always exported -> find a way to enable boost after
> >    emergency disablement when thermal detects overheating (newest
> >    proposition).
> 
> My solution above probably.

This is a possible solution, but I've already modified thermal code a
bit and found a solution for the problem.

I use thermal workqueue (which is already in place anyway) to enable the
boost again.
Due to that I can provide behaviour similar to HW controlled boost.

Patches with this solution are already prepared. I will post them in a
few hours. Ok?

> 
> > 3. boost attr only exported at x86 (when supported)
> >    boost attr NOT exported via sysfs for SW controlled boost (e.g.
> >    Exynos ARM).
> >
> >    Then we only enable/disable boost at kernel and don't need to
> > take care of the user space interaction. This scenario is my use
> > case. I hadn't planned to expose boost to userspace and use it with
> > LAB as a kernel API.
> 
> Userspace must have control of this feature after kernel is built.
> That kernel image may run for ever without changing in a product.
> 
> @Rafael: How crazy do you think my solution is? :)


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 5/7] cpufreq: Calculate number of busy CPUs
  2013-07-04  5:43                     ` Lukasz Majewski
@ 2013-07-04  6:28                       ` Viresh Kumar
  2013-07-04  6:49                         ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-07-04  6:28 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

On 4 July 2013 11:13, Lukasz Majewski <l.majewski@samsung.com> wrote:
> This is a possible solution, but I've already modified thermal code a
> bit and found a solution for the problem.
>
> I use thermal workqueue (which is already in place anyway) to enable the
> boost again.
> Due to that I can provide behaviour similar to HW controlled boost.
>
> Patches with this solution are already prepared. I will post them in a
> few hours. Ok?

I don't see any harm in checking them out :)
Please send them.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 5/7] cpufreq: Calculate number of busy CPUs
  2013-07-04  6:28                       ` Viresh Kumar
@ 2013-07-04  6:49                         ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-04  6:49 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocky, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

On Thu, 04 Jul 2013 11:58:53 +0530, Viresh Kumar wrote:

> On 4 July 2013 11:13, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > This is a possible solution, but I've already modified thermal code
> > a bit and found a solution for the problem.
> >
> > I use thermal workqueue (which is already in place anyway) to
> > enable the boost again.
> > Due to that I can provide behaviour similar to HW controlled boost.
> >
> > Patches with this solution are already prepared. I will post them
> > in a few hours. Ok?
> 
> I don't see any harm in checking them out :)
> Please send them.

:-)

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* [PATCH v5 0/7] cpufreq:boost: CPU Boost mode support
  2013-06-06  7:07 [PATCH 0/5] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                   ` (7 preceding siblings ...)
  2013-06-19 17:12 ` [PATCH v4 0/7] " Lukasz Majewski
@ 2013-07-04  8:50 ` Lukasz Majewski
  2013-07-04  8:50   ` [PATCH v5 1/7] cpufreq: Store cpufreq policies in a list Lukasz Majewski
                     ` (7 more replies)
  2013-07-25 16:33 ` [PATCH v6 0/8] " Lukasz Majewski
                   ` (8 subsequent siblings)
  17 siblings, 8 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-04  8:50 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski, l.majewski,
	linux-kernel, Andre Przywara, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham

This patch series introduces support for CPU overclocking technique
called Boost.

It is a follow up of a LAB governor proposal. Boost is a LAB component:
http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq

Boost unifies hardware based solution (e.g. Intel Nehalem) with
software oriented one (like the one done at Exynos).
For this reason cpufreq/freq_table code has been reorganized to include
common code.

Important design decisions:

- Boost related code is compiled-in unconditionally to cpufreq core and 
  disabled by default. The cpufreq_driver is responsibile for setting 
  boost_supported flag and providing enable_boost callback(if HW support
  is needed). For software managed boost, special Kconfig flag - 
  CONFIG_CPU_FREQ_BOOST_SW has been defined. It will be selectable only
  when a target platform has thermal framework properly configured.

- struct cpufreq_driver has been extended with boost related fields:
        -- boost_supported - when driver supports boosting
        -- enable_boost - callback to function, which is necessary to
           enable boost

- Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost) is visible
  _only_ when cpufreq driver supports Boost.

- No special spin_lock for Boost was created. The one from cpufreq core
  was reused.

- All available policies are now stored in a list.

- The Boost code doesn't rely on any policy. When boost state is changed,
  then the policy list is iterated and proper adjustements are done.

- To improve safety level, the thermal framework is also extended to disable
  software boosting, when thermal trip point is reached. Then it starts 
  monitoring of target temperature to evaluate if boost can be enabled 
  again. This emulates behaviour similar to HW managed boost (like x86)

New patches for v5:
cpufreq:boost:Kconfig: Enable software managed BOOST support at Kconfig
Documentation:cpufreq:boost: Update BOOST documentation

Patches dropped at v5:
cpufreq: Calculate number of busy CPUs
cpufreq: Enable software boost only when up to one busy core is running

Tested at: HW:
        Exynos 4412 3.10 linux
        Exynos 4210 3.10 linux
Compile tested x86_64 defconfig (acpi) - help with HW (Intel Nehalem) test
 needed

The code has been rebased on top of kernel_pm/bleeding-edge (3.11-rc1)


Lukasz Majewski (7):
  cpufreq: Store cpufreq policies in a list
  cpufreq: Add boost frequency support in core
  cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common
    boost solution
  cpufreq:exynos:Extend Exynos cpufreq driver to support boost
    framework
  thermal:boost: Automatic enable/disable of BOOST feature
  cpufreq:boost:Kconfig: Enable software managed BOOST support at
    Kconfig
  Documentation:cpufreq:boost: Update BOOST documentation

 Documentation/cpu-freq/boost.txt |   26 ++++-----
 drivers/cpufreq/Kconfig          |   14 +++++
 drivers/cpufreq/acpi-cpufreq.c   |   69 +++++++----------------
 drivers/cpufreq/cpufreq.c        |  115 ++++++++++++++++++++++++++++++++++++++
 drivers/cpufreq/exynos-cpufreq.c |    9 ++-
 drivers/cpufreq/freq_table.c     |   47 +++++++++++++---
 drivers/thermal/thermal_core.c   |   31 ++++++++++
 include/linux/cpufreq.h          |   13 +++++
 include/linux/thermal.h          |    2 +
 9 files changed, 257 insertions(+), 69 deletions(-)

-- 
1.7.10.4


^ permalink raw reply	[flat|nested] 329+ messages in thread

* [PATCH v5 1/7] cpufreq: Store cpufreq policies in a list
  2013-07-04  8:50 ` [PATCH v5 " Lukasz Majewski
@ 2013-07-04  8:50   ` Lukasz Majewski
  2013-07-16  8:51     ` Viresh Kumar
  2013-07-04  8:50   ` [PATCH v5 2/7] cpufreq: Add boost frequency support in core Lukasz Majewski
                     ` (6 subsequent siblings)
  7 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-04  8:50 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski, l.majewski,
	linux-kernel, Andre Przywara, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham

Policies available in a cpufreq framework are now linked together. They are
accessible via cpufreq_policy_list defined at cpufreq core.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v5:
- Call list_add() only when device successfully added
Changes for v4:
- New patch

 drivers/cpufreq/cpufreq.c |    3 +++
 include/linux/cpufreq.h   |    1 +
 2 files changed, 4 insertions(+)

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 0937b8d..420ccb5 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -46,6 +46,7 @@ static struct cpufreq_driver *cpufreq_driver;
 static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data);
 static DEFINE_RWLOCK(cpufreq_driver_lock);
 static DEFINE_MUTEX(cpufreq_governor_lock);
+static LIST_HEAD(cpufreq_policy_list);
 
 #ifdef CONFIG_HOTPLUG_CPU
 /* This one keeps track of the previously set governor of a removed CPU */
@@ -1054,6 +1055,7 @@ static int cpufreq_add_dev(struct device *dev, struct subsys_interface *sif)
 	if (ret)
 		goto err_out_unregister;
 
+	list_add(&policy->policy_list, &cpufreq_policy_list);
 	kobject_uevent(&policy->kobj, KOBJ_ADD);
 	module_put(cpufreq_driver->owner);
 	pr_debug("initialization complete\n");
@@ -2056,6 +2058,7 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
 	subsys_interface_unregister(&cpufreq_interface);
 	unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
 
+	list_del(&cpufreq_policy_list);
 	write_lock_irqsave(&cpufreq_driver_lock, flags);
 	cpufreq_driver = NULL;
 	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index 90d5a15..d8e30fc 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -117,6 +117,7 @@ struct cpufreq_policy {
 
 	struct cpufreq_real_policy	user_policy;
 
+	struct list_head        policy_list;
 	struct kobject		kobj;
 	struct completion	kobj_unregister;
 	int			transition_ongoing; /* Tracks transition status */
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v5 2/7] cpufreq: Add boost frequency support in core
  2013-07-04  8:50 ` [PATCH v5 " Lukasz Majewski
  2013-07-04  8:50   ` [PATCH v5 1/7] cpufreq: Store cpufreq policies in a list Lukasz Majewski
@ 2013-07-04  8:50   ` Lukasz Majewski
  2013-07-16  9:41     ` Viresh Kumar
  2013-07-04  8:50   ` [PATCH v5 3/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
                     ` (5 subsequent siblings)
  7 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-04  8:50 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski, l.majewski,
	linux-kernel, Andre Przywara, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham

This commit adds boost frequency support in cpufreq core (Hardware &
Software).
Some SoC (like Exynos4 - e.g. 4x12) allow setting frequency above
its normal operation limits. Such a mode shall be only used for a short
time.

Overclocking (boost) support is essentially provided by platform
dependent cpufreq driver.

This commit unifies support for SW and HW (Intel) over clocking solutions
in the core cpufreq driver. Previously the "boost" sysfs attribute was
defined at acpi driver code.
By default boost is disabled. One global attribute is available at:
/sys/devices/system/cpu/cpufreq/boost.

It only shows up when cpufreq driver supports overclocking.
Under the hood frequencies dedicated for boosting are marked with a
special flag (CPUFREQ_BOOST_FREQ) at driver's frequency table.
It is the user's concern to enable/disable overclocking with proper call to
sysfs.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v5:
- Rename cpufreq_boost_trigger_state_sw() to cpufreq_boost_enable_sw()
- Extent cpufreq_register_driver() to check if cpufreq driver provided
  boost_enable callback. If not provided, then use cpufreq_boost_enable_sw()
- Use single call to cpufreq_driver->enable_boost() with cpufreq driver
  provided callback or default SW boost enable routine
- Move pr_debug call to store_boost() from cpufreq_boost_trigger_state()
- Change the user_policy.max value when SW boost is toggled. It is necessary
  for proper operation of e.g. thermal subsystem.
- Add check if cpufreq_driver pointer is not NULL at
  cpufreq_boost_supported() routine
- Add EXPORT_SYMBOL_GPL for cpufreq_boost_supported() and
  cpufreq_boost_enabled()
- Remove extra check for cpufreq_boost_supported() at
  cpufreq_freq_table_cpuinfo()
- Explanation of show boost logic at show_available_freqs()
- Add cpufreq_set_boost_enabled() method to set initial value of boost_enabled
  global flag

Changes for v4:
- Remove boost parameter from cpufreq_frequency_table_cpuinfo() function
- Introduce cpufreq_boost_supported() method
- Use of cpufreq_boost_supported() and cpufreq_boost_enabled() to decide
  if frequency shall be skipped
- Rename set_boost_freq() to enable_boost()
- cpufreq_attr_available_freq() moved to freq_table.c
- Use policy list to get access to cpufreq policies
- Rename global boost flag (cpufreq_boost_enabled -> boost_enabled)
- pr_err corrected ( %sable)
- Remove sanity check at cpufreq_boost_trigger_state() entrance [to test if
  boost is supported]
- Use either HW (boost_enable) callback or SW managed boost
- Introduce new cpufreq_boost_trigger_state_sw() method to handle boost
  at SW.
- Protect boost_enabled manipulation with lock.

Changes for v3:
- Method for reading boost status
- Removal of cpufreq_frequency_table_max()
- Extent cpufreq_frequency_table_cpuinfo() to support boost parameter
- boost_supported flag added to cpufreq_driver struct
- "boost" sysfs attribute control flag removed
- One global flag describing state of the boost defined at cpufreq core
- Rename cpufreq_driver's low_level_boost field to set_boost_freq()
- Usage of cpufreq_sysfs_{remove|add}_file() routines

Changes for v2:
- Removal of cpufreq_boost structure and move its fields to cpufreq_driver
  structure
- Flag to indicate if global boost attribute is already defined
- Extent the pr_{err|debbug} functions to show current function names

 drivers/cpufreq/cpufreq.c    |  112 ++++++++++++++++++++++++++++++++++++++++++
 drivers/cpufreq/freq_table.c |   47 +++++++++++++++---
 include/linux/cpufreq.h      |   12 +++++
 3 files changed, 164 insertions(+), 7 deletions(-)

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 420ccb5..531189f 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -43,6 +43,7 @@
  * also protects the cpufreq_cpu_data array.
  */
 static struct cpufreq_driver *cpufreq_driver;
+static bool boost_enabled;
 static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data);
 static DEFINE_RWLOCK(cpufreq_driver_lock);
 static DEFINE_MUTEX(cpufreq_governor_lock);
@@ -377,6 +378,32 @@ EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
 /*********************************************************************
  *                          SYSFS INTERFACE                          *
  *********************************************************************/
+ssize_t show_boost(struct kobject *kobj,
+				 struct attribute *attr, char *buf)
+{
+	return sprintf(buf, "%d\n", boost_enabled);
+}
+
+static ssize_t store_boost(struct kobject *kobj, struct attribute *attr,
+				  const char *buf, size_t count)
+{
+	int ret, enable;
+
+	ret = sscanf(buf, "%d", &enable);
+	if (ret != 1 || enable < 0 || enable > 1)
+		return -EINVAL;
+
+	if (cpufreq_boost_trigger_state(enable)) {
+		pr_err("%s: Cannot enable boost!\n", __func__);
+		return -EINVAL;
+	}
+
+	pr_debug("%s: cpufreq BOOST %s\n", __func__,
+		 enable ? "enabled" : "disabled");
+
+	return count;
+}
+define_one_global_rw(boost);
 
 static struct cpufreq_governor *__find_governor(const char *str_governor)
 {
@@ -1963,6 +1990,72 @@ static struct notifier_block __refdata cpufreq_cpu_notifier = {
 };
 
 /*********************************************************************
+ *               BOOST						     *
+ *********************************************************************/
+static int cpufreq_boost_enable_sw(int state)
+{
+	struct cpufreq_frequency_table *freq_table;
+	struct cpufreq_policy *policy;
+	int ret = -EINVAL;
+
+	list_for_each_entry(policy, &cpufreq_policy_list, policy_list) {
+		freq_table = cpufreq_frequency_get_table(policy->cpu);
+		if (freq_table) {
+			ret = cpufreq_frequency_table_cpuinfo(policy,
+							freq_table);
+			if (!ret)
+				policy->user_policy.max = policy->max;
+		}
+	}
+
+	return ret;
+}
+
+int cpufreq_boost_trigger_state(int state)
+{
+	unsigned long flags;
+	int ret = 0;
+
+	if (boost_enabled != state) {
+		write_lock_irqsave(&cpufreq_driver_lock, flags);
+		boost_enabled = state;
+
+		ret = cpufreq_driver->enable_boost(state);
+		if (ret)
+			boost_enabled = 0;
+
+		write_unlock_irqrestore(&cpufreq_driver_lock, flags);
+
+		if (ret)
+			pr_err("%s: BOOST cannot enable (%d)\n",
+			       __func__, ret);
+	}
+
+	return ret;
+}
+
+int cpufreq_boost_supported(void)
+{
+	if (cpufreq_driver)
+		return cpufreq_driver->boost_supported;
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(cpufreq_boost_supported);
+
+int cpufreq_boost_enabled(void)
+{
+	return boost_enabled;
+}
+EXPORT_SYMBOL_GPL(cpufreq_boost_enabled);
+
+void cpufreq_set_boost_enabled(int state)
+{
+	boost_enabled = state;
+}
+EXPORT_SYMBOL_GPL(cpufreq_set_boost_enabled);
+
+/*********************************************************************
  *               REGISTER / UNREGISTER CPUFREQ DRIVER                *
  *********************************************************************/
 
@@ -2001,6 +2094,22 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 	cpufreq_driver = driver_data;
 	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
 
+	if (cpufreq_driver->boost_supported) {
+		/*
+		 * Check if boost driver provides function to enable boost -
+		 * if not, use cpufreq_boost_enable_sw as default
+		 */
+		if (!cpufreq_driver->enable_boost)
+			cpufreq_driver->enable_boost = &cpufreq_boost_enable_sw;
+
+		ret = cpufreq_sysfs_create_file(&(boost.attr));
+		if (ret) {
+			pr_err("%s: cannot register global boost sysfs file\n",
+				__func__);
+			goto err_null_driver;
+		}
+	}
+
 	ret = subsys_interface_register(&cpufreq_interface);
 	if (ret)
 		goto err_null_driver;
@@ -2056,6 +2165,9 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
 	pr_debug("unregistering driver %s\n", driver->name);
 
 	subsys_interface_unregister(&cpufreq_interface);
+	if (cpufreq_driver->boost_supported)
+		cpufreq_sysfs_remove_file(&(boost.attr));
+
 	unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
 
 	list_del(&cpufreq_policy_list);
diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c
index f0d8741..490518f 100644
--- a/drivers/cpufreq/freq_table.c
+++ b/drivers/cpufreq/freq_table.c
@@ -34,6 +34,9 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
 
 			continue;
 		}
+		if (!cpufreq_boost_enabled()
+		    && table[i].driver_data == CPUFREQ_BOOST_FREQ)
+			continue;
 		pr_debug("table entry %u: %u kHz, %u driver_data\n",
 					i, freq, table[i].driver_data);
 		if (freq < min_freq)
@@ -171,7 +174,8 @@ static DEFINE_PER_CPU(struct cpufreq_frequency_table *, cpufreq_show_table);
 /**
  * show_available_freqs - show available frequencies for the specified CPU
  */
-static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
+static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf,
+				    int show_boost)
 {
 	unsigned int i = 0;
 	unsigned int cpu = policy->cpu;
@@ -186,6 +190,15 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
 	for (i = 0; (table[i].frequency != CPUFREQ_TABLE_END); i++) {
 		if (table[i].frequency == CPUFREQ_ENTRY_INVALID)
 			continue;
+		/*
+		 * show_boost = true and driver_data = BOOST freq ->
+		 * display BOOST
+		 * show_boost = false and driver_data = BOOST freq -> continue
+		 * and display only non BOOST frequencies
+		 */
+		if (show_boost ^ (table[i].driver_data == CPUFREQ_BOOST_FREQ))
+			continue;
+
 		count += sprintf(&buf[count], "%d ", table[i].frequency);
 	}
 	count += sprintf(&buf[count], "\n");
@@ -194,14 +207,34 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
 
 }
 
-struct freq_attr cpufreq_freq_attr_scaling_available_freqs = {
-	.attr = { .name = "scaling_available_frequencies",
-		  .mode = 0444,
-		},
-	.show = show_available_freqs,
-};
+#define cpufreq_attr_available_freq(_name)	  \
+struct freq_attr cpufreq_freq_attr_##_name##_freqs =     \
+__ATTR_RO(_name##_frequencies)
+
+/**
+ * show_scaling_available_frequencies - show available normal frequencies for
+ * the specified CPU
+ */
+static ssize_t scaling_available_frequencies_show(struct cpufreq_policy *policy,
+						  char *buf)
+{
+	return show_available_freqs(policy, buf, 0);
+}
+cpufreq_attr_available_freq(scaling_available);
 EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_available_freqs);
 
+/**
+ * show_available_boost_freqs - show available boost frequencies for
+ * the specified CPU
+ */
+static ssize_t scaling_boost_frequencies_show(struct cpufreq_policy *policy,
+					      char *buf)
+{
+	return show_available_freqs(policy, buf, 1);
+}
+cpufreq_attr_available_freq(scaling_boost);
+EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_boost_freqs);
+
 /*
  * if you use these, you must assure that the frequency table is valid
  * all the time between get_attr and put_attr!
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index d8e30fc..3b50688 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -267,6 +267,10 @@ struct cpufreq_driver {
 	int	(*suspend)	(struct cpufreq_policy *policy);
 	int	(*resume)	(struct cpufreq_policy *policy);
 	struct freq_attr	**attr;
+
+	/* platform specific boost support code */
+	bool                    boost_supported;
+	int (*enable_boost)    (int state);
 };
 
 /* flags */
@@ -411,6 +415,9 @@ extern struct cpufreq_governor cpufreq_gov_conservative;
 #define CPUFREQ_ENTRY_INVALID ~0
 #define CPUFREQ_TABLE_END     ~1
 
+/* Define index for boost frequency */
+#define CPUFREQ_BOOST_FREQ    ~2
+
 struct cpufreq_frequency_table {
 	unsigned int	driver_data; /* driver specific data, not used by core */
 	unsigned int	frequency; /* kHz - doesn't need to be in ascending
@@ -429,11 +436,16 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
 				   unsigned int relation,
 				   unsigned int *index);
 
+int cpufreq_boost_trigger_state(int state);
+void cpufreq_set_boost_enabled(int state);
+int cpufreq_boost_supported(void);
+int cpufreq_boost_enabled(void);
 /* the following 3 funtions are for cpufreq core use only */
 struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu);
 
 /* the following are really really optional */
 extern struct freq_attr cpufreq_freq_attr_scaling_available_freqs;
+extern struct freq_attr cpufreq_freq_attr_scaling_boost_freqs;
 
 void cpufreq_frequency_table_get_attr(struct cpufreq_frequency_table *table,
 				      unsigned int cpu);
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v5 3/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution
  2013-07-04  8:50 ` [PATCH v5 " Lukasz Majewski
  2013-07-04  8:50   ` [PATCH v5 1/7] cpufreq: Store cpufreq policies in a list Lukasz Majewski
  2013-07-04  8:50   ` [PATCH v5 2/7] cpufreq: Add boost frequency support in core Lukasz Majewski
@ 2013-07-04  8:50   ` Lukasz Majewski
  2013-07-16 10:04     ` Viresh Kumar
  2013-07-04  8:50   ` [PATCH v5 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
                     ` (4 subsequent siblings)
  7 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-04  8:50 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski, l.majewski,
	linux-kernel, Andre Przywara, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham

The Intel's hardware based boost solution driver has been changed to cooperate with
common cpufreq boost framework.

The global sysfs boost attribute entry code (/sys/devices/system/cpu/cpufreq/boost)
has been moved to a core cpufreq code. This attribute is now only visible,
when cpufreq driver supports it.

The _store_boost() function has been redesigned to be used as set_boost_freq
callback.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v5:
- Remove acpi-cpufreq's boost_enabled global flag and reuse one defined at
  cpufreq core

Changes for v4:
- add _store_boost to acpi_cpufreq_driver structure

Changes for v3:
- Bring back boost_enabled as a global flag
- Move boost_supported to cpufreq_driver structure

Changes for v2:
- Replace boost_enabled and boost_supported global flags with proper entries
  at struct cpufreq_driver.
- Removal of struct cpufreq_boost

 drivers/cpufreq/acpi-cpufreq.c |   69 ++++++++++++----------------------------
 1 file changed, 21 insertions(+), 48 deletions(-)

diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c
index 3926402..113a928 100644
--- a/drivers/cpufreq/acpi-cpufreq.c
+++ b/drivers/cpufreq/acpi-cpufreq.c
@@ -81,7 +81,6 @@ static struct acpi_processor_performance __percpu *acpi_perf_data;
 static struct cpufreq_driver acpi_cpufreq_driver;
 
 static unsigned int acpi_pstate_strict;
-static bool boost_enabled, boost_supported;
 static struct msr __percpu *msrs;
 
 static bool boost_state(unsigned int cpu)
@@ -134,49 +133,33 @@ static void boost_set_msrs(bool enable, const struct cpumask *cpumask)
 	wrmsr_on_cpus(cpumask, msr_addr, msrs);
 }
 
-static ssize_t _store_boost(const char *buf, size_t count)
+static int _store_boost(int val)
+{
+	get_online_cpus();
+	boost_set_msrs(val, cpu_online_mask);
+	put_online_cpus();
+	pr_debug("Core Boosting %sabled.\n", val ? "en" : "dis");
+
+	return 0;
+}
+
+static ssize_t store_boost(const char *buf, size_t count)
 {
 	int ret;
 	unsigned long val = 0;
 
-	if (!boost_supported)
+	if (!acpi_cpufreq_driver.boost_supported)
 		return -EINVAL;
 
 	ret = kstrtoul(buf, 10, &val);
 	if (ret || (val > 1))
 		return -EINVAL;
 
-	if ((val && boost_enabled) || (!val && !boost_enabled))
-		return count;
-
-	get_online_cpus();
-
-	boost_set_msrs(val, cpu_online_mask);
-
-	put_online_cpus();
-
-	boost_enabled = val;
-	pr_debug("Core Boosting %sabled.\n", val ? "en" : "dis");
+	_store_boost((int) val);
 
 	return count;
 }
 
-static ssize_t store_global_boost(struct kobject *kobj, struct attribute *attr,
-				  const char *buf, size_t count)
-{
-	return _store_boost(buf, count);
-}
-
-static ssize_t show_global_boost(struct kobject *kobj,
-				 struct attribute *attr, char *buf)
-{
-	return sprintf(buf, "%u\n", boost_enabled);
-}
-
-static struct global_attr global_boost = __ATTR(boost, 0644,
-						show_global_boost,
-						store_global_boost);
-
 static ssize_t show_freqdomain_cpus(struct cpufreq_policy *policy, char *buf)
 {
 	struct acpi_cpufreq_data *data = per_cpu(acfreq_data, policy->cpu);
@@ -190,12 +173,12 @@ cpufreq_freq_attr_ro(freqdomain_cpus);
 static ssize_t store_cpb(struct cpufreq_policy *policy, const char *buf,
 			 size_t count)
 {
-	return _store_boost(buf, count);
+	return store_boost(buf, count);
 }
 
 static ssize_t show_cpb(struct cpufreq_policy *policy, char *buf)
 {
-	return sprintf(buf, "%u\n", boost_enabled);
+	return sprintf(buf, "%u\n", cpufreq_boost_enabled());
 }
 
 static struct freq_attr cpb = __ATTR(cpb, 0644, show_cpb, store_cpb);
@@ -583,7 +566,7 @@ static int boost_notify(struct notifier_block *nb, unsigned long action,
 	switch (action) {
 	case CPU_UP_PREPARE:
 	case CPU_UP_PREPARE_FROZEN:
-		boost_set_msrs(boost_enabled, cpumask);
+		boost_set_msrs(cpufreq_boost_enabled(), cpumask);
 		break;
 
 	case CPU_DOWN_PREPARE:
@@ -943,6 +926,7 @@ static struct cpufreq_driver acpi_cpufreq_driver = {
 	.name		= "acpi-cpufreq",
 	.owner		= THIS_MODULE,
 	.attr		= acpi_cpufreq_attr,
+	.enable_boost   = _store_boost,
 };
 
 static void __init acpi_cpufreq_boost_init(void)
@@ -953,33 +937,22 @@ static void __init acpi_cpufreq_boost_init(void)
 		if (!msrs)
 			return;
 
-		boost_supported = true;
-		boost_enabled = boost_state(0);
+		cpufreq_set_boost_enabled(boost_state(0));
+		acpi_cpufreq_driver.boost_supported = true;
 
 		get_online_cpus();
 
 		/* Force all MSRs to the same value */
-		boost_set_msrs(boost_enabled, cpu_online_mask);
+		boost_set_msrs(cpufreq_boost_enabled(), cpu_online_mask);
 
 		register_cpu_notifier(&boost_nb);
 
 		put_online_cpus();
-	} else
-		global_boost.attr.mode = 0444;
-
-	/* We create the boost file in any case, though for systems without
-	 * hardware support it will be read-only and hardwired to return 0.
-	 */
-	if (cpufreq_sysfs_create_file(&(global_boost.attr)))
-		pr_warn(PFX "could not register global boost sysfs file\n");
-	else
-		pr_debug("registered global boost sysfs file\n");
+	}
 }
 
 static void __exit acpi_cpufreq_boost_exit(void)
 {
-	cpufreq_sysfs_remove_file(&(global_boost.attr));
-
 	if (msrs) {
 		unregister_cpu_notifier(&boost_nb);
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v5 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework
  2013-07-04  8:50 ` [PATCH v5 " Lukasz Majewski
                     ` (2 preceding siblings ...)
  2013-07-04  8:50   ` [PATCH v5 3/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
@ 2013-07-04  8:50   ` Lukasz Majewski
  2013-07-16  9:48     ` Viresh Kumar
  2013-07-04  8:50   ` [PATCH v5 5/7] thermal:boost: Automatic enable/disable of BOOST feature Lukasz Majewski
                     ` (3 subsequent siblings)
  7 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-04  8:50 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski, l.majewski,
	linux-kernel, Andre Przywara, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham

The struct cpufreq_driver has been extended to embrace the information
related to boost support.

When "boost_mode" device tree attribute is defined for a platform, the
boost_supported flag is set. Moreover boost related attributes were
exported.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v5:
- None

Changes for v4:
- None

Changes for v3:
- Remove low level boost code
- Move boost management code to cpufreq core code
- Use boost_supported flag to indicate if driver supports over clocking

Changes for v2:
- Removal of struct cpufreq_boost
- Removal of the CONFIG_CPU_FREQ_BOOST flag
- low_level_boost with valid address when boost is supported

 drivers/cpufreq/exynos-cpufreq.c |    4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/cpufreq/exynos-cpufreq.c b/drivers/cpufreq/exynos-cpufreq.c
index 0d32f02..4f42fcc 100644
--- a/drivers/cpufreq/exynos-cpufreq.c
+++ b/drivers/cpufreq/exynos-cpufreq.c
@@ -267,6 +267,7 @@ static int exynos_cpufreq_cpu_exit(struct cpufreq_policy *policy)
 
 static struct freq_attr *exynos_cpufreq_attr[] = {
 	&cpufreq_freq_attr_scaling_available_freqs,
+	&cpufreq_freq_attr_scaling_boost_freqs,
 	NULL,
 };
 
@@ -287,6 +288,7 @@ static struct cpufreq_driver exynos_driver = {
 
 static int __init exynos_cpufreq_init(void)
 {
+	struct device_node *node = pdev->dev.of_node;
 	int ret = -EINVAL;
 
 	exynos_info = kzalloc(sizeof(struct exynos_dvfs_info), GFP_KERNEL);
@@ -317,6 +319,8 @@ static int __init exynos_cpufreq_init(void)
 	}
 
 	locking_frequency = exynos_getspeed(0);
+	if (of_property_read_bool(node, "boost_mode"))
+		exynos_driver.boost_supported = 1;
 
 	register_pm_notifier(&exynos_cpufreq_nb);
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v5 5/7] thermal:boost: Automatic enable/disable of BOOST feature
  2013-07-04  8:50 ` [PATCH v5 " Lukasz Majewski
                     ` (3 preceding siblings ...)
  2013-07-04  8:50   ` [PATCH v5 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
@ 2013-07-04  8:50   ` Lukasz Majewski
  2013-07-04 17:19     ` R, Durgadoss
  2013-07-11  8:08     ` Lukasz Majewski
  2013-07-04  8:50   ` [PATCH v5 6/7] cpufreq:boost:Kconfig: Enable software managed BOOST support at Kconfig Lukasz Majewski
                     ` (2 subsequent siblings)
  7 siblings, 2 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-04  8:50 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski, l.majewski,
	linux-kernel, Andre Przywara, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham

This patch provides auto disable/enable operation for boost. When any
defined trip point is passed, the boost is disabled.
In that moment thermal monitor workqueue is woken up and it monitors
if the device temperature drops below 75% of the smallest trip point.
When device cools down, the boost is enabled again.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v5:
- Move boost disable code from cpu_cooling.c to thermal_core.c
  (to handle_non_critical_trips)
- Extent struct thermal_zone_device by adding overheated bool flag
- Implement auto enable of boost after device cools down
- Introduce boost_polling flag, which indicates if thermal uses it's predefined
  pool delay or has woken up thermal workqueue only to wait until device
  cools down.

Changes for v4:
- New patch

 drivers/thermal/thermal_core.c |   31 +++++++++++++++++++++++++++++++
 include/linux/thermal.h        |    2 ++
 2 files changed, 33 insertions(+)

diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
index d755440..12adbad 100644
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -33,6 +33,7 @@
 #include <linux/idr.h>
 #include <linux/thermal.h>
 #include <linux/reboot.h>
+#include <linux/cpufreq.h>
 #include <net/netlink.h>
 #include <net/genetlink.h>
 
@@ -326,6 +327,15 @@ static void monitor_thermal_zone(struct thermal_zone_device *tz)
 static void handle_non_critical_trips(struct thermal_zone_device *tz,
 			int trip, enum thermal_trip_type trip_type)
 {
+	if (cpufreq_boost_supported()) {
+		tz->overheated = true;
+		cpufreq_boost_trigger_state(0);
+		if (!tz->polling_delay) {
+			tz->boost_polling = true;
+			tz->polling_delay = 1000;
+		}
+	}
+
 	if (tz->governor)
 		tz->governor->throttle(tz, trip);
 }
@@ -453,6 +463,27 @@ static void thermal_zone_device_check(struct work_struct *work)
 	struct thermal_zone_device *tz = container_of(work, struct
 						      thermal_zone_device,
 						      poll_queue.work);
+	long trip_temp;
+
+	if (cpufreq_boost_supported() && tz->overheated) {
+		tz->ops->get_trip_temp(tz, 0, &trip_temp);
+		/*
+		 * Enable boost again only when current temperature is less
+		 * than 75% of trip_temp[0]
+		 */
+		if ((tz->temperature + (trip_temp >> 2)) < trip_temp) {
+			tz->overheated = false;
+			if (tz->boost_polling) {
+				tz->boost_polling = false;
+				tz->polling_delay = 0;
+				monitor_thermal_zone(tz);
+			}
+
+			cpufreq_boost_trigger_state(1);
+			return;
+		}
+	}
+
 	thermal_zone_device_update(tz);
 }
 
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index a386a1c..f1aa3c2 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -172,6 +172,8 @@ struct thermal_zone_device {
 	int emul_temperature;
 	int passive;
 	unsigned int forced_passive;
+	bool overheated;
+	bool boost_polling;
 	const struct thermal_zone_device_ops *ops;
 	const struct thermal_zone_params *tzp;
 	struct thermal_governor *governor;
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v5 6/7] cpufreq:boost:Kconfig: Enable software managed BOOST support at Kconfig
  2013-07-04  8:50 ` [PATCH v5 " Lukasz Majewski
                     ` (4 preceding siblings ...)
  2013-07-04  8:50   ` [PATCH v5 5/7] thermal:boost: Automatic enable/disable of BOOST feature Lukasz Majewski
@ 2013-07-04  8:50   ` Lukasz Majewski
  2013-07-16  9:58     ` Viresh Kumar
  2013-07-04  8:50   ` [PATCH v5 7/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
  2013-07-09  7:02   ` [PATCH v5 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
  7 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-04  8:50 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski, l.majewski,
	linux-kernel, Andre Przywara, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham

For safety reasons new flag - CONFIG_CPU_FREQ_BOOST_SW has been added.
Only after selecting "CPU frequency BOOST support" Kconfig option the
software managed boost is enabled. It also selects thermal subsystem
to be compiled in. Thermal is necessary for disabling boost and cooling
down the device when overheating detected.

Boost _MUST_NOT_ be enabled without thermal subsystem with properly
defined temperatures, which indicate overheating.

This option doesn't affect x86's ACPI hardware managed boost support
(i.e. Intel, AMD). In this situation boost management is embedded at
hardware.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v5:
- New patch

 drivers/cpufreq/Kconfig          |   14 ++++++++++++++
 drivers/cpufreq/exynos-cpufreq.c |    5 ++++-
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
index 534fcb8..e65a112 100644
--- a/drivers/cpufreq/Kconfig
+++ b/drivers/cpufreq/Kconfig
@@ -23,6 +23,20 @@ config CPU_FREQ_TABLE
 config CPU_FREQ_GOV_COMMON
 	bool
 
+config CPU_FREQ_BOOST_SW
+       bool "CPU frequency overclocking (BOOST)"
+       depends on ARM_EXYNOS_CPUFREQ && EXYNOS_THERMAL
+       default n
+       help
+	 This driver supports software managed overclocking (BOOST).
+         It allows usage of special frequencies for a particular processor
+         if thermal conditions are appropriate.
+
+	 It reguires, for safe operation, thermal framework with properly defined
+         trip points.
+
+	 If in doubt, say N.
+
 config CPU_FREQ_STAT
 	tristate "CPU frequency translation statistics"
 	select CPU_FREQ_TABLE
diff --git a/drivers/cpufreq/exynos-cpufreq.c b/drivers/cpufreq/exynos-cpufreq.c
index 4f42fcc..7586b28 100644
--- a/drivers/cpufreq/exynos-cpufreq.c
+++ b/drivers/cpufreq/exynos-cpufreq.c
@@ -288,7 +288,9 @@ static struct cpufreq_driver exynos_driver = {
 
 static int __init exynos_cpufreq_init(void)
 {
+#ifdef CONFIG_CPU_FREQ_BOOST_SW
 	struct device_node *node = pdev->dev.of_node;
+#endif
 	int ret = -EINVAL;
 
 	exynos_info = kzalloc(sizeof(struct exynos_dvfs_info), GFP_KERNEL);
@@ -319,9 +321,10 @@ static int __init exynos_cpufreq_init(void)
 	}
 
 	locking_frequency = exynos_getspeed(0);
+#ifdef CONFIG_CPU_FREQ_BOOST_SW
 	if (of_property_read_bool(node, "boost_mode"))
 		exynos_driver.boost_supported = 1;
-
+#endif
 	register_pm_notifier(&exynos_cpufreq_nb);
 
 	if (cpufreq_register_driver(&exynos_driver)) {
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v5 7/7] Documentation:cpufreq:boost: Update BOOST documentation
  2013-07-04  8:50 ` [PATCH v5 " Lukasz Majewski
                     ` (5 preceding siblings ...)
  2013-07-04  8:50   ` [PATCH v5 6/7] cpufreq:boost:Kconfig: Enable software managed BOOST support at Kconfig Lukasz Majewski
@ 2013-07-04  8:50   ` Lukasz Majewski
  2013-07-16 10:01     ` Viresh Kumar
  2013-07-09  7:02   ` [PATCH v5 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
  7 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-04  8:50 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski, l.majewski,
	linux-kernel, Andre Przywara, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham

Since the support for software and hardware controlled boosting has been
added, the corresponding Documentation entry had been updated.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v5:
- New patch

 Documentation/cpu-freq/boost.txt |   26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/Documentation/cpu-freq/boost.txt b/Documentation/cpu-freq/boost.txt
index 9b4edfc..dd62e13 100644
--- a/Documentation/cpu-freq/boost.txt
+++ b/Documentation/cpu-freq/boost.txt
@@ -17,8 +17,8 @@ Introduction
 Some CPUs support a functionality to raise the operating frequency of
 some cores in a multi-core package if certain conditions apply, mostly
 if the whole chip is not fully utilized and below it's intended thermal
-budget. This is done without operating system control by a combination
-of hardware and firmware.
+budget. The decision about boost disable/enable is made either at hardware
+(e.g. x86) or software (e.g ARM).
 On Intel CPUs this is called "Turbo Boost", AMD calls it "Turbo-Core",
 in technical documentation "Core performance boost". In Linux we use
 the term "boost" for convenience.
@@ -48,24 +48,24 @@ be desirable:
 User controlled switch
 ----------------------
 
-To allow the user to toggle the boosting functionality, the acpi-cpufreq
-driver exports a sysfs knob to disable it. There is a file:
+To allow the user to toggle the boosting functionality, the cpufreq core
+driver exports a sysfs knob to enable or disable it. There is a file:
 /sys/devices/system/cpu/cpufreq/boost
 which can either read "0" (boosting disabled) or "1" (boosting enabled).
-Reading the file is always supported, even if the processor does not
-support boosting. In this case the file will be read-only and always
-reads as "0". Explicitly changing the permissions and writing to that
-file anyway will return EINVAL.
+The file is exported only when cpufreq driver supports boosting.
+Explicitly changing the permissions and writing to that file anyway will
+return EINVAL.
 
 On supported CPUs one can write either a "0" or a "1" into this file.
 This will either disable the boost functionality on all cores in the
-whole system (0) or will allow the hardware to boost at will (1).
+whole system (0) or will allow the software or hardware to boost at will
+(1).
 
 Writing a "1" does not explicitly boost the system, but just allows the
-CPU (and the firmware) to boost at their discretion. Some implementations
-take external factors like the chip's temperature into account, so
-boosting once does not necessarily mean that it will occur every time
-even using the exact same software setup.
+CPU to boost at their discretion. Some implementations take external
+factors like the chip's temperature into account, so boosting once does
+not necessarily mean that it will occur every time even using the exact
+same software setup.
 
 
 AMD legacy cpb switch
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 5/7] cpufreq: Calculate number of busy CPUs
  2013-07-04  5:06                   ` Viresh Kumar
  2013-07-04  5:43                     ` Lukasz Majewski
@ 2013-07-04 12:50                     ` Rafael J. Wysocki
  1 sibling, 0 replies; 329+ messages in thread
From: Rafael J. Wysocki @ 2013-07-04 12:50 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Lukasz Majewski, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Lukasz Majewski,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Zhang Rui,
	Eduardo Valentin

On Thursday, July 04, 2013 10:36:53 AM Viresh Kumar wrote:
> Hi Lukasz,
> 
> Sorry for being late. Actually I didn't had an answer to your mail
> and wanted to go through it with some fresh mind. This is my
> first mail this morning, lets see if I can bring something good
> into the discussion.
> 
> On 1 July 2013 13:45, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > Does anybody have any idea here? As written above, thermal is suitable
> > to disable boost.
> 
> See, one thing is very clear. User space applications aren't responsible
> for enabling boost again and again. There has to be a internal mechanism
> inside kernel for that.
> 
> > I'd like to bring those three options under discussion:
> >
> > 1. boost attr is always exported -> do not enable boost automatically
> >    when disabled by thermal (as it was proposed at v4).
> 
> So, that's a problem. I see one more solution to that.
> - Create another Macro in cpufreq.c which would contain the time
> after which we will autoenable boost.

Well, how can we tell what time is correct here?  It may depend on factors not
under our control or even variable, like the ambient temperature, so surely
it might not be a hard coded value.

> - So, suppose thermal disabled it due to high temperature (Lets not
> change value of sysfs variable boost_enable, but create another
> variable like: skip_boost: which means skip boost temporarily).

What about "block_boost"?  Other than that, this particular item is a good idea
I think.

> - Thermal would enable this variable skip_boost.
> - Then we will continue to get requests for next frequency and will
> check eveytime if we have exceeded time for autoenabling boost.
> - If yes, then we disable this variable and start boosting again..

I wonder if we could use thermal watermarks instead?  Such that a high
watermark would cause block_boost to be set and a low watermark would cause
it to be reset?  And the thermal layer would be in control of both watermarks?

> - Then thermal can disable it again later.

Thanks,
Rafael


-- 
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* RE: [PATCH v5 5/7] thermal:boost: Automatic enable/disable of BOOST feature
  2013-07-04  8:50   ` [PATCH v5 5/7] thermal:boost: Automatic enable/disable of BOOST feature Lukasz Majewski
@ 2013-07-04 17:19     ` R, Durgadoss
  2013-07-04 20:58       ` Lukasz Majewski
  2013-07-11  8:08     ` Lukasz Majewski
  1 sibling, 1 reply; 329+ messages in thread
From: R, Durgadoss @ 2013-07-04 17:19 UTC (permalink / raw)
  To: Lukasz Majewski, Viresh Kumar, Rafael J. Wysocki, Zhang, Rui,
	Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Myungjoo Ham

Hi Lukasz,

> -----Original Message-----
> From: linux-pm-owner@vger.kernel.org [mailto:linux-pm-
> owner@vger.kernel.org] On Behalf Of Lukasz Majewski
> Sent: Thursday, July 04, 2013 2:20 PM
> To: Viresh Kumar; Rafael J. Wysocki; Zhang, Rui; Eduardo Valentin
> Cc: cpufreq@vger.kernel.org; Linux PM list; Jonghwa Lee; Lukasz Majewski;
> l.majewski@majess.pl; linux-kernel; Andre Przywara; Daniel Lezcano; Kukjin Kim;
> Myungjoo Ham
> Subject: [PATCH v5 5/7] thermal:boost: Automatic enable/disable of BOOST
> feature
> 
> This patch provides auto disable/enable operation for boost. When any
> defined trip point is passed, the boost is disabled.
> In that moment thermal monitor workqueue is woken up and it monitors
> if the device temperature drops below 75% of the smallest trip point.
> When device cools down, the boost is enabled again.
> 
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> 
> ---
> Changes for v5:
> - Move boost disable code from cpu_cooling.c to thermal_core.c
>   (to handle_non_critical_trips)
> - Extent struct thermal_zone_device by adding overheated bool flag
> - Implement auto enable of boost after device cools down
> - Introduce boost_polling flag, which indicates if thermal uses it's predefined
>   pool delay or has woken up thermal workqueue only to wait until device
>   cools down.
> 
> Changes for v4:
> - New patch
> 
>  drivers/thermal/thermal_core.c |   31 +++++++++++++++++++++++++++++++
>  include/linux/thermal.h        |    2 ++
>  2 files changed, 33 insertions(+)
> 
> diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
> index d755440..12adbad 100644
> --- a/drivers/thermal/thermal_core.c
> +++ b/drivers/thermal/thermal_core.c
> @@ -33,6 +33,7 @@
>  #include <linux/idr.h>
>  #include <linux/thermal.h>
>  #include <linux/reboot.h>
> +#include <linux/cpufreq.h>
>  #include <net/netlink.h>
>  #include <net/genetlink.h>
> 
> @@ -326,6 +327,15 @@ static void monitor_thermal_zone(struct
> thermal_zone_device *tz)
>  static void handle_non_critical_trips(struct thermal_zone_device *tz,
>  			int trip, enum thermal_trip_type trip_type)
>  {
> +	if (cpufreq_boost_supported()) {
> +		tz->overheated = true;
> +		cpufreq_boost_trigger_state(0);
> +		if (!tz->polling_delay) {
> +			tz->boost_polling = true;
> +			tz->polling_delay = 1000;
> +		}
> +	}
> +
>  	if (tz->governor)
>  		tz->governor->throttle(tz, trip);
>  }
> @@ -453,6 +463,27 @@ static void thermal_zone_device_check(struct
> work_struct *work)
>  	struct thermal_zone_device *tz = container_of(work, struct
>  						      thermal_zone_device,
>  						      poll_queue.work);
> +	long trip_temp;
> +
> +	if (cpufreq_boost_supported() && tz->overheated) {

Not all thermal drivers support trip points. So, we first need a
if (tz->ops->get_trip_temp) check here.

> +		tz->ops->get_trip_temp(tz, 0, &trip_temp);
> +		/*
> +		 * Enable boost again only when current temperature is less
> +		 * than 75% of trip_temp[0]
> +		 */
> +		if ((tz->temperature + (trip_temp >> 2)) < trip_temp) {

Another way would be to use the get_trend APIs for this thermal zone.
If the trend is cooling we can re-enable boost otherwise not.

> +			tz->overheated = false;
> +			if (tz->boost_polling) {
> +				tz->boost_polling = false;
> +				tz->polling_delay = 0;
> +				monitor_thermal_zone(tz);
> +			}

Overall, I believe this will work well only if the thermal zone is CPU.

Another suggestion is: We tried hard to remove all throttling logic from
thermal_core.c. May be we should include this kind of logic in
step_wise.c ?  Rui/Eduardo: Any thoughts on this ?

Thanks,
Durga
> +
> +			cpufreq_boost_trigger_state(1);
> +			return;
> +		}
> +	}
> +
>  	thermal_zone_device_update(tz);
>  }
> 
> diff --git a/include/linux/thermal.h b/include/linux/thermal.h
> index a386a1c..f1aa3c2 100644
> --- a/include/linux/thermal.h
> +++ b/include/linux/thermal.h
> @@ -172,6 +172,8 @@ struct thermal_zone_device {
>  	int emul_temperature;
>  	int passive;
>  	unsigned int forced_passive;
> +	bool overheated;
> +	bool boost_polling;
>  	const struct thermal_zone_device_ops *ops;
>  	const struct thermal_zone_params *tzp;
>  	struct thermal_governor *governor;
> --
> 1.7.10.4
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-pm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 5/7] thermal:boost: Automatic enable/disable of BOOST feature
  2013-07-04 17:19     ` R, Durgadoss
@ 2013-07-04 20:58       ` Lukasz Majewski
  2013-07-05  5:31         ` R, Durgadoss
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-04 20:58 UTC (permalink / raw)
  To: R, Durgadoss
  Cc: Lukasz Majewski, Viresh Kumar, Rafael J. Wysocki, Zhang, Rui,
	Eduardo Valentin, cpufreq, Linux PM list, Jonghwa Lee,
	linux-kernel, Andre Przywara, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham

On Thu, 4 Jul 2013 17:19:04 +0000
"R, Durgadoss" <durgadoss.r@intel.com> wrote:
Hi,

> Hi Lukasz,
> 
> > -----Original Message-----
> > From: linux-pm-owner@vger.kernel.org [mailto:linux-pm-
> > owner@vger.kernel.org] On Behalf Of Lukasz Majewski
> > Sent: Thursday, July 04, 2013 2:20 PM
> > To: Viresh Kumar; Rafael J. Wysocki; Zhang, Rui; Eduardo Valentin
> > Cc: cpufreq@vger.kernel.org; Linux PM list; Jonghwa Lee; Lukasz
> > Majewski; l.majewski@majess.pl; linux-kernel; Andre Przywara;
> > Daniel Lezcano; Kukjin Kim; Myungjoo Ham
> > Subject: [PATCH v5 5/7] thermal:boost: Automatic enable/disable of
> > BOOST feature
> > 
> > This patch provides auto disable/enable operation for boost. When
> > any defined trip point is passed, the boost is disabled.
> > In that moment thermal monitor workqueue is woken up and it monitors
> > if the device temperature drops below 75% of the smallest trip
> > point. When device cools down, the boost is enabled again.
> > 
> > Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> > Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> > 
> > ---
> > Changes for v5:
> > - Move boost disable code from cpu_cooling.c to thermal_core.c
> >   (to handle_non_critical_trips)
> > - Extent struct thermal_zone_device by adding overheated bool flag
> > - Implement auto enable of boost after device cools down
> > - Introduce boost_polling flag, which indicates if thermal uses
> > it's predefined pool delay or has woken up thermal workqueue only
> > to wait until device cools down.
> > 
> > Changes for v4:
> > - New patch
> > 
> >  drivers/thermal/thermal_core.c |   31
> > +++++++++++++++++++++++++++++++ include/linux/thermal.h        |
> > 2 ++ 2 files changed, 33 insertions(+)
> > 
> > diff --git a/drivers/thermal/thermal_core.c
> > b/drivers/thermal/thermal_core.c index d755440..12adbad 100644
> > --- a/drivers/thermal/thermal_core.c
> > +++ b/drivers/thermal/thermal_core.c
> > @@ -33,6 +33,7 @@
> >  #include <linux/idr.h>
> >  #include <linux/thermal.h>
> >  #include <linux/reboot.h>
> > +#include <linux/cpufreq.h>
> >  #include <net/netlink.h>
> >  #include <net/genetlink.h>
> > 
> > @@ -326,6 +327,15 @@ static void monitor_thermal_zone(struct
> > thermal_zone_device *tz)
> >  static void handle_non_critical_trips(struct thermal_zone_device
> > *tz, int trip, enum thermal_trip_type trip_type)
> >  {
> > +	if (cpufreq_boost_supported()) {
> > +		tz->overheated = true;
> > +		cpufreq_boost_trigger_state(0);
> > +		if (!tz->polling_delay) {
> > +			tz->boost_polling = true;
> > +			tz->polling_delay = 1000;
> > +		}
> > +	}
> > +
> >  	if (tz->governor)
> >  		tz->governor->throttle(tz, trip);
> >  }
> > @@ -453,6 +463,27 @@ static void thermal_zone_device_check(struct
> > work_struct *work)
> >  	struct thermal_zone_device *tz = container_of(work, struct
> >  						      thermal_zone_device,
> >  						      poll_queue.work);
> > +	long trip_temp;
> > +
> > +	if (cpufreq_boost_supported() && tz->overheated) {
> 
> Not all thermal drivers support trip points. So, we first need a
> if (tz->ops->get_trip_temp) check here.

Ok, thanks for tip. Bluntly speaking, I thought, that all SoCs supported
by thermal set trip points.

> 
> > +		tz->ops->get_trip_temp(tz, 0, &trip_temp);
> > +		/*
> > +		 * Enable boost again only when current
> > temperature is less
> > +		 * than 75% of trip_temp[0]
> > +		 */
> > +		if ((tz->temperature + (trip_temp >> 2)) <
> > trip_temp) {
> 
> Another way would be to use the get_trend APIs for this thermal zone.
> If the trend is cooling we can re-enable boost otherwise not.

Trend evaluation seems like a good complementary idea.

However, I would also like to have the relative temperature drop
measurement (if possible) like above (to 75% of the first trip point).

Then I would be more confident, that everything cooled down and that I
can start boost again.

> 
> > +			tz->overheated = false;
> > +			if (tz->boost_polling) {
> > +				tz->boost_polling = false;
> > +				tz->polling_delay = 0;
> > +				monitor_thermal_zone(tz);
> > +			}
> 
> Overall, I believe this will work well only if the thermal zone is
> CPU.

My assumption:

When I enable boost at CPU, then I also shall cool down the CPU. And
the CPU zone seemed a natural choice. 

However I might be missing something, so hints are welcome.

> 
> Another suggestion is: We tried hard to remove all throttling logic
> from thermal_core.c.

By throttling logic you mean:
if ((tz->temperature + (trip_temp >> 2)) and other conditions (like
trend measurement)?

> May be we should include this kind of logic in
> step_wise.c ?  

It sounds interesting (since ->throttle at thermal_core.c is called
always when needed), but I'm afraid of a code duplication when one
use Boost with fair_share or other thermal governor.

> Rui/Eduardo: Any thoughts on this ?
> 
> Thanks,
> Durga
> > +
> > +			cpufreq_boost_trigger_state(1);
> > +			return;
> > +		}
> > +	}
> > +
> >  	thermal_zone_device_update(tz);
> >  }
> > 
> > diff --git a/include/linux/thermal.h b/include/linux/thermal.h
> > index a386a1c..f1aa3c2 100644
> > --- a/include/linux/thermal.h
> > +++ b/include/linux/thermal.h
> > @@ -172,6 +172,8 @@ struct thermal_zone_device {
> >  	int emul_temperature;
> >  	int passive;
> >  	unsigned int forced_passive;
> > +	bool overheated;
> > +	bool boost_polling;
> >  	const struct thermal_zone_device_ops *ops;
> >  	const struct thermal_zone_params *tzp;
> >  	struct thermal_governor *governor;
> > --
> > 1.7.10.4
> > 
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-pm"
> > in the body of a message to majordomo@vger.kernel.org
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html


^ permalink raw reply	[flat|nested] 329+ messages in thread

* RE: [PATCH v5 5/7] thermal:boost: Automatic enable/disable of BOOST feature
  2013-07-04 20:58       ` Lukasz Majewski
@ 2013-07-05  5:31         ` R, Durgadoss
  2013-07-05  6:43           ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: R, Durgadoss @ 2013-07-05  5:31 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Lukasz Majewski, Viresh Kumar, Rafael J. Wysocki, Zhang, Rui,
	Eduardo Valentin, cpufreq, Linux PM list, Jonghwa Lee,
	linux-kernel, Andre Przywara, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham

Hi Lukasz,

> -----Original Message-----
> From: Lukasz Majewski [mailto:l.majewski@majess.pl]
> Sent: Friday, July 05, 2013 2:28 AM
> To: R, Durgadoss
> Cc: Lukasz Majewski; Viresh Kumar; Rafael J. Wysocki; Zhang, Rui; Eduardo
> Valentin; cpufreq@vger.kernel.org; Linux PM list; Jonghwa Lee; linux-kernel;
> Andre Przywara; Daniel Lezcano; Kukjin Kim; Myungjoo Ham
> Subject: Re: [PATCH v5 5/7] thermal:boost: Automatic enable/disable of BOOST
> feature
> 
> On Thu, 4 Jul 2013 17:19:04 +0000
> "R, Durgadoss" <durgadoss.r@intel.com> wrote:
> Hi,
> 

[Cut.]

> > > @@ -326,6 +327,15 @@ static void monitor_thermal_zone(struct
> > > thermal_zone_device *tz)
> > >  static void handle_non_critical_trips(struct thermal_zone_device
> > > *tz, int trip, enum thermal_trip_type trip_type)
> > >  {
> > > +	if (cpufreq_boost_supported()) {
> > > +		tz->overheated = true;
> > > +		cpufreq_boost_trigger_state(0);
> > > +		if (!tz->polling_delay) {
> > > +			tz->boost_polling = true;
> > > +			tz->polling_delay = 1000;
> > > +		}
> > > +	}
> > > +
> > >  	if (tz->governor)
> > >  		tz->governor->throttle(tz, trip);
> > >  }
> > > @@ -453,6 +463,27 @@ static void thermal_zone_device_check(struct
> > > work_struct *work)
> > >  	struct thermal_zone_device *tz = container_of(work, struct
> > >  						      thermal_zone_device,
> > >  						      poll_queue.work);
> > > +	long trip_temp;
> > > +
> > > +	if (cpufreq_boost_supported() && tz->overheated) {
> >
> > Not all thermal drivers support trip points. So, we first need a
> > if (tz->ops->get_trip_temp) check here.
> 
> Ok, thanks for tip. Bluntly speaking, I thought, that all SoCs supported
> by thermal set trip points.

We would wish to get there. But not the reality today ;)

> 
> >
> > > +		tz->ops->get_trip_temp(tz, 0, &trip_temp);
> > > +		/*
> > > +		 * Enable boost again only when current
> > > temperature is less
> > > +		 * than 75% of trip_temp[0]
> > > +		 */
> > > +		if ((tz->temperature + (trip_temp >> 2)) <
> > > trip_temp) {
> >
> > Another way would be to use the get_trend APIs for this thermal zone.
> > If the trend is cooling we can re-enable boost otherwise not.
> 
> Trend evaluation seems like a good complementary idea.
> 
> However, I would also like to have the relative temperature drop
> measurement (if possible) like above (to 75% of the first trip point).
> 
> Then I would be more confident, that everything cooled down and that I
> can start boost again.
> 
> >
> > > +			tz->overheated = false;
> > > +			if (tz->boost_polling) {
> > > +				tz->boost_polling = false;
> > > +				tz->polling_delay = 0;
> > > +				monitor_thermal_zone(tz);
> > > +			}
> >
> > Overall, I believe this will work well only if the thermal zone is
> > CPU.
> 
> My assumption:
> 
> When I enable boost at CPU, then I also shall cool down the CPU. And
> the CPU zone seemed a natural choice.
> 
> However I might be missing something, so hints are welcome.
> 
> >
> > Another suggestion is: We tried hard to remove all throttling logic
> > from thermal_core.c.
> 
> By throttling logic you mean:
> if ((tz->temperature + (trip_temp >> 2)) and other conditions (like
> trend measurement)?

Yes. That is correct.

> 
> > May be we should include this kind of logic in
> > step_wise.c ?
> 
> It sounds interesting (since ->throttle at thermal_core.c is called
> always when needed), but I'm afraid of a code duplication when one
> use Boost with fair_share or other thermal governor.

right. So, for the time being, (as part of this patch series)
I am Okay to have this code in thermal_core.c. From the thermal
subsystem perspective, we will (need to) work out a better/
cleaner/easier approach for this later.

Thanks,
Durga


^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 5/7] thermal:boost: Automatic enable/disable of BOOST feature
  2013-07-05  5:31         ` R, Durgadoss
@ 2013-07-05  6:43           ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-05  6:43 UTC (permalink / raw)
  To: R, Durgadoss
  Cc: Lukasz Majewski, Viresh Kumar, Rafael J. Wysocki, Zhang, Rui,
	Eduardo Valentin, cpufreq, Linux PM list, Jonghwa Lee,
	linux-kernel, Andre Przywara, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham

On Fri, 05 Jul 2013 05:31:42 +0000, R, Durgadoss wrote:
Hi Durga,

> Hi Lukasz,
> 
> > -----Original Message-----
> > From: Lukasz Majewski [mailto:l.majewski@majess.pl]
> > Sent: Friday, July 05, 2013 2:28 AM
> > To: R, Durgadoss
> > Cc: Lukasz Majewski; Viresh Kumar; Rafael J. Wysocki; Zhang, Rui;
> > Eduardo Valentin; cpufreq@vger.kernel.org; Linux PM list; Jonghwa
> > Lee; linux-kernel; Andre Przywara; Daniel Lezcano; Kukjin Kim;
> > Myungjoo Ham Subject: Re: [PATCH v5 5/7] thermal:boost: Automatic
> > enable/disable of BOOST feature
> > 
> > On Thu, 4 Jul 2013 17:19:04 +0000
> > "R, Durgadoss" <durgadoss.r@intel.com> wrote:
> > Hi,
> > 
> 
> [Cut.]
> 
> > > > @@ -326,6 +327,15 @@ static void monitor_thermal_zone(struct
> > > > thermal_zone_device *tz)
> > > >  static void handle_non_critical_trips(struct
> > > > thermal_zone_device *tz, int trip, enum thermal_trip_type
> > > > trip_type) {
> > > > +	if (cpufreq_boost_supported()) {
> > > > +		tz->overheated = true;
> > > > +		cpufreq_boost_trigger_state(0);
> > > > +		if (!tz->polling_delay) {
> > > > +			tz->boost_polling = true;
> > > > +			tz->polling_delay = 1000;
> > > > +		}
> > > > +	}
> > > > +
> > > >  	if (tz->governor)
> > > >  		tz->governor->throttle(tz, trip);
> > > >  }
> > > > @@ -453,6 +463,27 @@ static void
> > > > thermal_zone_device_check(struct work_struct *work)
> > > >  	struct thermal_zone_device *tz = container_of(work,
> > > > struct thermal_zone_device,
> > > >  						      poll_queue.work);
> > > > +	long trip_temp;
> > > > +
> > > > +	if (cpufreq_boost_supported() && tz->overheated) {
> > >
> > > Not all thermal drivers support trip points. So, we first need a
> > > if (tz->ops->get_trip_temp) check here.
> > 
> > Ok, thanks for tip. Bluntly speaking, I thought, that all SoCs
> > supported by thermal set trip points.
> 
> We would wish to get there. But not the reality today ;)

Ok, I see :-).

> 
> > 
> > >
> > > > +		tz->ops->get_trip_temp(tz, 0, &trip_temp);
> > > > +		/*
> > > > +		 * Enable boost again only when current
> > > > temperature is less
> > > > +		 * than 75% of trip_temp[0]
> > > > +		 */
> > > > +		if ((tz->temperature + (trip_temp >> 2)) <
> > > > trip_temp) {
> > >
> > > Another way would be to use the get_trend APIs for this thermal
> > > zone. If the trend is cooling we can re-enable boost otherwise
> > > not.
> > 
> > Trend evaluation seems like a good complementary idea.
> > 
> > However, I would also like to have the relative temperature drop
> > measurement (if possible) like above (to 75% of the first trip
> > point).
> > 
> > Then I would be more confident, that everything cooled down and
> > that I can start boost again.
> > 
> > >
> > > > +			tz->overheated = false;
> > > > +			if (tz->boost_polling) {
> > > > +				tz->boost_polling = false;
> > > > +				tz->polling_delay = 0;
> > > > +				monitor_thermal_zone(tz);
> > > > +			}
> > >
> > > Overall, I believe this will work well only if the thermal zone is
> > > CPU.
> > 
> > My assumption:
> > 
> > When I enable boost at CPU, then I also shall cool down the CPU. And
> > the CPU zone seemed a natural choice.
> > 
> > However I might be missing something, so hints are welcome.
> > 
> > >
> > > Another suggestion is: We tried hard to remove all throttling
> > > logic from thermal_core.c.
> > 
> > By throttling logic you mean:
> > if ((tz->temperature + (trip_temp >> 2)) and other conditions (like
> > trend measurement)?
> 
> Yes. That is correct.

Ok.

> 
> > 
> > > May be we should include this kind of logic in
> > > step_wise.c ?
> > 
> > It sounds interesting (since ->throttle at thermal_core.c is called
> > always when needed), but I'm afraid of a code duplication when one
> > use Boost with fair_share or other thermal governor.
> 
> right. So, for the time being, (as part of this patch series)
> I am Okay to have this code in thermal_core.c. From the thermal
> subsystem perspective, we will (need to) work out a better/
> cleaner/easier approach for this later.

Thanks for understanding. I'm going to embed the trend checking in the
next version of this patch (to be more confident that I can reenable
boost).

> 
> Thanks,
> Durga
> 


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 0/7] cpufreq:boost: CPU Boost mode support
  2013-07-04  8:50 ` [PATCH v5 " Lukasz Majewski
                     ` (6 preceding siblings ...)
  2013-07-04  8:50   ` [PATCH v5 7/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
@ 2013-07-09  7:02   ` Lukasz Majewski
  2013-07-09  7:04     ` Viresh Kumar
  2013-07-16  7:26     ` Lukasz Majewski
  7 siblings, 2 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-09  7:02 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki
  Cc: Lukasz Majewski, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Myungjoo Ham

On Thu, 04 Jul 2013 10:50:23 +0200, Lukasz Majewski wrote:

Dear Viresh, Rafael

Do you have any comments/feedback for me regarding those patches?

> This patch series introduces support for CPU overclocking technique
> called Boost.
> 
> It is a follow up of a LAB governor proposal. Boost is a LAB
> component:
> http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq
> 
> Boost unifies hardware based solution (e.g. Intel Nehalem) with
> software oriented one (like the one done at Exynos).
> For this reason cpufreq/freq_table code has been reorganized to
> include common code.
> 
> Important design decisions:
> 
> - Boost related code is compiled-in unconditionally to cpufreq core
> and disabled by default. The cpufreq_driver is responsibile for
> setting boost_supported flag and providing enable_boost callback(if
> HW support is needed). For software managed boost, special Kconfig
> flag - CONFIG_CPU_FREQ_BOOST_SW has been defined. It will be
> selectable only when a target platform has thermal framework properly
> configured.
> 
> - struct cpufreq_driver has been extended with boost related fields:
>         -- boost_supported - when driver supports boosting
>         -- enable_boost - callback to function, which is necessary to
>            enable boost
> 
> - Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost) is
> visible _only_ when cpufreq driver supports Boost.
> 
> - No special spin_lock for Boost was created. The one from cpufreq
> core was reused.
> 
> - All available policies are now stored in a list.
> 
> - The Boost code doesn't rely on any policy. When boost state is
> changed, then the policy list is iterated and proper adjustements are
> done.
> 
> - To improve safety level, the thermal framework is also extended to
> disable software boosting, when thermal trip point is reached. Then
> it starts monitoring of target temperature to evaluate if boost can
> be enabled again. This emulates behaviour similar to HW managed boost
> (like x86)
> 
> New patches for v5:
> cpufreq:boost:Kconfig: Enable software managed BOOST support at
> Kconfig Documentation:cpufreq:boost: Update BOOST documentation
> 
> Patches dropped at v5:
> cpufreq: Calculate number of busy CPUs
> cpufreq: Enable software boost only when up to one busy core is
> running
> 
> Tested at: HW:
>         Exynos 4412 3.10 linux
>         Exynos 4210 3.10 linux
> Compile tested x86_64 defconfig (acpi) - help with HW (Intel Nehalem)
> test needed
> 
> The code has been rebased on top of kernel_pm/bleeding-edge (3.11-rc1)
> 
> 
> Lukasz Majewski (7):
>   cpufreq: Store cpufreq policies in a list
>   cpufreq: Add boost frequency support in core
>   cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common
>     boost solution
>   cpufreq:exynos:Extend Exynos cpufreq driver to support boost
>     framework
>   thermal:boost: Automatic enable/disable of BOOST feature
>   cpufreq:boost:Kconfig: Enable software managed BOOST support at
>     Kconfig
>   Documentation:cpufreq:boost: Update BOOST documentation
> 
>  Documentation/cpu-freq/boost.txt |   26 ++++-----
>  drivers/cpufreq/Kconfig          |   14 +++++
>  drivers/cpufreq/acpi-cpufreq.c   |   69 +++++++----------------
>  drivers/cpufreq/cpufreq.c        |  115
> ++++++++++++++++++++++++++++++++++++++
> drivers/cpufreq/exynos-cpufreq.c |    9 ++-
> drivers/cpufreq/freq_table.c     |   47 +++++++++++++---
> drivers/thermal/thermal_core.c   |   31 ++++++++++
> include/linux/cpufreq.h          |   13 +++++
> include/linux/thermal.h          |    2 + 9 files changed, 257
> insertions(+), 69 deletions(-)
> 


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 0/7] cpufreq:boost: CPU Boost mode support
  2013-07-09  7:02   ` [PATCH v5 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
@ 2013-07-09  7:04     ` Viresh Kumar
  2013-07-16  7:26     ` Lukasz Majewski
  1 sibling, 0 replies; 329+ messages in thread
From: Viresh Kumar @ 2013-07-09  7:04 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Myungjoo Ham

On 9 July 2013 12:32, Lukasz Majewski <l.majewski@samsung.com> wrote:
> On Thu, 04 Jul 2013 10:50:23 +0200, Lukasz Majewski wrote:
>
> Dear Viresh, Rafael
>
> Do you have any comments/feedback for me regarding those patches?

I am busy in Linaro connect this week, but will see if I can get
some time to go over these.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 5/7] thermal:boost: Automatic enable/disable of BOOST feature
  2013-07-04  8:50   ` [PATCH v5 5/7] thermal:boost: Automatic enable/disable of BOOST feature Lukasz Majewski
  2013-07-04 17:19     ` R, Durgadoss
@ 2013-07-11  8:08     ` Lukasz Majewski
  2013-07-16  7:28       ` Lukasz Majewski
  1 sibling, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-11  8:08 UTC (permalink / raw)
  To: Zhang Rui, Eduardo Valentin
  Cc: Lukasz Majewski, Viresh Kumar, Rafael J. Wysocki, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel, R,
	Durgadoss, Myungjoo Ham

Dear Zhang, Eduardo

Do you have any comments/feedback for me regarding this thermal
framework related patch?

I've already received some feedback from Durga for this patch, but I
think that maintainers are most welcome to express their opinion :-)

Thanks in advance.

> This patch provides auto disable/enable operation for boost. When any
> defined trip point is passed, the boost is disabled.
> In that moment thermal monitor workqueue is woken up and it monitors
> if the device temperature drops below 75% of the smallest trip point.
> When device cools down, the boost is enabled again.
> 
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> 
> ---
> Changes for v5:
> - Move boost disable code from cpu_cooling.c to thermal_core.c
>   (to handle_non_critical_trips)
> - Extent struct thermal_zone_device by adding overheated bool flag
> - Implement auto enable of boost after device cools down
> - Introduce boost_polling flag, which indicates if thermal uses it's
> predefined pool delay or has woken up thermal workqueue only to wait
> until device cools down.
> 
> Changes for v4:
> - New patch
> 
>  drivers/thermal/thermal_core.c |   31 +++++++++++++++++++++++++++++++
>  include/linux/thermal.h        |    2 ++
>  2 files changed, 33 insertions(+)
> 
> diff --git a/drivers/thermal/thermal_core.c
> b/drivers/thermal/thermal_core.c index d755440..12adbad 100644
> --- a/drivers/thermal/thermal_core.c
> +++ b/drivers/thermal/thermal_core.c
> @@ -33,6 +33,7 @@
>  #include <linux/idr.h>
>  #include <linux/thermal.h>
>  #include <linux/reboot.h>
> +#include <linux/cpufreq.h>
>  #include <net/netlink.h>
>  #include <net/genetlink.h>
>  
> @@ -326,6 +327,15 @@ static void monitor_thermal_zone(struct
> thermal_zone_device *tz) static void handle_non_critical_trips(struct
> thermal_zone_device *tz, int trip, enum thermal_trip_type trip_type)
>  {
> +	if (cpufreq_boost_supported()) {
> +		tz->overheated = true;
> +		cpufreq_boost_trigger_state(0);
> +		if (!tz->polling_delay) {
> +			tz->boost_polling = true;
> +			tz->polling_delay = 1000;
> +		}
> +	}
> +
>  	if (tz->governor)
>  		tz->governor->throttle(tz, trip);
>  }
> @@ -453,6 +463,27 @@ static void thermal_zone_device_check(struct
> work_struct *work) struct thermal_zone_device *tz =
> container_of(work, struct thermal_zone_device,
>  						      poll_queue.work);
> +	long trip_temp;
> +
> +	if (cpufreq_boost_supported() && tz->overheated) {
> +		tz->ops->get_trip_temp(tz, 0, &trip_temp);
> +		/*
> +		 * Enable boost again only when current temperature
> is less
> +		 * than 75% of trip_temp[0]
> +		 */
> +		if ((tz->temperature + (trip_temp >> 2)) <
> trip_temp) {
> +			tz->overheated = false;
> +			if (tz->boost_polling) {
> +				tz->boost_polling = false;
> +				tz->polling_delay = 0;
> +				monitor_thermal_zone(tz);
> +			}
> +
> +			cpufreq_boost_trigger_state(1);
> +			return;
> +		}
> +	}
> +
>  	thermal_zone_device_update(tz);
>  }
>  
> diff --git a/include/linux/thermal.h b/include/linux/thermal.h
> index a386a1c..f1aa3c2 100644
> --- a/include/linux/thermal.h
> +++ b/include/linux/thermal.h
> @@ -172,6 +172,8 @@ struct thermal_zone_device {
>  	int emul_temperature;
>  	int passive;
>  	unsigned int forced_passive;
> +	bool overheated;
> +	bool boost_polling;
>  	const struct thermal_zone_device_ops *ops;
>  	const struct thermal_zone_params *tzp;
>  	struct thermal_governor *governor;


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 0/7] cpufreq:boost: CPU Boost mode support
  2013-07-09  7:02   ` [PATCH v5 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
  2013-07-09  7:04     ` Viresh Kumar
@ 2013-07-16  7:26     ` Lukasz Majewski
  2013-07-16  8:46       ` Viresh Kumar
  1 sibling, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-16  7:26 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki
  Cc: Lukasz Majewski, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Myungjoo Ham

Dear Viresh, Rafael,

> On Thu, 04 Jul 2013 10:50:23 +0200, Lukasz Majewski wrote:
> 
> Dear Viresh, Rafael
> 
> Do you have any comments/feedback for me regarding those patches?
> 

Will you find time to review version 5 of cpufreq boost patch series?



-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 5/7] thermal:boost: Automatic enable/disable of BOOST feature
  2013-07-11  8:08     ` Lukasz Majewski
@ 2013-07-16  7:28       ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-16  7:28 UTC (permalink / raw)
  To: Zhang Rui, Eduardo Valentin
  Cc: Lukasz Majewski, Viresh Kumar, Rafael J. Wysocki, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel, R,
	Durgadoss, Myungjoo Ham

Dear Zhang, Eduardo,

> Dear Zhang, Eduardo
> 
> Do you have any comments/feedback for me regarding this thermal
> framework related patch?
> 
> I've already received some feedback from Durga for this patch, but I
> think that maintainers are most welcome to express their opinion :-)
> 

Will you find time to give me the feedback about proposed changes to
thermal_core.c regarding the cpufreq boost support?

> Thanks in advance.
> 


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 0/7] cpufreq:boost: CPU Boost mode support
  2013-07-16  7:26     ` Lukasz Majewski
@ 2013-07-16  8:46       ` Viresh Kumar
  2013-07-16  9:09         ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-07-16  8:46 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Myungjoo Ham

On 16 July 2013 12:56, Lukasz Majewski <l.majewski@samsung.com> wrote:
> Dear Viresh, Rafael,
>
>> On Thu, 04 Jul 2013 10:50:23 +0200, Lukasz Majewski wrote:
>>
>> Dear Viresh, Rafael
>>
>> Do you have any comments/feedback for me regarding those patches?
>>
>
> Will you find time to review version 5 of cpufreq boost patch series?

This is a request or an order ?? :)

Yes, I have still kept these mails in my todo list.. Don't worry they wouldn't
be missed.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 1/7] cpufreq: Store cpufreq policies in a list
  2013-07-04  8:50   ` [PATCH v5 1/7] cpufreq: Store cpufreq policies in a list Lukasz Majewski
@ 2013-07-16  8:51     ` Viresh Kumar
  2013-07-16  9:39       ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-07-16  8:51 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Myungjoo Ham

On 4 July 2013 14:20, Lukasz Majewski <l.majewski@samsung.com> wrote:
> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c

> @@ -2056,6 +2058,7 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
>         subsys_interface_unregister(&cpufreq_interface);
>         unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
>
> +       list_del(&cpufreq_policy_list);

You can't delete the list this way... You must have passed the list
entry you wanted to delete. More precisely link from the struct
cpufreq_policy.

Over that, it shouldn't be done at the time of unregistering cpufreq
driver but as and when cpus are removed and _cpu_remove_dev
is called.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 0/7] cpufreq:boost: CPU Boost mode support
  2013-07-16  8:46       ` Viresh Kumar
@ 2013-07-16  9:09         ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-16  9:09 UTC (permalink / raw)
  To: Viresh Kumar; +Cc: cpufreq

Hi Viresh,

> On 16 July 2013 12:56, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > Dear Viresh, Rafael,
> >
> >> On Thu, 04 Jul 2013 10:50:23 +0200, Lukasz Majewski wrote:
> >>
> >> Dear Viresh, Rafael
> >>
> >> Do you have any comments/feedback for me regarding those patches?
> >>
> >
> > Will you find time to review version 5 of cpufreq boost patch
> > series?
> 
> This is a request or an order ?? :)

It was a very polite order :-)

> 
> Yes, I have still kept these mails in my todo list.. Don't worry they
> wouldn't be missed.

OK

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 1/7] cpufreq: Store cpufreq policies in a list
  2013-07-16  8:51     ` Viresh Kumar
@ 2013-07-16  9:39       ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-16  9:39 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Myungjoo Ham

On Tue, 16 Jul 2013 10:51:27 +0200 Viresh Kumar wrote,
> On 4 July 2013 14:20, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> 
> > @@ -2056,6 +2058,7 @@ int cpufreq_unregister_driver(struct
> > cpufreq_driver *driver)
> > subsys_interface_unregister(&cpufreq_interface);
> > unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
> >
> > +       list_del(&cpufreq_policy_list);
> 
> You can't delete the list this way... You must have passed the list
> entry you wanted to delete. More precisely link from the struct
> cpufreq_policy.

Yes. I shouldn't delete statically defined head of the list. Thanks for
spotting.

> 
> Over that, it shouldn't be done at the time of unregistering cpufreq
> driver but as and when cpus are removed and _cpu_remove_dev
> is called.

OK, I will iterate the list at __cpufreq_remove_dev() and remove each
of them there.

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 2/7] cpufreq: Add boost frequency support in core
  2013-07-04  8:50   ` [PATCH v5 2/7] cpufreq: Add boost frequency support in core Lukasz Majewski
@ 2013-07-16  9:41     ` Viresh Kumar
  2013-07-16 12:06       ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-07-16  9:41 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Myungjoo Ham

On 4 July 2013 14:20, Lukasz Majewski <l.majewski@samsung.com> wrote:
> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c

> +int cpufreq_boost_trigger_state(int state)
> +{
> +       unsigned long flags;
> +       int ret = 0;
> +
> +       if (boost_enabled != state) {
> +               write_lock_irqsave(&cpufreq_driver_lock, flags);
> +               boost_enabled = state;
> +
> +               ret = cpufreq_driver->enable_boost(state);
> +               if (ret)
> +                       boost_enabled = 0;
> +
> +               write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> +
> +               if (ret)
> +                       pr_err("%s: BOOST cannot enable (%d)\n",

Who said we are enabling it?

> +                              __func__, ret);
> +       }
> +
> +       return ret;
> +}
> +
> +int cpufreq_boost_supported(void)
> +{
> +       if (cpufreq_driver)
> +               return cpufreq_driver->boost_supported;
> +
> +       return 0;
> +}
> +EXPORT_SYMBOL_GPL(cpufreq_boost_supported);
> +
> +int cpufreq_boost_enabled(void)
> +{
> +       return boost_enabled;
> +}
> +EXPORT_SYMBOL_GPL(cpufreq_boost_enabled);
> +
> +void cpufreq_set_boost_enabled(int state)

Maybe cpufreq_block_boost? As suggested by Rafael.

> +{
> +       boost_enabled = state;
> +}
> +EXPORT_SYMBOL_GPL(cpufreq_set_boost_enabled);
> +
> +/*********************************************************************
>   *               REGISTER / UNREGISTER CPUFREQ DRIVER                *
>   *********************************************************************/
>
> @@ -2001,6 +2094,22 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
>         cpufreq_driver = driver_data;
>         write_unlock_irqrestore(&cpufreq_driver_lock, flags);
>
> +       if (cpufreq_driver->boost_supported) {
> +               /*
> +                * Check if boost driver provides function to enable boost -
> +                * if not, use cpufreq_boost_enable_sw as default
> +                */
> +               if (!cpufreq_driver->enable_boost)
> +                       cpufreq_driver->enable_boost = &cpufreq_boost_enable_sw;

& is redundant.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework
  2013-07-04  8:50   ` [PATCH v5 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
@ 2013-07-16  9:48     ` Viresh Kumar
  2013-07-16 10:58       ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-07-16  9:48 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Myungjoo Ham

On 4 July 2013 14:20, Lukasz Majewski <l.majewski@samsung.com> wrote:
> The struct cpufreq_driver has been extended to embrace the information
> related to boost support.
>
> When "boost_mode" device tree attribute is defined for a platform, the
> boost_supported flag is set. Moreover boost related attributes were
> exported.
>
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

Don't we need to mark any frequencies in the freq table with BOOST?
How?

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 6/7] cpufreq:boost:Kconfig: Enable software managed BOOST support at Kconfig
  2013-07-04  8:50   ` [PATCH v5 6/7] cpufreq:boost:Kconfig: Enable software managed BOOST support at Kconfig Lukasz Majewski
@ 2013-07-16  9:58     ` Viresh Kumar
  2013-07-16 11:50       ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-07-16  9:58 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Myungjoo Ham

On 4 July 2013 14:20, Lukasz Majewski <l.majewski@samsung.com> wrote:
> diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig

> +config CPU_FREQ_BOOST_SW
> +       bool "CPU frequency overclocking (BOOST)"

Name it "CPU Frequency Overclocking - Software"

> +       depends on ARM_EXYNOS_CPUFREQ && EXYNOS_THERMAL

Remote Exynos from here. If you want to enable it for your platform by
default, then select it from EXYNOS.

> +       default n
> +       help
> +        This driver supports software managed overclocking (BOOST).
> +         It allows usage of special frequencies for a particular processor
> +         if thermal conditions are appropriate.
> +
> +        It reguires, for safe operation, thermal framework with properly defined
> +         trip points.
> +
> +        If in doubt, say N.
> +
>  config CPU_FREQ_STAT
>         tristate "CPU frequency translation statistics"
>         select CPU_FREQ_TABLE
> diff --git a/drivers/cpufreq/exynos-cpufreq.c b/drivers/cpufreq/exynos-cpufreq.c
> index 4f42fcc..7586b28 100644
> --- a/drivers/cpufreq/exynos-cpufreq.c
> +++ b/drivers/cpufreq/exynos-cpufreq.c
> @@ -288,7 +288,9 @@ static struct cpufreq_driver exynos_driver = {
>
>  static int __init exynos_cpufreq_init(void)
>  {
> +#ifdef CONFIG_CPU_FREQ_BOOST_SW
>         struct device_node *node = pdev->dev.of_node;
> +#endif
>         int ret = -EINVAL;
>
>         exynos_info = kzalloc(sizeof(struct exynos_dvfs_info), GFP_KERNEL);
> @@ -319,9 +321,10 @@ static int __init exynos_cpufreq_init(void)
>         }
>
>         locking_frequency = exynos_getspeed(0);
> +#ifdef CONFIG_CPU_FREQ_BOOST_SW
>         if (of_property_read_bool(node, "boost_mode"))
>                 exynos_driver.boost_supported = 1;
> -
> +#endif

Add a blank line here.

>         register_pm_notifier(&exynos_cpufreq_nb);
>
>         if (cpufreq_register_driver(&exynos_driver)) {
> --
> 1.7.10.4
>

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 7/7] Documentation:cpufreq:boost: Update BOOST documentation
  2013-07-04  8:50   ` [PATCH v5 7/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
@ 2013-07-16 10:01     ` Viresh Kumar
  2013-07-16 11:33       ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-07-16 10:01 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Myungjoo Ham

On 4 July 2013 14:20, Lukasz Majewski <l.majewski@samsung.com> wrote:
> -Reading the file is always supported, even if the processor does not
> -support boosting. In this case the file will be read-only and always
> -reads as "0". Explicitly changing the permissions and writing to that
> -file anyway will return EINVAL.
> +The file is exported only when cpufreq driver supports boosting.
> +Explicitly changing the permissions and writing to that file anyway will
> +return EINVAL.

For acpi-cpufreq reading the file should be always supported. And this
must be mentioned in doc.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 3/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution
  2013-07-04  8:50   ` [PATCH v5 3/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
@ 2013-07-16 10:04     ` Viresh Kumar
  2013-07-16 11:17       ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-07-16 10:04 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Myungjoo Ham

On 4 July 2013 14:20, Lukasz Majewski <l.majewski@samsung.com> wrote:
>  static void __init acpi_cpufreq_boost_init(void)
> @@ -953,33 +937,22 @@ static void __init acpi_cpufreq_boost_init(void)
>                 if (!msrs)
>                         return;
>
> -               boost_supported = true;
> -               boost_enabled = boost_state(0);
> +               cpufreq_set_boost_enabled(boost_state(0));
> +               acpi_cpufreq_driver.boost_supported = true;

You are again doing the same mistake. Boost must be
always supported for acpi-cpufreq with read permissions, as it was
earlier.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework
  2013-07-16  9:48     ` Viresh Kumar
@ 2013-07-16 10:58       ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-16 10:58 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Myungjoo Ham

On Tue, 16 Jul 2013 15:18:57 +0530 Viresh Kumar viresh.kumar@linaro.org
wrote,
> On 4 July 2013 14:20, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > The struct cpufreq_driver has been extended to embrace the
> > information related to boost support.
> >
> > When "boost_mode" device tree attribute is defined for a platform,
> > the boost_supported flag is set. Moreover boost related attributes
> > were exported.
> >
> > Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> > Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> 
> Don't we need to mark any frequencies in the freq table with BOOST?
> How?

The (trivial) patch is already prepared to enable BOOST at cpufreq for
Exynos4412. I will post it for v6. Sorry for not posting it earlier.

The whole patch is as follow:

static struct clk *cpu_clk;
static struct clk *mout_core;
static struct clk *sclk_mpll;
static struct clk *mout_apll;
 
static unsigned int exynos4x12_volt_table[] = {
	1350000, 1287500, 1250000, 1187500, 1137500, 1087500, 1037500,
 	1000000,  987500,  975000,  950000,  925000,  900000,  900000
};
 
 static struct cpufreq_frequency_table exynos4x12_freq_table[] = {
-	{L0, CPUFREQ_ENTRY_INVALID},
+	{CPUFREQ_BOOST_FREQ, 1500 * 1000},
 	{L1, 1400 * 1000},
 	{L2, 1300 * 1000},
 	{L3, 1200 * 1000},
 	{L4, 1100 * 1000},
 	{L5, 1000 * 1000},
 	{L6,  900 * 1000},
 	{L7,  800 * 1000},
 	{L8,  700 * 1000},
 	{L9,  600 * 1000},
 	{L10, 500 * 1000},
 	{L11, 400 * 1000},
 	{L12, 300 * 1000},



-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 3/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution
  2013-07-16 10:04     ` Viresh Kumar
@ 2013-07-16 11:17       ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-16 11:17 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Myungjoo Ham

On Tue, 16 Jul 2013 15:34:02 +0530 Viresh Kumar viresh.kumar@linaro.org
wrote,
> On 4 July 2013 14:20, Lukasz Majewski <l.majewski@samsung.com> wrote:
> >  static void __init acpi_cpufreq_boost_init(void)
> > @@ -953,33 +937,22 @@ static void __init
> > acpi_cpufreq_boost_init(void) if (!msrs)
> >                         return;
> >
> > -               boost_supported = true;
> > -               boost_enabled = boost_state(0);
> > +               cpufreq_set_boost_enabled(boost_state(0));
> > +               acpi_cpufreq_driver.boost_supported = true;
> 
> You are again doing the same mistake. Boost must be
> always supported for acpi-cpufreq with read permissions, as it was
> earlier.

The boost attribute is exported to sysfs only when boost is supported
by the driver (as we had agreed earlier).  

The problem here is that the original acpi-cpufreq.c file had two
static flags:
static bool boost_enabled, boost_supported;

Both of them are not needed at acpi-cpufreq, since:
1. boost_enabled is defined at cpufreq.c core file.
2. boost_supported is defined at struct cpufreq_driver
(acpi_cpufreq_driver).

I've reused the boost_supported from acpi_cpufreq_driver structure to
avoid code duplication.


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 7/7] Documentation:cpufreq:boost: Update BOOST documentation
  2013-07-16 10:01     ` Viresh Kumar
@ 2013-07-16 11:33       ` Lukasz Majewski
  2013-07-17  5:22         ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-16 11:33 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki
  Cc: Zhang Rui, Eduardo Valentin, cpufreq, Linux PM list, Jonghwa Lee,
	l.majewski, linux-kernel, Andre Przywara, Daniel Lezcano,
	Kukjin Kim, Myungjoo Ham

On Tue, 16 Jul 2013 15:31:43 +0530 Viresh Kumar viresh.kumar@linaro.org
wrote,
> On 4 July 2013 14:20, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > -Reading the file is always supported, even if the processor does
> > not -support boosting. In this case the file will be read-only and
> > always -reads as "0". Explicitly changing the permissions and
> > writing to that -file anyway will return EINVAL.
> > +The file is exported only when cpufreq driver supports boosting.
> > +Explicitly changing the permissions and writing to that file
> > anyway will +return EINVAL.
> 
> For acpi-cpufreq reading the file should be always supported. And this
> must be mentioned in doc.

As fair as I've understood our previous discussion (at [*]) we have
agreed about this. We only export boost attribute when it is supported
by cpufreq_driver. Rafael was very clear about exporting boost
attribute:

"Simple: Export it only when supported."

[*]: Re: [PATCH v4 2/7] cpufreq: Add boost frequency support in core
-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 6/7] cpufreq:boost:Kconfig: Enable software managed BOOST support at Kconfig
  2013-07-16  9:58     ` Viresh Kumar
@ 2013-07-16 11:50       ` Lukasz Majewski
  2013-07-17  5:24         ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-16 11:50 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Myungjoo Ham

On Tue, 16 Jul 2013 15:28:40 +0530 Viresh Kumar viresh.kumar@linaro.org
wrote,
> On 4 July 2013 14:20, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
> 
> > +config CPU_FREQ_BOOST_SW
> > +       bool "CPU frequency overclocking (BOOST)"
> 
> Name it "CPU Frequency Overclocking - Software"

Thanks, I had a puzzle to came up with a good short name :-).

> 
> > +       depends on ARM_EXYNOS_CPUFREQ && EXYNOS_THERMAL && EXYNOS_THERMAL
 		       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [*]
> 
> Remote Exynos from here. If you want to enable it for your platform by
> default, then select it from EXYNOS.

The purpose of the condition [*] here is to prevent from enabling
boost when thermal for Exynos is not supported.

Only for properly configured Exynos (when thermal + cpufreq is set) the
option is possible to enable. And by default it is disabled.
This shall prevent from accidental boost usage. 
  

Please also note, that this switch only affects software based
boost. The HW boost (Intel ACPI) support doesn't depend on this Kconfig
setting. 

> 
> > +       default n
> > +       help
> > +        This driver supports software managed overclocking (BOOST).
> > +         It allows usage of special frequencies for a particular
> > processor
> > +         if thermal conditions are appropriate.
> > +
> > +        It reguires, for safe operation, thermal framework with
> > properly defined
> > +         trip points.
> > +
> > +        If in doubt, say N.
> > +
> >  config CPU_FREQ_STAT
> >         tristate "CPU frequency translation statistics"
> >         select CPU_FREQ_TABLE
> > diff --git a/drivers/cpufreq/exynos-cpufreq.c
> > b/drivers/cpufreq/exynos-cpufreq.c index 4f42fcc..7586b28 100644
> > --- a/drivers/cpufreq/exynos-cpufreq.c
> > +++ b/drivers/cpufreq/exynos-cpufreq.c
> > @@ -288,7 +288,9 @@ static struct cpufreq_driver exynos_driver = {
> >
> >  static int __init exynos_cpufreq_init(void)
> >  {
> > +#ifdef CONFIG_CPU_FREQ_BOOST_SW
> >         struct device_node *node = pdev->dev.of_node;
> > +#endif
> >         int ret = -EINVAL;
> >
> >         exynos_info = kzalloc(sizeof(struct exynos_dvfs_info),
> > GFP_KERNEL); @@ -319,9 +321,10 @@ static int __init
> > exynos_cpufreq_init(void) }
> >
> >         locking_frequency = exynos_getspeed(0);
> > +#ifdef CONFIG_CPU_FREQ_BOOST_SW
> >         if (of_property_read_bool(node, "boost_mode"))
> >                 exynos_driver.boost_supported = 1;
> > -
> > +#endif
> 
> Add a blank line here.

OK

> 
> >         register_pm_notifier(&exynos_cpufreq_nb);
> >
> >         if (cpufreq_register_driver(&exynos_driver)) {
> > --
> > 1.7.10.4
> >



-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 2/7] cpufreq: Add boost frequency support in core
  2013-07-16  9:41     ` Viresh Kumar
@ 2013-07-16 12:06       ` Lukasz Majewski
  2013-07-17  5:28         ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-16 12:06 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki
  Cc: Zhang Rui, Eduardo Valentin, cpufreq, Linux PM list, Jonghwa Lee,
	l.majewski, linux-kernel, Andre Przywara, Daniel Lezcano,
	Kukjin Kim, Myungjoo Ham

On Tue, 16 Jul 2013 15:11:54 +0530 Viresh Kumar viresh.kumar@linaro.org
wrote,
> On 4 July 2013 14:20, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> 
> > +int cpufreq_boost_trigger_state(int state)
> > +{
> > +       unsigned long flags;
> > +       int ret = 0;
> > +
> > +       if (boost_enabled != state) {
> > +               write_lock_irqsave(&cpufreq_driver_lock, flags);
> > +               boost_enabled = state;
> > +
> > +               ret = cpufreq_driver->enable_boost(state);
> > +               if (ret)
> > +                       boost_enabled = 0;
> > +
> > +               write_unlock_irqrestore(&cpufreq_driver_lock,
> > flags); +
> > +               if (ret)
> > +                       pr_err("%s: BOOST cannot enable (%d)\n",
> 
> Who said we are enabling it?

You are right here - also disablement could fail. I will fix it.

> 
> > +                              __func__, ret);
> > +       }
> > +
> > +       return ret;
> > +}
> > +
> > +int cpufreq_boost_supported(void)
> > +{
> > +       if (cpufreq_driver)
> > +               return cpufreq_driver->boost_supported;
> > +
> > +       return 0;
> > +}
> > +EXPORT_SYMBOL_GPL(cpufreq_boost_supported);
> > +
> > +int cpufreq_boost_enabled(void)
> > +{
> > +       return boost_enabled;
> > +}
> > +EXPORT_SYMBOL_GPL(cpufreq_boost_enabled);
> > +
> > +void cpufreq_set_boost_enabled(int state)
	  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [*]

> 
> Maybe cpufreq_block_boost? As suggested by Rafael.

What do you mean by cpufreq_block_boost()? This name would reverse the
logic.

Function [*] is used to change boost_enabled static flag (defined at
cpufreq.c file) state according to acpi-cpufreq.c boost support status.


> 
> > +{
> > +       boost_enabled = state;
> > +}
> > +EXPORT_SYMBOL_GPL(cpufreq_set_boost_enabled);
> > +
> > +/*********************************************************************
> >   *               REGISTER / UNREGISTER CPUFREQ
> > DRIVER                *
> > *********************************************************************/
> >
> > @@ -2001,6 +2094,22 @@ int cpufreq_register_driver(struct
> > cpufreq_driver *driver_data) cpufreq_driver = driver_data;
> >         write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> >
> > +       if (cpufreq_driver->boost_supported) {
> > +               /*
> > +                * Check if boost driver provides function to
> > enable boost -
> > +                * if not, use cpufreq_boost_enable_sw as default
> > +                */
> > +               if (!cpufreq_driver->enable_boost)
> > +                       cpufreq_driver->enable_boost =
> > &cpufreq_boost_enable_sw;
> 
> & is redundant.

Yes, correct. I will change that.

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 7/7] Documentation:cpufreq:boost: Update BOOST documentation
  2013-07-16 11:33       ` Lukasz Majewski
@ 2013-07-17  5:22         ` Viresh Kumar
  2013-07-17  7:36           ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-07-17  5:22 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Myungjoo Ham

On 16 July 2013 17:03, Lukasz Majewski <l.majewski@samsung.com> wrote:
> As fair as I've understood our previous discussion (at [*]) we have
> agreed about this. We only export boost attribute when it is supported
> by cpufreq_driver. Rafael was very clear about exporting boost
> attribute:
>
> "Simple: Export it only when supported."
>
> [*]: Re: [PATCH v4 2/7] cpufreq: Add boost frequency support in core

I don't want to search in the Archives but I am sure what we decided
earlier.

Rafael Said:
"Simple: Export it only when supported."

AND

"Don't change behavior of acpi-cpufreq driver"

If you see acpi-cpufreq driver carefully, it always creates "boost"
sysfs entry. If its not supported then it creates a read only entry.

So, please preserve that.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 6/7] cpufreq:boost:Kconfig: Enable software managed BOOST support at Kconfig
  2013-07-16 11:50       ` Lukasz Majewski
@ 2013-07-17  5:24         ` Viresh Kumar
  2013-07-17  7:17           ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-07-17  5:24 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Myungjoo Ham

On 16 July 2013 17:20, Lukasz Majewski <l.majewski@samsung.com> wrote:
> On Tue, 16 Jul 2013 15:28:40 +0530 Viresh Kumar viresh.kumar@linaro.org
> wrote,
>> On 4 July 2013 14:20, Lukasz Majewski <l.majewski@samsung.com> wrote:
>> > diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
>>
>> > +config CPU_FREQ_BOOST_SW
>> > +       bool "CPU frequency overclocking (BOOST)"
>>
>> Name it "CPU Frequency Overclocking - Software"
>
> Thanks, I had a puzzle to came up with a good short name :-).
>
>>
>> > +       depends on ARM_EXYNOS_CPUFREQ && EXYNOS_THERMAL
>                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [*]
>>
>> Remote Exynos from here. If you want to enable it for your platform by
>> default, then select it from EXYNOS.

I misread it a bit. I wanted to say make it dependent only on THERMAL and
not on Exynos.

> The purpose of the condition [*] here is to prevent from enabling
> boost when thermal for Exynos is not supported.

Why? Can't others use it? Its not exynos specific :)

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 2/7] cpufreq: Add boost frequency support in core
  2013-07-16 12:06       ` Lukasz Majewski
@ 2013-07-17  5:28         ` Viresh Kumar
  2013-07-17  7:00           ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-07-17  5:28 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Myungjoo Ham

On 16 July 2013 17:36, Lukasz Majewski <l.majewski@samsung.com> wrote:
> On Tue, 16 Jul 2013 15:11:54 +0530 Viresh Kumar viresh.kumar@linaro.org
> wrote,
>> On 4 July 2013 14:20, Lukasz Majewski <l.majewski@samsung.com> wrote:

>> > +void cpufreq_set_boost_enabled(int state)
>           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [*]
>
>>
>> Maybe cpufreq_block_boost? As suggested by Rafael.
>
> What do you mean by cpufreq_block_boost()? This name would reverse the
> logic.
>
> Function [*] is used to change boost_enabled static flag (defined at
> cpufreq.c file) state according to acpi-cpufreq.c boost support status.

I misread it again :(

So, what about adding another field in struct cpufreq_driver: boost_enabled?
And get rid of the global boost_enabled we have used? Similar to how
boost_supported is used, then we don't need this routine.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 2/7] cpufreq: Add boost frequency support in core
  2013-07-17  5:28         ` Viresh Kumar
@ 2013-07-17  7:00           ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-17  7:00 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Myungjoo Ham

On Wed, 17 Jul 2013 10:58:40 +0530 Viresh Kumar viresh.kumar@linaro.org
wrote,
> On 16 July 2013 17:36, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > On Tue, 16 Jul 2013 15:11:54 +0530 Viresh Kumar
> > viresh.kumar@linaro.org wrote,
> >> On 4 July 2013 14:20, Lukasz Majewski <l.majewski@samsung.com>
> >> wrote:
> 
> >> > +void cpufreq_set_boost_enabled(int state)
> >           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [*]
> >
> >>
> >> Maybe cpufreq_block_boost? As suggested by Rafael.
> >
> > What do you mean by cpufreq_block_boost()? This name would reverse
> > the logic.
> >
> > Function [*] is used to change boost_enabled static flag (defined at
> > cpufreq.c file) state according to acpi-cpufreq.c boost support
> > status.
> 
> I misread it again :(
> 
> So, what about adding another field in struct cpufreq_driver:
> boost_enabled? And get rid of the global boost_enabled we have used?
> Similar to how boost_supported is used, then we don't need this
> routine.

Ok, I will implement this.

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 6/7] cpufreq:boost:Kconfig: Enable software managed BOOST support at Kconfig
  2013-07-17  5:24         ` Viresh Kumar
@ 2013-07-17  7:17           ` Lukasz Majewski
  2013-07-17  7:52             ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-17  7:17 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Myungjoo Ham

On Wed, 17 Jul 2013 10:54:55 +0530 Viresh Kumar viresh.kumar@linaro.org
wrote,
> On 16 July 2013 17:20, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > On Tue, 16 Jul 2013 15:28:40 +0530 Viresh Kumar
> > viresh.kumar@linaro.org wrote,
> >> On 4 July 2013 14:20, Lukasz Majewski <l.majewski@samsung.com>
> >> wrote:
> >> > diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
> >>
> >> > +config CPU_FREQ_BOOST_SW
> >> > +       bool "CPU frequency overclocking (BOOST)"
> >>
> >> Name it "CPU Frequency Overclocking - Software"
> >
> > Thanks, I had a puzzle to came up with a good short name :-).
> >
> >>
> >> > +       depends on ARM_EXYNOS_CPUFREQ && EXYNOS_THERMAL
> >                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [*]
> >>
> >> Remote Exynos from here. If you want to enable it for your
> >> platform by default, then select it from EXYNOS.

I can change ARM_EXYNOS_CPUFREQ -> CPUFREQ at [*]

> 
> I misread it a bit. I wanted to say make it dependent only on THERMAL
> and not on Exynos.

The cpufreq boost feature is possible to be enabled only when those [*]
dependencies are met. Moreover, it is disabled by default. 

This means that not only THERMAL generic code must be supported, but
also EXYNOS specific one - like per SoC trip points [**].

With thermal it is possible (and correct) to only define THERMAL, with
no platform (in this case Exynos) specific definitions. To force
potential user to define [**], I think, that EXYNOS_THERMAL is required.

> 
> > The purpose of the condition [*] here is to prevent from enabling
> > boost when thermal for Exynos is not supported.
> 
> Why? Can't others use it? Its not exynos specific :)

No it is not exynos specific.
For other platform one need to define:

depends on CPUFREQ && (EXYNOS_THERMAL || <PLATFORM_SUPPORTED>_THERMAL)

Such condition improves my confidence about proper boost usage.


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 7/7] Documentation:cpufreq:boost: Update BOOST documentation
  2013-07-17  5:22         ` Viresh Kumar
@ 2013-07-17  7:36           ` Lukasz Majewski
  2013-07-17  7:59             ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-17  7:36 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Myungjoo Ham

On Wed, 17 Jul 2013 10:52:18 +0530 Viresh Kumar viresh.kumar@linaro.org
wrote,
> On 16 July 2013 17:03, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > As fair as I've understood our previous discussion (at [*]) we have
> > agreed about this. We only export boost attribute when it is
> > supported by cpufreq_driver. Rafael was very clear about exporting
> > boost attribute:
> >
> > "Simple: Export it only when supported."
> >
> > [*]: Re: [PATCH v4 2/7] cpufreq: Add boost frequency support in core
> 
> I don't want to search in the Archives but I am sure what we decided
> earlier.

At v4 there was the old acpi-cpufreq.c behaviour preserved (with always
exporting boost - when not supported ro, when supported rw).

Due to Rafael and Dirk comments it has been rewritten at v5:

http://thread.gmane.org/gmane.linux.kernel/1511831/match=patch+v4+2+7+cpufreq+add+boost+frequency+support+core


> 
> Rafael Said:
> "Simple: Export it only when supported."
              [*]

> 
> AND
> 
> "Don't change behavior of acpi-cpufreq driver" 
              [**]
> 
> If you see acpi-cpufreq driver carefully, it always creates "boost"
> sysfs entry. If its not supported then it creates a read only entry.

For me those two statements [*] and [**] contradict:

At v5:
1. ARM - export "boost" only when supported (rw)
2. x86 - export boost only when x86 supports it (as rw). When x86
	 doesn't support HW boost - DO NOT export it at all.

At v4:
1. ARM - export "boost" only when supported (rw)
2. x86 - always export boost - no matter if supported or not. If not
	 supported, then export it as ro only.


> 
> So, please preserve that.


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 6/7] cpufreq:boost:Kconfig: Enable software managed BOOST support at Kconfig
  2013-07-17  7:17           ` Lukasz Majewski
@ 2013-07-17  7:52             ` Viresh Kumar
  2013-07-17  8:12               ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-07-17  7:52 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Myungjoo Ham

On 17 July 2013 12:47, Lukasz Majewski <l.majewski@samsung.com> wrote:
> On Wed, 17 Jul 2013 10:54:55 +0530 Viresh Kumar viresh.kumar@linaro.org
> wrote,
>> On 16 July 2013 17:20, Lukasz Majewski <l.majewski@samsung.com> wrote:
>> > On Tue, 16 Jul 2013 15:28:40 +0530 Viresh Kumar
>> > viresh.kumar@linaro.org wrote,
>> >> On 4 July 2013 14:20, Lukasz Majewski <l.majewski@samsung.com>
>> >> wrote:
>> >> > diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
>> >>
>> >> > +config CPU_FREQ_BOOST_SW
>> >> > +       bool "CPU frequency overclocking (BOOST)"
>> >>
>> >> Name it "CPU Frequency Overclocking - Software"
>> >
>> > Thanks, I had a puzzle to came up with a good short name :-).
>> >
>> >>
>> >> > +       depends on ARM_EXYNOS_CPUFREQ && EXYNOS_THERMAL
>> >                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [*]
>> >>
>> >> Remote Exynos from here. If you want to enable it for your
>> >> platform by default, then select it from EXYNOS.
>
> I can change ARM_EXYNOS_CPUFREQ -> CPUFREQ at [*]

We are in cpufreq Kconfig and so dependency is automatically
there on cpufreq.

>>
>> I misread it a bit. I wanted to say make it dependent only on THERMAL
>> and not on Exynos.
>
> The cpufreq boost feature is possible to be enabled only when those [*]
> dependencies are met. Moreover, it is disabled by default.
>
> This means that not only THERMAL generic code must be supported, but
> also EXYNOS specific one - like per SoC trip points [**].
>
> With thermal it is possible (and correct) to only define THERMAL, with
> no platform (in this case Exynos) specific definitions. To force
> potential user to define [**], I think, that EXYNOS_THERMAL is required.
>
>>
>> > The purpose of the condition [*] here is to prevent from enabling
>> > boost when thermal for Exynos is not supported.
>>
>> Why? Can't others use it? Its not exynos specific :)
>
> No it is not exynos specific.
> For other platform one need to define:
>
> depends on CPUFREQ && (EXYNOS_THERMAL || <PLATFORM_SUPPORTED>_THERMAL)

Exactly. I don't want this kind of mess to be present here.

People selecting this feature must know what it does and
dependency on a coolant is enough.

For other drivers, selecting this doesn't matter as they don't
support boost.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 2/7] cpufreq: Add boost frequency support in core
  2013-06-19 22:25         ` Rafael J. Wysocki
@ 2013-07-17  7:58           ` Viresh Kumar
  2013-07-17 11:31             ` Rafael J. Wysocki
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-07-17  7:58 UTC (permalink / raw)
  To: Lukasz Majewski, Dirk Brandewie, Rafael J. Wysocki
  Cc: Lukasz Majewski, cpufreq, Linux PM list, Vincent Guittot,
	Jonghwa Lee, Myungjoo Ham, linux-kernel, Andre Przywara,
	Daniel Lezcano, Kukjin Kim, Zhang Rui, Eduardo Valentin

On 20 June 2013 03:55, Rafael J. Wysocki <rjw@sisk.pl> wrote:
> On Wednesday, June 19, 2013 10:31:02 PM Lukasz Majewski wrote:
>> On Wed, 19 Jun 2013 10:48:53 -0700
>> Dirk Brandewie <dirk.brandewie@gmail.com> wrote:
>>
>> > On 06/19/2013 10:12 AM, Lukasz Majewski wrote:

>> > > @@ -1936,6 +2019,16 @@ int cpufreq_register_driver(struct
>> > > + if (!cpufreq_driver->boost_supported)
>> > > +         boost.attr.mode = 0444;
>> > > +
>> > > + ret = cpufreq_sysfs_create_file(&(boost.attr));
>> > > + if (ret) {
>> > > +         pr_err("%s: cannot register global boost sysfs
>> > > file\n",
>> > > +                __func__);
>> > > +         goto err_null_driver;
>> > > + }
>> > > +
>> >
>> > I do not think the boost sysfs should be created at all if boost is
>> > not supported.
>>
>> This was my first thought. But unfortunately this "boost" attribute is
>> always exported at acpi-cpufreq.c and in my opinion is part of a
>> legacy API.
>>
>> I totally agree with the idea of exporting boost only when supported,
>> but I would like to know the community opinion about this (especially
>> Viresh and Rafael shall speak up).
>
> Simple: Export it only when supported.

Guys,

I got confused here. We originally decided to keep this feature as is
for acpi-cpufreq.

So, For acpi-cpufreq:
- when boost isn't supported: create sysfs boost with ro permissions
- when boost is supported: create sysfs boost with rw permissions

So, For others:
- create sysfs boost with rw permissions only when boost is supported

.

Do you want something else? or do you want to change behavior of
acpi-cpufreq driver? I don't why it was designed this way and what
applications use it.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 7/7] Documentation:cpufreq:boost: Update BOOST documentation
  2013-07-17  7:36           ` Lukasz Majewski
@ 2013-07-17  7:59             ` Viresh Kumar
  2013-07-17  8:13               ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-07-17  7:59 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Myungjoo Ham

On 17 July 2013 13:06, Lukasz Majewski <l.majewski@samsung.com> wrote:
> At v4 there was the old acpi-cpufreq.c behaviour preserved (with always
> exporting boost - when not supported ro, when supported rw).
>
> Due to Rafael and Dirk comments it has been rewritten at v5:
>
> http://thread.gmane.org/gmane.linux.kernel/1511831/match=patch+v4+2+7+cpufreq+add+boost+frequency+support+core
>
>
>>
>> Rafael Said:
>> "Simple: Export it only when supported."
>               [*]
>
>>
>> AND
>>
>> "Don't change behavior of acpi-cpufreq driver"
>               [**]
>>
>> If you see acpi-cpufreq driver carefully, it always creates "boost"
>> sysfs entry. If its not supported then it creates a read only entry.
>
> For me those two statements [*] and [**] contradict:
>
> At v5:
> 1. ARM - export "boost" only when supported (rw)
> 2. x86 - export boost only when x86 supports it (as rw). When x86
>          doesn't support HW boost - DO NOT export it at all.
>
> At v4:
> 1. ARM - export "boost" only when supported (rw)
> 2. x86 - always export boost - no matter if supported or not. If not
>          supported, then export it as ro only.

Okay, there is some confusion..

I have raised a query on your v4 mail.. lets see what people have to say.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 6/7] cpufreq:boost:Kconfig: Enable software managed BOOST support at Kconfig
  2013-07-17  7:52             ` Viresh Kumar
@ 2013-07-17  8:12               ` Lukasz Majewski
  2013-07-17  8:29                 ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-17  8:12 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Myungjoo Ham

On Wed, 17 Jul 2013 13:22:20 +0530 Viresh Kumar viresh.kumar@linaro.org
wrote,
> On 17 July 2013 12:47, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > On Wed, 17 Jul 2013 10:54:55 +0530 Viresh Kumar
> > viresh.kumar@linaro.org wrote,
> >> On 16 July 2013 17:20, Lukasz Majewski <l.majewski@samsung.com>
> >> wrote:
> >> > On Tue, 16 Jul 2013 15:28:40 +0530 Viresh Kumar
> >> > viresh.kumar@linaro.org wrote,
> >> >> On 4 July 2013 14:20, Lukasz Majewski <l.majewski@samsung.com>
> >> >> wrote:
> >> >> > diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
> >> >>
> >> >> > +config CPU_FREQ_BOOST_SW
> >> >> > +       bool "CPU frequency overclocking (BOOST)"
> >> >>
> >> >> Name it "CPU Frequency Overclocking - Software"
> >> >
> >> > Thanks, I had a puzzle to came up with a good short name :-).
> >> >
> >> >>
> >> >> > +       depends on ARM_EXYNOS_CPUFREQ && EXYNOS_THERMAL
> >> >                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [*]
> >> >>
> >> >> Remote Exynos from here. If you want to enable it for your
> >> >> platform by default, then select it from EXYNOS.
> >
> > I can change ARM_EXYNOS_CPUFREQ -> CPUFREQ at [*]
> 
> We are in cpufreq Kconfig and so dependency is automatically
> there on cpufreq.

So then, it can be removed.

> 
> >>
> >> I misread it a bit. I wanted to say make it dependent only on
> >> THERMAL and not on Exynos.
> >
> > The cpufreq boost feature is possible to be enabled only when those
> > [*] dependencies are met. Moreover, it is disabled by default.
> >
> > This means that not only THERMAL generic code must be supported, but
> > also EXYNOS specific one - like per SoC trip points [**].
> >
> > With thermal it is possible (and correct) to only define THERMAL,
> > with no platform (in this case Exynos) specific definitions. To
> > force potential user to define [**], I think, that EXYNOS_THERMAL
> > is required.
> >
> >>
> >> > The purpose of the condition [*] here is to prevent from enabling
> >> > boost when thermal for Exynos is not supported.
> >>
> >> Why? Can't others use it? Its not exynos specific :)
> >
> > No it is not exynos specific.
> > For other platform one need to define:
> >
> > depends on CPUFREQ && (EXYNOS_THERMAL ||
> > <PLATFORM_SUPPORTED>_THERMAL)
> 
> Exactly. I don't want this kind of mess to be present here.
> 
> People selecting this feature must know what it does and
> dependency on a coolant is enough.
> 
> For other drivers, selecting this doesn't matter as they don't
> support boost.

Then it should be enough to only write:

depends on THERMAL

(since CPUFREQ is already enabled for entering this menu).




-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 7/7] Documentation:cpufreq:boost: Update BOOST documentation
  2013-07-17  7:59             ` Viresh Kumar
@ 2013-07-17  8:13               ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-17  8:13 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Myungjoo Ham

On Wed, 17 Jul 2013 13:29:26 +0530 Viresh Kumar viresh.kumar@linaro.org
wrote,
> On 17 July 2013 13:06, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > At v4 there was the old acpi-cpufreq.c behaviour preserved (with
> > always exporting boost - when not supported ro, when supported rw).
> >
> > Due to Rafael and Dirk comments it has been rewritten at v5:
> >
> > http://thread.gmane.org/gmane.linux.kernel/1511831/match=patch+v4+2+7+cpufreq+add+boost+frequency+support+core
> >
> >
> >>
> >> Rafael Said:
> >> "Simple: Export it only when supported."
> >               [*]
> >
> >>
> >> AND
> >>
> >> "Don't change behavior of acpi-cpufreq driver"
> >               [**]
> >>
> >> If you see acpi-cpufreq driver carefully, it always creates "boost"
> >> sysfs entry. If its not supported then it creates a read only
> >> entry.
> >
> > For me those two statements [*] and [**] contradict:
> >
> > At v5:
> > 1. ARM - export "boost" only when supported (rw)
> > 2. x86 - export boost only when x86 supports it (as rw). When x86
> >          doesn't support HW boost - DO NOT export it at all.
> >
> > At v4:
> > 1. ARM - export "boost" only when supported (rw)
> > 2. x86 - always export boost - no matter if supported or not. If not
> >          supported, then export it as ro only.
> 
> Okay, there is some confusion..
> 
> I have raised a query on your v4 mail.. lets see what people have to
> say.

Ok.

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 6/7] cpufreq:boost:Kconfig: Enable software managed BOOST support at Kconfig
  2013-07-17  8:12               ` Lukasz Majewski
@ 2013-07-17  8:29                 ` Viresh Kumar
  2013-07-17  9:11                   ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-07-17  8:29 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Myungjoo Ham

On 17 July 2013 13:42, Lukasz Majewski <l.majewski@samsung.com> wrote:
> Then it should be enough to only write:
>
> depends on THERMAL
>
> (since CPUFREQ is already enabled for entering this menu).

Correct

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v5 6/7] cpufreq:boost:Kconfig: Enable software managed BOOST support at Kconfig
  2013-07-17  8:29                 ` Viresh Kumar
@ 2013-07-17  9:11                   ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-17  9:11 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, l.majewski, linux-kernel,
	Andre Przywara, Daniel Lezcano, Kukjin Kim, Myungjoo Ham

On Wed, 17 Jul 2013 10:29:15 +0200 Viresh Kumar viresh.kumar@linaro.org
wrote,
> On 17 July 2013 13:42, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > Then it should be enough to only write:
> >
> > depends on THERMAL
> >
> > (since CPUFREQ is already enabled for entering this menu).
> 
> Correct

OK.

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 2/7] cpufreq: Add boost frequency support in core
  2013-07-17  7:58           ` Viresh Kumar
@ 2013-07-17 11:31             ` Rafael J. Wysocki
  2013-07-17 13:01               ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Rafael J. Wysocki @ 2013-07-17 11:31 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Lukasz Majewski, Dirk Brandewie, Lukasz Majewski, cpufreq,
	Linux PM list, Vincent Guittot, Jonghwa Lee, Myungjoo Ham,
	linux-kernel, Andre Przywara, Daniel Lezcano, Kukjin Kim,
	Zhang Rui, Eduardo Valentin

On Wednesday, July 17, 2013 01:28:29 PM Viresh Kumar wrote:
> On 20 June 2013 03:55, Rafael J. Wysocki <rjw@sisk.pl> wrote:
> > On Wednesday, June 19, 2013 10:31:02 PM Lukasz Majewski wrote:
> >> On Wed, 19 Jun 2013 10:48:53 -0700
> >> Dirk Brandewie <dirk.brandewie@gmail.com> wrote:
> >>
> >> > On 06/19/2013 10:12 AM, Lukasz Majewski wrote:
> 
> >> > > @@ -1936,6 +2019,16 @@ int cpufreq_register_driver(struct
> >> > > + if (!cpufreq_driver->boost_supported)
> >> > > +         boost.attr.mode = 0444;
> >> > > +
> >> > > + ret = cpufreq_sysfs_create_file(&(boost.attr));
> >> > > + if (ret) {
> >> > > +         pr_err("%s: cannot register global boost sysfs
> >> > > file\n",
> >> > > +                __func__);
> >> > > +         goto err_null_driver;
> >> > > + }
> >> > > +
> >> >
> >> > I do not think the boost sysfs should be created at all if boost is
> >> > not supported.
> >>
> >> This was my first thought. But unfortunately this "boost" attribute is
> >> always exported at acpi-cpufreq.c and in my opinion is part of a
> >> legacy API.
> >>
> >> I totally agree with the idea of exporting boost only when supported,
> >> but I would like to know the community opinion about this (especially
> >> Viresh and Rafael shall speak up).
> >
> > Simple: Export it only when supported.
> 
> Guys,
> 
> I got confused here. We originally decided to keep this feature as is
> for acpi-cpufreq.
> 
> So, For acpi-cpufreq:
> - when boost isn't supported: create sysfs boost with ro permissions
> - when boost is supported: create sysfs boost with rw permissions
> 
> So, For others:
> - create sysfs boost with rw permissions only when boost is supported
> 
> .
> 
> Do you want something else? or do you want to change behavior of
> acpi-cpufreq driver? I don't why it was designed this way and what
> applications use it.

First off, I'm not sure how many applications actually use it and I think,
if any, they should be able cope with the attribute not being present.

Of course, if it turns out that yes, there are applications using it and no,
they cannot cope with the missing attribute, we'll need to address this.
That said such applications wouldn't work with earlier kernels in which that
attribute wasn't present at all, so I suppose this is really unlikely.

So, do whichever makes more sense to you: Design things to preserve the old
behavior (which is sightly confusing) or design them to expose the attribute
if the feature is actually supported and be prepared to address the (unlikely)
case when some hypothetical applications break because of that.

Thanks,
Rafael


-- 
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 2/7] cpufreq: Add boost frequency support in core
  2013-07-17 11:31             ` Rafael J. Wysocki
@ 2013-07-17 13:01               ` Viresh Kumar
  2013-07-17 14:59                 ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-07-17 13:01 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Lukasz Majewski, Dirk Brandewie, Lukasz Majewski, cpufreq,
	Linux PM list, Vincent Guittot, Jonghwa Lee, Myungjoo Ham,
	linux-kernel, Andre Przywara, Daniel Lezcano, Kukjin Kim,
	Zhang Rui, Eduardo Valentin

On 17 July 2013 17:01, Rafael J. Wysocki <rjw@sisk.pl> wrote:
> First off, I'm not sure how many applications actually use it and I think,
> if any, they should be able cope with the attribute not being present.
>
> Of course, if it turns out that yes, there are applications using it and no,
> they cannot cope with the missing attribute, we'll need to address this.
> That said such applications wouldn't work with earlier kernels in which that
> attribute wasn't present at all, so I suppose this is really unlikely.
>
> So, do whichever makes more sense to you: Design things to preserve the old
> behavior (which is sightly confusing) or design them to expose the attribute
> if the feature is actually supported and be prepared to address the (unlikely)
> case when some hypothetical applications break because of that.

Okay. Its better to keep it the way Lukasz designed it in his last patchset.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 2/7] cpufreq: Add boost frequency support in core
  2013-07-17 13:01               ` Viresh Kumar
@ 2013-07-17 14:59                 ` Lukasz Majewski
  2013-07-18  7:51                   ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-17 14:59 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Lukasz Majewski, Dirk Brandewie, cpufreq,
	Linux PM list, Vincent Guittot, Jonghwa Lee, Myungjoo Ham,
	linux-kernel, Andre Przywara, Daniel Lezcano, Kukjin Kim,
	Zhang Rui, Eduardo Valentin

On Wed, 17 Jul 2013 18:31:19 +0530 Viresh Kumar viresh.kumar@linaro.org
wrote,
> On 17 July 2013 17:01, Rafael J. Wysocki <rjw@sisk.pl> wrote:
> > First off, I'm not sure how many applications actually use it and I
> > think, if any, they should be able cope with the attribute not
> > being present.
> >
> > Of course, if it turns out that yes, there are applications using
> > it and no, they cannot cope with the missing attribute, we'll need
> > to address this. That said such applications wouldn't work with
> > earlier kernels in which that attribute wasn't present at all, so I
> > suppose this is really unlikely.
> >
> > So, do whichever makes more sense to you: Design things to preserve
> > the old behavior (which is sightly confusing) or design them to
> > expose the attribute if the feature is actually supported and be
> > prepared to address the (unlikely) case when some hypothetical
> > applications break because of that.
> 
> Okay. Its better to keep it the way Lukasz designed it in his last
> patchset.

To be 100% sure - we export boost only when supported (as proposed at v5).


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v4 2/7] cpufreq: Add boost frequency support in core
  2013-07-17 14:59                 ` Lukasz Majewski
@ 2013-07-18  7:51                   ` Viresh Kumar
  0 siblings, 0 replies; 329+ messages in thread
From: Viresh Kumar @ 2013-07-18  7:51 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Lukasz Majewski, Dirk Brandewie, cpufreq,
	Linux PM list, Vincent Guittot, Jonghwa Lee, Myungjoo Ham,
	linux-kernel, Andre Przywara, Daniel Lezcano, Kukjin Kim,
	Zhang Rui, Eduardo Valentin

On 17 July 2013 20:29, Lukasz Majewski <l.majewski@samsung.com> wrote:
> To be 100% sure - we export boost only when supported (as proposed at v5).

Yes.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* [PATCH v6 0/8] cpufreq:boost: CPU Boost mode support
  2013-06-06  7:07 [PATCH 0/5] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                   ` (8 preceding siblings ...)
  2013-07-04  8:50 ` [PATCH v5 " Lukasz Majewski
@ 2013-07-25 16:33 ` Lukasz Majewski
  2013-07-25 16:33   ` [PATCH v6 1/8] cpufreq: Store cpufreq policies in a list Lukasz Majewski
                     ` (8 more replies)
  2013-08-13 10:08 ` [PATCH v7 0/7] " Lukasz Majewski
                   ` (7 subsequent siblings)
  17 siblings, 9 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-25 16:33 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Kukjin Kim, Myungjoo Ham, durgadoss.r

This patch series introduces support for CPU overclocking technique
called Boost.

It is a follow up of a LAB governor proposal. Boost is a LAB component:
http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq

Boost unifies hardware based solution (e.g. Intel Nehalem) with
software oriented one (like the one done at Exynos).
For this reason cpufreq/freq_table code has been reorganized to include
common code.

Important design decisions:
- Boost related code is compiled-in unconditionally to cpufreq core and 
  disabled by default. The cpufreq_driver is responsibile for setting 
  boost_supported flag and providing set_boost callback(if HW support
  is needed). For software managed boost, special Kconfig flag - 
  CONFIG_CPU_FREQ_BOOST_SW has been defined. It will be selected only
  when a target platform has thermal framework properly configured.

- struct cpufreq_driver has been extended with boost related fields:
        -- boost_supported - when driver supports boosting
        -- boost_enabled - boost state
        -- set_boost - callback to function, which is necessary to
           enable/disable boost

- Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost) is visible
  _only_ when cpufreq driver supports Boost.

- No special spin_lock for Boost was created. The one from cpufreq core
  was reused.

- All available policies are now stored in a list.

- The Boost code doesn't rely on any policy. When boost state is changed,
  then the policy list is iterated and proper adjustements are done.

- To improve safety level, the thermal framework is also extended to disable
  software boosting, when thermal trip point is reached. Then it starts 
  monitoring target temperature to evaluate if boost can be enabled 
  again. This emulates behaviour similar to HW managed boost (like x86)

New patches for v6:
cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ

Tested at HW:
       Exynos 4412 3.11-rc1 Linux
       Intel Core i7-3770 3.11-rc1 Linux


Lukasz Majewski (8):
  cpufreq: Store cpufreq policies in a list
  cpufreq: Add boost frequency support in core
  cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common
    boost solution
  thermal:boost: Automatic enable/disable of BOOST feature
  cpufreq:boost:Kconfig: Provide support for software managed BOOST
  cpufreq:exynos:Extend Exynos cpufreq driver to support boost
    framework
  Documentation:cpufreq:boost: Update BOOST documentation
  cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ

 Documentation/cpu-freq/boost.txt     |   26 +++----
 drivers/cpufreq/Kconfig              |    3 +
 drivers/cpufreq/Kconfig.arm          |   16 +++++
 drivers/cpufreq/acpi-cpufreq.c       |   87 ++++++++----------------
 drivers/cpufreq/cpufreq.c            |  124 +++++++++++++++++++++++++++++++++-
 drivers/cpufreq/exynos-cpufreq.c     |    6 ++
 drivers/cpufreq/exynos4x12-cpufreq.c |    2 +-
 drivers/cpufreq/freq_table.c         |   53 +++++++++++++--
 drivers/thermal/thermal_core.c       |   55 +++++++++++++++
 include/linux/cpufreq.h              |   26 +++++++
 include/linux/thermal.h              |    2 +
 11 files changed, 321 insertions(+), 79 deletions(-)

-- 
1.7.10.4


^ permalink raw reply	[flat|nested] 329+ messages in thread

* [PATCH v6 1/8] cpufreq: Store cpufreq policies in a list
  2013-07-25 16:33 ` [PATCH v6 0/8] " Lukasz Majewski
@ 2013-07-25 16:33   ` Lukasz Majewski
  2013-07-26 10:14     ` Viresh Kumar
  2013-07-25 16:33   ` [PATCH v6 2/8] cpufreq: Add boost frequency support in core Lukasz Majewski
                     ` (7 subsequent siblings)
  8 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-25 16:33 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Kukjin Kim, Myungjoo Ham, durgadoss.r

Policies available in a cpufreq framework are now linked together. They are
accessible via cpufreq_policy_list defined at cpufreq core.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v6:
- Move policy list entry delete code to __cpufreq_remove_dev()
- Protect operations on cpufreq_policy_list elements with lock

Changes for v5:
- Call list_add() only when device successfully added

Changes for v4:
- New patch

 drivers/cpufreq/cpufreq.c |    9 +++++++++
 include/linux/cpufreq.h   |    1 +
 2 files changed, 10 insertions(+)

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 0937b8d..172a25e 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -46,6 +46,7 @@ static struct cpufreq_driver *cpufreq_driver;
 static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data);
 static DEFINE_RWLOCK(cpufreq_driver_lock);
 static DEFINE_MUTEX(cpufreq_governor_lock);
+static LIST_HEAD(cpufreq_policy_list);
 
 #ifdef CONFIG_HOTPLUG_CPU
 /* This one keeps track of the previously set governor of a removed CPU */
@@ -1054,6 +1055,10 @@ static int cpufreq_add_dev(struct device *dev, struct subsys_interface *sif)
 	if (ret)
 		goto err_out_unregister;
 
+	write_lock_irqsave(&cpufreq_driver_lock, flags);
+	list_add(&policy->policy_list, &cpufreq_policy_list);
+	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
+
 	kobject_uevent(&policy->kobj, KOBJ_ADD);
 	module_put(cpufreq_driver->owner);
 	pr_debug("initialization complete\n");
@@ -1202,6 +1207,10 @@ static int __cpufreq_remove_dev(struct device *dev,
 		if (cpufreq_driver->exit)
 			cpufreq_driver->exit(data);
 
+		write_lock_irqsave(&cpufreq_driver_lock, flags);
+		list_del(&data->policy_list);
+		write_unlock_irqrestore(&cpufreq_driver_lock, flags);
+
 		free_cpumask_var(data->related_cpus);
 		free_cpumask_var(data->cpus);
 		kfree(data);
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index 90d5a15..d8e30fc 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -117,6 +117,7 @@ struct cpufreq_policy {
 
 	struct cpufreq_real_policy	user_policy;
 
+	struct list_head        policy_list;
 	struct kobject		kobj;
 	struct completion	kobj_unregister;
 	int			transition_ongoing; /* Tracks transition status */
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v6 2/8] cpufreq: Add boost frequency support in core
  2013-07-25 16:33 ` [PATCH v6 0/8] " Lukasz Majewski
  2013-07-25 16:33   ` [PATCH v6 1/8] cpufreq: Store cpufreq policies in a list Lukasz Majewski
@ 2013-07-25 16:33   ` Lukasz Majewski
  2013-07-26  7:17     ` Viresh Kumar
  2013-07-25 16:33   ` [PATCH v6 3/8] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
                     ` (6 subsequent siblings)
  8 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-25 16:33 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Kukjin Kim, Myungjoo Ham, durgadoss.r

This commit adds boost frequency support in cpufreq core (Hardware &
Software). Some SoCs (like Exynos4 - e.g. 4x12) allow setting frequency
above its normal operation limits. Such mode shall be only used for a
short time.

Overclocking (boost) support is essentially provided by platform
dependent cpufreq driver.

This commit unifies support for SW and HW (Intel) overclocking solutions
in the core cpufreq driver. Previously the "boost" sysfs attribute was
defined at acpi driver code. By default boost is disabled. One global
attribute is available at: /sys/devices/system/cpu/cpufreq/boost.

It only shows up when cpufreq driver supports overclocking.
Under the hood frequencies dedicated for boosting are marked with a
special flag (CPUFREQ_BOOST_FREQ) at driver's frequency table.
It is the user's concern to enable/disable overclocking with a proper call
to sysfs.

The cpufreq_boost_trigger_state() function is defined non static on purpose.
It is used later with thermal subsystem to provide automatic enable/disable
of the BOOST feature.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v6:
- Remove sysfs boost attribute when subsys_iterface_unregister() fails
- Move global boost_enabled variable from cpufreq.c to platform dependent
  struct cpufreq_driver
- pr_err() message is also printed when boost disable fails
- Call __cpufreq_governor() to force recalculation of next frequency when
  boost is triggered. It is needed with i.e. performance class of governors
- Change cpufreq_boost_enable_sw() -> cpufreq_boost_set_sw()
- Rename .enable_boost function pointer to .set_boost

Changes for v5:
- Rename cpufreq_boost_trigger_state_sw() to cpufreq_boost_enable_sw()
- Extent cpufreq_register_driver() to check if cpufreq driver provided
  boost_enable callback. If not provided, then use cpufreq_boost_enable_sw()
- Use single call to cpufreq_driver->enable_boost() with cpufreq driver
  provided callback or default SW boost enable routine
- Move pr_debug call to store_boost() from cpufreq_boost_trigger_state()
- Change the user_policy.max value when SW boost is toggled. It is necessary
  for proper operation of e.g. thermal subsystem.
- Add check if cpufreq_driver pointer is not NULL at
  cpufreq_boost_supported() routine
- Add EXPORT_SYMBOL_GPL for cpufreq_boost_supported() and
  cpufreq_boost_enabled()
- Remove extra check for cpufreq_boost_supported() at
  cpufreq_freq_table_cpuinfo()
- Explanation of show boost logic at show_available_freqs()
- Add cpufreq_set_boost_enabled() method to set initial value of boost_enabled
  global flag

Changes for v4:
- Remove boost parameter from cpufreq_frequency_table_cpuinfo() function
- Introduce cpufreq_boost_supported() method
- Use of cpufreq_boost_supported() and cpufreq_boost_enabled() to decide
  if frequency shall be skipped
- Rename set_boost_freq() to enable_boost()
- cpufreq_attr_available_freq() moved to freq_table.c
- Use policy list to get access to cpufreq policies
- Rename global boost flag (cpufreq_boost_enabled -> boost_enabled)
- pr_err corrected ( %sable)
- Remove sanity check at cpufreq_boost_trigger_state() entrance [to test if
  boost is supported]
- Use either HW (boost_enable) callback or SW managed boost
- Introduce new cpufreq_boost_trigger_state_sw() method to handle boost
  at SW.
- Protect boost_enabled manipulation with lock.

Changes for v3:
- Method for reading boost status
- Removal of cpufreq_frequency_table_max()
- Extent cpufreq_frequency_table_cpuinfo() to support boost parameter
- boost_supported flag added to cpufreq_driver struct
- "boost" sysfs attribute control flag removed
- One global flag describing state of the boost defined at cpufreq core
- Rename cpufreq_driver's low_level_boost field to set_boost_freq()
- Usage of cpufreq_sysfs_{remove|add}_file() routines

Changes for v2:
- Removal of cpufreq_boost structure and move its fields to cpufreq_driver
  structure
- Flag to indicate if global boost attribute is already defined
- Extent the pr_{err|debbug} functions to show current function names

 drivers/cpufreq/cpufreq.c    |  115 +++++++++++++++++++++++++++++++++++++++++-
 drivers/cpufreq/freq_table.c |   53 ++++++++++++++++---
 include/linux/cpufreq.h      |   10 ++++
 3 files changed, 170 insertions(+), 8 deletions(-)

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 172a25e..15f8d79 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -377,6 +377,33 @@ EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
 /*********************************************************************
  *                          SYSFS INTERFACE                          *
  *********************************************************************/
+ssize_t show_boost(struct kobject *kobj,
+				 struct attribute *attr, char *buf)
+{
+	return sprintf(buf, "%d\n", cpufreq_driver->boost_enabled);
+}
+
+static ssize_t store_boost(struct kobject *kobj, struct attribute *attr,
+				  const char *buf, size_t count)
+{
+	int ret, enable;
+
+	ret = sscanf(buf, "%d", &enable);
+	if (ret != 1 || enable < 0 || enable > 1)
+		return -EINVAL;
+
+	if (cpufreq_boost_trigger_state(enable)) {
+		pr_err("%s: Cannot %s BOOST!\n", __func__,
+		       enable ? "enable" : "disable");
+		return -EINVAL;
+	}
+
+	pr_debug("%s: cpufreq BOOST %s\n", __func__,
+		 enable ? "enabled" : "disabled");
+
+	return count;
+}
+define_one_global_rw(boost);
 
 static struct cpufreq_governor *__find_governor(const char *str_governor)
 {
@@ -1970,6 +1997,70 @@ static struct notifier_block __refdata cpufreq_cpu_notifier = {
 };
 
 /*********************************************************************
+ *               BOOST						     *
+ *********************************************************************/
+static int cpufreq_boost_set_sw(int state)
+{
+	struct cpufreq_frequency_table *freq_table;
+	struct cpufreq_policy *policy;
+	int ret = -EINVAL;
+
+	list_for_each_entry(policy, &cpufreq_policy_list, policy_list) {
+		freq_table = cpufreq_frequency_get_table(policy->cpu);
+		if (freq_table) {
+			ret = cpufreq_frequency_table_cpuinfo(policy,
+							freq_table);
+			if (!ret) {
+				policy->user_policy.max = policy->max;
+				__cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
+			}
+		}
+	}
+
+	return ret;
+}
+
+int cpufreq_boost_trigger_state(int state)
+{
+	unsigned long flags;
+	int ret = 0;
+
+	if (cpufreq_driver->boost_enabled == state)
+		return 0;
+
+	write_lock_irqsave(&cpufreq_driver_lock, flags);
+	cpufreq_driver->boost_enabled = state;
+	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
+
+	ret = cpufreq_driver->set_boost(state);
+	if (ret) {
+		write_lock_irqsave(&cpufreq_driver_lock, flags);
+		cpufreq_driver->boost_enabled = 0;
+		write_unlock_irqrestore(&cpufreq_driver_lock, flags);
+
+		pr_err("%s: BOOST cannot %s\n", __func__,
+		       state ? "enabled" : "disabled");
+	}
+
+	return ret;
+}
+
+int cpufreq_boost_supported(void)
+{
+	if (cpufreq_driver)
+		return cpufreq_driver->boost_supported;
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(cpufreq_boost_supported);
+
+int cpufreq_boost_enabled(void)
+{
+	return cpufreq_driver->boost_enabled;
+}
+EXPORT_SYMBOL_GPL(cpufreq_boost_enabled);
+
+/*********************************************************************
  *               REGISTER / UNREGISTER CPUFREQ DRIVER                *
  *********************************************************************/
 
@@ -2008,9 +2099,25 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 	cpufreq_driver = driver_data;
 	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
 
+	if (cpufreq_boost_supported()) {
+		/*
+		 * Check if boost driver provides function to enable boost -
+		 * if not, use cpufreq_boost_set_sw as default
+		 */
+		if (!cpufreq_driver->set_boost)
+			cpufreq_driver->set_boost = cpufreq_boost_set_sw;
+
+		ret = cpufreq_sysfs_create_file(&(boost.attr));
+		if (ret) {
+			pr_err("%s: cannot register global BOOST sysfs file\n",
+				__func__);
+			goto err_null_driver;
+		}
+	}
+
 	ret = subsys_interface_register(&cpufreq_interface);
 	if (ret)
-		goto err_null_driver;
+		goto err_boost_unreg;
 
 	if (!(cpufreq_driver->flags & CPUFREQ_STICKY)) {
 		int i;
@@ -2037,6 +2144,9 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 	return 0;
 err_if_unreg:
 	subsys_interface_unregister(&cpufreq_interface);
+err_boost_unreg:
+	if (cpufreq_boost_supported())
+		cpufreq_sysfs_remove_file(&(boost.attr));
 err_null_driver:
 	write_lock_irqsave(&cpufreq_driver_lock, flags);
 	cpufreq_driver = NULL;
@@ -2063,6 +2173,9 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
 	pr_debug("unregistering driver %s\n", driver->name);
 
 	subsys_interface_unregister(&cpufreq_interface);
+	if (cpufreq_boost_supported())
+		cpufreq_sysfs_remove_file(&(boost.attr));
+
 	unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
 
 	write_lock_irqsave(&cpufreq_driver_lock, flags);
diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c
index f0d8741..17d03fc 100644
--- a/drivers/cpufreq/freq_table.c
+++ b/drivers/cpufreq/freq_table.c
@@ -34,6 +34,10 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
 
 			continue;
 		}
+		if (!cpufreq_boost_enabled()
+		    && table[i].driver_data == CPUFREQ_BOOST_FREQ)
+			continue;
+
 		pr_debug("table entry %u: %u kHz, %u driver_data\n",
 					i, freq, table[i].driver_data);
 		if (freq < min_freq)
@@ -171,7 +175,8 @@ static DEFINE_PER_CPU(struct cpufreq_frequency_table *, cpufreq_show_table);
 /**
  * show_available_freqs - show available frequencies for the specified CPU
  */
-static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
+static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf,
+				    bool show_boost)
 {
 	unsigned int i = 0;
 	unsigned int cpu = policy->cpu;
@@ -186,6 +191,20 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
 	for (i = 0; (table[i].frequency != CPUFREQ_TABLE_END); i++) {
 		if (table[i].frequency == CPUFREQ_ENTRY_INVALID)
 			continue;
+		/*
+		 * show_boost = true and driver_data = BOOST freq
+		 * display BOOST freqs
+		 *
+		 * show_boost = false and driver_data = BOOST freq
+		 * show_boost = true and driver_data != BOOST freq
+		 * continue - do not display anything
+		 *
+		 * show_boost = false and driver_data != BOOST freq
+		 * display NON BOOST freqs
+		 */
+		if (show_boost ^ (table[i].driver_data == CPUFREQ_BOOST_FREQ))
+			continue;
+
 		count += sprintf(&buf[count], "%d ", table[i].frequency);
 	}
 	count += sprintf(&buf[count], "\n");
@@ -194,14 +213,34 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
 
 }
 
-struct freq_attr cpufreq_freq_attr_scaling_available_freqs = {
-	.attr = { .name = "scaling_available_frequencies",
-		  .mode = 0444,
-		},
-	.show = show_available_freqs,
-};
+#define cpufreq_attr_available_freq(_name)	  \
+struct freq_attr cpufreq_freq_attr_##_name##_freqs =     \
+__ATTR_RO(_name##_frequencies)
+
+/**
+ * show_scaling_available_frequencies - show available normal frequencies for
+ * the specified CPU
+ */
+static ssize_t scaling_available_frequencies_show(struct cpufreq_policy *policy,
+						  char *buf)
+{
+	return show_available_freqs(policy, buf, 0);
+}
+cpufreq_attr_available_freq(scaling_available);
 EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_available_freqs);
 
+/**
+ * show_available_boost_freqs - show available boost frequencies for
+ * the specified CPU
+ */
+static ssize_t scaling_boost_frequencies_show(struct cpufreq_policy *policy,
+					      char *buf)
+{
+	return show_available_freqs(policy, buf, 1);
+}
+cpufreq_attr_available_freq(scaling_boost);
+EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_boost_freqs);
+
 /*
  * if you use these, you must assure that the frequency table is valid
  * all the time between get_attr and put_attr!
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index d8e30fc..49a73c9 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -267,6 +267,11 @@ struct cpufreq_driver {
 	int	(*suspend)	(struct cpufreq_policy *policy);
 	int	(*resume)	(struct cpufreq_policy *policy);
 	struct freq_attr	**attr;
+
+	/* platform specific boost support code */
+	bool                    boost_supported;
+	bool                    boost_enabled;
+	int     (*set_boost)    (int state);
 };
 
 /* flags */
@@ -410,6 +415,7 @@ extern struct cpufreq_governor cpufreq_gov_conservative;
 
 #define CPUFREQ_ENTRY_INVALID ~0
 #define CPUFREQ_TABLE_END     ~1
+#define CPUFREQ_BOOST_FREQ    ~2
 
 struct cpufreq_frequency_table {
 	unsigned int	driver_data; /* driver specific data, not used by core */
@@ -429,11 +435,15 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
 				   unsigned int relation,
 				   unsigned int *index);
 
+int cpufreq_boost_trigger_state(int state);
+int cpufreq_boost_supported(void);
+int cpufreq_boost_enabled(void);
 /* the following 3 funtions are for cpufreq core use only */
 struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu);
 
 /* the following are really really optional */
 extern struct freq_attr cpufreq_freq_attr_scaling_available_freqs;
+extern struct freq_attr cpufreq_freq_attr_scaling_boost_freqs;
 
 void cpufreq_frequency_table_get_attr(struct cpufreq_frequency_table *table,
 				      unsigned int cpu);
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v6 3/8] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution
  2013-07-25 16:33 ` [PATCH v6 0/8] " Lukasz Majewski
  2013-07-25 16:33   ` [PATCH v6 1/8] cpufreq: Store cpufreq policies in a list Lukasz Majewski
  2013-07-25 16:33   ` [PATCH v6 2/8] cpufreq: Add boost frequency support in core Lukasz Majewski
@ 2013-07-25 16:33   ` Lukasz Majewski
  2013-07-26  7:28     ` Viresh Kumar
  2013-07-25 16:33   ` [PATCH v6 4/8] thermal:boost: Automatic enable/disable of BOOST feature Lukasz Majewski
                     ` (5 subsequent siblings)
  8 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-25 16:33 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Kukjin Kim, Myungjoo Ham, durgadoss.r

The Intel's hardware based boost solution driver has been changed to cooperate with
common cpufreq boost framework.

The global sysfs boost attribute entry code (/sys/devices/system/cpu/cpufreq/boost)
has been moved to a core cpufreq code. This attribute is now only visible,
when cpufreq driver supports it.

The _store_boost() function has been redesigned to be used as set_boost
callback.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v6:
- Perform acpi_cpufreq_boost_init initialization before cpufreq_driver
  registration
- Compile store_boost() only when CONFIG_X86_ACPI_CPUFREQ_CPB defined
- Use boost_enabled flag defined at acpi_cpufreq_driver to store information
  about boost state
- Instead of using cpufreq_set_boost_enabled(), modify the boost_enable in
  the acpi driver code

Changes for v5:
- Remove acpi-cpufreq's boost_enabled global flag and reuse one defined at
  cpufreq core

Changes for v4:
- add _store_boost to acpi_cpufreq_driver structure

Changes for v3:
- Bring back boost_enabled as a global flag
- Move boost_supported to cpufreq_driver structure

Changes for v2:
- Replace boost_enabled and boost_supported global flags with proper entries
  at struct cpufreq_driver.
- Removal of struct cpufreq_boost

 drivers/cpufreq/acpi-cpufreq.c |   87 ++++++++++++++--------------------------
 1 file changed, 30 insertions(+), 57 deletions(-)

diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c
index 3926402..509764c 100644
--- a/drivers/cpufreq/acpi-cpufreq.c
+++ b/drivers/cpufreq/acpi-cpufreq.c
@@ -81,7 +81,6 @@ static struct acpi_processor_performance __percpu *acpi_perf_data;
 static struct cpufreq_driver acpi_cpufreq_driver;
 
 static unsigned int acpi_pstate_strict;
-static bool boost_enabled, boost_supported;
 static struct msr __percpu *msrs;
 
 static bool boost_state(unsigned int cpu)
@@ -134,49 +133,16 @@ static void boost_set_msrs(bool enable, const struct cpumask *cpumask)
 	wrmsr_on_cpus(cpumask, msr_addr, msrs);
 }
 
-static ssize_t _store_boost(const char *buf, size_t count)
+static int _store_boost(int val)
 {
-	int ret;
-	unsigned long val = 0;
-
-	if (!boost_supported)
-		return -EINVAL;
-
-	ret = kstrtoul(buf, 10, &val);
-	if (ret || (val > 1))
-		return -EINVAL;
-
-	if ((val && boost_enabled) || (!val && !boost_enabled))
-		return count;
-
 	get_online_cpus();
-
 	boost_set_msrs(val, cpu_online_mask);
-
 	put_online_cpus();
-
-	boost_enabled = val;
 	pr_debug("Core Boosting %sabled.\n", val ? "en" : "dis");
 
-	return count;
-}
-
-static ssize_t store_global_boost(struct kobject *kobj, struct attribute *attr,
-				  const char *buf, size_t count)
-{
-	return _store_boost(buf, count);
-}
-
-static ssize_t show_global_boost(struct kobject *kobj,
-				 struct attribute *attr, char *buf)
-{
-	return sprintf(buf, "%u\n", boost_enabled);
+	return 0;
 }
 
-static struct global_attr global_boost = __ATTR(boost, 0644,
-						show_global_boost,
-						store_global_boost);
-
 static ssize_t show_freqdomain_cpus(struct cpufreq_policy *policy, char *buf)
 {
 	struct acpi_cpufreq_data *data = per_cpu(acfreq_data, policy->cpu);
@@ -187,15 +153,32 @@ static ssize_t show_freqdomain_cpus(struct cpufreq_policy *policy, char *buf)
 cpufreq_freq_attr_ro(freqdomain_cpus);
 
 #ifdef CONFIG_X86_ACPI_CPUFREQ_CPB
+static ssize_t store_boost(const char *buf, size_t count)
+{
+	int ret;
+	unsigned long val = 0;
+
+	if (!acpi_cpufreq_driver.boost_supported)
+		return -EINVAL;
+
+	ret = kstrtoul(buf, 10, &val);
+	if (ret || (val > 1))
+		return -EINVAL;
+
+	_store_boost((int) val);
+
+	return count;
+}
+
 static ssize_t store_cpb(struct cpufreq_policy *policy, const char *buf,
 			 size_t count)
 {
-	return _store_boost(buf, count);
+	return store_boost(buf, count);
 }
 
 static ssize_t show_cpb(struct cpufreq_policy *policy, char *buf)
 {
-	return sprintf(buf, "%u\n", boost_enabled);
+	return sprintf(buf, "%u\n", acpi_cpufreq_driver.boost_enabled);
 }
 
 static struct freq_attr cpb = __ATTR(cpb, 0644, show_cpb, store_cpb);
@@ -583,7 +566,7 @@ static int boost_notify(struct notifier_block *nb, unsigned long action,
 	switch (action) {
 	case CPU_UP_PREPARE:
 	case CPU_UP_PREPARE_FROZEN:
-		boost_set_msrs(boost_enabled, cpumask);
+		boost_set_msrs(acpi_cpufreq_driver.boost_enabled, cpumask);
 		break;
 
 	case CPU_DOWN_PREPARE:
@@ -943,43 +926,34 @@ static struct cpufreq_driver acpi_cpufreq_driver = {
 	.name		= "acpi-cpufreq",
 	.owner		= THIS_MODULE,
 	.attr		= acpi_cpufreq_attr,
+	.set_boost      = _store_boost,
 };
 
 static void __init acpi_cpufreq_boost_init(void)
 {
+	acpi_cpufreq_driver.boost_supported = false;
 	if (boot_cpu_has(X86_FEATURE_CPB) || boot_cpu_has(X86_FEATURE_IDA)) {
 		msrs = msrs_alloc();
 
 		if (!msrs)
 			return;
 
-		boost_supported = true;
-		boost_enabled = boost_state(0);
-
+		acpi_cpufreq_driver.boost_supported = true;
+		acpi_cpufreq_driver.boost_enabled = boost_state(0);
 		get_online_cpus();
 
 		/* Force all MSRs to the same value */
-		boost_set_msrs(boost_enabled, cpu_online_mask);
+		boost_set_msrs(acpi_cpufreq_driver.boost_enabled,
+			       cpu_online_mask);
 
 		register_cpu_notifier(&boost_nb);
 
 		put_online_cpus();
-	} else
-		global_boost.attr.mode = 0444;
-
-	/* We create the boost file in any case, though for systems without
-	 * hardware support it will be read-only and hardwired to return 0.
-	 */
-	if (cpufreq_sysfs_create_file(&(global_boost.attr)))
-		pr_warn(PFX "could not register global boost sysfs file\n");
-	else
-		pr_debug("registered global boost sysfs file\n");
+	}
 }
 
 static void __exit acpi_cpufreq_boost_exit(void)
 {
-	cpufreq_sysfs_remove_file(&(global_boost.attr));
-
 	if (msrs) {
 		unregister_cpu_notifier(&boost_nb);
 
@@ -1021,12 +995,11 @@ static int __init acpi_cpufreq_init(void)
 			*iter = &cpb;
 	}
 #endif
+	acpi_cpufreq_boost_init();
 
 	ret = cpufreq_register_driver(&acpi_cpufreq_driver);
 	if (ret)
 		free_acpi_perf_data();
-	else
-		acpi_cpufreq_boost_init();
 
 	return ret;
 }
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v6 4/8] thermal:boost: Automatic enable/disable of BOOST feature
  2013-07-25 16:33 ` [PATCH v6 0/8] " Lukasz Majewski
                     ` (2 preceding siblings ...)
  2013-07-25 16:33   ` [PATCH v6 3/8] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
@ 2013-07-25 16:33   ` Lukasz Majewski
  2013-08-12  9:17     ` Lukasz Majewski
  2013-07-25 16:33   ` [PATCH v6 5/8] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
                     ` (4 subsequent siblings)
  8 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-25 16:33 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Kukjin Kim, Myungjoo Ham, durgadoss.r

This patch provides auto disable/enable operation for boost. When any
defined trip point is passed, the boost is disabled.
In that moment thermal monitor workqueue is woken up and it monitors
if the device temperature drops below 75% of the smallest trip point.
When device cools down, the boost is enabled again.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v6:
- Disable boost only when supported and enabled
- Protect boost related thermal_zone_device struct fields with mutex
- Evaluate temperature trend during boost enable decision
- Create separate methods to handle boost enable/disable
  (thermal_boost_{enable|disable}) operations
- Boost is disabled at any trip point passage (not only the non critical one)
- Add stub definitions for cpufreq boost functions used when
  CONFIG_CPU_FREQ is NOT defined.

Changes for v5:
- Move boost disable code from cpu_cooling.c to thermal_core.c
  (to handle_non_critical_trips)
- Extent struct thermal_zone_device by adding overheated bool flag
- Implement auto enable of boost after device cools down
- Introduce boost_polling flag, which indicates if thermal uses it's predefined
  pool delay or has woken up thermal workqueue only to wait until device
  cools down.

Changes for v4:
- New patch

 drivers/thermal/thermal_core.c |   55 ++++++++++++++++++++++++++++++++++++++++
 include/linux/cpufreq.h        |   15 +++++++++++
 include/linux/thermal.h        |    2 ++
 3 files changed, 72 insertions(+)

diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
index 1f02e8e..8f4be55 100644
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -34,6 +34,7 @@
 #include <linux/thermal.h>
 #include <linux/reboot.h>
 #include <linux/string.h>
+#include <linux/cpufreq.h>
 #include <net/netlink.h>
 #include <net/genetlink.h>
 
@@ -354,9 +355,59 @@ static void handle_critical_trips(struct thermal_zone_device *tz,
 	}
 }
 
+static int thermal_boost_enable(struct thermal_zone_device *tz)
+{
+	enum thermal_trend trend = get_tz_trend(tz, 0);
+	long trip_temp;
+
+	if (!tz->ops->get_trip_temp || !tz->overheated)
+		return -EPERM;
+	if (trend == THERMAL_TREND_RAISING || trend == THERMAL_TREND_RAISE_FULL)
+		return -EBUSY;
+
+	tz->ops->get_trip_temp(tz, 0, &trip_temp);
+	/*
+	 * Enable boost again only when current temperature is less
+	 * than 75% of trip_temp[0]
+	 */
+	if ((tz->temperature + (trip_temp >> 2)) < trip_temp) {
+		mutex_lock(&tz->lock);
+		tz->overheated = false;
+		if (tz->boost_polling) {
+			tz->boost_polling = false;
+			tz->polling_delay = 0;
+		}
+		mutex_unlock(&tz->lock);
+		cpufreq_boost_trigger_state(1);
+		return 0;
+	}
+	return -EBUSY;
+}
+
+static void thermal_boost_disable(struct thermal_zone_device *tz)
+{
+	cpufreq_boost_trigger_state(0);
+
+	/*
+	 * If no workqueue for monitoring is running - start one with
+	 * 1000 ms monitoring period
+	 * If workqueue already running - do not change its period and only
+	 * test if target CPU has cooled down
+	 */
+	mutex_lock(&tz->lock);
+	if (!tz->polling_delay) {
+		tz->boost_polling = true;
+		tz->polling_delay = 1000;
+	}
+	tz->overheated = true;
+	mutex_unlock(&tz->lock);
+}
+
 static void handle_thermal_trip(struct thermal_zone_device *tz, int trip)
 {
 	enum thermal_trip_type type;
+	if (cpufreq_boost_supported() && cpufreq_boost_enabled())
+		thermal_boost_disable(tz);
 
 	tz->ops->get_trip_type(tz, trip, &type);
 
@@ -455,6 +506,10 @@ static void thermal_zone_device_check(struct work_struct *work)
 	struct thermal_zone_device *tz = container_of(work, struct
 						      thermal_zone_device,
 						      poll_queue.work);
+	if (cpufreq_boost_supported())
+		if (!thermal_boost_enable(tz))
+			return;
+
 	thermal_zone_device_update(tz);
 }
 
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index 49a73c9..3d9276d 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -435,9 +435,24 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
 				   unsigned int relation,
 				   unsigned int *index);
 
+#ifdef CONFIG_CPU_FREQ
 int cpufreq_boost_trigger_state(int state);
 int cpufreq_boost_supported(void);
 int cpufreq_boost_enabled(void);
+#else
+static inline int cpufreq_boost_trigger_state(int state)
+{
+	return 0;
+}
+static inline int cpufreq_boost_supported(void)
+{
+	return 0;
+}
+static inline int cpufreq_boost_enabled(void)
+{
+	return 0;
+}
+#endif
 /* the following 3 funtions are for cpufreq core use only */
 struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu);
 
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index a386a1c..f1aa3c2 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -172,6 +172,8 @@ struct thermal_zone_device {
 	int emul_temperature;
 	int passive;
 	unsigned int forced_passive;
+	bool overheated;
+	bool boost_polling;
 	const struct thermal_zone_device_ops *ops;
 	const struct thermal_zone_params *tzp;
 	struct thermal_governor *governor;
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v6 5/8] cpufreq:boost:Kconfig: Provide support for software managed BOOST
  2013-07-25 16:33 ` [PATCH v6 0/8] " Lukasz Majewski
                     ` (3 preceding siblings ...)
  2013-07-25 16:33   ` [PATCH v6 4/8] thermal:boost: Automatic enable/disable of BOOST feature Lukasz Majewski
@ 2013-07-25 16:33   ` Lukasz Majewski
  2013-07-26 10:24     ` Viresh Kumar
  2013-07-25 16:33   ` [PATCH v6 6/8] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
                     ` (3 subsequent siblings)
  8 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-25 16:33 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Kukjin Kim, Myungjoo Ham, durgadoss.r

For safety reasons new flag - CONFIG_CPU_FREQ_BOOST_SW has been added.
Only after selecting "EXYNOS Frequency Overclocking - Software" Kconfig
option the software managed boost is enabled. It also selects thermal
subsystem to be compiled in. Thermal is necessary for disabling boost
and cooling down the device when overheating detected.

Boost _MUST_NOT_ work without thermal subsystem with properly defined
overheating temperatures.

This option doesn't affect x86's ACPI hardware managed boost support
(i.e. Intel, AMD). In this situation boost management is embedded at
hardware.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v6:
- CPU_FREQ_BOOST_SW [1] is now defined as "invisible" bool option.
- Platform dependent ARM_EXYNOS_CPU_FREQ_BOOST_SW config option has been
  added. It depends on ARM_EXYNOS_CPUFREQ options and selects
  EXYNOS_THERMAL with the main boost config [1].

Changes for v5:
- New patch

 drivers/cpufreq/Kconfig     |    3 +++
 drivers/cpufreq/Kconfig.arm |   16 ++++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
index 534fcb8..3f058a3 100644
--- a/drivers/cpufreq/Kconfig
+++ b/drivers/cpufreq/Kconfig
@@ -23,6 +23,9 @@ config CPU_FREQ_TABLE
 config CPU_FREQ_GOV_COMMON
 	bool
 
+config CPU_FREQ_BOOST_SW
+	bool
+
 config CPU_FREQ_STAT
 	tristate "CPU frequency translation statistics"
 	select CPU_FREQ_TABLE
diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm
index de4d5d9..c8abb93 100644
--- a/drivers/cpufreq/Kconfig.arm
+++ b/drivers/cpufreq/Kconfig.arm
@@ -55,6 +55,22 @@ config ARM_EXYNOS5440_CPUFREQ
 	  different than previous exynos controllers so not using
 	  the common exynos framework.
 
+config ARM_EXYNOS_CPU_FREQ_BOOST_SW
+	bool "EXYNOS Frequency Overclocking - Software"
+	depends on ARM_EXYNOS_CPUFREQ
+	select CPU_FREQ_BOOST_SW
+	select EXYNOS_THERMAL
+	default n
+	help
+	  This driver supports software managed overclocking (BOOST).
+	  It allows usage of special frequencies for Samsung Exynos
+	  processors if thermal conditions are appropriate.
+
+	  It reguires, for safe operation, thermal framework with properly
+	  defined trip points.
+
+	  If in doubt, say N.
+
 config ARM_HIGHBANK_CPUFREQ
 	tristate "Calxeda Highbank-based"
 	depends on ARCH_HIGHBANK
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v6 6/8] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework
  2013-07-25 16:33 ` [PATCH v6 0/8] " Lukasz Majewski
                     ` (4 preceding siblings ...)
  2013-07-25 16:33   ` [PATCH v6 5/8] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
@ 2013-07-25 16:33   ` Lukasz Majewski
  2013-07-26 10:26     ` Viresh Kumar
  2013-07-25 16:33   ` [PATCH v6 7/8] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
                     ` (2 subsequent siblings)
  8 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-25 16:33 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Kukjin Kim, Myungjoo Ham, durgadoss.r

The cpufreq_driver's boost_supported flag is true only when boost
support is explicitly enabled. Boost related attributes are exported only
under the same condition.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v6:
- Replace exynos_driver.boost_supported = 1 to = true
- Protect boost attributes export with CONFIG_CPU_FREQ_BOOST_SW

Changes for v5:
- None

Changes for v4:
- None

Changes for v3:
- Remove low level boost code
- Move boost management code to cpufreq core code
- Use boost_supported flag to indicate if driver supports over clocking

Changes for v2:
- Removal of struct cpufreq_boost
- Removal of the CONFIG_CPU_FREQ_BOOST flag
- low_level_boost with valid address when boost is supported

 drivers/cpufreq/exynos-cpufreq.c |    6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/cpufreq/exynos-cpufreq.c b/drivers/cpufreq/exynos-cpufreq.c
index 9ae1871..175172d9 100644
--- a/drivers/cpufreq/exynos-cpufreq.c
+++ b/drivers/cpufreq/exynos-cpufreq.c
@@ -270,6 +270,9 @@ static int exynos_cpufreq_cpu_exit(struct cpufreq_policy *policy)
 
 static struct freq_attr *exynos_cpufreq_attr[] = {
 	&cpufreq_freq_attr_scaling_available_freqs,
+#ifdef CONFIG_CPU_FREQ_BOOST_SW
+	&cpufreq_freq_attr_scaling_boost_freqs,
+#endif
 	NULL,
 };
 
@@ -332,6 +335,9 @@ static int __init exynos_cpufreq_probe(struct platform_device *pdev)
 
 	locking_frequency = exynos_getspeed(0);
 
+#ifdef CONFIG_CPU_FREQ_BOOST_SW
+	exynos_driver.boost_supported = true;
+#endif
 	register_pm_notifier(&exynos_cpufreq_nb);
 
 	if (cpufreq_register_driver(&exynos_driver)) {
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v6 7/8] Documentation:cpufreq:boost: Update BOOST documentation
  2013-07-25 16:33 ` [PATCH v6 0/8] " Lukasz Majewski
                     ` (5 preceding siblings ...)
  2013-07-25 16:33   ` [PATCH v6 6/8] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
@ 2013-07-25 16:33   ` Lukasz Majewski
  2013-07-25 16:33   ` [PATCH v6 8/8] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
  2013-07-26 10:28   ` [PATCH v6 0/8] cpufreq:boost: CPU Boost mode support Viresh Kumar
  8 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-25 16:33 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Kukjin Kim, Myungjoo Ham, durgadoss.r

Since the support for software and hardware controlled boosting has been
added, the corresponding Documentation entry had been updated.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v6:
- None

Changes for v5:
- New patch

 Documentation/cpu-freq/boost.txt |   26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/Documentation/cpu-freq/boost.txt b/Documentation/cpu-freq/boost.txt
index 9b4edfc..dd62e13 100644
--- a/Documentation/cpu-freq/boost.txt
+++ b/Documentation/cpu-freq/boost.txt
@@ -17,8 +17,8 @@ Introduction
 Some CPUs support a functionality to raise the operating frequency of
 some cores in a multi-core package if certain conditions apply, mostly
 if the whole chip is not fully utilized and below it's intended thermal
-budget. This is done without operating system control by a combination
-of hardware and firmware.
+budget. The decision about boost disable/enable is made either at hardware
+(e.g. x86) or software (e.g ARM).
 On Intel CPUs this is called "Turbo Boost", AMD calls it "Turbo-Core",
 in technical documentation "Core performance boost". In Linux we use
 the term "boost" for convenience.
@@ -48,24 +48,24 @@ be desirable:
 User controlled switch
 ----------------------
 
-To allow the user to toggle the boosting functionality, the acpi-cpufreq
-driver exports a sysfs knob to disable it. There is a file:
+To allow the user to toggle the boosting functionality, the cpufreq core
+driver exports a sysfs knob to enable or disable it. There is a file:
 /sys/devices/system/cpu/cpufreq/boost
 which can either read "0" (boosting disabled) or "1" (boosting enabled).
-Reading the file is always supported, even if the processor does not
-support boosting. In this case the file will be read-only and always
-reads as "0". Explicitly changing the permissions and writing to that
-file anyway will return EINVAL.
+The file is exported only when cpufreq driver supports boosting.
+Explicitly changing the permissions and writing to that file anyway will
+return EINVAL.
 
 On supported CPUs one can write either a "0" or a "1" into this file.
 This will either disable the boost functionality on all cores in the
-whole system (0) or will allow the hardware to boost at will (1).
+whole system (0) or will allow the software or hardware to boost at will
+(1).
 
 Writing a "1" does not explicitly boost the system, but just allows the
-CPU (and the firmware) to boost at their discretion. Some implementations
-take external factors like the chip's temperature into account, so
-boosting once does not necessarily mean that it will occur every time
-even using the exact same software setup.
+CPU to boost at their discretion. Some implementations take external
+factors like the chip's temperature into account, so boosting once does
+not necessarily mean that it will occur every time even using the exact
+same software setup.
 
 
 AMD legacy cpb switch
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v6 8/8] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ
  2013-07-25 16:33 ` [PATCH v6 0/8] " Lukasz Majewski
                     ` (6 preceding siblings ...)
  2013-07-25 16:33   ` [PATCH v6 7/8] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
@ 2013-07-25 16:33   ` Lukasz Majewski
  2013-07-26 10:28   ` [PATCH v6 0/8] cpufreq:boost: CPU Boost mode support Viresh Kumar
  8 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-25 16:33 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Kukjin Kim, Myungjoo Ham, durgadoss.r

Special driver data flag (CPUFREQ_BOOST_FREQ) has been added to indicate
frequency, which can be only enabled for BOOST mode.
This frequency shall be used only for limited time, since it might cause
target device to overheat.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v6:
- New patch

 drivers/cpufreq/exynos4x12-cpufreq.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/cpufreq/exynos4x12-cpufreq.c b/drivers/cpufreq/exynos4x12-cpufreq.c
index e270b42..367f600 100644
--- a/drivers/cpufreq/exynos4x12-cpufreq.c
+++ b/drivers/cpufreq/exynos4x12-cpufreq.c
@@ -32,7 +32,7 @@ static unsigned int exynos4x12_volt_table[] = {
 };
 
 static struct cpufreq_frequency_table exynos4x12_freq_table[] = {
-	{L0, CPUFREQ_ENTRY_INVALID},
+	{CPUFREQ_BOOST_FREQ, 1500 * 1000},
 	{L1, 1400 * 1000},
 	{L2, 1300 * 1000},
 	{L3, 1200 * 1000},
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 2/8] cpufreq: Add boost frequency support in core
  2013-07-25 16:33   ` [PATCH v6 2/8] cpufreq: Add boost frequency support in core Lukasz Majewski
@ 2013-07-26  7:17     ` Viresh Kumar
  2013-07-26  8:33       ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-07-26  7:17 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, durgadoss.r, Lists linaro-kernel

On 25 July 2013 22:03, Lukasz Majewski <l.majewski@samsung.com> wrote:
> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c

>  /*********************************************************************
> + *               BOOST                                              *
> + *********************************************************************/
> +static int cpufreq_boost_set_sw(int state)
> +{
> +       struct cpufreq_frequency_table *freq_table;
> +       struct cpufreq_policy *policy;
> +       int ret = -EINVAL;
> +
> +       list_for_each_entry(policy, &cpufreq_policy_list, policy_list) {
> +               freq_table = cpufreq_frequency_get_table(policy->cpu);
> +               if (freq_table) {
> +                       ret = cpufreq_frequency_table_cpuinfo(policy,
> +                                                       freq_table);
> +                       if (!ret) {
> +                               policy->user_policy.max = policy->max;
> +                               __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
> +                       }
> +               }
> +       }
> +
> +       return ret;
> +}
> +
> +int cpufreq_boost_trigger_state(int state)
> +{
> +       unsigned long flags;
> +       int ret = 0;
> +
> +       if (cpufreq_driver->boost_enabled == state)
> +               return 0;
> +
> +       write_lock_irqsave(&cpufreq_driver_lock, flags);
> +       cpufreq_driver->boost_enabled = state;
> +       write_unlock_irqrestore(&cpufreq_driver_lock, flags);

Not sure if we should leave the lock at this point of time, as we
haven't enabled boost until now.

If somebody tries to use this variable at this point of time, then
it would get the wrong information about it.

> +       ret = cpufreq_driver->set_boost(state);
> +       if (ret) {
> +               write_lock_irqsave(&cpufreq_driver_lock, flags);
> +               cpufreq_driver->boost_enabled = 0;

should be:
                    cpufreq_driver->boost_enabled = !state;

> +               write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> +
> +               pr_err("%s: BOOST cannot %s\n", __func__,

s/BOOST cannot %s/Cannot %s BOOST

> +                      state ? "enabled" : "disabled");
> +       }
> +
> +       return ret;
> +}
> +
> +int cpufreq_boost_supported(void)
> +{
> +       if (cpufreq_driver)

This routine is always called from places where cpufreq_driver
can't be NULL..

--contd--

> +               return cpufreq_driver->boost_supported;
> +
> +       return 0;
> +}
> +EXPORT_SYMBOL_GPL(cpufreq_boost_supported);
> +
> +int cpufreq_boost_enabled(void)
> +{
> +       return cpufreq_driver->boost_enabled;

And if above check is necessary, then don't you need to check
it here as well?

> +}
> +EXPORT_SYMBOL_GPL(cpufreq_boost_enabled);
> +
> +/*********************************************************************
>   *               REGISTER / UNREGISTER CPUFREQ DRIVER                *
>   *********************************************************************/
>
> @@ -2008,9 +2099,25 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
>         cpufreq_driver = driver_data;
>         write_unlock_irqrestore(&cpufreq_driver_lock, flags);
>
> +       if (cpufreq_boost_supported()) {
> +               /*
> +                * Check if boost driver provides function to enable boost -

s/boost driver/driver

> +                * if not, use cpufreq_boost_set_sw as default
> +                */
> +               if (!cpufreq_driver->set_boost)
> +                       cpufreq_driver->set_boost = cpufreq_boost_set_sw;
> +
> +               ret = cpufreq_sysfs_create_file(&(boost.attr));

You don't need braces around boost.attr.

> +               if (ret) {
> +                       pr_err("%s: cannot register global BOOST sysfs file\n",
> +                               __func__);
> +                       goto err_null_driver;
> +               }
> +       }
> +
>         ret = subsys_interface_register(&cpufreq_interface);
>         if (ret)
> -               goto err_null_driver;
> +               goto err_boost_unreg;
>
>         if (!(cpufreq_driver->flags & CPUFREQ_STICKY)) {
>                 int i;
> @@ -2037,6 +2144,9 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
>         return 0;
>  err_if_unreg:
>         subsys_interface_unregister(&cpufreq_interface);
> +err_boost_unreg:
> +       if (cpufreq_boost_supported())
> +               cpufreq_sysfs_remove_file(&(boost.attr));

same here.

>  err_null_driver:
>         write_lock_irqsave(&cpufreq_driver_lock, flags);
>         cpufreq_driver = NULL;
> @@ -2063,6 +2173,9 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
>         pr_debug("unregistering driver %s\n", driver->name);
>
>         subsys_interface_unregister(&cpufreq_interface);
> +       if (cpufreq_boost_supported())
> +               cpufreq_sysfs_remove_file(&(boost.attr));

here too.

> +
>         unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
>
>         write_lock_irqsave(&cpufreq_driver_lock, flags);

> +static ssize_t scaling_available_frequencies_show(struct cpufreq_policy *policy,
> +                                                 char *buf)
> +{
> +       return show_available_freqs(policy, buf, 0);

s/0/false

> +}

> +static ssize_t scaling_boost_frequencies_show(struct cpufreq_policy *policy,
> +                                             char *buf)
> +{
> +       return show_available_freqs(policy, buf, 1);

s/1/true

> +}

Looks good mostly.. We Should be to get it in 3.12 :)

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 3/8] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution
  2013-07-25 16:33   ` [PATCH v6 3/8] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
@ 2013-07-26  7:28     ` Viresh Kumar
  2013-07-26  8:09       ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-07-26  7:28 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, durgadoss.r

On 25 July 2013 22:03, Lukasz Majewski <l.majewski@samsung.com> wrote:
> diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c

>  static void __init acpi_cpufreq_boost_init(void)
>  {
> +       acpi_cpufreq_driver.boost_supported = false;

Would be better if we do this in else of below if.

>         if (boot_cpu_has(X86_FEATURE_CPB) || boot_cpu_has(X86_FEATURE_IDA)) {
>                 msrs = msrs_alloc();


> @@ -1021,12 +995,11 @@ static int __init acpi_cpufreq_init(void)
>                         *iter = &cpb;
>         }
>  #endif
> +       acpi_cpufreq_boost_init();

We are calling it before registering cpufreq driver. Will this have
any complications?

>         ret = cpufreq_register_driver(&acpi_cpufreq_driver);
>         if (ret)
>                 free_acpi_perf_data();
> -       else
> -               acpi_cpufreq_boost_init();
>
>         return ret;

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 3/8] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution
  2013-07-26  7:28     ` Viresh Kumar
@ 2013-07-26  8:09       ` Lukasz Majewski
  2013-07-26  9:24         ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-26  8:09 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, durgadoss.r

On Fri, 26 Jul 2013 12:58:02 +0530 Viresh Kumar wrote,
> On 25 July 2013 22:03, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > diff --git a/drivers/cpufreq/acpi-cpufreq.c
> > b/drivers/cpufreq/acpi-cpufreq.c
> 
> >  static void __init acpi_cpufreq_boost_init(void)
> >  {
> > +       acpi_cpufreq_driver.boost_supported = false;
	    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [*]
> 
> Would be better if we do this in else of below if.

We need to set boost_supported = false at [*] for the case when:
1. msrs_alloc fails 
or 
2. acpi_cpufreq is built as a module and can be inserted and removed
several times. Without [*] we could end up with wrong (not false)
initial state.

> 
> >         if (boot_cpu_has(X86_FEATURE_CPB) ||
> > boot_cpu_has(X86_FEATURE_IDA)) { msrs = msrs_alloc();
> 
> 
> > @@ -1021,12 +995,11 @@ static int __init acpi_cpufreq_init(void)
> >                         *iter = &cpb;
> >         }
> >  #endif
> > +       acpi_cpufreq_boost_init();
	    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [**]
> 
> We are calling it before registering cpufreq driver. Will this have
> any complications?

When we call [**] after the cpufreq_register_driver [***] we end up with
sysfs boost attribute not exported at x86.
The boost attribute is exported at [***] only when
acpi_cpufreq.boost_supported = true. However support for boost at x86
is evaluated at acpi_cpufreq_boost_init().


> 
> >         ret = cpufreq_register_driver(&acpi_cpufreq_driver);
> >         if (ret)
> >                 free_acpi_perf_data();
> > -       else
> > -               acpi_cpufreq_boost_init();
> >
> >         return ret;



-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 2/8] cpufreq: Add boost frequency support in core
  2013-07-26  7:17     ` Viresh Kumar
@ 2013-07-26  8:33       ` Lukasz Majewski
  2013-07-26  9:33         ` Viresh Kumar
                           ` (2 more replies)
  0 siblings, 3 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-26  8:33 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, durgadoss.r, Lists linaro-kernel

On Fri, 26 Jul 2013 12:47:15 +0530 Viresh Kumar wrote,
> On 25 July 2013 22:03, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> 
> >  /*********************************************************************
> > + *
> > BOOST                                              *
> > +
> > *********************************************************************/
> > +static int cpufreq_boost_set_sw(int state) +{
> > +       struct cpufreq_frequency_table *freq_table;
> > +       struct cpufreq_policy *policy;
> > +       int ret = -EINVAL;
> > +
> > +       list_for_each_entry(policy, &cpufreq_policy_list,
> > policy_list) {
> > +               freq_table =
> > cpufreq_frequency_get_table(policy->cpu);
> > +               if (freq_table) {
> > +                       ret =
> > cpufreq_frequency_table_cpuinfo(policy,
> > +                                                       freq_table);
> > +                       if (!ret) {
> > +                               policy->user_policy.max =
> > policy->max;
> > +                               __cpufreq_governor(policy,
> > CPUFREQ_GOV_LIMITS);
> > +                       }
> > +               }
> > +       }
> > +
> > +       return ret;
> > +}
> > +
> > +int cpufreq_boost_trigger_state(int state)
> > +{
> > +       unsigned long flags;
> > +       int ret = 0;
> > +
> > +       if (cpufreq_driver->boost_enabled == state)
> > +               return 0;
> > +
> > +       write_lock_irqsave(&cpufreq_driver_lock, flags);
> > +       cpufreq_driver->boost_enabled = state;
> > +       write_unlock_irqrestore(&cpufreq_driver_lock, flags);
	    ^^^^^^^^^^^^^^^^^^^^ [*]
> 
> Not sure if we should leave the lock at this point of time, as we
> haven't enabled boost until now.

The problem here is with the cpufreq_driver->set_boost() call.

I tried to avoid acquiring lock at one function and release it at
another (in this case cpufreq_boost_set_sw), especially since the
__cpufreq_governor() acquires its own lock - good place for deadlock.

Is it OK for you to grab lock at one function
(cpufreq_boost_trigger_state()) and then at other function
(cpufreq_boost_set_sw) release it before calling __cpufreq_governor()
and grab it again after its completion?


> 
> If somebody tries to use this variable at this point of time, then
> it would get the wrong information about it.
> 
> > +       ret = cpufreq_driver->set_boost(state);
> > +       if (ret) {
> > +               write_lock_irqsave(&cpufreq_driver_lock, flags);
> > +               cpufreq_driver->boost_enabled = 0;
> 
> should be:
>                     cpufreq_driver->boost_enabled = !state;

For me = 0 (or = false) is more readable. 
If you wish, I will change it to = !state.

> 
> > +               write_unlock_irqrestore(&cpufreq_driver_lock,
> > flags); +
> > +               pr_err("%s: BOOST cannot %s\n", __func__,
> 
> s/BOOST cannot %s/Cannot %s BOOST

Ok.

> 
> > +                      state ? "enabled" : "disabled");
> > +       }
> > +
> > +       return ret;
> > +}
> > +
> > +int cpufreq_boost_supported(void)
> > +{
> > +       if (cpufreq_driver)
> 
> This routine is always called from places where cpufreq_driver
> can't be NULL..

It is also called from thermal. And it happens that thermal is
initialized earlier.
Then "NULL pointer dereference" happens.

> 
> --contd--
> 
> > +               return cpufreq_driver->boost_supported;
> > +
> > +       return 0;
> > +}
> > +EXPORT_SYMBOL_GPL(cpufreq_boost_supported);
> > +
> > +int cpufreq_boost_enabled(void)
> > +{
> > +       return cpufreq_driver->boost_enabled;
	^^^^^^^^^^^^^^ [1]

> 
> And if above check is necessary, then don't you need to check
> it here as well?

Because on thermal I check first if cpufreq_boost_supported() is true.
If boost is not supported then check for cpufreq_boost_enabled() is not
performed.

In my opinion at [1] we don't need the if (cpufreq_driver) check.
But it is up to you to decide. 

> 
> > +}
> > +EXPORT_SYMBOL_GPL(cpufreq_boost_enabled);
> > +
> > +/*********************************************************************
> >   *               REGISTER / UNREGISTER CPUFREQ
> > DRIVER                *
> > *********************************************************************/
> >
> > @@ -2008,9 +2099,25 @@ int cpufreq_register_driver(struct
> > cpufreq_driver *driver_data) cpufreq_driver = driver_data;
> >         write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> >
> > +       if (cpufreq_boost_supported()) {
> > +               /*
> > +                * Check if boost driver provides function to
> > enable boost -
> 
> s/boost driver/driver

Ok.

> 
> > +                * if not, use cpufreq_boost_set_sw as default
> > +                */
> > +               if (!cpufreq_driver->set_boost)
> > +                       cpufreq_driver->set_boost =
> > cpufreq_boost_set_sw; +
> > +               ret = cpufreq_sysfs_create_file(&(boost.attr));
> 
> You don't need braces around boost.attr.

Ok.

> 
> > +               if (ret) {
> > +                       pr_err("%s: cannot register global BOOST
> > sysfs file\n",
> > +                               __func__);
> > +                       goto err_null_driver;
> > +               }
> > +       }
> > +
> >         ret = subsys_interface_register(&cpufreq_interface);
> >         if (ret)
> > -               goto err_null_driver;
> > +               goto err_boost_unreg;
> >
> >         if (!(cpufreq_driver->flags & CPUFREQ_STICKY)) {
> >                 int i;
> > @@ -2037,6 +2144,9 @@ int cpufreq_register_driver(struct
> > cpufreq_driver *driver_data) return 0;
> >  err_if_unreg:
> >         subsys_interface_unregister(&cpufreq_interface);
> > +err_boost_unreg:
> > +       if (cpufreq_boost_supported())
> > +               cpufreq_sysfs_remove_file(&(boost.attr));
> 
> same here.

Ok.

> 
> >  err_null_driver:
> >         write_lock_irqsave(&cpufreq_driver_lock, flags);
> >         cpufreq_driver = NULL;
> > @@ -2063,6 +2173,9 @@ int cpufreq_unregister_driver(struct
> > cpufreq_driver *driver) pr_debug("unregistering driver %s\n",
> > driver->name);
> >
> >         subsys_interface_unregister(&cpufreq_interface);
> > +       if (cpufreq_boost_supported())
> > +               cpufreq_sysfs_remove_file(&(boost.attr));
> 
> here too.

Ok.

> 
> > +
> >         unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
> >
> >         write_lock_irqsave(&cpufreq_driver_lock, flags);
> 
> > +static ssize_t scaling_available_frequencies_show(struct
> > cpufreq_policy *policy,
> > +                                                 char *buf)
> > +{
> > +       return show_available_freqs(policy, buf, 0);
> 
> s/0/false

Ok.

> 
> > +}
> 
> > +static ssize_t scaling_boost_frequencies_show(struct
> > cpufreq_policy *policy,
> > +                                             char *buf)
> > +{
> > +       return show_available_freqs(policy, buf, 1);
> 
> s/1/true

Ok.

> 
> > +}
> 
> Looks good mostly.. We Should be to get it in 3.12 :)

If we agree about above comments, I will post v7 ASAP.

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 3/8] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution
  2013-07-26  8:09       ` Lukasz Majewski
@ 2013-07-26  9:24         ` Viresh Kumar
  2013-07-26  9:44           ` Lukasz Majewski
  2013-08-12  9:12           ` Lukasz Majewski
  0 siblings, 2 replies; 329+ messages in thread
From: Viresh Kumar @ 2013-07-26  9:24 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, durgadoss.r

On 26 July 2013 13:39, Lukasz Majewski <l.majewski@samsung.com> wrote:
> On Fri, 26 Jul 2013 12:58:02 +0530 Viresh Kumar wrote,
>> On 25 July 2013 22:03, Lukasz Majewski <l.majewski@samsung.com> wrote:
>> > diff --git a/drivers/cpufreq/acpi-cpufreq.c
>> > b/drivers/cpufreq/acpi-cpufreq.c
>>
>> >  static void __init acpi_cpufreq_boost_init(void)
>> >  {
>> > +       acpi_cpufreq_driver.boost_supported = false;
>             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [*]
>>
>> Would be better if we do this in else of below if.
>
> We need to set boost_supported = false at [*] for the case when:
> 1. msrs_alloc fails
> or
> 2. acpi_cpufreq is built as a module and can be inserted and removed
> several times. Without [*] we could end up with wrong (not false)
> initial state.

Hmm.. Now that I see the code again, we don't need to set it to false
as it is a global variable and this field is already set to false..

>> >         if (boot_cpu_has(X86_FEATURE_CPB) ||
>> > boot_cpu_has(X86_FEATURE_IDA)) { msrs = msrs_alloc();
>>
>>
>> > @@ -1021,12 +995,11 @@ static int __init acpi_cpufreq_init(void)
>> >                         *iter = &cpb;
>> >         }
>> >  #endif
>> > +       acpi_cpufreq_boost_init();
>             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [**]
>>
>> We are calling it before registering cpufreq driver. Will this have
>> any complications?
>
> When we call [**] after the cpufreq_register_driver [***] we end up with
> sysfs boost attribute not exported at x86.
> The boost attribute is exported at [***] only when
> acpi_cpufreq.boost_supported = true. However support for boost at x86
> is evaluated at acpi_cpufreq_boost_init().

I understand why you moved it above cpufreq driver register. I was thinking
if there can be few side effects of this..

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 2/8] cpufreq: Add boost frequency support in core
  2013-07-26  8:33       ` Lukasz Majewski
@ 2013-07-26  9:33         ` Viresh Kumar
  2013-07-26 10:10           ` Lukasz Majewski
  2013-07-26  9:36         ` Viresh Kumar
  2013-07-26 12:36         ` Rafael J. Wysocki
  2 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-07-26  9:33 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, durgadoss.r, Lists linaro-kernel

On 26 July 2013 14:03, Lukasz Majewski <l.majewski@samsung.com> wrote:
> On Fri, 26 Jul 2013 12:47:15 +0530 Viresh Kumar wrote,
>> On 25 July 2013 22:03, Lukasz Majewski <l.majewski@samsung.com> wrote:

>> > +int cpufreq_boost_trigger_state(int state)
>> > +{
>> > +       unsigned long flags;
>> > +       int ret = 0;
>> > +
>> > +       if (cpufreq_driver->boost_enabled == state)
>> > +               return 0;
>> > +
>> > +       write_lock_irqsave(&cpufreq_driver_lock, flags);
>> > +       cpufreq_driver->boost_enabled = state;
>> > +       write_unlock_irqrestore(&cpufreq_driver_lock, flags);
>             ^^^^^^^^^^^^^^^^^^^^ [*]
>>
>> Not sure if we should leave the lock at this point of time, as we
>> haven't enabled boost until now.
>
> The problem here is with the cpufreq_driver->set_boost() call.
>
> I tried to avoid acquiring lock at one function and release it at
> another (in this case cpufreq_boost_set_sw), especially since the
> __cpufreq_governor() acquires its own lock - good place for deadlock.
>
> Is it OK for you to grab lock at one function
> (cpufreq_boost_trigger_state()) and then at other function
> (cpufreq_boost_set_sw) release it before calling __cpufreq_governor()
> and grab it again after its completion?

>> > +       ret = cpufreq_driver->set_boost(state);
>> > +       if (ret) {
>> > +               write_lock_irqsave(&cpufreq_driver_lock, flags);
>> > +               cpufreq_driver->boost_enabled = 0;
>>
>> should be:
>>                     cpufreq_driver->boost_enabled = !state;
>
> For me = 0 (or = false) is more readable.
> If you wish, I will change it to = !state.

Its not about readability but logic... What if boost was enabled
earlier and we are disabling it now.. and we reach here.. We
need to enable boost again, whereas you are disabling it.

>> > +int cpufreq_boost_supported(void)
>> > +{
>> > +       if (cpufreq_driver)
>>
>> This routine is always called from places where cpufreq_driver
>> can't be NULL..
>
> It is also called from thermal. And it happens that thermal is
> initialized earlier.
> Then "NULL pointer dereference" happens.

Ok.. Put a likely() around this check for cpufreq_driver..

> In my opinion at [1] we don't need the if (cpufreq_driver) check.
> But it is up to you to decide.

leave it as is.

> If we agree about above comments, I will post v7 ASAP.

Don't post it ASAP, wait for few more days for others to give
comments.. And also I haven't finished reviewing it until
now.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 2/8] cpufreq: Add boost frequency support in core
  2013-07-26  8:33       ` Lukasz Majewski
  2013-07-26  9:33         ` Viresh Kumar
@ 2013-07-26  9:36         ` Viresh Kumar
  2013-07-26 10:11           ` Lukasz Majewski
  2013-08-12  9:07           ` Lukasz Majewski
  2013-07-26 12:36         ` Rafael J. Wysocki
  2 siblings, 2 replies; 329+ messages in thread
From: Viresh Kumar @ 2013-07-26  9:36 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, durgadoss.r, Lists linaro-kernel

On 26 July 2013 14:03, Lukasz Majewski <l.majewski@samsung.com> wrote:
> The problem here is with the cpufreq_driver->set_boost() call.
>
> I tried to avoid acquiring lock at one function and release it at
> another (in this case cpufreq_boost_set_sw), especially since the
> __cpufreq_governor() acquires its own lock - good place for deadlock.
>
> Is it OK for you to grab lock at one function
> (cpufreq_boost_trigger_state()) and then at other function
> (cpufreq_boost_set_sw) release it before calling __cpufreq_governor()
> and grab it again after its completion?

Problem is not only that.. but we shouldn't call boost_set() of drivers
like acpi-cpufreq with this lock..... Leave it as it is for now.. Let me see
if I can think of any problems that can happen due to this.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 3/8] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution
  2013-07-26  9:24         ` Viresh Kumar
@ 2013-07-26  9:44           ` Lukasz Majewski
  2013-08-12  9:12           ` Lukasz Majewski
  1 sibling, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-26  9:44 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, durgadoss.r

On Fri, 26 Jul 2013 14:54:07 +0530 Viresh Kumar viresh.kumar@linaro.org
wrote,
> On 26 July 2013 13:39, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > On Fri, 26 Jul 2013 12:58:02 +0530 Viresh Kumar wrote,
> >> On 25 July 2013 22:03, Lukasz Majewski <l.majewski@samsung.com>
> >> wrote:
> >> > diff --git a/drivers/cpufreq/acpi-cpufreq.c
> >> > b/drivers/cpufreq/acpi-cpufreq.c
> >>
> >> >  static void __init acpi_cpufreq_boost_init(void)
> >> >  {
> >> > +       acpi_cpufreq_driver.boost_supported = false;
> >             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [*]
> >>
> >> Would be better if we do this in else of below if.
> >
> > We need to set boost_supported = false at [*] for the case when:
> > 1. msrs_alloc fails
> > or
> > 2. acpi_cpufreq is built as a module and can be inserted and removed
> > several times. Without [*] we could end up with wrong (not false)
> > initial state.
> 
> Hmm.. Now that I see the code again, we don't need to set it to false
> as it is a global variable and this field is already set to false..

Ok, so then I will remove this line [*].

> 
> >> >         if (boot_cpu_has(X86_FEATURE_CPB) ||
> >> > boot_cpu_has(X86_FEATURE_IDA)) { msrs = msrs_alloc();
> >>
> >>
> >> > @@ -1021,12 +995,11 @@ static int __init acpi_cpufreq_init(void)
> >> >                         *iter = &cpb;
> >> >         }
> >> >  #endif
> >> > +       acpi_cpufreq_boost_init();
> >             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [**]
> >>
> >> We are calling it before registering cpufreq driver. Will this have
> >> any complications?
> >
> > When we call [**] after the cpufreq_register_driver [***] we end up
> > with sysfs boost attribute not exported at x86.
> > The boost attribute is exported at [***] only when
> > acpi_cpufreq.boost_supported = true. However support for boost at
> > x86 is evaluated at acpi_cpufreq_boost_init().
> 
> I understand why you moved it above cpufreq driver register. I was
> thinking if there can be few side effects of this..

As fair as I've tested it, there weren't any side effects. 

Moreover the acpi_cpufreq_boost_init() mostly read state of the HW, so
IMHO can be done before cpufreg_register_driver(). 

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 2/8] cpufreq: Add boost frequency support in core
  2013-07-26  9:33         ` Viresh Kumar
@ 2013-07-26 10:10           ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-26 10:10 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, durgadoss.r, Lists linaro-kernel

On Fri, 26 Jul 2013 15:03:34 +0530 Viresh Kumar wrote,
> On 26 July 2013 14:03, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > On Fri, 26 Jul 2013 12:47:15 +0530 Viresh Kumar wrote,
> >> On 25 July 2013 22:03, Lukasz Majewski <l.majewski@samsung.com>
> >> wrote:
> 
> >> > +int cpufreq_boost_trigger_state(int state)
> >> > +{
> >> > +       unsigned long flags;
> >> > +       int ret = 0;
> >> > +
> >> > +       if (cpufreq_driver->boost_enabled == state)
> >> > +               return 0;
> >> > +
> >> > +       write_lock_irqsave(&cpufreq_driver_lock, flags);
> >> > +       cpufreq_driver->boost_enabled = state;
> >> > +       write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> >             ^^^^^^^^^^^^^^^^^^^^ [*]
> >>
> >> Not sure if we should leave the lock at this point of time, as we
> >> haven't enabled boost until now.
> >
> > The problem here is with the cpufreq_driver->set_boost() call.
> >
> > I tried to avoid acquiring lock at one function and release it at
> > another (in this case cpufreq_boost_set_sw), especially since the
> > __cpufreq_governor() acquires its own lock - good place for
> > deadlock.
> >
> > Is it OK for you to grab lock at one function
> > (cpufreq_boost_trigger_state()) and then at other function
> > (cpufreq_boost_set_sw) release it before calling
> > __cpufreq_governor() and grab it again after its completion?
> 
> >> > +       ret = cpufreq_driver->set_boost(state);
> >> > +       if (ret) {
> >> > +               write_lock_irqsave(&cpufreq_driver_lock, flags);
> >> > +               cpufreq_driver->boost_enabled = 0;
> >>
> >> should be:
> >>                     cpufreq_driver->boost_enabled = !state;
> >
> > For me = 0 (or = false) is more readable.
> > If you wish, I will change it to = !state.
> 
> Its not about readability but logic... What if boost was enabled
> earlier and we are disabling it now.. and we reach here.. We
> need to enable boost again, whereas you are disabling it.

You are right here. I will change this to = !state

> 
> >> > +int cpufreq_boost_supported(void)
> >> > +{
> >> > +       if (cpufreq_driver)
> >>
> >> This routine is always called from places where cpufreq_driver
> >> can't be NULL..
> >
> > It is also called from thermal. And it happens that thermal is
> > initialized earlier.
> > Then "NULL pointer dereference" happens.
> 
> Ok.. Put a likely() around this check for cpufreq_driver..

Ok.

> 
> > In my opinion at [1] we don't need the if (cpufreq_driver) check.
> > But it is up to you to decide.
> 
> leave it as is.

Ok.

> 
> > If we agree about above comments, I will post v7 ASAP.
> 
> Don't post it ASAP, wait for few more days for others to give
> comments.. And also I haven't finished reviewing it until
> now.

Ok.

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 2/8] cpufreq: Add boost frequency support in core
  2013-07-26  9:36         ` Viresh Kumar
@ 2013-07-26 10:11           ` Lukasz Majewski
  2013-08-12  9:07           ` Lukasz Majewski
  1 sibling, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-26 10:11 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	durgadoss.r, Lists linaro-kernel

On Fri, 26 Jul 2013 15:06:45 +0530 Viresh Kumar wrote,
> On 26 July 2013 14:03, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > The problem here is with the cpufreq_driver->set_boost() call.
> >
> > I tried to avoid acquiring lock at one function and release it at
> > another (in this case cpufreq_boost_set_sw), especially since the
> > __cpufreq_governor() acquires its own lock - good place for
> > deadlock.
> >
> > Is it OK for you to grab lock at one function
> > (cpufreq_boost_trigger_state()) and then at other function
> > (cpufreq_boost_set_sw) release it before calling
> > __cpufreq_governor() and grab it again after its completion?
> 
> Problem is not only that.. but we shouldn't call boost_set() of
> drivers like acpi-cpufreq with this lock..... Leave it as it is for
> now.. Let me see if I can think of any problems that can happen due
> to this.

Ok. No problem.

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 1/8] cpufreq: Store cpufreq policies in a list
  2013-07-25 16:33   ` [PATCH v6 1/8] cpufreq: Store cpufreq policies in a list Lukasz Majewski
@ 2013-07-26 10:14     ` Viresh Kumar
  2013-07-26 10:58       ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-07-26 10:14 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, durgadoss.r

On 25 July 2013 22:03, Lukasz Majewski <l.majewski@samsung.com> wrote:
> Policies available in a cpufreq framework are now linked together. They are
> accessible via cpufreq_policy_list defined at cpufreq core.
>
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

Looks good but would have been better if you could have moved
existing code to use this infrastructure..

For example, this code in __cpufreq_add_dev()

#ifdef CONFIG_HOTPLUG_CPU
	/* Check if this cpu was hot-unplugged earlier and has siblings */
	read_lock_irqsave(&cpufreq_driver_lock, flags);
	for_each_online_cpu(sibling) {

         ---

	}
	read_unlock_irqrestore(&cpufreq_driver_lock, flags);
#endif

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 5/8] cpufreq:boost:Kconfig: Provide support for software managed BOOST
  2013-07-25 16:33   ` [PATCH v6 5/8] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
@ 2013-07-26 10:24     ` Viresh Kumar
  2013-07-26 11:21       ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-07-26 10:24 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, durgadoss.r

On 25 July 2013 22:03, Lukasz Majewski <l.majewski@samsung.com> wrote:
> For safety reasons new flag - CONFIG_CPU_FREQ_BOOST_SW has been added.
> Only after selecting "EXYNOS Frequency Overclocking - Software" Kconfig

You shouldn't mention Exynos here and must do exynos stuff at the end
in a separate patch. This one must be generic.

> option the software managed boost is enabled. It also selects thermal
> subsystem to be compiled in. Thermal is necessary for disabling boost
> and cooling down the device when overheating detected.
>
> Boost _MUST_NOT_ work without thermal subsystem with properly defined
> overheating temperatures.
>
> This option doesn't affect x86's ACPI hardware managed boost support
> (i.e. Intel, AMD). In this situation boost management is embedded at
> hardware.
>
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
>
> ---
> Changes for v6:
> - CPU_FREQ_BOOST_SW [1] is now defined as "invisible" bool option.
> - Platform dependent ARM_EXYNOS_CPU_FREQ_BOOST_SW config option has been
>   added. It depends on ARM_EXYNOS_CPUFREQ options and selects
>   EXYNOS_THERMAL with the main boost config [1].
>
> Changes for v5:
> - New patch
>
>  drivers/cpufreq/Kconfig     |    3 +++
>  drivers/cpufreq/Kconfig.arm |   16 ++++++++++++++++
>  2 files changed, 19 insertions(+)
>
> diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
> index 534fcb8..3f058a3 100644
> --- a/drivers/cpufreq/Kconfig
> +++ b/drivers/cpufreq/Kconfig
> @@ -23,6 +23,9 @@ config CPU_FREQ_TABLE
>  config CPU_FREQ_GOV_COMMON
>         bool
>
> +config CPU_FREQ_BOOST_SW
> +       bool

Invisible is fine but this must be disabled by default and must
depend on thermal, rather than moving dependency on platform's
config.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 6/8] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework
  2013-07-25 16:33   ` [PATCH v6 6/8] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
@ 2013-07-26 10:26     ` Viresh Kumar
  2013-07-26 11:26       ` Lukasz Majewski
  2013-08-12  9:52       ` Lukasz Majewski
  0 siblings, 2 replies; 329+ messages in thread
From: Viresh Kumar @ 2013-07-26 10:26 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, durgadoss.r

On 25 July 2013 22:03, Lukasz Majewski <l.majewski@samsung.com> wrote:

> diff --git a/drivers/cpufreq/exynos-cpufreq.c b/drivers/cpufreq/exynos-cpufreq.c
> index 9ae1871..175172d9 100644
> --- a/drivers/cpufreq/exynos-cpufreq.c
> +++ b/drivers/cpufreq/exynos-cpufreq.c
> @@ -270,6 +270,9 @@ static int exynos_cpufreq_cpu_exit(struct cpufreq_policy *policy)
>
>  static struct freq_attr *exynos_cpufreq_attr[] = {
>         &cpufreq_freq_attr_scaling_available_freqs,
> +#ifdef CONFIG_CPU_FREQ_BOOST_SW

Use ARM_EXYNOS_CPU_FREQ_BOOST_SW instead.

> +       &cpufreq_freq_attr_scaling_boost_freqs,
> +#endif
>         NULL,
>  };
>
> @@ -332,6 +335,9 @@ static int __init exynos_cpufreq_probe(struct platform_device *pdev)
>
>         locking_frequency = exynos_getspeed(0);
>
> +#ifdef CONFIG_CPU_FREQ_BOOST_SW
> +       exynos_driver.boost_supported = true;
> +#endif

So, why here and not in the definition of exynos_driver?

>         register_pm_notifier(&exynos_cpufreq_nb);
>
>         if (cpufreq_register_driver(&exynos_driver)) {
> --
> 1.7.10.4
>

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 0/8] cpufreq:boost: CPU Boost mode support
  2013-07-25 16:33 ` [PATCH v6 0/8] " Lukasz Majewski
                     ` (7 preceding siblings ...)
  2013-07-25 16:33   ` [PATCH v6 8/8] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
@ 2013-07-26 10:28   ` Viresh Kumar
  8 siblings, 0 replies; 329+ messages in thread
From: Viresh Kumar @ 2013-07-26 10:28 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, durgadoss.r

On 25 July 2013 22:03, Lukasz Majewski <l.majewski@samsung.com> wrote:
> This patch series introduces support for CPU overclocking technique
> called Boost.
>
> It is a follow up of a LAB governor proposal. Boost is a LAB component:
> http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq
>
> Boost unifies hardware based solution (e.g. Intel Nehalem) with
> software oriented one (like the one done at Exynos).
> For this reason cpufreq/freq_table code has been reorganized to include
> common code.
>
> Important design decisions:
> - Boost related code is compiled-in unconditionally to cpufreq core and
>   disabled by default. The cpufreq_driver is responsibile for setting
>   boost_supported flag and providing set_boost callback(if HW support
>   is needed). For software managed boost, special Kconfig flag -
>   CONFIG_CPU_FREQ_BOOST_SW has been defined. It will be selected only
>   when a target platform has thermal framework properly configured.
>
> - struct cpufreq_driver has been extended with boost related fields:
>         -- boost_supported - when driver supports boosting
>         -- boost_enabled - boost state
>         -- set_boost - callback to function, which is necessary to
>            enable/disable boost
>
> - Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost) is visible
>   _only_ when cpufreq driver supports Boost.
>
> - No special spin_lock for Boost was created. The one from cpufreq core
>   was reused.
>
> - All available policies are now stored in a list.
>
> - The Boost code doesn't rely on any policy. When boost state is changed,
>   then the policy list is iterated and proper adjustements are done.
>
> - To improve safety level, the thermal framework is also extended to disable
>   software boosting, when thermal trip point is reached. Then it starts
>   monitoring target temperature to evaluate if boost can be enabled
>   again. This emulates behaviour similar to HW managed boost (like x86)
>
> New patches for v6:
> cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ
>
> Tested at HW:
>        Exynos 4412 3.11-rc1 Linux
>        Intel Core i7-3770 3.11-rc1 Linux

I am done with review of this patchset now and should say pretty much
comfortable with it now..

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 1/8] cpufreq: Store cpufreq policies in a list
  2013-07-26 10:14     ` Viresh Kumar
@ 2013-07-26 10:58       ` Lukasz Majewski
  2013-07-26 11:02         ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-26 10:58 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	durgadoss.r

On Fri, 26 Jul 2013 15:44:29 +0530 Viresh Kumar viresh.kumar@linaro.org
wrote,
> On 25 July 2013 22:03, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > Policies available in a cpufreq framework are now linked together.
> > They are accessible via cpufreq_policy_list defined at cpufreq core.
> >
> > Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> > Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> 
> Looks good but would have been better if you could have moved
> existing code to use this infrastructure..
> 
> For example, this code in __cpufreq_add_dev()
> 
> #ifdef CONFIG_HOTPLUG_CPU
> 	/* Check if this cpu was hot-unplugged earlier and has
> siblings */ read_lock_irqsave(&cpufreq_driver_lock, flags);
> 	for_each_online_cpu(sibling) {
> 
>          ---
> 
> 	}
> 	read_unlock_irqrestore(&cpufreq_driver_lock, flags);
> #endif

Do you mean to write something like:

#ifdef CONFIG_CPU_FREQ_BOOST_SW
	write_lock_irqsave(&cpufreq_driver_lock, flags);
	list_add(&policy->policy_list, &cpufreq_policy_list);
	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
#endif

Or Am I missing something?
-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 1/8] cpufreq: Store cpufreq policies in a list
  2013-07-26 10:58       ` Lukasz Majewski
@ 2013-07-26 11:02         ` Viresh Kumar
  2013-07-26 12:46           ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-07-26 11:02 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	durgadoss.r

On 26 July 2013 16:28, Lukasz Majewski <l.majewski@samsung.com> wrote:
> On Fri, 26 Jul 2013 15:44:29 +0530 Viresh Kumar viresh.kumar@linaro.org
> wrote,
>> On 25 July 2013 22:03, Lukasz Majewski <l.majewski@samsung.com> wrote:

>> Looks good but would have been better if you could have moved
>> existing code to use this infrastructure..
>>
>> For example, this code in __cpufreq_add_dev()
>>
>> #ifdef CONFIG_HOTPLUG_CPU
>>       /* Check if this cpu was hot-unplugged earlier and has
>> siblings */ read_lock_irqsave(&cpufreq_driver_lock, flags);
>>       for_each_online_cpu(sibling) {
>>
>>          ---
>>
>>       }
>>       read_unlock_irqrestore(&cpufreq_driver_lock, flags);
>> #endif
>
> Do you mean to write something like:
>
> #ifdef CONFIG_CPU_FREQ_BOOST_SW
>         write_lock_irqsave(&cpufreq_driver_lock, flags);
>         list_add(&policy->policy_list, &cpufreq_policy_list);
>         write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> #endif
>
> Or Am I missing something?

I can't imaging how you though I am saying this :)

The code I mentioned actually requires to iterate through the
list of available policies but was iterating over all online cpus..

And so your new infrastructure or this list can be used instead
of looping for all cpus.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 5/8] cpufreq:boost:Kconfig: Provide support for software managed BOOST
  2013-07-26 10:24     ` Viresh Kumar
@ 2013-07-26 11:21       ` Lukasz Majewski
  2013-07-29  6:58         ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-26 11:21 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	durgadoss.r

On Fri, 26 Jul 2013 15:54:56 +0530 Viresh Kumar wrote,
> On 25 July 2013 22:03, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > For safety reasons new flag - CONFIG_CPU_FREQ_BOOST_SW has been
> > added. Only after selecting "EXYNOS Frequency Overclocking -
> > Software" Kconfig
> 
> You shouldn't mention Exynos here and must do exynos stuff at the end
> in a separate patch. This one must be generic.

Please see below comments.

> 
> > option the software managed boost is enabled. It also selects
> > thermal subsystem to be compiled in. Thermal is necessary for
> > disabling boost and cooling down the device when overheating
> > detected.
> >
> > Boost _MUST_NOT_ work without thermal subsystem with properly
> > defined overheating temperatures.
> >
> > This option doesn't affect x86's ACPI hardware managed boost support
> > (i.e. Intel, AMD). In this situation boost management is embedded at
> > hardware.
> >
> > Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> > Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> >
> > ---
> > Changes for v6:
> > - CPU_FREQ_BOOST_SW [1] is now defined as "invisible" bool option.
> > - Platform dependent ARM_EXYNOS_CPU_FREQ_BOOST_SW config option has
> > been added. It depends on ARM_EXYNOS_CPUFREQ options and selects
> >   EXYNOS_THERMAL with the main boost config [1].
> >
> > Changes for v5:
> > - New patch
> >
> >  drivers/cpufreq/Kconfig     |    3 +++
> >  drivers/cpufreq/Kconfig.arm |   16 ++++++++++++++++
> >  2 files changed, 19 insertions(+)
> >
> > diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
> > index 534fcb8..3f058a3 100644
> > --- a/drivers/cpufreq/Kconfig
> > +++ b/drivers/cpufreq/Kconfig
> > @@ -23,6 +23,9 @@ config CPU_FREQ_TABLE
> >  config CPU_FREQ_GOV_COMMON
> >         bool
> >
> > +config CPU_FREQ_BOOST_SW
> > +       bool
> 
> Invisible is fine but this must be disabled by default and must
> depend on thermal, rather than moving dependency on platform's
> config.

The CPU_FREQ_BOOST_SW [1] is a generic flag (invisible).

I will add "default n" to it.
It shall be used at all BOOST dependent #ifdefs (generic + platform).



Also I've introduced the ARM_EXYNOS_CPU_FREQ_BOOST_SW [2] config
option. The CPU_FREQ_BOOST_SW option is selected from it.

Moreover the [2] depends on ARM_EXYNOS_CPUFREQ (which prevents from
accidental enable/disable). And it selects automatically the
EXYNOS_THERMAL, which is much better than depending only on THERMAL [3]
(the generic framework).

Depending only on [3], results at situation where SW BOOST can be
enabled at x86 or ARM target with only generic THERMAL support (which
doesn't protect from overheating).


So the proposed solution:
1. Defines global flag [1]
2. This flag is selected only when dependencies for more HW close flag
[2] are meet.
3. It is more natural to have Kconfig BOOST enable/disable checkbox at
platform cpufreq driver (with description closer to HW).
4. Other ARCHs can easily define similar to [2] flag and by it select
[1].

For me the approach proposed in this patch is more natural and provides
high protection level from accidental SW boost enable.

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 6/8] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework
  2013-07-26 10:26     ` Viresh Kumar
@ 2013-07-26 11:26       ` Lukasz Majewski
  2013-07-29  7:01         ` Viresh Kumar
  2013-08-12  9:52       ` Lukasz Majewski
  1 sibling, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-26 11:26 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	durgadoss.r

On Fri, 26 Jul 2013 15:56:53 +0530 Viresh Kumar wrote,
> On 25 July 2013 22:03, Lukasz Majewski <l.majewski@samsung.com> wrote:
> 
> > diff --git a/drivers/cpufreq/exynos-cpufreq.c
> > b/drivers/cpufreq/exynos-cpufreq.c index 9ae1871..175172d9 100644
> > --- a/drivers/cpufreq/exynos-cpufreq.c
> > +++ b/drivers/cpufreq/exynos-cpufreq.c
> > @@ -270,6 +270,9 @@ static int exynos_cpufreq_cpu_exit(struct
> > cpufreq_policy *policy)
> >
> >  static struct freq_attr *exynos_cpufreq_attr[] = {
> >         &cpufreq_freq_attr_scaling_available_freqs,
> > +#ifdef CONFIG_CPU_FREQ_BOOST_SW
  	    ^^^^^^^^^^^^^^^^^^^^^^^^^ [*]
> 
> Use ARM_EXYNOS_CPU_FREQ_BOOST_SW instead.

For the reasons explained at [PATCH v6 5/8] I would prefer to leave [*]
here.

> 
> > +       &cpufreq_freq_attr_scaling_boost_freqs,
> > +#endif
> >         NULL,
> >  };
> >
> > @@ -332,6 +335,9 @@ static int __init exynos_cpufreq_probe(struct
> > platform_device *pdev)
> >
> >         locking_frequency = exynos_getspeed(0);
> >
> > +#ifdef CONFIG_CPU_FREQ_BOOST_SW
> > +       exynos_driver.boost_supported = true;
> > +#endif
> 
> So, why here and not in the definition of exynos_driver?

Right. I will move this to struct cpufreq_driver exynos_driver.

> 
> >         register_pm_notifier(&exynos_cpufreq_nb);
> >
> >         if (cpufreq_register_driver(&exynos_driver)) {
> > --
> > 1.7.10.4
> >



-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 2/8] cpufreq: Add boost frequency support in core
  2013-07-26  8:33       ` Lukasz Majewski
  2013-07-26  9:33         ` Viresh Kumar
  2013-07-26  9:36         ` Viresh Kumar
@ 2013-07-26 12:36         ` Rafael J. Wysocki
  2013-07-26 13:08           ` Lukasz Majewski
  2 siblings, 1 reply; 329+ messages in thread
From: Rafael J. Wysocki @ 2013-07-26 12:36 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Viresh Kumar, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, durgadoss.r, Lists linaro-kernel

On Friday, July 26, 2013 10:33:21 AM Lukasz Majewski wrote:
> On Fri, 26 Jul 2013 12:47:15 +0530 Viresh Kumar wrote,
> > On 25 July 2013 22:03, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > > diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> > 
> > >  /*********************************************************************
> > > + *
> > > BOOST                                              *
> > > +
> > > *********************************************************************/
> > > +static int cpufreq_boost_set_sw(int state) +{
> > > +       struct cpufreq_frequency_table *freq_table;
> > > +       struct cpufreq_policy *policy;
> > > +       int ret = -EINVAL;
> > > +
> > > +       list_for_each_entry(policy, &cpufreq_policy_list,
> > > policy_list) {
> > > +               freq_table =
> > > cpufreq_frequency_get_table(policy->cpu);
> > > +               if (freq_table) {
> > > +                       ret =
> > > cpufreq_frequency_table_cpuinfo(policy,
> > > +                                                       freq_table);
> > > +                       if (!ret) {
> > > +                               policy->user_policy.max =
> > > policy->max;
> > > +                               __cpufreq_governor(policy,
> > > CPUFREQ_GOV_LIMITS);
> > > +                       }
> > > +               }
> > > +       }
> > > +
> > > +       return ret;
> > > +}
> > > +
> > > +int cpufreq_boost_trigger_state(int state)
> > > +{
> > > +       unsigned long flags;
> > > +       int ret = 0;
> > > +
> > > +       if (cpufreq_driver->boost_enabled == state)
> > > +               return 0;
> > > +
> > > +       write_lock_irqsave(&cpufreq_driver_lock, flags);
> > > +       cpufreq_driver->boost_enabled = state;
> > > +       write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> 	    ^^^^^^^^^^^^^^^^^^^^ [*]
> > 
> > Not sure if we should leave the lock at this point of time, as we
> > haven't enabled boost until now.
> 
> The problem here is with the cpufreq_driver->set_boost() call.
> 
> I tried to avoid acquiring lock at one function and release it at
> another (in this case cpufreq_boost_set_sw), especially since the
> __cpufreq_governor() acquires its own lock - good place for deadlock.
> 
> Is it OK for you to grab lock at one function
> (cpufreq_boost_trigger_state()) and then at other function
> (cpufreq_boost_set_sw) release it before calling __cpufreq_governor()
> and grab it again after its completion?

It generally is better to avoid doing that, although it is not unheard of.

Thanks,
Rafael


-- 
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 1/8] cpufreq: Store cpufreq policies in a list
  2013-07-26 11:02         ` Viresh Kumar
@ 2013-07-26 12:46           ` Lukasz Majewski
  2013-07-29  7:03             ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-26 12:46 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	durgadoss.r

On Fri, 26 Jul 2013 16:32:34 +0530 Viresh Kumar viresh.kumar@linaro.org
wrote,
> On 26 July 2013 16:28, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > On Fri, 26 Jul 2013 15:44:29 +0530 Viresh Kumar
> > viresh.kumar@linaro.org wrote,
> >> On 25 July 2013 22:03, Lukasz Majewski <l.majewski@samsung.com>
> >> wrote:
> 
> >> Looks good but would have been better if you could have moved
> >> existing code to use this infrastructure..
> >>
> >> For example, this code in __cpufreq_add_dev()
> >>
> >> #ifdef CONFIG_HOTPLUG_CPU
> >>       /* Check if this cpu was hot-unplugged earlier and has
> >> siblings */ read_lock_irqsave(&cpufreq_driver_lock, flags);
> >>       for_each_online_cpu(sibling) {
> >>
> >>          ---
> >>
> >>       }
> >>       read_unlock_irqrestore(&cpufreq_driver_lock, flags);
> >> #endif
> >
> > Do you mean to write something like:
> >
> > #ifdef CONFIG_CPU_FREQ_BOOST_SW
> >         write_lock_irqsave(&cpufreq_driver_lock, flags);
> >         list_add(&policy->policy_list, &cpufreq_policy_list);
> >         write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> > #endif
> >
> > Or Am I missing something?
> 
> I can't imaging how you though I am saying this :)
>

:-)
 
> The code I mentioned actually requires to iterate through the
> list of available policies but was iterating over all online cpus..
> 
> And so your new infrastructure or this list can be used instead
> of looping for all cpus.

So instead of reading policies from per_cpu variables for all online
cpus, you think of using the list explicitly.

Good idea, but can we first finish the boost patches? Such change can
be applied on top of boost patch series as well.

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 2/8] cpufreq: Add boost frequency support in core
  2013-07-26 12:36         ` Rafael J. Wysocki
@ 2013-07-26 13:08           ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-07-26 13:08 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Viresh Kumar, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	durgadoss.r, Lists linaro-kernel

On Fri, 26 Jul 2013 14:36:08 +0200 Rafael J. Wysocki rjw@sisk.pl wrote,
> On Friday, July 26, 2013 10:33:21 AM Lukasz Majewski wrote:
> > On Fri, 26 Jul 2013 12:47:15 +0530 Viresh Kumar wrote,
> > > On 25 July 2013 22:03, Lukasz Majewski <l.majewski@samsung.com>
> > > wrote:
> > > > diff --git a/drivers/cpufreq/cpufreq.c
> > > > b/drivers/cpufreq/cpufreq.c
> > > 
> > > >  /*********************************************************************
> > > > + *
> > > > BOOST                                              *
> > > > +
> > > > *********************************************************************/
> > > > +static int cpufreq_boost_set_sw(int state) +{
> > > > +       struct cpufreq_frequency_table *freq_table;
> > > > +       struct cpufreq_policy *policy;
> > > > +       int ret = -EINVAL;
> > > > +
> > > > +       list_for_each_entry(policy, &cpufreq_policy_list,
> > > > policy_list) {
> > > > +               freq_table =
> > > > cpufreq_frequency_get_table(policy->cpu);
> > > > +               if (freq_table) {
> > > > +                       ret =
> > > > cpufreq_frequency_table_cpuinfo(policy,
> > > > +
> > > > freq_table);
> > > > +                       if (!ret) {
> > > > +                               policy->user_policy.max =
> > > > policy->max;
> > > > +                               __cpufreq_governor(policy,
> > > > CPUFREQ_GOV_LIMITS);
> > > > +                       }
> > > > +               }
> > > > +       }
> > > > +
> > > > +       return ret;
> > > > +}
> > > > +
> > > > +int cpufreq_boost_trigger_state(int state)
> > > > +{
> > > > +       unsigned long flags;
> > > > +       int ret = 0;
> > > > +
> > > > +       if (cpufreq_driver->boost_enabled == state)
> > > > +               return 0;
> > > > +
> > > > +       write_lock_irqsave(&cpufreq_driver_lock, flags);
> > > > +       cpufreq_driver->boost_enabled = state;
> > > > +       write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> > 	    ^^^^^^^^^^^^^^^^^^^^ [*]
> > > 
> > > Not sure if we should leave the lock at this point of time, as we
> > > haven't enabled boost until now.
> > 
> > The problem here is with the cpufreq_driver->set_boost() call.
> > 
> > I tried to avoid acquiring lock at one function and release it at
> > another (in this case cpufreq_boost_set_sw), especially since the
> > __cpufreq_governor() acquires its own lock - good place for
> > deadlock.
> > 
> > Is it OK for you to grab lock at one function
> > (cpufreq_boost_trigger_state()) and then at other function
> > (cpufreq_boost_set_sw) release it before calling
> > __cpufreq_governor() and grab it again after its completion?
> 
> It generally is better to avoid doing that, although it is not
> unheard of.

In this particular case, one also needs to pass the "flags" parameter to
the set_boost() function. This looks a bit unnatural to mix lock layer
with the boost.

> 
> Thanks,
> Rafael
> 
> 



-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 5/8] cpufreq:boost:Kconfig: Provide support for software managed BOOST
  2013-07-26 11:21       ` Lukasz Majewski
@ 2013-07-29  6:58         ` Viresh Kumar
  2013-08-12 10:26           ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-07-29  6:58 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	durgadoss.r

On 26 July 2013 16:51, Lukasz Majewski <l.majewski@samsung.com> wrote:
> On Fri, 26 Jul 2013 15:54:56 +0530 Viresh Kumar wrote,
>> On 25 July 2013 22:03, Lukasz Majewski <l.majewski@samsung.com> wrote:

>> > +config CPU_FREQ_BOOST_SW
>> > +       bool
>>
>> Invisible is fine but this must be disabled by default and must
>> depend on thermal, rather than moving dependency on platform's
>> config.
>
> The CPU_FREQ_BOOST_SW [1] is a generic flag (invisible).
>
> I will add "default n" to it.

Leave it.. We don't need it now.. that's how these kind of config options
are defined as they are disabled by default.

> Depending only on [3], results at situation where SW BOOST can be
> enabled at x86 or ARM target with only generic THERMAL support (which
> doesn't protect from overheating).

I had a similar concern.. Currently also we aren't stopping anybody to
enable boost. By selecting thermal from CPU_FREQ_BOOST_SW, atleast
we are communicating this very well to developers that they need
something else as well. And currently we only have thermal as a source
for telling when to block boost but it can be something else too..

I never said, don't use EXYNOS_THERMAL, its good to have a
dependency on it in the Exynos specific config for boost, but I wanted
normal sw boost also to depend on thermal..

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 6/8] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework
  2013-07-26 11:26       ` Lukasz Majewski
@ 2013-07-29  7:01         ` Viresh Kumar
  0 siblings, 0 replies; 329+ messages in thread
From: Viresh Kumar @ 2013-07-29  7:01 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	durgadoss.r

On 26 July 2013 16:56, Lukasz Majewski <l.majewski@samsung.com> wrote:
> On Fri, 26 Jul 2013 15:56:53 +0530 Viresh Kumar wrote,
>> On 25 July 2013 22:03, Lukasz Majewski <l.majewski@samsung.com> wrote:
>>
>> > diff --git a/drivers/cpufreq/exynos-cpufreq.c
>> > b/drivers/cpufreq/exynos-cpufreq.c index 9ae1871..175172d9 100644
>> > --- a/drivers/cpufreq/exynos-cpufreq.c
>> > +++ b/drivers/cpufreq/exynos-cpufreq.c
>> > @@ -270,6 +270,9 @@ static int exynos_cpufreq_cpu_exit(struct
>> > cpufreq_policy *policy)
>> >
>> >  static struct freq_attr *exynos_cpufreq_attr[] = {
>> >         &cpufreq_freq_attr_scaling_available_freqs,
>> > +#ifdef CONFIG_CPU_FREQ_BOOST_SW
>             ^^^^^^^^^^^^^^^^^^^^^^^^^ [*]
>>
>> Use ARM_EXYNOS_CPU_FREQ_BOOST_SW instead.
>
> For the reasons explained at [PATCH v6 5/8] I would prefer to leave [*]
> here.

I don't see how that reasoning fit here.

This is exynos code and you must use exynos specific boost Kconfig
option here.. Otherwise It might be enabled without Exynos specific option,
if somebody else has selected CONFIG_CPU_FREQ_BOOST_SW in
a multi platform kernel,

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 1/8] cpufreq: Store cpufreq policies in a list
  2013-07-26 12:46           ` Lukasz Majewski
@ 2013-07-29  7:03             ` Viresh Kumar
  0 siblings, 0 replies; 329+ messages in thread
From: Viresh Kumar @ 2013-07-29  7:03 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	durgadoss.r

On 26 July 2013 18:16, Lukasz Majewski <l.majewski@samsung.com> wrote:
> So instead of reading policies from per_cpu variables for all online
> cpus, you think of using the list explicitly.
>
> Good idea, but can we first finish the boost patches? Such change can
> be applied on top of boost patch series as well.

Its not a problem where we do it. But making sure that we do it :)
If you need to resend this patchset, then that list can be used at the
place I just highlighted.. Change isn't big and so shouldn't be a problem.

Otherwise it might get missed by both of us.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 2/8] cpufreq: Add boost frequency support in core
  2013-07-26  9:36         ` Viresh Kumar
  2013-07-26 10:11           ` Lukasz Majewski
@ 2013-08-12  9:07           ` Lukasz Majewski
  2013-08-12  9:10             ` Viresh Kumar
  1 sibling, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-12  9:07 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, durgadoss.r, Lists linaro-kernel

On Fri, 26 Jul 2013 15:06:45 +0530 Viresh Kumar viresh.kumar@linaro.org
wrote,
> On 26 July 2013 14:03, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > The problem here is with the cpufreq_driver->set_boost() call.
> >
> > I tried to avoid acquiring lock at one function and release it at
> > another (in this case cpufreq_boost_set_sw), especially since the
> > __cpufreq_governor() acquires its own lock - good place for
> > deadlock.
> >
> > Is it OK for you to grab lock at one function
> > (cpufreq_boost_trigger_state()) and then at other function
> > (cpufreq_boost_set_sw) release it before calling
> > __cpufreq_governor() and grab it again after its completion?
> 
> Problem is not only that.. but we shouldn't call boost_set() of
> drivers like acpi-cpufreq with this lock..... Leave it as it is for
> now.. Let me see if I can think of any problems that can happen due
> to this.

Do you have any second thoughts about this? Shall I leave it as it is
now?

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 2/8] cpufreq: Add boost frequency support in core
  2013-08-12  9:07           ` Lukasz Majewski
@ 2013-08-12  9:10             ` Viresh Kumar
  0 siblings, 0 replies; 329+ messages in thread
From: Viresh Kumar @ 2013-08-12  9:10 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, durgadoss.r, Lists linaro-kernel

On 12 August 2013 14:37, Lukasz Majewski <l.majewski@samsung.com> wrote:
> Do you have any second thoughts about this? Shall I leave it as it is
> now?

Honestly speaking I didn't had a chance to look into this..
Leave it as is, in case there is some problem we can patch it later.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 3/8] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution
  2013-07-26  9:24         ` Viresh Kumar
  2013-07-26  9:44           ` Lukasz Majewski
@ 2013-08-12  9:12           ` Lukasz Majewski
  2013-08-12  9:14             ` Viresh Kumar
  1 sibling, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-12  9:12 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, durgadoss.r

On Fri, 26 Jul 2013 14:54:07 +0530 Viresh Kumar viresh.kumar@linaro.org
wrote,
> On 26 July 2013 13:39, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > On Fri, 26 Jul 2013 12:58:02 +0530 Viresh Kumar wrote,
> >> On 25 July 2013 22:03, Lukasz Majewski <l.majewski@samsung.com>
> >> wrote:
> >> > diff --git a/drivers/cpufreq/acpi-cpufreq.c
> >> > b/drivers/cpufreq/acpi-cpufreq.c
> >>
> >> >  static void __init acpi_cpufreq_boost_init(void)
> >> >  {
> >> > +       acpi_cpufreq_driver.boost_supported = false;
> >             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [*]
> >>
> >> Would be better if we do this in else of below if.
> >
> > We need to set boost_supported = false at [*] for the case when:
> > 1. msrs_alloc fails
> > or
> > 2. acpi_cpufreq is built as a module and can be inserted and removed
> > several times. Without [*] we could end up with wrong (not false)
> > initial state.
> 
> Hmm.. Now that I see the code again, we don't need to set it to false
> as it is a global variable and this field is already set to false..

Ok, I will delete the line at [*].

> 
> >> >         if (boot_cpu_has(X86_FEATURE_CPB) ||
> >> > boot_cpu_has(X86_FEATURE_IDA)) { msrs = msrs_alloc();
> >>
> >>
> >> > @@ -1021,12 +995,11 @@ static int __init acpi_cpufreq_init(void)
> >> >                         *iter = &cpb;
> >> >         }
> >> >  #endif
> >> > +       acpi_cpufreq_boost_init();
> >             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [**]
> >>
> >> We are calling it before registering cpufreq driver. Will this have
> >> any complications?
> >
> > When we call [**] after the cpufreq_register_driver [***] we end up
> > with sysfs boost attribute not exported at x86.
> > The boost attribute is exported at [***] only when
> > acpi_cpufreq.boost_supported = true. However support for boost at
> > x86 is evaluated at acpi_cpufreq_boost_init().
> 
> I understand why you moved it above cpufreq driver register. I was
> thinking if there can be few side effects of this..

Have any problem with the above change came to your mind? 

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 3/8] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution
  2013-08-12  9:12           ` Lukasz Majewski
@ 2013-08-12  9:14             ` Viresh Kumar
  0 siblings, 0 replies; 329+ messages in thread
From: Viresh Kumar @ 2013-08-12  9:14 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, durgadoss.r

On 12 August 2013 14:42, Lukasz Majewski <l.majewski@samsung.com> wrote:
> Have any problem with the above change came to your mind?

No.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 4/8] thermal:boost: Automatic enable/disable of BOOST feature
  2013-07-25 16:33   ` [PATCH v6 4/8] thermal:boost: Automatic enable/disable of BOOST feature Lukasz Majewski
@ 2013-08-12  9:17     ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-12  9:17 UTC (permalink / raw)
  To: Zhang Rui, Eduardo Valentin; +Cc: Linux PM list, linux-kernel, durgadoss.r

Dear Zhang, Eduardo,

> This patch provides auto disable/enable operation for boost. When any
> defined trip point is passed, the boost is disabled.
> In that moment thermal monitor workqueue is woken up and it monitors
> if the device temperature drops below 75% of the smallest trip point.
> When device cools down, the boost is enabled again.
> 
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> 
> ---
> Changes for v6:
> - Disable boost only when supported and enabled
> - Protect boost related thermal_zone_device struct fields with mutex
> - Evaluate temperature trend during boost enable decision
> - Create separate methods to handle boost enable/disable
>   (thermal_boost_{enable|disable}) operations
> - Boost is disabled at any trip point passage (not only the non
> critical one)
> - Add stub definitions for cpufreq boost functions used when
>   CONFIG_CPU_FREQ is NOT defined.
> 
> Changes for v5:
> - Move boost disable code from cpu_cooling.c to thermal_core.c
>   (to handle_non_critical_trips)
> - Extent struct thermal_zone_device by adding overheated bool flag
> - Implement auto enable of boost after device cools down
> - Introduce boost_polling flag, which indicates if thermal uses it's
> predefined pool delay or has woken up thermal workqueue only to wait
> until device cools down.
> 
> Changes for v4:
> - New patch
> 

ping...

>  drivers/thermal/thermal_core.c |   55
> ++++++++++++++++++++++++++++++++++++++++
> include/linux/cpufreq.h        |   15 +++++++++++
> include/linux/thermal.h        |    2 ++ 3 files changed, 72
> insertions(+)
> 
> diff --git a/drivers/thermal/thermal_core.c
> b/drivers/thermal/thermal_core.c index 1f02e8e..8f4be55 100644
> --- a/drivers/thermal/thermal_core.c
> +++ b/drivers/thermal/thermal_core.c
> @@ -34,6 +34,7 @@
>  #include <linux/thermal.h>
>  #include <linux/reboot.h>
>  #include <linux/string.h>
> +#include <linux/cpufreq.h>
>  #include <net/netlink.h>
>  #include <net/genetlink.h>
>  
> @@ -354,9 +355,59 @@ static void handle_critical_trips(struct
> thermal_zone_device *tz, }
>  }
>  
> +static int thermal_boost_enable(struct thermal_zone_device *tz)
> +{
> +	enum thermal_trend trend = get_tz_trend(tz, 0);
> +	long trip_temp;
> +
> +	if (!tz->ops->get_trip_temp || !tz->overheated)
> +		return -EPERM;
> +	if (trend == THERMAL_TREND_RAISING || trend ==
> THERMAL_TREND_RAISE_FULL)
> +		return -EBUSY;
> +
> +	tz->ops->get_trip_temp(tz, 0, &trip_temp);
> +	/*
> +	 * Enable boost again only when current temperature is less
> +	 * than 75% of trip_temp[0]
> +	 */
> +	if ((tz->temperature + (trip_temp >> 2)) < trip_temp) {
> +		mutex_lock(&tz->lock);
> +		tz->overheated = false;
> +		if (tz->boost_polling) {
> +			tz->boost_polling = false;
> +			tz->polling_delay = 0;
> +		}
> +		mutex_unlock(&tz->lock);
> +		cpufreq_boost_trigger_state(1);
> +		return 0;
> +	}
> +	return -EBUSY;
> +}
> +
> +static void thermal_boost_disable(struct thermal_zone_device *tz)
> +{
> +	cpufreq_boost_trigger_state(0);
> +
> +	/*
> +	 * If no workqueue for monitoring is running - start one with
> +	 * 1000 ms monitoring period
> +	 * If workqueue already running - do not change its period
> and only
> +	 * test if target CPU has cooled down
> +	 */
> +	mutex_lock(&tz->lock);
> +	if (!tz->polling_delay) {
> +		tz->boost_polling = true;
> +		tz->polling_delay = 1000;
> +	}
> +	tz->overheated = true;
> +	mutex_unlock(&tz->lock);
> +}
> +
>  static void handle_thermal_trip(struct thermal_zone_device *tz, int
> trip) {
>  	enum thermal_trip_type type;
> +	if (cpufreq_boost_supported() && cpufreq_boost_enabled())
> +		thermal_boost_disable(tz);
>  
>  	tz->ops->get_trip_type(tz, trip, &type);
>  
> @@ -455,6 +506,10 @@ static void thermal_zone_device_check(struct
> work_struct *work) struct thermal_zone_device *tz =
> container_of(work, struct thermal_zone_device,
>  						      poll_queue.work);
> +	if (cpufreq_boost_supported())
> +		if (!thermal_boost_enable(tz))
> +			return;
> +
>  	thermal_zone_device_update(tz);
>  }
>  
> diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
> index 49a73c9..3d9276d 100644
> --- a/include/linux/cpufreq.h
> +++ b/include/linux/cpufreq.h
> @@ -435,9 +435,24 @@ int cpufreq_frequency_table_target(struct
> cpufreq_policy *policy, unsigned int relation,
>  				   unsigned int *index);
>  
> +#ifdef CONFIG_CPU_FREQ
>  int cpufreq_boost_trigger_state(int state);
>  int cpufreq_boost_supported(void);
>  int cpufreq_boost_enabled(void);
> +#else
> +static inline int cpufreq_boost_trigger_state(int state)
> +{
> +	return 0;
> +}
> +static inline int cpufreq_boost_supported(void)
> +{
> +	return 0;
> +}
> +static inline int cpufreq_boost_enabled(void)
> +{
> +	return 0;
> +}
> +#endif
>  /* the following 3 funtions are for cpufreq core use only */
>  struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned
> int cpu); 
> diff --git a/include/linux/thermal.h b/include/linux/thermal.h
> index a386a1c..f1aa3c2 100644
> --- a/include/linux/thermal.h
> +++ b/include/linux/thermal.h
> @@ -172,6 +172,8 @@ struct thermal_zone_device {
>  	int emul_temperature;
>  	int passive;
>  	unsigned int forced_passive;
> +	bool overheated;
> +	bool boost_polling;
>  	const struct thermal_zone_device_ops *ops;
>  	const struct thermal_zone_params *tzp;
>  	struct thermal_governor *governor;



-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 6/8] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework
  2013-07-26 10:26     ` Viresh Kumar
  2013-07-26 11:26       ` Lukasz Majewski
@ 2013-08-12  9:52       ` Lukasz Majewski
  1 sibling, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-12  9:52 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, durgadoss.r

On Fri, 26 Jul 2013 15:56:53 +0530 Viresh Kumar viresh.kumar@linaro.org
wrote,
> On 25 July 2013 22:03, Lukasz Majewski <l.majewski@samsung.com> wrote:
> 
> > diff --git a/drivers/cpufreq/exynos-cpufreq.c
> > b/drivers/cpufreq/exynos-cpufreq.c index 9ae1871..175172d9 100644
> > --- a/drivers/cpufreq/exynos-cpufreq.c
> > +++ b/drivers/cpufreq/exynos-cpufreq.c
> > @@ -270,6 +270,9 @@ static int exynos_cpufreq_cpu_exit(struct
> > cpufreq_policy *policy)
> >
> >  static struct freq_attr *exynos_cpufreq_attr[] = {
> >         &cpufreq_freq_attr_scaling_available_freqs,
> > +#ifdef CONFIG_CPU_FREQ_BOOST_SW
> 
> Use ARM_EXYNOS_CPU_FREQ_BOOST_SW instead.

Ok, the ARM_EXYNOS_CPU_FREQ_BOOST_SW looks more appropriate here.

> 
> > +       &cpufreq_freq_attr_scaling_boost_freqs,
> > +#endif
> >         NULL,
> >  };
> >
> > @@ -332,6 +335,9 @@ static int __init exynos_cpufreq_probe(struct
> > platform_device *pdev)
> >
> >         locking_frequency = exynos_getspeed(0);
> >
> > +#ifdef CONFIG_CPU_FREQ_BOOST_SW
> > +       exynos_driver.boost_supported = true;
> > +#endif
> 
> So, why here and not in the definition of exynos_driver?

Ok, I will move the above code to struct cpufreq_driver exynos_driver

> 
> >         register_pm_notifier(&exynos_cpufreq_nb);
> >
> >         if (cpufreq_register_driver(&exynos_driver)) {
> > --
> > 1.7.10.4
> >



-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 5/8] cpufreq:boost:Kconfig: Provide support for software managed BOOST
  2013-07-29  6:58         ` Viresh Kumar
@ 2013-08-12 10:26           ` Lukasz Majewski
  2013-08-12 10:28             ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-12 10:26 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	durgadoss.r

On Mon, 29 Jul 2013 12:28:02 +0530 Viresh Kumar viresh.kumar@linaro.org
wrote,
> On 26 July 2013 16:51, Lukasz Majewski <l.majewski@samsung.com> wrote:
> > On Fri, 26 Jul 2013 15:54:56 +0530 Viresh Kumar wrote,
> >> On 25 July 2013 22:03, Lukasz Majewski <l.majewski@samsung.com>
> >> wrote:
> 
> >> > +config CPU_FREQ_BOOST_SW
> >> > +       bool
> >>
> >> Invisible is fine but this must be disabled by default and must
> >> depend on thermal, rather than moving dependency on platform's
> >> config.
> >
> > The CPU_FREQ_BOOST_SW [1] is a generic flag (invisible).
> >
> > I will add "default n" to it.
> 
> Leave it.. We don't need it now.. that's how these kind of config
> options are defined as they are disabled by default.

Ok. Please see below proposition.

> 
> > Depending only on [3], results at situation where SW BOOST can be
> > enabled at x86 or ARM target with only generic THERMAL support
> > (which doesn't protect from overheating).
> 
> I had a similar concern.. Currently also we aren't stopping anybody to
> enable boost. By selecting thermal from CPU_FREQ_BOOST_SW, atleast
> we are communicating this very well to developers that they need
> something else as well. And currently we only have thermal as a source
> for telling when to block boost but it can be something else too..
> 
> I never said, don't use EXYNOS_THERMAL, its good to have a
> dependency on it in the Exynos specific config for boost, but I wanted
> normal sw boost also to depend on thermal..

1. at ./drivers/cpufreq/Kconfig:

+config CPU_FREQ_BOOST_SW
+	bool
+	depends on THERMAL

2. at ./drivers/cpufreq/Kconfig.arm:

+config ARM_EXYNOS_CPU_FREQ_BOOST_SW
+	bool "EXYNOS Frequency Overclocking - Software"
+	depends on ARM_EXYNOS_CPUFREQ
+	select CPU_FREQ_BOOST_SW
+	select EXYNOS_THERMAL
+	default n
+	help
+	  This driver supports software managed overclocking (BOOST).
+	  It allows usage of special frequencies for Samsung Exynos
+	  processors if thermal conditions are appropriate.
+
+	  It reguires, for safe operation, thermal framework with
  properly
+	  defined trip points.
+
+	  If in doubt, say N.
+

Shall I split this patch to two (1. and 2.) or leave it as a single one?

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 5/8] cpufreq:boost:Kconfig: Provide support for software managed BOOST
  2013-08-12 10:26           ` Lukasz Majewski
@ 2013-08-12 10:28             ` Viresh Kumar
  2013-08-12 10:50               ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-08-12 10:28 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	durgadoss.r

On 12 August 2013 15:56, Lukasz Majewski <l.majewski@samsung.com> wrote:
> 1. at ./drivers/cpufreq/Kconfig:
>
> +config CPU_FREQ_BOOST_SW
> +       bool
> +       depends on THERMAL
>
> 2. at ./drivers/cpufreq/Kconfig.arm:
>
> +config ARM_EXYNOS_CPU_FREQ_BOOST_SW
> +       bool "EXYNOS Frequency Overclocking - Software"
> +       depends on ARM_EXYNOS_CPUFREQ
> +       select CPU_FREQ_BOOST_SW
> +       select EXYNOS_THERMAL
> +       default n
> +       help
> +         This driver supports software managed overclocking (BOOST).
> +         It allows usage of special frequencies for Samsung Exynos
> +         processors if thermal conditions are appropriate.
> +
> +         It reguires, for safe operation, thermal framework with
>   properly
> +         defined trip points.
> +
> +         If in doubt, say N.
> +
>
> Shall I split this patch to two (1. and 2.) or leave it as a single one?

Looks fine.. Keep it in a single patch.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v6 5/8] cpufreq:boost:Kconfig: Provide support for software managed BOOST
  2013-08-12 10:28             ` Viresh Kumar
@ 2013-08-12 10:50               ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-12 10:50 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	durgadoss.r

On Mon, 12 Aug 2013 15:58:12 +0530 Viresh Kumar viresh.kumar@linaro.org
wrote,
> On 12 August 2013 15:56, Lukasz Majewski <l.majewski@samsung.com>
> wrote:
> > 1. at ./drivers/cpufreq/Kconfig:
> >
> > +config CPU_FREQ_BOOST_SW
> > +       bool
> > +       depends on THERMAL
> >
> > 2. at ./drivers/cpufreq/Kconfig.arm:
> >
> > +config ARM_EXYNOS_CPU_FREQ_BOOST_SW
> > +       bool "EXYNOS Frequency Overclocking - Software"
> > +       depends on ARM_EXYNOS_CPUFREQ
> > +       select CPU_FREQ_BOOST_SW
> > +       select EXYNOS_THERMAL
> > +       default n
	    ^^^^^^^^^^^^^^^^ I will also remove this line.

> > +       help
> > +         This driver supports software managed overclocking
> > (BOOST).
> > +         It allows usage of special frequencies for Samsung Exynos
> > +         processors if thermal conditions are appropriate.
> > +
> > +         It reguires, for safe operation, thermal framework with
> >   properly
> > +         defined trip points.
> > +
> > +         If in doubt, say N.
> > +
> >
> > Shall I split this patch to two (1. and 2.) or leave it as a single
> > one?
> 
> Looks fine.. Keep it in a single patch.

Ok. 

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* [PATCH v7 0/7] cpufreq:boost: CPU Boost mode support
  2013-06-06  7:07 [PATCH 0/5] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                   ` (9 preceding siblings ...)
  2013-07-25 16:33 ` [PATCH v6 0/8] " Lukasz Majewski
@ 2013-08-13 10:08 ` Lukasz Majewski
  2013-08-13 10:08   ` [PATCH v7 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
                     ` (7 more replies)
  2013-08-26 15:50 ` [PATCH v8 " Lukasz Majewski
                   ` (6 subsequent siblings)
  17 siblings, 8 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-13 10:08 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Kukjin Kim, Myungjoo Ham, durgadoss.r

This patch series introduces support for CPU overclocking technique
called Boost.

It is a follow up of a LAB governor proposal. Boost is a LAB component:
http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq

Boost unifies hardware based solution (e.g. Intel Nehalem) with
software oriented one (like the one done at Exynos).
For this reason cpufreq/freq_table code has been reorganized to include
common code.

Important design decisions:
- Boost related code is compiled-in unconditionally to cpufreq core and
  disabled by default. The cpufreq_driver is responsibile for setting
  boost_supported flag and providing set_boost callback(if HW support
  is needed). For software managed boost, special Kconfig flag -
  CONFIG_CPU_FREQ_BOOST_SW has been defined. It will be selected only
  when a target platform has thermal framework properly configured.

- struct cpufreq_driver has been extended with boost related fields:
        -- boost_supported - when driver supports boosting
        -- boost_enabled - boost state
        -- set_boost - callback to function, which is necessary to
           enable/disable boost

- Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost) is visible
  _only_ when cpufreq driver supports Boost.

- No special spin_lock for Boost was created. The one from cpufreq core
  was reused.

- The Boost code doesn't rely on any policy. When boost state is changed,
  then the policy list is iterated and proper adjustements are done.

- To improve safety level, the thermal framework is also extended to disable
  software boosting, when thermal trip point is reached. Then it starts
  monitoring target temperature to evaluate if boost can be enabled
  again. This emulates behaviour similar to HW managed boost (like x86)

Tested at HW:
       Exynos 4412 3.11-rc4 Linux
       Intel Core i7-3770 3.11-rc4 Linux

Above patches were posted on top of linux_pm/linux-next with following
patches applied:

cpufreq: exynos5440: Fix to skip when new frequency same as current
cpufreq: fix EXYNOS drivers selection

Lukasz Majewski (7):
  cpufreq: Add boost frequency support in core
  cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common
    boost solution
  thermal:boost: Automatic enable/disable of BOOST feature
  cpufreq:boost:Kconfig: Provide support for software managed BOOST
  cpufreq:exynos:Extend Exynos cpufreq driver to support boost
    framework
  Documentation:cpufreq:boost: Update BOOST documentation
  cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ

 Documentation/cpu-freq/boost.txt     |   26 ++++----
 drivers/cpufreq/Kconfig              |    4 ++
 drivers/cpufreq/Kconfig.arm          |   15 +++++
 drivers/cpufreq/acpi-cpufreq.c       |   86 +++++++++----------------
 drivers/cpufreq/cpufreq.c            |  115 +++++++++++++++++++++++++++++++++-
 drivers/cpufreq/exynos-cpufreq.c     |    6 ++
 drivers/cpufreq/exynos4x12-cpufreq.c |    2 +-
 drivers/cpufreq/freq_table.c         |   53 +++++++++++++---
 drivers/thermal/thermal_core.c       |   55 ++++++++++++++++
 include/linux/cpufreq.h              |   26 +++++++-
 include/linux/thermal.h              |    2 +
 11 files changed, 310 insertions(+), 80 deletions(-)

-- 
1.7.10.4


^ permalink raw reply	[flat|nested] 329+ messages in thread

* [PATCH v7 1/7] cpufreq: Add boost frequency support in core
  2013-08-13 10:08 ` [PATCH v7 0/7] " Lukasz Majewski
@ 2013-08-13 10:08   ` Lukasz Majewski
  2013-08-26  5:28     ` Viresh Kumar
  2013-08-13 10:08   ` [PATCH v7 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
                     ` (6 subsequent siblings)
  7 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-13 10:08 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Kukjin Kim, Myungjoo Ham, durgadoss.r

This commit adds boost frequency support in cpufreq core (Hardware &
Software). Some SoCs (like Exynos4 - e.g. 4x12) allow setting frequency
above its normal operation limits. Such mode shall be only used for a
short time.

Overclocking (boost) support is essentially provided by platform
dependent cpufreq driver.

This commit unifies support for SW and HW (Intel) overclocking solutions
in the core cpufreq driver. Previously the "boost" sysfs attribute was
defined at acpi driver code. By default boost is disabled. One global
attribute is available at: /sys/devices/system/cpu/cpufreq/boost.

It only shows up when cpufreq driver supports overclocking.
Under the hood frequencies dedicated for boosting are marked with a
special flag (CPUFREQ_BOOST_FREQ) at driver's frequency table.
It is the user's concern to enable/disable overclocking with a proper call
to sysfs.

The cpufreq_boost_trigger_state() function is defined non static on purpose.
It is used later with thermal subsystem to provide automatic enable/disable
of the BOOST feature.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v7:
- Properly change cpufreq_driver->boost_enabled when set_boost() fails
  (=0 to =!state)
- Add likely() around cpufreq_driver
- Remove parenthesis around boost.attr

Changes for v6:
- Remove sysfs boost attribute when subsys_iterface_unregister() fails
- Move global boost_enabled variable from cpufreq.c to platform dependent
  struct cpufreq_driver
- pr_err() message is also printed when boost disable fails
- Call __cpufreq_governor() to force recalculation of next frequency when
  boost is triggered. It is needed with i.e. performance class of governors
- Change cpufreq_boost_enable_sw() -> cpufreq_boost_set_sw()
- Rename .enable_boost function pointer to .set_boost

Changes for v5:
- Rename cpufreq_boost_trigger_state_sw() to cpufreq_boost_enable_sw()
- Extent cpufreq_register_driver() to check if cpufreq driver provided
  boost_enable callback. If not provided, then use cpufreq_boost_enable_sw()
- Use single call to cpufreq_driver->enable_boost() with cpufreq driver
  provided callback or default SW boost enable routine
- Move pr_debug call to store_boost() from cpufreq_boost_trigger_state()
- Change the user_policy.max value when SW boost is toggled. It is necessary
  for proper operation of e.g. thermal subsystem.
- Add check if cpufreq_driver pointer is not NULL at
  cpufreq_boost_supported() routine
- Add EXPORT_SYMBOL_GPL for cpufreq_boost_supported() and
  cpufreq_boost_enabled()
- Remove extra check for cpufreq_boost_supported() at
  cpufreq_freq_table_cpuinfo()
- Explanation of show boost logic at show_available_freqs()
- Add cpufreq_set_boost_enabled() method to set initial value of boost_enabled
  global flag

Changes for v4:
- Remove boost parameter from cpufreq_frequency_table_cpuinfo() function
- Introduce cpufreq_boost_supported() method
- Use of cpufreq_boost_supported() and cpufreq_boost_enabled() to decide
  if frequency shall be skipped
- Rename set_boost_freq() to enable_boost()
- cpufreq_attr_available_freq() moved to freq_table.c
- Use policy list to get access to cpufreq policies
- Rename global boost flag (cpufreq_boost_enabled -> boost_enabled)
- pr_err corrected ( %sable)
- Remove sanity check at cpufreq_boost_trigger_state() entrance [to test if
  boost is supported]
- Use either HW (boost_enable) callback or SW managed boost
- Introduce new cpufreq_boost_trigger_state_sw() method to handle boost
  at SW.
- Protect boost_enabled manipulation with lock.

Changes for v3:
- Method for reading boost status
- Removal of cpufreq_frequency_table_max()
- Extent cpufreq_frequency_table_cpuinfo() to support boost parameter
- boost_supported flag added to cpufreq_driver struct
- "boost" sysfs attribute control flag removed
- One global flag describing state of the boost defined at cpufreq core
- Rename cpufreq_driver's low_level_boost field to set_boost_freq()
- Usage of cpufreq_sysfs_{remove|add}_file() routines

Changes for v2:
- Removal of cpufreq_boost structure and move its fields to cpufreq_driver
  structure
- Flag to indicate if global boost attribute is already defined
- Extent the pr_{err|debbug} functions to show current function names

 drivers/cpufreq/cpufreq.c    |  115 +++++++++++++++++++++++++++++++++++++++++-
 drivers/cpufreq/freq_table.c |   53 ++++++++++++++++---
 include/linux/cpufreq.h      |   10 ++++
 3 files changed, 170 insertions(+), 8 deletions(-)

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 37a6874..196d8e8 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -345,6 +345,33 @@ EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
 /*********************************************************************
  *                          SYSFS INTERFACE                          *
  *********************************************************************/
+ssize_t show_boost(struct kobject *kobj,
+				 struct attribute *attr, char *buf)
+{
+	return sprintf(buf, "%d\n", cpufreq_driver->boost_enabled);
+}
+
+static ssize_t store_boost(struct kobject *kobj, struct attribute *attr,
+				  const char *buf, size_t count)
+{
+	int ret, enable;
+
+	ret = sscanf(buf, "%d", &enable);
+	if (ret != 1 || enable < 0 || enable > 1)
+		return -EINVAL;
+
+	if (cpufreq_boost_trigger_state(enable)) {
+		pr_err("%s: Cannot %s BOOST!\n", __func__,
+		       enable ? "enable" : "disable");
+		return -EINVAL;
+	}
+
+	pr_debug("%s: cpufreq BOOST %s\n", __func__,
+		 enable ? "enabled" : "disabled");
+
+	return count;
+}
+define_one_global_rw(boost);
 
 static struct cpufreq_governor *__find_governor(const char *str_governor)
 {
@@ -2036,6 +2063,70 @@ static struct notifier_block __refdata cpufreq_cpu_notifier = {
 };
 
 /*********************************************************************
+ *               BOOST						     *
+ *********************************************************************/
+static int cpufreq_boost_set_sw(int state)
+{
+	struct cpufreq_frequency_table *freq_table;
+	struct cpufreq_policy *policy;
+	int ret = -EINVAL;
+
+	list_for_each_entry(policy, &cpufreq_policy_list, policy_list) {
+		freq_table = cpufreq_frequency_get_table(policy->cpu);
+		if (freq_table) {
+			ret = cpufreq_frequency_table_cpuinfo(policy,
+							freq_table);
+			if (!ret) {
+				policy->user_policy.max = policy->max;
+				__cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
+			}
+		}
+	}
+
+	return ret;
+}
+
+int cpufreq_boost_trigger_state(int state)
+{
+	unsigned long flags;
+	int ret = 0;
+
+	if (cpufreq_driver->boost_enabled == state)
+		return 0;
+
+	write_lock_irqsave(&cpufreq_driver_lock, flags);
+	cpufreq_driver->boost_enabled = state;
+	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
+
+	ret = cpufreq_driver->set_boost(state);
+	if (ret) {
+		write_lock_irqsave(&cpufreq_driver_lock, flags);
+		cpufreq_driver->boost_enabled = !state;
+		write_unlock_irqrestore(&cpufreq_driver_lock, flags);
+
+		pr_err("%s: Cannot %s BOOST\n", __func__,
+		       state ? "enabled" : "disabled");
+	}
+
+	return ret;
+}
+
+int cpufreq_boost_supported(void)
+{
+	if (likely(cpufreq_driver))
+		return cpufreq_driver->boost_supported;
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(cpufreq_boost_supported);
+
+int cpufreq_boost_enabled(void)
+{
+	return cpufreq_driver->boost_enabled;
+}
+EXPORT_SYMBOL_GPL(cpufreq_boost_enabled);
+
+/*********************************************************************
  *               REGISTER / UNREGISTER CPUFREQ DRIVER                *
  *********************************************************************/
 
@@ -2074,9 +2165,25 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 	cpufreq_driver = driver_data;
 	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
 
+	if (cpufreq_boost_supported()) {
+		/*
+		 * Check if driver provides function to enable boost -
+		 * if not, use cpufreq_boost_set_sw as default
+		 */
+		if (!cpufreq_driver->set_boost)
+			cpufreq_driver->set_boost = cpufreq_boost_set_sw;
+
+		ret = cpufreq_sysfs_create_file(&boost.attr);
+		if (ret) {
+			pr_err("%s: cannot register global BOOST sysfs file\n",
+				__func__);
+			goto err_null_driver;
+		}
+	}
+
 	ret = subsys_interface_register(&cpufreq_interface);
 	if (ret)
-		goto err_null_driver;
+		goto err_boost_unreg;
 
 	if (!(cpufreq_driver->flags & CPUFREQ_STICKY)) {
 		int i;
@@ -2103,6 +2210,9 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 	return 0;
 err_if_unreg:
 	subsys_interface_unregister(&cpufreq_interface);
+err_boost_unreg:
+	if (cpufreq_boost_supported())
+		cpufreq_sysfs_remove_file(&boost.attr);
 err_null_driver:
 	write_lock_irqsave(&cpufreq_driver_lock, flags);
 	cpufreq_driver = NULL;
@@ -2129,6 +2239,9 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
 	pr_debug("unregistering driver %s\n", driver->name);
 
 	subsys_interface_unregister(&cpufreq_interface);
+	if (cpufreq_boost_supported())
+		cpufreq_sysfs_remove_file(&boost.attr);
+
 	unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
 
 	down_write(&cpufreq_rwsem);
diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c
index f111454a..d7eed63 100644
--- a/drivers/cpufreq/freq_table.c
+++ b/drivers/cpufreq/freq_table.c
@@ -32,6 +32,10 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
 
 			continue;
 		}
+		if (!cpufreq_boost_enabled()
+		    && table[i].driver_data == CPUFREQ_BOOST_FREQ)
+			continue;
+
 		pr_debug("table entry %u: %u kHz, %u driver_data\n",
 					i, freq, table[i].driver_data);
 		if (freq < min_freq)
@@ -169,7 +173,8 @@ static DEFINE_PER_CPU(struct cpufreq_frequency_table *, cpufreq_show_table);
 /**
  * show_available_freqs - show available frequencies for the specified CPU
  */
-static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
+static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf,
+				    bool show_boost)
 {
 	unsigned int i = 0;
 	unsigned int cpu = policy->cpu;
@@ -184,6 +189,20 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
 	for (i = 0; (table[i].frequency != CPUFREQ_TABLE_END); i++) {
 		if (table[i].frequency == CPUFREQ_ENTRY_INVALID)
 			continue;
+		/*
+		 * show_boost = true and driver_data = BOOST freq
+		 * display BOOST freqs
+		 *
+		 * show_boost = false and driver_data = BOOST freq
+		 * show_boost = true and driver_data != BOOST freq
+		 * continue - do not display anything
+		 *
+		 * show_boost = false and driver_data != BOOST freq
+		 * display NON BOOST freqs
+		 */
+		if (show_boost ^ (table[i].driver_data == CPUFREQ_BOOST_FREQ))
+			continue;
+
 		count += sprintf(&buf[count], "%d ", table[i].frequency);
 	}
 	count += sprintf(&buf[count], "\n");
@@ -192,14 +211,34 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
 
 }
 
-struct freq_attr cpufreq_freq_attr_scaling_available_freqs = {
-	.attr = { .name = "scaling_available_frequencies",
-		  .mode = 0444,
-		},
-	.show = show_available_freqs,
-};
+#define cpufreq_attr_available_freq(_name)	  \
+struct freq_attr cpufreq_freq_attr_##_name##_freqs =     \
+__ATTR_RO(_name##_frequencies)
+
+/**
+ * show_scaling_available_frequencies - show available normal frequencies for
+ * the specified CPU
+ */
+static ssize_t scaling_available_frequencies_show(struct cpufreq_policy *policy,
+						  char *buf)
+{
+	return show_available_freqs(policy, buf, false);
+}
+cpufreq_attr_available_freq(scaling_available);
 EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_available_freqs);
 
+/**
+ * show_available_boost_freqs - show available boost frequencies for
+ * the specified CPU
+ */
+static ssize_t scaling_boost_frequencies_show(struct cpufreq_policy *policy,
+					      char *buf)
+{
+	return show_available_freqs(policy, buf, true);
+}
+cpufreq_attr_available_freq(scaling_boost);
+EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_boost_freqs);
+
 /*
  * if you use these, you must assure that the frequency table is valid
  * all the time between get_attr and put_attr!
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index d568f39..b5defd4 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -209,6 +209,11 @@ struct cpufreq_driver {
 	int	(*suspend)	(struct cpufreq_policy *policy);
 	int	(*resume)	(struct cpufreq_policy *policy);
 	struct freq_attr	**attr;
+
+	/* platform specific boost support code */
+	bool                    boost_supported;
+	bool                    boost_enabled;
+	int     (*set_boost)    (int state);
 };
 
 /* flags */
@@ -381,6 +386,7 @@ extern struct cpufreq_governor cpufreq_gov_conservative;
 
 #define CPUFREQ_ENTRY_INVALID ~0
 #define CPUFREQ_TABLE_END     ~1
+#define CPUFREQ_BOOST_FREQ    ~2
 
 struct cpufreq_frequency_table {
 	unsigned int	driver_data; /* driver specific data, not used by core */
@@ -402,12 +408,16 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
 
 void cpufreq_frequency_table_update_policy_cpu(struct cpufreq_policy *policy);
 ssize_t cpufreq_show_cpus(const struct cpumask *mask, char *buf);
+int cpufreq_boost_trigger_state(int state);
+int cpufreq_boost_supported(void);
+int cpufreq_boost_enabled(void);
 
 /* the following funtion is for cpufreq core use only */
 struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu);
 
 /* the following are really really optional */
 extern struct freq_attr cpufreq_freq_attr_scaling_available_freqs;
+extern struct freq_attr cpufreq_freq_attr_scaling_boost_freqs;
 void cpufreq_frequency_table_get_attr(struct cpufreq_frequency_table *table,
 				      unsigned int cpu);
 void cpufreq_frequency_table_put_attr(unsigned int cpu);
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v7 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution
  2013-08-13 10:08 ` [PATCH v7 0/7] " Lukasz Majewski
  2013-08-13 10:08   ` [PATCH v7 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
@ 2013-08-13 10:08   ` Lukasz Majewski
  2013-08-26  5:32     ` Viresh Kumar
  2013-08-13 10:08   ` [PATCH v7 3/7] thermal:boost: Automatic enable/disable of BOOST feature Lukasz Majewski
                     ` (5 subsequent siblings)
  7 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-13 10:08 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Kukjin Kim, Myungjoo Ham, durgadoss.r

The Intel's hardware based boost solution driver has been changed to cooperate with
common cpufreq boost framework.

The global sysfs boost attribute entry code (/sys/devices/system/cpu/cpufreq/boost)
has been moved to a core cpufreq code. This attribute is now only visible,
when cpufreq driver supports it.

The _store_boost() function has been redesigned to be used as set_boost
callback.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v7:
- Remove superfluous acpi_cpufreq_driver.boost_supported = false at
  acpi_cpufreq_boost_init()

Changes for v6:
- Perform acpi_cpufreq_boost_init initialization before cpufreq_driver
  registration
- Compile store_boost() only when CONFIG_X86_ACPI_CPUFREQ_CPB defined
- Use boost_enabled flag defined at acpi_cpufreq_driver to store information
  about boost state
- Instead of using cpufreq_set_boost_enabled(), modify the boost_enable in
  the acpi driver code

Changes for v5:
- Remove acpi-cpufreq's boost_enabled global flag and reuse one defined at
  cpufreq core

Changes for v4:
- add _store_boost to acpi_cpufreq_driver structure

Changes for v3:
- Bring back boost_enabled as a global flag
- Move boost_supported to cpufreq_driver structure

Changes for v2:
- Replace boost_enabled and boost_supported global flags with proper entries
  at struct cpufreq_driver.
- Removal of struct cpufreq_boost

 drivers/cpufreq/acpi-cpufreq.c |   86 ++++++++++++++--------------------------
 1 file changed, 29 insertions(+), 57 deletions(-)

diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c
index 9b5d1b1..4400b89 100644
--- a/drivers/cpufreq/acpi-cpufreq.c
+++ b/drivers/cpufreq/acpi-cpufreq.c
@@ -80,7 +80,6 @@ static struct acpi_processor_performance __percpu *acpi_perf_data;
 static struct cpufreq_driver acpi_cpufreq_driver;
 
 static unsigned int acpi_pstate_strict;
-static bool boost_enabled, boost_supported;
 static struct msr __percpu *msrs;
 
 static bool boost_state(unsigned int cpu)
@@ -133,49 +132,16 @@ static void boost_set_msrs(bool enable, const struct cpumask *cpumask)
 	wrmsr_on_cpus(cpumask, msr_addr, msrs);
 }
 
-static ssize_t _store_boost(const char *buf, size_t count)
+static int _store_boost(int val)
 {
-	int ret;
-	unsigned long val = 0;
-
-	if (!boost_supported)
-		return -EINVAL;
-
-	ret = kstrtoul(buf, 10, &val);
-	if (ret || (val > 1))
-		return -EINVAL;
-
-	if ((val && boost_enabled) || (!val && !boost_enabled))
-		return count;
-
 	get_online_cpus();
-
 	boost_set_msrs(val, cpu_online_mask);
-
 	put_online_cpus();
-
-	boost_enabled = val;
 	pr_debug("Core Boosting %sabled.\n", val ? "en" : "dis");
 
-	return count;
-}
-
-static ssize_t store_global_boost(struct kobject *kobj, struct attribute *attr,
-				  const char *buf, size_t count)
-{
-	return _store_boost(buf, count);
-}
-
-static ssize_t show_global_boost(struct kobject *kobj,
-				 struct attribute *attr, char *buf)
-{
-	return sprintf(buf, "%u\n", boost_enabled);
+	return 0;
 }
 
-static struct global_attr global_boost = __ATTR(boost, 0644,
-						show_global_boost,
-						store_global_boost);
-
 static ssize_t show_freqdomain_cpus(struct cpufreq_policy *policy, char *buf)
 {
 	struct acpi_cpufreq_data *data = per_cpu(acfreq_data, policy->cpu);
@@ -186,15 +152,32 @@ static ssize_t show_freqdomain_cpus(struct cpufreq_policy *policy, char *buf)
 cpufreq_freq_attr_ro(freqdomain_cpus);
 
 #ifdef CONFIG_X86_ACPI_CPUFREQ_CPB
+static ssize_t store_boost(const char *buf, size_t count)
+{
+	int ret;
+	unsigned long val = 0;
+
+	if (!acpi_cpufreq_driver.boost_supported)
+		return -EINVAL;
+
+	ret = kstrtoul(buf, 10, &val);
+	if (ret || (val > 1))
+		return -EINVAL;
+
+	_store_boost((int) val);
+
+	return count;
+}
+
 static ssize_t store_cpb(struct cpufreq_policy *policy, const char *buf,
 			 size_t count)
 {
-	return _store_boost(buf, count);
+	return store_boost(buf, count);
 }
 
 static ssize_t show_cpb(struct cpufreq_policy *policy, char *buf)
 {
-	return sprintf(buf, "%u\n", boost_enabled);
+	return sprintf(buf, "%u\n", acpi_cpufreq_driver.boost_enabled);
 }
 
 static struct freq_attr cpb = __ATTR(cpb, 0644, show_cpb, store_cpb);
@@ -582,7 +565,7 @@ static int boost_notify(struct notifier_block *nb, unsigned long action,
 	switch (action) {
 	case CPU_UP_PREPARE:
 	case CPU_UP_PREPARE_FROZEN:
-		boost_set_msrs(boost_enabled, cpumask);
+		boost_set_msrs(acpi_cpufreq_driver.boost_enabled, cpumask);
 		break;
 
 	case CPU_DOWN_PREPARE:
@@ -937,6 +920,7 @@ static struct cpufreq_driver acpi_cpufreq_driver = {
 	.resume		= acpi_cpufreq_resume,
 	.name		= "acpi-cpufreq",
 	.attr		= acpi_cpufreq_attr,
+	.set_boost      = _store_boost,
 };
 
 static void __init acpi_cpufreq_boost_init(void)
@@ -947,33 +931,22 @@ static void __init acpi_cpufreq_boost_init(void)
 		if (!msrs)
 			return;
 
-		boost_supported = true;
-		boost_enabled = boost_state(0);
-
+		acpi_cpufreq_driver.boost_supported = true;
+		acpi_cpufreq_driver.boost_enabled = boost_state(0);
 		get_online_cpus();
 
 		/* Force all MSRs to the same value */
-		boost_set_msrs(boost_enabled, cpu_online_mask);
+		boost_set_msrs(acpi_cpufreq_driver.boost_enabled,
+			       cpu_online_mask);
 
 		register_cpu_notifier(&boost_nb);
 
 		put_online_cpus();
-	} else
-		global_boost.attr.mode = 0444;
-
-	/* We create the boost file in any case, though for systems without
-	 * hardware support it will be read-only and hardwired to return 0.
-	 */
-	if (cpufreq_sysfs_create_file(&(global_boost.attr)))
-		pr_warn(PFX "could not register global boost sysfs file\n");
-	else
-		pr_debug("registered global boost sysfs file\n");
+	}
 }
 
 static void __exit acpi_cpufreq_boost_exit(void)
 {
-	cpufreq_sysfs_remove_file(&(global_boost.attr));
-
 	if (msrs) {
 		unregister_cpu_notifier(&boost_nb);
 
@@ -1015,12 +988,11 @@ static int __init acpi_cpufreq_init(void)
 			*iter = &cpb;
 	}
 #endif
+	acpi_cpufreq_boost_init();
 
 	ret = cpufreq_register_driver(&acpi_cpufreq_driver);
 	if (ret)
 		free_acpi_perf_data();
-	else
-		acpi_cpufreq_boost_init();
 
 	return ret;
 }
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v7 3/7] thermal:boost: Automatic enable/disable of BOOST feature
  2013-08-13 10:08 ` [PATCH v7 0/7] " Lukasz Majewski
  2013-08-13 10:08   ` [PATCH v7 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
  2013-08-13 10:08   ` [PATCH v7 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
@ 2013-08-13 10:08   ` Lukasz Majewski
  2013-08-26  5:33     ` Viresh Kumar
  2013-08-13 10:08   ` [PATCH v7 4/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
                     ` (4 subsequent siblings)
  7 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-13 10:08 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Kukjin Kim, Myungjoo Ham, durgadoss.r

This patch provides auto disable/enable operation for boost. When any
defined trip point is passed, the boost is disabled.
In that moment thermal monitor workqueue is woken up and it monitors
if the device temperature drops below 75% of the smallest trip point.
When device cools down, the boost is enabled again.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v7:
- None

Changes for v6:
- Disable boost only when supported and enabled
- Protect boost related thermal_zone_device struct fields with mutex
- Evaluate temperature trend during boost enable decision
- Create separate methods to handle boost enable/disable
  (thermal_boost_{enable|disable}) operations
- Boost is disabled at any trip point passage (not only the non critical one)
- Add stub definitions for cpufreq boost functions used when
  CONFIG_CPU_FREQ is NOT defined.

Changes for v5:
- Move boost disable code from cpu_cooling.c to thermal_core.c
  (to handle_non_critical_trips)
- Extent struct thermal_zone_device by adding overheated bool flag
- Implement auto enable of boost after device cools down
- Introduce boost_polling flag, which indicates if thermal uses it's predefined
  pool delay or has woken up thermal workqueue only to wait until device
  cools down.

Changes for v4:
- New patch

 drivers/thermal/thermal_core.c |   55 ++++++++++++++++++++++++++++++++++++++++
 include/linux/cpufreq.h        |   16 +++++++++++-
 include/linux/thermal.h        |    2 ++
 3 files changed, 72 insertions(+), 1 deletion(-)

diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
index 1f02e8e..8f4be55 100644
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -34,6 +34,7 @@
 #include <linux/thermal.h>
 #include <linux/reboot.h>
 #include <linux/string.h>
+#include <linux/cpufreq.h>
 #include <net/netlink.h>
 #include <net/genetlink.h>
 
@@ -354,9 +355,59 @@ static void handle_critical_trips(struct thermal_zone_device *tz,
 	}
 }
 
+static int thermal_boost_enable(struct thermal_zone_device *tz)
+{
+	enum thermal_trend trend = get_tz_trend(tz, 0);
+	long trip_temp;
+
+	if (!tz->ops->get_trip_temp || !tz->overheated)
+		return -EPERM;
+	if (trend == THERMAL_TREND_RAISING || trend == THERMAL_TREND_RAISE_FULL)
+		return -EBUSY;
+
+	tz->ops->get_trip_temp(tz, 0, &trip_temp);
+	/*
+	 * Enable boost again only when current temperature is less
+	 * than 75% of trip_temp[0]
+	 */
+	if ((tz->temperature + (trip_temp >> 2)) < trip_temp) {
+		mutex_lock(&tz->lock);
+		tz->overheated = false;
+		if (tz->boost_polling) {
+			tz->boost_polling = false;
+			tz->polling_delay = 0;
+		}
+		mutex_unlock(&tz->lock);
+		cpufreq_boost_trigger_state(1);
+		return 0;
+	}
+	return -EBUSY;
+}
+
+static void thermal_boost_disable(struct thermal_zone_device *tz)
+{
+	cpufreq_boost_trigger_state(0);
+
+	/*
+	 * If no workqueue for monitoring is running - start one with
+	 * 1000 ms monitoring period
+	 * If workqueue already running - do not change its period and only
+	 * test if target CPU has cooled down
+	 */
+	mutex_lock(&tz->lock);
+	if (!tz->polling_delay) {
+		tz->boost_polling = true;
+		tz->polling_delay = 1000;
+	}
+	tz->overheated = true;
+	mutex_unlock(&tz->lock);
+}
+
 static void handle_thermal_trip(struct thermal_zone_device *tz, int trip)
 {
 	enum thermal_trip_type type;
+	if (cpufreq_boost_supported() && cpufreq_boost_enabled())
+		thermal_boost_disable(tz);
 
 	tz->ops->get_trip_type(tz, trip, &type);
 
@@ -455,6 +506,10 @@ static void thermal_zone_device_check(struct work_struct *work)
 	struct thermal_zone_device *tz = container_of(work, struct
 						      thermal_zone_device,
 						      poll_queue.work);
+	if (cpufreq_boost_supported())
+		if (!thermal_boost_enable(tz))
+			return;
+
 	thermal_zone_device_update(tz);
 }
 
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index b5defd4..ec19da9 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -408,10 +408,24 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
 
 void cpufreq_frequency_table_update_policy_cpu(struct cpufreq_policy *policy);
 ssize_t cpufreq_show_cpus(const struct cpumask *mask, char *buf);
+#ifdef CONFIG_CPU_FREQ
 int cpufreq_boost_trigger_state(int state);
 int cpufreq_boost_supported(void);
 int cpufreq_boost_enabled(void);
-
+#else
+static inline int cpufreq_boost_trigger_state(int state)
+{
+	return 0;
+}
+static inline int cpufreq_boost_supported(void)
+{
+	return 0;
+}
+static inline int cpufreq_boost_enabled(void)
+{
+	return 0;
+}
+#endif
 /* the following funtion is for cpufreq core use only */
 struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu);
 
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index a386a1c..f1aa3c2 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -172,6 +172,8 @@ struct thermal_zone_device {
 	int emul_temperature;
 	int passive;
 	unsigned int forced_passive;
+	bool overheated;
+	bool boost_polling;
 	const struct thermal_zone_device_ops *ops;
 	const struct thermal_zone_params *tzp;
 	struct thermal_governor *governor;
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v7 4/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST
  2013-08-13 10:08 ` [PATCH v7 0/7] " Lukasz Majewski
                     ` (2 preceding siblings ...)
  2013-08-13 10:08   ` [PATCH v7 3/7] thermal:boost: Automatic enable/disable of BOOST feature Lukasz Majewski
@ 2013-08-13 10:08   ` Lukasz Majewski
  2013-08-26  5:35     ` Viresh Kumar
  2013-08-13 10:08   ` [PATCH v7 5/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
                     ` (3 subsequent siblings)
  7 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-13 10:08 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Kukjin Kim, Myungjoo Ham, durgadoss.r

For safety reasons new flag - CONFIG_CPU_FREQ_BOOST_SW has been added.
Only after selecting "EXYNOS Frequency Overclocking - Software" Kconfig
option the software managed boost is enabled. It also selects thermal
subsystem to be compiled in. Thermal is necessary for disabling boost
and cooling down the device when overheating detected.

Boost _MUST_NOT_ work without thermal subsystem with properly defined
overheating temperatures.

This option doesn't affect x86's ACPI hardware managed boost support
(i.e. Intel, AMD). In this situation boost management is embedded at
hardware.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v7:
- Remove superfluous "default n" definition
- Generic CPU_FREQ_BOOST_SW depends on THERMAL

Changes for v6:
- CPU_FREQ_BOOST_SW [1] is now defined as "invisible" bool option.
- Platform dependent ARM_EXYNOS_CPU_FREQ_BOOST_SW config option has been
  added. It depends on ARM_EXYNOS_CPUFREQ options and selects
  EXYNOS_THERMAL with the main boost config [1].

Changes for v5:
- New patch

 drivers/cpufreq/Kconfig     |    4 ++++
 drivers/cpufreq/Kconfig.arm |   15 +++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
index 534fcb8..e3cbf72 100644
--- a/drivers/cpufreq/Kconfig
+++ b/drivers/cpufreq/Kconfig
@@ -23,6 +23,10 @@ config CPU_FREQ_TABLE
 config CPU_FREQ_GOV_COMMON
 	bool
 
+config CPU_FREQ_BOOST_SW
+	bool
+	depends on THERMAL
+
 config CPU_FREQ_STAT
 	tristate "CPU frequency translation statistics"
 	select CPU_FREQ_TABLE
diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm
index 0fa204b..6a6d173 100644
--- a/drivers/cpufreq/Kconfig.arm
+++ b/drivers/cpufreq/Kconfig.arm
@@ -67,6 +67,21 @@ config ARM_EXYNOS5440_CPUFREQ
 
 	  If in doubt, say N.
 
+config ARM_EXYNOS_CPU_FREQ_BOOST_SW
+	bool "EXYNOS Frequency Overclocking - Software"
+	depends on ARM_EXYNOS_CPUFREQ
+	select CPU_FREQ_BOOST_SW
+	select EXYNOS_THERMAL
+	help
+	  This driver supports software managed overclocking (BOOST).
+	  It allows usage of special frequencies for Samsung Exynos
+	  processors if thermal conditions are appropriate.
+
+	  It reguires, for safe operation, thermal framework with properly
+	  defined trip points.
+
+	  If in doubt, say N.
+
 config ARM_HIGHBANK_CPUFREQ
 	tristate "Calxeda Highbank-based"
 	depends on ARCH_HIGHBANK
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v7 5/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework
  2013-08-13 10:08 ` [PATCH v7 0/7] " Lukasz Majewski
                     ` (3 preceding siblings ...)
  2013-08-13 10:08   ` [PATCH v7 4/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
@ 2013-08-13 10:08   ` Lukasz Majewski
  2013-08-26  5:36     ` Viresh Kumar
  2013-08-13 10:08   ` [PATCH v7 6/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
                     ` (2 subsequent siblings)
  7 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-13 10:08 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Kukjin Kim, Myungjoo Ham, durgadoss.r

The cpufreq_driver's boost_supported flag is true only when boost
support is explicitly enabled. Boost related attributes are exported only
under the same condition.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v7:
- Replace CONFIG_CPU_FREQ_BOOST_SW with CONFIG_ARM_EXYNOS_CPU_FREQ_BOOST_SW
- Move boost_supported initialization to struct cpufreq_driver exynos_driver

Changes for v6:
- Replace exynos_driver.boost_supported = 1 to = true
- Protect boost attributes export with CONFIG_CPU_FREQ_BOOST_SW

Changes for v5:
- None

Changes for v4:
- None

Changes for v3:
- Remove low level boost code
- Move boost management code to cpufreq core code
- Use boost_supported flag to indicate if driver supports over clocking

Changes for v2:
- Removal of struct cpufreq_boost
- Removal of the CONFIG_CPU_FREQ_BOOST flag
- low_level_boost with valid address when boost is supported

 drivers/cpufreq/exynos-cpufreq.c |    6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/cpufreq/exynos-cpufreq.c b/drivers/cpufreq/exynos-cpufreq.c
index b9f9aee..2786aba 100644
--- a/drivers/cpufreq/exynos-cpufreq.c
+++ b/drivers/cpufreq/exynos-cpufreq.c
@@ -270,6 +270,9 @@ static int exynos_cpufreq_cpu_exit(struct cpufreq_policy *policy)
 
 static struct freq_attr *exynos_cpufreq_attr[] = {
 	&cpufreq_freq_attr_scaling_available_freqs,
+#ifdef CONFIG_ARM_EXYNOS_CPU_FREQ_BOOST_SW
+	&cpufreq_freq_attr_scaling_boost_freqs,
+#endif
 	NULL,
 };
 
@@ -282,6 +285,9 @@ static struct cpufreq_driver exynos_driver = {
 	.exit		= exynos_cpufreq_cpu_exit,
 	.name		= "exynos_cpufreq",
 	.attr		= exynos_cpufreq_attr,
+#ifdef CONFIG_ARM_EXYNOS_CPU_FREQ_BOOST_SW
+	.boost_supported = true,
+#endif
 #ifdef CONFIG_PM
 	.suspend	= exynos_cpufreq_suspend,
 	.resume		= exynos_cpufreq_resume,
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v7 6/7] Documentation:cpufreq:boost: Update BOOST documentation
  2013-08-13 10:08 ` [PATCH v7 0/7] " Lukasz Majewski
                     ` (4 preceding siblings ...)
  2013-08-13 10:08   ` [PATCH v7 5/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
@ 2013-08-13 10:08   ` Lukasz Majewski
  2013-08-26  5:36     ` Viresh Kumar
  2013-08-13 10:08   ` [PATCH v7 7/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
  2013-08-19  6:38   ` [PATCH v7 0/7] cpufreq:boost: CPU Boost mode support Viresh Kumar
  7 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-13 10:08 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Kukjin Kim, Myungjoo Ham, durgadoss.r

Since the support for software and hardware controlled boosting has been
added, the corresponding Documentation entry had been updated.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v7:
- None

Changes for v6:
- None

Changes for v5:
- New patch

 Documentation/cpu-freq/boost.txt |   26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/Documentation/cpu-freq/boost.txt b/Documentation/cpu-freq/boost.txt
index 9b4edfc..dd62e13 100644
--- a/Documentation/cpu-freq/boost.txt
+++ b/Documentation/cpu-freq/boost.txt
@@ -17,8 +17,8 @@ Introduction
 Some CPUs support a functionality to raise the operating frequency of
 some cores in a multi-core package if certain conditions apply, mostly
 if the whole chip is not fully utilized and below it's intended thermal
-budget. This is done without operating system control by a combination
-of hardware and firmware.
+budget. The decision about boost disable/enable is made either at hardware
+(e.g. x86) or software (e.g ARM).
 On Intel CPUs this is called "Turbo Boost", AMD calls it "Turbo-Core",
 in technical documentation "Core performance boost". In Linux we use
 the term "boost" for convenience.
@@ -48,24 +48,24 @@ be desirable:
 User controlled switch
 ----------------------
 
-To allow the user to toggle the boosting functionality, the acpi-cpufreq
-driver exports a sysfs knob to disable it. There is a file:
+To allow the user to toggle the boosting functionality, the cpufreq core
+driver exports a sysfs knob to enable or disable it. There is a file:
 /sys/devices/system/cpu/cpufreq/boost
 which can either read "0" (boosting disabled) or "1" (boosting enabled).
-Reading the file is always supported, even if the processor does not
-support boosting. In this case the file will be read-only and always
-reads as "0". Explicitly changing the permissions and writing to that
-file anyway will return EINVAL.
+The file is exported only when cpufreq driver supports boosting.
+Explicitly changing the permissions and writing to that file anyway will
+return EINVAL.
 
 On supported CPUs one can write either a "0" or a "1" into this file.
 This will either disable the boost functionality on all cores in the
-whole system (0) or will allow the hardware to boost at will (1).
+whole system (0) or will allow the software or hardware to boost at will
+(1).
 
 Writing a "1" does not explicitly boost the system, but just allows the
-CPU (and the firmware) to boost at their discretion. Some implementations
-take external factors like the chip's temperature into account, so
-boosting once does not necessarily mean that it will occur every time
-even using the exact same software setup.
+CPU to boost at their discretion. Some implementations take external
+factors like the chip's temperature into account, so boosting once does
+not necessarily mean that it will occur every time even using the exact
+same software setup.
 
 
 AMD legacy cpb switch
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v7 7/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ
  2013-08-13 10:08 ` [PATCH v7 0/7] " Lukasz Majewski
                     ` (5 preceding siblings ...)
  2013-08-13 10:08   ` [PATCH v7 6/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
@ 2013-08-13 10:08   ` Lukasz Majewski
  2013-08-26  5:37     ` Viresh Kumar
  2013-08-19  6:38   ` [PATCH v7 0/7] cpufreq:boost: CPU Boost mode support Viresh Kumar
  7 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-13 10:08 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Kukjin Kim, Myungjoo Ham, durgadoss.r

Special driver data flag (CPUFREQ_BOOST_FREQ) has been added to indicate
frequency, which can be only enabled for BOOST mode.
This frequency shall be used only for limited time, since it might cause
target device to overheat.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v7:
- None

Changes for v6:
- New patch

 drivers/cpufreq/exynos4x12-cpufreq.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/cpufreq/exynos4x12-cpufreq.c b/drivers/cpufreq/exynos4x12-cpufreq.c
index e270b42..367f600 100644
--- a/drivers/cpufreq/exynos4x12-cpufreq.c
+++ b/drivers/cpufreq/exynos4x12-cpufreq.c
@@ -32,7 +32,7 @@ static unsigned int exynos4x12_volt_table[] = {
 };
 
 static struct cpufreq_frequency_table exynos4x12_freq_table[] = {
-	{L0, CPUFREQ_ENTRY_INVALID},
+	{CPUFREQ_BOOST_FREQ, 1500 * 1000},
 	{L1, 1400 * 1000},
 	{L2, 1300 * 1000},
 	{L3, 1200 * 1000},
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* Re: [PATCH v7 0/7] cpufreq:boost: CPU Boost mode support
  2013-08-13 10:08 ` [PATCH v7 0/7] " Lukasz Majewski
                     ` (6 preceding siblings ...)
  2013-08-13 10:08   ` [PATCH v7 7/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
@ 2013-08-19  6:38   ` Viresh Kumar
  2013-08-19  6:50     ` Lukasz Majewski
  7 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-08-19  6:38 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, R, Durgadoss

On 13 August 2013 15:38, Lukasz Majewski <l.majewski@samsung.com> wrote:
> This patch series introduces support for CPU overclocking technique
> called Boost.
>
> It is a follow up of a LAB governor proposal. Boost is a LAB component:
> http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq
>
> Boost unifies hardware based solution (e.g. Intel Nehalem) with
> software oriented one (like the one done at Exynos).
> For this reason cpufreq/freq_table code has been reorganized to include
> common code.
>
> Important design decisions:
> - Boost related code is compiled-in unconditionally to cpufreq core and
>   disabled by default. The cpufreq_driver is responsibile for setting
>   boost_supported flag and providing set_boost callback(if HW support
>   is needed). For software managed boost, special Kconfig flag -
>   CONFIG_CPU_FREQ_BOOST_SW has been defined. It will be selected only
>   when a target platform has thermal framework properly configured.
>
> - struct cpufreq_driver has been extended with boost related fields:
>         -- boost_supported - when driver supports boosting
>         -- boost_enabled - boost state
>         -- set_boost - callback to function, which is necessary to
>            enable/disable boost
>
> - Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost) is visible
>   _only_ when cpufreq driver supports Boost.
>
> - No special spin_lock for Boost was created. The one from cpufreq core
>   was reused.
>
> - The Boost code doesn't rely on any policy. When boost state is changed,
>   then the policy list is iterated and proper adjustements are done.
>
> - To improve safety level, the thermal framework is also extended to disable
>   software boosting, when thermal trip point is reached. Then it starts
>   monitoring target temperature to evaluate if boost can be enabled
>   again. This emulates behaviour similar to HW managed boost (like x86)
>
> Tested at HW:
>        Exynos 4412 3.11-rc4 Linux
>        Intel Core i7-3770 3.11-rc4 Linux
>
> Above patches were posted on top of linux_pm/linux-next with following
> patches applied:
>
> cpufreq: exynos5440: Fix to skip when new frequency same as current
> cpufreq: fix EXYNOS drivers selection
>
> Lukasz Majewski (7):
>   cpufreq: Add boost frequency support in core
>   cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common
>     boost solution
>   thermal:boost: Automatic enable/disable of BOOST feature
>   cpufreq:boost:Kconfig: Provide support for software managed BOOST
>   cpufreq:exynos:Extend Exynos cpufreq driver to support boost
>     framework
>   Documentation:cpufreq:boost: Update BOOST documentation
>   cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ

Hi Lukasz,

I haven't found time yet to go through this series.. I want to do a deep/careful
review this time as these are almost the final patches.

Will try to get over them by the end of this week..

--
viresh

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v7 0/7] cpufreq:boost: CPU Boost mode support
  2013-08-19  6:38   ` [PATCH v7 0/7] cpufreq:boost: CPU Boost mode support Viresh Kumar
@ 2013-08-19  6:50     ` Lukasz Majewski
  2013-08-19 23:29       ` Rafael J. Wysocki
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-19  6:50 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, R, Durgadoss

On Mon, 19 Aug 2013 12:08:26 +0530 Viresh Kumar viresh.kumar@linaro.org
wrote,
> On 13 August 2013 15:38, Lukasz Majewski <l.majewski@samsung.com>
> wrote:
> > This patch series introduces support for CPU overclocking technique
> > called Boost.
> >
> > It is a follow up of a LAB governor proposal. Boost is a LAB
> > component:
> > http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq
> >
> > Boost unifies hardware based solution (e.g. Intel Nehalem) with
> > software oriented one (like the one done at Exynos).
> > For this reason cpufreq/freq_table code has been reorganized to
> > include common code.
> >
> > Important design decisions:
> > - Boost related code is compiled-in unconditionally to cpufreq core
> > and disabled by default. The cpufreq_driver is responsibile for
> > setting boost_supported flag and providing set_boost callback(if HW
> > support is needed). For software managed boost, special Kconfig
> > flag - CONFIG_CPU_FREQ_BOOST_SW has been defined. It will be
> > selected only when a target platform has thermal framework properly
> > configured.
> >
> > - struct cpufreq_driver has been extended with boost related fields:
> >         -- boost_supported - when driver supports boosting
> >         -- boost_enabled - boost state
> >         -- set_boost - callback to function, which is necessary to
> >            enable/disable boost
> >
> > - Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost) is
> > visible _only_ when cpufreq driver supports Boost.
> >
> > - No special spin_lock for Boost was created. The one from cpufreq
> > core was reused.
> >
> > - The Boost code doesn't rely on any policy. When boost state is
> > changed, then the policy list is iterated and proper adjustements
> > are done.
> >
> > - To improve safety level, the thermal framework is also extended
> > to disable software boosting, when thermal trip point is reached.
> > Then it starts monitoring target temperature to evaluate if boost
> > can be enabled again. This emulates behaviour similar to HW managed
> > boost (like x86)
> >
> > Tested at HW:
> >        Exynos 4412 3.11-rc4 Linux
> >        Intel Core i7-3770 3.11-rc4 Linux
> >
> > Above patches were posted on top of linux_pm/linux-next with
> > following patches applied:
> >
> > cpufreq: exynos5440: Fix to skip when new frequency same as current
> > cpufreq: fix EXYNOS drivers selection
> >
> > Lukasz Majewski (7):
> >   cpufreq: Add boost frequency support in core
> >   cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with
> > common boost solution
> >   thermal:boost: Automatic enable/disable of BOOST feature
> >   cpufreq:boost:Kconfig: Provide support for software managed BOOST
> >   cpufreq:exynos:Extend Exynos cpufreq driver to support boost
> >     framework
> >   Documentation:cpufreq:boost: Update BOOST documentation
> >   cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ
> 
> Hi Lukasz,
> 

Hi Viresh,

> I haven't found time yet to go through this series.. 

I've just started wondering if I had send those patches correctly :-).

> I want to do a
> deep/careful review this time as these are almost the final patches.

Ok.

> 
> Will try to get over them by the end of this week..

Ok, I understand.

> 
> --
> viresh
> --
> To unsubscribe from this list: send the line "unsubscribe linux-pm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 



-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v7 0/7] cpufreq:boost: CPU Boost mode support
  2013-08-19  6:50     ` Lukasz Majewski
@ 2013-08-19 23:29       ` Rafael J. Wysocki
  2013-08-20  8:11         ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Rafael J. Wysocki @ 2013-08-19 23:29 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Viresh Kumar, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, R, Durgadoss

On Monday, August 19, 2013 08:50:37 AM Lukasz Majewski wrote:
> On Mon, 19 Aug 2013 12:08:26 +0530 Viresh Kumar viresh.kumar@linaro.org
> wrote,
> > On 13 August 2013 15:38, Lukasz Majewski <l.majewski@samsung.com>
> > wrote:
> > > This patch series introduces support for CPU overclocking technique
> > > called Boost.
> > >
> > > It is a follow up of a LAB governor proposal. Boost is a LAB
> > > component:
> > > http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq
> > >
> > > Boost unifies hardware based solution (e.g. Intel Nehalem) with
> > > software oriented one (like the one done at Exynos).
> > > For this reason cpufreq/freq_table code has been reorganized to
> > > include common code.
> > >
> > > Important design decisions:
> > > - Boost related code is compiled-in unconditionally to cpufreq core
> > > and disabled by default. The cpufreq_driver is responsibile for
> > > setting boost_supported flag and providing set_boost callback(if HW
> > > support is needed). For software managed boost, special Kconfig
> > > flag - CONFIG_CPU_FREQ_BOOST_SW has been defined. It will be
> > > selected only when a target platform has thermal framework properly
> > > configured.
> > >
> > > - struct cpufreq_driver has been extended with boost related fields:
> > >         -- boost_supported - when driver supports boosting
> > >         -- boost_enabled - boost state
> > >         -- set_boost - callback to function, which is necessary to
> > >            enable/disable boost
> > >
> > > - Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost) is
> > > visible _only_ when cpufreq driver supports Boost.
> > >
> > > - No special spin_lock for Boost was created. The one from cpufreq
> > > core was reused.
> > >
> > > - The Boost code doesn't rely on any policy. When boost state is
> > > changed, then the policy list is iterated and proper adjustements
> > > are done.
> > >
> > > - To improve safety level, the thermal framework is also extended
> > > to disable software boosting, when thermal trip point is reached.
> > > Then it starts monitoring target temperature to evaluate if boost
> > > can be enabled again. This emulates behaviour similar to HW managed
> > > boost (like x86)
> > >
> > > Tested at HW:
> > >        Exynos 4412 3.11-rc4 Linux
> > >        Intel Core i7-3770 3.11-rc4 Linux
> > >
> > > Above patches were posted on top of linux_pm/linux-next with
> > > following patches applied:
> > >
> > > cpufreq: exynos5440: Fix to skip when new frequency same as current
> > > cpufreq: fix EXYNOS drivers selection
> > >
> > > Lukasz Majewski (7):
> > >   cpufreq: Add boost frequency support in core
> > >   cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with
> > > common boost solution
> > >   thermal:boost: Automatic enable/disable of BOOST feature
> > >   cpufreq:boost:Kconfig: Provide support for software managed BOOST
> > >   cpufreq:exynos:Extend Exynos cpufreq driver to support boost
> > >     framework
> > >   Documentation:cpufreq:boost: Update BOOST documentation
> > >   cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ
> > 
> > Hi Lukasz,
> > 
> 
> Hi Viresh,
> 
> > I haven't found time yet to go through this series.. 
> 
> I've just started wondering if I had send those patches correctly :-).
> 
> > I want to do a
> > deep/careful review this time as these are almost the final patches.
> 
> Ok.
> 
> > 
> > Will try to get over them by the end of this week..
> 
> Ok, I understand.

Do I assume correctly that this stuff has been tested on ACPI-compatible x86
with acpi-cpufreq and everything has worked correctly there?

Rafael


^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v7 0/7] cpufreq:boost: CPU Boost mode support
  2013-08-19 23:29       ` Rafael J. Wysocki
@ 2013-08-20  8:11         ` Lukasz Majewski
  2013-08-20 12:32           ` Rafael J. Wysocki
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-20  8:11 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Viresh Kumar, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, R, Durgadoss

On Tue, 20 Aug 2013 01:29:20 +0200 Rafael J. Wysocki rjw@sisk.pl wrote,
> On Monday, August 19, 2013 08:50:37 AM Lukasz Majewski wrote:
> > On Mon, 19 Aug 2013 12:08:26 +0530 Viresh Kumar
> > viresh.kumar@linaro.org wrote,
> > > On 13 August 2013 15:38, Lukasz Majewski <l.majewski@samsung.com>
> > > wrote:
> > > > This patch series introduces support for CPU overclocking
> > > > technique called Boost.
> > > >
> > > > It is a follow up of a LAB governor proposal. Boost is a LAB
> > > > component:
> > > > http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq
> > > >
> > > > Boost unifies hardware based solution (e.g. Intel Nehalem) with
> > > > software oriented one (like the one done at Exynos).
> > > > For this reason cpufreq/freq_table code has been reorganized to
> > > > include common code.
> > > >
> > > > Important design decisions:
> > > > - Boost related code is compiled-in unconditionally to cpufreq
> > > > core and disabled by default. The cpufreq_driver is
> > > > responsibile for setting boost_supported flag and providing
> > > > set_boost callback(if HW support is needed). For software
> > > > managed boost, special Kconfig flag - CONFIG_CPU_FREQ_BOOST_SW
> > > > has been defined. It will be selected only when a target
> > > > platform has thermal framework properly configured.
> > > >
> > > > - struct cpufreq_driver has been extended with boost related
> > > > fields: -- boost_supported - when driver supports boosting
> > > >         -- boost_enabled - boost state
> > > >         -- set_boost - callback to function, which is necessary
> > > > to enable/disable boost
> > > >
> > > > - Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost)
> > > > is visible _only_ when cpufreq driver supports Boost.
> > > >
> > > > - No special spin_lock for Boost was created. The one from
> > > > cpufreq core was reused.
> > > >
> > > > - The Boost code doesn't rely on any policy. When boost state is
> > > > changed, then the policy list is iterated and proper
> > > > adjustements are done.
> > > >
> > > > - To improve safety level, the thermal framework is also
> > > > extended to disable software boosting, when thermal trip point
> > > > is reached. Then it starts monitoring target temperature to
> > > > evaluate if boost can be enabled again. This emulates behaviour
> > > > similar to HW managed boost (like x86)
> > > >
> > > > Tested at HW:
> > > >        Exynos 4412 3.11-rc4 Linux
> > > >        Intel Core i7-3770 3.11-rc4 Linux
> > > >
> > > > Above patches were posted on top of linux_pm/linux-next with
> > > > following patches applied:
> > > >
> > > > cpufreq: exynos5440: Fix to skip when new frequency same as
> > > > current cpufreq: fix EXYNOS drivers selection
> > > >
> > > > Lukasz Majewski (7):
> > > >   cpufreq: Add boost frequency support in core
> > > >   cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with
> > > > common boost solution
> > > >   thermal:boost: Automatic enable/disable of BOOST feature
> > > >   cpufreq:boost:Kconfig: Provide support for software managed
> > > > BOOST cpufreq:exynos:Extend Exynos cpufreq driver to support
> > > > boost framework
> > > >   Documentation:cpufreq:boost: Update BOOST documentation
> > > >   cpufreq:exynos4x12: Change L0 driver data to
> > > > CPUFREQ_BOOST_FREQ
> > > 
> > > Hi Lukasz,
> > > 
> > 
> > Hi Viresh,
> > 
> > > I haven't found time yet to go through this series.. 
> > 
> > I've just started wondering if I had send those patches
> > correctly :-).
> > 
> > > I want to do a
> > > deep/careful review this time as these are almost the final
> > > patches.
> > 
> > Ok.
> > 
> > > 
> > > Will try to get over them by the end of this week..
> > 
> > Ok, I understand.
> 
> Do I assume correctly that this stuff has been tested on
> ACPI-compatible x86 with acpi-cpufreq and everything has worked
> correctly there?
> 
> Rafael
> 

Hi Rafael,

Following test configuration/test case (x86):

- DELL OptiPlex 9010 Intel Core i7-3770
- Linux repo: [kernel_pm_http/bleeding-edge] [kernel_pm_http/linux-next]
	SHA1: a238ea5e20be7bea2b1fc951a024ecce770306b5 
	with v7 applied on top

- Linux version: 3.11-rc4 (patches v7) and 3.11-rc1 (v6)

- Ubuntu 11.10 (make bzImage + make all when module was needed)
- config_ubuntu_3_11 (the default one for ubuntu)
- KConfig:
	1. Disabled intel_pstate driver
	2. Enabled ACPI-Prosessor P state driver
	3. Legacy cpb sysfs knob support for AMD CPUs ON/OFF (which is a
	part of acpi-cpufreq.c driver).
	
- acpi-cpufreq driver was build as a module or was embedded in kernel
  (tested with modprobe -i / -r => no dmesg error|warning output)

- I was able to read/write (echo 0/1
  > /sys/devices/system/cpu/cpufreq/boost) => no output at dmesg -
  system was working stable.

Toolchain: gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)

Since I'm mostly working with ARM (exynos4412) and major work was done
with cpufreq core (and x86 related work was to move common code to
cpufreq core) tests mostly have been performed on ARM.

Tests on ARM:
- Stress tests with up to 4 scripts running to enable/disable boost
  sysfs attribute with random time interval (gzip < /dev/urandom
  > /dev/null). 
- Test to overheat the ARM target and look if boost+thermal cools down
  the device and enables boost again.
- LAB governor (which was already posted to ML) to boost when power
  envelope allows it.


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v7 0/7] cpufreq:boost: CPU Boost mode support
  2013-08-20  8:11         ` Lukasz Majewski
@ 2013-08-20 12:32           ` Rafael J. Wysocki
  0 siblings, 0 replies; 329+ messages in thread
From: Rafael J. Wysocki @ 2013-08-20 12:32 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Viresh Kumar, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, R, Durgadoss

On Tuesday, August 20, 2013 10:11:47 AM Lukasz Majewski wrote:
> On Tue, 20 Aug 2013 01:29:20 +0200 Rafael J. Wysocki rjw@sisk.pl wrote,
> > On Monday, August 19, 2013 08:50:37 AM Lukasz Majewski wrote:
> > > On Mon, 19 Aug 2013 12:08:26 +0530 Viresh Kumar
> > > viresh.kumar@linaro.org wrote,
> > > > On 13 August 2013 15:38, Lukasz Majewski <l.majewski@samsung.com>
> > > > wrote:
> > > > > This patch series introduces support for CPU overclocking
> > > > > technique called Boost.
> > > > >
> > > > > It is a follow up of a LAB governor proposal. Boost is a LAB
> > > > > component:
> > > > > http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq
> > > > >
> > > > > Boost unifies hardware based solution (e.g. Intel Nehalem) with
> > > > > software oriented one (like the one done at Exynos).
> > > > > For this reason cpufreq/freq_table code has been reorganized to
> > > > > include common code.
> > > > >
> > > > > Important design decisions:
> > > > > - Boost related code is compiled-in unconditionally to cpufreq
> > > > > core and disabled by default. The cpufreq_driver is
> > > > > responsibile for setting boost_supported flag and providing
> > > > > set_boost callback(if HW support is needed). For software
> > > > > managed boost, special Kconfig flag - CONFIG_CPU_FREQ_BOOST_SW
> > > > > has been defined. It will be selected only when a target
> > > > > platform has thermal framework properly configured.
> > > > >
> > > > > - struct cpufreq_driver has been extended with boost related
> > > > > fields: -- boost_supported - when driver supports boosting
> > > > >         -- boost_enabled - boost state
> > > > >         -- set_boost - callback to function, which is necessary
> > > > > to enable/disable boost
> > > > >
> > > > > - Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost)
> > > > > is visible _only_ when cpufreq driver supports Boost.
> > > > >
> > > > > - No special spin_lock for Boost was created. The one from
> > > > > cpufreq core was reused.
> > > > >
> > > > > - The Boost code doesn't rely on any policy. When boost state is
> > > > > changed, then the policy list is iterated and proper
> > > > > adjustements are done.
> > > > >
> > > > > - To improve safety level, the thermal framework is also
> > > > > extended to disable software boosting, when thermal trip point
> > > > > is reached. Then it starts monitoring target temperature to
> > > > > evaluate if boost can be enabled again. This emulates behaviour
> > > > > similar to HW managed boost (like x86)
> > > > >
> > > > > Tested at HW:
> > > > >        Exynos 4412 3.11-rc4 Linux
> > > > >        Intel Core i7-3770 3.11-rc4 Linux
> > > > >
> > > > > Above patches were posted on top of linux_pm/linux-next with
> > > > > following patches applied:
> > > > >
> > > > > cpufreq: exynos5440: Fix to skip when new frequency same as
> > > > > current cpufreq: fix EXYNOS drivers selection
> > > > >
> > > > > Lukasz Majewski (7):
> > > > >   cpufreq: Add boost frequency support in core
> > > > >   cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with
> > > > > common boost solution
> > > > >   thermal:boost: Automatic enable/disable of BOOST feature
> > > > >   cpufreq:boost:Kconfig: Provide support for software managed
> > > > > BOOST cpufreq:exynos:Extend Exynos cpufreq driver to support
> > > > > boost framework
> > > > >   Documentation:cpufreq:boost: Update BOOST documentation
> > > > >   cpufreq:exynos4x12: Change L0 driver data to
> > > > > CPUFREQ_BOOST_FREQ
> > > > 
> > > > Hi Lukasz,
> > > > 
> > > 
> > > Hi Viresh,
> > > 
> > > > I haven't found time yet to go through this series.. 
> > > 
> > > I've just started wondering if I had send those patches
> > > correctly :-).
> > > 
> > > > I want to do a
> > > > deep/careful review this time as these are almost the final
> > > > patches.
> > > 
> > > Ok.
> > > 
> > > > 
> > > > Will try to get over them by the end of this week..
> > > 
> > > Ok, I understand.
> > 
> > Do I assume correctly that this stuff has been tested on
> > ACPI-compatible x86 with acpi-cpufreq and everything has worked
> > correctly there?
> > 
> > Rafael
> > 
> 
> Hi Rafael,
> 
> Following test configuration/test case (x86):
> 
> - DELL OptiPlex 9010 Intel Core i7-3770
> - Linux repo: [kernel_pm_http/bleeding-edge] [kernel_pm_http/linux-next]
> 	SHA1: a238ea5e20be7bea2b1fc951a024ecce770306b5 
> 	with v7 applied on top
> 
> - Linux version: 3.11-rc4 (patches v7) and 3.11-rc1 (v6)
> 
> - Ubuntu 11.10 (make bzImage + make all when module was needed)
> - config_ubuntu_3_11 (the default one for ubuntu)
> - KConfig:
> 	1. Disabled intel_pstate driver
> 	2. Enabled ACPI-Prosessor P state driver
> 	3. Legacy cpb sysfs knob support for AMD CPUs ON/OFF (which is a
> 	part of acpi-cpufreq.c driver).
> 	
> - acpi-cpufreq driver was build as a module or was embedded in kernel
>   (tested with modprobe -i / -r => no dmesg error|warning output)
> 
> - I was able to read/write (echo 0/1
>   > /sys/devices/system/cpu/cpufreq/boost) => no output at dmesg -
>   system was working stable.
> 
> Toolchain: gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)
> 
> Since I'm mostly working with ARM (exynos4412) and major work was done
> with cpufreq core (and x86 related work was to move common code to
> cpufreq core) tests mostly have been performed on ARM.
> 
> Tests on ARM:
> - Stress tests with up to 4 scripts running to enable/disable boost
>   sysfs attribute with random time interval (gzip < /dev/urandom
>   > /dev/null). 
> - Test to overheat the ARM target and look if boost+thermal cools down
>   the device and enables boost again.
> - LAB governor (which was already posted to ML) to boost when power
>   envelope allows it.

Great, thanks a lot for the info!

Rafael


^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v7 1/7] cpufreq: Add boost frequency support in core
  2013-08-13 10:08   ` [PATCH v7 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
@ 2013-08-26  5:28     ` Viresh Kumar
  2013-08-26  7:02       ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-08-26  5:28 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, R, Durgadoss

Some minor nitpicking, nothing much :)

On 13 August 2013 15:38, Lukasz Majewski <l.majewski@samsung.com> wrote:
> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> +static int cpufreq_boost_set_sw(int state)
> +{
> +       struct cpufreq_frequency_table *freq_table;
> +       struct cpufreq_policy *policy;
> +       int ret = -EINVAL;
> +
> +       list_for_each_entry(policy, &cpufreq_policy_list, policy_list) {
> +               freq_table = cpufreq_frequency_get_table(policy->cpu);
> +               if (freq_table) {
> +                       ret = cpufreq_frequency_table_cpuinfo(policy,
> +                                                       freq_table);
> +                       if (!ret) {
> +                               policy->user_policy.max = policy->max;
> +                               __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
> +                       }

In case ret wasn't 0 (i.e. we failed), we should print an error
message and break
our loop ?

> +               }
> +       }
> +
> +       return ret;
> +}
> +
> +int cpufreq_boost_trigger_state(int state)
> +{
> +       unsigned long flags;
> +       int ret = 0;
> +
> +       if (cpufreq_driver->boost_enabled == state)
> +               return 0;
> +
> +       write_lock_irqsave(&cpufreq_driver_lock, flags);
> +       cpufreq_driver->boost_enabled = state;
> +       write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> +
> +       ret = cpufreq_driver->set_boost(state);
> +       if (ret) {
> +               write_lock_irqsave(&cpufreq_driver_lock, flags);
> +               cpufreq_driver->boost_enabled = !state;
> +               write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> +
> +               pr_err("%s: Cannot %s BOOST\n", __func__,
> +                      state ? "enabled" : "disabled");

s/enabled/enable and s/disabled/disable

> +       }
> +
> +       return ret;
> +}
> +

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v7 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution
  2013-08-13 10:08   ` [PATCH v7 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
@ 2013-08-26  5:32     ` Viresh Kumar
  0 siblings, 0 replies; 329+ messages in thread
From: Viresh Kumar @ 2013-08-26  5:32 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, R, Durgadoss

On 13 August 2013 15:38, Lukasz Majewski <l.majewski@samsung.com> wrote:
> The Intel's hardware based boost solution driver has been changed to cooperate with
> common cpufreq boost framework.
>
> The global sysfs boost attribute entry code (/sys/devices/system/cpu/cpufreq/boost)
> has been moved to a core cpufreq code. This attribute is now only visible,
> when cpufreq driver supports it.
>
> The _store_boost() function has been redesigned to be used as set_boost
> callback.
>
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
>
> ---
> Changes for v7:
> - Remove superfluous acpi_cpufreq_driver.boost_supported = false at
>   acpi_cpufreq_boost_init()

Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v7 3/7] thermal:boost: Automatic enable/disable of BOOST feature
  2013-08-13 10:08   ` [PATCH v7 3/7] thermal:boost: Automatic enable/disable of BOOST feature Lukasz Majewski
@ 2013-08-26  5:33     ` Viresh Kumar
  2013-08-26  6:50       ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-08-26  5:33 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, R, Durgadoss

On 13 August 2013 15:38, Lukasz Majewski <l.majewski@samsung.com> wrote:
> diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
> index b5defd4..ec19da9 100644
> --- a/include/linux/cpufreq.h
> +++ b/include/linux/cpufreq.h
> @@ -408,10 +408,24 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
>
>  void cpufreq_frequency_table_update_policy_cpu(struct cpufreq_policy *policy);
>  ssize_t cpufreq_show_cpus(const struct cpumask *mask, char *buf);
> +#ifdef CONFIG_CPU_FREQ
>  int cpufreq_boost_trigger_state(int state);
>  int cpufreq_boost_supported(void);
>  int cpufreq_boost_enabled(void);
> -
> +#else
> +static inline int cpufreq_boost_trigger_state(int state)
> +{
> +       return 0;
> +}
> +static inline int cpufreq_boost_supported(void)
> +{
> +       return 0;
> +}
> +static inline int cpufreq_boost_enabled(void)
> +{
> +       return 0;
> +}
> +#endif

I almost gave an Ack before I saw this :)
This should be moved to the first patch I believe..

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v7 4/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST
  2013-08-13 10:08   ` [PATCH v7 4/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
@ 2013-08-26  5:35     ` Viresh Kumar
  0 siblings, 0 replies; 329+ messages in thread
From: Viresh Kumar @ 2013-08-26  5:35 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, R, Durgadoss

On 13 August 2013 15:38, Lukasz Majewski <l.majewski@samsung.com> wrote:
> For safety reasons new flag - CONFIG_CPU_FREQ_BOOST_SW has been added.
> Only after selecting "EXYNOS Frequency Overclocking - Software" Kconfig
> option the software managed boost is enabled. It also selects thermal
> subsystem to be compiled in. Thermal is necessary for disabling boost
> and cooling down the device when overheating detected.
>
> Boost _MUST_NOT_ work without thermal subsystem with properly defined
> overheating temperatures.
>
> This option doesn't affect x86's ACPI hardware managed boost support
> (i.e. Intel, AMD). In this situation boost management is embedded at
> hardware.
>
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
>
> ---
> Changes for v7:
> - Remove superfluous "default n" definition
> - Generic CPU_FREQ_BOOST_SW depends on THERMAL

Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v7 5/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework
  2013-08-13 10:08   ` [PATCH v7 5/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
@ 2013-08-26  5:36     ` Viresh Kumar
  0 siblings, 0 replies; 329+ messages in thread
From: Viresh Kumar @ 2013-08-26  5:36 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, R, Durgadoss

On 13 August 2013 15:38, Lukasz Majewski <l.majewski@samsung.com> wrote:
> The cpufreq_driver's boost_supported flag is true only when boost
> support is explicitly enabled. Boost related attributes are exported only
> under the same condition.
>
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
>
> ---
> Changes for v7:
> - Replace CONFIG_CPU_FREQ_BOOST_SW with CONFIG_ARM_EXYNOS_CPU_FREQ_BOOST_SW
> - Move boost_supported initialization to struct cpufreq_driver exynos_driver

Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v7 6/7] Documentation:cpufreq:boost: Update BOOST documentation
  2013-08-13 10:08   ` [PATCH v7 6/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
@ 2013-08-26  5:36     ` Viresh Kumar
  0 siblings, 0 replies; 329+ messages in thread
From: Viresh Kumar @ 2013-08-26  5:36 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, R, Durgadoss

On 13 August 2013 15:38, Lukasz Majewski <l.majewski@samsung.com> wrote:
> Since the support for software and hardware controlled boosting has been
> added, the corresponding Documentation entry had been updated.
>
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
>
> ---
> Changes for v7:
> - None

Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v7 7/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ
  2013-08-13 10:08   ` [PATCH v7 7/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
@ 2013-08-26  5:37     ` Viresh Kumar
  0 siblings, 0 replies; 329+ messages in thread
From: Viresh Kumar @ 2013-08-26  5:37 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, R, Durgadoss

On 13 August 2013 15:38, Lukasz Majewski <l.majewski@samsung.com> wrote:
> Special driver data flag (CPUFREQ_BOOST_FREQ) has been added to indicate
> frequency, which can be only enabled for BOOST mode.
> This frequency shall be used only for limited time, since it might cause
> target device to overheat.
>
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
>
> ---
> Changes for v7:
> - None

Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v7 3/7] thermal:boost: Automatic enable/disable of BOOST feature
  2013-08-26  5:33     ` Viresh Kumar
@ 2013-08-26  6:50       ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-26  6:50 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, R, Durgadoss

On Mon, 26 Aug 2013 11:03:51 +0530 Viresh Kumar viresh.kumar@linaro.org
wrote,
> On 13 August 2013 15:38, Lukasz Majewski <l.majewski@samsung.com>
> wrote:
> > diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
> > index b5defd4..ec19da9 100644
> > --- a/include/linux/cpufreq.h
> > +++ b/include/linux/cpufreq.h
> > @@ -408,10 +408,24 @@ int cpufreq_frequency_table_target(struct
> > cpufreq_policy *policy,
> >
> >  void cpufreq_frequency_table_update_policy_cpu(struct
> > cpufreq_policy *policy); ssize_t cpufreq_show_cpus(const struct
> > cpumask *mask, char *buf); +#ifdef CONFIG_CPU_FREQ
> >  int cpufreq_boost_trigger_state(int state);
> >  int cpufreq_boost_supported(void);
> >  int cpufreq_boost_enabled(void);
> > -
> > +#else
> > +static inline int cpufreq_boost_trigger_state(int state)
> > +{
> > +       return 0;
> > +}
> > +static inline int cpufreq_boost_supported(void)
> > +{
> > +       return 0;
> > +}
> > +static inline int cpufreq_boost_enabled(void)
> > +{
> > +       return 0;
> > +}
> > +#endif
> 
> I almost gave an Ack before I saw this :)
> This should be moved to the first patch I believe..

Ok, I will move it there.

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v7 1/7] cpufreq: Add boost frequency support in core
  2013-08-26  5:28     ` Viresh Kumar
@ 2013-08-26  7:02       ` Lukasz Majewski
  2013-08-26  7:06         ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-26  7:02 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, R, Durgadoss

On Mon, 26 Aug 2013 10:58:53 +0530 Viresh Kumar viresh.kumar@linaro.org
wrote,
> Some minor nitpicking, nothing much :)

Is there any chance to pull those corrected patches to v3.12?

> 
> On 13 August 2013 15:38, Lukasz Majewski <l.majewski@samsung.com>
> wrote:
> > diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> > +static int cpufreq_boost_set_sw(int state)
> > +{
> > +       struct cpufreq_frequency_table *freq_table;
> > +       struct cpufreq_policy *policy;
> > +       int ret = -EINVAL;
> > +
> > +       list_for_each_entry(policy, &cpufreq_policy_list,
> > policy_list) {
> > +               freq_table =
> > cpufreq_frequency_get_table(policy->cpu);
> > +               if (freq_table) {
> > +                       ret =
> > cpufreq_frequency_table_cpuinfo(policy,
> > +                                                       freq_table);
> > +                       if (!ret) {
> > +                               policy->user_policy.max =
> > policy->max;
> > +                               __cpufreq_governor(policy,
> > CPUFREQ_GOV_LIMITS);
> > +                       }
> 
> In case ret wasn't 0 (i.e. we failed), we should print an error
> message and break
> our loop ?

After your comments I think, that this code could be rewritten:


	list_for_each_entry(policy, &cpufreq_policy_list, policy_list) {
		freq_table = cpufreq_frequency_get_table(policy->cpu);
		if (freq_table) {
			ret = cpufreq_frequency_table_cpuinfo(policy,
							freq_table);
			if (ret) {
				pr_err("%s: Policy frequency update
				failed\n")
				break;
			}
			
			policy->user_policy.max = policy->max;
			__cpufreq_governor(policy,CPUFREQ_GOV_LIMITS);	
		}
	}

	return ret;
}


> 
> > +               }
> > +       }
> > +
> > +       return ret;
> > +}
> > +
> > +int cpufreq_boost_trigger_state(int state)
> > +{
> > +       unsigned long flags;
> > +       int ret = 0;
> > +
> > +       if (cpufreq_driver->boost_enabled == state)
> > +               return 0;
> > +
> > +       write_lock_irqsave(&cpufreq_driver_lock, flags);
> > +       cpufreq_driver->boost_enabled = state;
> > +       write_unlock_irqrestore(&cpufreq_driver_lock, flags);
> > +
> > +       ret = cpufreq_driver->set_boost(state);
> > +       if (ret) {
> > +               write_lock_irqsave(&cpufreq_driver_lock, flags);
> > +               cpufreq_driver->boost_enabled = !state;
> > +               write_unlock_irqrestore(&cpufreq_driver_lock,
> > flags); +
> > +               pr_err("%s: Cannot %s BOOST\n", __func__,
> > +                      state ? "enabled" : "disabled");
> 
> s/enabled/enable and s/disabled/disable

Ok.

> 
> > +       }
> > +
> > +       return ret;
> > +}
> > +



-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v7 1/7] cpufreq: Add boost frequency support in core
  2013-08-26  7:02       ` Lukasz Majewski
@ 2013-08-26  7:06         ` Viresh Kumar
  2013-08-26  7:11           ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-08-26  7:06 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, R, Durgadoss

On 26 August 2013 12:32, Lukasz Majewski <l.majewski@samsung.com> wrote:
> On Mon, 26 Aug 2013 10:58:53 +0530 Viresh Kumar viresh.kumar@linaro.org
> wrote,
>> Some minor nitpicking, nothing much :)
>
> Is there any chance to pull those corrected patches to v3.12?

Only Rafael can decide :)

> After your comments I think, that this code could be rewritten:
>
>
>         list_for_each_entry(policy, &cpufreq_policy_list, policy_list) {
>                 freq_table = cpufreq_frequency_get_table(policy->cpu);
>                 if (freq_table) {
>                         ret = cpufreq_frequency_table_cpuinfo(policy,
>                                                         freq_table);
>                         if (ret) {
>                                 pr_err("%s: Policy frequency update
>                                 failed\n")

Don't break strings into multiple lines even if they cross 80 columns..
And you missed __func__ :)

>                                 break;
>                         }
>
>                         policy->user_policy.max = policy->max;
>                         __cpufreq_governor(policy,CPUFREQ_GOV_LIMITS);
>                 }
>         }
>
>         return ret;
> }

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v7 1/7] cpufreq: Add boost frequency support in core
  2013-08-26  7:06         ` Viresh Kumar
@ 2013-08-26  7:11           ` Lukasz Majewski
  2013-08-26 13:12             ` Rafael J. Wysocki
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-26  7:11 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, R, Durgadoss

On Mon, 26 Aug 2013 12:36:47 +0530 Viresh Kumar viresh.kumar@linaro.org
wrote,
> On 26 August 2013 12:32, Lukasz Majewski <l.majewski@samsung.com>
> wrote:
> > On Mon, 26 Aug 2013 10:58:53 +0530 Viresh Kumar
> > viresh.kumar@linaro.org wrote,
> >> Some minor nitpicking, nothing much :)
> >
> > Is there any chance to pull those corrected patches to v3.12?
> 
> Only Rafael can decide :)

:-)

> 
> > After your comments I think, that this code could be rewritten:
> >
> >
> >         list_for_each_entry(policy, &cpufreq_policy_list,
> > policy_list) { freq_table =
> > cpufreq_frequency_get_table(policy->cpu); if (freq_table) {
> >                         ret =
> > cpufreq_frequency_table_cpuinfo(policy, freq_table);
> >                         if (ret) {
> >                                 pr_err("%s: Policy frequency update
> >                                 failed\n")
> 
> Don't break strings into multiple lines even if they cross 80
> columns.. And you missed __func__ :)

C code which turned into the pseudo code :-).

> 
> >                                 break;
> >                         }
> >
> >                         policy->user_policy.max = policy->max;
> >                         __cpufreq_governor(policy,CPUFREQ_GOV_LIMITS);
> >                 }
> >         }
> >
> >         return ret;
> > }
> --
> To unsubscribe from this list: send the line "unsubscribe linux-pm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 



-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v7 1/7] cpufreq: Add boost frequency support in core
  2013-08-26  7:11           ` Lukasz Majewski
@ 2013-08-26 13:12             ` Rafael J. Wysocki
  2013-08-26 14:00               ` Viresh Kumar
  0 siblings, 1 reply; 329+ messages in thread
From: Rafael J. Wysocki @ 2013-08-26 13:12 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Viresh Kumar, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, R, Durgadoss

On Monday, August 26, 2013 09:11:14 AM Lukasz Majewski wrote:
> On Mon, 26 Aug 2013 12:36:47 +0530 Viresh Kumar viresh.kumar@linaro.org
> wrote,
> > On 26 August 2013 12:32, Lukasz Majewski <l.majewski@samsung.com>
> > wrote:
> > > On Mon, 26 Aug 2013 10:58:53 +0530 Viresh Kumar
> > > viresh.kumar@linaro.org wrote,
> > >> Some minor nitpicking, nothing much :)
> > >
> > > Is there any chance to pull those corrected patches to v3.12?
> > 
> > Only Rafael can decide :)
> 
> :-)

Well, 3.11 is a week away and the 3.12 merge window will open then.

Honestly, I'd prefer this stuff to spend a couple of weeks in linux-next
before pushing it to Linus, so this means 3.13 I'm afraid.

Thanks,
Rafael


^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v7 1/7] cpufreq: Add boost frequency support in core
  2013-08-26 13:12             ` Rafael J. Wysocki
@ 2013-08-26 14:00               ` Viresh Kumar
  2013-08-26 14:46                 ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Viresh Kumar @ 2013-08-26 14:00 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Lukasz Majewski, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, R, Durgadoss

On 26 August 2013 18:42, Rafael J. Wysocki <rjw@sisk.pl> wrote:
> On Monday, August 26, 2013 09:11:14 AM Lukasz Majewski wrote:
>> On Mon, 26 Aug 2013 12:36:47 +0530 Viresh Kumar viresh.kumar@linaro.org
>> wrote,
>> > On 26 August 2013 12:32, Lukasz Majewski <l.majewski@samsung.com>
>> > wrote:
>> > > On Mon, 26 Aug 2013 10:58:53 +0530 Viresh Kumar
>> > > viresh.kumar@linaro.org wrote,
>> > >> Some minor nitpicking, nothing much :)
>> > >
>> > > Is there any chance to pull those corrected patches to v3.12?
>> >
>> > Only Rafael can decide :)
>>
>> :-)
>
> Well, 3.11 is a week away and the 3.12 merge window will open then.
>
> Honestly, I'd prefer this stuff to spend a couple of weeks in linux-next
> before pushing it to Linus, so this means 3.13 I'm afraid.

+1

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v7 1/7] cpufreq: Add boost frequency support in core
  2013-08-26 14:00               ` Viresh Kumar
@ 2013-08-26 14:46                 ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-26 14:46 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Daniel Lezcano, Kukjin Kim,
	Myungjoo Ham, R, Durgadoss

On Mon, 26 Aug 2013 19:30:07 +0530 Viresh Kumar viresh.kumar@linaro.org
wrote,
> On 26 August 2013 18:42, Rafael J. Wysocki <rjw@sisk.pl> wrote:
> > On Monday, August 26, 2013 09:11:14 AM Lukasz Majewski wrote:
> >> On Mon, 26 Aug 2013 12:36:47 +0530 Viresh Kumar
> >> viresh.kumar@linaro.org wrote,
> >> > On 26 August 2013 12:32, Lukasz Majewski <l.majewski@samsung.com>
> >> > wrote:
> >> > > On Mon, 26 Aug 2013 10:58:53 +0530 Viresh Kumar
> >> > > viresh.kumar@linaro.org wrote,
> >> > >> Some minor nitpicking, nothing much :)
> >> > >
> >> > > Is there any chance to pull those corrected patches to v3.12?
> >> >
> >> > Only Rafael can decide :)
> >>
> >> :-)
> >
> > Well, 3.11 is a week away and the 3.12 merge window will open then.
> >
> > Honestly, I'd prefer this stuff to spend a couple of weeks in
> > linux-next before pushing it to Linus, so this means 3.13 I'm
> > afraid.
> 
> +1

Ok. I understand. 

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* [PATCH v8 0/7] cpufreq:boost: CPU Boost mode support
  2013-06-06  7:07 [PATCH 0/5] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                   ` (10 preceding siblings ...)
  2013-08-13 10:08 ` [PATCH v7 0/7] " Lukasz Majewski
@ 2013-08-26 15:50 ` Lukasz Majewski
  2013-08-26 15:50   ` [PATCH v8 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
                     ` (6 more replies)
  2013-09-20 16:00 ` [PATCH RESEND v8 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                   ` (5 subsequent siblings)
  17 siblings, 7 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-26 15:50 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Kukjin Kim, Myungjoo Ham, durgadoss.r

This patch series introduces support for CPU overclocking technique
called Boost.

It is a follow up of a LAB governor proposal. Boost is a LAB component:
http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq

Boost unifies hardware based solution (e.g. Intel Nehalem) with
software oriented one (like the one done at Exynos).
For this reason cpufreq/freq_table code has been reorganized to include
common code.

Important design decisions:
- Boost related code is compiled-in unconditionally to cpufreq core and
  disabled by default. The cpufreq_driver is responsibile for setting
  boost_supported flag and providing set_boost callback(if HW support
  is needed). For software managed boost, special Kconfig flag -
  CONFIG_CPU_FREQ_BOOST_SW has been defined. It will be selected only
  when a target platform has thermal framework properly configured.

- struct cpufreq_driver has been extended with boost related fields:
        -- boost_supported - when driver supports boosting
        -- boost_enabled - boost state
        -- set_boost - callback to function, which is necessary to
           enable/disable boost

- Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost) is visible
  _only_ when cpufreq driver supports Boost.

- No special spin_lock for Boost was created. The one from cpufreq core
  was reused.

- The Boost code doesn't rely on any policy. When boost state is changed,
  then the policy list is iterated and proper adjustements are done.

- To improve safety level, the thermal framework is also extended to disable
  software boosting, when thermal trip point is reached. Then it starts
  monitoring target temperature to evaluate if boost can be enabled
  again. This emulates behaviour similar to HW managed boost (like x86)

Tested at HW:
       Exynos 4412 3.11-rc6 Linux
       Intel Core i7-3770 3.11-rc6 Linux

Above patches were posted on top of linux_pm/linux-next 
(SHA1: 68327ee544d74f20bb6179637971912e5e78811c)

Lukasz Majewski (7):
  cpufreq: Add boost frequency support in core
  cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common
    boost solution
  thermal:boost: Automatic enable/disable of BOOST feature
  cpufreq:boost:Kconfig: Provide support for software managed BOOST
  cpufreq:exynos:Extend Exynos cpufreq driver to support boost
    framework
  Documentation:cpufreq:boost: Update BOOST documentation
  cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ

 Documentation/cpu-freq/boost.txt     |   26 ++++----
 drivers/cpufreq/Kconfig              |    4 ++
 drivers/cpufreq/Kconfig.arm          |   15 +++++
 drivers/cpufreq/acpi-cpufreq.c       |   86 +++++++++----------------
 drivers/cpufreq/cpufreq.c            |  118 +++++++++++++++++++++++++++++++++-
 drivers/cpufreq/exynos-cpufreq.c     |    6 ++
 drivers/cpufreq/exynos4x12-cpufreq.c |    2 +-
 drivers/cpufreq/freq_table.c         |   53 +++++++++++++--
 drivers/thermal/thermal_core.c       |   55 ++++++++++++++++
 include/linux/cpufreq.h              |   25 +++++++
 include/linux/thermal.h              |    2 +
 11 files changed, 313 insertions(+), 79 deletions(-)

-- 
1.7.10.4


^ permalink raw reply	[flat|nested] 329+ messages in thread

* [PATCH v8 1/7] cpufreq: Add boost frequency support in core
  2013-08-26 15:50 ` [PATCH v8 " Lukasz Majewski
@ 2013-08-26 15:50   ` Lukasz Majewski
  2013-08-26 15:50   ` [PATCH v8 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
                     ` (5 subsequent siblings)
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-26 15:50 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Kukjin Kim, Myungjoo Ham, durgadoss.r

This commit adds boost frequency support in cpufreq core (Hardware &
Software). Some SoCs (like Exynos4 - e.g. 4x12) allow setting frequency
above its normal operation limits. Such mode shall be only used for a
short time.

Overclocking (boost) support is essentially provided by platform
dependent cpufreq driver.

This commit unifies support for SW and HW (Intel) overclocking solutions
in the core cpufreq driver. Previously the "boost" sysfs attribute was
defined at acpi driver code. By default boost is disabled. One global
attribute is available at: /sys/devices/system/cpu/cpufreq/boost.

It only shows up when cpufreq driver supports overclocking.
Under the hood frequencies dedicated for boosting are marked with a
special flag (CPUFREQ_BOOST_FREQ) at driver's frequency table.
It is the user's concern to enable/disable overclocking with a proper call
to sysfs.

The cpufreq_boost_trigger_state() function is defined non static on purpose.
It is used later with thermal subsystem to provide automatic enable/disable
of the BOOST feature.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v8:
- Correction of error message at cpufreq_boost_trigger_state() function
- Rewrite the cpufreq_boost_set_sw() function to print error message and
  break the loop when policy adjustment fails

Changes for v7:
- Properly change cpufreq_driver->boost_enabled when set_boost() fails
  (=0 to =!state)
- Add likely() around cpufreq_driver
- Remove parenthesis around boost.attr

Changes for v6:
- Remove sysfs boost attribute when subsys_iterface_unregister() fails
- Move global boost_enabled variable from cpufreq.c to platform dependent
  struct cpufreq_driver
- pr_err() message is also printed when boost disable fails
- Call __cpufreq_governor() to force recalculation of next frequency when
  boost is triggered. It is needed with i.e. performance class of governors
- Change cpufreq_boost_enable_sw() -> cpufreq_boost_set_sw()
- Rename .enable_boost function pointer to .set_boost

Changes for v5:
- Rename cpufreq_boost_trigger_state_sw() to cpufreq_boost_enable_sw()
- Extent cpufreq_register_driver() to check if cpufreq driver provided
  boost_enable callback. If not provided, then use cpufreq_boost_enable_sw()
- Use single call to cpufreq_driver->enable_boost() with cpufreq driver
  provided callback or default SW boost enable routine
- Move pr_debug call to store_boost() from cpufreq_boost_trigger_state()
- Change the user_policy.max value when SW boost is toggled. It is necessary
  for proper operation of e.g. thermal subsystem.
- Add check if cpufreq_driver pointer is not NULL at
  cpufreq_boost_supported() routine
- Add EXPORT_SYMBOL_GPL for cpufreq_boost_supported() and
  cpufreq_boost_enabled()
- Remove extra check for cpufreq_boost_supported() at
  cpufreq_freq_table_cpuinfo()
- Explanation of show boost logic at show_available_freqs()
- Add cpufreq_set_boost_enabled() method to set initial value of boost_enabled
  global flag

Changes for v4:
- Remove boost parameter from cpufreq_frequency_table_cpuinfo() function
- Introduce cpufreq_boost_supported() method
- Use of cpufreq_boost_supported() and cpufreq_boost_enabled() to decide
  if frequency shall be skipped
- Rename set_boost_freq() to enable_boost()
- cpufreq_attr_available_freq() moved to freq_table.c
- Use policy list to get access to cpufreq policies
- Rename global boost flag (cpufreq_boost_enabled -> boost_enabled)
- pr_err corrected ( %sable)
- Remove sanity check at cpufreq_boost_trigger_state() entrance [to test if
  boost is supported]
- Use either HW (boost_enable) callback or SW managed boost
- Introduce new cpufreq_boost_trigger_state_sw() method to handle boost
  at SW.
- Protect boost_enabled manipulation with lock.

Changes for v3:
- Method for reading boost status
- Removal of cpufreq_frequency_table_max()
- Extent cpufreq_frequency_table_cpuinfo() to support boost parameter
- boost_supported flag added to cpufreq_driver struct
- "boost" sysfs attribute control flag removed
- One global flag describing state of the boost defined at cpufreq core
- Rename cpufreq_driver's low_level_boost field to set_boost_freq()
- Usage of cpufreq_sysfs_{remove|add}_file() routines

Changes for v2:
- Removal of cpufreq_boost structure and move its fields to cpufreq_driver
  structure
- Flag to indicate if global boost attribute is already defined
- Extent the pr_{err|debbug} functions to show current function names

 drivers/cpufreq/cpufreq.c    |  118 +++++++++++++++++++++++++++++++++++++++++-
 drivers/cpufreq/freq_table.c |   53 ++++++++++++++++---
 include/linux/cpufreq.h      |   25 +++++++++
 3 files changed, 188 insertions(+), 8 deletions(-)

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 5c75e31..b8b70a1 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -344,6 +344,33 @@ EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
 /*********************************************************************
  *                          SYSFS INTERFACE                          *
  *********************************************************************/
+ssize_t show_boost(struct kobject *kobj,
+				 struct attribute *attr, char *buf)
+{
+	return sprintf(buf, "%d\n", cpufreq_driver->boost_enabled);
+}
+
+static ssize_t store_boost(struct kobject *kobj, struct attribute *attr,
+				  const char *buf, size_t count)
+{
+	int ret, enable;
+
+	ret = sscanf(buf, "%d", &enable);
+	if (ret != 1 || enable < 0 || enable > 1)
+		return -EINVAL;
+
+	if (cpufreq_boost_trigger_state(enable)) {
+		pr_err("%s: Cannot %s BOOST!\n", __func__,
+		       enable ? "enable" : "disable");
+		return -EINVAL;
+	}
+
+	pr_debug("%s: cpufreq BOOST %s\n", __func__,
+		 enable ? "enabled" : "disabled");
+
+	return count;
+}
+define_one_global_rw(boost);
 
 static struct cpufreq_governor *__find_governor(const char *str_governor)
 {
@@ -2010,6 +2037,73 @@ static struct notifier_block __refdata cpufreq_cpu_notifier = {
 };
 
 /*********************************************************************
+ *               BOOST						     *
+ *********************************************************************/
+static int cpufreq_boost_set_sw(int state)
+{
+	struct cpufreq_frequency_table *freq_table;
+	struct cpufreq_policy *policy;
+	int ret = -EINVAL;
+
+	list_for_each_entry(policy, &cpufreq_policy_list, policy_list) {
+		freq_table = cpufreq_frequency_get_table(policy->cpu);
+		if (freq_table) {
+			ret = cpufreq_frequency_table_cpuinfo(policy,
+							freq_table);
+			if (ret) {
+				pr_err("%s: Policy frequency update failed\n",
+				       __func__);
+				break;
+			}
+			policy->user_policy.max = policy->max;
+			__cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
+		}
+	}
+
+	return ret;
+}
+
+int cpufreq_boost_trigger_state(int state)
+{
+	unsigned long flags;
+	int ret = 0;
+
+	if (cpufreq_driver->boost_enabled == state)
+		return 0;
+
+	write_lock_irqsave(&cpufreq_driver_lock, flags);
+	cpufreq_driver->boost_enabled = state;
+	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
+
+	ret = cpufreq_driver->set_boost(state);
+	if (ret) {
+		write_lock_irqsave(&cpufreq_driver_lock, flags);
+		cpufreq_driver->boost_enabled = !state;
+		write_unlock_irqrestore(&cpufreq_driver_lock, flags);
+
+		pr_err("%s: Cannot %s BOOST\n", __func__,
+		       state ? "enable" : "disable");
+	}
+
+	return ret;
+}
+
+int cpufreq_boost_supported(void)
+{
+	if (likely(cpufreq_driver))
+		return cpufreq_driver->boost_supported;
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(cpufreq_boost_supported);
+
+int cpufreq_boost_enabled(void)
+{
+	return cpufreq_driver->boost_enabled;
+}
+EXPORT_SYMBOL_GPL(cpufreq_boost_enabled);
+
+/*********************************************************************
  *               REGISTER / UNREGISTER CPUFREQ DRIVER                *
  *********************************************************************/
 
@@ -2048,9 +2142,25 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 	cpufreq_driver = driver_data;
 	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
 
+	if (cpufreq_boost_supported()) {
+		/*
+		 * Check if driver provides function to enable boost -
+		 * if not, use cpufreq_boost_set_sw as default
+		 */
+		if (!cpufreq_driver->set_boost)
+			cpufreq_driver->set_boost = cpufreq_boost_set_sw;
+
+		ret = cpufreq_sysfs_create_file(&boost.attr);
+		if (ret) {
+			pr_err("%s: cannot register global BOOST sysfs file\n",
+				__func__);
+			goto err_null_driver;
+		}
+	}
+
 	ret = subsys_interface_register(&cpufreq_interface);
 	if (ret)
-		goto err_null_driver;
+		goto err_boost_unreg;
 
 	if (!(cpufreq_driver->flags & CPUFREQ_STICKY)) {
 		int i;
@@ -2077,6 +2187,9 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 	return 0;
 err_if_unreg:
 	subsys_interface_unregister(&cpufreq_interface);
+err_boost_unreg:
+	if (cpufreq_boost_supported())
+		cpufreq_sysfs_remove_file(&boost.attr);
 err_null_driver:
 	write_lock_irqsave(&cpufreq_driver_lock, flags);
 	cpufreq_driver = NULL;
@@ -2103,6 +2216,9 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
 	pr_debug("unregistering driver %s\n", driver->name);
 
 	subsys_interface_unregister(&cpufreq_interface);
+	if (cpufreq_boost_supported())
+		cpufreq_sysfs_remove_file(&boost.attr);
+
 	unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
 
 	down_write(&cpufreq_rwsem);
diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c
index f111454a..d7eed63 100644
--- a/drivers/cpufreq/freq_table.c
+++ b/drivers/cpufreq/freq_table.c
@@ -32,6 +32,10 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
 
 			continue;
 		}
+		if (!cpufreq_boost_enabled()
+		    && table[i].driver_data == CPUFREQ_BOOST_FREQ)
+			continue;
+
 		pr_debug("table entry %u: %u kHz, %u driver_data\n",
 					i, freq, table[i].driver_data);
 		if (freq < min_freq)
@@ -169,7 +173,8 @@ static DEFINE_PER_CPU(struct cpufreq_frequency_table *, cpufreq_show_table);
 /**
  * show_available_freqs - show available frequencies for the specified CPU
  */
-static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
+static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf,
+				    bool show_boost)
 {
 	unsigned int i = 0;
 	unsigned int cpu = policy->cpu;
@@ -184,6 +189,20 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
 	for (i = 0; (table[i].frequency != CPUFREQ_TABLE_END); i++) {
 		if (table[i].frequency == CPUFREQ_ENTRY_INVALID)
 			continue;
+		/*
+		 * show_boost = true and driver_data = BOOST freq
+		 * display BOOST freqs
+		 *
+		 * show_boost = false and driver_data = BOOST freq
+		 * show_boost = true and driver_data != BOOST freq
+		 * continue - do not display anything
+		 *
+		 * show_boost = false and driver_data != BOOST freq
+		 * display NON BOOST freqs
+		 */
+		if (show_boost ^ (table[i].driver_data == CPUFREQ_BOOST_FREQ))
+			continue;
+
 		count += sprintf(&buf[count], "%d ", table[i].frequency);
 	}
 	count += sprintf(&buf[count], "\n");
@@ -192,14 +211,34 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
 
 }
 
-struct freq_attr cpufreq_freq_attr_scaling_available_freqs = {
-	.attr = { .name = "scaling_available_frequencies",
-		  .mode = 0444,
-		},
-	.show = show_available_freqs,
-};
+#define cpufreq_attr_available_freq(_name)	  \
+struct freq_attr cpufreq_freq_attr_##_name##_freqs =     \
+__ATTR_RO(_name##_frequencies)
+
+/**
+ * show_scaling_available_frequencies - show available normal frequencies for
+ * the specified CPU
+ */
+static ssize_t scaling_available_frequencies_show(struct cpufreq_policy *policy,
+						  char *buf)
+{
+	return show_available_freqs(policy, buf, false);
+}
+cpufreq_attr_available_freq(scaling_available);
 EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_available_freqs);
 
+/**
+ * show_available_boost_freqs - show available boost frequencies for
+ * the specified CPU
+ */
+static ssize_t scaling_boost_frequencies_show(struct cpufreq_policy *policy,
+					      char *buf)
+{
+	return show_available_freqs(policy, buf, true);
+}
+cpufreq_attr_available_freq(scaling_boost);
+EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_boost_freqs);
+
 /*
  * if you use these, you must assure that the frequency table is valid
  * all the time between get_attr and put_attr!
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index d568f39..541d032 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -209,6 +209,11 @@ struct cpufreq_driver {
 	int	(*suspend)	(struct cpufreq_policy *policy);
 	int	(*resume)	(struct cpufreq_policy *policy);
 	struct freq_attr	**attr;
+
+	/* platform specific boost support code */
+	bool                    boost_supported;
+	bool                    boost_enabled;
+	int     (*set_boost)    (int state);
 };
 
 /* flags */
@@ -381,6 +386,7 @@ extern struct cpufreq_governor cpufreq_gov_conservative;
 
 #define CPUFREQ_ENTRY_INVALID ~0
 #define CPUFREQ_TABLE_END     ~1
+#define CPUFREQ_BOOST_FREQ    ~2
 
 struct cpufreq_frequency_table {
 	unsigned int	driver_data; /* driver specific data, not used by core */
@@ -403,11 +409,30 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
 void cpufreq_frequency_table_update_policy_cpu(struct cpufreq_policy *policy);
 ssize_t cpufreq_show_cpus(const struct cpumask *mask, char *buf);
 
+#ifdef CONFIG_CPU_FREQ
+int cpufreq_boost_trigger_state(int state);
+int cpufreq_boost_supported(void);
+int cpufreq_boost_enabled(void);
+#else
+static inline int cpufreq_boost_trigger_state(int state)
+{
+	return 0;
+}
+static inline int cpufreq_boost_supported(void)
+{
+	return 0;
+}
+static inline int cpufreq_boost_enabled(void)
+{
+	return 0;
+}
+#endif
 /* the following funtion is for cpufreq core use only */
 struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu);
 
 /* the following are really really optional */
 extern struct freq_attr cpufreq_freq_attr_scaling_available_freqs;
+extern struct freq_attr cpufreq_freq_attr_scaling_boost_freqs;
 void cpufreq_frequency_table_get_attr(struct cpufreq_frequency_table *table,
 				      unsigned int cpu);
 void cpufreq_frequency_table_put_attr(unsigned int cpu);
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v8 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution
  2013-08-26 15:50 ` [PATCH v8 " Lukasz Majewski
  2013-08-26 15:50   ` [PATCH v8 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
@ 2013-08-26 15:50   ` Lukasz Majewski
  2013-08-26 15:50   ` [PATCH v8 3/7] thermal:boost: Automatic enable/disable of BOOST feature Lukasz Majewski
                     ` (4 subsequent siblings)
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-26 15:50 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Kukjin Kim, Myungjoo Ham, durgadoss.r

The Intel's hardware based boost solution driver has been changed to cooperate with
common cpufreq boost framework.

The global sysfs boost attribute entry code (/sys/devices/system/cpu/cpufreq/boost)
has been moved to a core cpufreq code. This attribute is now only visible,
when cpufreq driver supports it.

The _store_boost() function has been redesigned to be used as set_boost
callback.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v8:
- None

Changes for v7:
- Remove superfluous acpi_cpufreq_driver.boost_supported = false at
  acpi_cpufreq_boost_init()

Changes for v6:
- Perform acpi_cpufreq_boost_init initialization before cpufreq_driver
  registration
- Compile store_boost() only when CONFIG_X86_ACPI_CPUFREQ_CPB defined
- Use boost_enabled flag defined at acpi_cpufreq_driver to store information
  about boost state
- Instead of using cpufreq_set_boost_enabled(), modify the boost_enable in
  the acpi driver code

Changes for v5:
- Remove acpi-cpufreq's boost_enabled global flag and reuse one defined at
  cpufreq core

Changes for v4:
- add _store_boost to acpi_cpufreq_driver structure

Changes for v3:
- Bring back boost_enabled as a global flag
- Move boost_supported to cpufreq_driver structure

Changes for v2:
- Replace boost_enabled and boost_supported global flags with proper entries
  at struct cpufreq_driver.
- Removal of struct cpufreq_boost

 drivers/cpufreq/acpi-cpufreq.c |   86 ++++++++++++++--------------------------
 1 file changed, 29 insertions(+), 57 deletions(-)

diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c
index a1260b4..5ff169f 100644
--- a/drivers/cpufreq/acpi-cpufreq.c
+++ b/drivers/cpufreq/acpi-cpufreq.c
@@ -80,7 +80,6 @@ static struct acpi_processor_performance __percpu *acpi_perf_data;
 static struct cpufreq_driver acpi_cpufreq_driver;
 
 static unsigned int acpi_pstate_strict;
-static bool boost_enabled, boost_supported;
 static struct msr __percpu *msrs;
 
 static bool boost_state(unsigned int cpu)
@@ -133,49 +132,16 @@ static void boost_set_msrs(bool enable, const struct cpumask *cpumask)
 	wrmsr_on_cpus(cpumask, msr_addr, msrs);
 }
 
-static ssize_t _store_boost(const char *buf, size_t count)
+static int _store_boost(int val)
 {
-	int ret;
-	unsigned long val = 0;
-
-	if (!boost_supported)
-		return -EINVAL;
-
-	ret = kstrtoul(buf, 10, &val);
-	if (ret || (val > 1))
-		return -EINVAL;
-
-	if ((val && boost_enabled) || (!val && !boost_enabled))
-		return count;
-
 	get_online_cpus();
-
 	boost_set_msrs(val, cpu_online_mask);
-
 	put_online_cpus();
-
-	boost_enabled = val;
 	pr_debug("Core Boosting %sabled.\n", val ? "en" : "dis");
 
-	return count;
-}
-
-static ssize_t store_global_boost(struct kobject *kobj, struct attribute *attr,
-				  const char *buf, size_t count)
-{
-	return _store_boost(buf, count);
-}
-
-static ssize_t show_global_boost(struct kobject *kobj,
-				 struct attribute *attr, char *buf)
-{
-	return sprintf(buf, "%u\n", boost_enabled);
+	return 0;
 }
 
-static struct global_attr global_boost = __ATTR(boost, 0644,
-						show_global_boost,
-						store_global_boost);
-
 static ssize_t show_freqdomain_cpus(struct cpufreq_policy *policy, char *buf)
 {
 	struct acpi_cpufreq_data *data = per_cpu(acfreq_data, policy->cpu);
@@ -186,15 +152,32 @@ static ssize_t show_freqdomain_cpus(struct cpufreq_policy *policy, char *buf)
 cpufreq_freq_attr_ro(freqdomain_cpus);
 
 #ifdef CONFIG_X86_ACPI_CPUFREQ_CPB
+static ssize_t store_boost(const char *buf, size_t count)
+{
+	int ret;
+	unsigned long val = 0;
+
+	if (!acpi_cpufreq_driver.boost_supported)
+		return -EINVAL;
+
+	ret = kstrtoul(buf, 10, &val);
+	if (ret || (val > 1))
+		return -EINVAL;
+
+	_store_boost((int) val);
+
+	return count;
+}
+
 static ssize_t store_cpb(struct cpufreq_policy *policy, const char *buf,
 			 size_t count)
 {
-	return _store_boost(buf, count);
+	return store_boost(buf, count);
 }
 
 static ssize_t show_cpb(struct cpufreq_policy *policy, char *buf)
 {
-	return sprintf(buf, "%u\n", boost_enabled);
+	return sprintf(buf, "%u\n", acpi_cpufreq_driver.boost_enabled);
 }
 
 cpufreq_freq_attr_rw(cpb);
@@ -582,7 +565,7 @@ static int boost_notify(struct notifier_block *nb, unsigned long action,
 	switch (action) {
 	case CPU_UP_PREPARE:
 	case CPU_UP_PREPARE_FROZEN:
-		boost_set_msrs(boost_enabled, cpumask);
+		boost_set_msrs(acpi_cpufreq_driver.boost_enabled, cpumask);
 		break;
 
 	case CPU_DOWN_PREPARE:
@@ -937,6 +920,7 @@ static struct cpufreq_driver acpi_cpufreq_driver = {
 	.resume		= acpi_cpufreq_resume,
 	.name		= "acpi-cpufreq",
 	.attr		= acpi_cpufreq_attr,
+	.set_boost      = _store_boost,
 };
 
 static void __init acpi_cpufreq_boost_init(void)
@@ -947,33 +931,22 @@ static void __init acpi_cpufreq_boost_init(void)
 		if (!msrs)
 			return;
 
-		boost_supported = true;
-		boost_enabled = boost_state(0);
-
+		acpi_cpufreq_driver.boost_supported = true;
+		acpi_cpufreq_driver.boost_enabled = boost_state(0);
 		get_online_cpus();
 
 		/* Force all MSRs to the same value */
-		boost_set_msrs(boost_enabled, cpu_online_mask);
+		boost_set_msrs(acpi_cpufreq_driver.boost_enabled,
+			       cpu_online_mask);
 
 		register_cpu_notifier(&boost_nb);
 
 		put_online_cpus();
-	} else
-		global_boost.attr.mode = 0444;
-
-	/* We create the boost file in any case, though for systems without
-	 * hardware support it will be read-only and hardwired to return 0.
-	 */
-	if (cpufreq_sysfs_create_file(&(global_boost.attr)))
-		pr_warn(PFX "could not register global boost sysfs file\n");
-	else
-		pr_debug("registered global boost sysfs file\n");
+	}
 }
 
 static void __exit acpi_cpufreq_boost_exit(void)
 {
-	cpufreq_sysfs_remove_file(&(global_boost.attr));
-
 	if (msrs) {
 		unregister_cpu_notifier(&boost_nb);
 
@@ -1015,12 +988,11 @@ static int __init acpi_cpufreq_init(void)
 			*iter = &cpb;
 	}
 #endif
+	acpi_cpufreq_boost_init();
 
 	ret = cpufreq_register_driver(&acpi_cpufreq_driver);
 	if (ret)
 		free_acpi_perf_data();
-	else
-		acpi_cpufreq_boost_init();
 
 	return ret;
 }
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v8 3/7] thermal:boost: Automatic enable/disable of BOOST feature
  2013-08-26 15:50 ` [PATCH v8 " Lukasz Majewski
  2013-08-26 15:50   ` [PATCH v8 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
  2013-08-26 15:50   ` [PATCH v8 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
@ 2013-08-26 15:50   ` Lukasz Majewski
  2013-08-26 15:50   ` [PATCH v8 4/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
                     ` (3 subsequent siblings)
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-26 15:50 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Kukjin Kim, Myungjoo Ham, durgadoss.r

This patch provides auto disable/enable operation for boost. When any
defined trip point is passed, the boost is disabled.
In that moment thermal monitor workqueue is woken up and it monitors
if the device temperature drops below 75% of the smallest trip point.
When device cools down, the boost is enabled again.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v8:
- Move cpufreq_boost_* stub functions definition (needed when cpufreq
  is not compiled in) to cpufreq.h at cpufreq core support commit

Changes for v7:
- None

Changes for v6:
- Disable boost only when supported and enabled
- Protect boost related thermal_zone_device struct fields with mutex
- Evaluate temperature trend during boost enable decision
- Create separate methods to handle boost enable/disable
  (thermal_boost_{enable|disable}) operations
- Boost is disabled at any trip point passage (not only the non critical one)
- Add stub definitions for cpufreq boost functions used when
  CONFIG_CPU_FREQ is NOT defined.

Changes for v5:
- Move boost disable code from cpu_cooling.c to thermal_core.c
  (to handle_non_critical_trips)
- Extent struct thermal_zone_device by adding overheated bool flag
- Implement auto enable of boost after device cools down
- Introduce boost_polling flag, which indicates if thermal uses it's predefined
  pool delay or has woken up thermal workqueue only to wait until device
  cools down.

Changes for v4:
- New patch

 drivers/thermal/thermal_core.c |   55 ++++++++++++++++++++++++++++++++++++++++
 include/linux/thermal.h        |    2 ++
 2 files changed, 57 insertions(+)

diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
index 1f02e8e..8f4be55 100644
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -34,6 +34,7 @@
 #include <linux/thermal.h>
 #include <linux/reboot.h>
 #include <linux/string.h>
+#include <linux/cpufreq.h>
 #include <net/netlink.h>
 #include <net/genetlink.h>
 
@@ -354,9 +355,59 @@ static void handle_critical_trips(struct thermal_zone_device *tz,
 	}
 }
 
+static int thermal_boost_enable(struct thermal_zone_device *tz)
+{
+	enum thermal_trend trend = get_tz_trend(tz, 0);
+	long trip_temp;
+
+	if (!tz->ops->get_trip_temp || !tz->overheated)
+		return -EPERM;
+	if (trend == THERMAL_TREND_RAISING || trend == THERMAL_TREND_RAISE_FULL)
+		return -EBUSY;
+
+	tz->ops->get_trip_temp(tz, 0, &trip_temp);
+	/*
+	 * Enable boost again only when current temperature is less
+	 * than 75% of trip_temp[0]
+	 */
+	if ((tz->temperature + (trip_temp >> 2)) < trip_temp) {
+		mutex_lock(&tz->lock);
+		tz->overheated = false;
+		if (tz->boost_polling) {
+			tz->boost_polling = false;
+			tz->polling_delay = 0;
+		}
+		mutex_unlock(&tz->lock);
+		cpufreq_boost_trigger_state(1);
+		return 0;
+	}
+	return -EBUSY;
+}
+
+static void thermal_boost_disable(struct thermal_zone_device *tz)
+{
+	cpufreq_boost_trigger_state(0);
+
+	/*
+	 * If no workqueue for monitoring is running - start one with
+	 * 1000 ms monitoring period
+	 * If workqueue already running - do not change its period and only
+	 * test if target CPU has cooled down
+	 */
+	mutex_lock(&tz->lock);
+	if (!tz->polling_delay) {
+		tz->boost_polling = true;
+		tz->polling_delay = 1000;
+	}
+	tz->overheated = true;
+	mutex_unlock(&tz->lock);
+}
+
 static void handle_thermal_trip(struct thermal_zone_device *tz, int trip)
 {
 	enum thermal_trip_type type;
+	if (cpufreq_boost_supported() && cpufreq_boost_enabled())
+		thermal_boost_disable(tz);
 
 	tz->ops->get_trip_type(tz, trip, &type);
 
@@ -455,6 +506,10 @@ static void thermal_zone_device_check(struct work_struct *work)
 	struct thermal_zone_device *tz = container_of(work, struct
 						      thermal_zone_device,
 						      poll_queue.work);
+	if (cpufreq_boost_supported())
+		if (!thermal_boost_enable(tz))
+			return;
+
 	thermal_zone_device_update(tz);
 }
 
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index a386a1c..f1aa3c2 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -172,6 +172,8 @@ struct thermal_zone_device {
 	int emul_temperature;
 	int passive;
 	unsigned int forced_passive;
+	bool overheated;
+	bool boost_polling;
 	const struct thermal_zone_device_ops *ops;
 	const struct thermal_zone_params *tzp;
 	struct thermal_governor *governor;
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v8 4/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST
  2013-08-26 15:50 ` [PATCH v8 " Lukasz Majewski
                     ` (2 preceding siblings ...)
  2013-08-26 15:50   ` [PATCH v8 3/7] thermal:boost: Automatic enable/disable of BOOST feature Lukasz Majewski
@ 2013-08-26 15:50   ` Lukasz Majewski
  2013-08-26 15:50   ` [PATCH v8 5/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
                     ` (2 subsequent siblings)
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-26 15:50 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Kukjin Kim, Myungjoo Ham, durgadoss.r

For safety reasons new flag - CONFIG_CPU_FREQ_BOOST_SW has been added.
Only after selecting "EXYNOS Frequency Overclocking - Software" Kconfig
option the software managed boost is enabled. It also selects thermal
subsystem to be compiled in. Thermal is necessary for disabling boost
and cooling down the device when overheating detected.

Boost _MUST_NOT_ work without thermal subsystem with properly defined
overheating temperatures.

This option doesn't affect x86's ACPI hardware managed boost support
(i.e. Intel, AMD). In this situation boost management is embedded at
hardware.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v8:
- None

Changes for v7:
- Remove superfluous "default n" definition
- Generic CPU_FREQ_BOOST_SW depends on THERMAL

Changes for v6:
- CPU_FREQ_BOOST_SW [1] is now defined as "invisible" bool option.
- Platform dependent ARM_EXYNOS_CPU_FREQ_BOOST_SW config option has been
  added. It depends on ARM_EXYNOS_CPUFREQ options and selects
  EXYNOS_THERMAL with the main boost config [1].

Changes for v5:
- New patch

 drivers/cpufreq/Kconfig     |    4 ++++
 drivers/cpufreq/Kconfig.arm |   15 +++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
index 534fcb8..e3cbf72 100644
--- a/drivers/cpufreq/Kconfig
+++ b/drivers/cpufreq/Kconfig
@@ -23,6 +23,10 @@ config CPU_FREQ_TABLE
 config CPU_FREQ_GOV_COMMON
 	bool
 
+config CPU_FREQ_BOOST_SW
+	bool
+	depends on THERMAL
+
 config CPU_FREQ_STAT
 	tristate "CPU frequency translation statistics"
 	select CPU_FREQ_TABLE
diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm
index 0fa204b..6a6d173 100644
--- a/drivers/cpufreq/Kconfig.arm
+++ b/drivers/cpufreq/Kconfig.arm
@@ -67,6 +67,21 @@ config ARM_EXYNOS5440_CPUFREQ
 
 	  If in doubt, say N.
 
+config ARM_EXYNOS_CPU_FREQ_BOOST_SW
+	bool "EXYNOS Frequency Overclocking - Software"
+	depends on ARM_EXYNOS_CPUFREQ
+	select CPU_FREQ_BOOST_SW
+	select EXYNOS_THERMAL
+	help
+	  This driver supports software managed overclocking (BOOST).
+	  It allows usage of special frequencies for Samsung Exynos
+	  processors if thermal conditions are appropriate.
+
+	  It reguires, for safe operation, thermal framework with properly
+	  defined trip points.
+
+	  If in doubt, say N.
+
 config ARM_HIGHBANK_CPUFREQ
 	tristate "Calxeda Highbank-based"
 	depends on ARCH_HIGHBANK
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v8 5/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework
  2013-08-26 15:50 ` [PATCH v8 " Lukasz Majewski
                     ` (3 preceding siblings ...)
  2013-08-26 15:50   ` [PATCH v8 4/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
@ 2013-08-26 15:50   ` Lukasz Majewski
  2013-08-26 15:50   ` [PATCH v8 6/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
  2013-08-26 15:50   ` [PATCH v8 7/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-26 15:50 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Kukjin Kim, Myungjoo Ham, durgadoss.r

The cpufreq_driver's boost_supported flag is true only when boost
support is explicitly enabled. Boost related attributes are exported only
under the same condition.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v8:
- None

Changes for v7:
- Replace CONFIG_CPU_FREQ_BOOST_SW with CONFIG_ARM_EXYNOS_CPU_FREQ_BOOST_SW
- Move boost_supported initialization to struct cpufreq_driver exynos_driver

Changes for v6:
- Replace exynos_driver.boost_supported = 1 to = true
- Protect boost attributes export with CONFIG_CPU_FREQ_BOOST_SW

Changes for v5:
- None

Changes for v4:
- None

Changes for v3:
- Remove low level boost code
- Move boost management code to cpufreq core code
- Use boost_supported flag to indicate if driver supports over clocking

Changes for v2:
- Removal of struct cpufreq_boost
- Removal of the CONFIG_CPU_FREQ_BOOST flag
- low_level_boost with valid address when boost is supported

 drivers/cpufreq/exynos-cpufreq.c |    6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/cpufreq/exynos-cpufreq.c b/drivers/cpufreq/exynos-cpufreq.c
index b9f9aee..2786aba 100644
--- a/drivers/cpufreq/exynos-cpufreq.c
+++ b/drivers/cpufreq/exynos-cpufreq.c
@@ -270,6 +270,9 @@ static int exynos_cpufreq_cpu_exit(struct cpufreq_policy *policy)
 
 static struct freq_attr *exynos_cpufreq_attr[] = {
 	&cpufreq_freq_attr_scaling_available_freqs,
+#ifdef CONFIG_ARM_EXYNOS_CPU_FREQ_BOOST_SW
+	&cpufreq_freq_attr_scaling_boost_freqs,
+#endif
 	NULL,
 };
 
@@ -282,6 +285,9 @@ static struct cpufreq_driver exynos_driver = {
 	.exit		= exynos_cpufreq_cpu_exit,
 	.name		= "exynos_cpufreq",
 	.attr		= exynos_cpufreq_attr,
+#ifdef CONFIG_ARM_EXYNOS_CPU_FREQ_BOOST_SW
+	.boost_supported = true,
+#endif
 #ifdef CONFIG_PM
 	.suspend	= exynos_cpufreq_suspend,
 	.resume		= exynos_cpufreq_resume,
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v8 6/7] Documentation:cpufreq:boost: Update BOOST documentation
  2013-08-26 15:50 ` [PATCH v8 " Lukasz Majewski
                     ` (4 preceding siblings ...)
  2013-08-26 15:50   ` [PATCH v8 5/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
@ 2013-08-26 15:50   ` Lukasz Majewski
  2013-08-26 15:50   ` [PATCH v8 7/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-26 15:50 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Kukjin Kim, Myungjoo Ham, durgadoss.r

Since the support for software and hardware controlled boosting has been
added, the corresponding Documentation entry had been updated.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v8:
- None

Changes for v7:
- None

Changes for v6:
- None

Changes for v5:
- New patch

 Documentation/cpu-freq/boost.txt |   26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/Documentation/cpu-freq/boost.txt b/Documentation/cpu-freq/boost.txt
index 9b4edfc..dd62e13 100644
--- a/Documentation/cpu-freq/boost.txt
+++ b/Documentation/cpu-freq/boost.txt
@@ -17,8 +17,8 @@ Introduction
 Some CPUs support a functionality to raise the operating frequency of
 some cores in a multi-core package if certain conditions apply, mostly
 if the whole chip is not fully utilized and below it's intended thermal
-budget. This is done without operating system control by a combination
-of hardware and firmware.
+budget. The decision about boost disable/enable is made either at hardware
+(e.g. x86) or software (e.g ARM).
 On Intel CPUs this is called "Turbo Boost", AMD calls it "Turbo-Core",
 in technical documentation "Core performance boost". In Linux we use
 the term "boost" for convenience.
@@ -48,24 +48,24 @@ be desirable:
 User controlled switch
 ----------------------
 
-To allow the user to toggle the boosting functionality, the acpi-cpufreq
-driver exports a sysfs knob to disable it. There is a file:
+To allow the user to toggle the boosting functionality, the cpufreq core
+driver exports a sysfs knob to enable or disable it. There is a file:
 /sys/devices/system/cpu/cpufreq/boost
 which can either read "0" (boosting disabled) or "1" (boosting enabled).
-Reading the file is always supported, even if the processor does not
-support boosting. In this case the file will be read-only and always
-reads as "0". Explicitly changing the permissions and writing to that
-file anyway will return EINVAL.
+The file is exported only when cpufreq driver supports boosting.
+Explicitly changing the permissions and writing to that file anyway will
+return EINVAL.
 
 On supported CPUs one can write either a "0" or a "1" into this file.
 This will either disable the boost functionality on all cores in the
-whole system (0) or will allow the hardware to boost at will (1).
+whole system (0) or will allow the software or hardware to boost at will
+(1).
 
 Writing a "1" does not explicitly boost the system, but just allows the
-CPU (and the firmware) to boost at their discretion. Some implementations
-take external factors like the chip's temperature into account, so
-boosting once does not necessarily mean that it will occur every time
-even using the exact same software setup.
+CPU to boost at their discretion. Some implementations take external
+factors like the chip's temperature into account, so boosting once does
+not necessarily mean that it will occur every time even using the exact
+same software setup.
 
 
 AMD legacy cpb switch
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v8 7/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ
  2013-08-26 15:50 ` [PATCH v8 " Lukasz Majewski
                     ` (5 preceding siblings ...)
  2013-08-26 15:50   ` [PATCH v8 6/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
@ 2013-08-26 15:50   ` Lukasz Majewski
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-08-26 15:50 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Kukjin Kim, Myungjoo Ham, durgadoss.r

Special driver data flag (CPUFREQ_BOOST_FREQ) has been added to indicate
frequency, which can be only enabled for BOOST mode.
This frequency shall be used only for limited time, since it might cause
target device to overheat.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v8:
- None

Changes for v7:
- None

Changes for v6:
- New patch

 drivers/cpufreq/exynos4x12-cpufreq.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/cpufreq/exynos4x12-cpufreq.c b/drivers/cpufreq/exynos4x12-cpufreq.c
index e270b42..367f600 100644
--- a/drivers/cpufreq/exynos4x12-cpufreq.c
+++ b/drivers/cpufreq/exynos4x12-cpufreq.c
@@ -32,7 +32,7 @@ static unsigned int exynos4x12_volt_table[] = {
 };
 
 static struct cpufreq_frequency_table exynos4x12_freq_table[] = {
-	{L0, CPUFREQ_ENTRY_INVALID},
+	{CPUFREQ_BOOST_FREQ, 1500 * 1000},
 	{L1, 1400 * 1000},
 	{L2, 1300 * 1000},
 	{L3, 1200 * 1000},
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH RESEND v8 0/7] cpufreq:boost: CPU Boost mode support
  2013-06-06  7:07 [PATCH 0/5] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                   ` (11 preceding siblings ...)
  2013-08-26 15:50 ` [PATCH v8 " Lukasz Majewski
@ 2013-09-20 16:00 ` Lukasz Majewski
  2013-09-20 16:00   ` [PATCH RESEND v8 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
                     ` (6 more replies)
  2013-10-14 12:17 ` [PATCH v9 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                   ` (4 subsequent siblings)
  17 siblings, 7 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-09-20 16:00 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Myungjoo Ham, durgadoss.r

This patch series introduces support for CPU overclocking technique
called Boost.

It is a follow up of a LAB governor proposal. Boost is a LAB component:
http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq

Boost unifies hardware based solution (e.g. Intel Nehalem) with
software oriented one (like the one done at Exynos).
For this reason cpufreq/freq_table code has been reorganized to include
common code.

Important design decisions:
- Boost related code is compiled-in unconditionally to cpufreq core and
  disabled by default. The cpufreq_driver is responsibile for setting
  boost_supported flag and providing set_boost callback(if HW support
  is needed). For software managed boost, special Kconfig flag -
  CONFIG_CPU_FREQ_BOOST_SW has been defined. It will be selected only
  when a target platform has thermal framework properly configured.

- struct cpufreq_driver has been extended with boost related fields:
        -- boost_supported - when driver supports boosting
        -- boost_enabled - boost state
        -- set_boost - callback to function, which is necessary to
           enable/disable boost

- Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost) is visible
  _only_ when cpufreq driver supports Boost.

- No special spin_lock for Boost was created. The one from cpufreq core
  was reused.

- The Boost code doesn't rely on any policy. When boost state is changed,
  then the policy list is iterated and proper adjustements are done.

- To improve safety level, the thermal framework is also extended to disable
  software boosting, when thermal trip point is reached. Then it starts
  monitoring target temperature to evaluate if boost can be enabled
  again. This emulates behaviour similar to HW managed boost (like x86)

Tested at HW:
       Exynos 4412 (TRATS2) 3.12-rc1 Linux
       Intel Core i7-3770 3.12-rc1 Linux

Above patches were posted on top of linux_pm/linux-next 
SHA1: cf8bc6460f2137412081ba26d18932f20cb856fd

Lukasz Majewski (7):
  cpufreq: Add boost frequency support in core
  cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common
    boost solution
  thermal:boost: Automatic enable/disable of BOOST feature
  cpufreq:boost:Kconfig: Provide support for software managed BOOST
  cpufreq:exynos:Extend Exynos cpufreq driver to support boost
    framework
  Documentation:cpufreq:boost: Update BOOST documentation
  cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ

 Documentation/cpu-freq/boost.txt     |   26 ++++----
 drivers/cpufreq/Kconfig              |    4 ++
 drivers/cpufreq/Kconfig.arm          |   15 +++++
 drivers/cpufreq/acpi-cpufreq.c       |   86 +++++++++----------------
 drivers/cpufreq/cpufreq.c            |  118 +++++++++++++++++++++++++++++++++-
 drivers/cpufreq/exynos-cpufreq.c     |    6 ++
 drivers/cpufreq/exynos4x12-cpufreq.c |    2 +-
 drivers/cpufreq/freq_table.c         |   53 +++++++++++++--
 drivers/thermal/thermal_core.c       |   55 ++++++++++++++++
 include/linux/cpufreq.h              |   25 +++++++
 include/linux/thermal.h              |    2 +
 11 files changed, 313 insertions(+), 79 deletions(-)

-- 
1.7.10.4


^ permalink raw reply	[flat|nested] 329+ messages in thread

* [PATCH RESEND v8 1/7] cpufreq: Add boost frequency support in core
  2013-09-20 16:00 ` [PATCH RESEND v8 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
@ 2013-09-20 16:00   ` Lukasz Majewski
  2013-09-20 16:00   ` [PATCH RESEND v8 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
                     ` (5 subsequent siblings)
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-09-20 16:00 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Myungjoo Ham, durgadoss.r

This commit adds boost frequency support in cpufreq core (Hardware &
Software). Some SoCs (like Exynos4 - e.g. 4x12) allow setting frequency
above its normal operation limits. Such mode shall be only used for a
short time.

Overclocking (boost) support is essentially provided by platform
dependent cpufreq driver.

This commit unifies support for SW and HW (Intel) overclocking solutions
in the core cpufreq driver. Previously the "boost" sysfs attribute was
defined at acpi driver code. By default boost is disabled. One global
attribute is available at: /sys/devices/system/cpu/cpufreq/boost.

It only shows up when cpufreq driver supports overclocking.
Under the hood frequencies dedicated for boosting are marked with a
special flag (CPUFREQ_BOOST_FREQ) at driver's frequency table.
It is the user's concern to enable/disable overclocking with a proper call
to sysfs.

The cpufreq_boost_trigger_state() function is defined non static on purpose.
It is used later with thermal subsystem to provide automatic enable/disable
of the BOOST feature.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v8:
- Correction of error message at cpufreq_boost_trigger_state() function
- Rewrite the cpufreq_boost_set_sw() function to print error message and
  break the loop when policy adjustment fails

Changes for v7:
- Properly change cpufreq_driver->boost_enabled when set_boost() fails
  (=0 to =!state)
- Add likely() around cpufreq_driver
- Remove parenthesis around boost.attr

Changes for v6:
- Remove sysfs boost attribute when subsys_iterface_unregister() fails
- Move global boost_enabled variable from cpufreq.c to platform dependent
  struct cpufreq_driver
- pr_err() message is also printed when boost disable fails
- Call __cpufreq_governor() to force recalculation of next frequency when
  boost is triggered. It is needed with i.e. performance class of governors
- Change cpufreq_boost_enable_sw() -> cpufreq_boost_set_sw()
- Rename .enable_boost function pointer to .set_boost

Changes for v5:
- Rename cpufreq_boost_trigger_state_sw() to cpufreq_boost_enable_sw()
- Extent cpufreq_register_driver() to check if cpufreq driver provided
  boost_enable callback. If not provided, then use cpufreq_boost_enable_sw()
- Use single call to cpufreq_driver->enable_boost() with cpufreq driver
  provided callback or default SW boost enable routine
- Move pr_debug call to store_boost() from cpufreq_boost_trigger_state()
- Change the user_policy.max value when SW boost is toggled. It is necessary
  for proper operation of e.g. thermal subsystem.
- Add check if cpufreq_driver pointer is not NULL at
  cpufreq_boost_supported() routine
- Add EXPORT_SYMBOL_GPL for cpufreq_boost_supported() and
  cpufreq_boost_enabled()
- Remove extra check for cpufreq_boost_supported() at
  cpufreq_freq_table_cpuinfo()
- Explanation of show boost logic at show_available_freqs()
- Add cpufreq_set_boost_enabled() method to set initial value of boost_enabled
  global flag

Changes for v4:
- Remove boost parameter from cpufreq_frequency_table_cpuinfo() function
- Introduce cpufreq_boost_supported() method
- Use of cpufreq_boost_supported() and cpufreq_boost_enabled() to decide
  if frequency shall be skipped
- Rename set_boost_freq() to enable_boost()
- cpufreq_attr_available_freq() moved to freq_table.c
- Use policy list to get access to cpufreq policies
- Rename global boost flag (cpufreq_boost_enabled -> boost_enabled)
- pr_err corrected ( %sable)
- Remove sanity check at cpufreq_boost_trigger_state() entrance [to test if
  boost is supported]
- Use either HW (boost_enable) callback or SW managed boost
- Introduce new cpufreq_boost_trigger_state_sw() method to handle boost
  at SW.
- Protect boost_enabled manipulation with lock.

Changes for v3:
- Method for reading boost status
- Removal of cpufreq_frequency_table_max()
- Extent cpufreq_frequency_table_cpuinfo() to support boost parameter
- boost_supported flag added to cpufreq_driver struct
- "boost" sysfs attribute control flag removed
- One global flag describing state of the boost defined at cpufreq core
- Rename cpufreq_driver's low_level_boost field to set_boost_freq()
- Usage of cpufreq_sysfs_{remove|add}_file() routines

Changes for v2:
- Removal of cpufreq_boost structure and move its fields to cpufreq_driver
  structure
- Flag to indicate if global boost attribute is already defined
- Extent the pr_{err|debbug} functions to show current function names

 drivers/cpufreq/cpufreq.c    |  118 +++++++++++++++++++++++++++++++++++++++++-
 drivers/cpufreq/freq_table.c |   53 ++++++++++++++++---
 include/linux/cpufreq.h      |   25 +++++++++
 3 files changed, 188 insertions(+), 8 deletions(-)

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 5c75e31..b8b70a1 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -344,6 +344,33 @@ EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
 /*********************************************************************
  *                          SYSFS INTERFACE                          *
  *********************************************************************/
+ssize_t show_boost(struct kobject *kobj,
+				 struct attribute *attr, char *buf)
+{
+	return sprintf(buf, "%d\n", cpufreq_driver->boost_enabled);
+}
+
+static ssize_t store_boost(struct kobject *kobj, struct attribute *attr,
+				  const char *buf, size_t count)
+{
+	int ret, enable;
+
+	ret = sscanf(buf, "%d", &enable);
+	if (ret != 1 || enable < 0 || enable > 1)
+		return -EINVAL;
+
+	if (cpufreq_boost_trigger_state(enable)) {
+		pr_err("%s: Cannot %s BOOST!\n", __func__,
+		       enable ? "enable" : "disable");
+		return -EINVAL;
+	}
+
+	pr_debug("%s: cpufreq BOOST %s\n", __func__,
+		 enable ? "enabled" : "disabled");
+
+	return count;
+}
+define_one_global_rw(boost);
 
 static struct cpufreq_governor *__find_governor(const char *str_governor)
 {
@@ -2010,6 +2037,73 @@ static struct notifier_block __refdata cpufreq_cpu_notifier = {
 };
 
 /*********************************************************************
+ *               BOOST						     *
+ *********************************************************************/
+static int cpufreq_boost_set_sw(int state)
+{
+	struct cpufreq_frequency_table *freq_table;
+	struct cpufreq_policy *policy;
+	int ret = -EINVAL;
+
+	list_for_each_entry(policy, &cpufreq_policy_list, policy_list) {
+		freq_table = cpufreq_frequency_get_table(policy->cpu);
+		if (freq_table) {
+			ret = cpufreq_frequency_table_cpuinfo(policy,
+							freq_table);
+			if (ret) {
+				pr_err("%s: Policy frequency update failed\n",
+				       __func__);
+				break;
+			}
+			policy->user_policy.max = policy->max;
+			__cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
+		}
+	}
+
+	return ret;
+}
+
+int cpufreq_boost_trigger_state(int state)
+{
+	unsigned long flags;
+	int ret = 0;
+
+	if (cpufreq_driver->boost_enabled == state)
+		return 0;
+
+	write_lock_irqsave(&cpufreq_driver_lock, flags);
+	cpufreq_driver->boost_enabled = state;
+	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
+
+	ret = cpufreq_driver->set_boost(state);
+	if (ret) {
+		write_lock_irqsave(&cpufreq_driver_lock, flags);
+		cpufreq_driver->boost_enabled = !state;
+		write_unlock_irqrestore(&cpufreq_driver_lock, flags);
+
+		pr_err("%s: Cannot %s BOOST\n", __func__,
+		       state ? "enable" : "disable");
+	}
+
+	return ret;
+}
+
+int cpufreq_boost_supported(void)
+{
+	if (likely(cpufreq_driver))
+		return cpufreq_driver->boost_supported;
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(cpufreq_boost_supported);
+
+int cpufreq_boost_enabled(void)
+{
+	return cpufreq_driver->boost_enabled;
+}
+EXPORT_SYMBOL_GPL(cpufreq_boost_enabled);
+
+/*********************************************************************
  *               REGISTER / UNREGISTER CPUFREQ DRIVER                *
  *********************************************************************/
 
@@ -2048,9 +2142,25 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 	cpufreq_driver = driver_data;
 	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
 
+	if (cpufreq_boost_supported()) {
+		/*
+		 * Check if driver provides function to enable boost -
+		 * if not, use cpufreq_boost_set_sw as default
+		 */
+		if (!cpufreq_driver->set_boost)
+			cpufreq_driver->set_boost = cpufreq_boost_set_sw;
+
+		ret = cpufreq_sysfs_create_file(&boost.attr);
+		if (ret) {
+			pr_err("%s: cannot register global BOOST sysfs file\n",
+				__func__);
+			goto err_null_driver;
+		}
+	}
+
 	ret = subsys_interface_register(&cpufreq_interface);
 	if (ret)
-		goto err_null_driver;
+		goto err_boost_unreg;
 
 	if (!(cpufreq_driver->flags & CPUFREQ_STICKY)) {
 		int i;
@@ -2077,6 +2187,9 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 	return 0;
 err_if_unreg:
 	subsys_interface_unregister(&cpufreq_interface);
+err_boost_unreg:
+	if (cpufreq_boost_supported())
+		cpufreq_sysfs_remove_file(&boost.attr);
 err_null_driver:
 	write_lock_irqsave(&cpufreq_driver_lock, flags);
 	cpufreq_driver = NULL;
@@ -2103,6 +2216,9 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
 	pr_debug("unregistering driver %s\n", driver->name);
 
 	subsys_interface_unregister(&cpufreq_interface);
+	if (cpufreq_boost_supported())
+		cpufreq_sysfs_remove_file(&boost.attr);
+
 	unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
 
 	down_write(&cpufreq_rwsem);
diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c
index f111454a..d7eed63 100644
--- a/drivers/cpufreq/freq_table.c
+++ b/drivers/cpufreq/freq_table.c
@@ -32,6 +32,10 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
 
 			continue;
 		}
+		if (!cpufreq_boost_enabled()
+		    && table[i].driver_data == CPUFREQ_BOOST_FREQ)
+			continue;
+
 		pr_debug("table entry %u: %u kHz, %u driver_data\n",
 					i, freq, table[i].driver_data);
 		if (freq < min_freq)
@@ -169,7 +173,8 @@ static DEFINE_PER_CPU(struct cpufreq_frequency_table *, cpufreq_show_table);
 /**
  * show_available_freqs - show available frequencies for the specified CPU
  */
-static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
+static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf,
+				    bool show_boost)
 {
 	unsigned int i = 0;
 	unsigned int cpu = policy->cpu;
@@ -184,6 +189,20 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
 	for (i = 0; (table[i].frequency != CPUFREQ_TABLE_END); i++) {
 		if (table[i].frequency == CPUFREQ_ENTRY_INVALID)
 			continue;
+		/*
+		 * show_boost = true and driver_data = BOOST freq
+		 * display BOOST freqs
+		 *
+		 * show_boost = false and driver_data = BOOST freq
+		 * show_boost = true and driver_data != BOOST freq
+		 * continue - do not display anything
+		 *
+		 * show_boost = false and driver_data != BOOST freq
+		 * display NON BOOST freqs
+		 */
+		if (show_boost ^ (table[i].driver_data == CPUFREQ_BOOST_FREQ))
+			continue;
+
 		count += sprintf(&buf[count], "%d ", table[i].frequency);
 	}
 	count += sprintf(&buf[count], "\n");
@@ -192,14 +211,34 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
 
 }
 
-struct freq_attr cpufreq_freq_attr_scaling_available_freqs = {
-	.attr = { .name = "scaling_available_frequencies",
-		  .mode = 0444,
-		},
-	.show = show_available_freqs,
-};
+#define cpufreq_attr_available_freq(_name)	  \
+struct freq_attr cpufreq_freq_attr_##_name##_freqs =     \
+__ATTR_RO(_name##_frequencies)
+
+/**
+ * show_scaling_available_frequencies - show available normal frequencies for
+ * the specified CPU
+ */
+static ssize_t scaling_available_frequencies_show(struct cpufreq_policy *policy,
+						  char *buf)
+{
+	return show_available_freqs(policy, buf, false);
+}
+cpufreq_attr_available_freq(scaling_available);
 EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_available_freqs);
 
+/**
+ * show_available_boost_freqs - show available boost frequencies for
+ * the specified CPU
+ */
+static ssize_t scaling_boost_frequencies_show(struct cpufreq_policy *policy,
+					      char *buf)
+{
+	return show_available_freqs(policy, buf, true);
+}
+cpufreq_attr_available_freq(scaling_boost);
+EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_boost_freqs);
+
 /*
  * if you use these, you must assure that the frequency table is valid
  * all the time between get_attr and put_attr!
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index d568f39..541d032 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -209,6 +209,11 @@ struct cpufreq_driver {
 	int	(*suspend)	(struct cpufreq_policy *policy);
 	int	(*resume)	(struct cpufreq_policy *policy);
 	struct freq_attr	**attr;
+
+	/* platform specific boost support code */
+	bool                    boost_supported;
+	bool                    boost_enabled;
+	int     (*set_boost)    (int state);
 };
 
 /* flags */
@@ -381,6 +386,7 @@ extern struct cpufreq_governor cpufreq_gov_conservative;
 
 #define CPUFREQ_ENTRY_INVALID ~0
 #define CPUFREQ_TABLE_END     ~1
+#define CPUFREQ_BOOST_FREQ    ~2
 
 struct cpufreq_frequency_table {
 	unsigned int	driver_data; /* driver specific data, not used by core */
@@ -403,11 +409,30 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
 void cpufreq_frequency_table_update_policy_cpu(struct cpufreq_policy *policy);
 ssize_t cpufreq_show_cpus(const struct cpumask *mask, char *buf);
 
+#ifdef CONFIG_CPU_FREQ
+int cpufreq_boost_trigger_state(int state);
+int cpufreq_boost_supported(void);
+int cpufreq_boost_enabled(void);
+#else
+static inline int cpufreq_boost_trigger_state(int state)
+{
+	return 0;
+}
+static inline int cpufreq_boost_supported(void)
+{
+	return 0;
+}
+static inline int cpufreq_boost_enabled(void)
+{
+	return 0;
+}
+#endif
 /* the following funtion is for cpufreq core use only */
 struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu);
 
 /* the following are really really optional */
 extern struct freq_attr cpufreq_freq_attr_scaling_available_freqs;
+extern struct freq_attr cpufreq_freq_attr_scaling_boost_freqs;
 void cpufreq_frequency_table_get_attr(struct cpufreq_frequency_table *table,
 				      unsigned int cpu);
 void cpufreq_frequency_table_put_attr(unsigned int cpu);
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH RESEND v8 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution
  2013-09-20 16:00 ` [PATCH RESEND v8 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
  2013-09-20 16:00   ` [PATCH RESEND v8 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
@ 2013-09-20 16:00   ` Lukasz Majewski
  2013-09-20 16:01   ` [PATCH RESEND v8 3/7] thermal:boost: Automatic enable/disable of BOOST feature Lukasz Majewski
                     ` (4 subsequent siblings)
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-09-20 16:00 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Myungjoo Ham, durgadoss.r

The Intel's hardware based boost solution driver has been changed to cooperate with
common cpufreq boost framework.

The global sysfs boost attribute entry code (/sys/devices/system/cpu/cpufreq/boost)
has been moved to a core cpufreq code. This attribute is now only visible,
when cpufreq driver supports it.

The _store_boost() function has been redesigned to be used as set_boost
callback.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v8:
- None

Changes for v7:
- Remove superfluous acpi_cpufreq_driver.boost_supported = false at
  acpi_cpufreq_boost_init()

Changes for v6:
- Perform acpi_cpufreq_boost_init initialization before cpufreq_driver
  registration
- Compile store_boost() only when CONFIG_X86_ACPI_CPUFREQ_CPB defined
- Use boost_enabled flag defined at acpi_cpufreq_driver to store information
  about boost state
- Instead of using cpufreq_set_boost_enabled(), modify the boost_enable in
  the acpi driver code

Changes for v5:
- Remove acpi-cpufreq's boost_enabled global flag and reuse one defined at
  cpufreq core

Changes for v4:
- add _store_boost to acpi_cpufreq_driver structure

Changes for v3:
- Bring back boost_enabled as a global flag
- Move boost_supported to cpufreq_driver structure

Changes for v2:
- Replace boost_enabled and boost_supported global flags with proper entries
  at struct cpufreq_driver.
- Removal of struct cpufreq_boost

 drivers/cpufreq/acpi-cpufreq.c |   86 ++++++++++++++--------------------------
 1 file changed, 29 insertions(+), 57 deletions(-)

diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c
index a1260b4..5ff169f 100644
--- a/drivers/cpufreq/acpi-cpufreq.c
+++ b/drivers/cpufreq/acpi-cpufreq.c
@@ -80,7 +80,6 @@ static struct acpi_processor_performance __percpu *acpi_perf_data;
 static struct cpufreq_driver acpi_cpufreq_driver;
 
 static unsigned int acpi_pstate_strict;
-static bool boost_enabled, boost_supported;
 static struct msr __percpu *msrs;
 
 static bool boost_state(unsigned int cpu)
@@ -133,49 +132,16 @@ static void boost_set_msrs(bool enable, const struct cpumask *cpumask)
 	wrmsr_on_cpus(cpumask, msr_addr, msrs);
 }
 
-static ssize_t _store_boost(const char *buf, size_t count)
+static int _store_boost(int val)
 {
-	int ret;
-	unsigned long val = 0;
-
-	if (!boost_supported)
-		return -EINVAL;
-
-	ret = kstrtoul(buf, 10, &val);
-	if (ret || (val > 1))
-		return -EINVAL;
-
-	if ((val && boost_enabled) || (!val && !boost_enabled))
-		return count;
-
 	get_online_cpus();
-
 	boost_set_msrs(val, cpu_online_mask);
-
 	put_online_cpus();
-
-	boost_enabled = val;
 	pr_debug("Core Boosting %sabled.\n", val ? "en" : "dis");
 
-	return count;
-}
-
-static ssize_t store_global_boost(struct kobject *kobj, struct attribute *attr,
-				  const char *buf, size_t count)
-{
-	return _store_boost(buf, count);
-}
-
-static ssize_t show_global_boost(struct kobject *kobj,
-				 struct attribute *attr, char *buf)
-{
-	return sprintf(buf, "%u\n", boost_enabled);
+	return 0;
 }
 
-static struct global_attr global_boost = __ATTR(boost, 0644,
-						show_global_boost,
-						store_global_boost);
-
 static ssize_t show_freqdomain_cpus(struct cpufreq_policy *policy, char *buf)
 {
 	struct acpi_cpufreq_data *data = per_cpu(acfreq_data, policy->cpu);
@@ -186,15 +152,32 @@ static ssize_t show_freqdomain_cpus(struct cpufreq_policy *policy, char *buf)
 cpufreq_freq_attr_ro(freqdomain_cpus);
 
 #ifdef CONFIG_X86_ACPI_CPUFREQ_CPB
+static ssize_t store_boost(const char *buf, size_t count)
+{
+	int ret;
+	unsigned long val = 0;
+
+	if (!acpi_cpufreq_driver.boost_supported)
+		return -EINVAL;
+
+	ret = kstrtoul(buf, 10, &val);
+	if (ret || (val > 1))
+		return -EINVAL;
+
+	_store_boost((int) val);
+
+	return count;
+}
+
 static ssize_t store_cpb(struct cpufreq_policy *policy, const char *buf,
 			 size_t count)
 {
-	return _store_boost(buf, count);
+	return store_boost(buf, count);
 }
 
 static ssize_t show_cpb(struct cpufreq_policy *policy, char *buf)
 {
-	return sprintf(buf, "%u\n", boost_enabled);
+	return sprintf(buf, "%u\n", acpi_cpufreq_driver.boost_enabled);
 }
 
 cpufreq_freq_attr_rw(cpb);
@@ -582,7 +565,7 @@ static int boost_notify(struct notifier_block *nb, unsigned long action,
 	switch (action) {
 	case CPU_UP_PREPARE:
 	case CPU_UP_PREPARE_FROZEN:
-		boost_set_msrs(boost_enabled, cpumask);
+		boost_set_msrs(acpi_cpufreq_driver.boost_enabled, cpumask);
 		break;
 
 	case CPU_DOWN_PREPARE:
@@ -937,6 +920,7 @@ static struct cpufreq_driver acpi_cpufreq_driver = {
 	.resume		= acpi_cpufreq_resume,
 	.name		= "acpi-cpufreq",
 	.attr		= acpi_cpufreq_attr,
+	.set_boost      = _store_boost,
 };
 
 static void __init acpi_cpufreq_boost_init(void)
@@ -947,33 +931,22 @@ static void __init acpi_cpufreq_boost_init(void)
 		if (!msrs)
 			return;
 
-		boost_supported = true;
-		boost_enabled = boost_state(0);
-
+		acpi_cpufreq_driver.boost_supported = true;
+		acpi_cpufreq_driver.boost_enabled = boost_state(0);
 		get_online_cpus();
 
 		/* Force all MSRs to the same value */
-		boost_set_msrs(boost_enabled, cpu_online_mask);
+		boost_set_msrs(acpi_cpufreq_driver.boost_enabled,
+			       cpu_online_mask);
 
 		register_cpu_notifier(&boost_nb);
 
 		put_online_cpus();
-	} else
-		global_boost.attr.mode = 0444;
-
-	/* We create the boost file in any case, though for systems without
-	 * hardware support it will be read-only and hardwired to return 0.
-	 */
-	if (cpufreq_sysfs_create_file(&(global_boost.attr)))
-		pr_warn(PFX "could not register global boost sysfs file\n");
-	else
-		pr_debug("registered global boost sysfs file\n");
+	}
 }
 
 static void __exit acpi_cpufreq_boost_exit(void)
 {
-	cpufreq_sysfs_remove_file(&(global_boost.attr));
-
 	if (msrs) {
 		unregister_cpu_notifier(&boost_nb);
 
@@ -1015,12 +988,11 @@ static int __init acpi_cpufreq_init(void)
 			*iter = &cpb;
 	}
 #endif
+	acpi_cpufreq_boost_init();
 
 	ret = cpufreq_register_driver(&acpi_cpufreq_driver);
 	if (ret)
 		free_acpi_perf_data();
-	else
-		acpi_cpufreq_boost_init();
 
 	return ret;
 }
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH RESEND v8 3/7] thermal:boost: Automatic enable/disable of BOOST feature
  2013-09-20 16:00 ` [PATCH RESEND v8 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
  2013-09-20 16:00   ` [PATCH RESEND v8 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
  2013-09-20 16:00   ` [PATCH RESEND v8 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
@ 2013-09-20 16:01   ` Lukasz Majewski
  2013-09-20 16:01   ` [PATCH RESEND v8 4/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
                     ` (3 subsequent siblings)
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-09-20 16:01 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Myungjoo Ham, durgadoss.r

This patch provides auto disable/enable operation for boost. When any
defined trip point is passed, the boost is disabled.
In that moment thermal monitor workqueue is woken up and it monitors
if the device temperature drops below 75% of the smallest trip point.
When device cools down, the boost is enabled again.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v8:
- Move cpufreq_boost_* stub functions definition (needed when cpufreq
  is not compiled in) to cpufreq.h at cpufreq core support commit

Changes for v7:
- None

Changes for v6:
- Disable boost only when supported and enabled
- Protect boost related thermal_zone_device struct fields with mutex
- Evaluate temperature trend during boost enable decision
- Create separate methods to handle boost enable/disable
  (thermal_boost_{enable|disable}) operations
- Boost is disabled at any trip point passage (not only the non critical one)
- Add stub definitions for cpufreq boost functions used when
  CONFIG_CPU_FREQ is NOT defined.

Changes for v5:
- Move boost disable code from cpu_cooling.c to thermal_core.c
  (to handle_non_critical_trips)
- Extent struct thermal_zone_device by adding overheated bool flag
- Implement auto enable of boost after device cools down
- Introduce boost_polling flag, which indicates if thermal uses it's predefined
  pool delay or has woken up thermal workqueue only to wait until device
  cools down.

Changes for v4:
- New patch

 drivers/thermal/thermal_core.c |   55 ++++++++++++++++++++++++++++++++++++++++
 include/linux/thermal.h        |    2 ++
 2 files changed, 57 insertions(+)

diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
index 1f02e8e..8f4be55 100644
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -34,6 +34,7 @@
 #include <linux/thermal.h>
 #include <linux/reboot.h>
 #include <linux/string.h>
+#include <linux/cpufreq.h>
 #include <net/netlink.h>
 #include <net/genetlink.h>
 
@@ -354,9 +355,59 @@ static void handle_critical_trips(struct thermal_zone_device *tz,
 	}
 }
 
+static int thermal_boost_enable(struct thermal_zone_device *tz)
+{
+	enum thermal_trend trend = get_tz_trend(tz, 0);
+	long trip_temp;
+
+	if (!tz->ops->get_trip_temp || !tz->overheated)
+		return -EPERM;
+	if (trend == THERMAL_TREND_RAISING || trend == THERMAL_TREND_RAISE_FULL)
+		return -EBUSY;
+
+	tz->ops->get_trip_temp(tz, 0, &trip_temp);
+	/*
+	 * Enable boost again only when current temperature is less
+	 * than 75% of trip_temp[0]
+	 */
+	if ((tz->temperature + (trip_temp >> 2)) < trip_temp) {
+		mutex_lock(&tz->lock);
+		tz->overheated = false;
+		if (tz->boost_polling) {
+			tz->boost_polling = false;
+			tz->polling_delay = 0;
+		}
+		mutex_unlock(&tz->lock);
+		cpufreq_boost_trigger_state(1);
+		return 0;
+	}
+	return -EBUSY;
+}
+
+static void thermal_boost_disable(struct thermal_zone_device *tz)
+{
+	cpufreq_boost_trigger_state(0);
+
+	/*
+	 * If no workqueue for monitoring is running - start one with
+	 * 1000 ms monitoring period
+	 * If workqueue already running - do not change its period and only
+	 * test if target CPU has cooled down
+	 */
+	mutex_lock(&tz->lock);
+	if (!tz->polling_delay) {
+		tz->boost_polling = true;
+		tz->polling_delay = 1000;
+	}
+	tz->overheated = true;
+	mutex_unlock(&tz->lock);
+}
+
 static void handle_thermal_trip(struct thermal_zone_device *tz, int trip)
 {
 	enum thermal_trip_type type;
+	if (cpufreq_boost_supported() && cpufreq_boost_enabled())
+		thermal_boost_disable(tz);
 
 	tz->ops->get_trip_type(tz, trip, &type);
 
@@ -455,6 +506,10 @@ static void thermal_zone_device_check(struct work_struct *work)
 	struct thermal_zone_device *tz = container_of(work, struct
 						      thermal_zone_device,
 						      poll_queue.work);
+	if (cpufreq_boost_supported())
+		if (!thermal_boost_enable(tz))
+			return;
+
 	thermal_zone_device_update(tz);
 }
 
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index a386a1c..f1aa3c2 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -172,6 +172,8 @@ struct thermal_zone_device {
 	int emul_temperature;
 	int passive;
 	unsigned int forced_passive;
+	bool overheated;
+	bool boost_polling;
 	const struct thermal_zone_device_ops *ops;
 	const struct thermal_zone_params *tzp;
 	struct thermal_governor *governor;
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH RESEND v8 4/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST
  2013-09-20 16:00 ` [PATCH RESEND v8 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                     ` (2 preceding siblings ...)
  2013-09-20 16:01   ` [PATCH RESEND v8 3/7] thermal:boost: Automatic enable/disable of BOOST feature Lukasz Majewski
@ 2013-09-20 16:01   ` Lukasz Majewski
  2013-09-20 16:01   ` [PATCH RESEND v8 5/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
                     ` (2 subsequent siblings)
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-09-20 16:01 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Myungjoo Ham, durgadoss.r

For safety reasons new flag - CONFIG_CPU_FREQ_BOOST_SW has been added.
Only after selecting "EXYNOS Frequency Overclocking - Software" Kconfig
option the software managed boost is enabled. It also selects thermal
subsystem to be compiled in. Thermal is necessary for disabling boost
and cooling down the device when overheating detected.

Boost _MUST_NOT_ work without thermal subsystem with properly defined
overheating temperatures.

This option doesn't affect x86's ACPI hardware managed boost support
(i.e. Intel, AMD). In this situation boost management is embedded at
hardware.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v8:
- None

Changes for v7:
- Remove superfluous "default n" definition
- Generic CPU_FREQ_BOOST_SW depends on THERMAL

Changes for v6:
- CPU_FREQ_BOOST_SW [1] is now defined as "invisible" bool option.
- Platform dependent ARM_EXYNOS_CPU_FREQ_BOOST_SW config option has been
  added. It depends on ARM_EXYNOS_CPUFREQ options and selects
  EXYNOS_THERMAL with the main boost config [1].

Changes for v5:
- New patch

 drivers/cpufreq/Kconfig     |    4 ++++
 drivers/cpufreq/Kconfig.arm |   15 +++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
index 534fcb8..e3cbf72 100644
--- a/drivers/cpufreq/Kconfig
+++ b/drivers/cpufreq/Kconfig
@@ -23,6 +23,10 @@ config CPU_FREQ_TABLE
 config CPU_FREQ_GOV_COMMON
 	bool
 
+config CPU_FREQ_BOOST_SW
+	bool
+	depends on THERMAL
+
 config CPU_FREQ_STAT
 	tristate "CPU frequency translation statistics"
 	select CPU_FREQ_TABLE
diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm
index 0fa204b..6a6d173 100644
--- a/drivers/cpufreq/Kconfig.arm
+++ b/drivers/cpufreq/Kconfig.arm
@@ -67,6 +67,21 @@ config ARM_EXYNOS5440_CPUFREQ
 
 	  If in doubt, say N.
 
+config ARM_EXYNOS_CPU_FREQ_BOOST_SW
+	bool "EXYNOS Frequency Overclocking - Software"
+	depends on ARM_EXYNOS_CPUFREQ
+	select CPU_FREQ_BOOST_SW
+	select EXYNOS_THERMAL
+	help
+	  This driver supports software managed overclocking (BOOST).
+	  It allows usage of special frequencies for Samsung Exynos
+	  processors if thermal conditions are appropriate.
+
+	  It reguires, for safe operation, thermal framework with properly
+	  defined trip points.
+
+	  If in doubt, say N.
+
 config ARM_HIGHBANK_CPUFREQ
 	tristate "Calxeda Highbank-based"
 	depends on ARCH_HIGHBANK
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH RESEND v8 5/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework
  2013-09-20 16:00 ` [PATCH RESEND v8 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                     ` (3 preceding siblings ...)
  2013-09-20 16:01   ` [PATCH RESEND v8 4/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
@ 2013-09-20 16:01   ` Lukasz Majewski
  2013-09-20 16:01   ` [PATCH RESEND v8 6/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
  2013-09-20 16:01   ` [PATCH RESEND v8 7/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-09-20 16:01 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Myungjoo Ham, durgadoss.r

The cpufreq_driver's boost_supported flag is true only when boost
support is explicitly enabled. Boost related attributes are exported only
under the same condition.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v8:
- None

Changes for v7:
- Replace CONFIG_CPU_FREQ_BOOST_SW with CONFIG_ARM_EXYNOS_CPU_FREQ_BOOST_SW
- Move boost_supported initialization to struct cpufreq_driver exynos_driver

Changes for v6:
- Replace exynos_driver.boost_supported = 1 to = true
- Protect boost attributes export with CONFIG_CPU_FREQ_BOOST_SW

Changes for v5:
- None

Changes for v4:
- None

Changes for v3:
- Remove low level boost code
- Move boost management code to cpufreq core code
- Use boost_supported flag to indicate if driver supports over clocking

Changes for v2:
- Removal of struct cpufreq_boost
- Removal of the CONFIG_CPU_FREQ_BOOST flag
- low_level_boost with valid address when boost is supported

 drivers/cpufreq/exynos-cpufreq.c |    6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/cpufreq/exynos-cpufreq.c b/drivers/cpufreq/exynos-cpufreq.c
index b9f9aee..2786aba 100644
--- a/drivers/cpufreq/exynos-cpufreq.c
+++ b/drivers/cpufreq/exynos-cpufreq.c
@@ -270,6 +270,9 @@ static int exynos_cpufreq_cpu_exit(struct cpufreq_policy *policy)
 
 static struct freq_attr *exynos_cpufreq_attr[] = {
 	&cpufreq_freq_attr_scaling_available_freqs,
+#ifdef CONFIG_ARM_EXYNOS_CPU_FREQ_BOOST_SW
+	&cpufreq_freq_attr_scaling_boost_freqs,
+#endif
 	NULL,
 };
 
@@ -282,6 +285,9 @@ static struct cpufreq_driver exynos_driver = {
 	.exit		= exynos_cpufreq_cpu_exit,
 	.name		= "exynos_cpufreq",
 	.attr		= exynos_cpufreq_attr,
+#ifdef CONFIG_ARM_EXYNOS_CPU_FREQ_BOOST_SW
+	.boost_supported = true,
+#endif
 #ifdef CONFIG_PM
 	.suspend	= exynos_cpufreq_suspend,
 	.resume		= exynos_cpufreq_resume,
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH RESEND v8 6/7] Documentation:cpufreq:boost: Update BOOST documentation
  2013-09-20 16:00 ` [PATCH RESEND v8 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                     ` (4 preceding siblings ...)
  2013-09-20 16:01   ` [PATCH RESEND v8 5/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
@ 2013-09-20 16:01   ` Lukasz Majewski
  2013-09-20 16:01   ` [PATCH RESEND v8 7/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-09-20 16:01 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Myungjoo Ham, durgadoss.r

Since the support for software and hardware controlled boosting has been
added, the corresponding Documentation entry had been updated.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v8:
- None

Changes for v7:
- None

Changes for v6:
- None

Changes for v5:
- New patch

 Documentation/cpu-freq/boost.txt |   26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/Documentation/cpu-freq/boost.txt b/Documentation/cpu-freq/boost.txt
index 9b4edfc..dd62e13 100644
--- a/Documentation/cpu-freq/boost.txt
+++ b/Documentation/cpu-freq/boost.txt
@@ -17,8 +17,8 @@ Introduction
 Some CPUs support a functionality to raise the operating frequency of
 some cores in a multi-core package if certain conditions apply, mostly
 if the whole chip is not fully utilized and below it's intended thermal
-budget. This is done without operating system control by a combination
-of hardware and firmware.
+budget. The decision about boost disable/enable is made either at hardware
+(e.g. x86) or software (e.g ARM).
 On Intel CPUs this is called "Turbo Boost", AMD calls it "Turbo-Core",
 in technical documentation "Core performance boost". In Linux we use
 the term "boost" for convenience.
@@ -48,24 +48,24 @@ be desirable:
 User controlled switch
 ----------------------
 
-To allow the user to toggle the boosting functionality, the acpi-cpufreq
-driver exports a sysfs knob to disable it. There is a file:
+To allow the user to toggle the boosting functionality, the cpufreq core
+driver exports a sysfs knob to enable or disable it. There is a file:
 /sys/devices/system/cpu/cpufreq/boost
 which can either read "0" (boosting disabled) or "1" (boosting enabled).
-Reading the file is always supported, even if the processor does not
-support boosting. In this case the file will be read-only and always
-reads as "0". Explicitly changing the permissions and writing to that
-file anyway will return EINVAL.
+The file is exported only when cpufreq driver supports boosting.
+Explicitly changing the permissions and writing to that file anyway will
+return EINVAL.
 
 On supported CPUs one can write either a "0" or a "1" into this file.
 This will either disable the boost functionality on all cores in the
-whole system (0) or will allow the hardware to boost at will (1).
+whole system (0) or will allow the software or hardware to boost at will
+(1).
 
 Writing a "1" does not explicitly boost the system, but just allows the
-CPU (and the firmware) to boost at their discretion. Some implementations
-take external factors like the chip's temperature into account, so
-boosting once does not necessarily mean that it will occur every time
-even using the exact same software setup.
+CPU to boost at their discretion. Some implementations take external
+factors like the chip's temperature into account, so boosting once does
+not necessarily mean that it will occur every time even using the exact
+same software setup.
 
 
 AMD legacy cpb switch
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH RESEND v8 7/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ
  2013-09-20 16:00 ` [PATCH RESEND v8 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                     ` (5 preceding siblings ...)
  2013-09-20 16:01   ` [PATCH RESEND v8 6/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
@ 2013-09-20 16:01   ` Lukasz Majewski
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-09-20 16:01 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Daniel Lezcano, Myungjoo Ham, durgadoss.r

Special driver data flag (CPUFREQ_BOOST_FREQ) has been added to indicate
frequency, which can be only enabled for BOOST mode.
This frequency shall be used only for limited time, since it might cause
target device to overheat.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v8:
- None

Changes for v7:
- None

Changes for v6:
- New patch

 drivers/cpufreq/exynos4x12-cpufreq.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/cpufreq/exynos4x12-cpufreq.c b/drivers/cpufreq/exynos4x12-cpufreq.c
index e270b42..367f600 100644
--- a/drivers/cpufreq/exynos4x12-cpufreq.c
+++ b/drivers/cpufreq/exynos4x12-cpufreq.c
@@ -32,7 +32,7 @@ static unsigned int exynos4x12_volt_table[] = {
 };
 
 static struct cpufreq_frequency_table exynos4x12_freq_table[] = {
-	{L0, CPUFREQ_ENTRY_INVALID},
+	{CPUFREQ_BOOST_FREQ, 1500 * 1000},
 	{L1, 1400 * 1000},
 	{L2, 1300 * 1000},
 	{L3, 1200 * 1000},
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v9 0/7] cpufreq:boost: CPU Boost mode support
  2013-06-06  7:07 [PATCH 0/5] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                   ` (12 preceding siblings ...)
  2013-09-20 16:00 ` [PATCH RESEND v8 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
@ 2013-10-14 12:17 ` Lukasz Majewski
  2013-10-14 12:17   ` [PATCH v9 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
                     ` (6 more replies)
  2013-11-05 17:26 ` [PATCH v10 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                   ` (3 subsequent siblings)
  17 siblings, 7 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-10-14 12:17 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r

This patch series introduces support for CPU overclocking technique
called Boost.

It is a follow up of a LAB governor proposal. Boost is a LAB component:
http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq

Boost unifies hardware based solution (e.g. Intel Nehalem) with
software oriented one (like the one done at Exynos).
For this reason cpufreq/freq_table code has been reorganized to include
common code.

Important design decisions:
- Boost related code is compiled-in unconditionally to cpufreq core and
  disabled by default. The cpufreq_driver is responsibile for setting
  boost_supported flag and providing set_boost callback(if HW support
  is needed). For software managed boost, special Kconfig flag -
  CONFIG_CPU_FREQ_BOOST_SW has been defined. It will be selected only
  when a target platform has thermal framework properly configured.

- struct cpufreq_driver has been extended with boost related fields:
        -- boost_supported - when driver supports boosting
        -- boost_enabled - boost state
        -- set_boost - callback to function, which is necessary to
           enable/disable boost

- Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost) is visible
  _only_ when cpufreq driver supports Boost.

- No special spin_lock for Boost was created. The one from cpufreq core
  was reused.

- The Boost code doesn't rely on any policy. When boost state is changed,
  then the policy list is iterated and proper adjustements are done.

- To improve safety level, the thermal framework is also extended to disable
  software boosting, when thermal trip point is reached. Then it starts
  monitoring target temperature to evaluate if boost can be enabled
  again. This emulates behaviour similar to HW managed boost (like x86)

Tested at HW:
       Exynos 4412 3.12-rc4 Linux
       Intel Core i7-3770 3.12-rc4 Linux

Above patches were posted on top of kernel_pm/bleeding-edge
(SHA1: d06a5fe3485062acdb5552dffe3a89672e1a439d)


Lukasz Majewski (7):
  cpufreq: Add boost frequency support in core
  cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common
    boost solution
  thermal:boost: Automatic enable/disable of BOOST feature
  cpufreq:boost:Kconfig: Provide support for software managed BOOST
  cpufreq:exynos:Extend Exynos cpufreq driver to support boost
    framework
  Documentation:cpufreq:boost: Update BOOST documentation
  cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ

 Documentation/cpu-freq/boost.txt     |   26 ++++----
 drivers/cpufreq/Kconfig              |    4 ++
 drivers/cpufreq/Kconfig.arm          |   15 +++++
 drivers/cpufreq/acpi-cpufreq.c       |   86 +++++++++----------------
 drivers/cpufreq/cpufreq.c            |  118 +++++++++++++++++++++++++++++++++-
 drivers/cpufreq/exynos-cpufreq.c     |    3 +
 drivers/cpufreq/exynos4x12-cpufreq.c |    2 +-
 drivers/cpufreq/freq_table.c         |   56 ++++++++++++++--
 drivers/thermal/thermal_core.c       |   55 ++++++++++++++++
 include/linux/cpufreq.h              |   24 +++++++
 include/linux/thermal.h              |    2 +
 11 files changed, 312 insertions(+), 79 deletions(-)

-- 
1.7.10.4


^ permalink raw reply	[flat|nested] 329+ messages in thread

* [PATCH v9 1/7] cpufreq: Add boost frequency support in core
  2013-10-14 12:17 ` [PATCH v9 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
@ 2013-10-14 12:17   ` Lukasz Majewski
  2013-10-14 12:17   ` [PATCH v9 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
                     ` (5 subsequent siblings)
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-10-14 12:17 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r

This commit adds boost frequency support in cpufreq core (Hardware &
Software). Some SoCs (like Exynos4 - e.g. 4x12) allow setting frequency
above its normal operation limits. Such mode shall be only used for a
short time.

Overclocking (boost) support is essentially provided by platform
dependent cpufreq driver.

This commit unifies support for SW and HW (Intel) overclocking solutions
in the core cpufreq driver. Previously the "boost" sysfs attribute was
defined at acpi driver code. By default boost is disabled. One global
attribute is available at: /sys/devices/system/cpu/cpufreq/boost.

It only shows up when cpufreq driver supports overclocking.
Under the hood frequencies dedicated for boosting are marked with a
special flag (CPUFREQ_BOOST_FREQ) at driver's frequency table.
It is the user's concern to enable/disable overclocking with a proper call
to sysfs.

The cpufreq_boost_trigger_state() function is defined non static on purpose.
It is used later with thermal subsystem to provide automatic enable/disable
of the BOOST feature.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v9:
- Add cpufreq_freq_attr_scaling_boost_freqs to *cpufreq_generic_attr table
- Introduce CONFIG_CPU_FREQ_BOOST_SW generic config flag to show BOOST
  frequencies only when cpufreq driver supports boost

Changes for v8:
- Correction of error message at cpufreq_boost_trigger_state() function
- Rewrite the cpufreq_boost_set_sw() function to print error message and
  break the loop when policy adjustment fails

Changes for v7:
- Properly change cpufreq_driver->boost_enabled when set_boost() fails
  (=0 to =!state)
- Add likely() around cpufreq_driver
- Remove parenthesis around boost.attr

Changes for v6:
- Remove sysfs boost attribute when subsys_iterface_unregister() fails
- Move global boost_enabled variable from cpufreq.c to platform dependent
  struct cpufreq_driver
- pr_err() message is also printed when boost disable fails
- Call __cpufreq_governor() to force recalculation of next frequency when
  boost is triggered. It is needed with i.e. performance class of governors
- Change cpufreq_boost_enable_sw() -> cpufreq_boost_set_sw()
- Rename .enable_boost function pointer to .set_boost

Changes for v5:
- Rename cpufreq_boost_trigger_state_sw() to cpufreq_boost_enable_sw()
- Extent cpufreq_register_driver() to check if cpufreq driver provided
  boost_enable callback. If not provided, then use cpufreq_boost_enable_sw()
- Use single call to cpufreq_driver->enable_boost() with cpufreq driver
  provided callback or default SW boost enable routine
- Move pr_debug call to store_boost() from cpufreq_boost_trigger_state()
- Change the user_policy.max value when SW boost is toggled. It is necessary
  for proper operation of e.g. thermal subsystem.
- Add check if cpufreq_driver pointer is not NULL at
  cpufreq_boost_supported() routine
- Add EXPORT_SYMBOL_GPL for cpufreq_boost_supported() and
  cpufreq_boost_enabled()
- Remove extra check for cpufreq_boost_supported() at
  cpufreq_freq_table_cpuinfo()
- Explanation of show boost logic at show_available_freqs()
- Add cpufreq_set_boost_enabled() method to set initial value of boost_enabled
  global flag

Changes for v4:
- Remove boost parameter from cpufreq_frequency_table_cpuinfo() function
- Introduce cpufreq_boost_supported() method
- Use of cpufreq_boost_supported() and cpufreq_boost_enabled() to decide
  if frequency shall be skipped
- Rename set_boost_freq() to enable_boost()
- cpufreq_attr_available_freq() moved to freq_table.c
- Use policy list to get access to cpufreq policies
- Rename global boost flag (cpufreq_boost_enabled -> boost_enabled)
- pr_err corrected ( %sable)
- Remove sanity check at cpufreq_boost_trigger_state() entrance [to test if
  boost is supported]
- Use either HW (boost_enable) callback or SW managed boost
- Introduce new cpufreq_boost_trigger_state_sw() method to handle boost
  at SW.
- Protect boost_enabled manipulation with lock.

Changes for v3:
- Method for reading boost status
- Removal of cpufreq_frequency_table_max()
- Extent cpufreq_frequency_table_cpuinfo() to support boost parameter
- boost_supported flag added to cpufreq_driver struct
- "boost" sysfs attribute control flag removed
- One global flag describing state of the boost defined at cpufreq core
- Rename cpufreq_driver's low_level_boost field to set_boost_freq()
- Usage of cpufreq_sysfs_{remove|add}_file() routines

Changes for v2:
- Removal of cpufreq_boost structure and move its fields to cpufreq_driver
  structure
- Flag to indicate if global boost attribute is already defined
- Extent the pr_{err|debbug} functions to show current function names

 drivers/cpufreq/cpufreq.c    |  118 +++++++++++++++++++++++++++++++++++++++++-
 drivers/cpufreq/freq_table.c |   56 +++++++++++++++++---
 include/linux/cpufreq.h      |   24 +++++++++
 3 files changed, 190 insertions(+), 8 deletions(-)

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 8a3914b..9be28eb 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -319,6 +319,33 @@ EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
 /*********************************************************************
  *                          SYSFS INTERFACE                          *
  *********************************************************************/
+ssize_t show_boost(struct kobject *kobj,
+				 struct attribute *attr, char *buf)
+{
+	return sprintf(buf, "%d\n", cpufreq_driver->boost_enabled);
+}
+
+static ssize_t store_boost(struct kobject *kobj, struct attribute *attr,
+				  const char *buf, size_t count)
+{
+	int ret, enable;
+
+	ret = sscanf(buf, "%d", &enable);
+	if (ret != 1 || enable < 0 || enable > 1)
+		return -EINVAL;
+
+	if (cpufreq_boost_trigger_state(enable)) {
+		pr_err("%s: Cannot %s BOOST!\n", __func__,
+		       enable ? "enable" : "disable");
+		return -EINVAL;
+	}
+
+	pr_debug("%s: cpufreq BOOST %s\n", __func__,
+		 enable ? "enabled" : "disabled");
+
+	return count;
+}
+define_one_global_rw(boost);
 
 static struct cpufreq_governor *__find_governor(const char *str_governor)
 {
@@ -2038,6 +2065,73 @@ static struct notifier_block __refdata cpufreq_cpu_notifier = {
 };
 
 /*********************************************************************
+ *               BOOST						     *
+ *********************************************************************/
+static int cpufreq_boost_set_sw(int state)
+{
+	struct cpufreq_frequency_table *freq_table;
+	struct cpufreq_policy *policy;
+	int ret = -EINVAL;
+
+	list_for_each_entry(policy, &cpufreq_policy_list, policy_list) {
+		freq_table = cpufreq_frequency_get_table(policy->cpu);
+		if (freq_table) {
+			ret = cpufreq_frequency_table_cpuinfo(policy,
+							freq_table);
+			if (ret) {
+				pr_err("%s: Policy frequency update failed\n",
+				       __func__);
+				break;
+			}
+			policy->user_policy.max = policy->max;
+			__cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
+		}
+	}
+
+	return ret;
+}
+
+int cpufreq_boost_trigger_state(int state)
+{
+	unsigned long flags;
+	int ret = 0;
+
+	if (cpufreq_driver->boost_enabled == state)
+		return 0;
+
+	write_lock_irqsave(&cpufreq_driver_lock, flags);
+	cpufreq_driver->boost_enabled = state;
+	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
+
+	ret = cpufreq_driver->set_boost(state);
+	if (ret) {
+		write_lock_irqsave(&cpufreq_driver_lock, flags);
+		cpufreq_driver->boost_enabled = !state;
+		write_unlock_irqrestore(&cpufreq_driver_lock, flags);
+
+		pr_err("%s: Cannot %s BOOST\n", __func__,
+		       state ? "enable" : "disable");
+	}
+
+	return ret;
+}
+
+int cpufreq_boost_supported(void)
+{
+	if (likely(cpufreq_driver))
+		return cpufreq_driver->boost_supported;
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(cpufreq_boost_supported);
+
+int cpufreq_boost_enabled(void)
+{
+	return cpufreq_driver->boost_enabled;
+}
+EXPORT_SYMBOL_GPL(cpufreq_boost_enabled);
+
+/*********************************************************************
  *               REGISTER / UNREGISTER CPUFREQ DRIVER                *
  *********************************************************************/
 
@@ -2076,9 +2170,25 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 	cpufreq_driver = driver_data;
 	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
 
+	if (cpufreq_boost_supported()) {
+		/*
+		 * Check if driver provides function to enable boost -
+		 * if not, use cpufreq_boost_set_sw as default
+		 */
+		if (!cpufreq_driver->set_boost)
+			cpufreq_driver->set_boost = cpufreq_boost_set_sw;
+
+		ret = cpufreq_sysfs_create_file(&boost.attr);
+		if (ret) {
+			pr_err("%s: cannot register global BOOST sysfs file\n",
+				__func__);
+			goto err_null_driver;
+		}
+	}
+
 	ret = subsys_interface_register(&cpufreq_interface);
 	if (ret)
-		goto err_null_driver;
+		goto err_boost_unreg;
 
 	if (!(cpufreq_driver->flags & CPUFREQ_STICKY)) {
 		int i;
@@ -2105,6 +2215,9 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 	return 0;
 err_if_unreg:
 	subsys_interface_unregister(&cpufreq_interface);
+err_boost_unreg:
+	if (cpufreq_boost_supported())
+		cpufreq_sysfs_remove_file(&boost.attr);
 err_null_driver:
 	write_lock_irqsave(&cpufreq_driver_lock, flags);
 	cpufreq_driver = NULL;
@@ -2131,6 +2244,9 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
 	pr_debug("unregistering driver %s\n", driver->name);
 
 	subsys_interface_unregister(&cpufreq_interface);
+	if (cpufreq_boost_supported())
+		cpufreq_sysfs_remove_file(&boost.attr);
+
 	unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
 
 	down_write(&cpufreq_rwsem);
diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c
index 3458d27..776e88a 100644
--- a/drivers/cpufreq/freq_table.c
+++ b/drivers/cpufreq/freq_table.c
@@ -32,6 +32,10 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
 
 			continue;
 		}
+		if (!cpufreq_boost_enabled()
+		    && table[i].driver_data == CPUFREQ_BOOST_FREQ)
+			continue;
+
 		pr_debug("table entry %u: %u kHz, %u driver_data\n",
 					i, freq, table[i].driver_data);
 		if (freq < min_freq)
@@ -182,7 +186,8 @@ static DEFINE_PER_CPU(struct cpufreq_frequency_table *, cpufreq_show_table);
 /**
  * show_available_freqs - show available frequencies for the specified CPU
  */
-static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
+static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf,
+				    bool show_boost)
 {
 	unsigned int i = 0;
 	unsigned int cpu = policy->cpu;
@@ -197,6 +202,20 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
 	for (i = 0; (table[i].frequency != CPUFREQ_TABLE_END); i++) {
 		if (table[i].frequency == CPUFREQ_ENTRY_INVALID)
 			continue;
+		/*
+		 * show_boost = true and driver_data = BOOST freq
+		 * display BOOST freqs
+		 *
+		 * show_boost = false and driver_data = BOOST freq
+		 * show_boost = true and driver_data != BOOST freq
+		 * continue - do not display anything
+		 *
+		 * show_boost = false and driver_data != BOOST freq
+		 * display NON BOOST freqs
+		 */
+		if (show_boost ^ (table[i].driver_data == CPUFREQ_BOOST_FREQ))
+			continue;
+
 		count += sprintf(&buf[count], "%d ", table[i].frequency);
 	}
 	count += sprintf(&buf[count], "\n");
@@ -205,16 +224,39 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
 
 }
 
-struct freq_attr cpufreq_freq_attr_scaling_available_freqs = {
-	.attr = { .name = "scaling_available_frequencies",
-		  .mode = 0444,
-		},
-	.show = show_available_freqs,
-};
+#define cpufreq_attr_available_freq(_name)	  \
+struct freq_attr cpufreq_freq_attr_##_name##_freqs =     \
+__ATTR_RO(_name##_frequencies)
+
+/**
+ * show_scaling_available_frequencies - show available normal frequencies for
+ * the specified CPU
+ */
+static ssize_t scaling_available_frequencies_show(struct cpufreq_policy *policy,
+						  char *buf)
+{
+	return show_available_freqs(policy, buf, false);
+}
+cpufreq_attr_available_freq(scaling_available);
 EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_available_freqs);
 
+/**
+ * show_available_boost_freqs - show available boost frequencies for
+ * the specified CPU
+ */
+static ssize_t scaling_boost_frequencies_show(struct cpufreq_policy *policy,
+					      char *buf)
+{
+	return show_available_freqs(policy, buf, true);
+}
+cpufreq_attr_available_freq(scaling_boost);
+EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_boost_freqs);
+
 struct freq_attr *cpufreq_generic_attr[] = {
 	&cpufreq_freq_attr_scaling_available_freqs,
+#ifdef CONFIG_CPU_FREQ_BOOST_SW
+	&cpufreq_freq_attr_scaling_boost_freqs,
+#endif
 	NULL,
 };
 EXPORT_SYMBOL_GPL(cpufreq_generic_attr);
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index 6b457d0..0e3ca20 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -215,6 +215,11 @@ struct cpufreq_driver {
 	int	(*suspend)	(struct cpufreq_policy *policy);
 	int	(*resume)	(struct cpufreq_policy *policy);
 	struct freq_attr	**attr;
+
+	/* platform specific boost support code */
+	bool                    boost_supported;
+	bool                    boost_enabled;
+	int     (*set_boost)    (int state);
 };
 
 /* flags */
@@ -403,6 +408,7 @@ extern struct cpufreq_governor cpufreq_gov_conservative;
 
 #define CPUFREQ_ENTRY_INVALID ~0
 #define CPUFREQ_TABLE_END     ~1
+#define CPUFREQ_BOOST_FREQ    ~2
 
 struct cpufreq_frequency_table {
 	unsigned int	driver_data; /* driver specific data, not used by core */
@@ -426,6 +432,24 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
 void cpufreq_frequency_table_update_policy_cpu(struct cpufreq_policy *policy);
 ssize_t cpufreq_show_cpus(const struct cpumask *mask, char *buf);
 
+#ifdef CONFIG_CPU_FREQ
+int cpufreq_boost_trigger_state(int state);
+int cpufreq_boost_supported(void);
+int cpufreq_boost_enabled(void);
+#else
+static inline int cpufreq_boost_trigger_state(int state)
+{
+	return 0;
+}
+static inline int cpufreq_boost_supported(void)
+{
+	return 0;
+}
+static inline int cpufreq_boost_enabled(void)
+{
+	return 0;
+}
+#endif
 /* the following funtion is for cpufreq core use only */
 struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu);
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v9 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution
  2013-10-14 12:17 ` [PATCH v9 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
  2013-10-14 12:17   ` [PATCH v9 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
@ 2013-10-14 12:17   ` Lukasz Majewski
  2013-10-14 12:17   ` [PATCH v9 3/7] thermal:boost: Automatic enable/disable of BOOST feature Lukasz Majewski
                     ` (4 subsequent siblings)
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-10-14 12:17 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r

The Intel's hardware based boost solution driver has been changed to cooperate with
common cpufreq boost framework.

The global sysfs boost attribute entry code (/sys/devices/system/cpu/cpufreq/boost)
has been moved to a core cpufreq code. This attribute is now only visible,
when cpufreq driver supports it.

The _store_boost() function has been redesigned to be used as set_boost
callback.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v9:
- None

Changes for v8:
- None

Changes for v7:
- Remove superfluous acpi_cpufreq_driver.boost_supported = false at
  acpi_cpufreq_boost_init()

Changes for v6:
- Perform acpi_cpufreq_boost_init initialization before cpufreq_driver
  registration
- Compile store_boost() only when CONFIG_X86_ACPI_CPUFREQ_CPB defined
- Use boost_enabled flag defined at acpi_cpufreq_driver to store information
  about boost state
- Instead of using cpufreq_set_boost_enabled(), modify the boost_enable in
  the acpi driver code

Changes for v5:
- Remove acpi-cpufreq's boost_enabled global flag and reuse one defined at
  cpufreq core

Changes for v4:
- add _store_boost to acpi_cpufreq_driver structure

Changes for v3:
- Bring back boost_enabled as a global flag
- Move boost_supported to cpufreq_driver structure

Changes for v2:
- Replace boost_enabled and boost_supported global flags with proper entries
  at struct cpufreq_driver.
- Removal of struct cpufreq_boost

 drivers/cpufreq/acpi-cpufreq.c |   86 ++++++++++++++--------------------------
 1 file changed, 29 insertions(+), 57 deletions(-)

diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c
index a8dac7b..6a92530 100644
--- a/drivers/cpufreq/acpi-cpufreq.c
+++ b/drivers/cpufreq/acpi-cpufreq.c
@@ -80,7 +80,6 @@ static struct acpi_processor_performance __percpu *acpi_perf_data;
 static struct cpufreq_driver acpi_cpufreq_driver;
 
 static unsigned int acpi_pstate_strict;
-static bool boost_enabled, boost_supported;
 static struct msr __percpu *msrs;
 
 static bool boost_state(unsigned int cpu)
@@ -133,49 +132,16 @@ static void boost_set_msrs(bool enable, const struct cpumask *cpumask)
 	wrmsr_on_cpus(cpumask, msr_addr, msrs);
 }
 
-static ssize_t _store_boost(const char *buf, size_t count)
+static int _store_boost(int val)
 {
-	int ret;
-	unsigned long val = 0;
-
-	if (!boost_supported)
-		return -EINVAL;
-
-	ret = kstrtoul(buf, 10, &val);
-	if (ret || (val > 1))
-		return -EINVAL;
-
-	if ((val && boost_enabled) || (!val && !boost_enabled))
-		return count;
-
 	get_online_cpus();
-
 	boost_set_msrs(val, cpu_online_mask);
-
 	put_online_cpus();
-
-	boost_enabled = val;
 	pr_debug("Core Boosting %sabled.\n", val ? "en" : "dis");
 
-	return count;
-}
-
-static ssize_t store_global_boost(struct kobject *kobj, struct attribute *attr,
-				  const char *buf, size_t count)
-{
-	return _store_boost(buf, count);
-}
-
-static ssize_t show_global_boost(struct kobject *kobj,
-				 struct attribute *attr, char *buf)
-{
-	return sprintf(buf, "%u\n", boost_enabled);
+	return 0;
 }
 
-static struct global_attr global_boost = __ATTR(boost, 0644,
-						show_global_boost,
-						store_global_boost);
-
 static ssize_t show_freqdomain_cpus(struct cpufreq_policy *policy, char *buf)
 {
 	struct acpi_cpufreq_data *data = per_cpu(acfreq_data, policy->cpu);
@@ -186,15 +152,32 @@ static ssize_t show_freqdomain_cpus(struct cpufreq_policy *policy, char *buf)
 cpufreq_freq_attr_ro(freqdomain_cpus);
 
 #ifdef CONFIG_X86_ACPI_CPUFREQ_CPB
+static ssize_t store_boost(const char *buf, size_t count)
+{
+	int ret;
+	unsigned long val = 0;
+
+	if (!acpi_cpufreq_driver.boost_supported)
+		return -EINVAL;
+
+	ret = kstrtoul(buf, 10, &val);
+	if (ret || (val > 1))
+		return -EINVAL;
+
+	_store_boost((int) val);
+
+	return count;
+}
+
 static ssize_t store_cpb(struct cpufreq_policy *policy, const char *buf,
 			 size_t count)
 {
-	return _store_boost(buf, count);
+	return store_boost(buf, count);
 }
 
 static ssize_t show_cpb(struct cpufreq_policy *policy, char *buf)
 {
-	return sprintf(buf, "%u\n", boost_enabled);
+	return sprintf(buf, "%u\n", acpi_cpufreq_driver.boost_enabled);
 }
 
 cpufreq_freq_attr_rw(cpb);
@@ -573,7 +556,7 @@ static int boost_notify(struct notifier_block *nb, unsigned long action,
 	switch (action) {
 	case CPU_UP_PREPARE:
 	case CPU_UP_PREPARE_FROZEN:
-		boost_set_msrs(boost_enabled, cpumask);
+		boost_set_msrs(acpi_cpufreq_driver.boost_enabled, cpumask);
 		break;
 
 	case CPU_DOWN_PREPARE:
@@ -925,6 +908,7 @@ static struct cpufreq_driver acpi_cpufreq_driver = {
 	.resume		= acpi_cpufreq_resume,
 	.name		= "acpi-cpufreq",
 	.attr		= acpi_cpufreq_attr,
+	.set_boost      = _store_boost,
 };
 
 static void __init acpi_cpufreq_boost_init(void)
@@ -935,33 +919,22 @@ static void __init acpi_cpufreq_boost_init(void)
 		if (!msrs)
 			return;
 
-		boost_supported = true;
-		boost_enabled = boost_state(0);
-
+		acpi_cpufreq_driver.boost_supported = true;
+		acpi_cpufreq_driver.boost_enabled = boost_state(0);
 		get_online_cpus();
 
 		/* Force all MSRs to the same value */
-		boost_set_msrs(boost_enabled, cpu_online_mask);
+		boost_set_msrs(acpi_cpufreq_driver.boost_enabled,
+			       cpu_online_mask);
 
 		register_cpu_notifier(&boost_nb);
 
 		put_online_cpus();
-	} else
-		global_boost.attr.mode = 0444;
-
-	/* We create the boost file in any case, though for systems without
-	 * hardware support it will be read-only and hardwired to return 0.
-	 */
-	if (cpufreq_sysfs_create_file(&(global_boost.attr)))
-		pr_warn(PFX "could not register global boost sysfs file\n");
-	else
-		pr_debug("registered global boost sysfs file\n");
+	}
 }
 
 static void __exit acpi_cpufreq_boost_exit(void)
 {
-	cpufreq_sysfs_remove_file(&(global_boost.attr));
-
 	if (msrs) {
 		unregister_cpu_notifier(&boost_nb);
 
@@ -1007,12 +980,11 @@ static int __init acpi_cpufreq_init(void)
 			*iter = &cpb;
 	}
 #endif
+	acpi_cpufreq_boost_init();
 
 	ret = cpufreq_register_driver(&acpi_cpufreq_driver);
 	if (ret)
 		free_acpi_perf_data();
-	else
-		acpi_cpufreq_boost_init();
 
 	return ret;
 }
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v9 3/7] thermal:boost: Automatic enable/disable of BOOST feature
  2013-10-14 12:17 ` [PATCH v9 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
  2013-10-14 12:17   ` [PATCH v9 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
  2013-10-14 12:17   ` [PATCH v9 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
@ 2013-10-14 12:17   ` Lukasz Majewski
  2013-10-15  9:32     ` Zhang Rui
  2013-10-14 12:17   ` [PATCH v9 4/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
                     ` (3 subsequent siblings)
  6 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-10-14 12:17 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r

This patch provides auto disable/enable operation for boost. When any
defined trip point is passed, the boost is disabled.
In that moment thermal monitor workqueue is woken up and it monitors
if the device temperature drops below 75% of the smallest trip point.
When device cools down, the boost is enabled again.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v9:
- None

Changes for v8:
- Move cpufreq_boost_* stub functions definition (needed when cpufreq
  is not compiled in) to cpufreq.h at cpufreq core support commit

Changes for v7:
- None

Changes for v6:
- Disable boost only when supported and enabled
- Protect boost related thermal_zone_device struct fields with mutex
- Evaluate temperature trend during boost enable decision
- Create separate methods to handle boost enable/disable
  (thermal_boost_{enable|disable}) operations
- Boost is disabled at any trip point passage (not only the non critical one)
- Add stub definitions for cpufreq boost functions used when
  CONFIG_CPU_FREQ is NOT defined.

Changes for v5:
- Move boost disable code from cpu_cooling.c to thermal_core.c
  (to handle_non_critical_trips)
- Extent struct thermal_zone_device by adding overheated bool flag
- Implement auto enable of boost after device cools down
- Introduce boost_polling flag, which indicates if thermal uses it's predefined
  pool delay or has woken up thermal workqueue only to wait until device
  cools down.

Changes for v4:
- New patch

 drivers/thermal/thermal_core.c |   55 ++++++++++++++++++++++++++++++++++++++++
 include/linux/thermal.h        |    2 ++
 2 files changed, 57 insertions(+)

diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
index 4962a6a..a167ab9 100644
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -34,6 +34,7 @@
 #include <linux/thermal.h>
 #include <linux/reboot.h>
 #include <linux/string.h>
+#include <linux/cpufreq.h>
 #include <net/netlink.h>
 #include <net/genetlink.h>
 
@@ -366,9 +367,59 @@ static void handle_critical_trips(struct thermal_zone_device *tz,
 	}
 }
 
+static int thermal_boost_enable(struct thermal_zone_device *tz)
+{
+	enum thermal_trend trend = get_tz_trend(tz, 0);
+	long trip_temp;
+
+	if (!tz->ops->get_trip_temp || !tz->overheated)
+		return -EPERM;
+	if (trend == THERMAL_TREND_RAISING || trend == THERMAL_TREND_RAISE_FULL)
+		return -EBUSY;
+
+	tz->ops->get_trip_temp(tz, 0, &trip_temp);
+	/*
+	 * Enable boost again only when current temperature is less
+	 * than 75% of trip_temp[0]
+	 */
+	if ((tz->temperature + (trip_temp >> 2)) < trip_temp) {
+		mutex_lock(&tz->lock);
+		tz->overheated = false;
+		if (tz->boost_polling) {
+			tz->boost_polling = false;
+			tz->polling_delay = 0;
+		}
+		mutex_unlock(&tz->lock);
+		cpufreq_boost_trigger_state(1);
+		return 0;
+	}
+	return -EBUSY;
+}
+
+static void thermal_boost_disable(struct thermal_zone_device *tz)
+{
+	cpufreq_boost_trigger_state(0);
+
+	/*
+	 * If no workqueue for monitoring is running - start one with
+	 * 1000 ms monitoring period
+	 * If workqueue already running - do not change its period and only
+	 * test if target CPU has cooled down
+	 */
+	mutex_lock(&tz->lock);
+	if (!tz->polling_delay) {
+		tz->boost_polling = true;
+		tz->polling_delay = 1000;
+	}
+	tz->overheated = true;
+	mutex_unlock(&tz->lock);
+}
+
 static void handle_thermal_trip(struct thermal_zone_device *tz, int trip)
 {
 	enum thermal_trip_type type;
+	if (cpufreq_boost_supported() && cpufreq_boost_enabled())
+		thermal_boost_disable(tz);
 
 	tz->ops->get_trip_type(tz, trip, &type);
 
@@ -467,6 +518,10 @@ static void thermal_zone_device_check(struct work_struct *work)
 	struct thermal_zone_device *tz = container_of(work, struct
 						      thermal_zone_device,
 						      poll_queue.work);
+	if (cpufreq_boost_supported())
+		if (!thermal_boost_enable(tz))
+			return;
+
 	thermal_zone_device_update(tz);
 }
 
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index b268d3c..b316bdf 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -172,6 +172,8 @@ struct thermal_zone_device {
 	int emul_temperature;
 	int passive;
 	unsigned int forced_passive;
+	bool overheated;
+	bool boost_polling;
 	const struct thermal_zone_device_ops *ops;
 	const struct thermal_zone_params *tzp;
 	struct thermal_governor *governor;
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v9 4/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST
  2013-10-14 12:17 ` [PATCH v9 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                     ` (2 preceding siblings ...)
  2013-10-14 12:17   ` [PATCH v9 3/7] thermal:boost: Automatic enable/disable of BOOST feature Lukasz Majewski
@ 2013-10-14 12:17   ` Lukasz Majewski
  2013-10-14 12:17   ` [PATCH v9 5/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
                     ` (2 subsequent siblings)
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-10-14 12:17 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r

For safety reasons new flag - CONFIG_CPU_FREQ_BOOST_SW has been added.
Only after selecting "EXYNOS Frequency Overclocking - Software" Kconfig
option the software managed boost is enabled. It also selects thermal
subsystem to be compiled in. Thermal is necessary for disabling boost
and cooling down the device when overheating detected.

Boost _MUST_NOT_ work without thermal subsystem with properly defined
overheating temperatures.

This option doesn't affect x86's ACPI hardware managed boost support
(i.e. Intel, AMD). In this situation boost management is embedded at
hardware.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v9:
- None

Changes for v8:
- None

Changes for v7:
- Remove superfluous "default n" definition
- Generic CPU_FREQ_BOOST_SW depends on THERMAL

Changes for v6:
- CPU_FREQ_BOOST_SW [1] is now defined as "invisible" bool option.
- Platform dependent ARM_EXYNOS_CPU_FREQ_BOOST_SW config option has been
  added. It depends on ARM_EXYNOS_CPUFREQ options and selects
  EXYNOS_THERMAL with the main boost config [1].

Changes for v5:
- New patch

 drivers/cpufreq/Kconfig     |    4 ++++
 drivers/cpufreq/Kconfig.arm |   15 +++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
index 38093e2..c8818c1 100644
--- a/drivers/cpufreq/Kconfig
+++ b/drivers/cpufreq/Kconfig
@@ -20,6 +20,10 @@ if CPU_FREQ
 config CPU_FREQ_GOV_COMMON
 	bool
 
+config CPU_FREQ_BOOST_SW
+	bool
+	depends on THERMAL
+
 config CPU_FREQ_STAT
 	tristate "CPU frequency translation statistics"
 	default y
diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm
index 701ec95..549166a 100644
--- a/drivers/cpufreq/Kconfig.arm
+++ b/drivers/cpufreq/Kconfig.arm
@@ -64,6 +64,21 @@ config ARM_EXYNOS5440_CPUFREQ
 
 	  If in doubt, say N.
 
+config ARM_EXYNOS_CPU_FREQ_BOOST_SW
+	bool "EXYNOS Frequency Overclocking - Software"
+	depends on ARM_EXYNOS_CPUFREQ
+	select CPU_FREQ_BOOST_SW
+	select EXYNOS_THERMAL
+	help
+	  This driver supports software managed overclocking (BOOST).
+	  It allows usage of special frequencies for Samsung Exynos
+	  processors if thermal conditions are appropriate.
+
+	  It reguires, for safe operation, thermal framework with properly
+	  defined trip points.
+
+	  If in doubt, say N.
+
 config ARM_HIGHBANK_CPUFREQ
 	tristate "Calxeda Highbank-based"
 	depends on ARCH_HIGHBANK
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v9 5/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework
  2013-10-14 12:17 ` [PATCH v9 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                     ` (3 preceding siblings ...)
  2013-10-14 12:17   ` [PATCH v9 4/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
@ 2013-10-14 12:17   ` Lukasz Majewski
  2013-10-14 12:17   ` [PATCH v9 6/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
  2013-10-14 12:17   ` [PATCH v9 7/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-10-14 12:17 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r

The cpufreq_driver's boost_supported flag is true only when boost
support is explicitly enabled.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v9:
- The exynos_cpufreq_attr[] has been replaced by generic_cpufreq_attr[],
  therefore the cpufreq_freq_attr_scaling_boost_freqs is now added at
  freq_table.c file.

Changes for v8:
- None

Changes for v7:
- Replace CONFIG_CPU_FREQ_BOOST_SW with CONFIG_ARM_EXYNOS_CPU_FREQ_BOOST_SW
- Move boost_supported initialization to struct cpufreq_driver exynos_driver

Changes for v6:
- Replace exynos_driver.boost_supported = 1 to = true
- Protect boost attributes export with CONFIG_CPU_FREQ_BOOST_SW

Changes for v5:
- None

Changes for v4:
- None

Changes for v3:
- Remove low level boost code
- Move boost management code to cpufreq core code
- Use boost_supported flag to indicate if driver supports over clocking

Changes for v2:
- Removal of struct cpufreq_boost
- Removal of the CONFIG_CPU_FREQ_BOOST flag
- low_level_boost with valid address when boost is supported

 drivers/cpufreq/exynos-cpufreq.c |    3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/cpufreq/exynos-cpufreq.c b/drivers/cpufreq/exynos-cpufreq.c
index b96fcc8..77a0aed 100644
--- a/drivers/cpufreq/exynos-cpufreq.c
+++ b/drivers/cpufreq/exynos-cpufreq.c
@@ -253,6 +253,9 @@ static struct cpufreq_driver exynos_driver = {
 	.exit		= cpufreq_generic_exit,
 	.name		= "exynos_cpufreq",
 	.attr		= cpufreq_generic_attr,
+#ifdef CONFIG_ARM_EXYNOS_CPU_FREQ_BOOST_SW
+	.boost_supported = true,
+#endif
 #ifdef CONFIG_PM
 	.suspend	= exynos_cpufreq_suspend,
 	.resume		= exynos_cpufreq_resume,
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v9 6/7] Documentation:cpufreq:boost: Update BOOST documentation
  2013-10-14 12:17 ` [PATCH v9 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                     ` (4 preceding siblings ...)
  2013-10-14 12:17   ` [PATCH v9 5/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
@ 2013-10-14 12:17   ` Lukasz Majewski
  2013-10-14 12:17   ` [PATCH v9 7/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-10-14 12:17 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r

Since the support for software and hardware controlled boosting has been
added, the corresponding Documentation entry had been updated.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v9:
- None

Changes for v8:
- None

Changes for v7:
- None

Changes for v6:
- None

Changes for v5:
- New patch

 Documentation/cpu-freq/boost.txt |   26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/Documentation/cpu-freq/boost.txt b/Documentation/cpu-freq/boost.txt
index 9b4edfc..dd62e13 100644
--- a/Documentation/cpu-freq/boost.txt
+++ b/Documentation/cpu-freq/boost.txt
@@ -17,8 +17,8 @@ Introduction
 Some CPUs support a functionality to raise the operating frequency of
 some cores in a multi-core package if certain conditions apply, mostly
 if the whole chip is not fully utilized and below it's intended thermal
-budget. This is done without operating system control by a combination
-of hardware and firmware.
+budget. The decision about boost disable/enable is made either at hardware
+(e.g. x86) or software (e.g ARM).
 On Intel CPUs this is called "Turbo Boost", AMD calls it "Turbo-Core",
 in technical documentation "Core performance boost". In Linux we use
 the term "boost" for convenience.
@@ -48,24 +48,24 @@ be desirable:
 User controlled switch
 ----------------------
 
-To allow the user to toggle the boosting functionality, the acpi-cpufreq
-driver exports a sysfs knob to disable it. There is a file:
+To allow the user to toggle the boosting functionality, the cpufreq core
+driver exports a sysfs knob to enable or disable it. There is a file:
 /sys/devices/system/cpu/cpufreq/boost
 which can either read "0" (boosting disabled) or "1" (boosting enabled).
-Reading the file is always supported, even if the processor does not
-support boosting. In this case the file will be read-only and always
-reads as "0". Explicitly changing the permissions and writing to that
-file anyway will return EINVAL.
+The file is exported only when cpufreq driver supports boosting.
+Explicitly changing the permissions and writing to that file anyway will
+return EINVAL.
 
 On supported CPUs one can write either a "0" or a "1" into this file.
 This will either disable the boost functionality on all cores in the
-whole system (0) or will allow the hardware to boost at will (1).
+whole system (0) or will allow the software or hardware to boost at will
+(1).
 
 Writing a "1" does not explicitly boost the system, but just allows the
-CPU (and the firmware) to boost at their discretion. Some implementations
-take external factors like the chip's temperature into account, so
-boosting once does not necessarily mean that it will occur every time
-even using the exact same software setup.
+CPU to boost at their discretion. Some implementations take external
+factors like the chip's temperature into account, so boosting once does
+not necessarily mean that it will occur every time even using the exact
+same software setup.
 
 
 AMD legacy cpb switch
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v9 7/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ
  2013-10-14 12:17 ` [PATCH v9 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                     ` (5 preceding siblings ...)
  2013-10-14 12:17   ` [PATCH v9 6/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
@ 2013-10-14 12:17   ` Lukasz Majewski
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-10-14 12:17 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r

Special driver data flag (CPUFREQ_BOOST_FREQ) has been added to indicate
frequency, which can be only enabled for BOOST mode.
This frequency shall be used only for limited time, since it might cause
target device to overheat.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v9:
- None

Changes for v8:
- None

Changes for v7:
- None

Changes for v6:
- New patch

 drivers/cpufreq/exynos4x12-cpufreq.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/cpufreq/exynos4x12-cpufreq.c b/drivers/cpufreq/exynos4x12-cpufreq.c
index 08b7477..178ab4b 100644
--- a/drivers/cpufreq/exynos4x12-cpufreq.c
+++ b/drivers/cpufreq/exynos4x12-cpufreq.c
@@ -32,7 +32,7 @@ static unsigned int exynos4x12_volt_table[] = {
 };
 
 static struct cpufreq_frequency_table exynos4x12_freq_table[] = {
-	{L0, CPUFREQ_ENTRY_INVALID},
+	{CPUFREQ_BOOST_FREQ, 1500 * 1000},
 	{L1, 1400 * 1000},
 	{L2, 1300 * 1000},
 	{L3, 1200 * 1000},
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* Re: [PATCH v9 3/7] thermal:boost: Automatic enable/disable of BOOST feature
  2013-10-14 12:17   ` [PATCH v9 3/7] thermal:boost: Automatic enable/disable of BOOST feature Lukasz Majewski
@ 2013-10-15  9:32     ` Zhang Rui
  2013-10-15 15:43       ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Zhang Rui @ 2013-10-15  9:32 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Viresh Kumar, Rafael J. Wysocki, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Myungjoo Ham, durgadoss.r

Hi, Lukasz,

thanks for the patch, sorry that I didn't look into this one earlier.

On Mon, 2013-10-14 at 14:17 +0200, Lukasz Majewski wrote:
> This patch provides auto disable/enable operation for boost. When any
> defined trip point is passed, the boost is disabled.

Do you mean boost is disabled if the system is in a overheating state?

> In that moment thermal monitor workqueue is woken up and it monitors
> if the device temperature drops below 75% of the smallest trip point.

Just FYI, the smallest trip point does not equal the trip point with
lowest temperature value.

Say, here is a platform with an active trip point at 40C, and an
critical trip point at 100C, you want to enable boost only if the
temperature is under 30C, right?

> When device cools down, the boost is enabled again.
> 
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> 
> ---
> Changes for v9:
> - None
> 
> Changes for v8:
> - Move cpufreq_boost_* stub functions definition (needed when cpufreq
>   is not compiled in) to cpufreq.h at cpufreq core support commit
> 
> Changes for v7:
> - None
> 
> Changes for v6:
> - Disable boost only when supported and enabled
> - Protect boost related thermal_zone_device struct fields with mutex
> - Evaluate temperature trend during boost enable decision
> - Create separate methods to handle boost enable/disable
>   (thermal_boost_{enable|disable}) operations
> - Boost is disabled at any trip point passage (not only the non critical one)
> - Add stub definitions for cpufreq boost functions used when
>   CONFIG_CPU_FREQ is NOT defined.
> 
> Changes for v5:
> - Move boost disable code from cpu_cooling.c to thermal_core.c
>   (to handle_non_critical_trips)
> - Extent struct thermal_zone_device by adding overheated bool flag
> - Implement auto enable of boost after device cools down
> - Introduce boost_polling flag, which indicates if thermal uses it's predefined
>   pool delay or has woken up thermal workqueue only to wait until device
>   cools down.
> 
> Changes for v4:
> - New patch
> 
>  drivers/thermal/thermal_core.c |   55 ++++++++++++++++++++++++++++++++++++++++
>  include/linux/thermal.h        |    2 ++
>  2 files changed, 57 insertions(+)
> 
> diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
> index 4962a6a..a167ab9 100644
> --- a/drivers/thermal/thermal_core.c
> +++ b/drivers/thermal/thermal_core.c
> @@ -34,6 +34,7 @@
>  #include <linux/thermal.h>
>  #include <linux/reboot.h>
>  #include <linux/string.h>
> +#include <linux/cpufreq.h>

Actually, I do not like to see this as thermal_core.c.
Because it is the platform thermal driver that owns the thermal policy,
e.g. it tells the thermal core to take what action at what temperature.
And this cpufreq boost support should be part of the thermal policy.

For example, here is a platform that supports boost. And it has a
passive trip point at 40C, which means the platform driver wants to
reduce the processor frequency when the temperature at 40C.
And what you're trying to add in this patch is to turn on boost mode
when the temperature is under 30C, right?
If yes, then I'd prefer to
1. introduce a separate cpu cooling device that just has two cooling
state, 0 means boost mode enabled, and 1 means boost mode disabled.
2. For any platform thermal driver that wants this support, introduce a
new trip point (30C) to the platform thermal driver, and bind the
cpufreq boost cooling device to this trip point.

And IMO, Step 1 can be an enhancement of cpufreq cooling feature. You
just need to introduce two new APIs for registering/unregistering an cpu
boost cooling device, without changing the current cpufreq cooling code.

Further more, cpufreq_boost_trigger_state(1) just make it possible to
enter boost mode, it does not mean the cpu will be put into boost mode
immediately, right? can we make it transparent to thermal core, say,
always enable it when the cpu is in cooling state 0 (p0)?

thanks,
rui
>  #include <net/netlink.h>
>  #include <net/genetlink.h>
>  
> @@ -366,9 +367,59 @@ static void handle_critical_trips(struct thermal_zone_device *tz,
>  	}
>  }
>  
> +static int thermal_boost_enable(struct thermal_zone_device *tz)
> +{
> +	enum thermal_trend trend = get_tz_trend(tz, 0);
> +	long trip_temp;
> +
> +	if (!tz->ops->get_trip_temp || !tz->overheated)
> +		return -EPERM;
> +	if (trend == THERMAL_TREND_RAISING || trend == THERMAL_TREND_RAISE_FULL)
> +		return -EBUSY;
> +
> +	tz->ops->get_trip_temp(tz, 0, &trip_temp);
> +	/*
> +	 * Enable boost again only when current temperature is less
> +	 * than 75% of trip_temp[0]
> +	 */
> +	if ((tz->temperature + (trip_temp >> 2)) < trip_temp) {
> +		mutex_lock(&tz->lock);
> +		tz->overheated = false;
> +		if (tz->boost_polling) {
> +			tz->boost_polling = false;
> +			tz->polling_delay = 0;
> +		}
> +		mutex_unlock(&tz->lock);
> +		cpufreq_boost_trigger_state(1);
> +		return 0;
> +	}
> +	return -EBUSY;
> +}
> +
> +static void thermal_boost_disable(struct thermal_zone_device *tz)
> +{
> +	cpufreq_boost_trigger_state(0);
> +
> +	/*
> +	 * If no workqueue for monitoring is running - start one with
> +	 * 1000 ms monitoring period
> +	 * If workqueue already running - do not change its period and only
> +	 * test if target CPU has cooled down
> +	 */
> +	mutex_lock(&tz->lock);
> +	if (!tz->polling_delay) {
> +		tz->boost_polling = true;
> +		tz->polling_delay = 1000;
> +	}
> +	tz->overheated = true;
> +	mutex_unlock(&tz->lock);
> +}
> +
>  static void handle_thermal_trip(struct thermal_zone_device *tz, int trip)
>  {
>  	enum thermal_trip_type type;
> +	if (cpufreq_boost_supported() && cpufreq_boost_enabled())
> +		thermal_boost_disable(tz);
>  
>  	tz->ops->get_trip_type(tz, trip, &type);
>  
> @@ -467,6 +518,10 @@ static void thermal_zone_device_check(struct work_struct *work)
>  	struct thermal_zone_device *tz = container_of(work, struct
>  						      thermal_zone_device,
>  						      poll_queue.work);
> +	if (cpufreq_boost_supported())
> +		if (!thermal_boost_enable(tz))
> +			return;
> +
>  	thermal_zone_device_update(tz);
>  }
>  
> diff --git a/include/linux/thermal.h b/include/linux/thermal.h
> index b268d3c..b316bdf 100644
> --- a/include/linux/thermal.h
> +++ b/include/linux/thermal.h
> @@ -172,6 +172,8 @@ struct thermal_zone_device {
>  	int emul_temperature;
>  	int passive;
>  	unsigned int forced_passive;
> +	bool overheated;
> +	bool boost_polling;
>  	const struct thermal_zone_device_ops *ops;
>  	const struct thermal_zone_params *tzp;
>  	struct thermal_governor *governor;



^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v9 3/7] thermal:boost: Automatic enable/disable of BOOST feature
  2013-10-15  9:32     ` Zhang Rui
@ 2013-10-15 15:43       ` Lukasz Majewski
  2013-10-17 15:09         ` Zhang, Rui
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-10-15 15:43 UTC (permalink / raw)
  To: Zhang Rui
  Cc: Viresh Kumar, Rafael J. Wysocki, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Myungjoo Ham, durgadoss.r

Hi Zhang,

> Hi, Lukasz,
> 
> thanks for the patch, sorry that I didn't look into this one earlier.

Yes, I would _really_ appreciate _earlier_ feedback from thermal
maintainers :-)

> 
> On Mon, 2013-10-14 at 14:17 +0200, Lukasz Majewski wrote:
> > This patch provides auto disable/enable operation for boost. When
> > any defined trip point is passed, the boost is disabled.
> 
> Do you mean boost is disabled if the system is in a overheating state?

In short - Yes.


To be more precise - the thermal here is a "safe" valve. 

Its role is to provide hysteresis similar to the one available for
Intel processors.

Intel does it in HW. Here I'm trying to do the same with SW for ARM.

> 
> > In that moment thermal monitor workqueue is woken up and it monitors
> > if the device temperature drops below 75% of the smallest trip
> > point.
> 
> Just FYI, the smallest trip point does not equal the trip point with
> lowest temperature value.

Thermal processors to which I've looked (exynos 4/5, ste-snowball) had
trip points defined monotonically with smallest value defined first.

This was the rationale for choosing thermal trip point 0.


> 
> Say, here is a platform with an active trip point at 40C, and an
> critical trip point at 100C, you want to enable boost only if the
> temperature is under 30C, right?

In short: no (please read below explanation).


The boost rough idea:
1. I enable boost from cpufreq (no matter what is the state of thermal)
2. If temperature is too high, then thermal interrupt would trigger and
disable boost
3. If device cools down - I enable the boost again 


> 
> > When device cools down, the boost is enabled again.
> > 
> > Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> > Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> > 
> > ---
> > Changes for v9:
> > - None
> > 
> > Changes for v8:
> > - Move cpufreq_boost_* stub functions definition (needed when
> > cpufreq is not compiled in) to cpufreq.h at cpufreq core support
> > commit
> > 
> > Changes for v7:
> > - None
> > 
> > Changes for v6:
> > - Disable boost only when supported and enabled
> > - Protect boost related thermal_zone_device struct fields with mutex
> > - Evaluate temperature trend during boost enable decision
> > - Create separate methods to handle boost enable/disable
> >   (thermal_boost_{enable|disable}) operations
> > - Boost is disabled at any trip point passage (not only the non
> > critical one)
> > - Add stub definitions for cpufreq boost functions used when
> >   CONFIG_CPU_FREQ is NOT defined.
> > 
> > Changes for v5:
> > - Move boost disable code from cpu_cooling.c to thermal_core.c
> >   (to handle_non_critical_trips)
> > - Extent struct thermal_zone_device by adding overheated bool flag
> > - Implement auto enable of boost after device cools down
> > - Introduce boost_polling flag, which indicates if thermal uses
> > it's predefined pool delay or has woken up thermal workqueue only
> > to wait until device cools down.
> > 
> > Changes for v4:
> > - New patch
> > 
> >  drivers/thermal/thermal_core.c |   55
> > ++++++++++++++++++++++++++++++++++++++++
> > include/linux/thermal.h        |    2 ++ 2 files changed, 57
> > insertions(+)
> > 
> > diff --git a/drivers/thermal/thermal_core.c
> > b/drivers/thermal/thermal_core.c index 4962a6a..a167ab9 100644
> > --- a/drivers/thermal/thermal_core.c
> > +++ b/drivers/thermal/thermal_core.c
> > @@ -34,6 +34,7 @@
> >  #include <linux/thermal.h>
> >  #include <linux/reboot.h>
> >  #include <linux/string.h>
> > +#include <linux/cpufreq.h>
> 
> Actually, I do not like to see this as thermal_core.c.
> Because it is the platform thermal driver that owns the thermal
> policy, e.g. it tells the thermal core to take what action at what
> temperature. 
> And this cpufreq boost support should be part of the
> thermal policy.


Boost is defined as policy independent at cpufreq. So I believe that
it shall be also thermal policy independent. In the end thermal shall
help cpufreq to not burn the device.


> 
> For example, here is a platform that supports boost. And it has a
> passive trip point at 40C, which means the platform driver wants to
> reduce the processor frequency when the temperature at 40C.
> And what you're trying to add in this patch is to turn on boost mode
> when the temperature is under 30C, right?

In short: yes. 

I want to add code which would disable boost when detected temperature
is more than 40C.

First, boost must be enabled at cpufreq. Only then it can be disabled
(if temp > 40C) at thermal. 

During boost disablement I also setup the thermal zone for
polling (if we already poll it - no settings are changed).
 
The boost is re-enabled only when temperature drops to 30C AND the
tz->overheated is set (which means that we are at overheated state
caused by boost).


> If yes, then I'd prefer to
> 1. introduce a separate cpu cooling device that just has two cooling
> state, 0 means boost mode enabled, and 1 means boost mode disabled.
> 2. For any platform thermal driver that wants this support, introduce
> a new trip point (30C) to the platform thermal driver, 
> and bind the
> cpufreq boost cooling device to this trip point.

> 
> And IMO, Step 1 can be an enhancement of cpufreq cooling feature. You
> just need to introduce two new APIs for registering/unregistering an
> cpu boost cooling device, without changing the current cpufreq
> cooling code.
> 
> Further more, cpufreq_boost_trigger_state(1) just make it possible to
> enter boost mode, it does not mean the cpu will be put into boost mode
> immediately, right? 

Yes, correct.

> can we make it transparent to thermal core, say,
> always enable it when the cpu is in cooling state 0 (p0)?

Thanks for presenting possible solution.

I will investigate it for boost.

> 
> thanks,
> rui
> >  #include <net/netlink.h>
> >  #include <net/genetlink.h>
> >  
> > @@ -366,9 +367,59 @@ static void handle_critical_trips(struct
> > thermal_zone_device *tz, }
> >  }
> >  
> > +static int thermal_boost_enable(struct thermal_zone_device *tz)
> > +{
> > +	enum thermal_trend trend = get_tz_trend(tz, 0);
> > +	long trip_temp;
> > +
> > +	if (!tz->ops->get_trip_temp || !tz->overheated)
> > +		return -EPERM;
> > +	if (trend == THERMAL_TREND_RAISING || trend ==
> > THERMAL_TREND_RAISE_FULL)
> > +		return -EBUSY;
> > +
> > +	tz->ops->get_trip_temp(tz, 0, &trip_temp);
> > +	/*
> > +	 * Enable boost again only when current temperature is less
> > +	 * than 75% of trip_temp[0]
> > +	 */
> > +	if ((tz->temperature + (trip_temp >> 2)) < trip_temp) {
> > +		mutex_lock(&tz->lock);
> > +		tz->overheated = false;
> > +		if (tz->boost_polling) {
> > +			tz->boost_polling = false;
> > +			tz->polling_delay = 0;
> > +		}
> > +		mutex_unlock(&tz->lock);
> > +		cpufreq_boost_trigger_state(1);
> > +		return 0;
> > +	}
> > +	return -EBUSY;
> > +}
> > +
> > +static void thermal_boost_disable(struct thermal_zone_device *tz)
> > +{
> > +	cpufreq_boost_trigger_state(0);
> > +
> > +	/*
> > +	 * If no workqueue for monitoring is running - start one
> > with
> > +	 * 1000 ms monitoring period
> > +	 * If workqueue already running - do not change its period
> > and only
> > +	 * test if target CPU has cooled down
> > +	 */
> > +	mutex_lock(&tz->lock);
> > +	if (!tz->polling_delay) {
> > +		tz->boost_polling = true;
> > +		tz->polling_delay = 1000;
> > +	}
> > +	tz->overheated = true;
> > +	mutex_unlock(&tz->lock);
> > +}
> > +
> >  static void handle_thermal_trip(struct thermal_zone_device *tz,
> > int trip) {
> >  	enum thermal_trip_type type;
> > +	if (cpufreq_boost_supported() && cpufreq_boost_enabled())
> > +		thermal_boost_disable(tz);
> >  
> >  	tz->ops->get_trip_type(tz, trip, &type);
> >  
> > @@ -467,6 +518,10 @@ static void thermal_zone_device_check(struct
> > work_struct *work) struct thermal_zone_device *tz =
> > container_of(work, struct thermal_zone_device,
> >  						      poll_queue.work);
> > +	if (cpufreq_boost_supported())
> > +		if (!thermal_boost_enable(tz))
> > +			return;
> > +
> >  	thermal_zone_device_update(tz);
> >  }
> >  
> > diff --git a/include/linux/thermal.h b/include/linux/thermal.h
> > index b268d3c..b316bdf 100644
> > --- a/include/linux/thermal.h
> > +++ b/include/linux/thermal.h
> > @@ -172,6 +172,8 @@ struct thermal_zone_device {
> >  	int emul_temperature;
> >  	int passive;
> >  	unsigned int forced_passive;
> > +	bool overheated;
> > +	bool boost_polling;
> >  	const struct thermal_zone_device_ops *ops;
> >  	const struct thermal_zone_params *tzp;
> >  	struct thermal_governor *governor;
> 
> 



-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* RE: [PATCH v9 3/7] thermal:boost: Automatic enable/disable of BOOST feature
  2013-10-15 15:43       ` Lukasz Majewski
@ 2013-10-17 15:09         ` Zhang, Rui
  0 siblings, 0 replies; 329+ messages in thread
From: Zhang, Rui @ 2013-10-17 15:09 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Viresh Kumar, Rafael J. Wysocki, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Myungjoo Ham, R, Durgadoss



> -----Original Message-----
> From: Lukasz Majewski [mailto:l.majewski@samsung.com]
> Sent: Tuesday, October 15, 2013 11:43 PM
> To: Zhang, Rui
> Cc: Viresh Kumar; Rafael J. Wysocki; Eduardo Valentin;
> cpufreq@vger.kernel.org; Linux PM list; Jonghwa Lee; Lukasz Majewski;
> linux-kernel; Bartlomiej Zolnierkiewicz; Myungjoo Ham; R, Durgadoss
> Subject: Re: [PATCH v9 3/7] thermal:boost: Automatic enable/disable of
> BOOST feature
> Importance: High
> 
> Hi Zhang,
> 
> > Hi, Lukasz,
> >
> > thanks for the patch, sorry that I didn't look into this one earlier.
> 
> Yes, I would _really_ appreciate _earlier_ feedback from thermal
> maintainers :-)
> 
> >
> > On Mon, 2013-10-14 at 14:17 +0200, Lukasz Majewski wrote:
> > > This patch provides auto disable/enable operation for boost. When
> > > any defined trip point is passed, the boost is disabled.
> >
> > Do you mean boost is disabled if the system is in a overheating state?
> 
> In short - Yes.
> 
> 
> To be more precise - the thermal here is a "safe" valve.
> 
> Its role is to provide hysteresis similar to the one available for
> Intel processors.
> 
> Intel does it in HW. Here I'm trying to do the same with SW for ARM.
> 
> >
> > > In that moment thermal monitor workqueue is woken up and it
> monitors
> > > if the device temperature drops below 75% of the smallest trip
> > > point.
> >
> > Just FYI, the smallest trip point does not equal the trip point with
> > lowest temperature value.
> 
> Thermal processors to which I've looked (exynos 4/5, ste-snowball) had
> trip points defined monotonically with smallest value defined first.
> 
> This was the rationale for choosing thermal trip point 0.
> 
But this is not a hard rule for all thermal drivers, thus you can't make this assumption.
 
> 
> >
> > Say, here is a platform with an active trip point at 40C, and an
> > critical trip point at 100C, you want to enable boost only if the
> > temperature is under 30C, right?
> 
> In short: no (please read below explanation).
> 
> 
> The boost rough idea:
> 1. I enable boost from cpufreq (no matter what is the state of thermal)
> 2. If temperature is too high, then thermal interrupt would trigger and
> disable boost 3. If device cools down - I enable the boost again
> 
> 
> >
> > > When device cools down, the boost is enabled again.
> > >
> > > Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> > > Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> > >
> > > ---
> > > Changes for v9:
> > > - None
> > >
> > > Changes for v8:
> > > - Move cpufreq_boost_* stub functions definition (needed when
> > > cpufreq is not compiled in) to cpufreq.h at cpufreq core support
> > > commit
> > >
> > > Changes for v7:
> > > - None
> > >
> > > Changes for v6:
> > > - Disable boost only when supported and enabled
> > > - Protect boost related thermal_zone_device struct fields with
> mutex
> > > - Evaluate temperature trend during boost enable decision
> > > - Create separate methods to handle boost enable/disable
> > >   (thermal_boost_{enable|disable}) operations
> > > - Boost is disabled at any trip point passage (not only the non
> > > critical one)
> > > - Add stub definitions for cpufreq boost functions used when
> > >   CONFIG_CPU_FREQ is NOT defined.
> > >
> > > Changes for v5:
> > > - Move boost disable code from cpu_cooling.c to thermal_core.c
> > >   (to handle_non_critical_trips)
> > > - Extent struct thermal_zone_device by adding overheated bool flag
> > > - Implement auto enable of boost after device cools down
> > > - Introduce boost_polling flag, which indicates if thermal uses
> it's
> > > predefined pool delay or has woken up thermal workqueue only to
> wait
> > > until device cools down.
> > >
> > > Changes for v4:
> > > - New patch
> > >
> > >  drivers/thermal/thermal_core.c |   55
> > > ++++++++++++++++++++++++++++++++++++++++
> > > include/linux/thermal.h        |    2 ++ 2 files changed, 57
> > > insertions(+)
> > >
> > > diff --git a/drivers/thermal/thermal_core.c
> > > b/drivers/thermal/thermal_core.c index 4962a6a..a167ab9 100644
> > > --- a/drivers/thermal/thermal_core.c
> > > +++ b/drivers/thermal/thermal_core.c
> > > @@ -34,6 +34,7 @@
> > >  #include <linux/thermal.h>
> > >  #include <linux/reboot.h>
> > >  #include <linux/string.h>
> > > +#include <linux/cpufreq.h>
> >
> > Actually, I do not like to see this as thermal_core.c.
> > Because it is the platform thermal driver that owns the thermal
> > policy, e.g. it tells the thermal core to take what action at what
> > temperature.
> > And this cpufreq boost support should be part of the thermal policy.
> 
> 
> Boost is defined as policy independent at cpufreq.


> So I believe that
> it shall be also thermal policy independent.

Boost mode support itself is policy independent, but when to use it is kind of a policy, right?
Say, if you introduce boost support in cpufreq cooling code, either as a cooling device or as a special cooling state, it is thermal policy independent, but when to use this cooling device/state is surely part of thermal policy.

> In the end thermal shall
> help cpufreq to not burn the device.
> 
> 
> >
> > For example, here is a platform that supports boost. And it has a
> > passive trip point at 40C, which means the platform driver wants to
> > reduce the processor frequency when the temperature at 40C.
> > And what you're trying to add in this patch is to turn on boost mode
> > when the temperature is under 30C, right?
> 
> In short: yes.
> 
> I want to add code which would disable boost when detected temperature
> is more than 40C.
> 
> First, boost must be enabled at cpufreq. Only then it can be disabled
> (if temp > 40C) at thermal.
> 
> During boost disablement I also setup the thermal zone for
> polling (if we already poll it - no settings are changed).
> 
> The boost is re-enabled only when temperature drops to 30C AND the
> tz->overheated is set (which means that we are at overheated state
> caused by boost).
> 
> 
> > If yes, then I'd prefer to
> > 1. introduce a separate cpu cooling device that just has two cooling
> > state, 0 means boost mode enabled, and 1 means boost mode disabled.
> > 2. For any platform thermal driver that wants this support, introduce
> > a new trip point (30C) to the platform thermal driver,
> > and bind the
> > cpufreq boost cooling device to this trip point.
> 
> >
> > And IMO, Step 1 can be an enhancement of cpufreq cooling feature. You
> > just need to introduce two new APIs for registering/unregistering an
> > cpu boost cooling device, without changing the current cpufreq
> > cooling code.
> >
> > Further more, cpufreq_boost_trigger_state(1) just make it possible to
> > enter boost mode, it does not mean the cpu will be put into boost
> mode
> > immediately, right?
> 
> Yes, correct.
> 
> > can we make it transparent to thermal core, say,
> > always enable it when the cpu is in cooling state 0 (p0)?
> 
> Thanks for presenting possible solution.
>
No problem. 

Thanks,
rui
> I will investigate it for boost.
> 
Thanks,
rui
> >
> > thanks,
> > rui
> > >  #include <net/netlink.h>
> > >  #include <net/genetlink.h>
> > >
> > > @@ -366,9 +367,59 @@ static void handle_critical_trips(struct
> > > thermal_zone_device *tz, }
> > >  }
> > >
> > > +static int thermal_boost_enable(struct thermal_zone_device *tz)
> > > +{
> > > +	enum thermal_trend trend = get_tz_trend(tz, 0);
> > > +	long trip_temp;
> > > +
> > > +	if (!tz->ops->get_trip_temp || !tz->overheated)
> > > +		return -EPERM;
> > > +	if (trend == THERMAL_TREND_RAISING || trend ==
> > > THERMAL_TREND_RAISE_FULL)
> > > +		return -EBUSY;
> > > +
> > > +	tz->ops->get_trip_temp(tz, 0, &trip_temp);
> > > +	/*
> > > +	 * Enable boost again only when current temperature is less
> > > +	 * than 75% of trip_temp[0]
> > > +	 */
> > > +	if ((tz->temperature + (trip_temp >> 2)) < trip_temp) {
> > > +		mutex_lock(&tz->lock);
> > > +		tz->overheated = false;
> > > +		if (tz->boost_polling) {
> > > +			tz->boost_polling = false;
> > > +			tz->polling_delay = 0;
> > > +		}
> > > +		mutex_unlock(&tz->lock);
> > > +		cpufreq_boost_trigger_state(1);
> > > +		return 0;
> > > +	}
> > > +	return -EBUSY;
> > > +}
> > > +
> > > +static void thermal_boost_disable(struct thermal_zone_device *tz)
> > > +{
> > > +	cpufreq_boost_trigger_state(0);
> > > +
> > > +	/*
> > > +	 * If no workqueue for monitoring is running - start one
> > > with
> > > +	 * 1000 ms monitoring period
> > > +	 * If workqueue already running - do not change its period
> > > and only
> > > +	 * test if target CPU has cooled down
> > > +	 */
> > > +	mutex_lock(&tz->lock);
> > > +	if (!tz->polling_delay) {
> > > +		tz->boost_polling = true;
> > > +		tz->polling_delay = 1000;
> > > +	}
> > > +	tz->overheated = true;
> > > +	mutex_unlock(&tz->lock);
> > > +}
> > > +
> > >  static void handle_thermal_trip(struct thermal_zone_device *tz,
> > > int trip) {
> > >  	enum thermal_trip_type type;
> > > +	if (cpufreq_boost_supported() && cpufreq_boost_enabled())
> > > +		thermal_boost_disable(tz);
> > >
> > >  	tz->ops->get_trip_type(tz, trip, &type);
> > >
> > > @@ -467,6 +518,10 @@ static void thermal_zone_device_check(struct
> > > work_struct *work) struct thermal_zone_device *tz =
> > > container_of(work, struct thermal_zone_device,
> > >  						      poll_queue.work);
> > > +	if (cpufreq_boost_supported())
> > > +		if (!thermal_boost_enable(tz))
> > > +			return;
> > > +
> > >  	thermal_zone_device_update(tz);
> > >  }
> > >
> > > diff --git a/include/linux/thermal.h b/include/linux/thermal.h
> > > index b268d3c..b316bdf 100644
> > > --- a/include/linux/thermal.h
> > > +++ b/include/linux/thermal.h
> > > @@ -172,6 +172,8 @@ struct thermal_zone_device {
> > >  	int emul_temperature;
> > >  	int passive;
> > >  	unsigned int forced_passive;
> > > +	bool overheated;
> > > +	bool boost_polling;
> > >  	const struct thermal_zone_device_ops *ops;
> > >  	const struct thermal_zone_params *tzp;
> > >  	struct thermal_governor *governor;
> >
> >
> 
> 
> 
> --
> Best regards,
> 
> Lukasz Majewski
> 
> Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* [PATCH v10 0/7] cpufreq:boost: CPU Boost mode support
  2013-06-06  7:07 [PATCH 0/5] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                   ` (13 preceding siblings ...)
  2013-10-14 12:17 ` [PATCH v9 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
@ 2013-11-05 17:26 ` Lukasz Majewski
  2013-11-05 17:26   ` [PATCH v10 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
                     ` (6 more replies)
  2013-12-02 12:19 ` [PATCH RESEND v10 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                   ` (2 subsequent siblings)
  17 siblings, 7 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-11-05 17:26 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, Amit Daniel Kachhap

This patch series introduces support for CPU overclocking technique
called Boost.

It is a follow up of a LAB governor proposal. Boost is a LAB component:
http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq

Boost unifies hardware based solution (e.g. Intel Nehalem) with
software oriented one (like the one done at Exynos).
For this reason cpufreq/freq_table code has been reorganized to include
common code.

Important design decisions:
- Boost related code is compiled-in unconditionally to cpufreq core and
  disabled by default. The cpufreq_driver is responsibile for setting
  boost_supported flag and providing set_boost callback(if HW support
  is needed). For software managed boost, special Kconfig flag -
  CONFIG_CPU_FREQ_BOOST_SW has been defined. It will be selected only
  when a target platform has thermal framework properly configured.

- struct cpufreq_driver has been extended with boost related fields:
        -- boost_supported - when driver supports boosting
        -- boost_enabled - boost state
        -- set_boost - callback to function, which is necessary to
           enable/disable boost

- Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost) is visible
  _only_ when cpufreq driver supports Boost.

- No special spin_lock for Boost was created. The one from cpufreq core
  was reused.

- The Boost code doesn't rely on any policy. When boost state is changed,
  then the policy list is iterated and proper adjustements are done.

- To improve safety level, the thermal framework is also extended to disable
  software boosting, when thermal trip point is reached. After cooling down
  the boost can be enabled again. This emulates behaviour similar to HW
  managed boost (like x86)

Tested at HW:
       Exynos 4412 3.12-rc7 Linux
       Intel Core i7-3770 3.12-rc7 Linux

Above patches were posted on top of kernel_pm/bleeding-edge
(SHA1: acc3663ce3f9cde3a7da88fb478531c58d5ed399)


Lukasz Majewski (7):
  cpufreq: Add boost frequency support in core
  cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common
    boost solution
  cpufreq:boost:Kconfig: Provide support for software managed BOOST
  cpufreq:exynos:Extend Exynos cpufreq driver to support boost
    framework
  Documentation:cpufreq:boost: Update BOOST documentation
  cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ
  thermal:exynos:boost: Automatic enable/disable of BOOST feature (at
    Exynos4412)

 Documentation/cpu-freq/boost.txt          |   26 +++----
 drivers/cpufreq/Kconfig                   |    4 +
 drivers/cpufreq/Kconfig.arm               |   15 ++++
 drivers/cpufreq/acpi-cpufreq.c            |   86 +++++++--------------
 drivers/cpufreq/cpufreq.c                 |  118 ++++++++++++++++++++++++++++-
 drivers/cpufreq/exynos-cpufreq.c          |    3 +
 drivers/cpufreq/exynos4x12-cpufreq.c      |    2 +-
 drivers/cpufreq/freq_table.c              |   56 ++++++++++++--
 drivers/thermal/samsung/exynos_tmu_data.c |   47 ++++++++++++
 include/linux/cpufreq.h                   |   24 ++++++
 10 files changed, 302 insertions(+), 79 deletions(-)

-- 
1.7.10.4


^ permalink raw reply	[flat|nested] 329+ messages in thread

* [PATCH v10 1/7] cpufreq: Add boost frequency support in core
  2013-11-05 17:26 ` [PATCH v10 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
@ 2013-11-05 17:26   ` Lukasz Majewski
  2013-11-05 17:26   ` [PATCH v10 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
                     ` (5 subsequent siblings)
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-11-05 17:26 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, Amit Daniel Kachhap

This commit adds boost frequency support in cpufreq core (Hardware &
Software). Some SoCs (like Exynos4 - e.g. 4x12) allow setting frequency
above its normal operation limits. Such mode shall be only used for a
short time.

Overclocking (boost) support is essentially provided by platform
dependent cpufreq driver.

This commit unifies support for SW and HW (Intel) overclocking solutions
in the core cpufreq driver. Previously the "boost" sysfs attribute was
defined at acpi driver code. By default boost is disabled. One global
attribute is available at: /sys/devices/system/cpu/cpufreq/boost.

It only shows up when cpufreq driver supports overclocking.
Under the hood frequencies dedicated for boosting are marked with a
special flag (CPUFREQ_BOOST_FREQ) at driver's frequency table.
It is the user's concern to enable/disable overclocking with a proper call
to sysfs.

The cpufreq_boost_trigger_state() function is defined non static on purpose.
It is used later with thermal subsystem to provide automatic enable/disable
of the BOOST feature.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v10:
- None

Changes for v9:
- Add cpufreq_freq_attr_scaling_boost_freqs to *cpufreq_generic_attr table
- Introduce CONFIG_CPU_FREQ_BOOST_SW generic config flag to show BOOST
  frequencies only when cpufreq driver supports boost

Changes for v8:
- Correction of error message at cpufreq_boost_trigger_state() function
- Rewrite the cpufreq_boost_set_sw() function to print error message and
  break the loop when policy adjustment fails

Changes for v7:
- Properly change cpufreq_driver->boost_enabled when set_boost() fails
  (=0 to =!state)
- Add likely() around cpufreq_driver
- Remove parenthesis around boost.attr

Changes for v6:
- Remove sysfs boost attribute when subsys_iterface_unregister() fails
- Move global boost_enabled variable from cpufreq.c to platform dependent
  struct cpufreq_driver
- pr_err() message is also printed when boost disable fails
- Call __cpufreq_governor() to force recalculation of next frequency when
  boost is triggered. It is needed with i.e. performance class of governors
- Change cpufreq_boost_enable_sw() -> cpufreq_boost_set_sw()
- Rename .enable_boost function pointer to .set_boost

Changes for v5:
- Rename cpufreq_boost_trigger_state_sw() to cpufreq_boost_enable_sw()
- Extent cpufreq_register_driver() to check if cpufreq driver provided
  boost_enable callback. If not provided, then use cpufreq_boost_enable_sw()
- Use single call to cpufreq_driver->enable_boost() with cpufreq driver
  provided callback or default SW boost enable routine
- Move pr_debug call to store_boost() from cpufreq_boost_trigger_state()
- Change the user_policy.max value when SW boost is toggled. It is necessary
  for proper operation of e.g. thermal subsystem.
- Add check if cpufreq_driver pointer is not NULL at
  cpufreq_boost_supported() routine
- Add EXPORT_SYMBOL_GPL for cpufreq_boost_supported() and
  cpufreq_boost_enabled()
- Remove extra check for cpufreq_boost_supported() at
  cpufreq_freq_table_cpuinfo()
- Explanation of show boost logic at show_available_freqs()
- Add cpufreq_set_boost_enabled() method to set initial value of boost_enabled
  global flag

Changes for v4:
- Remove boost parameter from cpufreq_frequency_table_cpuinfo() function
- Introduce cpufreq_boost_supported() method
- Use of cpufreq_boost_supported() and cpufreq_boost_enabled() to decide
  if frequency shall be skipped
- Rename set_boost_freq() to enable_boost()
- cpufreq_attr_available_freq() moved to freq_table.c
- Use policy list to get access to cpufreq policies
- Rename global boost flag (cpufreq_boost_enabled -> boost_enabled)
- pr_err corrected ( %sable)
- Remove sanity check at cpufreq_boost_trigger_state() entrance [to test if
  boost is supported]
- Use either HW (boost_enable) callback or SW managed boost
- Introduce new cpufreq_boost_trigger_state_sw() method to handle boost
  at SW.
- Protect boost_enabled manipulation with lock.

Changes for v3:
- Method for reading boost status
- Removal of cpufreq_frequency_table_max()
- Extent cpufreq_frequency_table_cpuinfo() to support boost parameter
- boost_supported flag added to cpufreq_driver struct
- "boost" sysfs attribute control flag removed
- One global flag describing state of the boost defined at cpufreq core
- Rename cpufreq_driver's low_level_boost field to set_boost_freq()
- Usage of cpufreq_sysfs_{remove|add}_file() routines

Changes for v2:
- Removal of cpufreq_boost structure and move its fields to cpufreq_driver
  structure
- Flag to indicate if global boost attribute is already defined
- Extent the pr_{err|debbug} functions to show current function names

 drivers/cpufreq/cpufreq.c    |  118 +++++++++++++++++++++++++++++++++++++++++-
 drivers/cpufreq/freq_table.c |   56 +++++++++++++++++---
 include/linux/cpufreq.h      |   24 +++++++++
 3 files changed, 190 insertions(+), 8 deletions(-)

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 02d534d..33774cc 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -324,6 +324,33 @@ EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
 /*********************************************************************
  *                          SYSFS INTERFACE                          *
  *********************************************************************/
+ssize_t show_boost(struct kobject *kobj,
+				 struct attribute *attr, char *buf)
+{
+	return sprintf(buf, "%d\n", cpufreq_driver->boost_enabled);
+}
+
+static ssize_t store_boost(struct kobject *kobj, struct attribute *attr,
+				  const char *buf, size_t count)
+{
+	int ret, enable;
+
+	ret = sscanf(buf, "%d", &enable);
+	if (ret != 1 || enable < 0 || enable > 1)
+		return -EINVAL;
+
+	if (cpufreq_boost_trigger_state(enable)) {
+		pr_err("%s: Cannot %s BOOST!\n", __func__,
+		       enable ? "enable" : "disable");
+		return -EINVAL;
+	}
+
+	pr_debug("%s: cpufreq BOOST %s\n", __func__,
+		 enable ? "enabled" : "disabled");
+
+	return count;
+}
+define_one_global_rw(boost);
 
 static struct cpufreq_governor *__find_governor(const char *str_governor)
 {
@@ -2106,6 +2133,73 @@ static struct notifier_block __refdata cpufreq_cpu_notifier = {
 };
 
 /*********************************************************************
+ *               BOOST						     *
+ *********************************************************************/
+static int cpufreq_boost_set_sw(int state)
+{
+	struct cpufreq_frequency_table *freq_table;
+	struct cpufreq_policy *policy;
+	int ret = -EINVAL;
+
+	list_for_each_entry(policy, &cpufreq_policy_list, policy_list) {
+		freq_table = cpufreq_frequency_get_table(policy->cpu);
+		if (freq_table) {
+			ret = cpufreq_frequency_table_cpuinfo(policy,
+							freq_table);
+			if (ret) {
+				pr_err("%s: Policy frequency update failed\n",
+				       __func__);
+				break;
+			}
+			policy->user_policy.max = policy->max;
+			__cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
+		}
+	}
+
+	return ret;
+}
+
+int cpufreq_boost_trigger_state(int state)
+{
+	unsigned long flags;
+	int ret = 0;
+
+	if (cpufreq_driver->boost_enabled == state)
+		return 0;
+
+	write_lock_irqsave(&cpufreq_driver_lock, flags);
+	cpufreq_driver->boost_enabled = state;
+	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
+
+	ret = cpufreq_driver->set_boost(state);
+	if (ret) {
+		write_lock_irqsave(&cpufreq_driver_lock, flags);
+		cpufreq_driver->boost_enabled = !state;
+		write_unlock_irqrestore(&cpufreq_driver_lock, flags);
+
+		pr_err("%s: Cannot %s BOOST\n", __func__,
+		       state ? "enable" : "disable");
+	}
+
+	return ret;
+}
+
+int cpufreq_boost_supported(void)
+{
+	if (likely(cpufreq_driver))
+		return cpufreq_driver->boost_supported;
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(cpufreq_boost_supported);
+
+int cpufreq_boost_enabled(void)
+{
+	return cpufreq_driver->boost_enabled;
+}
+EXPORT_SYMBOL_GPL(cpufreq_boost_enabled);
+
+/*********************************************************************
  *               REGISTER / UNREGISTER CPUFREQ DRIVER                *
  *********************************************************************/
 
@@ -2145,9 +2239,25 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 	cpufreq_driver = driver_data;
 	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
 
+	if (cpufreq_boost_supported()) {
+		/*
+		 * Check if driver provides function to enable boost -
+		 * if not, use cpufreq_boost_set_sw as default
+		 */
+		if (!cpufreq_driver->set_boost)
+			cpufreq_driver->set_boost = cpufreq_boost_set_sw;
+
+		ret = cpufreq_sysfs_create_file(&boost.attr);
+		if (ret) {
+			pr_err("%s: cannot register global BOOST sysfs file\n",
+				__func__);
+			goto err_null_driver;
+		}
+	}
+
 	ret = subsys_interface_register(&cpufreq_interface);
 	if (ret)
-		goto err_null_driver;
+		goto err_boost_unreg;
 
 	if (!(cpufreq_driver->flags & CPUFREQ_STICKY)) {
 		int i;
@@ -2174,6 +2284,9 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 	return 0;
 err_if_unreg:
 	subsys_interface_unregister(&cpufreq_interface);
+err_boost_unreg:
+	if (cpufreq_boost_supported())
+		cpufreq_sysfs_remove_file(&boost.attr);
 err_null_driver:
 	write_lock_irqsave(&cpufreq_driver_lock, flags);
 	cpufreq_driver = NULL;
@@ -2200,6 +2313,9 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
 	pr_debug("unregistering driver %s\n", driver->name);
 
 	subsys_interface_unregister(&cpufreq_interface);
+	if (cpufreq_boost_supported())
+		cpufreq_sysfs_remove_file(&boost.attr);
+
 	unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
 
 	down_write(&cpufreq_rwsem);
diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c
index 3458d27..776e88a 100644
--- a/drivers/cpufreq/freq_table.c
+++ b/drivers/cpufreq/freq_table.c
@@ -32,6 +32,10 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
 
 			continue;
 		}
+		if (!cpufreq_boost_enabled()
+		    && table[i].driver_data == CPUFREQ_BOOST_FREQ)
+			continue;
+
 		pr_debug("table entry %u: %u kHz, %u driver_data\n",
 					i, freq, table[i].driver_data);
 		if (freq < min_freq)
@@ -182,7 +186,8 @@ static DEFINE_PER_CPU(struct cpufreq_frequency_table *, cpufreq_show_table);
 /**
  * show_available_freqs - show available frequencies for the specified CPU
  */
-static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
+static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf,
+				    bool show_boost)
 {
 	unsigned int i = 0;
 	unsigned int cpu = policy->cpu;
@@ -197,6 +202,20 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
 	for (i = 0; (table[i].frequency != CPUFREQ_TABLE_END); i++) {
 		if (table[i].frequency == CPUFREQ_ENTRY_INVALID)
 			continue;
+		/*
+		 * show_boost = true and driver_data = BOOST freq
+		 * display BOOST freqs
+		 *
+		 * show_boost = false and driver_data = BOOST freq
+		 * show_boost = true and driver_data != BOOST freq
+		 * continue - do not display anything
+		 *
+		 * show_boost = false and driver_data != BOOST freq
+		 * display NON BOOST freqs
+		 */
+		if (show_boost ^ (table[i].driver_data == CPUFREQ_BOOST_FREQ))
+			continue;
+
 		count += sprintf(&buf[count], "%d ", table[i].frequency);
 	}
 	count += sprintf(&buf[count], "\n");
@@ -205,16 +224,39 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
 
 }
 
-struct freq_attr cpufreq_freq_attr_scaling_available_freqs = {
-	.attr = { .name = "scaling_available_frequencies",
-		  .mode = 0444,
-		},
-	.show = show_available_freqs,
-};
+#define cpufreq_attr_available_freq(_name)	  \
+struct freq_attr cpufreq_freq_attr_##_name##_freqs =     \
+__ATTR_RO(_name##_frequencies)
+
+/**
+ * show_scaling_available_frequencies - show available normal frequencies for
+ * the specified CPU
+ */
+static ssize_t scaling_available_frequencies_show(struct cpufreq_policy *policy,
+						  char *buf)
+{
+	return show_available_freqs(policy, buf, false);
+}
+cpufreq_attr_available_freq(scaling_available);
 EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_available_freqs);
 
+/**
+ * show_available_boost_freqs - show available boost frequencies for
+ * the specified CPU
+ */
+static ssize_t scaling_boost_frequencies_show(struct cpufreq_policy *policy,
+					      char *buf)
+{
+	return show_available_freqs(policy, buf, true);
+}
+cpufreq_attr_available_freq(scaling_boost);
+EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_boost_freqs);
+
 struct freq_attr *cpufreq_generic_attr[] = {
 	&cpufreq_freq_attr_scaling_available_freqs,
+#ifdef CONFIG_CPU_FREQ_BOOST_SW
+	&cpufreq_freq_attr_scaling_boost_freqs,
+#endif
 	NULL,
 };
 EXPORT_SYMBOL_GPL(cpufreq_generic_attr);
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index 5bd6ab9..766677b 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -217,6 +217,11 @@ struct cpufreq_driver {
 	int	(*suspend)	(struct cpufreq_policy *policy);
 	int	(*resume)	(struct cpufreq_policy *policy);
 	struct freq_attr	**attr;
+
+	/* platform specific boost support code */
+	bool                    boost_supported;
+	bool                    boost_enabled;
+	int     (*set_boost)    (int state);
 };
 
 /* flags */
@@ -412,6 +417,7 @@ extern struct cpufreq_governor cpufreq_gov_conservative;
 
 #define CPUFREQ_ENTRY_INVALID ~0
 #define CPUFREQ_TABLE_END     ~1
+#define CPUFREQ_BOOST_FREQ    ~2
 
 struct cpufreq_frequency_table {
 	unsigned int	driver_data; /* driver specific data, not used by core */
@@ -435,6 +441,24 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
 void cpufreq_frequency_table_update_policy_cpu(struct cpufreq_policy *policy);
 ssize_t cpufreq_show_cpus(const struct cpumask *mask, char *buf);
 
+#ifdef CONFIG_CPU_FREQ
+int cpufreq_boost_trigger_state(int state);
+int cpufreq_boost_supported(void);
+int cpufreq_boost_enabled(void);
+#else
+static inline int cpufreq_boost_trigger_state(int state)
+{
+	return 0;
+}
+static inline int cpufreq_boost_supported(void)
+{
+	return 0;
+}
+static inline int cpufreq_boost_enabled(void)
+{
+	return 0;
+}
+#endif
 /* the following funtion is for cpufreq core use only */
 struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu);
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v10 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution
  2013-11-05 17:26 ` [PATCH v10 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
  2013-11-05 17:26   ` [PATCH v10 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
@ 2013-11-05 17:26   ` Lukasz Majewski
  2013-11-05 17:26   ` [PATCH v10 3/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
                     ` (4 subsequent siblings)
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-11-05 17:26 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, Amit Daniel Kachhap

The Intel's hardware based boost solution driver has been changed to cooperate with
common cpufreq boost framework.

The global sysfs boost attribute entry code (/sys/devices/system/cpu/cpufreq/boost)
has been moved to a core cpufreq code. This attribute is now only visible,
when cpufreq driver supports it.

The _store_boost() function has been redesigned to be used as set_boost
callback.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v10:
- None

Changes for v9:
- None

Changes for v8:
- None

Changes for v7:
- Remove superfluous acpi_cpufreq_driver.boost_supported = false at
  acpi_cpufreq_boost_init()

Changes for v6:
- Perform acpi_cpufreq_boost_init initialization before cpufreq_driver
  registration
- Compile store_boost() only when CONFIG_X86_ACPI_CPUFREQ_CPB defined
- Use boost_enabled flag defined at acpi_cpufreq_driver to store information
  about boost state
- Instead of using cpufreq_set_boost_enabled(), modify the boost_enable in
  the acpi driver code

Changes for v5:
- Remove acpi-cpufreq's boost_enabled global flag and reuse one defined at
  cpufreq core

Changes for v4:
- add _store_boost to acpi_cpufreq_driver structure

Changes for v3:
- Bring back boost_enabled as a global flag
- Move boost_supported to cpufreq_driver structure

Changes for v2:
- Replace boost_enabled and boost_supported global flags with proper entries
  at struct cpufreq_driver.
- Removal of struct cpufreq_boost

 drivers/cpufreq/acpi-cpufreq.c |   86 ++++++++++++++--------------------------
 1 file changed, 29 insertions(+), 57 deletions(-)

diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c
index caf41eb..79e5608 100644
--- a/drivers/cpufreq/acpi-cpufreq.c
+++ b/drivers/cpufreq/acpi-cpufreq.c
@@ -80,7 +80,6 @@ static struct acpi_processor_performance __percpu *acpi_perf_data;
 static struct cpufreq_driver acpi_cpufreq_driver;
 
 static unsigned int acpi_pstate_strict;
-static bool boost_enabled, boost_supported;
 static struct msr __percpu *msrs;
 
 static bool boost_state(unsigned int cpu)
@@ -133,49 +132,16 @@ static void boost_set_msrs(bool enable, const struct cpumask *cpumask)
 	wrmsr_on_cpus(cpumask, msr_addr, msrs);
 }
 
-static ssize_t _store_boost(const char *buf, size_t count)
+static int _store_boost(int val)
 {
-	int ret;
-	unsigned long val = 0;
-
-	if (!boost_supported)
-		return -EINVAL;
-
-	ret = kstrtoul(buf, 10, &val);
-	if (ret || (val > 1))
-		return -EINVAL;
-
-	if ((val && boost_enabled) || (!val && !boost_enabled))
-		return count;
-
 	get_online_cpus();
-
 	boost_set_msrs(val, cpu_online_mask);
-
 	put_online_cpus();
-
-	boost_enabled = val;
 	pr_debug("Core Boosting %sabled.\n", val ? "en" : "dis");
 
-	return count;
-}
-
-static ssize_t store_global_boost(struct kobject *kobj, struct attribute *attr,
-				  const char *buf, size_t count)
-{
-	return _store_boost(buf, count);
-}
-
-static ssize_t show_global_boost(struct kobject *kobj,
-				 struct attribute *attr, char *buf)
-{
-	return sprintf(buf, "%u\n", boost_enabled);
+	return 0;
 }
 
-static struct global_attr global_boost = __ATTR(boost, 0644,
-						show_global_boost,
-						store_global_boost);
-
 static ssize_t show_freqdomain_cpus(struct cpufreq_policy *policy, char *buf)
 {
 	struct acpi_cpufreq_data *data = per_cpu(acfreq_data, policy->cpu);
@@ -186,15 +152,32 @@ static ssize_t show_freqdomain_cpus(struct cpufreq_policy *policy, char *buf)
 cpufreq_freq_attr_ro(freqdomain_cpus);
 
 #ifdef CONFIG_X86_ACPI_CPUFREQ_CPB
+static ssize_t store_boost(const char *buf, size_t count)
+{
+	int ret;
+	unsigned long val = 0;
+
+	if (!acpi_cpufreq_driver.boost_supported)
+		return -EINVAL;
+
+	ret = kstrtoul(buf, 10, &val);
+	if (ret || (val > 1))
+		return -EINVAL;
+
+	_store_boost((int) val);
+
+	return count;
+}
+
 static ssize_t store_cpb(struct cpufreq_policy *policy, const char *buf,
 			 size_t count)
 {
-	return _store_boost(buf, count);
+	return store_boost(buf, count);
 }
 
 static ssize_t show_cpb(struct cpufreq_policy *policy, char *buf)
 {
-	return sprintf(buf, "%u\n", boost_enabled);
+	return sprintf(buf, "%u\n", acpi_cpufreq_driver.boost_enabled);
 }
 
 cpufreq_freq_attr_rw(cpb);
@@ -554,7 +537,7 @@ static int boost_notify(struct notifier_block *nb, unsigned long action,
 	switch (action) {
 	case CPU_UP_PREPARE:
 	case CPU_UP_PREPARE_FROZEN:
-		boost_set_msrs(boost_enabled, cpumask);
+		boost_set_msrs(acpi_cpufreq_driver.boost_enabled, cpumask);
 		break;
 
 	case CPU_DOWN_PREPARE:
@@ -911,6 +894,7 @@ static struct cpufreq_driver acpi_cpufreq_driver = {
 	.resume		= acpi_cpufreq_resume,
 	.name		= "acpi-cpufreq",
 	.attr		= acpi_cpufreq_attr,
+	.set_boost      = _store_boost,
 };
 
 static void __init acpi_cpufreq_boost_init(void)
@@ -921,33 +905,22 @@ static void __init acpi_cpufreq_boost_init(void)
 		if (!msrs)
 			return;
 
-		boost_supported = true;
-		boost_enabled = boost_state(0);
-
+		acpi_cpufreq_driver.boost_supported = true;
+		acpi_cpufreq_driver.boost_enabled = boost_state(0);
 		get_online_cpus();
 
 		/* Force all MSRs to the same value */
-		boost_set_msrs(boost_enabled, cpu_online_mask);
+		boost_set_msrs(acpi_cpufreq_driver.boost_enabled,
+			       cpu_online_mask);
 
 		register_cpu_notifier(&boost_nb);
 
 		put_online_cpus();
-	} else
-		global_boost.attr.mode = 0444;
-
-	/* We create the boost file in any case, though for systems without
-	 * hardware support it will be read-only and hardwired to return 0.
-	 */
-	if (cpufreq_sysfs_create_file(&(global_boost.attr)))
-		pr_warn(PFX "could not register global boost sysfs file\n");
-	else
-		pr_debug("registered global boost sysfs file\n");
+	}
 }
 
 static void __exit acpi_cpufreq_boost_exit(void)
 {
-	cpufreq_sysfs_remove_file(&(global_boost.attr));
-
 	if (msrs) {
 		unregister_cpu_notifier(&boost_nb);
 
@@ -993,12 +966,11 @@ static int __init acpi_cpufreq_init(void)
 			*iter = &cpb;
 	}
 #endif
+	acpi_cpufreq_boost_init();
 
 	ret = cpufreq_register_driver(&acpi_cpufreq_driver);
 	if (ret)
 		free_acpi_perf_data();
-	else
-		acpi_cpufreq_boost_init();
 
 	return ret;
 }
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v10 3/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST
  2013-11-05 17:26 ` [PATCH v10 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
  2013-11-05 17:26   ` [PATCH v10 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
  2013-11-05 17:26   ` [PATCH v10 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
@ 2013-11-05 17:26   ` Lukasz Majewski
  2013-11-05 17:26   ` [PATCH v10 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
                     ` (3 subsequent siblings)
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-11-05 17:26 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, Amit Daniel Kachhap

For safety reasons new flag - CONFIG_CPU_FREQ_BOOST_SW has been added.
Only after selecting "EXYNOS Frequency Overclocking - Software" Kconfig
option the software managed boost is enabled. It also selects thermal
subsystem to be compiled in. Thermal is necessary for disabling boost
and cooling down the device when overheating detected.

Boost _MUST_NOT_ work without thermal subsystem with properly defined
overheating temperatures.

This option doesn't affect x86's ACPI hardware managed boost support
(i.e. Intel, AMD). In this situation boost management is embedded at
hardware.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v10:
- None

Changes for v9:
- None

Changes for v8:
- None

Changes for v7:
- Remove superfluous "default n" definition
- Generic CPU_FREQ_BOOST_SW depends on THERMAL

Changes for v6:
- CPU_FREQ_BOOST_SW [1] is now defined as "invisible" bool option.
- Platform dependent ARM_EXYNOS_CPU_FREQ_BOOST_SW config option has been
  added. It depends on ARM_EXYNOS_CPUFREQ options and selects
  EXYNOS_THERMAL with the main boost config [1].

Changes for v5:
- New patch

 drivers/cpufreq/Kconfig     |    4 ++++
 drivers/cpufreq/Kconfig.arm |   15 +++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
index 38093e2..c8818c1 100644
--- a/drivers/cpufreq/Kconfig
+++ b/drivers/cpufreq/Kconfig
@@ -20,6 +20,10 @@ if CPU_FREQ
 config CPU_FREQ_GOV_COMMON
 	bool
 
+config CPU_FREQ_BOOST_SW
+	bool
+	depends on THERMAL
+
 config CPU_FREQ_STAT
 	tristate "CPU frequency translation statistics"
 	default y
diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm
index ce52ed9..25599d6 100644
--- a/drivers/cpufreq/Kconfig.arm
+++ b/drivers/cpufreq/Kconfig.arm
@@ -64,6 +64,21 @@ config ARM_EXYNOS5440_CPUFREQ
 
 	  If in doubt, say N.
 
+config ARM_EXYNOS_CPU_FREQ_BOOST_SW
+	bool "EXYNOS Frequency Overclocking - Software"
+	depends on ARM_EXYNOS_CPUFREQ
+	select CPU_FREQ_BOOST_SW
+	select EXYNOS_THERMAL
+	help
+	  This driver supports software managed overclocking (BOOST).
+	  It allows usage of special frequencies for Samsung Exynos
+	  processors if thermal conditions are appropriate.
+
+	  It reguires, for safe operation, thermal framework with properly
+	  defined trip points.
+
+	  If in doubt, say N.
+
 config ARM_HIGHBANK_CPUFREQ
 	tristate "Calxeda Highbank-based"
 	depends on ARCH_HIGHBANK
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v10 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework
  2013-11-05 17:26 ` [PATCH v10 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                     ` (2 preceding siblings ...)
  2013-11-05 17:26   ` [PATCH v10 3/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
@ 2013-11-05 17:26   ` Lukasz Majewski
  2013-11-05 17:26   ` [PATCH v10 5/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
                     ` (2 subsequent siblings)
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-11-05 17:26 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, Amit Daniel Kachhap

The cpufreq_driver's boost_supported flag is true only when boost
support is explicitly enabled. Boost related attributes are exported only
under the same condition.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v10:
- None

Changes for v9:
- The exynos_cpufreq_attr[] has been replaced by generic_cpufreq_attr[],
  therefore the cpufreq_freq_attr_scaling_boost_freqs is now added at
  freq_table.c file.

Changes for v8:
- None

Changes for v7:
- Replace CONFIG_CPU_FREQ_BOOST_SW with CONFIG_ARM_EXYNOS_CPU_FREQ_BOOST_SW
- Move boost_supported initialization to struct cpufreq_driver exynos_driver

Changes for v6:
- Replace exynos_driver.boost_supported = 1 to = true
- Protect boost attributes export with CONFIG_CPU_FREQ_BOOST_SW

Changes for v5:
- None

Changes for v4:
- None

Changes for v3:
- Remove low level boost code
- Move boost management code to cpufreq core code
- Use boost_supported flag to indicate if driver supports over clocking

Changes for v2:
- Removal of struct cpufreq_boost
- Removal of the CONFIG_CPU_FREQ_BOOST flag
- low_level_boost with valid address when boost is supported

 drivers/cpufreq/exynos-cpufreq.c |    3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/cpufreq/exynos-cpufreq.c b/drivers/cpufreq/exynos-cpufreq.c
index 7b6dc06..0c8d101 100644
--- a/drivers/cpufreq/exynos-cpufreq.c
+++ b/drivers/cpufreq/exynos-cpufreq.c
@@ -226,6 +226,9 @@ static struct cpufreq_driver exynos_driver = {
 	.exit		= cpufreq_generic_exit,
 	.name		= "exynos_cpufreq",
 	.attr		= cpufreq_generic_attr,
+#ifdef CONFIG_ARM_EXYNOS_CPU_FREQ_BOOST_SW
+	.boost_supported = true,
+#endif
 #ifdef CONFIG_PM
 	.suspend	= exynos_cpufreq_suspend,
 	.resume		= exynos_cpufreq_resume,
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v10 5/7] Documentation:cpufreq:boost: Update BOOST documentation
  2013-11-05 17:26 ` [PATCH v10 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                     ` (3 preceding siblings ...)
  2013-11-05 17:26   ` [PATCH v10 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
@ 2013-11-05 17:26   ` Lukasz Majewski
  2013-11-05 17:26   ` [PATCH v10 6/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
  2013-11-05 17:26   ` [PATCH v10 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412) Lukasz Majewski
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-11-05 17:26 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, Amit Daniel Kachhap

Since the support for software and hardware controlled boosting has been
added, the corresponding Documentation entry had been updated.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v10:
- None

Changes for v9:
- None

Changes for v8:
- None

Changes for v7:
- None

Changes for v6:
- None

Changes for v5:
- New patch

 Documentation/cpu-freq/boost.txt |   26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/Documentation/cpu-freq/boost.txt b/Documentation/cpu-freq/boost.txt
index 9b4edfc..dd62e13 100644
--- a/Documentation/cpu-freq/boost.txt
+++ b/Documentation/cpu-freq/boost.txt
@@ -17,8 +17,8 @@ Introduction
 Some CPUs support a functionality to raise the operating frequency of
 some cores in a multi-core package if certain conditions apply, mostly
 if the whole chip is not fully utilized and below it's intended thermal
-budget. This is done without operating system control by a combination
-of hardware and firmware.
+budget. The decision about boost disable/enable is made either at hardware
+(e.g. x86) or software (e.g ARM).
 On Intel CPUs this is called "Turbo Boost", AMD calls it "Turbo-Core",
 in technical documentation "Core performance boost". In Linux we use
 the term "boost" for convenience.
@@ -48,24 +48,24 @@ be desirable:
 User controlled switch
 ----------------------
 
-To allow the user to toggle the boosting functionality, the acpi-cpufreq
-driver exports a sysfs knob to disable it. There is a file:
+To allow the user to toggle the boosting functionality, the cpufreq core
+driver exports a sysfs knob to enable or disable it. There is a file:
 /sys/devices/system/cpu/cpufreq/boost
 which can either read "0" (boosting disabled) or "1" (boosting enabled).
-Reading the file is always supported, even if the processor does not
-support boosting. In this case the file will be read-only and always
-reads as "0". Explicitly changing the permissions and writing to that
-file anyway will return EINVAL.
+The file is exported only when cpufreq driver supports boosting.
+Explicitly changing the permissions and writing to that file anyway will
+return EINVAL.
 
 On supported CPUs one can write either a "0" or a "1" into this file.
 This will either disable the boost functionality on all cores in the
-whole system (0) or will allow the hardware to boost at will (1).
+whole system (0) or will allow the software or hardware to boost at will
+(1).
 
 Writing a "1" does not explicitly boost the system, but just allows the
-CPU (and the firmware) to boost at their discretion. Some implementations
-take external factors like the chip's temperature into account, so
-boosting once does not necessarily mean that it will occur every time
-even using the exact same software setup.
+CPU to boost at their discretion. Some implementations take external
+factors like the chip's temperature into account, so boosting once does
+not necessarily mean that it will occur every time even using the exact
+same software setup.
 
 
 AMD legacy cpb switch
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v10 6/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ
  2013-11-05 17:26 ` [PATCH v10 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                     ` (4 preceding siblings ...)
  2013-11-05 17:26   ` [PATCH v10 5/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
@ 2013-11-05 17:26   ` Lukasz Majewski
  2013-11-05 17:26   ` [PATCH v10 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412) Lukasz Majewski
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-11-05 17:26 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, Amit Daniel Kachhap

Special driver data flag (CPUFREQ_BOOST_FREQ) has been added to indicate
frequency, which can be only enabled for BOOST mode.
This frequency shall be used only for limited time, since it might cause
target device to overheat.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v10:
- None

Changes for v9:
- None

Changes for v8:
- None

Changes for v7:
- None

Changes for v6:
- New patch

 drivers/cpufreq/exynos4x12-cpufreq.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/cpufreq/exynos4x12-cpufreq.c b/drivers/cpufreq/exynos4x12-cpufreq.c
index 8683304..b2d3a6b1 100644
--- a/drivers/cpufreq/exynos4x12-cpufreq.c
+++ b/drivers/cpufreq/exynos4x12-cpufreq.c
@@ -32,7 +32,7 @@ static unsigned int exynos4x12_volt_table[] = {
 };
 
 static struct cpufreq_frequency_table exynos4x12_freq_table[] = {
-	{L0, CPUFREQ_ENTRY_INVALID},
+	{CPUFREQ_BOOST_FREQ, 1500 * 1000},
 	{L1, 1400 * 1000},
 	{L2, 1300 * 1000},
 	{L3, 1200 * 1000},
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v10 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412)
  2013-11-05 17:26 ` [PATCH v10 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                     ` (5 preceding siblings ...)
  2013-11-05 17:26   ` [PATCH v10 6/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
@ 2013-11-05 17:26   ` Lukasz Majewski
  2013-11-28 13:05     ` Lukasz Majewski
  2013-12-02 14:53       ` Eduardo Valentin
  6 siblings, 2 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-11-05 17:26 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, Amit Daniel Kachhap

This patch provides auto disable/enable operation for boost. It uses already
present thermal infrastructure to provide boost hysteresis.
A special set of TMU data has been defined for Exynos4412, which is only
considered when BOOST is enabled.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v10:
    - Remove boost related code from thermal_core.c
    - Use already present thermal infrastructure to provide thermal hysteresis
    - Introduce special set of TMU data for BOOST

Changes for v9:
    - None

Changes for v8:
    - Move cpufreq_boost_* stub functions definition (needed when cpufreq
      is not compiled in) to cpufreq.h at cpufreq core support commit

Changes for v7:
    - None

Changes for v6:
    - Disable boost only when supported and enabled
    - Protect boost related thermal_zone_device struct fields with mutex
    - Evaluate temperature trend during boost enable decision
    - Create separate methods to handle boost enable/disable
      (thermal_boost_{enable|disable}) operations
    - Boost is disabled at any trip point passage (not only the non critical one)
    - Add stub definitions for cpufreq boost functions used when
      CONFIG_CPU_FREQ is NOT defined.

Changes for v5:
    - Move boost disable code from cpu_cooling.c to thermal_core.c
      (to handle_non_critical_trips)
    - Extent struct thermal_zone_device by adding overheated bool flag
    - Implement auto enable of boost after device cools down
    - Introduce boost_polling flag, which indicates if thermal uses it's predefined
      pool delay or has woken up thermal workqueue only to wait until device
      cools down.

Changes for v4:
    - New patch

 drivers/thermal/samsung/exynos_tmu_data.c |   47 +++++++++++++++++++++++++++++
 1 file changed, 47 insertions(+)

diff --git a/drivers/thermal/samsung/exynos_tmu_data.c b/drivers/thermal/samsung/exynos_tmu_data.c
index 073c292..9346926 100644
--- a/drivers/thermal/samsung/exynos_tmu_data.c
+++ b/drivers/thermal/samsung/exynos_tmu_data.c
@@ -167,13 +167,60 @@ static const struct exynos_tmu_registers exynos4412_tmu_registers = {
 	.features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_TRIM_RELOAD | \
 			TMU_SUPPORT_FALLING_TRIP | TMU_SUPPORT_READY_STATUS | \
 			TMU_SUPPORT_EMUL_TIME)
+
+#define EXYNOS4412_TMU_DATA_BOOST \
+	.threshold_falling = 10, \
+	.trigger_levels[0] = 70, \
+	.trigger_levels[1] = 85, \
+	.trigger_levels[2] = 103, \
+	.trigger_levels[3] = 110, \
+	.trigger_enable[0] = true, \
+	.trigger_enable[1] = true, \
+	.trigger_enable[2] = true, \
+	.trigger_enable[3] = true, \
+	.trigger_type[0] = THROTTLE_ACTIVE, \
+	.trigger_type[1] = THROTTLE_ACTIVE, \
+	.trigger_type[2] = THROTTLE_ACTIVE, \
+	.trigger_type[3] = SW_TRIP, \
+	.max_trigger_level = 4, \
+	.gain = 8, \
+	.reference_voltage = 16, \
+	.noise_cancel_mode = 4, \
+	.cal_type = TYPE_ONE_POINT_TRIMMING, \
+	.efuse_value = 55, \
+	.min_efuse_value = 40, \
+	.max_efuse_value = 100, \
+	.first_point_trim = 25, \
+	.second_point_trim = 85, \
+	.default_temp_offset = 50, \
+	.freq_tab[0] = { \
+		.freq_clip_max = 1400 * 1000, \
+		.temp_level = 70, \
+	}, \
+	.freq_tab[1] = { \
+		.freq_clip_max = 800 * 1000, \
+		.temp_level = 85, \
+	}, \
+	.freq_tab[2] = { \
+		.freq_clip_max = 200 * 1000, \
+		.temp_level = 103, \
+	}, \
+	.freq_tab_count = 3, \
+	.registers = &exynos4412_tmu_registers, \
+	.features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_TRIM_RELOAD | \
+			TMU_SUPPORT_FALLING_TRIP | TMU_SUPPORT_READY_STATUS | \
+			TMU_SUPPORT_EMUL_TIME)
 #endif
 
 #if defined(CONFIG_SOC_EXYNOS4412)
 struct exynos_tmu_init_data const exynos4412_default_tmu_data = {
 	.tmu_data = {
 		{
+#ifdef CONFIG_CPU_FREQ_BOOST_SW
+			EXYNOS4412_TMU_DATA_BOOST,
+#else
 			EXYNOS4412_TMU_DATA,
+#endif
 			.type = SOC_ARCH_EXYNOS4412,
 			.test_mux = EXYNOS4412_MUX_ADDR_VALUE,
 		},
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* Re: [PATCH v10 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412)
  2013-11-05 17:26   ` [PATCH v10 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412) Lukasz Majewski
@ 2013-11-28 13:05     ` Lukasz Majewski
  2013-12-02 14:53       ` Eduardo Valentin
  1 sibling, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-11-28 13:05 UTC (permalink / raw)
  To: Zhang Rui, Eduardo Valentin
  Cc: Lukasz Majewski, Viresh Kumar, Rafael J. Wysocki, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Myungjoo Ham, durgadoss.r,
	Amit Daniel Kachhap

Hi Eduardo, Zhang,

> This patch provides auto disable/enable operation for boost. It uses
> already present thermal infrastructure to provide boost hysteresis.
> A special set of TMU data has been defined for Exynos4412, which is
> only considered when BOOST is enabled.
> 
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> 
> ---
> Changes for v10:
>     - Remove boost related code from thermal_core.c
>     - Use already present thermal infrastructure to provide thermal
> hysteresis
>     - Introduce special set of TMU data for BOOST


Eduardo, Zhang any comments on this patch?



> 
> Changes for v9:
>     - None
> 
> Changes for v8:
>     - Move cpufreq_boost_* stub functions definition (needed when
> cpufreq is not compiled in) to cpufreq.h at cpufreq core support
> commit
> 
> Changes for v7:
>     - None
> 
> Changes for v6:
>     - Disable boost only when supported and enabled
>     - Protect boost related thermal_zone_device struct fields with
> mutex
>     - Evaluate temperature trend during boost enable decision
>     - Create separate methods to handle boost enable/disable
>       (thermal_boost_{enable|disable}) operations
>     - Boost is disabled at any trip point passage (not only the non
> critical one)
>     - Add stub definitions for cpufreq boost functions used when
>       CONFIG_CPU_FREQ is NOT defined.
> 
> Changes for v5:
>     - Move boost disable code from cpu_cooling.c to thermal_core.c
>       (to handle_non_critical_trips)
>     - Extent struct thermal_zone_device by adding overheated bool flag
>     - Implement auto enable of boost after device cools down
>     - Introduce boost_polling flag, which indicates if thermal uses
> it's predefined pool delay or has woken up thermal workqueue only to
> wait until device cools down.
> 
> Changes for v4:
>     - New patch
> 
>  drivers/thermal/samsung/exynos_tmu_data.c |   47
> +++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+)
> 
> diff --git a/drivers/thermal/samsung/exynos_tmu_data.c
> b/drivers/thermal/samsung/exynos_tmu_data.c index 073c292..9346926
> 100644 --- a/drivers/thermal/samsung/exynos_tmu_data.c
> +++ b/drivers/thermal/samsung/exynos_tmu_data.c
> @@ -167,13 +167,60 @@ static const struct exynos_tmu_registers
> exynos4412_tmu_registers = { .features = (TMU_SUPPORT_EMULATION |
> TMU_SUPPORT_TRIM_RELOAD | \ TMU_SUPPORT_FALLING_TRIP |
> TMU_SUPPORT_READY_STATUS | \ TMU_SUPPORT_EMUL_TIME)
> +
> +#define EXYNOS4412_TMU_DATA_BOOST \
> +	.threshold_falling = 10, \
> +	.trigger_levels[0] = 70, \
> +	.trigger_levels[1] = 85, \
> +	.trigger_levels[2] = 103, \
> +	.trigger_levels[3] = 110, \
> +	.trigger_enable[0] = true, \
> +	.trigger_enable[1] = true, \
> +	.trigger_enable[2] = true, \
> +	.trigger_enable[3] = true, \
> +	.trigger_type[0] = THROTTLE_ACTIVE, \
> +	.trigger_type[1] = THROTTLE_ACTIVE, \
> +	.trigger_type[2] = THROTTLE_ACTIVE, \
> +	.trigger_type[3] = SW_TRIP, \
> +	.max_trigger_level = 4, \
> +	.gain = 8, \
> +	.reference_voltage = 16, \
> +	.noise_cancel_mode = 4, \
> +	.cal_type = TYPE_ONE_POINT_TRIMMING, \
> +	.efuse_value = 55, \
> +	.min_efuse_value = 40, \
> +	.max_efuse_value = 100, \
> +	.first_point_trim = 25, \
> +	.second_point_trim = 85, \
> +	.default_temp_offset = 50, \
> +	.freq_tab[0] = { \
> +		.freq_clip_max = 1400 * 1000, \
> +		.temp_level = 70, \
> +	}, \
> +	.freq_tab[1] = { \
> +		.freq_clip_max = 800 * 1000, \
> +		.temp_level = 85, \
> +	}, \
> +	.freq_tab[2] = { \
> +		.freq_clip_max = 200 * 1000, \
> +		.temp_level = 103, \
> +	}, \
> +	.freq_tab_count = 3, \
> +	.registers = &exynos4412_tmu_registers, \
> +	.features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_TRIM_RELOAD
> | \
> +			TMU_SUPPORT_FALLING_TRIP |
> TMU_SUPPORT_READY_STATUS | \
> +			TMU_SUPPORT_EMUL_TIME)
>  #endif
>  
>  #if defined(CONFIG_SOC_EXYNOS4412)
>  struct exynos_tmu_init_data const exynos4412_default_tmu_data = {
>  	.tmu_data = {
>  		{
> +#ifdef CONFIG_CPU_FREQ_BOOST_SW
> +			EXYNOS4412_TMU_DATA_BOOST,
> +#else
>  			EXYNOS4412_TMU_DATA,
> +#endif
>  			.type = SOC_ARCH_EXYNOS4412,
>  			.test_mux = EXYNOS4412_MUX_ADDR_VALUE,
>  		},
-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group


^ permalink raw reply	[flat|nested] 329+ messages in thread

* [PATCH RESEND v10 0/7] cpufreq:boost: CPU Boost mode support
  2013-06-06  7:07 [PATCH 0/5] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                   ` (14 preceding siblings ...)
  2013-11-05 17:26 ` [PATCH v10 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
@ 2013-12-02 12:19 ` Lukasz Majewski
  2013-12-02 12:19   ` [PATCH RESEND v10 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
                     ` (7 more replies)
  2013-12-13 16:38 ` [PATCH v11 " Lukasz Majewski
  2013-12-20 14:24 ` [PATCH v12 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
  17 siblings, 8 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-02 12:19 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, linux-samsung-soc

This patch series introduces support for CPU overclocking technique
called Boost.

It is a follow up of a LAB governor proposal. Boost is a LAB component:
http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq

Boost unifies hardware based solution (e.g. Intel Nehalem) with
software oriented one (like the one done at Exynos).
For this reason cpufreq/freq_table code has been reorganized to include
common code.

Important design decisions:
- Boost related code is compiled-in unconditionally to cpufreq core and
  disabled by default. The cpufreq_driver is responsibile for setting
  boost_supported flag and providing set_boost callback(if HW support
  is needed). For software managed boost, special Kconfig flag -
  CONFIG_CPU_FREQ_BOOST_SW has been defined. It will be selected only
  when a target platform has thermal framework properly configured.

- struct cpufreq_driver has been extended with boost related fields:
        -- boost_supported - when driver supports boosting
        -- boost_enabled - boost state
        -- set_boost - callback to function, which is necessary to
           enable/disable boost

- Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost) is visible
  _only_ when cpufreq driver supports Boost.

- No special spin_lock for Boost was created. The one from cpufreq core
  was reused.

- The Boost code doesn't rely on any policy. When boost state is changed,
  then the policy list is iterated and proper adjustements are done.

- To improve safety level, the thermal framework is also extended to disable
  software boosting, when thermal trip point is reached. After cooling down
  the boost can be enabled again. This emulates behaviour similar to HW
  managed boost (like x86)

Tested at HW:
       Exynos 4412 3.13-rc2 Linux
       Intel Core i7-3770 3.13-rc2 Linux

Above patches were posted on top of kernel_pm/bleeding-edge
(SHA1: 9483a9f69d5c8f83f1723361bf8340ddfb6475b4)


Lukasz Majewski (7):
  cpufreq: Add boost frequency support in core
  cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common
    boost solution
  cpufreq:boost:Kconfig: Provide support for software managed BOOST
  cpufreq:exynos:Extend Exynos cpufreq driver to support boost
    framework
  Documentation:cpufreq:boost: Update BOOST documentation
  cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ
  thermal:exynos:boost: Automatic enable/disable of BOOST feature (at
    Exynos4412)

 Documentation/cpu-freq/boost.txt          |   26 +++----
 drivers/cpufreq/Kconfig                   |    4 +
 drivers/cpufreq/Kconfig.arm               |   15 ++++
 drivers/cpufreq/acpi-cpufreq.c            |   86 +++++++--------------
 drivers/cpufreq/cpufreq.c                 |  118 ++++++++++++++++++++++++++++-
 drivers/cpufreq/exynos-cpufreq.c          |    3 +
 drivers/cpufreq/exynos4x12-cpufreq.c      |    2 +-
 drivers/cpufreq/freq_table.c              |   56 ++++++++++++--
 drivers/thermal/samsung/exynos_tmu_data.c |   47 ++++++++++++
 include/linux/cpufreq.h                   |   24 ++++++
 10 files changed, 302 insertions(+), 79 deletions(-)

-- 
1.7.10.4


^ permalink raw reply	[flat|nested] 329+ messages in thread

* [PATCH RESEND v10 1/7] cpufreq: Add boost frequency support in core
  2013-12-02 12:19 ` [PATCH RESEND v10 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
@ 2013-12-02 12:19   ` Lukasz Majewski
  2013-12-02 12:19   ` [PATCH RESEND v10 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
                     ` (6 subsequent siblings)
  7 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-02 12:19 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, linux-samsung-soc

This commit adds boost frequency support in cpufreq core (Hardware &
Software). Some SoCs (like Exynos4 - e.g. 4x12) allow setting frequency
above its normal operation limits. Such mode shall be only used for a
short time.

Overclocking (boost) support is essentially provided by platform
dependent cpufreq driver.

This commit unifies support for SW and HW (Intel) overclocking solutions
in the core cpufreq driver. Previously the "boost" sysfs attribute was
defined at acpi driver code. By default boost is disabled. One global
attribute is available at: /sys/devices/system/cpu/cpufreq/boost.

It only shows up when cpufreq driver supports overclocking.
Under the hood frequencies dedicated for boosting are marked with a
special flag (CPUFREQ_BOOST_FREQ) at driver's frequency table.
It is the user's concern to enable/disable overclocking with a proper call
to sysfs.

The cpufreq_boost_trigger_state() function is defined non static on purpose.
It is used later with thermal subsystem to provide automatic enable/disable
of the BOOST feature.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v10:
- None

Changes for v9:
- Add cpufreq_freq_attr_scaling_boost_freqs to *cpufreq_generic_attr table
- Introduce CONFIG_CPU_FREQ_BOOST_SW generic config flag to show BOOST
  frequencies only when cpufreq driver supports boost

Changes for v8:
- Correction of error message at cpufreq_boost_trigger_state() function
- Rewrite the cpufreq_boost_set_sw() function to print error message and
  break the loop when policy adjustment fails

Changes for v7:
- Properly change cpufreq_driver->boost_enabled when set_boost() fails
  (=0 to =!state)
- Add likely() around cpufreq_driver
- Remove parenthesis around boost.attr

Changes for v6:
- Remove sysfs boost attribute when subsys_iterface_unregister() fails
- Move global boost_enabled variable from cpufreq.c to platform dependent
  struct cpufreq_driver
- pr_err() message is also printed when boost disable fails
- Call __cpufreq_governor() to force recalculation of next frequency when
  boost is triggered. It is needed with i.e. performance class of governors
- Change cpufreq_boost_enable_sw() -> cpufreq_boost_set_sw()
- Rename .enable_boost function pointer to .set_boost

Changes for v5:
- Rename cpufreq_boost_trigger_state_sw() to cpufreq_boost_enable_sw()
- Extent cpufreq_register_driver() to check if cpufreq driver provided
  boost_enable callback. If not provided, then use cpufreq_boost_enable_sw()
- Use single call to cpufreq_driver->enable_boost() with cpufreq driver
  provided callback or default SW boost enable routine
- Move pr_debug call to store_boost() from cpufreq_boost_trigger_state()
- Change the user_policy.max value when SW boost is toggled. It is necessary
  for proper operation of e.g. thermal subsystem.
- Add check if cpufreq_driver pointer is not NULL at
  cpufreq_boost_supported() routine
- Add EXPORT_SYMBOL_GPL for cpufreq_boost_supported() and
  cpufreq_boost_enabled()
- Remove extra check for cpufreq_boost_supported() at
  cpufreq_freq_table_cpuinfo()
- Explanation of show boost logic at show_available_freqs()
- Add cpufreq_set_boost_enabled() method to set initial value of boost_enabled
  global flag

Changes for v4:
- Remove boost parameter from cpufreq_frequency_table_cpuinfo() function
- Introduce cpufreq_boost_supported() method
- Use of cpufreq_boost_supported() and cpufreq_boost_enabled() to decide
  if frequency shall be skipped
- Rename set_boost_freq() to enable_boost()
- cpufreq_attr_available_freq() moved to freq_table.c
- Use policy list to get access to cpufreq policies
- Rename global boost flag (cpufreq_boost_enabled -> boost_enabled)
- pr_err corrected ( %sable)
- Remove sanity check at cpufreq_boost_trigger_state() entrance [to test if
  boost is supported]
- Use either HW (boost_enable) callback or SW managed boost
- Introduce new cpufreq_boost_trigger_state_sw() method to handle boost
  at SW.
- Protect boost_enabled manipulation with lock.

Changes for v3:
- Method for reading boost status
- Removal of cpufreq_frequency_table_max()
- Extent cpufreq_frequency_table_cpuinfo() to support boost parameter
- boost_supported flag added to cpufreq_driver struct
- "boost" sysfs attribute control flag removed
- One global flag describing state of the boost defined at cpufreq core
- Rename cpufreq_driver's low_level_boost field to set_boost_freq()
- Usage of cpufreq_sysfs_{remove|add}_file() routines

Changes for v2:
- Removal of cpufreq_boost structure and move its fields to cpufreq_driver
  structure
- Flag to indicate if global boost attribute is already defined
- Extent the pr_{err|debbug} functions to show current function names

 drivers/cpufreq/cpufreq.c    |  118 +++++++++++++++++++++++++++++++++++++++++-
 drivers/cpufreq/freq_table.c |   56 +++++++++++++++++---
 include/linux/cpufreq.h      |   24 +++++++++
 3 files changed, 190 insertions(+), 8 deletions(-)

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 606224a..a0d1ea0 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -328,6 +328,33 @@ EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
 /*********************************************************************
  *                          SYSFS INTERFACE                          *
  *********************************************************************/
+ssize_t show_boost(struct kobject *kobj,
+				 struct attribute *attr, char *buf)
+{
+	return sprintf(buf, "%d\n", cpufreq_driver->boost_enabled);
+}
+
+static ssize_t store_boost(struct kobject *kobj, struct attribute *attr,
+				  const char *buf, size_t count)
+{
+	int ret, enable;
+
+	ret = sscanf(buf, "%d", &enable);
+	if (ret != 1 || enable < 0 || enable > 1)
+		return -EINVAL;
+
+	if (cpufreq_boost_trigger_state(enable)) {
+		pr_err("%s: Cannot %s BOOST!\n", __func__,
+		       enable ? "enable" : "disable");
+		return -EINVAL;
+	}
+
+	pr_debug("%s: cpufreq BOOST %s\n", __func__,
+		 enable ? "enabled" : "disabled");
+
+	return count;
+}
+define_one_global_rw(boost);
 
 static struct cpufreq_governor *__find_governor(const char *str_governor)
 {
@@ -2149,6 +2176,73 @@ static struct notifier_block __refdata cpufreq_cpu_notifier = {
 };
 
 /*********************************************************************
+ *               BOOST						     *
+ *********************************************************************/
+static int cpufreq_boost_set_sw(int state)
+{
+	struct cpufreq_frequency_table *freq_table;
+	struct cpufreq_policy *policy;
+	int ret = -EINVAL;
+
+	list_for_each_entry(policy, &cpufreq_policy_list, policy_list) {
+		freq_table = cpufreq_frequency_get_table(policy->cpu);
+		if (freq_table) {
+			ret = cpufreq_frequency_table_cpuinfo(policy,
+							freq_table);
+			if (ret) {
+				pr_err("%s: Policy frequency update failed\n",
+				       __func__);
+				break;
+			}
+			policy->user_policy.max = policy->max;
+			__cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
+		}
+	}
+
+	return ret;
+}
+
+int cpufreq_boost_trigger_state(int state)
+{
+	unsigned long flags;
+	int ret = 0;
+
+	if (cpufreq_driver->boost_enabled == state)
+		return 0;
+
+	write_lock_irqsave(&cpufreq_driver_lock, flags);
+	cpufreq_driver->boost_enabled = state;
+	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
+
+	ret = cpufreq_driver->set_boost(state);
+	if (ret) {
+		write_lock_irqsave(&cpufreq_driver_lock, flags);
+		cpufreq_driver->boost_enabled = !state;
+		write_unlock_irqrestore(&cpufreq_driver_lock, flags);
+
+		pr_err("%s: Cannot %s BOOST\n", __func__,
+		       state ? "enable" : "disable");
+	}
+
+	return ret;
+}
+
+int cpufreq_boost_supported(void)
+{
+	if (likely(cpufreq_driver))
+		return cpufreq_driver->boost_supported;
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(cpufreq_boost_supported);
+
+int cpufreq_boost_enabled(void)
+{
+	return cpufreq_driver->boost_enabled;
+}
+EXPORT_SYMBOL_GPL(cpufreq_boost_enabled);
+
+/*********************************************************************
  *               REGISTER / UNREGISTER CPUFREQ DRIVER                *
  *********************************************************************/
 
@@ -2188,9 +2282,25 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 	cpufreq_driver = driver_data;
 	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
 
+	if (cpufreq_boost_supported()) {
+		/*
+		 * Check if driver provides function to enable boost -
+		 * if not, use cpufreq_boost_set_sw as default
+		 */
+		if (!cpufreq_driver->set_boost)
+			cpufreq_driver->set_boost = cpufreq_boost_set_sw;
+
+		ret = cpufreq_sysfs_create_file(&boost.attr);
+		if (ret) {
+			pr_err("%s: cannot register global BOOST sysfs file\n",
+				__func__);
+			goto err_null_driver;
+		}
+	}
+
 	ret = subsys_interface_register(&cpufreq_interface);
 	if (ret)
-		goto err_null_driver;
+		goto err_boost_unreg;
 
 	if (!(cpufreq_driver->flags & CPUFREQ_STICKY)) {
 		int i;
@@ -2217,6 +2327,9 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 	return 0;
 err_if_unreg:
 	subsys_interface_unregister(&cpufreq_interface);
+err_boost_unreg:
+	if (cpufreq_boost_supported())
+		cpufreq_sysfs_remove_file(&boost.attr);
 err_null_driver:
 	write_lock_irqsave(&cpufreq_driver_lock, flags);
 	cpufreq_driver = NULL;
@@ -2243,6 +2356,9 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
 	pr_debug("unregistering driver %s\n", driver->name);
 
 	subsys_interface_unregister(&cpufreq_interface);
+	if (cpufreq_boost_supported())
+		cpufreq_sysfs_remove_file(&boost.attr);
+
 	unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
 
 	down_write(&cpufreq_rwsem);
diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c
index 3458d27..776e88a 100644
--- a/drivers/cpufreq/freq_table.c
+++ b/drivers/cpufreq/freq_table.c
@@ -32,6 +32,10 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
 
 			continue;
 		}
+		if (!cpufreq_boost_enabled()
+		    && table[i].driver_data == CPUFREQ_BOOST_FREQ)
+			continue;
+
 		pr_debug("table entry %u: %u kHz, %u driver_data\n",
 					i, freq, table[i].driver_data);
 		if (freq < min_freq)
@@ -182,7 +186,8 @@ static DEFINE_PER_CPU(struct cpufreq_frequency_table *, cpufreq_show_table);
 /**
  * show_available_freqs - show available frequencies for the specified CPU
  */
-static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
+static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf,
+				    bool show_boost)
 {
 	unsigned int i = 0;
 	unsigned int cpu = policy->cpu;
@@ -197,6 +202,20 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
 	for (i = 0; (table[i].frequency != CPUFREQ_TABLE_END); i++) {
 		if (table[i].frequency == CPUFREQ_ENTRY_INVALID)
 			continue;
+		/*
+		 * show_boost = true and driver_data = BOOST freq
+		 * display BOOST freqs
+		 *
+		 * show_boost = false and driver_data = BOOST freq
+		 * show_boost = true and driver_data != BOOST freq
+		 * continue - do not display anything
+		 *
+		 * show_boost = false and driver_data != BOOST freq
+		 * display NON BOOST freqs
+		 */
+		if (show_boost ^ (table[i].driver_data == CPUFREQ_BOOST_FREQ))
+			continue;
+
 		count += sprintf(&buf[count], "%d ", table[i].frequency);
 	}
 	count += sprintf(&buf[count], "\n");
@@ -205,16 +224,39 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
 
 }
 
-struct freq_attr cpufreq_freq_attr_scaling_available_freqs = {
-	.attr = { .name = "scaling_available_frequencies",
-		  .mode = 0444,
-		},
-	.show = show_available_freqs,
-};
+#define cpufreq_attr_available_freq(_name)	  \
+struct freq_attr cpufreq_freq_attr_##_name##_freqs =     \
+__ATTR_RO(_name##_frequencies)
+
+/**
+ * show_scaling_available_frequencies - show available normal frequencies for
+ * the specified CPU
+ */
+static ssize_t scaling_available_frequencies_show(struct cpufreq_policy *policy,
+						  char *buf)
+{
+	return show_available_freqs(policy, buf, false);
+}
+cpufreq_attr_available_freq(scaling_available);
 EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_available_freqs);
 
+/**
+ * show_available_boost_freqs - show available boost frequencies for
+ * the specified CPU
+ */
+static ssize_t scaling_boost_frequencies_show(struct cpufreq_policy *policy,
+					      char *buf)
+{
+	return show_available_freqs(policy, buf, true);
+}
+cpufreq_attr_available_freq(scaling_boost);
+EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_boost_freqs);
+
 struct freq_attr *cpufreq_generic_attr[] = {
 	&cpufreq_freq_attr_scaling_available_freqs,
+#ifdef CONFIG_CPU_FREQ_BOOST_SW
+	&cpufreq_freq_attr_scaling_boost_freqs,
+#endif
 	NULL,
 };
 EXPORT_SYMBOL_GPL(cpufreq_generic_attr);
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index ee5fe9d..68f32dc 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -225,6 +225,11 @@ struct cpufreq_driver {
 	int	(*suspend)	(struct cpufreq_policy *policy);
 	int	(*resume)	(struct cpufreq_policy *policy);
 	struct freq_attr	**attr;
+
+	/* platform specific boost support code */
+	bool                    boost_supported;
+	bool                    boost_enabled;
+	int     (*set_boost)    (int state);
 };
 
 /* flags */
@@ -428,6 +433,7 @@ extern struct cpufreq_governor cpufreq_gov_conservative;
 
 #define CPUFREQ_ENTRY_INVALID ~0
 #define CPUFREQ_TABLE_END     ~1
+#define CPUFREQ_BOOST_FREQ    ~2
 
 struct cpufreq_frequency_table {
 	unsigned int	driver_data; /* driver specific data, not used by core */
@@ -451,6 +457,24 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
 void cpufreq_frequency_table_update_policy_cpu(struct cpufreq_policy *policy);
 ssize_t cpufreq_show_cpus(const struct cpumask *mask, char *buf);
 
+#ifdef CONFIG_CPU_FREQ
+int cpufreq_boost_trigger_state(int state);
+int cpufreq_boost_supported(void);
+int cpufreq_boost_enabled(void);
+#else
+static inline int cpufreq_boost_trigger_state(int state)
+{
+	return 0;
+}
+static inline int cpufreq_boost_supported(void)
+{
+	return 0;
+}
+static inline int cpufreq_boost_enabled(void)
+{
+	return 0;
+}
+#endif
 /* the following funtion is for cpufreq core use only */
 struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu);
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH RESEND v10 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution
  2013-12-02 12:19 ` [PATCH RESEND v10 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
  2013-12-02 12:19   ` [PATCH RESEND v10 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
@ 2013-12-02 12:19   ` Lukasz Majewski
  2013-12-02 12:19   ` [PATCH RESEND v10 3/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
                     ` (5 subsequent siblings)
  7 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-02 12:19 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, linux-samsung-soc

The Intel's hardware based boost solution driver has been changed to cooperate with
common cpufreq boost framework.

The global sysfs boost attribute entry code (/sys/devices/system/cpu/cpufreq/boost)
has been moved to a core cpufreq code. This attribute is now only visible,
when cpufreq driver supports it.

The _store_boost() function has been redesigned to be used as set_boost
callback.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v10:
- None

Changes for v9:
- None

Changes for v8:
- None

Changes for v7:
- Remove superfluous acpi_cpufreq_driver.boost_supported = false at
  acpi_cpufreq_boost_init()

Changes for v6:
- Perform acpi_cpufreq_boost_init initialization before cpufreq_driver
  registration
- Compile store_boost() only when CONFIG_X86_ACPI_CPUFREQ_CPB defined
- Use boost_enabled flag defined at acpi_cpufreq_driver to store information
  about boost state
- Instead of using cpufreq_set_boost_enabled(), modify the boost_enable in
  the acpi driver code

Changes for v5:
- Remove acpi-cpufreq's boost_enabled global flag and reuse one defined at
  cpufreq core

Changes for v4:
- add _store_boost to acpi_cpufreq_driver structure

Changes for v3:
- Bring back boost_enabled as a global flag
- Move boost_supported to cpufreq_driver structure

Changes for v2:
- Replace boost_enabled and boost_supported global flags with proper entries
  at struct cpufreq_driver.
- Removal of struct cpufreq_boost

 drivers/cpufreq/acpi-cpufreq.c |   86 ++++++++++++++--------------------------
 1 file changed, 29 insertions(+), 57 deletions(-)

diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c
index caf41eb..79e5608 100644
--- a/drivers/cpufreq/acpi-cpufreq.c
+++ b/drivers/cpufreq/acpi-cpufreq.c
@@ -80,7 +80,6 @@ static struct acpi_processor_performance __percpu *acpi_perf_data;
 static struct cpufreq_driver acpi_cpufreq_driver;
 
 static unsigned int acpi_pstate_strict;
-static bool boost_enabled, boost_supported;
 static struct msr __percpu *msrs;
 
 static bool boost_state(unsigned int cpu)
@@ -133,49 +132,16 @@ static void boost_set_msrs(bool enable, const struct cpumask *cpumask)
 	wrmsr_on_cpus(cpumask, msr_addr, msrs);
 }
 
-static ssize_t _store_boost(const char *buf, size_t count)
+static int _store_boost(int val)
 {
-	int ret;
-	unsigned long val = 0;
-
-	if (!boost_supported)
-		return -EINVAL;
-
-	ret = kstrtoul(buf, 10, &val);
-	if (ret || (val > 1))
-		return -EINVAL;
-
-	if ((val && boost_enabled) || (!val && !boost_enabled))
-		return count;
-
 	get_online_cpus();
-
 	boost_set_msrs(val, cpu_online_mask);
-
 	put_online_cpus();
-
-	boost_enabled = val;
 	pr_debug("Core Boosting %sabled.\n", val ? "en" : "dis");
 
-	return count;
-}
-
-static ssize_t store_global_boost(struct kobject *kobj, struct attribute *attr,
-				  const char *buf, size_t count)
-{
-	return _store_boost(buf, count);
-}
-
-static ssize_t show_global_boost(struct kobject *kobj,
-				 struct attribute *attr, char *buf)
-{
-	return sprintf(buf, "%u\n", boost_enabled);
+	return 0;
 }
 
-static struct global_attr global_boost = __ATTR(boost, 0644,
-						show_global_boost,
-						store_global_boost);
-
 static ssize_t show_freqdomain_cpus(struct cpufreq_policy *policy, char *buf)
 {
 	struct acpi_cpufreq_data *data = per_cpu(acfreq_data, policy->cpu);
@@ -186,15 +152,32 @@ static ssize_t show_freqdomain_cpus(struct cpufreq_policy *policy, char *buf)
 cpufreq_freq_attr_ro(freqdomain_cpus);
 
 #ifdef CONFIG_X86_ACPI_CPUFREQ_CPB
+static ssize_t store_boost(const char *buf, size_t count)
+{
+	int ret;
+	unsigned long val = 0;
+
+	if (!acpi_cpufreq_driver.boost_supported)
+		return -EINVAL;
+
+	ret = kstrtoul(buf, 10, &val);
+	if (ret || (val > 1))
+		return -EINVAL;
+
+	_store_boost((int) val);
+
+	return count;
+}
+
 static ssize_t store_cpb(struct cpufreq_policy *policy, const char *buf,
 			 size_t count)
 {
-	return _store_boost(buf, count);
+	return store_boost(buf, count);
 }
 
 static ssize_t show_cpb(struct cpufreq_policy *policy, char *buf)
 {
-	return sprintf(buf, "%u\n", boost_enabled);
+	return sprintf(buf, "%u\n", acpi_cpufreq_driver.boost_enabled);
 }
 
 cpufreq_freq_attr_rw(cpb);
@@ -554,7 +537,7 @@ static int boost_notify(struct notifier_block *nb, unsigned long action,
 	switch (action) {
 	case CPU_UP_PREPARE:
 	case CPU_UP_PREPARE_FROZEN:
-		boost_set_msrs(boost_enabled, cpumask);
+		boost_set_msrs(acpi_cpufreq_driver.boost_enabled, cpumask);
 		break;
 
 	case CPU_DOWN_PREPARE:
@@ -911,6 +894,7 @@ static struct cpufreq_driver acpi_cpufreq_driver = {
 	.resume		= acpi_cpufreq_resume,
 	.name		= "acpi-cpufreq",
 	.attr		= acpi_cpufreq_attr,
+	.set_boost      = _store_boost,
 };
 
 static void __init acpi_cpufreq_boost_init(void)
@@ -921,33 +905,22 @@ static void __init acpi_cpufreq_boost_init(void)
 		if (!msrs)
 			return;
 
-		boost_supported = true;
-		boost_enabled = boost_state(0);
-
+		acpi_cpufreq_driver.boost_supported = true;
+		acpi_cpufreq_driver.boost_enabled = boost_state(0);
 		get_online_cpus();
 
 		/* Force all MSRs to the same value */
-		boost_set_msrs(boost_enabled, cpu_online_mask);
+		boost_set_msrs(acpi_cpufreq_driver.boost_enabled,
+			       cpu_online_mask);
 
 		register_cpu_notifier(&boost_nb);
 
 		put_online_cpus();
-	} else
-		global_boost.attr.mode = 0444;
-
-	/* We create the boost file in any case, though for systems without
-	 * hardware support it will be read-only and hardwired to return 0.
-	 */
-	if (cpufreq_sysfs_create_file(&(global_boost.attr)))
-		pr_warn(PFX "could not register global boost sysfs file\n");
-	else
-		pr_debug("registered global boost sysfs file\n");
+	}
 }
 
 static void __exit acpi_cpufreq_boost_exit(void)
 {
-	cpufreq_sysfs_remove_file(&(global_boost.attr));
-
 	if (msrs) {
 		unregister_cpu_notifier(&boost_nb);
 
@@ -993,12 +966,11 @@ static int __init acpi_cpufreq_init(void)
 			*iter = &cpb;
 	}
 #endif
+	acpi_cpufreq_boost_init();
 
 	ret = cpufreq_register_driver(&acpi_cpufreq_driver);
 	if (ret)
 		free_acpi_perf_data();
-	else
-		acpi_cpufreq_boost_init();
 
 	return ret;
 }
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH RESEND v10 3/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST
  2013-12-02 12:19 ` [PATCH RESEND v10 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
  2013-12-02 12:19   ` [PATCH RESEND v10 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
  2013-12-02 12:19   ` [PATCH RESEND v10 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
@ 2013-12-02 12:19   ` Lukasz Majewski
  2013-12-02 12:19   ` [PATCH RESEND v10 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
                     ` (4 subsequent siblings)
  7 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-02 12:19 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, linux-samsung-soc

For safety reasons new flag - CONFIG_CPU_FREQ_BOOST_SW has been added.
Only after selecting "EXYNOS Frequency Overclocking - Software" Kconfig
option the software managed boost is enabled. It also selects thermal
subsystem to be compiled in. Thermal is necessary for disabling boost
and cooling down the device when overheating detected.

Boost _MUST_NOT_ work without thermal subsystem with properly defined
overheating temperatures.

This option doesn't affect x86's ACPI hardware managed boost support
(i.e. Intel, AMD). In this situation boost management is embedded at
hardware.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v10:
- None

Changes for v9:
- None

Changes for v8:
- None

Changes for v7:
- Remove superfluous "default n" definition
- Generic CPU_FREQ_BOOST_SW depends on THERMAL

Changes for v6:
- CPU_FREQ_BOOST_SW [1] is now defined as "invisible" bool option.
- Platform dependent ARM_EXYNOS_CPU_FREQ_BOOST_SW config option has been
  added. It depends on ARM_EXYNOS_CPUFREQ options and selects
  EXYNOS_THERMAL with the main boost config [1].

Changes for v5:
- New patch

 drivers/cpufreq/Kconfig     |    4 ++++
 drivers/cpufreq/Kconfig.arm |   15 +++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
index 38093e2..c8818c1 100644
--- a/drivers/cpufreq/Kconfig
+++ b/drivers/cpufreq/Kconfig
@@ -20,6 +20,10 @@ if CPU_FREQ
 config CPU_FREQ_GOV_COMMON
 	bool
 
+config CPU_FREQ_BOOST_SW
+	bool
+	depends on THERMAL
+
 config CPU_FREQ_STAT
 	tristate "CPU frequency translation statistics"
 	default y
diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm
index ce52ed9..25599d6 100644
--- a/drivers/cpufreq/Kconfig.arm
+++ b/drivers/cpufreq/Kconfig.arm
@@ -64,6 +64,21 @@ config ARM_EXYNOS5440_CPUFREQ
 
 	  If in doubt, say N.
 
+config ARM_EXYNOS_CPU_FREQ_BOOST_SW
+	bool "EXYNOS Frequency Overclocking - Software"
+	depends on ARM_EXYNOS_CPUFREQ
+	select CPU_FREQ_BOOST_SW
+	select EXYNOS_THERMAL
+	help
+	  This driver supports software managed overclocking (BOOST).
+	  It allows usage of special frequencies for Samsung Exynos
+	  processors if thermal conditions are appropriate.
+
+	  It reguires, for safe operation, thermal framework with properly
+	  defined trip points.
+
+	  If in doubt, say N.
+
 config ARM_HIGHBANK_CPUFREQ
 	tristate "Calxeda Highbank-based"
 	depends on ARCH_HIGHBANK
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH RESEND v10 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework
  2013-12-02 12:19 ` [PATCH RESEND v10 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                     ` (2 preceding siblings ...)
  2013-12-02 12:19   ` [PATCH RESEND v10 3/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
@ 2013-12-02 12:19   ` Lukasz Majewski
  2013-12-02 12:19   ` [PATCH RESEND v10 5/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
                     ` (3 subsequent siblings)
  7 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-02 12:19 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, linux-samsung-soc

The cpufreq_driver's boost_supported flag is true only when boost
support is explicitly enabled. Boost related attributes are exported only
under the same condition.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v10:
- None

Changes for v9:
- The exynos_cpufreq_attr[] has been replaced by generic_cpufreq_attr[],
  therefore the cpufreq_freq_attr_scaling_boost_freqs is now added at
  freq_table.c file.

Changes for v8:
- None

Changes for v7:
- Replace CONFIG_CPU_FREQ_BOOST_SW with CONFIG_ARM_EXYNOS_CPU_FREQ_BOOST_SW
- Move boost_supported initialization to struct cpufreq_driver exynos_driver

Changes for v6:
- Replace exynos_driver.boost_supported = 1 to = true
- Protect boost attributes export with CONFIG_CPU_FREQ_BOOST_SW

Changes for v5:
- None

Changes for v4:
- None

Changes for v3:
- Remove low level boost code
- Move boost management code to cpufreq core code
- Use boost_supported flag to indicate if driver supports over clocking

Changes for v2:
- Removal of struct cpufreq_boost
- Removal of the CONFIG_CPU_FREQ_BOOST flag
- low_level_boost with valid address when boost is supported

 drivers/cpufreq/exynos-cpufreq.c |    3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/cpufreq/exynos-cpufreq.c b/drivers/cpufreq/exynos-cpufreq.c
index f3c2287..3cd6d2e 100644
--- a/drivers/cpufreq/exynos-cpufreq.c
+++ b/drivers/cpufreq/exynos-cpufreq.c
@@ -226,6 +226,9 @@ static struct cpufreq_driver exynos_driver = {
 	.exit		= cpufreq_generic_exit,
 	.name		= "exynos_cpufreq",
 	.attr		= cpufreq_generic_attr,
+#ifdef CONFIG_ARM_EXYNOS_CPU_FREQ_BOOST_SW
+	.boost_supported = true,
+#endif
 #ifdef CONFIG_PM
 	.suspend	= exynos_cpufreq_suspend,
 	.resume		= exynos_cpufreq_resume,
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH RESEND v10 5/7] Documentation:cpufreq:boost: Update BOOST documentation
  2013-12-02 12:19 ` [PATCH RESEND v10 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                     ` (3 preceding siblings ...)
  2013-12-02 12:19   ` [PATCH RESEND v10 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
@ 2013-12-02 12:19   ` Lukasz Majewski
  2013-12-02 12:19   ` [PATCH RESEND v10 6/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
                     ` (2 subsequent siblings)
  7 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-02 12:19 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, linux-samsung-soc

Since the support for software and hardware controlled boosting has been
added, the corresponding Documentation entry had been updated.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v10:
- None

Changes for v9:
- None

Changes for v8:
- None

Changes for v7:
- None

Changes for v6:
- None

Changes for v5:
- New patch

 Documentation/cpu-freq/boost.txt |   26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/Documentation/cpu-freq/boost.txt b/Documentation/cpu-freq/boost.txt
index 9b4edfc..dd62e13 100644
--- a/Documentation/cpu-freq/boost.txt
+++ b/Documentation/cpu-freq/boost.txt
@@ -17,8 +17,8 @@ Introduction
 Some CPUs support a functionality to raise the operating frequency of
 some cores in a multi-core package if certain conditions apply, mostly
 if the whole chip is not fully utilized and below it's intended thermal
-budget. This is done without operating system control by a combination
-of hardware and firmware.
+budget. The decision about boost disable/enable is made either at hardware
+(e.g. x86) or software (e.g ARM).
 On Intel CPUs this is called "Turbo Boost", AMD calls it "Turbo-Core",
 in technical documentation "Core performance boost". In Linux we use
 the term "boost" for convenience.
@@ -48,24 +48,24 @@ be desirable:
 User controlled switch
 ----------------------
 
-To allow the user to toggle the boosting functionality, the acpi-cpufreq
-driver exports a sysfs knob to disable it. There is a file:
+To allow the user to toggle the boosting functionality, the cpufreq core
+driver exports a sysfs knob to enable or disable it. There is a file:
 /sys/devices/system/cpu/cpufreq/boost
 which can either read "0" (boosting disabled) or "1" (boosting enabled).
-Reading the file is always supported, even if the processor does not
-support boosting. In this case the file will be read-only and always
-reads as "0". Explicitly changing the permissions and writing to that
-file anyway will return EINVAL.
+The file is exported only when cpufreq driver supports boosting.
+Explicitly changing the permissions and writing to that file anyway will
+return EINVAL.
 
 On supported CPUs one can write either a "0" or a "1" into this file.
 This will either disable the boost functionality on all cores in the
-whole system (0) or will allow the hardware to boost at will (1).
+whole system (0) or will allow the software or hardware to boost at will
+(1).
 
 Writing a "1" does not explicitly boost the system, but just allows the
-CPU (and the firmware) to boost at their discretion. Some implementations
-take external factors like the chip's temperature into account, so
-boosting once does not necessarily mean that it will occur every time
-even using the exact same software setup.
+CPU to boost at their discretion. Some implementations take external
+factors like the chip's temperature into account, so boosting once does
+not necessarily mean that it will occur every time even using the exact
+same software setup.
 
 
 AMD legacy cpb switch
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH RESEND v10 6/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ
  2013-12-02 12:19 ` [PATCH RESEND v10 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                     ` (4 preceding siblings ...)
  2013-12-02 12:19   ` [PATCH RESEND v10 5/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
@ 2013-12-02 12:19   ` Lukasz Majewski
  2013-12-02 12:19   ` [PATCH RESEND v10 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412) Lukasz Majewski
  2013-12-04  6:59   ` [PATCH RESEND v10 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
  7 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-02 12:19 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, linux-samsung-soc

Special driver data flag (CPUFREQ_BOOST_FREQ) has been added to indicate
frequency, which can be only enabled for BOOST mode.
This frequency shall be used only for limited time, since it might cause
target device to overheat.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v10:
- None

Changes for v9:
- None

Changes for v8:
- None

Changes for v7:
- None

Changes for v6:
- New patch

 drivers/cpufreq/exynos4x12-cpufreq.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/cpufreq/exynos4x12-cpufreq.c b/drivers/cpufreq/exynos4x12-cpufreq.c
index efad5e6..77ae129 100644
--- a/drivers/cpufreq/exynos4x12-cpufreq.c
+++ b/drivers/cpufreq/exynos4x12-cpufreq.c
@@ -32,7 +32,7 @@ static unsigned int exynos4x12_volt_table[] = {
 };
 
 static struct cpufreq_frequency_table exynos4x12_freq_table[] = {
-	{L0, CPUFREQ_ENTRY_INVALID},
+	{CPUFREQ_BOOST_FREQ, 1500 * 1000},
 	{L1, 1400 * 1000},
 	{L2, 1300 * 1000},
 	{L3, 1200 * 1000},
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH RESEND v10 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412)
  2013-12-02 12:19 ` [PATCH RESEND v10 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                     ` (5 preceding siblings ...)
  2013-12-02 12:19   ` [PATCH RESEND v10 6/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
@ 2013-12-02 12:19   ` Lukasz Majewski
  2013-12-04  6:59   ` [PATCH RESEND v10 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
  7 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-02 12:19 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, linux-samsung-soc

This patch provides auto disable/enable operation for boost. It uses already
present thermal infrastructure to provide boost hysteresis.
A special set of TMU data has been defined for Exynos4412, which is only
considered when BOOST is enabled.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v10:
    - Remove boost related code from thermal_core.c
    - Use already present thermal infrastructure to provide thermal hysteresis
    - Introduce special set of TMU data for BOOST

Changes for v9:
    - None

Changes for v8:
    - Move cpufreq_boost_* stub functions definition (needed when cpufreq
      is not compiled in) to cpufreq.h at cpufreq core support commit

Changes for v7:
    - None

Changes for v6:
    - Disable boost only when supported and enabled
    - Protect boost related thermal_zone_device struct fields with mutex
    - Evaluate temperature trend during boost enable decision
    - Create separate methods to handle boost enable/disable
      (thermal_boost_{enable|disable}) operations
    - Boost is disabled at any trip point passage (not only the non critical one)
    - Add stub definitions for cpufreq boost functions used when
      CONFIG_CPU_FREQ is NOT defined.

Changes for v5:
    - Move boost disable code from cpu_cooling.c to thermal_core.c
      (to handle_non_critical_trips)
    - Extent struct thermal_zone_device by adding overheated bool flag
    - Implement auto enable of boost after device cools down
    - Introduce boost_polling flag, which indicates if thermal uses it's predefined
      pool delay or has woken up thermal workqueue only to wait until device
      cools down.

Changes for v4:
    - New patch

 drivers/thermal/samsung/exynos_tmu_data.c |   47 +++++++++++++++++++++++++++++
 1 file changed, 47 insertions(+)

diff --git a/drivers/thermal/samsung/exynos_tmu_data.c b/drivers/thermal/samsung/exynos_tmu_data.c
index 073c292..9346926 100644
--- a/drivers/thermal/samsung/exynos_tmu_data.c
+++ b/drivers/thermal/samsung/exynos_tmu_data.c
@@ -167,13 +167,60 @@ static const struct exynos_tmu_registers exynos4412_tmu_registers = {
 	.features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_TRIM_RELOAD | \
 			TMU_SUPPORT_FALLING_TRIP | TMU_SUPPORT_READY_STATUS | \
 			TMU_SUPPORT_EMUL_TIME)
+
+#define EXYNOS4412_TMU_DATA_BOOST \
+	.threshold_falling = 10, \
+	.trigger_levels[0] = 70, \
+	.trigger_levels[1] = 85, \
+	.trigger_levels[2] = 103, \
+	.trigger_levels[3] = 110, \
+	.trigger_enable[0] = true, \
+	.trigger_enable[1] = true, \
+	.trigger_enable[2] = true, \
+	.trigger_enable[3] = true, \
+	.trigger_type[0] = THROTTLE_ACTIVE, \
+	.trigger_type[1] = THROTTLE_ACTIVE, \
+	.trigger_type[2] = THROTTLE_ACTIVE, \
+	.trigger_type[3] = SW_TRIP, \
+	.max_trigger_level = 4, \
+	.gain = 8, \
+	.reference_voltage = 16, \
+	.noise_cancel_mode = 4, \
+	.cal_type = TYPE_ONE_POINT_TRIMMING, \
+	.efuse_value = 55, \
+	.min_efuse_value = 40, \
+	.max_efuse_value = 100, \
+	.first_point_trim = 25, \
+	.second_point_trim = 85, \
+	.default_temp_offset = 50, \
+	.freq_tab[0] = { \
+		.freq_clip_max = 1400 * 1000, \
+		.temp_level = 70, \
+	}, \
+	.freq_tab[1] = { \
+		.freq_clip_max = 800 * 1000, \
+		.temp_level = 85, \
+	}, \
+	.freq_tab[2] = { \
+		.freq_clip_max = 200 * 1000, \
+		.temp_level = 103, \
+	}, \
+	.freq_tab_count = 3, \
+	.registers = &exynos4412_tmu_registers, \
+	.features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_TRIM_RELOAD | \
+			TMU_SUPPORT_FALLING_TRIP | TMU_SUPPORT_READY_STATUS | \
+			TMU_SUPPORT_EMUL_TIME)
 #endif
 
 #if defined(CONFIG_SOC_EXYNOS4412)
 struct exynos_tmu_init_data const exynos4412_default_tmu_data = {
 	.tmu_data = {
 		{
+#ifdef CONFIG_CPU_FREQ_BOOST_SW
+			EXYNOS4412_TMU_DATA_BOOST,
+#else
 			EXYNOS4412_TMU_DATA,
+#endif
 			.type = SOC_ARCH_EXYNOS4412,
 			.test_mux = EXYNOS4412_MUX_ADDR_VALUE,
 		},
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* Re: [PATCH v10 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412)
  2013-11-05 17:26   ` [PATCH v10 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412) Lukasz Majewski
@ 2013-12-02 14:53       ` Eduardo Valentin
  2013-12-02 14:53       ` Eduardo Valentin
  1 sibling, 0 replies; 329+ messages in thread
From: Eduardo Valentin @ 2013-12-02 14:53 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin,
	cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	linux-kernel, Bartlomiej Zolnierkiewicz, Myungjoo Ham,
	durgadoss.r, Amit Daniel Kachhap

[-- Attachment #1: Type: text/plain, Size: 4698 bytes --]

On 05-11-2013 13:26, Lukasz Majewski wrote:
> This patch provides auto disable/enable operation for boost. It uses already
> present thermal infrastructure to provide boost hysteresis.
> A special set of TMU data has been defined for Exynos4412, which is only
> considered when BOOST is enabled.

Can you please add more description why you need a different set of
thermal data when boost is enabled? This is also important in case you
(Exynos thermal folks) would like to migrate this driver to have thermal
data support in DT.


> 
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> 
> ---
> Changes for v10:
>     - Remove boost related code from thermal_core.c
>     - Use already present thermal infrastructure to provide thermal hysteresis
>     - Introduce special set of TMU data for BOOST
> 
> Changes for v9:
>     - None
> 
> Changes for v8:
>     - Move cpufreq_boost_* stub functions definition (needed when cpufreq
>       is not compiled in) to cpufreq.h at cpufreq core support commit
> 
> Changes for v7:
>     - None
> 
> Changes for v6:
>     - Disable boost only when supported and enabled
>     - Protect boost related thermal_zone_device struct fields with mutex
>     - Evaluate temperature trend during boost enable decision
>     - Create separate methods to handle boost enable/disable
>       (thermal_boost_{enable|disable}) operations
>     - Boost is disabled at any trip point passage (not only the non critical one)
>     - Add stub definitions for cpufreq boost functions used when
>       CONFIG_CPU_FREQ is NOT defined.
> 
> Changes for v5:
>     - Move boost disable code from cpu_cooling.c to thermal_core.c
>       (to handle_non_critical_trips)
>     - Extent struct thermal_zone_device by adding overheated bool flag
>     - Implement auto enable of boost after device cools down
>     - Introduce boost_polling flag, which indicates if thermal uses it's predefined
>       pool delay or has woken up thermal workqueue only to wait until device
>       cools down.
> 
> Changes for v4:
>     - New patch


Might be interesting to see the changelog for this patch only.

> 
>  drivers/thermal/samsung/exynos_tmu_data.c |   47 +++++++++++++++++++++++++++++
>  1 file changed, 47 insertions(+)
> 
> diff --git a/drivers/thermal/samsung/exynos_tmu_data.c b/drivers/thermal/samsung/exynos_tmu_data.c
> index 073c292..9346926 100644
> --- a/drivers/thermal/samsung/exynos_tmu_data.c
> +++ b/drivers/thermal/samsung/exynos_tmu_data.c
> @@ -167,13 +167,60 @@ static const struct exynos_tmu_registers exynos4412_tmu_registers = {
>  	.features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_TRIM_RELOAD | \
>  			TMU_SUPPORT_FALLING_TRIP | TMU_SUPPORT_READY_STATUS | \
>  			TMU_SUPPORT_EMUL_TIME)
> +
> +#define EXYNOS4412_TMU_DATA_BOOST \
> +	.threshold_falling = 10, \
> +	.trigger_levels[0] = 70, \
> +	.trigger_levels[1] = 85, \
> +	.trigger_levels[2] = 103, \
> +	.trigger_levels[3] = 110, \
> +	.trigger_enable[0] = true, \
> +	.trigger_enable[1] = true, \
> +	.trigger_enable[2] = true, \
> +	.trigger_enable[3] = true, \
> +	.trigger_type[0] = THROTTLE_ACTIVE, \
> +	.trigger_type[1] = THROTTLE_ACTIVE, \
> +	.trigger_type[2] = THROTTLE_ACTIVE, \
> +	.trigger_type[3] = SW_TRIP, \
> +	.max_trigger_level = 4, \
> +	.gain = 8, \
> +	.reference_voltage = 16, \
> +	.noise_cancel_mode = 4, \
> +	.cal_type = TYPE_ONE_POINT_TRIMMING, \
> +	.efuse_value = 55, \
> +	.min_efuse_value = 40, \
> +	.max_efuse_value = 100, \
> +	.first_point_trim = 25, \
> +	.second_point_trim = 85, \
> +	.default_temp_offset = 50, \
> +	.freq_tab[0] = { \
> +		.freq_clip_max = 1400 * 1000, \
> +		.temp_level = 70, \
> +	}, \
> +	.freq_tab[1] = { \
> +		.freq_clip_max = 800 * 1000, \
> +		.temp_level = 85, \
> +	}, \
> +	.freq_tab[2] = { \
> +		.freq_clip_max = 200 * 1000, \
> +		.temp_level = 103, \
> +	}, \
> +	.freq_tab_count = 3, \
> +	.registers = &exynos4412_tmu_registers, \
> +	.features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_TRIM_RELOAD | \
> +			TMU_SUPPORT_FALLING_TRIP | TMU_SUPPORT_READY_STATUS | \
> +			TMU_SUPPORT_EMUL_TIME)
>  #endif
>  
>  #if defined(CONFIG_SOC_EXYNOS4412)
>  struct exynos_tmu_init_data const exynos4412_default_tmu_data = {
>  	.tmu_data = {
>  		{
> +#ifdef CONFIG_CPU_FREQ_BOOST_SW
> +			EXYNOS4412_TMU_DATA_BOOST,
> +#else
>  			EXYNOS4412_TMU_DATA,
> +#endif
>  			.type = SOC_ARCH_EXYNOS4412,
>  			.test_mux = EXYNOS4412_MUX_ADDR_VALUE,
>  		},
> 


-- 
You have got to be excited about what you are doing. (L. Lamport)

Eduardo Valentin


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 295 bytes --]

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v10 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412)
@ 2013-12-02 14:53       ` Eduardo Valentin
  0 siblings, 0 replies; 329+ messages in thread
From: Eduardo Valentin @ 2013-12-02 14:53 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin,
	cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	linux-kernel, Bartlomiej Zolnierkiewicz, Myungjoo Ham,
	durgadoss.r, Amit Daniel Kachhap

[-- Attachment #1: Type: text/plain, Size: 4698 bytes --]

On 05-11-2013 13:26, Lukasz Majewski wrote:
> This patch provides auto disable/enable operation for boost. It uses already
> present thermal infrastructure to provide boost hysteresis.
> A special set of TMU data has been defined for Exynos4412, which is only
> considered when BOOST is enabled.

Can you please add more description why you need a different set of
thermal data when boost is enabled? This is also important in case you
(Exynos thermal folks) would like to migrate this driver to have thermal
data support in DT.


> 
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> 
> ---
> Changes for v10:
>     - Remove boost related code from thermal_core.c
>     - Use already present thermal infrastructure to provide thermal hysteresis
>     - Introduce special set of TMU data for BOOST
> 
> Changes for v9:
>     - None
> 
> Changes for v8:
>     - Move cpufreq_boost_* stub functions definition (needed when cpufreq
>       is not compiled in) to cpufreq.h at cpufreq core support commit
> 
> Changes for v7:
>     - None
> 
> Changes for v6:
>     - Disable boost only when supported and enabled
>     - Protect boost related thermal_zone_device struct fields with mutex
>     - Evaluate temperature trend during boost enable decision
>     - Create separate methods to handle boost enable/disable
>       (thermal_boost_{enable|disable}) operations
>     - Boost is disabled at any trip point passage (not only the non critical one)
>     - Add stub definitions for cpufreq boost functions used when
>       CONFIG_CPU_FREQ is NOT defined.
> 
> Changes for v5:
>     - Move boost disable code from cpu_cooling.c to thermal_core.c
>       (to handle_non_critical_trips)
>     - Extent struct thermal_zone_device by adding overheated bool flag
>     - Implement auto enable of boost after device cools down
>     - Introduce boost_polling flag, which indicates if thermal uses it's predefined
>       pool delay or has woken up thermal workqueue only to wait until device
>       cools down.
> 
> Changes for v4:
>     - New patch


Might be interesting to see the changelog for this patch only.

> 
>  drivers/thermal/samsung/exynos_tmu_data.c |   47 +++++++++++++++++++++++++++++
>  1 file changed, 47 insertions(+)
> 
> diff --git a/drivers/thermal/samsung/exynos_tmu_data.c b/drivers/thermal/samsung/exynos_tmu_data.c
> index 073c292..9346926 100644
> --- a/drivers/thermal/samsung/exynos_tmu_data.c
> +++ b/drivers/thermal/samsung/exynos_tmu_data.c
> @@ -167,13 +167,60 @@ static const struct exynos_tmu_registers exynos4412_tmu_registers = {
>  	.features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_TRIM_RELOAD | \
>  			TMU_SUPPORT_FALLING_TRIP | TMU_SUPPORT_READY_STATUS | \
>  			TMU_SUPPORT_EMUL_TIME)
> +
> +#define EXYNOS4412_TMU_DATA_BOOST \
> +	.threshold_falling = 10, \
> +	.trigger_levels[0] = 70, \
> +	.trigger_levels[1] = 85, \
> +	.trigger_levels[2] = 103, \
> +	.trigger_levels[3] = 110, \
> +	.trigger_enable[0] = true, \
> +	.trigger_enable[1] = true, \
> +	.trigger_enable[2] = true, \
> +	.trigger_enable[3] = true, \
> +	.trigger_type[0] = THROTTLE_ACTIVE, \
> +	.trigger_type[1] = THROTTLE_ACTIVE, \
> +	.trigger_type[2] = THROTTLE_ACTIVE, \
> +	.trigger_type[3] = SW_TRIP, \
> +	.max_trigger_level = 4, \
> +	.gain = 8, \
> +	.reference_voltage = 16, \
> +	.noise_cancel_mode = 4, \
> +	.cal_type = TYPE_ONE_POINT_TRIMMING, \
> +	.efuse_value = 55, \
> +	.min_efuse_value = 40, \
> +	.max_efuse_value = 100, \
> +	.first_point_trim = 25, \
> +	.second_point_trim = 85, \
> +	.default_temp_offset = 50, \
> +	.freq_tab[0] = { \
> +		.freq_clip_max = 1400 * 1000, \
> +		.temp_level = 70, \
> +	}, \
> +	.freq_tab[1] = { \
> +		.freq_clip_max = 800 * 1000, \
> +		.temp_level = 85, \
> +	}, \
> +	.freq_tab[2] = { \
> +		.freq_clip_max = 200 * 1000, \
> +		.temp_level = 103, \
> +	}, \
> +	.freq_tab_count = 3, \
> +	.registers = &exynos4412_tmu_registers, \
> +	.features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_TRIM_RELOAD | \
> +			TMU_SUPPORT_FALLING_TRIP | TMU_SUPPORT_READY_STATUS | \
> +			TMU_SUPPORT_EMUL_TIME)
>  #endif
>  
>  #if defined(CONFIG_SOC_EXYNOS4412)
>  struct exynos_tmu_init_data const exynos4412_default_tmu_data = {
>  	.tmu_data = {
>  		{
> +#ifdef CONFIG_CPU_FREQ_BOOST_SW
> +			EXYNOS4412_TMU_DATA_BOOST,
> +#else
>  			EXYNOS4412_TMU_DATA,
> +#endif
>  			.type = SOC_ARCH_EXYNOS4412,
>  			.test_mux = EXYNOS4412_MUX_ADDR_VALUE,
>  		},
> 


-- 
You have got to be excited about what you are doing. (L. Lamport)

Eduardo Valentin


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 295 bytes --]

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v10 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412)
  2013-12-02 14:53       ` Eduardo Valentin
  (?)
@ 2013-12-03  7:31       ` Lukasz Majewski
  2013-12-03 12:36           ` Eduardo Valentin
  -1 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-03  7:31 UTC (permalink / raw)
  To: Eduardo Valentin
  Cc: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Myungjoo Ham, durgadoss.r,
	Amit Daniel Kachhap

Hi Eduardo,

> On 05-11-2013 13:26, Lukasz Majewski wrote:
> > This patch provides auto disable/enable operation for boost. It
> > uses already present thermal infrastructure to provide boost
> > hysteresis. A special set of TMU data has been defined for
> > Exynos4412, which is only considered when BOOST is enabled.
> 
> Can you please add more description why you need a different set of
> thermal data when boost is enabled? 

It turned out that the Thermal subsystem (after rework done for v3.12)
is capable of providing hysteresis for BOOST.

For version of the patch up to v8 I had to modify the thermal core to
provide such functionality. Changes in core weren't accepted by Zhang
Rui.

Then I've looked again to the code and it turned out that proper
setting of Exynos4x12 data (like trigger levels and freq_clip_max) can
solve the problem in a much better way by using Exynos thermal
interrupts.
Another advantage is that those changes are done per device.

> This is also important in case you
> (Exynos thermal folks) would like to migrate this driver to have
> thermal data support in DT.

Some work on this driver is ongoing (mainly done by Bartek
Zolnierkiewicz). This BOOST change doesn't break anything and only
extend the current thermal code. Thereof it will not break anything.

> 
> 
> > 
> > Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> > Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> > 
> > ---
> > Changes for v10:
> >     - Remove boost related code from thermal_core.c
> >     - Use already present thermal infrastructure to provide thermal
> > hysteresis
> >     - Introduce special set of TMU data for BOOST
> > 
> > Changes for v9:
> >     - None
> > 
> > Changes for v8:
> >     - Move cpufreq_boost_* stub functions definition (needed when
> > cpufreq is not compiled in) to cpufreq.h at cpufreq core support
> > commit
> > 
> > Changes for v7:
> >     - None
> > 
> > Changes for v6:
> >     - Disable boost only when supported and enabled
> >     - Protect boost related thermal_zone_device struct fields with
> > mutex
> >     - Evaluate temperature trend during boost enable decision
> >     - Create separate methods to handle boost enable/disable
> >       (thermal_boost_{enable|disable}) operations
> >     - Boost is disabled at any trip point passage (not only the non
> > critical one)
> >     - Add stub definitions for cpufreq boost functions used when
> >       CONFIG_CPU_FREQ is NOT defined.
> > 
> > Changes for v5:
> >     - Move boost disable code from cpu_cooling.c to thermal_core.c
> >       (to handle_non_critical_trips)
> >     - Extent struct thermal_zone_device by adding overheated bool
> > flag
> >     - Implement auto enable of boost after device cools down
> >     - Introduce boost_polling flag, which indicates if thermal uses
> > it's predefined pool delay or has woken up thermal workqueue only
> > to wait until device cools down.
> > 
> > Changes for v4:
> >     - New patch
> 
> 
> Might be interesting to see the changelog for this patch only.

The above list presents the development state of this particular patch
(thermal). 
Up to v8 I had modified the thermal core. For v10 I've decided to use
proper Exynos data setting.

If in any doubt, please ask. 

This last thermal patch of the series hinders this code to be applied
to cpufreq subsystem (Viresh had acked it some time ago and I hope that
he hasn't changed his mind :-) ).


> 
> > 
> >  drivers/thermal/samsung/exynos_tmu_data.c |   47
> > +++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+)
> > 
> > diff --git a/drivers/thermal/samsung/exynos_tmu_data.c
> > b/drivers/thermal/samsung/exynos_tmu_data.c index 073c292..9346926
> > 100644 --- a/drivers/thermal/samsung/exynos_tmu_data.c
> > +++ b/drivers/thermal/samsung/exynos_tmu_data.c
> > @@ -167,13 +167,60 @@ static const struct exynos_tmu_registers
> > exynos4412_tmu_registers = { .features = (TMU_SUPPORT_EMULATION |
> > TMU_SUPPORT_TRIM_RELOAD | \ TMU_SUPPORT_FALLING_TRIP |
> > TMU_SUPPORT_READY_STATUS | \ TMU_SUPPORT_EMUL_TIME)
> > +
> > +#define EXYNOS4412_TMU_DATA_BOOST \
> > +	.threshold_falling = 10, \
> > +	.trigger_levels[0] = 70, \
> > +	.trigger_levels[1] = 85, \
> > +	.trigger_levels[2] = 103, \
> > +	.trigger_levels[3] = 110, \
> > +	.trigger_enable[0] = true, \
> > +	.trigger_enable[1] = true, \
> > +	.trigger_enable[2] = true, \
> > +	.trigger_enable[3] = true, \
> > +	.trigger_type[0] = THROTTLE_ACTIVE, \
> > +	.trigger_type[1] = THROTTLE_ACTIVE, \
> > +	.trigger_type[2] = THROTTLE_ACTIVE, \
> > +	.trigger_type[3] = SW_TRIP, \
> > +	.max_trigger_level = 4, \
> > +	.gain = 8, \
> > +	.reference_voltage = 16, \
> > +	.noise_cancel_mode = 4, \
> > +	.cal_type = TYPE_ONE_POINT_TRIMMING, \
> > +	.efuse_value = 55, \
> > +	.min_efuse_value = 40, \
> > +	.max_efuse_value = 100, \
> > +	.first_point_trim = 25, \
> > +	.second_point_trim = 85, \
> > +	.default_temp_offset = 50, \
> > +	.freq_tab[0] = { \
> > +		.freq_clip_max = 1400 * 1000, \
> > +		.temp_level = 70, \
> > +	}, \
> > +	.freq_tab[1] = { \
> > +		.freq_clip_max = 800 * 1000, \
> > +		.temp_level = 85, \
> > +	}, \
> > +	.freq_tab[2] = { \
> > +		.freq_clip_max = 200 * 1000, \
> > +		.temp_level = 103, \
> > +	}, \
> > +	.freq_tab_count = 3, \
> > +	.registers = &exynos4412_tmu_registers, \
> > +	.features = (TMU_SUPPORT_EMULATION |
> > TMU_SUPPORT_TRIM_RELOAD | \
> > +			TMU_SUPPORT_FALLING_TRIP |
> > TMU_SUPPORT_READY_STATUS | \
> > +			TMU_SUPPORT_EMUL_TIME)
> >  #endif
> >  
> >  #if defined(CONFIG_SOC_EXYNOS4412)
> >  struct exynos_tmu_init_data const exynos4412_default_tmu_data = {
> >  	.tmu_data = {
> >  		{
> > +#ifdef CONFIG_CPU_FREQ_BOOST_SW
> > +			EXYNOS4412_TMU_DATA_BOOST,
> > +#else
> >  			EXYNOS4412_TMU_DATA,
> > +#endif
> >  			.type = SOC_ARCH_EXYNOS4412,
> >  			.test_mux = EXYNOS4412_MUX_ADDR_VALUE,
> >  		},
> > 
> 
> 

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v10 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412)
  2013-12-03  7:31       ` Lukasz Majewski
@ 2013-12-03 12:36           ` Eduardo Valentin
  0 siblings, 0 replies; 329+ messages in thread
From: Eduardo Valentin @ 2013-12-03 12:36 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Eduardo Valentin, Viresh Kumar, Rafael J. Wysocki, Zhang Rui,
	cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	linux-kernel, Bartlomiej Zolnierkiewicz, Myungjoo Ham,
	durgadoss.r, Amit Daniel Kachhap

[-- Attachment #1: Type: text/plain, Size: 7113 bytes --]

On 03-12-2013 03:31, Lukasz Majewski wrote:
> Hi Eduardo,
> 
>> On 05-11-2013 13:26, Lukasz Majewski wrote:
>>> This patch provides auto disable/enable operation for boost. It
>>> uses already present thermal infrastructure to provide boost
>>> hysteresis. A special set of TMU data has been defined for
>>> Exynos4412, which is only considered when BOOST is enabled.
>>
>> Can you please add more description why you need a different set of
>> thermal data when boost is enabled? 
> 
> It turned out that the Thermal subsystem (after rework done for v3.12)
> is capable of providing hysteresis for BOOST.
> 

So, the difference is only the hysteresis?

> For version of the patch up to v8 I had to modify the thermal core to
> provide such functionality. Changes in core weren't accepted by Zhang
> Rui.

Ok... But still I didn't get what you needed to modify and why.. Sorry I
jumped in the middle of ongoing discussion.

> 
> Then I've looked again to the code and it turned out that proper
> setting of Exynos4x12 data (like trigger levels and freq_clip_max) can
> solve the problem in a much better way by using Exynos thermal
> interrupts.
> Another advantage is that those changes are done per device.
> 
>> This is also important in case you
>> (Exynos thermal folks) would like to migrate this driver to have
>> thermal data support in DT.
> 
> Some work on this driver is ongoing (mainly done by Bartek
> Zolnierkiewicz). This BOOST change doesn't break anything and only
> extend the current thermal code. Thereof it will not break anything.

Well, good that it does not break anything, right?

But, My point, Lukasz, is that I am failing to understand, based on your
patch and description why we need a different data definition, one for
boost, other for without boost. Can you help me to get your intention
with this patch properly?

Side question is what happens in runtime if user echo 0 > boost? Should
we switch the data within the driver? Would we be penalizing performance
with strict hysteresis while we could be allowing longer periods of high
frequency usage? See what I am missing? Maybe we actually need something
else a part from defining one data structure for boost other for
non-boost systems.

> 
>>
>>
>>>
>>> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
>>> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
>>>
>>> ---
>>> Changes for v10:
>>>     - Remove boost related code from thermal_core.c
>>>     - Use already present thermal infrastructure to provide thermal
>>> hysteresis
>>>     - Introduce special set of TMU data for BOOST
>>>
>>> Changes for v9:
>>>     - None
>>>
>>> Changes for v8:
>>>     - Move cpufreq_boost_* stub functions definition (needed when
>>> cpufreq is not compiled in) to cpufreq.h at cpufreq core support
>>> commit
>>>
>>> Changes for v7:
>>>     - None
>>>
>>> Changes for v6:
>>>     - Disable boost only when supported and enabled
>>>     - Protect boost related thermal_zone_device struct fields with
>>> mutex
>>>     - Evaluate temperature trend during boost enable decision
>>>     - Create separate methods to handle boost enable/disable
>>>       (thermal_boost_{enable|disable}) operations
>>>     - Boost is disabled at any trip point passage (not only the non
>>> critical one)
>>>     - Add stub definitions for cpufreq boost functions used when
>>>       CONFIG_CPU_FREQ is NOT defined.
>>>
>>> Changes for v5:
>>>     - Move boost disable code from cpu_cooling.c to thermal_core.c
>>>       (to handle_non_critical_trips)
>>>     - Extent struct thermal_zone_device by adding overheated bool
>>> flag
>>>     - Implement auto enable of boost after device cools down
>>>     - Introduce boost_polling flag, which indicates if thermal uses
>>> it's predefined pool delay or has woken up thermal workqueue only
>>> to wait until device cools down.
>>>
>>> Changes for v4:
>>>     - New patch
>>
>>
>> Might be interesting to see the changelog for this patch only.
> 
> The above list presents the development state of this particular patch
> (thermal). 
> Up to v8 I had modified the thermal core. For v10 I've decided to use
> proper Exynos data setting.
> 
> If in any doubt, please ask. 
> 
> This last thermal patch of the series hinders this code to be applied
> to cpufreq subsystem (Viresh had acked it some time ago and I hope that
> he hasn't changed his mind :-) ).
> 
> 
>>
>>>
>>>  drivers/thermal/samsung/exynos_tmu_data.c |   47
>>> +++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+)
>>>
>>> diff --git a/drivers/thermal/samsung/exynos_tmu_data.c
>>> b/drivers/thermal/samsung/exynos_tmu_data.c index 073c292..9346926
>>> 100644 --- a/drivers/thermal/samsung/exynos_tmu_data.c
>>> +++ b/drivers/thermal/samsung/exynos_tmu_data.c
>>> @@ -167,13 +167,60 @@ static const struct exynos_tmu_registers
>>> exynos4412_tmu_registers = { .features = (TMU_SUPPORT_EMULATION |
>>> TMU_SUPPORT_TRIM_RELOAD | \ TMU_SUPPORT_FALLING_TRIP |
>>> TMU_SUPPORT_READY_STATUS | \ TMU_SUPPORT_EMUL_TIME)
>>> +
>>> +#define EXYNOS4412_TMU_DATA_BOOST \
>>> +	.threshold_falling = 10, \
>>> +	.trigger_levels[0] = 70, \
>>> +	.trigger_levels[1] = 85, \
>>> +	.trigger_levels[2] = 103, \
>>> +	.trigger_levels[3] = 110, \
>>> +	.trigger_enable[0] = true, \
>>> +	.trigger_enable[1] = true, \
>>> +	.trigger_enable[2] = true, \
>>> +	.trigger_enable[3] = true, \
>>> +	.trigger_type[0] = THROTTLE_ACTIVE, \
>>> +	.trigger_type[1] = THROTTLE_ACTIVE, \
>>> +	.trigger_type[2] = THROTTLE_ACTIVE, \
>>> +	.trigger_type[3] = SW_TRIP, \
>>> +	.max_trigger_level = 4, \
>>> +	.gain = 8, \
>>> +	.reference_voltage = 16, \
>>> +	.noise_cancel_mode = 4, \
>>> +	.cal_type = TYPE_ONE_POINT_TRIMMING, \
>>> +	.efuse_value = 55, \
>>> +	.min_efuse_value = 40, \
>>> +	.max_efuse_value = 100, \
>>> +	.first_point_trim = 25, \
>>> +	.second_point_trim = 85, \
>>> +	.default_temp_offset = 50, \
>>> +	.freq_tab[0] = { \
>>> +		.freq_clip_max = 1400 * 1000, \
>>> +		.temp_level = 70, \
>>> +	}, \
>>> +	.freq_tab[1] = { \
>>> +		.freq_clip_max = 800 * 1000, \
>>> +		.temp_level = 85, \
>>> +	}, \
>>> +	.freq_tab[2] = { \
>>> +		.freq_clip_max = 200 * 1000, \
>>> +		.temp_level = 103, \
>>> +	}, \
>>> +	.freq_tab_count = 3, \
>>> +	.registers = &exynos4412_tmu_registers, \
>>> +	.features = (TMU_SUPPORT_EMULATION |
>>> TMU_SUPPORT_TRIM_RELOAD | \
>>> +			TMU_SUPPORT_FALLING_TRIP |
>>> TMU_SUPPORT_READY_STATUS | \
>>> +			TMU_SUPPORT_EMUL_TIME)
>>>  #endif
>>>  
>>>  #if defined(CONFIG_SOC_EXYNOS4412)
>>>  struct exynos_tmu_init_data const exynos4412_default_tmu_data = {
>>>  	.tmu_data = {
>>>  		{
>>> +#ifdef CONFIG_CPU_FREQ_BOOST_SW
>>> +			EXYNOS4412_TMU_DATA_BOOST,
>>> +#else
>>>  			EXYNOS4412_TMU_DATA,
>>> +#endif
>>>  			.type = SOC_ARCH_EXYNOS4412,
>>>  			.test_mux = EXYNOS4412_MUX_ADDR_VALUE,
>>>  		},
>>>
>>
>>
> 


-- 
You have got to be excited about what you are doing. (L. Lamport)

Eduardo Valentin


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 295 bytes --]

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v10 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412)
@ 2013-12-03 12:36           ` Eduardo Valentin
  0 siblings, 0 replies; 329+ messages in thread
From: Eduardo Valentin @ 2013-12-03 12:36 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Eduardo Valentin, Viresh Kumar, Rafael J. Wysocki, Zhang Rui,
	cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	linux-kernel, Bartlomiej Zolnierkiewicz, Myungjoo Ham,
	durgadoss.r, Amit Daniel Kachhap

[-- Attachment #1: Type: text/plain, Size: 7113 bytes --]

On 03-12-2013 03:31, Lukasz Majewski wrote:
> Hi Eduardo,
> 
>> On 05-11-2013 13:26, Lukasz Majewski wrote:
>>> This patch provides auto disable/enable operation for boost. It
>>> uses already present thermal infrastructure to provide boost
>>> hysteresis. A special set of TMU data has been defined for
>>> Exynos4412, which is only considered when BOOST is enabled.
>>
>> Can you please add more description why you need a different set of
>> thermal data when boost is enabled? 
> 
> It turned out that the Thermal subsystem (after rework done for v3.12)
> is capable of providing hysteresis for BOOST.
> 

So, the difference is only the hysteresis?

> For version of the patch up to v8 I had to modify the thermal core to
> provide such functionality. Changes in core weren't accepted by Zhang
> Rui.

Ok... But still I didn't get what you needed to modify and why.. Sorry I
jumped in the middle of ongoing discussion.

> 
> Then I've looked again to the code and it turned out that proper
> setting of Exynos4x12 data (like trigger levels and freq_clip_max) can
> solve the problem in a much better way by using Exynos thermal
> interrupts.
> Another advantage is that those changes are done per device.
> 
>> This is also important in case you
>> (Exynos thermal folks) would like to migrate this driver to have
>> thermal data support in DT.
> 
> Some work on this driver is ongoing (mainly done by Bartek
> Zolnierkiewicz). This BOOST change doesn't break anything and only
> extend the current thermal code. Thereof it will not break anything.

Well, good that it does not break anything, right?

But, My point, Lukasz, is that I am failing to understand, based on your
patch and description why we need a different data definition, one for
boost, other for without boost. Can you help me to get your intention
with this patch properly?

Side question is what happens in runtime if user echo 0 > boost? Should
we switch the data within the driver? Would we be penalizing performance
with strict hysteresis while we could be allowing longer periods of high
frequency usage? See what I am missing? Maybe we actually need something
else a part from defining one data structure for boost other for
non-boost systems.

> 
>>
>>
>>>
>>> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
>>> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
>>>
>>> ---
>>> Changes for v10:
>>>     - Remove boost related code from thermal_core.c
>>>     - Use already present thermal infrastructure to provide thermal
>>> hysteresis
>>>     - Introduce special set of TMU data for BOOST
>>>
>>> Changes for v9:
>>>     - None
>>>
>>> Changes for v8:
>>>     - Move cpufreq_boost_* stub functions definition (needed when
>>> cpufreq is not compiled in) to cpufreq.h at cpufreq core support
>>> commit
>>>
>>> Changes for v7:
>>>     - None
>>>
>>> Changes for v6:
>>>     - Disable boost only when supported and enabled
>>>     - Protect boost related thermal_zone_device struct fields with
>>> mutex
>>>     - Evaluate temperature trend during boost enable decision
>>>     - Create separate methods to handle boost enable/disable
>>>       (thermal_boost_{enable|disable}) operations
>>>     - Boost is disabled at any trip point passage (not only the non
>>> critical one)
>>>     - Add stub definitions for cpufreq boost functions used when
>>>       CONFIG_CPU_FREQ is NOT defined.
>>>
>>> Changes for v5:
>>>     - Move boost disable code from cpu_cooling.c to thermal_core.c
>>>       (to handle_non_critical_trips)
>>>     - Extent struct thermal_zone_device by adding overheated bool
>>> flag
>>>     - Implement auto enable of boost after device cools down
>>>     - Introduce boost_polling flag, which indicates if thermal uses
>>> it's predefined pool delay or has woken up thermal workqueue only
>>> to wait until device cools down.
>>>
>>> Changes for v4:
>>>     - New patch
>>
>>
>> Might be interesting to see the changelog for this patch only.
> 
> The above list presents the development state of this particular patch
> (thermal). 
> Up to v8 I had modified the thermal core. For v10 I've decided to use
> proper Exynos data setting.
> 
> If in any doubt, please ask. 
> 
> This last thermal patch of the series hinders this code to be applied
> to cpufreq subsystem (Viresh had acked it some time ago and I hope that
> he hasn't changed his mind :-) ).
> 
> 
>>
>>>
>>>  drivers/thermal/samsung/exynos_tmu_data.c |   47
>>> +++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+)
>>>
>>> diff --git a/drivers/thermal/samsung/exynos_tmu_data.c
>>> b/drivers/thermal/samsung/exynos_tmu_data.c index 073c292..9346926
>>> 100644 --- a/drivers/thermal/samsung/exynos_tmu_data.c
>>> +++ b/drivers/thermal/samsung/exynos_tmu_data.c
>>> @@ -167,13 +167,60 @@ static const struct exynos_tmu_registers
>>> exynos4412_tmu_registers = { .features = (TMU_SUPPORT_EMULATION |
>>> TMU_SUPPORT_TRIM_RELOAD | \ TMU_SUPPORT_FALLING_TRIP |
>>> TMU_SUPPORT_READY_STATUS | \ TMU_SUPPORT_EMUL_TIME)
>>> +
>>> +#define EXYNOS4412_TMU_DATA_BOOST \
>>> +	.threshold_falling = 10, \
>>> +	.trigger_levels[0] = 70, \
>>> +	.trigger_levels[1] = 85, \
>>> +	.trigger_levels[2] = 103, \
>>> +	.trigger_levels[3] = 110, \
>>> +	.trigger_enable[0] = true, \
>>> +	.trigger_enable[1] = true, \
>>> +	.trigger_enable[2] = true, \
>>> +	.trigger_enable[3] = true, \
>>> +	.trigger_type[0] = THROTTLE_ACTIVE, \
>>> +	.trigger_type[1] = THROTTLE_ACTIVE, \
>>> +	.trigger_type[2] = THROTTLE_ACTIVE, \
>>> +	.trigger_type[3] = SW_TRIP, \
>>> +	.max_trigger_level = 4, \
>>> +	.gain = 8, \
>>> +	.reference_voltage = 16, \
>>> +	.noise_cancel_mode = 4, \
>>> +	.cal_type = TYPE_ONE_POINT_TRIMMING, \
>>> +	.efuse_value = 55, \
>>> +	.min_efuse_value = 40, \
>>> +	.max_efuse_value = 100, \
>>> +	.first_point_trim = 25, \
>>> +	.second_point_trim = 85, \
>>> +	.default_temp_offset = 50, \
>>> +	.freq_tab[0] = { \
>>> +		.freq_clip_max = 1400 * 1000, \
>>> +		.temp_level = 70, \
>>> +	}, \
>>> +	.freq_tab[1] = { \
>>> +		.freq_clip_max = 800 * 1000, \
>>> +		.temp_level = 85, \
>>> +	}, \
>>> +	.freq_tab[2] = { \
>>> +		.freq_clip_max = 200 * 1000, \
>>> +		.temp_level = 103, \
>>> +	}, \
>>> +	.freq_tab_count = 3, \
>>> +	.registers = &exynos4412_tmu_registers, \
>>> +	.features = (TMU_SUPPORT_EMULATION |
>>> TMU_SUPPORT_TRIM_RELOAD | \
>>> +			TMU_SUPPORT_FALLING_TRIP |
>>> TMU_SUPPORT_READY_STATUS | \
>>> +			TMU_SUPPORT_EMUL_TIME)
>>>  #endif
>>>  
>>>  #if defined(CONFIG_SOC_EXYNOS4412)
>>>  struct exynos_tmu_init_data const exynos4412_default_tmu_data = {
>>>  	.tmu_data = {
>>>  		{
>>> +#ifdef CONFIG_CPU_FREQ_BOOST_SW
>>> +			EXYNOS4412_TMU_DATA_BOOST,
>>> +#else
>>>  			EXYNOS4412_TMU_DATA,
>>> +#endif
>>>  			.type = SOC_ARCH_EXYNOS4412,
>>>  			.test_mux = EXYNOS4412_MUX_ADDR_VALUE,
>>>  		},
>>>
>>
>>
> 


-- 
You have got to be excited about what you are doing. (L. Lamport)

Eduardo Valentin


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 295 bytes --]

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v10 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412)
  2013-12-03 12:36           ` Eduardo Valentin
  (?)
@ 2013-12-03 15:42           ` Lukasz Majewski
  2013-12-04 14:10               ` Eduardo Valentin
  -1 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-03 15:42 UTC (permalink / raw)
  To: Eduardo Valentin
  Cc: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Myungjoo Ham, durgadoss.r,
	Amit Daniel Kachhap

Hi Eduardo,

> On 03-12-2013 03:31, Lukasz Majewski wrote:
> > Hi Eduardo,
> > 
> >> On 05-11-2013 13:26, Lukasz Majewski wrote:
> >>> This patch provides auto disable/enable operation for boost. It
> >>> uses already present thermal infrastructure to provide boost
> >>> hysteresis. A special set of TMU data has been defined for
> >>> Exynos4412, which is only considered when BOOST is enabled.
> >>
> >> Can you please add more description why you need a different set of
> >> thermal data when boost is enabled? 
> > 
> > It turned out that the Thermal subsystem (after rework done for
> > v3.12) is capable of providing hysteresis for BOOST.
> > 
> 
> So, the difference is only the hysteresis?
> 
> > For version of the patch up to v8 I had to modify the thermal core
> > to provide such functionality. Changes in core weren't accepted by
> > Zhang Rui.
> 
> Ok... But still I didn't get what you needed to modify and why..
> Sorry I jumped in the middle of ongoing discussion.
> 
> > 
> > Then I've looked again to the code and it turned out that proper
> > setting of Exynos4x12 data (like trigger levels and freq_clip_max)
> > can solve the problem in a much better way by using Exynos thermal
> > interrupts.
> > Another advantage is that those changes are done per device.
> > 
> >> This is also important in case you
> >> (Exynos thermal folks) would like to migrate this driver to have
> >> thermal data support in DT.
> > 
> > Some work on this driver is ongoing (mainly done by Bartek
> > Zolnierkiewicz). This BOOST change doesn't break anything and only
> > extend the current thermal code. Thereof it will not break anything.
> 
> Well, good that it does not break anything, right?
> 
> But, My point, Lukasz, is that I am failing to understand, based on
> your patch and description why we need a different data definition,
> one for boost, other for without boost. Can you help me to get your
> intention with this patch properly?

I reduce the trigger_level[0] and set new .freq_table[0] entry.
It works as follow (for BOOST):

1. Non-boost freq is 1.4 GHz on Exynos4412. BOOST is 1.5GHz. The BOOST
itself is enabled by CONFIG_CPU_FREQ_BOOST_SW. 

2. Exynos TMU driver reaches the lower TMU level (70 deg). Then the
core thermal looks for proper frequency table (.freq_tab[0]). If the
.temp_level matches the trigger_levels[0], then the frequency is reduced
to .freq_clip_max = 1400 * 1000. 

When the device cools down to 60 deg (trigger_levels[0] -
threshold_falling), then the max freq is restored to 1.5 GHz. This is
done automatically by thermal core.

For BOOST disabled we only can run with 1.4 GHz freq. For this reason
the freq_tab[X] entries must be modified. Also the Exynos part of
thermal requires that trigger_levels[0] is the lowest temperature trip,
so I cannot add the "BOOST disable" temp level in the end of
TMU_DATA_BOOST.

> 
> Side question is what happens in runtime if user echo 0 > boost?

As we had agreed with Rafael and Viresh, we are here mimic the HW CPUs
behaviour (like Intel CPU).
When user writes 'echo 0 > boost' then at cpufreq core we switch to max
freq to 1.4 GHz.

Thermal here is only for safety reasons.  

> Should we switch the data within the driver? 

No. When one decides to enable CONFIG_CPU_FREQ_BOOST_SW, then
corresponding Exynos data are persistent. 

> Would we be penalizing
> performance with strict hysteresis while we could be allowing longer
> periods of high frequency usage? 

But the hysteresis shows up only for emergency - when we go out from
allowed power envelope.

The BOOST is a component of LAB governor, which takes into account the
number of running cores. The "normal" BOOST use case is a situation
when at most two cores are running and other are down.
In this situation we can use BOOST to finish work faster.

> See what I am missing? Maybe we
> actually need something else a part from defining one data structure
> for boost other for non-boost systems.

I'm open for suggestions.

The current proposal aims to change TMU data only for target SoC -
Exynos4412 in this case. I deliberately don't touch the thermal core
code.

> 
> > 
> >>
> >>
> >>>
> >>> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> >>> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> >>>
> >>> ---
> >>> Changes for v10:
> >>>     - Remove boost related code from thermal_core.c
> >>>     - Use already present thermal infrastructure to provide
> >>> thermal hysteresis
> >>>     - Introduce special set of TMU data for BOOST
> >>>
> >>> Changes for v9:
> >>>     - None
> >>>
> >>> Changes for v8:
> >>>     - Move cpufreq_boost_* stub functions definition (needed when
> >>> cpufreq is not compiled in) to cpufreq.h at cpufreq core support
> >>> commit
> >>>
> >>> Changes for v7:
> >>>     - None
> >>>
> >>> Changes for v6:
> >>>     - Disable boost only when supported and enabled
> >>>     - Protect boost related thermal_zone_device struct fields with
> >>> mutex
> >>>     - Evaluate temperature trend during boost enable decision
> >>>     - Create separate methods to handle boost enable/disable
> >>>       (thermal_boost_{enable|disable}) operations
> >>>     - Boost is disabled at any trip point passage (not only the
> >>> non critical one)
> >>>     - Add stub definitions for cpufreq boost functions used when
> >>>       CONFIG_CPU_FREQ is NOT defined.
> >>>
> >>> Changes for v5:
> >>>     - Move boost disable code from cpu_cooling.c to thermal_core.c
> >>>       (to handle_non_critical_trips)
> >>>     - Extent struct thermal_zone_device by adding overheated bool
> >>> flag
> >>>     - Implement auto enable of boost after device cools down
> >>>     - Introduce boost_polling flag, which indicates if thermal
> >>> uses it's predefined pool delay or has woken up thermal workqueue
> >>> only to wait until device cools down.
> >>>
> >>> Changes for v4:
> >>>     - New patch
> >>
> >>
> >> Might be interesting to see the changelog for this patch only.
> > 
> > The above list presents the development state of this particular
> > patch (thermal). 
> > Up to v8 I had modified the thermal core. For v10 I've decided to
> > use proper Exynos data setting.
> > 
> > If in any doubt, please ask. 
> > 
> > This last thermal patch of the series hinders this code to be
> > applied to cpufreq subsystem (Viresh had acked it some time ago and
> > I hope that he hasn't changed his mind :-) ).
> > 
> > 
> >>
> >>>
> >>>  drivers/thermal/samsung/exynos_tmu_data.c |   47
> >>> +++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+)
> >>>
> >>> diff --git a/drivers/thermal/samsung/exynos_tmu_data.c
> >>> b/drivers/thermal/samsung/exynos_tmu_data.c index 073c292..9346926
> >>> 100644 --- a/drivers/thermal/samsung/exynos_tmu_data.c
> >>> +++ b/drivers/thermal/samsung/exynos_tmu_data.c
> >>> @@ -167,13 +167,60 @@ static const struct exynos_tmu_registers
> >>> exynos4412_tmu_registers = { .features = (TMU_SUPPORT_EMULATION |
> >>> TMU_SUPPORT_TRIM_RELOAD | \ TMU_SUPPORT_FALLING_TRIP |
> >>> TMU_SUPPORT_READY_STATUS | \ TMU_SUPPORT_EMUL_TIME)
> >>> +
> >>> +#define EXYNOS4412_TMU_DATA_BOOST \
> >>> +	.threshold_falling = 10, \
> >>> +	.trigger_levels[0] = 70, \
> >>> +	.trigger_levels[1] = 85, \
> >>> +	.trigger_levels[2] = 103, \
> >>> +	.trigger_levels[3] = 110, \
> >>> +	.trigger_enable[0] = true, \
> >>> +	.trigger_enable[1] = true, \
> >>> +	.trigger_enable[2] = true, \
> >>> +	.trigger_enable[3] = true, \
> >>> +	.trigger_type[0] = THROTTLE_ACTIVE, \
> >>> +	.trigger_type[1] = THROTTLE_ACTIVE, \
> >>> +	.trigger_type[2] = THROTTLE_ACTIVE, \
> >>> +	.trigger_type[3] = SW_TRIP, \
> >>> +	.max_trigger_level = 4, \
> >>> +	.gain = 8, \
> >>> +	.reference_voltage = 16, \
> >>> +	.noise_cancel_mode = 4, \
> >>> +	.cal_type = TYPE_ONE_POINT_TRIMMING, \
> >>> +	.efuse_value = 55, \
> >>> +	.min_efuse_value = 40, \
> >>> +	.max_efuse_value = 100, \
> >>> +	.first_point_trim = 25, \
> >>> +	.second_point_trim = 85, \
> >>> +	.default_temp_offset = 50, \
> >>> +	.freq_tab[0] = { \
> >>> +		.freq_clip_max = 1400 * 1000, \
> >>> +		.temp_level = 70, \
> >>> +	}, \
> >>> +	.freq_tab[1] = { \
> >>> +		.freq_clip_max = 800 * 1000, \
> >>> +		.temp_level = 85, \
> >>> +	}, \
> >>> +	.freq_tab[2] = { \
> >>> +		.freq_clip_max = 200 * 1000, \
> >>> +		.temp_level = 103, \
> >>> +	}, \
> >>> +	.freq_tab_count = 3, \
> >>> +	.registers = &exynos4412_tmu_registers, \
> >>> +	.features = (TMU_SUPPORT_EMULATION |
> >>> TMU_SUPPORT_TRIM_RELOAD | \
> >>> +			TMU_SUPPORT_FALLING_TRIP |
> >>> TMU_SUPPORT_READY_STATUS | \
> >>> +			TMU_SUPPORT_EMUL_TIME)
> >>>  #endif
> >>>  
> >>>  #if defined(CONFIG_SOC_EXYNOS4412)
> >>>  struct exynos_tmu_init_data const exynos4412_default_tmu_data = {
> >>>  	.tmu_data = {
> >>>  		{
> >>> +#ifdef CONFIG_CPU_FREQ_BOOST_SW
> >>> +			EXYNOS4412_TMU_DATA_BOOST,
> >>> +#else
> >>>  			EXYNOS4412_TMU_DATA,
> >>> +#endif
> >>>  			.type = SOC_ARCH_EXYNOS4412,
> >>>  			.test_mux = EXYNOS4412_MUX_ADDR_VALUE,
> >>>  		},
> >>>
> >>
> >>
> > 
> 
> 



-- 
-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH RESEND v10 0/7] cpufreq:boost: CPU Boost mode support
  2013-12-02 12:19 ` [PATCH RESEND v10 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                     ` (6 preceding siblings ...)
  2013-12-02 12:19   ` [PATCH RESEND v10 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412) Lukasz Majewski
@ 2013-12-04  6:59   ` Lukasz Majewski
  2013-12-04 14:12       ` Eduardo Valentin
  7 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-04  6:59 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki
  Cc: Lukasz Majewski, Zhang Rui, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Myungjoo Ham, durgadoss.r,
	linux-samsung-soc

Hi Rafael,

> This patch series introduces support for CPU overclocking technique
> called Boost.
> 
> It is a follow up of a LAB governor proposal. Boost is a LAB
> component:
> http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq
> 
> Boost unifies hardware based solution (e.g. Intel Nehalem) with
> software oriented one (like the one done at Exynos).
> For this reason cpufreq/freq_table code has been reorganized to
> include common code.
> 
> Important design decisions:
> - Boost related code is compiled-in unconditionally to cpufreq core
> and disabled by default. The cpufreq_driver is responsibile for
> setting boost_supported flag and providing set_boost callback(if HW
> support is needed). For software managed boost, special Kconfig flag -
>   CONFIG_CPU_FREQ_BOOST_SW has been defined. It will be selected only
>   when a target platform has thermal framework properly configured.
> 
> - struct cpufreq_driver has been extended with boost related fields:
>         -- boost_supported - when driver supports boosting
>         -- boost_enabled - boost state
>         -- set_boost - callback to function, which is necessary to
>            enable/disable boost
> 
> - Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost) is
> visible _only_ when cpufreq driver supports Boost.
> 
> - No special spin_lock for Boost was created. The one from cpufreq
> core was reused.
> 
> - The Boost code doesn't rely on any policy. When boost state is
> changed, then the policy list is iterated and proper adjustements are
> done.
> 
> - To improve safety level, the thermal framework is also extended to
> disable software boosting, when thermal trip point is reached. After
> cooling down the boost can be enabled again. This emulates behaviour
> similar to HW managed boost (like x86)
> 
> Tested at HW:
>        Exynos 4412 3.13-rc2 Linux
>        Intel Core i7-3770 3.13-rc2 Linux
> 
> Above patches were posted on top of kernel_pm/bleeding-edge
> (SHA1: 9483a9f69d5c8f83f1723361bf8340ddfb6475b4)
> 

Rafael, could you pull patches from 1 to 6 of this series? Those are
related to cpufreq core and has already been accepted by Viresh at a
late August this year.
This would facilitate my further cpufreq work.

And about the last patch - related to thermal. It seems that more
discussion NOT related to cpufreq will be ongoing. 

I would prefer to add it as a separate patch to thermal subtree.



> 
> Lukasz Majewski (7):
>   cpufreq: Add boost frequency support in core
>   cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common
>     boost solution
>   cpufreq:boost:Kconfig: Provide support for software managed BOOST
>   cpufreq:exynos:Extend Exynos cpufreq driver to support boost
>     framework
>   Documentation:cpufreq:boost: Update BOOST documentation
>   cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ
>   thermal:exynos:boost: Automatic enable/disable of BOOST feature (at
>     Exynos4412)
> 
>  Documentation/cpu-freq/boost.txt          |   26 +++----
>  drivers/cpufreq/Kconfig                   |    4 +
>  drivers/cpufreq/Kconfig.arm               |   15 ++++
>  drivers/cpufreq/acpi-cpufreq.c            |   86
> +++++++-------------- drivers/cpufreq/cpufreq.c                 |
> 118 ++++++++++++++++++++++++++++-
> drivers/cpufreq/exynos-cpufreq.c          |    3 +
> drivers/cpufreq/exynos4x12-cpufreq.c      |    2 +-
> drivers/cpufreq/freq_table.c              |   56 ++++++++++++--
> drivers/thermal/samsung/exynos_tmu_data.c |   47 ++++++++++++
> include/linux/cpufreq.h                   |   24 ++++++ 10 files
> changed, 302 insertions(+), 79 deletions(-)
> 



-- 
-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v10 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412)
  2013-12-03 15:42           ` Lukasz Majewski
@ 2013-12-04 14:10               ` Eduardo Valentin
  0 siblings, 0 replies; 329+ messages in thread
From: Eduardo Valentin @ 2013-12-04 14:10 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Eduardo Valentin, Viresh Kumar, Rafael J. Wysocki, Zhang Rui,
	cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	linux-kernel, Bartlomiej Zolnierkiewicz, Myungjoo Ham,
	durgadoss.r, Amit Daniel Kachhap

[-- Attachment #1: Type: text/plain, Size: 10154 bytes --]

Hey Lukasz!,

On 03-12-2013 11:42, Lukasz Majewski wrote:
> Hi Eduardo,
> 
>> On 03-12-2013 03:31, Lukasz Majewski wrote:
>>> Hi Eduardo,
>>>
>>>> On 05-11-2013 13:26, Lukasz Majewski wrote:
>>>>> This patch provides auto disable/enable operation for boost. It
>>>>> uses already present thermal infrastructure to provide boost
>>>>> hysteresis. A special set of TMU data has been defined for
>>>>> Exynos4412, which is only considered when BOOST is enabled.
>>>>
>>>> Can you please add more description why you need a different set of
>>>> thermal data when boost is enabled? 
>>>
>>> It turned out that the Thermal subsystem (after rework done for
>>> v3.12) is capable of providing hysteresis for BOOST.
>>>
>>
>> So, the difference is only the hysteresis?
>>
>>> For version of the patch up to v8 I had to modify the thermal core
>>> to provide such functionality. Changes in core weren't accepted by
>>> Zhang Rui.
>>
>> Ok... But still I didn't get what you needed to modify and why..
>> Sorry I jumped in the middle of ongoing discussion.
>>
>>>
>>> Then I've looked again to the code and it turned out that proper
>>> setting of Exynos4x12 data (like trigger levels and freq_clip_max)
>>> can solve the problem in a much better way by using Exynos thermal
>>> interrupts.
>>> Another advantage is that those changes are done per device.
>>>
>>>> This is also important in case you
>>>> (Exynos thermal folks) would like to migrate this driver to have
>>>> thermal data support in DT.
>>>
>>> Some work on this driver is ongoing (mainly done by Bartek
>>> Zolnierkiewicz). This BOOST change doesn't break anything and only
>>> extend the current thermal code. Thereof it will not break anything.
>>
>> Well, good that it does not break anything, right?
>>
>> But, My point, Lukasz, is that I am failing to understand, based on
>> your patch and description why we need a different data definition,
>> one for boost, other for without boost. Can you help me to get your
>> intention with this patch properly?
> 
> I reduce the trigger_level[0] and set new .freq_table[0] entry.
> It works as follow (for BOOST):
> 
> 1. Non-boost freq is 1.4 GHz on Exynos4412. BOOST is 1.5GHz. The BOOST
> itself is enabled by CONFIG_CPU_FREQ_BOOST_SW. 
> 
> 2. Exynos TMU driver reaches the lower TMU level (70 deg). Then the
> core thermal looks for proper frequency table (.freq_tab[0]). If the
> .temp_level matches the trigger_levels[0], then the frequency is reduced
> to .freq_clip_max = 1400 * 1000. 
> 
> When the device cools down to 60 deg (trigger_levels[0] -
> threshold_falling), then the max freq is restored to 1.5 GHz. This is
> done automatically by thermal core.
> 
> For BOOST disabled we only can run with 1.4 GHz freq. For this reason
> the freq_tab[X] entries must be modified. Also the Exynos part of
> thermal requires that trigger_levels[0] is the lowest temperature trip,
> so I cannot add the "BOOST disable" temp level in the end of
> TMU_DATA_BOOST.

OK. The entire thing is to allow dynamic control on your speedbin
frequencies, I see. What bugs me, is that this themal driver keeps
another table of frequencies. Ideally, it should not care about it, but
about the thermal behavior changes, meaning, say, how fast your
temperature rises, when you jump from lowest opp to 1.4GHz or 1.5GHz, on
host process or cold process samples.

> 
>>
>> Side question is what happens in runtime if user echo 0 > boost?
> 
> As we had agreed with Rafael and Viresh, we are here mimic the HW CPUs
> behaviour (like Intel CPU).

Which is fine and expected.

> When user writes 'echo 0 > boost' then at cpufreq core we switch to max
> freq to 1.4 GHz.

OK.

> 
> Thermal here is only for safety reasons.  
> 
>> Should we switch the data within the driver? 
> 
> No. When one decides to enable CONFIG_CPU_FREQ_BOOST_SW, then
> corresponding Exynos data are persistent. 
> 
>> Would we be penalizing
>> performance with strict hysteresis while we could be allowing longer
>> periods of high frequency usage? 
> 
> But the hysteresis shows up only for emergency - when we go out from
> allowed power envelope.
> 
> The BOOST is a component of LAB governor, which takes into account the
> number of running cores. The "normal" BOOST use case is a situation
> when at most two cores are running and other are down.
> In this situation we can use BOOST to finish work faster.
> 
>> See what I am missing? Maybe we
>> actually need something else a part from defining one data structure
>> for boost other for non-boost systems.
> 
> I'm open for suggestions.
> 
> The current proposal aims to change TMU data only for target SoC -
> Exynos4412 in this case. I deliberately don't touch the thermal core
> code.


In fact, I see.

I am just wondering if it makes sense to simply use the data that
represents BOOST always. Wouldn't be same as in the situation where user
echo 0 > boost?

> 
>>
>>>
>>>>
>>>>
>>>>>
>>>>> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
>>>>> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
>>>>>
>>>>> ---
>>>>> Changes for v10:
>>>>>     - Remove boost related code from thermal_core.c
>>>>>     - Use already present thermal infrastructure to provide
>>>>> thermal hysteresis
>>>>>     - Introduce special set of TMU data for BOOST
>>>>>
>>>>> Changes for v9:
>>>>>     - None
>>>>>
>>>>> Changes for v8:
>>>>>     - Move cpufreq_boost_* stub functions definition (needed when
>>>>> cpufreq is not compiled in) to cpufreq.h at cpufreq core support
>>>>> commit
>>>>>
>>>>> Changes for v7:
>>>>>     - None
>>>>>
>>>>> Changes for v6:
>>>>>     - Disable boost only when supported and enabled
>>>>>     - Protect boost related thermal_zone_device struct fields with
>>>>> mutex
>>>>>     - Evaluate temperature trend during boost enable decision
>>>>>     - Create separate methods to handle boost enable/disable
>>>>>       (thermal_boost_{enable|disable}) operations
>>>>>     - Boost is disabled at any trip point passage (not only the
>>>>> non critical one)
>>>>>     - Add stub definitions for cpufreq boost functions used when
>>>>>       CONFIG_CPU_FREQ is NOT defined.
>>>>>
>>>>> Changes for v5:
>>>>>     - Move boost disable code from cpu_cooling.c to thermal_core.c
>>>>>       (to handle_non_critical_trips)
>>>>>     - Extent struct thermal_zone_device by adding overheated bool
>>>>> flag
>>>>>     - Implement auto enable of boost after device cools down
>>>>>     - Introduce boost_polling flag, which indicates if thermal
>>>>> uses it's predefined pool delay or has woken up thermal workqueue
>>>>> only to wait until device cools down.
>>>>>
>>>>> Changes for v4:
>>>>>     - New patch
>>>>
>>>>
>>>> Might be interesting to see the changelog for this patch only.
>>>
>>> The above list presents the development state of this particular
>>> patch (thermal). 
>>> Up to v8 I had modified the thermal core. For v10 I've decided to
>>> use proper Exynos data setting.
>>>
>>> If in any doubt, please ask. 
>>>
>>> This last thermal patch of the series hinders this code to be
>>> applied to cpufreq subsystem (Viresh had acked it some time ago and
>>> I hope that he hasn't changed his mind :-) ).
>>>
>>>
>>>>
>>>>>
>>>>>  drivers/thermal/samsung/exynos_tmu_data.c |   47
>>>>> +++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+)
>>>>>
>>>>> diff --git a/drivers/thermal/samsung/exynos_tmu_data.c
>>>>> b/drivers/thermal/samsung/exynos_tmu_data.c index 073c292..9346926
>>>>> 100644 --- a/drivers/thermal/samsung/exynos_tmu_data.c
>>>>> +++ b/drivers/thermal/samsung/exynos_tmu_data.c
>>>>> @@ -167,13 +167,60 @@ static const struct exynos_tmu_registers
>>>>> exynos4412_tmu_registers = { .features = (TMU_SUPPORT_EMULATION |
>>>>> TMU_SUPPORT_TRIM_RELOAD | \ TMU_SUPPORT_FALLING_TRIP |
>>>>> TMU_SUPPORT_READY_STATUS | \ TMU_SUPPORT_EMUL_TIME)
>>>>> +
>>>>> +#define EXYNOS4412_TMU_DATA_BOOST \
>>>>> +	.threshold_falling = 10, \
>>>>> +	.trigger_levels[0] = 70, \
>>>>> +	.trigger_levels[1] = 85, \
>>>>> +	.trigger_levels[2] = 103, \
>>>>> +	.trigger_levels[3] = 110, \
>>>>> +	.trigger_enable[0] = true, \
>>>>> +	.trigger_enable[1] = true, \
>>>>> +	.trigger_enable[2] = true, \
>>>>> +	.trigger_enable[3] = true, \
>>>>> +	.trigger_type[0] = THROTTLE_ACTIVE, \
>>>>> +	.trigger_type[1] = THROTTLE_ACTIVE, \
>>>>> +	.trigger_type[2] = THROTTLE_ACTIVE, \
>>>>> +	.trigger_type[3] = SW_TRIP, \
>>>>> +	.max_trigger_level = 4, \
>>>>> +	.gain = 8, \
>>>>> +	.reference_voltage = 16, \
>>>>> +	.noise_cancel_mode = 4, \
>>>>> +	.cal_type = TYPE_ONE_POINT_TRIMMING, \
>>>>> +	.efuse_value = 55, \
>>>>> +	.min_efuse_value = 40, \
>>>>> +	.max_efuse_value = 100, \
>>>>> +	.first_point_trim = 25, \
>>>>> +	.second_point_trim = 85, \
>>>>> +	.default_temp_offset = 50, \
>>>>> +	.freq_tab[0] = { \
>>>>> +		.freq_clip_max = 1400 * 1000, \
>>>>> +		.temp_level = 70, \
>>>>> +	}, \
>>>>> +	.freq_tab[1] = { \
>>>>> +		.freq_clip_max = 800 * 1000, \
>>>>> +		.temp_level = 85, \
>>>>> +	}, \
>>>>> +	.freq_tab[2] = { \
>>>>> +		.freq_clip_max = 200 * 1000, \
>>>>> +		.temp_level = 103, \
>>>>> +	}, \
>>>>> +	.freq_tab_count = 3, \
>>>>> +	.registers = &exynos4412_tmu_registers, \
>>>>> +	.features = (TMU_SUPPORT_EMULATION |
>>>>> TMU_SUPPORT_TRIM_RELOAD | \
>>>>> +			TMU_SUPPORT_FALLING_TRIP |
>>>>> TMU_SUPPORT_READY_STATUS | \
>>>>> +			TMU_SUPPORT_EMUL_TIME)
>>>>>  #endif
>>>>>  
>>>>>  #if defined(CONFIG_SOC_EXYNOS4412)
>>>>>  struct exynos_tmu_init_data const exynos4412_default_tmu_data = {
>>>>>  	.tmu_data = {
>>>>>  		{
>>>>> +#ifdef CONFIG_CPU_FREQ_BOOST_SW
>>>>> +			EXYNOS4412_TMU_DATA_BOOST,
>>>>> +#else
>>>>>  			EXYNOS4412_TMU_DATA,
>>>>> +#endif
>>>>>  			.type = SOC_ARCH_EXYNOS4412,
>>>>>  			.test_mux = EXYNOS4412_MUX_ADDR_VALUE,
>>>>>  		},
>>>>>
>>>>
>>>>
>>>
>>
>>
> 
> 
> 


-- 
You have got to be excited about what you are doing. (L. Lamport)

Eduardo Valentin


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 295 bytes --]

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v10 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412)
@ 2013-12-04 14:10               ` Eduardo Valentin
  0 siblings, 0 replies; 329+ messages in thread
From: Eduardo Valentin @ 2013-12-04 14:10 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Eduardo Valentin, Viresh Kumar, Rafael J. Wysocki, Zhang Rui,
	cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	linux-kernel, Bartlomiej Zolnierkiewicz, Myungjoo Ham,
	durgadoss.r, Amit Daniel Kachhap

[-- Attachment #1: Type: text/plain, Size: 10154 bytes --]

Hey Lukasz!,

On 03-12-2013 11:42, Lukasz Majewski wrote:
> Hi Eduardo,
> 
>> On 03-12-2013 03:31, Lukasz Majewski wrote:
>>> Hi Eduardo,
>>>
>>>> On 05-11-2013 13:26, Lukasz Majewski wrote:
>>>>> This patch provides auto disable/enable operation for boost. It
>>>>> uses already present thermal infrastructure to provide boost
>>>>> hysteresis. A special set of TMU data has been defined for
>>>>> Exynos4412, which is only considered when BOOST is enabled.
>>>>
>>>> Can you please add more description why you need a different set of
>>>> thermal data when boost is enabled? 
>>>
>>> It turned out that the Thermal subsystem (after rework done for
>>> v3.12) is capable of providing hysteresis for BOOST.
>>>
>>
>> So, the difference is only the hysteresis?
>>
>>> For version of the patch up to v8 I had to modify the thermal core
>>> to provide such functionality. Changes in core weren't accepted by
>>> Zhang Rui.
>>
>> Ok... But still I didn't get what you needed to modify and why..
>> Sorry I jumped in the middle of ongoing discussion.
>>
>>>
>>> Then I've looked again to the code and it turned out that proper
>>> setting of Exynos4x12 data (like trigger levels and freq_clip_max)
>>> can solve the problem in a much better way by using Exynos thermal
>>> interrupts.
>>> Another advantage is that those changes are done per device.
>>>
>>>> This is also important in case you
>>>> (Exynos thermal folks) would like to migrate this driver to have
>>>> thermal data support in DT.
>>>
>>> Some work on this driver is ongoing (mainly done by Bartek
>>> Zolnierkiewicz). This BOOST change doesn't break anything and only
>>> extend the current thermal code. Thereof it will not break anything.
>>
>> Well, good that it does not break anything, right?
>>
>> But, My point, Lukasz, is that I am failing to understand, based on
>> your patch and description why we need a different data definition,
>> one for boost, other for without boost. Can you help me to get your
>> intention with this patch properly?
> 
> I reduce the trigger_level[0] and set new .freq_table[0] entry.
> It works as follow (for BOOST):
> 
> 1. Non-boost freq is 1.4 GHz on Exynos4412. BOOST is 1.5GHz. The BOOST
> itself is enabled by CONFIG_CPU_FREQ_BOOST_SW. 
> 
> 2. Exynos TMU driver reaches the lower TMU level (70 deg). Then the
> core thermal looks for proper frequency table (.freq_tab[0]). If the
> .temp_level matches the trigger_levels[0], then the frequency is reduced
> to .freq_clip_max = 1400 * 1000. 
> 
> When the device cools down to 60 deg (trigger_levels[0] -
> threshold_falling), then the max freq is restored to 1.5 GHz. This is
> done automatically by thermal core.
> 
> For BOOST disabled we only can run with 1.4 GHz freq. For this reason
> the freq_tab[X] entries must be modified. Also the Exynos part of
> thermal requires that trigger_levels[0] is the lowest temperature trip,
> so I cannot add the "BOOST disable" temp level in the end of
> TMU_DATA_BOOST.

OK. The entire thing is to allow dynamic control on your speedbin
frequencies, I see. What bugs me, is that this themal driver keeps
another table of frequencies. Ideally, it should not care about it, but
about the thermal behavior changes, meaning, say, how fast your
temperature rises, when you jump from lowest opp to 1.4GHz or 1.5GHz, on
host process or cold process samples.

> 
>>
>> Side question is what happens in runtime if user echo 0 > boost?
> 
> As we had agreed with Rafael and Viresh, we are here mimic the HW CPUs
> behaviour (like Intel CPU).

Which is fine and expected.

> When user writes 'echo 0 > boost' then at cpufreq core we switch to max
> freq to 1.4 GHz.

OK.

> 
> Thermal here is only for safety reasons.  
> 
>> Should we switch the data within the driver? 
> 
> No. When one decides to enable CONFIG_CPU_FREQ_BOOST_SW, then
> corresponding Exynos data are persistent. 
> 
>> Would we be penalizing
>> performance with strict hysteresis while we could be allowing longer
>> periods of high frequency usage? 
> 
> But the hysteresis shows up only for emergency - when we go out from
> allowed power envelope.
> 
> The BOOST is a component of LAB governor, which takes into account the
> number of running cores. The "normal" BOOST use case is a situation
> when at most two cores are running and other are down.
> In this situation we can use BOOST to finish work faster.
> 
>> See what I am missing? Maybe we
>> actually need something else a part from defining one data structure
>> for boost other for non-boost systems.
> 
> I'm open for suggestions.
> 
> The current proposal aims to change TMU data only for target SoC -
> Exynos4412 in this case. I deliberately don't touch the thermal core
> code.


In fact, I see.

I am just wondering if it makes sense to simply use the data that
represents BOOST always. Wouldn't be same as in the situation where user
echo 0 > boost?

> 
>>
>>>
>>>>
>>>>
>>>>>
>>>>> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
>>>>> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
>>>>>
>>>>> ---
>>>>> Changes for v10:
>>>>>     - Remove boost related code from thermal_core.c
>>>>>     - Use already present thermal infrastructure to provide
>>>>> thermal hysteresis
>>>>>     - Introduce special set of TMU data for BOOST
>>>>>
>>>>> Changes for v9:
>>>>>     - None
>>>>>
>>>>> Changes for v8:
>>>>>     - Move cpufreq_boost_* stub functions definition (needed when
>>>>> cpufreq is not compiled in) to cpufreq.h at cpufreq core support
>>>>> commit
>>>>>
>>>>> Changes for v7:
>>>>>     - None
>>>>>
>>>>> Changes for v6:
>>>>>     - Disable boost only when supported and enabled
>>>>>     - Protect boost related thermal_zone_device struct fields with
>>>>> mutex
>>>>>     - Evaluate temperature trend during boost enable decision
>>>>>     - Create separate methods to handle boost enable/disable
>>>>>       (thermal_boost_{enable|disable}) operations
>>>>>     - Boost is disabled at any trip point passage (not only the
>>>>> non critical one)
>>>>>     - Add stub definitions for cpufreq boost functions used when
>>>>>       CONFIG_CPU_FREQ is NOT defined.
>>>>>
>>>>> Changes for v5:
>>>>>     - Move boost disable code from cpu_cooling.c to thermal_core.c
>>>>>       (to handle_non_critical_trips)
>>>>>     - Extent struct thermal_zone_device by adding overheated bool
>>>>> flag
>>>>>     - Implement auto enable of boost after device cools down
>>>>>     - Introduce boost_polling flag, which indicates if thermal
>>>>> uses it's predefined pool delay or has woken up thermal workqueue
>>>>> only to wait until device cools down.
>>>>>
>>>>> Changes for v4:
>>>>>     - New patch
>>>>
>>>>
>>>> Might be interesting to see the changelog for this patch only.
>>>
>>> The above list presents the development state of this particular
>>> patch (thermal). 
>>> Up to v8 I had modified the thermal core. For v10 I've decided to
>>> use proper Exynos data setting.
>>>
>>> If in any doubt, please ask. 
>>>
>>> This last thermal patch of the series hinders this code to be
>>> applied to cpufreq subsystem (Viresh had acked it some time ago and
>>> I hope that he hasn't changed his mind :-) ).
>>>
>>>
>>>>
>>>>>
>>>>>  drivers/thermal/samsung/exynos_tmu_data.c |   47
>>>>> +++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+)
>>>>>
>>>>> diff --git a/drivers/thermal/samsung/exynos_tmu_data.c
>>>>> b/drivers/thermal/samsung/exynos_tmu_data.c index 073c292..9346926
>>>>> 100644 --- a/drivers/thermal/samsung/exynos_tmu_data.c
>>>>> +++ b/drivers/thermal/samsung/exynos_tmu_data.c
>>>>> @@ -167,13 +167,60 @@ static const struct exynos_tmu_registers
>>>>> exynos4412_tmu_registers = { .features = (TMU_SUPPORT_EMULATION |
>>>>> TMU_SUPPORT_TRIM_RELOAD | \ TMU_SUPPORT_FALLING_TRIP |
>>>>> TMU_SUPPORT_READY_STATUS | \ TMU_SUPPORT_EMUL_TIME)
>>>>> +
>>>>> +#define EXYNOS4412_TMU_DATA_BOOST \
>>>>> +	.threshold_falling = 10, \
>>>>> +	.trigger_levels[0] = 70, \
>>>>> +	.trigger_levels[1] = 85, \
>>>>> +	.trigger_levels[2] = 103, \
>>>>> +	.trigger_levels[3] = 110, \
>>>>> +	.trigger_enable[0] = true, \
>>>>> +	.trigger_enable[1] = true, \
>>>>> +	.trigger_enable[2] = true, \
>>>>> +	.trigger_enable[3] = true, \
>>>>> +	.trigger_type[0] = THROTTLE_ACTIVE, \
>>>>> +	.trigger_type[1] = THROTTLE_ACTIVE, \
>>>>> +	.trigger_type[2] = THROTTLE_ACTIVE, \
>>>>> +	.trigger_type[3] = SW_TRIP, \
>>>>> +	.max_trigger_level = 4, \
>>>>> +	.gain = 8, \
>>>>> +	.reference_voltage = 16, \
>>>>> +	.noise_cancel_mode = 4, \
>>>>> +	.cal_type = TYPE_ONE_POINT_TRIMMING, \
>>>>> +	.efuse_value = 55, \
>>>>> +	.min_efuse_value = 40, \
>>>>> +	.max_efuse_value = 100, \
>>>>> +	.first_point_trim = 25, \
>>>>> +	.second_point_trim = 85, \
>>>>> +	.default_temp_offset = 50, \
>>>>> +	.freq_tab[0] = { \
>>>>> +		.freq_clip_max = 1400 * 1000, \
>>>>> +		.temp_level = 70, \
>>>>> +	}, \
>>>>> +	.freq_tab[1] = { \
>>>>> +		.freq_clip_max = 800 * 1000, \
>>>>> +		.temp_level = 85, \
>>>>> +	}, \
>>>>> +	.freq_tab[2] = { \
>>>>> +		.freq_clip_max = 200 * 1000, \
>>>>> +		.temp_level = 103, \
>>>>> +	}, \
>>>>> +	.freq_tab_count = 3, \
>>>>> +	.registers = &exynos4412_tmu_registers, \
>>>>> +	.features = (TMU_SUPPORT_EMULATION |
>>>>> TMU_SUPPORT_TRIM_RELOAD | \
>>>>> +			TMU_SUPPORT_FALLING_TRIP |
>>>>> TMU_SUPPORT_READY_STATUS | \
>>>>> +			TMU_SUPPORT_EMUL_TIME)
>>>>>  #endif
>>>>>  
>>>>>  #if defined(CONFIG_SOC_EXYNOS4412)
>>>>>  struct exynos_tmu_init_data const exynos4412_default_tmu_data = {
>>>>>  	.tmu_data = {
>>>>>  		{
>>>>> +#ifdef CONFIG_CPU_FREQ_BOOST_SW
>>>>> +			EXYNOS4412_TMU_DATA_BOOST,
>>>>> +#else
>>>>>  			EXYNOS4412_TMU_DATA,
>>>>> +#endif
>>>>>  			.type = SOC_ARCH_EXYNOS4412,
>>>>>  			.test_mux = EXYNOS4412_MUX_ADDR_VALUE,
>>>>>  		},
>>>>>
>>>>
>>>>
>>>
>>
>>
> 
> 
> 


-- 
You have got to be excited about what you are doing. (L. Lamport)

Eduardo Valentin


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 295 bytes --]

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH RESEND v10 0/7] cpufreq:boost: CPU Boost mode support
  2013-12-04  6:59   ` [PATCH RESEND v10 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
@ 2013-12-04 14:12       ` Eduardo Valentin
  0 siblings, 0 replies; 329+ messages in thread
From: Eduardo Valentin @ 2013-12-04 14:12 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin,
	cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	linux-kernel, Bartlomiej Zolnierkiewicz, Myungjoo Ham,
	durgadoss.r, linux-samsung-soc

[-- Attachment #1: Type: text/plain, Size: 4153 bytes --]

On 04-12-2013 02:59, Lukasz Majewski wrote:
> Hi Rafael,
> 
>> This patch series introduces support for CPU overclocking technique
>> called Boost.
>>
>> It is a follow up of a LAB governor proposal. Boost is a LAB
>> component:
>> http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq
>>
>> Boost unifies hardware based solution (e.g. Intel Nehalem) with
>> software oriented one (like the one done at Exynos).
>> For this reason cpufreq/freq_table code has been reorganized to
>> include common code.
>>
>> Important design decisions:
>> - Boost related code is compiled-in unconditionally to cpufreq core
>> and disabled by default. The cpufreq_driver is responsibile for
>> setting boost_supported flag and providing set_boost callback(if HW
>> support is needed). For software managed boost, special Kconfig flag -
>>   CONFIG_CPU_FREQ_BOOST_SW has been defined. It will be selected only
>>   when a target platform has thermal framework properly configured.
>>
>> - struct cpufreq_driver has been extended with boost related fields:
>>         -- boost_supported - when driver supports boosting
>>         -- boost_enabled - boost state
>>         -- set_boost - callback to function, which is necessary to
>>            enable/disable boost
>>
>> - Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost) is
>> visible _only_ when cpufreq driver supports Boost.
>>
>> - No special spin_lock for Boost was created. The one from cpufreq
>> core was reused.
>>
>> - The Boost code doesn't rely on any policy. When boost state is
>> changed, then the policy list is iterated and proper adjustements are
>> done.
>>
>> - To improve safety level, the thermal framework is also extended to
>> disable software boosting, when thermal trip point is reached. After
>> cooling down the boost can be enabled again. This emulates behaviour
>> similar to HW managed boost (like x86)
>>
>> Tested at HW:
>>        Exynos 4412 3.13-rc2 Linux
>>        Intel Core i7-3770 3.13-rc2 Linux
>>
>> Above patches were posted on top of kernel_pm/bleeding-edge
>> (SHA1: 9483a9f69d5c8f83f1723361bf8340ddfb6475b4)
>>
> 
> Rafael, could you pull patches from 1 to 6 of this series? Those are
> related to cpufreq core and has already been accepted by Viresh at a
> late August this year.
> This would facilitate my further cpufreq work.
> 
> And about the last patch - related to thermal. It seems that more
> discussion NOT related to cpufreq will be ongoing. 
> 
> I would prefer to add it as a separate patch to thermal subtree.

I agree with Lukasz here. The part that touches the thermal driver is
minimal and the discussion is a simple matter of concept and
optimization of data structures.

> 
> 
> 
>>
>> Lukasz Majewski (7):
>>   cpufreq: Add boost frequency support in core
>>   cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common
>>     boost solution
>>   cpufreq:boost:Kconfig: Provide support for software managed BOOST
>>   cpufreq:exynos:Extend Exynos cpufreq driver to support boost
>>     framework
>>   Documentation:cpufreq:boost: Update BOOST documentation
>>   cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ
>>   thermal:exynos:boost: Automatic enable/disable of BOOST feature (at
>>     Exynos4412)
>>
>>  Documentation/cpu-freq/boost.txt          |   26 +++----
>>  drivers/cpufreq/Kconfig                   |    4 +
>>  drivers/cpufreq/Kconfig.arm               |   15 ++++
>>  drivers/cpufreq/acpi-cpufreq.c            |   86
>> +++++++-------------- drivers/cpufreq/cpufreq.c                 |
>> 118 ++++++++++++++++++++++++++++-
>> drivers/cpufreq/exynos-cpufreq.c          |    3 +
>> drivers/cpufreq/exynos4x12-cpufreq.c      |    2 +-
>> drivers/cpufreq/freq_table.c              |   56 ++++++++++++--
>> drivers/thermal/samsung/exynos_tmu_data.c |   47 ++++++++++++
>> include/linux/cpufreq.h                   |   24 ++++++ 10 files
>> changed, 302 insertions(+), 79 deletions(-)
>>
> 
> 
> 


-- 
You have got to be excited about what you are doing. (L. Lamport)

Eduardo Valentin


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 295 bytes --]

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH RESEND v10 0/7] cpufreq:boost: CPU Boost mode support
@ 2013-12-04 14:12       ` Eduardo Valentin
  0 siblings, 0 replies; 329+ messages in thread
From: Eduardo Valentin @ 2013-12-04 14:12 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin,
	cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	linux-kernel, Bartlomiej Zolnierkiewicz, Myungjoo Ham,
	durgadoss.r, linux-samsung-soc

[-- Attachment #1: Type: text/plain, Size: 4153 bytes --]

On 04-12-2013 02:59, Lukasz Majewski wrote:
> Hi Rafael,
> 
>> This patch series introduces support for CPU overclocking technique
>> called Boost.
>>
>> It is a follow up of a LAB governor proposal. Boost is a LAB
>> component:
>> http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq
>>
>> Boost unifies hardware based solution (e.g. Intel Nehalem) with
>> software oriented one (like the one done at Exynos).
>> For this reason cpufreq/freq_table code has been reorganized to
>> include common code.
>>
>> Important design decisions:
>> - Boost related code is compiled-in unconditionally to cpufreq core
>> and disabled by default. The cpufreq_driver is responsibile for
>> setting boost_supported flag and providing set_boost callback(if HW
>> support is needed). For software managed boost, special Kconfig flag -
>>   CONFIG_CPU_FREQ_BOOST_SW has been defined. It will be selected only
>>   when a target platform has thermal framework properly configured.
>>
>> - struct cpufreq_driver has been extended with boost related fields:
>>         -- boost_supported - when driver supports boosting
>>         -- boost_enabled - boost state
>>         -- set_boost - callback to function, which is necessary to
>>            enable/disable boost
>>
>> - Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost) is
>> visible _only_ when cpufreq driver supports Boost.
>>
>> - No special spin_lock for Boost was created. The one from cpufreq
>> core was reused.
>>
>> - The Boost code doesn't rely on any policy. When boost state is
>> changed, then the policy list is iterated and proper adjustements are
>> done.
>>
>> - To improve safety level, the thermal framework is also extended to
>> disable software boosting, when thermal trip point is reached. After
>> cooling down the boost can be enabled again. This emulates behaviour
>> similar to HW managed boost (like x86)
>>
>> Tested at HW:
>>        Exynos 4412 3.13-rc2 Linux
>>        Intel Core i7-3770 3.13-rc2 Linux
>>
>> Above patches were posted on top of kernel_pm/bleeding-edge
>> (SHA1: 9483a9f69d5c8f83f1723361bf8340ddfb6475b4)
>>
> 
> Rafael, could you pull patches from 1 to 6 of this series? Those are
> related to cpufreq core and has already been accepted by Viresh at a
> late August this year.
> This would facilitate my further cpufreq work.
> 
> And about the last patch - related to thermal. It seems that more
> discussion NOT related to cpufreq will be ongoing. 
> 
> I would prefer to add it as a separate patch to thermal subtree.

I agree with Lukasz here. The part that touches the thermal driver is
minimal and the discussion is a simple matter of concept and
optimization of data structures.

> 
> 
> 
>>
>> Lukasz Majewski (7):
>>   cpufreq: Add boost frequency support in core
>>   cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common
>>     boost solution
>>   cpufreq:boost:Kconfig: Provide support for software managed BOOST
>>   cpufreq:exynos:Extend Exynos cpufreq driver to support boost
>>     framework
>>   Documentation:cpufreq:boost: Update BOOST documentation
>>   cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ
>>   thermal:exynos:boost: Automatic enable/disable of BOOST feature (at
>>     Exynos4412)
>>
>>  Documentation/cpu-freq/boost.txt          |   26 +++----
>>  drivers/cpufreq/Kconfig                   |    4 +
>>  drivers/cpufreq/Kconfig.arm               |   15 ++++
>>  drivers/cpufreq/acpi-cpufreq.c            |   86
>> +++++++-------------- drivers/cpufreq/cpufreq.c                 |
>> 118 ++++++++++++++++++++++++++++-
>> drivers/cpufreq/exynos-cpufreq.c          |    3 +
>> drivers/cpufreq/exynos4x12-cpufreq.c      |    2 +-
>> drivers/cpufreq/freq_table.c              |   56 ++++++++++++--
>> drivers/thermal/samsung/exynos_tmu_data.c |   47 ++++++++++++
>> include/linux/cpufreq.h                   |   24 ++++++ 10 files
>> changed, 302 insertions(+), 79 deletions(-)
>>
> 
> 
> 


-- 
You have got to be excited about what you are doing. (L. Lamport)

Eduardo Valentin


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 295 bytes --]

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v10 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412)
  2013-12-04 14:10               ` Eduardo Valentin
  (?)
@ 2013-12-05 11:03               ` Lukasz Majewski
  2013-12-05 13:25                   ` Eduardo Valentin
  -1 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-05 11:03 UTC (permalink / raw)
  To: Eduardo Valentin
  Cc: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Myungjoo Ham, durgadoss.r,
	Amit Daniel Kachhap

Hi Eduardo,

> Hey Lukasz!,
> 
> On 03-12-2013 11:42, Lukasz Majewski wrote:
> > Hi Eduardo,
> > 
> >> On 03-12-2013 03:31, Lukasz Majewski wrote:
> >>> Hi Eduardo,
> >>>
> >>>> On 05-11-2013 13:26, Lukasz Majewski wrote:
> >>>>> This patch provides auto disable/enable operation for boost. It
> >>>>> uses already present thermal infrastructure to provide boost
> >>>>> hysteresis. A special set of TMU data has been defined for
> >>>>> Exynos4412, which is only considered when BOOST is enabled.
> >>>>
> >>>> Can you please add more description why you need a different set
> >>>> of thermal data when boost is enabled? 
> >>>
> >>> It turned out that the Thermal subsystem (after rework done for
> >>> v3.12) is capable of providing hysteresis for BOOST.
> >>>
> >>
> >> So, the difference is only the hysteresis?
> >>
> >>> For version of the patch up to v8 I had to modify the thermal core
> >>> to provide such functionality. Changes in core weren't accepted by
> >>> Zhang Rui.
> >>
> >> Ok... But still I didn't get what you needed to modify and why..
> >> Sorry I jumped in the middle of ongoing discussion.
> >>
> >>>
> >>> Then I've looked again to the code and it turned out that proper
> >>> setting of Exynos4x12 data (like trigger levels and freq_clip_max)
> >>> can solve the problem in a much better way by using Exynos thermal
> >>> interrupts.
> >>> Another advantage is that those changes are done per device.
> >>>
> >>>> This is also important in case you
> >>>> (Exynos thermal folks) would like to migrate this driver to have
> >>>> thermal data support in DT.
> >>>
> >>> Some work on this driver is ongoing (mainly done by Bartek
> >>> Zolnierkiewicz). This BOOST change doesn't break anything and only
> >>> extend the current thermal code. Thereof it will not break
> >>> anything.
> >>
> >> Well, good that it does not break anything, right?
> >>
> >> But, My point, Lukasz, is that I am failing to understand, based on
> >> your patch and description why we need a different data definition,
> >> one for boost, other for without boost. Can you help me to get your
> >> intention with this patch properly?
> > 
> > I reduce the trigger_level[0] and set new .freq_table[0] entry.
> > It works as follow (for BOOST):
> > 
> > 1. Non-boost freq is 1.4 GHz on Exynos4412. BOOST is 1.5GHz. The
> > BOOST itself is enabled by CONFIG_CPU_FREQ_BOOST_SW. 
> > 
> > 2. Exynos TMU driver reaches the lower TMU level (70 deg). Then the
> > core thermal looks for proper frequency table (.freq_tab[0]). If the
> > .temp_level matches the trigger_levels[0], then the frequency is
> > reduced to .freq_clip_max = 1400 * 1000. 
> > 
> > When the device cools down to 60 deg (trigger_levels[0] -
> > threshold_falling), then the max freq is restored to 1.5 GHz. This
> > is done automatically by thermal core.
> > 
> > For BOOST disabled we only can run with 1.4 GHz freq. For this
> > reason the freq_tab[X] entries must be modified. Also the Exynos
> > part of thermal requires that trigger_levels[0] is the lowest
> > temperature trip, so I cannot add the "BOOST disable" temp level in
> > the end of TMU_DATA_BOOST.
> 
> OK. The entire thing is to allow dynamic control on your speedbin
> frequencies, I see.

Yes, correct.

> What bugs me, is that this themal driver keeps
> another table of frequencies. 

Yes, it does. It is the part of thermal_cooling_conf data. 

It is a very practical solution, since we can specify the threshold
temperature and corresponding maximal frequency (up to 8 values). 

Those values are afterwards used at exynos_bind to bind zone to cooling
device.

> Ideally, it should not care about it,

The above procedure is a part of passive cooling implementation for
Exynos.

> but about the thermal behavior changes, meaning, say, how fast your
> temperature rises, when you jump from lowest opp to 1.4GHz or 1.5GHz,
> on host process or cold process samples.

Could you be more specific here? I assume that you are asking if slope
of the temperature rise has been measured?

I didn't measure this value, since it depends on the work environment
(number of processes running, ambient temperature, current SoC
temperature, etc.) and thereof is hard to reproduce.

However, the exynos_thermal_common.c defines .get_trend callback.
Unfortunately it only gives an information about the trend (rising,
falling). The exact slope value is not given.

Personally I think, that the slope measurement is not relevant for the
BOOST.

> 
> > 
> >>
> >> Side question is what happens in runtime if user echo 0 > boost?
> > 
> > As we had agreed with Rafael and Viresh, we are here mimic the HW
> > CPUs behaviour (like Intel CPU).
> 
> Which is fine and expected.
> 
> > When user writes 'echo 0 > boost' then at cpufreq core we switch to
> > max freq to 1.4 GHz.
> 
> OK.
> 
> > 
> > Thermal here is only for safety reasons.  
> > 
> >> Should we switch the data within the driver? 
> > 
> > No. When one decides to enable CONFIG_CPU_FREQ_BOOST_SW, then
> > corresponding Exynos data are persistent. 
> > 
> >> Would we be penalizing
> >> performance with strict hysteresis while we could be allowing
> >> longer periods of high frequency usage? 
> > 
> > But the hysteresis shows up only for emergency - when we go out from
> > allowed power envelope.
> > 
> > The BOOST is a component of LAB governor, which takes into account
> > the number of running cores. The "normal" BOOST use case is a
> > situation when at most two cores are running and other are down.
> > In this situation we can use BOOST to finish work faster.
> > 
> >> See what I am missing? Maybe we
> >> actually need something else a part from defining one data
> >> structure for boost other for non-boost systems.
> > 
> > I'm open for suggestions.
> > 
> > The current proposal aims to change TMU data only for target SoC -
> > Exynos4412 in this case. I deliberately don't touch the thermal core
> > code.
> 
> 
> In fact, I see.
> 
> I am just wondering if it makes sense to simply use the data that
> represents BOOST always. 
> Wouldn't be same as in the situation where
> user echo 0 > boost?

I think I get your point here. You would like to reuse the NON BOOST
value when user types echo 0 > boost.

The problem is that we would need some kind of notification from
cpufreq subsystem to thermal that such change was done. 
This seems like an overkill, and in my opinion it is better to
use thermal without such notification.
To be more specific, the thermal already implements the required
functionality and we "only" need to came up with an idea how to
appropriately feed data. 

> 
> > 
> >>
> >>>
> >>>>
> >>>>
> >>>>>
> >>>>> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> >>>>> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> >>>>>
> >>>>> ---
> >>>>> Changes for v10:
> >>>>>     - Remove boost related code from thermal_core.c
> >>>>>     - Use already present thermal infrastructure to provide
> >>>>> thermal hysteresis
> >>>>>     - Introduce special set of TMU data for BOOST
> >>>>>
> >>>>> Changes for v9:
> >>>>>     - None
> >>>>>
> >>>>> Changes for v8:
> >>>>>     - Move cpufreq_boost_* stub functions definition (needed
> >>>>> when cpufreq is not compiled in) to cpufreq.h at cpufreq core
> >>>>> support commit
> >>>>>
> >>>>> Changes for v7:
> >>>>>     - None
> >>>>>
> >>>>> Changes for v6:
> >>>>>     - Disable boost only when supported and enabled
> >>>>>     - Protect boost related thermal_zone_device struct fields
> >>>>> with mutex
> >>>>>     - Evaluate temperature trend during boost enable decision
> >>>>>     - Create separate methods to handle boost enable/disable
> >>>>>       (thermal_boost_{enable|disable}) operations
> >>>>>     - Boost is disabled at any trip point passage (not only the
> >>>>> non critical one)
> >>>>>     - Add stub definitions for cpufreq boost functions used when
> >>>>>       CONFIG_CPU_FREQ is NOT defined.
> >>>>>
> >>>>> Changes for v5:
> >>>>>     - Move boost disable code from cpu_cooling.c to
> >>>>> thermal_core.c (to handle_non_critical_trips)
> >>>>>     - Extent struct thermal_zone_device by adding overheated
> >>>>> bool flag
> >>>>>     - Implement auto enable of boost after device cools down
> >>>>>     - Introduce boost_polling flag, which indicates if thermal
> >>>>> uses it's predefined pool delay or has woken up thermal
> >>>>> workqueue only to wait until device cools down.
> >>>>>
> >>>>> Changes for v4:
> >>>>>     - New patch
> >>>>
> >>>>
> >>>> Might be interesting to see the changelog for this patch only.
> >>>
> >>> The above list presents the development state of this particular
> >>> patch (thermal). 
> >>> Up to v8 I had modified the thermal core. For v10 I've decided to
> >>> use proper Exynos data setting.
> >>>
> >>> If in any doubt, please ask. 
> >>>
> >>> This last thermal patch of the series hinders this code to be
> >>> applied to cpufreq subsystem (Viresh had acked it some time ago
> >>> and I hope that he hasn't changed his mind :-) ).
> >>>
> >>>
> >>>>
> >>>>>
> >>>>>  drivers/thermal/samsung/exynos_tmu_data.c |   47
> >>>>> +++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+)
> >>>>>
> >>>>> diff --git a/drivers/thermal/samsung/exynos_tmu_data.c
> >>>>> b/drivers/thermal/samsung/exynos_tmu_data.c index
> >>>>> 073c292..9346926 100644 ---
> >>>>> a/drivers/thermal/samsung/exynos_tmu_data.c +++
> >>>>> b/drivers/thermal/samsung/exynos_tmu_data.c @@ -167,13 +167,60
> >>>>> @@ static const struct exynos_tmu_registers
> >>>>> exynos4412_tmu_registers = { .features = (TMU_SUPPORT_EMULATION
> >>>>> | TMU_SUPPORT_TRIM_RELOAD | \ TMU_SUPPORT_FALLING_TRIP |
> >>>>> TMU_SUPPORT_READY_STATUS | \ TMU_SUPPORT_EMUL_TIME) +
> >>>>> +#define EXYNOS4412_TMU_DATA_BOOST \
> >>>>> +	.threshold_falling = 10, \
> >>>>> +	.trigger_levels[0] = 70, \
> >>>>> +	.trigger_levels[1] = 85, \
> >>>>> +	.trigger_levels[2] = 103, \
> >>>>> +	.trigger_levels[3] = 110, \
> >>>>> +	.trigger_enable[0] = true, \
> >>>>> +	.trigger_enable[1] = true, \
> >>>>> +	.trigger_enable[2] = true, \
> >>>>> +	.trigger_enable[3] = true, \
> >>>>> +	.trigger_type[0] = THROTTLE_ACTIVE, \
> >>>>> +	.trigger_type[1] = THROTTLE_ACTIVE, \
> >>>>> +	.trigger_type[2] = THROTTLE_ACTIVE, \
> >>>>> +	.trigger_type[3] = SW_TRIP, \
> >>>>> +	.max_trigger_level = 4, \
> >>>>> +	.gain = 8, \
> >>>>> +	.reference_voltage = 16, \
> >>>>> +	.noise_cancel_mode = 4, \
> >>>>> +	.cal_type = TYPE_ONE_POINT_TRIMMING, \
> >>>>> +	.efuse_value = 55, \
> >>>>> +	.min_efuse_value = 40, \
> >>>>> +	.max_efuse_value = 100, \
> >>>>> +	.first_point_trim = 25, \
> >>>>> +	.second_point_trim = 85, \
> >>>>> +	.default_temp_offset = 50, \
> >>>>> +	.freq_tab[0] = { \
> >>>>> +		.freq_clip_max = 1400 * 1000, \
> >>>>> +		.temp_level = 70, \
> >>>>> +	}, \
> >>>>> +	.freq_tab[1] = { \
> >>>>> +		.freq_clip_max = 800 * 1000, \
> >>>>> +		.temp_level = 85, \
> >>>>> +	}, \
> >>>>> +	.freq_tab[2] = { \
> >>>>> +		.freq_clip_max = 200 * 1000, \
> >>>>> +		.temp_level = 103, \
> >>>>> +	}, \
> >>>>> +	.freq_tab_count = 3, \
> >>>>> +	.registers = &exynos4412_tmu_registers, \
> >>>>> +	.features = (TMU_SUPPORT_EMULATION |
> >>>>> TMU_SUPPORT_TRIM_RELOAD | \
> >>>>> +			TMU_SUPPORT_FALLING_TRIP |
> >>>>> TMU_SUPPORT_READY_STATUS | \
> >>>>> +			TMU_SUPPORT_EMUL_TIME)
> >>>>>  #endif
> >>>>>  
> >>>>>  #if defined(CONFIG_SOC_EXYNOS4412)
> >>>>>  struct exynos_tmu_init_data const exynos4412_default_tmu_data
> >>>>> = { .tmu_data = {
> >>>>>  		{
> >>>>> +#ifdef CONFIG_CPU_FREQ_BOOST_SW
> >>>>> +			EXYNOS4412_TMU_DATA_BOOST,
> >>>>> +#else
> >>>>>  			EXYNOS4412_TMU_DATA,
> >>>>> +#endif
> >>>>>  			.type = SOC_ARCH_EXYNOS4412,
> >>>>>  			.test_mux = EXYNOS4412_MUX_ADDR_VALUE,
> >>>>>  		},
> >>>>>
> >>>>
> >>>>
> >>>
> >>
> >>
> > 
> > 
> > 
> 
> 


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v10 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412)
  2013-12-05 11:03               ` Lukasz Majewski
@ 2013-12-05 13:25                   ` Eduardo Valentin
  0 siblings, 0 replies; 329+ messages in thread
From: Eduardo Valentin @ 2013-12-05 13:25 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Eduardo Valentin, Viresh Kumar, Rafael J. Wysocki, Zhang Rui,
	cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	linux-kernel, Bartlomiej Zolnierkiewicz, Myungjoo Ham,
	durgadoss.r, Amit Daniel Kachhap

[-- Attachment #1: Type: text/plain, Size: 13388 bytes --]

Hey Lukasz,

On 05-12-2013 07:03, Lukasz Majewski wrote:
> Hi Eduardo,
> 
>> Hey Lukasz!,
>>
>> On 03-12-2013 11:42, Lukasz Majewski wrote:
>>> Hi Eduardo,
>>>
>>>> On 03-12-2013 03:31, Lukasz Majewski wrote:
>>>>> Hi Eduardo,
>>>>>
>>>>>> On 05-11-2013 13:26, Lukasz Majewski wrote:
>>>>>>> This patch provides auto disable/enable operation for boost. It
>>>>>>> uses already present thermal infrastructure to provide boost
>>>>>>> hysteresis. A special set of TMU data has been defined for
>>>>>>> Exynos4412, which is only considered when BOOST is enabled.
>>>>>>
>>>>>> Can you please add more description why you need a different set
>>>>>> of thermal data when boost is enabled? 
>>>>>
>>>>> It turned out that the Thermal subsystem (after rework done for
>>>>> v3.12) is capable of providing hysteresis for BOOST.
>>>>>
>>>>
>>>> So, the difference is only the hysteresis?
>>>>
>>>>> For version of the patch up to v8 I had to modify the thermal core
>>>>> to provide such functionality. Changes in core weren't accepted by
>>>>> Zhang Rui.
>>>>
>>>> Ok... But still I didn't get what you needed to modify and why..
>>>> Sorry I jumped in the middle of ongoing discussion.
>>>>
>>>>>
>>>>> Then I've looked again to the code and it turned out that proper
>>>>> setting of Exynos4x12 data (like trigger levels and freq_clip_max)
>>>>> can solve the problem in a much better way by using Exynos thermal
>>>>> interrupts.
>>>>> Another advantage is that those changes are done per device.
>>>>>
>>>>>> This is also important in case you
>>>>>> (Exynos thermal folks) would like to migrate this driver to have
>>>>>> thermal data support in DT.
>>>>>
>>>>> Some work on this driver is ongoing (mainly done by Bartek
>>>>> Zolnierkiewicz). This BOOST change doesn't break anything and only
>>>>> extend the current thermal code. Thereof it will not break
>>>>> anything.
>>>>
>>>> Well, good that it does not break anything, right?
>>>>
>>>> But, My point, Lukasz, is that I am failing to understand, based on
>>>> your patch and description why we need a different data definition,
>>>> one for boost, other for without boost. Can you help me to get your
>>>> intention with this patch properly?
>>>
>>> I reduce the trigger_level[0] and set new .freq_table[0] entry.
>>> It works as follow (for BOOST):
>>>
>>> 1. Non-boost freq is 1.4 GHz on Exynos4412. BOOST is 1.5GHz. The
>>> BOOST itself is enabled by CONFIG_CPU_FREQ_BOOST_SW. 
>>>
>>> 2. Exynos TMU driver reaches the lower TMU level (70 deg). Then the
>>> core thermal looks for proper frequency table (.freq_tab[0]). If the
>>> .temp_level matches the trigger_levels[0], then the frequency is
>>> reduced to .freq_clip_max = 1400 * 1000. 
>>>
>>> When the device cools down to 60 deg (trigger_levels[0] -
>>> threshold_falling), then the max freq is restored to 1.5 GHz. This
>>> is done automatically by thermal core.
>>>
>>> For BOOST disabled we only can run with 1.4 GHz freq. For this
>>> reason the freq_tab[X] entries must be modified. Also the Exynos
>>> part of thermal requires that trigger_levels[0] is the lowest
>>> temperature trip, so I cannot add the "BOOST disable" temp level in
>>> the end of TMU_DATA_BOOST.
>>
>> OK. The entire thing is to allow dynamic control on your speedbin
>> frequencies, I see.
> 
> Yes, correct.
> 
>> What bugs me, is that this themal driver keeps
>> another table of frequencies. 
> 
> Yes, it does. It is the part of thermal_cooling_conf data. 
> 
> It is a very practical solution, since we can specify the threshold
> temperature and corresponding maximal frequency (up to 8 values). 
> 
> Those values are afterwards used at exynos_bind to bind zone to cooling
> device.
> 
>> Ideally, it should not care about it,
> 
> The above procedure is a part of passive cooling implementation for
> Exynos.
> 
>> but about the thermal behavior changes, meaning, say, how fast your
>> temperature rises, when you jump from lowest opp to 1.4GHz or 1.5GHz,
>> on host process or cold process samples.
> 
> Could you be more specific here? I assume that you are asking if slope
> of the temperature rise has been measured?
> 
> I didn't measure this value, since it depends on the work environment
> (number of processes running, ambient temperature, current SoC
> temperature, etc.) and thereof is hard to reproduce.
> 
> However, the exynos_thermal_common.c defines .get_trend callback.
> Unfortunately it only gives an information about the trend (rising,
> falling). The exact slope value is not given.
> 
> Personally I think, that the slope measurement is not relevant for the
> BOOST.
> 
>>
>>>
>>>>
>>>> Side question is what happens in runtime if user echo 0 > boost?
>>>
>>> As we had agreed with Rafael and Viresh, we are here mimic the HW
>>> CPUs behaviour (like Intel CPU).
>>
>> Which is fine and expected.
>>
>>> When user writes 'echo 0 > boost' then at cpufreq core we switch to
>>> max freq to 1.4 GHz.
>>
>> OK.
>>
>>>
>>> Thermal here is only for safety reasons.  
>>>
>>>> Should we switch the data within the driver? 
>>>
>>> No. When one decides to enable CONFIG_CPU_FREQ_BOOST_SW, then
>>> corresponding Exynos data are persistent. 
>>>
>>>> Would we be penalizing
>>>> performance with strict hysteresis while we could be allowing
>>>> longer periods of high frequency usage? 
>>>
>>> But the hysteresis shows up only for emergency - when we go out from
>>> allowed power envelope.
>>>
>>> The BOOST is a component of LAB governor, which takes into account
>>> the number of running cores. The "normal" BOOST use case is a
>>> situation when at most two cores are running and other are down.
>>> In this situation we can use BOOST to finish work faster.
>>>
>>>> See what I am missing? Maybe we
>>>> actually need something else a part from defining one data
>>>> structure for boost other for non-boost systems.
>>>
>>> I'm open for suggestions.
>>>
>>> The current proposal aims to change TMU data only for target SoC -
>>> Exynos4412 in this case. I deliberately don't touch the thermal core
>>> code.
>>
>>
>> In fact, I see.
>>
>> I am just wondering if it makes sense to simply use the data that
>> represents BOOST always. 
>> Wouldn't be same as in the situation where
>> user echo 0 > boost?
> 
> I think I get your point here. You would like to reuse the NON BOOST
> value when user types echo 0 > boost.
> 
> The problem is that we would need some kind of notification from
> cpufreq subsystem to thermal that such change was done. 
> This seems like an overkill, and in my opinion it is better to
> use thermal without such notification.
> To be more specific, the thermal already implements the required
> functionality and we "only" need to came up with an idea how to
> appropriately feed data. 

Well, the real problem is that this driver relies on data structures
that duplicates cpufreq data and thermal core data. So, every time you
have a new speedbin frequency, you have to update at least two - three
places to make sure everything is correct.

My point is not exactly that I am suggesting to reuse the non-boost
data. My point is that temperature constraints do not change if you are
using boost or non-boost frequencies. Your temperature trip points will
be the same, because your silicon still is gonna start to break if cross
the line. And that is what I mean when I say, the thermal driver should
be aware of temperature constraints, not frequencies. At most, the
cooling device should be aware of frequencies, not thermal driver.

About the current patch proposal, still, would it work if you only use
BOOST data? Even on non-boost devices? Apparently yes, as you use BOOST
data when boost is disabled. So, that was my point here, why not using
only boost data, regardless of config?

> 
>>
>>>
>>>>
>>>>>
>>>>>>
>>>>>>
>>>>>>>
>>>>>>> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
>>>>>>> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
>>>>>>>
>>>>>>> ---
>>>>>>> Changes for v10:
>>>>>>>     - Remove boost related code from thermal_core.c
>>>>>>>     - Use already present thermal infrastructure to provide
>>>>>>> thermal hysteresis
>>>>>>>     - Introduce special set of TMU data for BOOST
>>>>>>>
>>>>>>> Changes for v9:
>>>>>>>     - None
>>>>>>>
>>>>>>> Changes for v8:
>>>>>>>     - Move cpufreq_boost_* stub functions definition (needed
>>>>>>> when cpufreq is not compiled in) to cpufreq.h at cpufreq core
>>>>>>> support commit
>>>>>>>
>>>>>>> Changes for v7:
>>>>>>>     - None
>>>>>>>
>>>>>>> Changes for v6:
>>>>>>>     - Disable boost only when supported and enabled
>>>>>>>     - Protect boost related thermal_zone_device struct fields
>>>>>>> with mutex
>>>>>>>     - Evaluate temperature trend during boost enable decision
>>>>>>>     - Create separate methods to handle boost enable/disable
>>>>>>>       (thermal_boost_{enable|disable}) operations
>>>>>>>     - Boost is disabled at any trip point passage (not only the
>>>>>>> non critical one)
>>>>>>>     - Add stub definitions for cpufreq boost functions used when
>>>>>>>       CONFIG_CPU_FREQ is NOT defined.
>>>>>>>
>>>>>>> Changes for v5:
>>>>>>>     - Move boost disable code from cpu_cooling.c to
>>>>>>> thermal_core.c (to handle_non_critical_trips)
>>>>>>>     - Extent struct thermal_zone_device by adding overheated
>>>>>>> bool flag
>>>>>>>     - Implement auto enable of boost after device cools down
>>>>>>>     - Introduce boost_polling flag, which indicates if thermal
>>>>>>> uses it's predefined pool delay or has woken up thermal
>>>>>>> workqueue only to wait until device cools down.
>>>>>>>
>>>>>>> Changes for v4:
>>>>>>>     - New patch
>>>>>>
>>>>>>
>>>>>> Might be interesting to see the changelog for this patch only.
>>>>>
>>>>> The above list presents the development state of this particular
>>>>> patch (thermal). 
>>>>> Up to v8 I had modified the thermal core. For v10 I've decided to
>>>>> use proper Exynos data setting.
>>>>>
>>>>> If in any doubt, please ask. 
>>>>>
>>>>> This last thermal patch of the series hinders this code to be
>>>>> applied to cpufreq subsystem (Viresh had acked it some time ago
>>>>> and I hope that he hasn't changed his mind :-) ).
>>>>>
>>>>>
>>>>>>
>>>>>>>
>>>>>>>  drivers/thermal/samsung/exynos_tmu_data.c |   47
>>>>>>> +++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+)
>>>>>>>
>>>>>>> diff --git a/drivers/thermal/samsung/exynos_tmu_data.c
>>>>>>> b/drivers/thermal/samsung/exynos_tmu_data.c index
>>>>>>> 073c292..9346926 100644 ---
>>>>>>> a/drivers/thermal/samsung/exynos_tmu_data.c +++
>>>>>>> b/drivers/thermal/samsung/exynos_tmu_data.c @@ -167,13 +167,60
>>>>>>> @@ static const struct exynos_tmu_registers
>>>>>>> exynos4412_tmu_registers = { .features = (TMU_SUPPORT_EMULATION
>>>>>>> | TMU_SUPPORT_TRIM_RELOAD | \ TMU_SUPPORT_FALLING_TRIP |
>>>>>>> TMU_SUPPORT_READY_STATUS | \ TMU_SUPPORT_EMUL_TIME) +
>>>>>>> +#define EXYNOS4412_TMU_DATA_BOOST \
>>>>>>> +	.threshold_falling = 10, \
>>>>>>> +	.trigger_levels[0] = 70, \
>>>>>>> +	.trigger_levels[1] = 85, \
>>>>>>> +	.trigger_levels[2] = 103, \
>>>>>>> +	.trigger_levels[3] = 110, \
>>>>>>> +	.trigger_enable[0] = true, \
>>>>>>> +	.trigger_enable[1] = true, \
>>>>>>> +	.trigger_enable[2] = true, \
>>>>>>> +	.trigger_enable[3] = true, \
>>>>>>> +	.trigger_type[0] = THROTTLE_ACTIVE, \
>>>>>>> +	.trigger_type[1] = THROTTLE_ACTIVE, \
>>>>>>> +	.trigger_type[2] = THROTTLE_ACTIVE, \
>>>>>>> +	.trigger_type[3] = SW_TRIP, \
>>>>>>> +	.max_trigger_level = 4, \
>>>>>>> +	.gain = 8, \
>>>>>>> +	.reference_voltage = 16, \
>>>>>>> +	.noise_cancel_mode = 4, \
>>>>>>> +	.cal_type = TYPE_ONE_POINT_TRIMMING, \
>>>>>>> +	.efuse_value = 55, \
>>>>>>> +	.min_efuse_value = 40, \
>>>>>>> +	.max_efuse_value = 100, \
>>>>>>> +	.first_point_trim = 25, \
>>>>>>> +	.second_point_trim = 85, \
>>>>>>> +	.default_temp_offset = 50, \
>>>>>>> +	.freq_tab[0] = { \
>>>>>>> +		.freq_clip_max = 1400 * 1000, \
>>>>>>> +		.temp_level = 70, \
>>>>>>> +	}, \
>>>>>>> +	.freq_tab[1] = { \
>>>>>>> +		.freq_clip_max = 800 * 1000, \
>>>>>>> +		.temp_level = 85, \
>>>>>>> +	}, \
>>>>>>> +	.freq_tab[2] = { \
>>>>>>> +		.freq_clip_max = 200 * 1000, \
>>>>>>> +		.temp_level = 103, \
>>>>>>> +	}, \
>>>>>>> +	.freq_tab_count = 3, \
>>>>>>> +	.registers = &exynos4412_tmu_registers, \
>>>>>>> +	.features = (TMU_SUPPORT_EMULATION |
>>>>>>> TMU_SUPPORT_TRIM_RELOAD | \
>>>>>>> +			TMU_SUPPORT_FALLING_TRIP |
>>>>>>> TMU_SUPPORT_READY_STATUS | \
>>>>>>> +			TMU_SUPPORT_EMUL_TIME)
>>>>>>>  #endif
>>>>>>>  
>>>>>>>  #if defined(CONFIG_SOC_EXYNOS4412)
>>>>>>>  struct exynos_tmu_init_data const exynos4412_default_tmu_data
>>>>>>> = { .tmu_data = {
>>>>>>>  		{
>>>>>>> +#ifdef CONFIG_CPU_FREQ_BOOST_SW
>>>>>>> +			EXYNOS4412_TMU_DATA_BOOST,
>>>>>>> +#else
>>>>>>>  			EXYNOS4412_TMU_DATA,
>>>>>>> +#endif
>>>>>>>  			.type = SOC_ARCH_EXYNOS4412,
>>>>>>>  			.test_mux = EXYNOS4412_MUX_ADDR_VALUE,
>>>>>>>  		},
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>
>>>>
>>>
>>>
>>>
>>
>>
> 
> 


-- 
You have got to be excited about what you are doing. (L. Lamport)

Eduardo Valentin


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 295 bytes --]

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v10 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412)
@ 2013-12-05 13:25                   ` Eduardo Valentin
  0 siblings, 0 replies; 329+ messages in thread
From: Eduardo Valentin @ 2013-12-05 13:25 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Eduardo Valentin, Viresh Kumar, Rafael J. Wysocki, Zhang Rui,
	cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	linux-kernel, Bartlomiej Zolnierkiewicz, Myungjoo Ham,
	durgadoss.r, Amit Daniel Kachhap

[-- Attachment #1: Type: text/plain, Size: 13388 bytes --]

Hey Lukasz,

On 05-12-2013 07:03, Lukasz Majewski wrote:
> Hi Eduardo,
> 
>> Hey Lukasz!,
>>
>> On 03-12-2013 11:42, Lukasz Majewski wrote:
>>> Hi Eduardo,
>>>
>>>> On 03-12-2013 03:31, Lukasz Majewski wrote:
>>>>> Hi Eduardo,
>>>>>
>>>>>> On 05-11-2013 13:26, Lukasz Majewski wrote:
>>>>>>> This patch provides auto disable/enable operation for boost. It
>>>>>>> uses already present thermal infrastructure to provide boost
>>>>>>> hysteresis. A special set of TMU data has been defined for
>>>>>>> Exynos4412, which is only considered when BOOST is enabled.
>>>>>>
>>>>>> Can you please add more description why you need a different set
>>>>>> of thermal data when boost is enabled? 
>>>>>
>>>>> It turned out that the Thermal subsystem (after rework done for
>>>>> v3.12) is capable of providing hysteresis for BOOST.
>>>>>
>>>>
>>>> So, the difference is only the hysteresis?
>>>>
>>>>> For version of the patch up to v8 I had to modify the thermal core
>>>>> to provide such functionality. Changes in core weren't accepted by
>>>>> Zhang Rui.
>>>>
>>>> Ok... But still I didn't get what you needed to modify and why..
>>>> Sorry I jumped in the middle of ongoing discussion.
>>>>
>>>>>
>>>>> Then I've looked again to the code and it turned out that proper
>>>>> setting of Exynos4x12 data (like trigger levels and freq_clip_max)
>>>>> can solve the problem in a much better way by using Exynos thermal
>>>>> interrupts.
>>>>> Another advantage is that those changes are done per device.
>>>>>
>>>>>> This is also important in case you
>>>>>> (Exynos thermal folks) would like to migrate this driver to have
>>>>>> thermal data support in DT.
>>>>>
>>>>> Some work on this driver is ongoing (mainly done by Bartek
>>>>> Zolnierkiewicz). This BOOST change doesn't break anything and only
>>>>> extend the current thermal code. Thereof it will not break
>>>>> anything.
>>>>
>>>> Well, good that it does not break anything, right?
>>>>
>>>> But, My point, Lukasz, is that I am failing to understand, based on
>>>> your patch and description why we need a different data definition,
>>>> one for boost, other for without boost. Can you help me to get your
>>>> intention with this patch properly?
>>>
>>> I reduce the trigger_level[0] and set new .freq_table[0] entry.
>>> It works as follow (for BOOST):
>>>
>>> 1. Non-boost freq is 1.4 GHz on Exynos4412. BOOST is 1.5GHz. The
>>> BOOST itself is enabled by CONFIG_CPU_FREQ_BOOST_SW. 
>>>
>>> 2. Exynos TMU driver reaches the lower TMU level (70 deg). Then the
>>> core thermal looks for proper frequency table (.freq_tab[0]). If the
>>> .temp_level matches the trigger_levels[0], then the frequency is
>>> reduced to .freq_clip_max = 1400 * 1000. 
>>>
>>> When the device cools down to 60 deg (trigger_levels[0] -
>>> threshold_falling), then the max freq is restored to 1.5 GHz. This
>>> is done automatically by thermal core.
>>>
>>> For BOOST disabled we only can run with 1.4 GHz freq. For this
>>> reason the freq_tab[X] entries must be modified. Also the Exynos
>>> part of thermal requires that trigger_levels[0] is the lowest
>>> temperature trip, so I cannot add the "BOOST disable" temp level in
>>> the end of TMU_DATA_BOOST.
>>
>> OK. The entire thing is to allow dynamic control on your speedbin
>> frequencies, I see.
> 
> Yes, correct.
> 
>> What bugs me, is that this themal driver keeps
>> another table of frequencies. 
> 
> Yes, it does. It is the part of thermal_cooling_conf data. 
> 
> It is a very practical solution, since we can specify the threshold
> temperature and corresponding maximal frequency (up to 8 values). 
> 
> Those values are afterwards used at exynos_bind to bind zone to cooling
> device.
> 
>> Ideally, it should not care about it,
> 
> The above procedure is a part of passive cooling implementation for
> Exynos.
> 
>> but about the thermal behavior changes, meaning, say, how fast your
>> temperature rises, when you jump from lowest opp to 1.4GHz or 1.5GHz,
>> on host process or cold process samples.
> 
> Could you be more specific here? I assume that you are asking if slope
> of the temperature rise has been measured?
> 
> I didn't measure this value, since it depends on the work environment
> (number of processes running, ambient temperature, current SoC
> temperature, etc.) and thereof is hard to reproduce.
> 
> However, the exynos_thermal_common.c defines .get_trend callback.
> Unfortunately it only gives an information about the trend (rising,
> falling). The exact slope value is not given.
> 
> Personally I think, that the slope measurement is not relevant for the
> BOOST.
> 
>>
>>>
>>>>
>>>> Side question is what happens in runtime if user echo 0 > boost?
>>>
>>> As we had agreed with Rafael and Viresh, we are here mimic the HW
>>> CPUs behaviour (like Intel CPU).
>>
>> Which is fine and expected.
>>
>>> When user writes 'echo 0 > boost' then at cpufreq core we switch to
>>> max freq to 1.4 GHz.
>>
>> OK.
>>
>>>
>>> Thermal here is only for safety reasons.  
>>>
>>>> Should we switch the data within the driver? 
>>>
>>> No. When one decides to enable CONFIG_CPU_FREQ_BOOST_SW, then
>>> corresponding Exynos data are persistent. 
>>>
>>>> Would we be penalizing
>>>> performance with strict hysteresis while we could be allowing
>>>> longer periods of high frequency usage? 
>>>
>>> But the hysteresis shows up only for emergency - when we go out from
>>> allowed power envelope.
>>>
>>> The BOOST is a component of LAB governor, which takes into account
>>> the number of running cores. The "normal" BOOST use case is a
>>> situation when at most two cores are running and other are down.
>>> In this situation we can use BOOST to finish work faster.
>>>
>>>> See what I am missing? Maybe we
>>>> actually need something else a part from defining one data
>>>> structure for boost other for non-boost systems.
>>>
>>> I'm open for suggestions.
>>>
>>> The current proposal aims to change TMU data only for target SoC -
>>> Exynos4412 in this case. I deliberately don't touch the thermal core
>>> code.
>>
>>
>> In fact, I see.
>>
>> I am just wondering if it makes sense to simply use the data that
>> represents BOOST always. 
>> Wouldn't be same as in the situation where
>> user echo 0 > boost?
> 
> I think I get your point here. You would like to reuse the NON BOOST
> value when user types echo 0 > boost.
> 
> The problem is that we would need some kind of notification from
> cpufreq subsystem to thermal that such change was done. 
> This seems like an overkill, and in my opinion it is better to
> use thermal without such notification.
> To be more specific, the thermal already implements the required
> functionality and we "only" need to came up with an idea how to
> appropriately feed data. 

Well, the real problem is that this driver relies on data structures
that duplicates cpufreq data and thermal core data. So, every time you
have a new speedbin frequency, you have to update at least two - three
places to make sure everything is correct.

My point is not exactly that I am suggesting to reuse the non-boost
data. My point is that temperature constraints do not change if you are
using boost or non-boost frequencies. Your temperature trip points will
be the same, because your silicon still is gonna start to break if cross
the line. And that is what I mean when I say, the thermal driver should
be aware of temperature constraints, not frequencies. At most, the
cooling device should be aware of frequencies, not thermal driver.

About the current patch proposal, still, would it work if you only use
BOOST data? Even on non-boost devices? Apparently yes, as you use BOOST
data when boost is disabled. So, that was my point here, why not using
only boost data, regardless of config?

> 
>>
>>>
>>>>
>>>>>
>>>>>>
>>>>>>
>>>>>>>
>>>>>>> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
>>>>>>> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
>>>>>>>
>>>>>>> ---
>>>>>>> Changes for v10:
>>>>>>>     - Remove boost related code from thermal_core.c
>>>>>>>     - Use already present thermal infrastructure to provide
>>>>>>> thermal hysteresis
>>>>>>>     - Introduce special set of TMU data for BOOST
>>>>>>>
>>>>>>> Changes for v9:
>>>>>>>     - None
>>>>>>>
>>>>>>> Changes for v8:
>>>>>>>     - Move cpufreq_boost_* stub functions definition (needed
>>>>>>> when cpufreq is not compiled in) to cpufreq.h at cpufreq core
>>>>>>> support commit
>>>>>>>
>>>>>>> Changes for v7:
>>>>>>>     - None
>>>>>>>
>>>>>>> Changes for v6:
>>>>>>>     - Disable boost only when supported and enabled
>>>>>>>     - Protect boost related thermal_zone_device struct fields
>>>>>>> with mutex
>>>>>>>     - Evaluate temperature trend during boost enable decision
>>>>>>>     - Create separate methods to handle boost enable/disable
>>>>>>>       (thermal_boost_{enable|disable}) operations
>>>>>>>     - Boost is disabled at any trip point passage (not only the
>>>>>>> non critical one)
>>>>>>>     - Add stub definitions for cpufreq boost functions used when
>>>>>>>       CONFIG_CPU_FREQ is NOT defined.
>>>>>>>
>>>>>>> Changes for v5:
>>>>>>>     - Move boost disable code from cpu_cooling.c to
>>>>>>> thermal_core.c (to handle_non_critical_trips)
>>>>>>>     - Extent struct thermal_zone_device by adding overheated
>>>>>>> bool flag
>>>>>>>     - Implement auto enable of boost after device cools down
>>>>>>>     - Introduce boost_polling flag, which indicates if thermal
>>>>>>> uses it's predefined pool delay or has woken up thermal
>>>>>>> workqueue only to wait until device cools down.
>>>>>>>
>>>>>>> Changes for v4:
>>>>>>>     - New patch
>>>>>>
>>>>>>
>>>>>> Might be interesting to see the changelog for this patch only.
>>>>>
>>>>> The above list presents the development state of this particular
>>>>> patch (thermal). 
>>>>> Up to v8 I had modified the thermal core. For v10 I've decided to
>>>>> use proper Exynos data setting.
>>>>>
>>>>> If in any doubt, please ask. 
>>>>>
>>>>> This last thermal patch of the series hinders this code to be
>>>>> applied to cpufreq subsystem (Viresh had acked it some time ago
>>>>> and I hope that he hasn't changed his mind :-) ).
>>>>>
>>>>>
>>>>>>
>>>>>>>
>>>>>>>  drivers/thermal/samsung/exynos_tmu_data.c |   47
>>>>>>> +++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+)
>>>>>>>
>>>>>>> diff --git a/drivers/thermal/samsung/exynos_tmu_data.c
>>>>>>> b/drivers/thermal/samsung/exynos_tmu_data.c index
>>>>>>> 073c292..9346926 100644 ---
>>>>>>> a/drivers/thermal/samsung/exynos_tmu_data.c +++
>>>>>>> b/drivers/thermal/samsung/exynos_tmu_data.c @@ -167,13 +167,60
>>>>>>> @@ static const struct exynos_tmu_registers
>>>>>>> exynos4412_tmu_registers = { .features = (TMU_SUPPORT_EMULATION
>>>>>>> | TMU_SUPPORT_TRIM_RELOAD | \ TMU_SUPPORT_FALLING_TRIP |
>>>>>>> TMU_SUPPORT_READY_STATUS | \ TMU_SUPPORT_EMUL_TIME) +
>>>>>>> +#define EXYNOS4412_TMU_DATA_BOOST \
>>>>>>> +	.threshold_falling = 10, \
>>>>>>> +	.trigger_levels[0] = 70, \
>>>>>>> +	.trigger_levels[1] = 85, \
>>>>>>> +	.trigger_levels[2] = 103, \
>>>>>>> +	.trigger_levels[3] = 110, \
>>>>>>> +	.trigger_enable[0] = true, \
>>>>>>> +	.trigger_enable[1] = true, \
>>>>>>> +	.trigger_enable[2] = true, \
>>>>>>> +	.trigger_enable[3] = true, \
>>>>>>> +	.trigger_type[0] = THROTTLE_ACTIVE, \
>>>>>>> +	.trigger_type[1] = THROTTLE_ACTIVE, \
>>>>>>> +	.trigger_type[2] = THROTTLE_ACTIVE, \
>>>>>>> +	.trigger_type[3] = SW_TRIP, \
>>>>>>> +	.max_trigger_level = 4, \
>>>>>>> +	.gain = 8, \
>>>>>>> +	.reference_voltage = 16, \
>>>>>>> +	.noise_cancel_mode = 4, \
>>>>>>> +	.cal_type = TYPE_ONE_POINT_TRIMMING, \
>>>>>>> +	.efuse_value = 55, \
>>>>>>> +	.min_efuse_value = 40, \
>>>>>>> +	.max_efuse_value = 100, \
>>>>>>> +	.first_point_trim = 25, \
>>>>>>> +	.second_point_trim = 85, \
>>>>>>> +	.default_temp_offset = 50, \
>>>>>>> +	.freq_tab[0] = { \
>>>>>>> +		.freq_clip_max = 1400 * 1000, \
>>>>>>> +		.temp_level = 70, \
>>>>>>> +	}, \
>>>>>>> +	.freq_tab[1] = { \
>>>>>>> +		.freq_clip_max = 800 * 1000, \
>>>>>>> +		.temp_level = 85, \
>>>>>>> +	}, \
>>>>>>> +	.freq_tab[2] = { \
>>>>>>> +		.freq_clip_max = 200 * 1000, \
>>>>>>> +		.temp_level = 103, \
>>>>>>> +	}, \
>>>>>>> +	.freq_tab_count = 3, \
>>>>>>> +	.registers = &exynos4412_tmu_registers, \
>>>>>>> +	.features = (TMU_SUPPORT_EMULATION |
>>>>>>> TMU_SUPPORT_TRIM_RELOAD | \
>>>>>>> +			TMU_SUPPORT_FALLING_TRIP |
>>>>>>> TMU_SUPPORT_READY_STATUS | \
>>>>>>> +			TMU_SUPPORT_EMUL_TIME)
>>>>>>>  #endif
>>>>>>>  
>>>>>>>  #if defined(CONFIG_SOC_EXYNOS4412)
>>>>>>>  struct exynos_tmu_init_data const exynos4412_default_tmu_data
>>>>>>> = { .tmu_data = {
>>>>>>>  		{
>>>>>>> +#ifdef CONFIG_CPU_FREQ_BOOST_SW
>>>>>>> +			EXYNOS4412_TMU_DATA_BOOST,
>>>>>>> +#else
>>>>>>>  			EXYNOS4412_TMU_DATA,
>>>>>>> +#endif
>>>>>>>  			.type = SOC_ARCH_EXYNOS4412,
>>>>>>>  			.test_mux = EXYNOS4412_MUX_ADDR_VALUE,
>>>>>>>  		},
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>
>>>>
>>>
>>>
>>>
>>
>>
> 
> 


-- 
You have got to be excited about what you are doing. (L. Lamport)

Eduardo Valentin


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 295 bytes --]

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v10 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412)
  2013-12-05 13:25                   ` Eduardo Valentin
  (?)
@ 2013-12-06 14:03                   ` Lukasz Majewski
  -1 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-06 14:03 UTC (permalink / raw)
  To: Eduardo Valentin
  Cc: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Myungjoo Ham, durgadoss.r,
	Amit Daniel Kachhap

Hi Eduardo,

> Hey Lukasz,
> 
> On 05-12-2013 07:03, Lukasz Majewski wrote:
> > Hi Eduardo,
> > 
> >> Hey Lukasz!,
> >>
> >> On 03-12-2013 11:42, Lukasz Majewski wrote:
> >>> Hi Eduardo,
> >>>
> >>>> On 03-12-2013 03:31, Lukasz Majewski wrote:
> >>>>> Hi Eduardo,
> >>>>>
> >>>>>> On 05-11-2013 13:26, Lukasz Majewski wrote:
> >>>>>>> This patch provides auto disable/enable operation for boost.
> >>>>>>> It uses already present thermal infrastructure to provide
> >>>>>>> boost hysteresis. A special set of TMU data has been defined
> >>>>>>> for Exynos4412, which is only considered when BOOST is
> >>>>>>> enabled.
> >>>>>>
> >>>>>> Can you please add more description why you need a different
> >>>>>> set of thermal data when boost is enabled? 
> >>>>>
> >>>>> It turned out that the Thermal subsystem (after rework done for
> >>>>> v3.12) is capable of providing hysteresis for BOOST.
> >>>>>
> >>>>
> >>>> So, the difference is only the hysteresis?
> >>>>
> >>>>> For version of the patch up to v8 I had to modify the thermal
> >>>>> core to provide such functionality. Changes in core weren't
> >>>>> accepted by Zhang Rui.
> >>>>
> >>>> Ok... But still I didn't get what you needed to modify and why..
> >>>> Sorry I jumped in the middle of ongoing discussion.
> >>>>
> >>>>>
> >>>>> Then I've looked again to the code and it turned out that proper
> >>>>> setting of Exynos4x12 data (like trigger levels and
> >>>>> freq_clip_max) can solve the problem in a much better way by
> >>>>> using Exynos thermal interrupts.
> >>>>> Another advantage is that those changes are done per device.
> >>>>>
> >>>>>> This is also important in case you
> >>>>>> (Exynos thermal folks) would like to migrate this driver to
> >>>>>> have thermal data support in DT.
> >>>>>
> >>>>> Some work on this driver is ongoing (mainly done by Bartek
> >>>>> Zolnierkiewicz). This BOOST change doesn't break anything and
> >>>>> only extend the current thermal code. Thereof it will not break
> >>>>> anything.
> >>>>
> >>>> Well, good that it does not break anything, right?
> >>>>
> >>>> But, My point, Lukasz, is that I am failing to understand, based
> >>>> on your patch and description why we need a different data
> >>>> definition, one for boost, other for without boost. Can you help
> >>>> me to get your intention with this patch properly?
> >>>
> >>> I reduce the trigger_level[0] and set new .freq_table[0] entry.
> >>> It works as follow (for BOOST):
> >>>
> >>> 1. Non-boost freq is 1.4 GHz on Exynos4412. BOOST is 1.5GHz. The
> >>> BOOST itself is enabled by CONFIG_CPU_FREQ_BOOST_SW. 
> >>>
> >>> 2. Exynos TMU driver reaches the lower TMU level (70 deg). Then
> >>> the core thermal looks for proper frequency table (.freq_tab[0]).
> >>> If the .temp_level matches the trigger_levels[0], then the
> >>> frequency is reduced to .freq_clip_max = 1400 * 1000. 
> >>>
> >>> When the device cools down to 60 deg (trigger_levels[0] -
> >>> threshold_falling), then the max freq is restored to 1.5 GHz. This
> >>> is done automatically by thermal core.
> >>>
> >>> For BOOST disabled we only can run with 1.4 GHz freq. For this
> >>> reason the freq_tab[X] entries must be modified. Also the Exynos
> >>> part of thermal requires that trigger_levels[0] is the lowest
> >>> temperature trip, so I cannot add the "BOOST disable" temp level
> >>> in the end of TMU_DATA_BOOST.
> >>
> >> OK. The entire thing is to allow dynamic control on your speedbin
> >> frequencies, I see.
> > 
> > Yes, correct.
> > 
> >> What bugs me, is that this themal driver keeps
> >> another table of frequencies. 
> > 
> > Yes, it does. It is the part of thermal_cooling_conf data. 
> > 
> > It is a very practical solution, since we can specify the threshold
> > temperature and corresponding maximal frequency (up to 8 values). 
> > 
> > Those values are afterwards used at exynos_bind to bind zone to
> > cooling device.
> > 
> >> Ideally, it should not care about it,
> > 
> > The above procedure is a part of passive cooling implementation for
> > Exynos.
> > 
> >> but about the thermal behavior changes, meaning, say, how fast your
> >> temperature rises, when you jump from lowest opp to 1.4GHz or
> >> 1.5GHz, on host process or cold process samples.
> > 
> > Could you be more specific here? I assume that you are asking if
> > slope of the temperature rise has been measured?
> > 
> > I didn't measure this value, since it depends on the work
> > environment (number of processes running, ambient temperature,
> > current SoC temperature, etc.) and thereof is hard to reproduce.
> > 
> > However, the exynos_thermal_common.c defines .get_trend callback.
> > Unfortunately it only gives an information about the trend (rising,
> > falling). The exact slope value is not given.
> > 
> > Personally I think, that the slope measurement is not relevant for
> > the BOOST.
> > 
> >>
> >>>
> >>>>
> >>>> Side question is what happens in runtime if user echo 0 > boost?
> >>>
> >>> As we had agreed with Rafael and Viresh, we are here mimic the HW
> >>> CPUs behaviour (like Intel CPU).
> >>
> >> Which is fine and expected.
> >>
> >>> When user writes 'echo 0 > boost' then at cpufreq core we switch
> >>> to max freq to 1.4 GHz.
> >>
> >> OK.
> >>
> >>>
> >>> Thermal here is only for safety reasons.  
> >>>
> >>>> Should we switch the data within the driver? 
> >>>
> >>> No. When one decides to enable CONFIG_CPU_FREQ_BOOST_SW, then
> >>> corresponding Exynos data are persistent. 
> >>>
> >>>> Would we be penalizing
> >>>> performance with strict hysteresis while we could be allowing
> >>>> longer periods of high frequency usage? 
> >>>
> >>> But the hysteresis shows up only for emergency - when we go out
> >>> from allowed power envelope.
> >>>
> >>> The BOOST is a component of LAB governor, which takes into account
> >>> the number of running cores. The "normal" BOOST use case is a
> >>> situation when at most two cores are running and other are down.
> >>> In this situation we can use BOOST to finish work faster.
> >>>
> >>>> See what I am missing? Maybe we
> >>>> actually need something else a part from defining one data
> >>>> structure for boost other for non-boost systems.
> >>>
> >>> I'm open for suggestions.
> >>>
> >>> The current proposal aims to change TMU data only for target SoC -
> >>> Exynos4412 in this case. I deliberately don't touch the thermal
> >>> core code.
> >>
> >>
> >> In fact, I see.
> >>
> >> I am just wondering if it makes sense to simply use the data that
> >> represents BOOST always. 
> >> Wouldn't be same as in the situation where
> >> user echo 0 > boost?
> > 
> > I think I get your point here. You would like to reuse the NON BOOST
> > value when user types echo 0 > boost.
> > 
> > The problem is that we would need some kind of notification from
> > cpufreq subsystem to thermal that such change was done. 
> > This seems like an overkill, and in my opinion it is better to
> > use thermal without such notification.
> > To be more specific, the thermal already implements the required
> > functionality and we "only" need to came up with an idea how to
> > appropriately feed data. 
> 
> Well, the real problem is that this driver relies on data structures
> that duplicates cpufreq data and thermal core data. So, every time you
> have a new speedbin frequency, you have to update at least two - three
> places to make sure everything is correct.

Exynos thermal driver exposes such API. It was quite straightforward to
use it for BOOST.

> 
> My point is not exactly that I am suggesting to reuse the non-boost
> data. My point is that temperature constraints do not change if you
> are using boost or non-boost frequencies. Your temperature trip
> points will be the same, because your silicon still is gonna start to
> break if cross the line. And that is what I mean when I say, the
> thermal driver should be aware of temperature constraints, not
> frequencies. At most, the cooling device should be aware of
> frequencies, not thermal driver.

Ok, I get it.

> 
> About the current patch proposal, still, would it work if you only use
> BOOST data? Even on non-boost devices? Apparently yes, as you use
> BOOST data when boost is disabled. So, that was my point here, why
> not using only boost data, regardless of config?

Good point. I will try to look for one Exynos data set solution.

I need to double check some issues.

Stay tunned for patch :-).


> 
> > 
> >>
> >>>
> >>>>
> >>>>>
> >>>>>>
> >>>>>>
> >>>>>>>
> >>>>>>> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> >>>>>>> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> >>>>>>>
> >>>>>>> ---
> >>>>>>> Changes for v10:
> >>>>>>>     - Remove boost related code from thermal_core.c
> >>>>>>>     - Use already present thermal infrastructure to provide
> >>>>>>> thermal hysteresis
> >>>>>>>     - Introduce special set of TMU data for BOOST
> >>>>>>>
> >>>>>>> Changes for v9:
> >>>>>>>     - None
> >>>>>>>
> >>>>>>> Changes for v8:
> >>>>>>>     - Move cpufreq_boost_* stub functions definition (needed
> >>>>>>> when cpufreq is not compiled in) to cpufreq.h at cpufreq core
> >>>>>>> support commit
> >>>>>>>
> >>>>>>> Changes for v7:
> >>>>>>>     - None
> >>>>>>>
> >>>>>>> Changes for v6:
> >>>>>>>     - Disable boost only when supported and enabled
> >>>>>>>     - Protect boost related thermal_zone_device struct fields
> >>>>>>> with mutex
> >>>>>>>     - Evaluate temperature trend during boost enable decision
> >>>>>>>     - Create separate methods to handle boost enable/disable
> >>>>>>>       (thermal_boost_{enable|disable}) operations
> >>>>>>>     - Boost is disabled at any trip point passage (not only
> >>>>>>> the non critical one)
> >>>>>>>     - Add stub definitions for cpufreq boost functions used
> >>>>>>> when CONFIG_CPU_FREQ is NOT defined.
> >>>>>>>
> >>>>>>> Changes for v5:
> >>>>>>>     - Move boost disable code from cpu_cooling.c to
> >>>>>>> thermal_core.c (to handle_non_critical_trips)
> >>>>>>>     - Extent struct thermal_zone_device by adding overheated
> >>>>>>> bool flag
> >>>>>>>     - Implement auto enable of boost after device cools down
> >>>>>>>     - Introduce boost_polling flag, which indicates if thermal
> >>>>>>> uses it's predefined pool delay or has woken up thermal
> >>>>>>> workqueue only to wait until device cools down.
> >>>>>>>
> >>>>>>> Changes for v4:
> >>>>>>>     - New patch
> >>>>>>
> >>>>>>
> >>>>>> Might be interesting to see the changelog for this patch only.
> >>>>>
> >>>>> The above list presents the development state of this particular
> >>>>> patch (thermal). 
> >>>>> Up to v8 I had modified the thermal core. For v10 I've decided
> >>>>> to use proper Exynos data setting.
> >>>>>
> >>>>> If in any doubt, please ask. 
> >>>>>
> >>>>> This last thermal patch of the series hinders this code to be
> >>>>> applied to cpufreq subsystem (Viresh had acked it some time ago
> >>>>> and I hope that he hasn't changed his mind :-) ).
> >>>>>
> >>>>>
> >>>>>>
> >>>>>>>
> >>>>>>>  drivers/thermal/samsung/exynos_tmu_data.c |   47
> >>>>>>> +++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+)
> >>>>>>>
> >>>>>>> diff --git a/drivers/thermal/samsung/exynos_tmu_data.c
> >>>>>>> b/drivers/thermal/samsung/exynos_tmu_data.c index
> >>>>>>> 073c292..9346926 100644 ---
> >>>>>>> a/drivers/thermal/samsung/exynos_tmu_data.c +++
> >>>>>>> b/drivers/thermal/samsung/exynos_tmu_data.c @@ -167,13 +167,60
> >>>>>>> @@ static const struct exynos_tmu_registers
> >>>>>>> exynos4412_tmu_registers = { .features =
> >>>>>>> (TMU_SUPPORT_EMULATION | TMU_SUPPORT_TRIM_RELOAD | \
> >>>>>>> TMU_SUPPORT_FALLING_TRIP | TMU_SUPPORT_READY_STATUS | \
> >>>>>>> TMU_SUPPORT_EMUL_TIME) + +#define EXYNOS4412_TMU_DATA_BOOST \
> >>>>>>> +	.threshold_falling = 10, \
> >>>>>>> +	.trigger_levels[0] = 70, \
> >>>>>>> +	.trigger_levels[1] = 85, \
> >>>>>>> +	.trigger_levels[2] = 103, \
> >>>>>>> +	.trigger_levels[3] = 110, \
> >>>>>>> +	.trigger_enable[0] = true, \
> >>>>>>> +	.trigger_enable[1] = true, \
> >>>>>>> +	.trigger_enable[2] = true, \
> >>>>>>> +	.trigger_enable[3] = true, \
> >>>>>>> +	.trigger_type[0] = THROTTLE_ACTIVE, \
> >>>>>>> +	.trigger_type[1] = THROTTLE_ACTIVE, \
> >>>>>>> +	.trigger_type[2] = THROTTLE_ACTIVE, \
> >>>>>>> +	.trigger_type[3] = SW_TRIP, \
> >>>>>>> +	.max_trigger_level = 4, \
> >>>>>>> +	.gain = 8, \
> >>>>>>> +	.reference_voltage = 16, \
> >>>>>>> +	.noise_cancel_mode = 4, \
> >>>>>>> +	.cal_type = TYPE_ONE_POINT_TRIMMING, \
> >>>>>>> +	.efuse_value = 55, \
> >>>>>>> +	.min_efuse_value = 40, \
> >>>>>>> +	.max_efuse_value = 100, \
> >>>>>>> +	.first_point_trim = 25, \
> >>>>>>> +	.second_point_trim = 85, \
> >>>>>>> +	.default_temp_offset = 50, \
> >>>>>>> +	.freq_tab[0] = { \
> >>>>>>> +		.freq_clip_max = 1400 * 1000, \
> >>>>>>> +		.temp_level = 70, \
> >>>>>>> +	}, \
> >>>>>>> +	.freq_tab[1] = { \
> >>>>>>> +		.freq_clip_max = 800 * 1000, \
> >>>>>>> +		.temp_level = 85, \
> >>>>>>> +	}, \
> >>>>>>> +	.freq_tab[2] = { \
> >>>>>>> +		.freq_clip_max = 200 * 1000, \
> >>>>>>> +		.temp_level = 103, \
> >>>>>>> +	}, \
> >>>>>>> +	.freq_tab_count = 3, \
> >>>>>>> +	.registers = &exynos4412_tmu_registers, \
> >>>>>>> +	.features = (TMU_SUPPORT_EMULATION |
> >>>>>>> TMU_SUPPORT_TRIM_RELOAD | \
> >>>>>>> +			TMU_SUPPORT_FALLING_TRIP |
> >>>>>>> TMU_SUPPORT_READY_STATUS | \
> >>>>>>> +			TMU_SUPPORT_EMUL_TIME)
> >>>>>>>  #endif
> >>>>>>>  
> >>>>>>>  #if defined(CONFIG_SOC_EXYNOS4412)
> >>>>>>>  struct exynos_tmu_init_data const exynos4412_default_tmu_data
> >>>>>>> = { .tmu_data = {
> >>>>>>>  		{
> >>>>>>> +#ifdef CONFIG_CPU_FREQ_BOOST_SW
> >>>>>>> +			EXYNOS4412_TMU_DATA_BOOST,
> >>>>>>> +#else
> >>>>>>>  			EXYNOS4412_TMU_DATA,
> >>>>>>> +#endif
> >>>>>>>  			.type = SOC_ARCH_EXYNOS4412,
> >>>>>>>  			.test_mux =
> >>>>>>> EXYNOS4412_MUX_ADDR_VALUE, },
> >>>>>>>
> >>>>>>
> >>>>>>
> >>>>>
> >>>>
> >>>>
> >>>
> >>>
> >>>
> >>
> >>
> > 
> > 
> 
> 


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH RESEND v10 0/7] cpufreq:boost: CPU Boost mode support
  2013-12-04 14:12       ` Eduardo Valentin
  (?)
@ 2013-12-09 10:04       ` Lukasz Majewski
  -1 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-09 10:04 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Eduardo Valentin, Viresh Kumar, Zhang Rui, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Myungjoo Ham, durgadoss.r,
	linux-samsung-soc

Hi Rafael,

> On 04-12-2013 02:59, Lukasz Majewski wrote:
> > Hi Rafael,
> > 
> >> This patch series introduces support for CPU overclocking technique
> >> called Boost.
> >>
> >> It is a follow up of a LAB governor proposal. Boost is a LAB
> >> component:
> >> http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq
> >>
> >> Boost unifies hardware based solution (e.g. Intel Nehalem) with
> >> software oriented one (like the one done at Exynos).
> >> For this reason cpufreq/freq_table code has been reorganized to
> >> include common code.
> >>
> >> Important design decisions:
> >> - Boost related code is compiled-in unconditionally to cpufreq core
> >> and disabled by default. The cpufreq_driver is responsibile for
> >> setting boost_supported flag and providing set_boost callback(if HW
> >> support is needed). For software managed boost, special Kconfig
> >> flag - CONFIG_CPU_FREQ_BOOST_SW has been defined. It will be
> >> selected only when a target platform has thermal framework
> >> properly configured.
> >>
> >> - struct cpufreq_driver has been extended with boost related
> >> fields: -- boost_supported - when driver supports boosting
> >>         -- boost_enabled - boost state
> >>         -- set_boost - callback to function, which is necessary to
> >>            enable/disable boost
> >>
> >> - Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost) is
> >> visible _only_ when cpufreq driver supports Boost.
> >>
> >> - No special spin_lock for Boost was created. The one from cpufreq
> >> core was reused.
> >>
> >> - The Boost code doesn't rely on any policy. When boost state is
> >> changed, then the policy list is iterated and proper adjustements
> >> are done.
> >>
> >> - To improve safety level, the thermal framework is also extended
> >> to disable software boosting, when thermal trip point is reached.
> >> After cooling down the boost can be enabled again. This emulates
> >> behaviour similar to HW managed boost (like x86)
> >>
> >> Tested at HW:
> >>        Exynos 4412 3.13-rc2 Linux
> >>        Intel Core i7-3770 3.13-rc2 Linux
> >>
> >> Above patches were posted on top of kernel_pm/bleeding-edge
> >> (SHA1: 9483a9f69d5c8f83f1723361bf8340ddfb6475b4)
> >>
> > 
> > Rafael, could you pull patches from 1 to 6 of this series? Those are
> > related to cpufreq core and has already been accepted by Viresh at a
> > late August this year.
> > This would facilitate my further cpufreq work.
> > 
> > And about the last patch - related to thermal. It seems that more
> > discussion NOT related to cpufreq will be ongoing. 
> > 
> > I would prefer to add it as a separate patch to thermal subtree.
> 
> I agree with Lukasz here. The part that touches the thermal driver is
> minimal and the discussion is a simple matter of concept and
> optimization of data structures.

Rafael, what is your opinion here?

Shall I prepare another resend (without thermal patch) or would you
accept the cpufreq part of this patch set (1 to 6) as is?

> 
> > 
> > 
> > 
> >>
> >> Lukasz Majewski (7):
> >>   cpufreq: Add boost frequency support in core
> >>   cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with
> >> common boost solution
> >>   cpufreq:boost:Kconfig: Provide support for software managed BOOST
> >>   cpufreq:exynos:Extend Exynos cpufreq driver to support boost
> >>     framework
> >>   Documentation:cpufreq:boost: Update BOOST documentation
> >>   cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ
> >>   thermal:exynos:boost: Automatic enable/disable of BOOST feature
> >> (at Exynos4412)
> >>
> >>  Documentation/cpu-freq/boost.txt          |   26 +++----
> >>  drivers/cpufreq/Kconfig                   |    4 +
> >>  drivers/cpufreq/Kconfig.arm               |   15 ++++
> >>  drivers/cpufreq/acpi-cpufreq.c            |   86
> >> +++++++-------------- drivers/cpufreq/cpufreq.c                 |
> >> 118 ++++++++++++++++++++++++++++-
> >> drivers/cpufreq/exynos-cpufreq.c          |    3 +
> >> drivers/cpufreq/exynos4x12-cpufreq.c      |    2 +-
> >> drivers/cpufreq/freq_table.c              |   56 ++++++++++++--
> >> drivers/thermal/samsung/exynos_tmu_data.c |   47 ++++++++++++
> >> include/linux/cpufreq.h                   |   24 ++++++ 10 files
> >> changed, 302 insertions(+), 79 deletions(-)
> >>
> > 
> > 
> > 
> 
> 


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* [PATCH v11 0/7] cpufreq:boost: CPU Boost mode support
  2013-06-06  7:07 [PATCH 0/5] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                   ` (15 preceding siblings ...)
  2013-12-02 12:19 ` [PATCH RESEND v10 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
@ 2013-12-13 16:38 ` Lukasz Majewski
  2013-12-13 16:38   ` [PATCH v11 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
                     ` (6 more replies)
  2013-12-20 14:24 ` [PATCH v12 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
  17 siblings, 7 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-13 16:38 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, linux-samsung-soc

This patch series introduces support for CPU overclocking technique
called Boost.

It is a follow up of a LAB governor proposal. Boost is a LAB component:
http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq

Boost unifies hardware based solution (e.g. Intel Nehalem) with
software oriented one (like the one done at Exynos).
For this reason cpufreq/freq_table code has been reorganized to include
common code.

Important design decisions:
- Boost related code is compiled-in unconditionally to cpufreq core and
  disabled by default. The cpufreq_driver is responsibile for setting
  boost_supported flag and providing set_boost callback(if HW support
  is needed). For software managed boost, special Kconfig flag -
  CONFIG_CPU_FREQ_BOOST_SW has been defined. It will be selected only
  when a target platform has thermal framework properly configured.

- struct cpufreq_driver has been extended with boost related fields:
        -- boost_supported - when driver supports boosting
        -- boost_enabled - boost state
        -- set_boost - callback to function, which is necessary to
           enable/disable boost

- Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost) is visible
  _only_ when cpufreq driver supports Boost.

- No special spin_lock for Boost was created. The one from cpufreq core
  was reused.

- The Boost code doesn't rely on any policy. When boost state is changed,
  then the policy list is iterated and proper adjustements are done.

- To improve safety level, the thermal framework is also extended to disable
  software boosting, when thermal trip point is reached. After cooling down
  the boost can be enabled again. This emulates behaviour similar to HW
  managed boost (like x86)

Tested at HW:
       Exynos 4412 3.13-rc3 Linux
       Intel Core i7-3770 3.13-rc3 Linux

Above patches were posted on top of kernel_pm/bleeding-edge
(SHA1: 2e4bc4515a6143c8c2af037236199eb95f834b40)


Lukasz Majewski (7):
  cpufreq: Add boost frequency support in core
  cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common
    boost solution
  cpufreq:boost:Kconfig: Provide support for software managed BOOST
  cpufreq:exynos:Extend Exynos cpufreq driver to support boost
    framework
  Documentation:cpufreq:boost: Update BOOST documentation
  cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ
  thermal:exynos:boost: Automatic enable/disable of BOOST feature (at
    Exynos4412)

 Documentation/cpu-freq/boost.txt          |   26 +++----
 drivers/cpufreq/Kconfig                   |    4 +
 drivers/cpufreq/Kconfig.arm               |   15 ++++
 drivers/cpufreq/acpi-cpufreq.c            |   86 +++++++--------------
 drivers/cpufreq/cpufreq.c                 |  118 ++++++++++++++++++++++++++++-
 drivers/cpufreq/exynos-cpufreq.c          |    3 +
 drivers/cpufreq/exynos4x12-cpufreq.c      |    2 +-
 drivers/cpufreq/freq_table.c              |   56 ++++++++++++--
 drivers/thermal/samsung/exynos_tmu_data.c |   12 +--
 include/linux/cpufreq.h                   |   24 ++++++
 10 files changed, 261 insertions(+), 85 deletions(-)

-- 
1.7.10.4


^ permalink raw reply	[flat|nested] 329+ messages in thread

* [PATCH v11 1/7] cpufreq: Add boost frequency support in core
  2013-12-13 16:38 ` [PATCH v11 " Lukasz Majewski
@ 2013-12-13 16:38   ` Lukasz Majewski
  2013-12-13 16:38   ` [PATCH v11 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
                     ` (5 subsequent siblings)
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-13 16:38 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, linux-samsung-soc

This commit adds boost frequency support in cpufreq core (Hardware &
Software). Some SoCs (like Exynos4 - e.g. 4x12) allow setting frequency
above its normal operation limits. Such mode shall be only used for a
short time.

Overclocking (boost) support is essentially provided by platform
dependent cpufreq driver.

This commit unifies support for SW and HW (Intel) overclocking solutions
in the core cpufreq driver. Previously the "boost" sysfs attribute was
defined at acpi driver code. By default boost is disabled. One global
attribute is available at: /sys/devices/system/cpu/cpufreq/boost.

It only shows up when cpufreq driver supports overclocking.
Under the hood frequencies dedicated for boosting are marked with a
special flag (CPUFREQ_BOOST_FREQ) at driver's frequency table.
It is the user's concern to enable/disable overclocking with a proper call
to sysfs.

The cpufreq_boost_trigger_state() function is defined non static on purpose.
It is used later with thermal subsystem to provide automatic enable/disable
of the BOOST feature.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v11:
- None

Changes for v10:
- None

Changes for v9:
- Add cpufreq_freq_attr_scaling_boost_freqs to *cpufreq_generic_attr table
- Introduce CONFIG_CPU_FREQ_BOOST_SW generic config flag to show BOOST
  frequencies only when cpufreq driver supports boost

Changes for v8:
- Correction of error message at cpufreq_boost_trigger_state() function
- Rewrite the cpufreq_boost_set_sw() function to print error message and
  break the loop when policy adjustment fails

Changes for v7:
- Properly change cpufreq_driver->boost_enabled when set_boost() fails
  (=0 to =!state)
- Add likely() around cpufreq_driver
- Remove parenthesis around boost.attr

Changes for v6:
- Remove sysfs boost attribute when subsys_iterface_unregister() fails
- Move global boost_enabled variable from cpufreq.c to platform dependent
  struct cpufreq_driver
- pr_err() message is also printed when boost disable fails
- Call __cpufreq_governor() to force recalculation of next frequency when
  boost is triggered. It is needed with i.e. performance class of governors
- Change cpufreq_boost_enable_sw() -> cpufreq_boost_set_sw()
- Rename .enable_boost function pointer to .set_boost

Changes for v5:
- Rename cpufreq_boost_trigger_state_sw() to cpufreq_boost_enable_sw()
- Extent cpufreq_register_driver() to check if cpufreq driver provided
  boost_enable callback. If not provided, then use cpufreq_boost_enable_sw()
- Use single call to cpufreq_driver->enable_boost() with cpufreq driver
  provided callback or default SW boost enable routine
- Move pr_debug call to store_boost() from cpufreq_boost_trigger_state()
- Change the user_policy.max value when SW boost is toggled. It is necessary
  for proper operation of e.g. thermal subsystem.
- Add check if cpufreq_driver pointer is not NULL at
  cpufreq_boost_supported() routine
- Add EXPORT_SYMBOL_GPL for cpufreq_boost_supported() and
  cpufreq_boost_enabled()
- Remove extra check for cpufreq_boost_supported() at
  cpufreq_freq_table_cpuinfo()
- Explanation of show boost logic at show_available_freqs()
- Add cpufreq_set_boost_enabled() method to set initial value of boost_enabled
  global flag

Changes for v4:
- Remove boost parameter from cpufreq_frequency_table_cpuinfo() function
- Introduce cpufreq_boost_supported() method
- Use of cpufreq_boost_supported() and cpufreq_boost_enabled() to decide
  if frequency shall be skipped
- Rename set_boost_freq() to enable_boost()
- cpufreq_attr_available_freq() moved to freq_table.c
- Use policy list to get access to cpufreq policies
- Rename global boost flag (cpufreq_boost_enabled -> boost_enabled)
- pr_err corrected ( %sable)
- Remove sanity check at cpufreq_boost_trigger_state() entrance [to test if
  boost is supported]
- Use either HW (boost_enable) callback or SW managed boost
- Introduce new cpufreq_boost_trigger_state_sw() method to handle boost
  at SW.
- Protect boost_enabled manipulation with lock.

Changes for v3:
- Method for reading boost status
- Removal of cpufreq_frequency_table_max()
- Extent cpufreq_frequency_table_cpuinfo() to support boost parameter
- boost_supported flag added to cpufreq_driver struct
- "boost" sysfs attribute control flag removed
- One global flag describing state of the boost defined at cpufreq core
- Rename cpufreq_driver's low_level_boost field to set_boost_freq()
- Usage of cpufreq_sysfs_{remove|add}_file() routines

Changes for v2:
- Removal of cpufreq_boost structure and move its fields to cpufreq_driver
  structure
- Flag to indicate if global boost attribute is already defined
- Extent the pr_{err|debbug} functions to show current function names

 drivers/cpufreq/cpufreq.c    |  118 +++++++++++++++++++++++++++++++++++++++++-
 drivers/cpufreq/freq_table.c |   56 +++++++++++++++++---
 include/linux/cpufreq.h      |   24 +++++++++
 3 files changed, 190 insertions(+), 8 deletions(-)

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 02d534d..33774cc 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -324,6 +324,33 @@ EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
 /*********************************************************************
  *                          SYSFS INTERFACE                          *
  *********************************************************************/
+ssize_t show_boost(struct kobject *kobj,
+				 struct attribute *attr, char *buf)
+{
+	return sprintf(buf, "%d\n", cpufreq_driver->boost_enabled);
+}
+
+static ssize_t store_boost(struct kobject *kobj, struct attribute *attr,
+				  const char *buf, size_t count)
+{
+	int ret, enable;
+
+	ret = sscanf(buf, "%d", &enable);
+	if (ret != 1 || enable < 0 || enable > 1)
+		return -EINVAL;
+
+	if (cpufreq_boost_trigger_state(enable)) {
+		pr_err("%s: Cannot %s BOOST!\n", __func__,
+		       enable ? "enable" : "disable");
+		return -EINVAL;
+	}
+
+	pr_debug("%s: cpufreq BOOST %s\n", __func__,
+		 enable ? "enabled" : "disabled");
+
+	return count;
+}
+define_one_global_rw(boost);
 
 static struct cpufreq_governor *__find_governor(const char *str_governor)
 {
@@ -2106,6 +2133,73 @@ static struct notifier_block __refdata cpufreq_cpu_notifier = {
 };
 
 /*********************************************************************
+ *               BOOST						     *
+ *********************************************************************/
+static int cpufreq_boost_set_sw(int state)
+{
+	struct cpufreq_frequency_table *freq_table;
+	struct cpufreq_policy *policy;
+	int ret = -EINVAL;
+
+	list_for_each_entry(policy, &cpufreq_policy_list, policy_list) {
+		freq_table = cpufreq_frequency_get_table(policy->cpu);
+		if (freq_table) {
+			ret = cpufreq_frequency_table_cpuinfo(policy,
+							freq_table);
+			if (ret) {
+				pr_err("%s: Policy frequency update failed\n",
+				       __func__);
+				break;
+			}
+			policy->user_policy.max = policy->max;
+			__cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
+		}
+	}
+
+	return ret;
+}
+
+int cpufreq_boost_trigger_state(int state)
+{
+	unsigned long flags;
+	int ret = 0;
+
+	if (cpufreq_driver->boost_enabled == state)
+		return 0;
+
+	write_lock_irqsave(&cpufreq_driver_lock, flags);
+	cpufreq_driver->boost_enabled = state;
+	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
+
+	ret = cpufreq_driver->set_boost(state);
+	if (ret) {
+		write_lock_irqsave(&cpufreq_driver_lock, flags);
+		cpufreq_driver->boost_enabled = !state;
+		write_unlock_irqrestore(&cpufreq_driver_lock, flags);
+
+		pr_err("%s: Cannot %s BOOST\n", __func__,
+		       state ? "enable" : "disable");
+	}
+
+	return ret;
+}
+
+int cpufreq_boost_supported(void)
+{
+	if (likely(cpufreq_driver))
+		return cpufreq_driver->boost_supported;
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(cpufreq_boost_supported);
+
+int cpufreq_boost_enabled(void)
+{
+	return cpufreq_driver->boost_enabled;
+}
+EXPORT_SYMBOL_GPL(cpufreq_boost_enabled);
+
+/*********************************************************************
  *               REGISTER / UNREGISTER CPUFREQ DRIVER                *
  *********************************************************************/
 
@@ -2145,9 +2239,25 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 	cpufreq_driver = driver_data;
 	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
 
+	if (cpufreq_boost_supported()) {
+		/*
+		 * Check if driver provides function to enable boost -
+		 * if not, use cpufreq_boost_set_sw as default
+		 */
+		if (!cpufreq_driver->set_boost)
+			cpufreq_driver->set_boost = cpufreq_boost_set_sw;
+
+		ret = cpufreq_sysfs_create_file(&boost.attr);
+		if (ret) {
+			pr_err("%s: cannot register global BOOST sysfs file\n",
+				__func__);
+			goto err_null_driver;
+		}
+	}
+
 	ret = subsys_interface_register(&cpufreq_interface);
 	if (ret)
-		goto err_null_driver;
+		goto err_boost_unreg;
 
 	if (!(cpufreq_driver->flags & CPUFREQ_STICKY)) {
 		int i;
@@ -2174,6 +2284,9 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 	return 0;
 err_if_unreg:
 	subsys_interface_unregister(&cpufreq_interface);
+err_boost_unreg:
+	if (cpufreq_boost_supported())
+		cpufreq_sysfs_remove_file(&boost.attr);
 err_null_driver:
 	write_lock_irqsave(&cpufreq_driver_lock, flags);
 	cpufreq_driver = NULL;
@@ -2200,6 +2313,9 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
 	pr_debug("unregistering driver %s\n", driver->name);
 
 	subsys_interface_unregister(&cpufreq_interface);
+	if (cpufreq_boost_supported())
+		cpufreq_sysfs_remove_file(&boost.attr);
+
 	unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
 
 	down_write(&cpufreq_rwsem);
diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c
index 3458d27..776e88a 100644
--- a/drivers/cpufreq/freq_table.c
+++ b/drivers/cpufreq/freq_table.c
@@ -32,6 +32,10 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
 
 			continue;
 		}
+		if (!cpufreq_boost_enabled()
+		    && table[i].driver_data == CPUFREQ_BOOST_FREQ)
+			continue;
+
 		pr_debug("table entry %u: %u kHz, %u driver_data\n",
 					i, freq, table[i].driver_data);
 		if (freq < min_freq)
@@ -182,7 +186,8 @@ static DEFINE_PER_CPU(struct cpufreq_frequency_table *, cpufreq_show_table);
 /**
  * show_available_freqs - show available frequencies for the specified CPU
  */
-static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
+static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf,
+				    bool show_boost)
 {
 	unsigned int i = 0;
 	unsigned int cpu = policy->cpu;
@@ -197,6 +202,20 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
 	for (i = 0; (table[i].frequency != CPUFREQ_TABLE_END); i++) {
 		if (table[i].frequency == CPUFREQ_ENTRY_INVALID)
 			continue;
+		/*
+		 * show_boost = true and driver_data = BOOST freq
+		 * display BOOST freqs
+		 *
+		 * show_boost = false and driver_data = BOOST freq
+		 * show_boost = true and driver_data != BOOST freq
+		 * continue - do not display anything
+		 *
+		 * show_boost = false and driver_data != BOOST freq
+		 * display NON BOOST freqs
+		 */
+		if (show_boost ^ (table[i].driver_data == CPUFREQ_BOOST_FREQ))
+			continue;
+
 		count += sprintf(&buf[count], "%d ", table[i].frequency);
 	}
 	count += sprintf(&buf[count], "\n");
@@ -205,16 +224,39 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
 
 }
 
-struct freq_attr cpufreq_freq_attr_scaling_available_freqs = {
-	.attr = { .name = "scaling_available_frequencies",
-		  .mode = 0444,
-		},
-	.show = show_available_freqs,
-};
+#define cpufreq_attr_available_freq(_name)	  \
+struct freq_attr cpufreq_freq_attr_##_name##_freqs =     \
+__ATTR_RO(_name##_frequencies)
+
+/**
+ * show_scaling_available_frequencies - show available normal frequencies for
+ * the specified CPU
+ */
+static ssize_t scaling_available_frequencies_show(struct cpufreq_policy *policy,
+						  char *buf)
+{
+	return show_available_freqs(policy, buf, false);
+}
+cpufreq_attr_available_freq(scaling_available);
 EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_available_freqs);
 
+/**
+ * show_available_boost_freqs - show available boost frequencies for
+ * the specified CPU
+ */
+static ssize_t scaling_boost_frequencies_show(struct cpufreq_policy *policy,
+					      char *buf)
+{
+	return show_available_freqs(policy, buf, true);
+}
+cpufreq_attr_available_freq(scaling_boost);
+EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_boost_freqs);
+
 struct freq_attr *cpufreq_generic_attr[] = {
 	&cpufreq_freq_attr_scaling_available_freqs,
+#ifdef CONFIG_CPU_FREQ_BOOST_SW
+	&cpufreq_freq_attr_scaling_boost_freqs,
+#endif
 	NULL,
 };
 EXPORT_SYMBOL_GPL(cpufreq_generic_attr);
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index dc196bb..a0cbb7c 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -225,6 +225,11 @@ struct cpufreq_driver {
 	int	(*suspend)	(struct cpufreq_policy *policy);
 	int	(*resume)	(struct cpufreq_policy *policy);
 	struct freq_attr	**attr;
+
+	/* platform specific boost support code */
+	bool                    boost_supported;
+	bool                    boost_enabled;
+	int     (*set_boost)    (int state);
 };
 
 /* flags */
@@ -420,6 +425,7 @@ extern struct cpufreq_governor cpufreq_gov_conservative;
 
 #define CPUFREQ_ENTRY_INVALID ~0
 #define CPUFREQ_TABLE_END     ~1
+#define CPUFREQ_BOOST_FREQ    ~2
 
 struct cpufreq_frequency_table {
 	unsigned int	driver_data; /* driver specific data, not used by core */
@@ -443,6 +449,24 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
 void cpufreq_frequency_table_update_policy_cpu(struct cpufreq_policy *policy);
 ssize_t cpufreq_show_cpus(const struct cpumask *mask, char *buf);
 
+#ifdef CONFIG_CPU_FREQ
+int cpufreq_boost_trigger_state(int state);
+int cpufreq_boost_supported(void);
+int cpufreq_boost_enabled(void);
+#else
+static inline int cpufreq_boost_trigger_state(int state)
+{
+	return 0;
+}
+static inline int cpufreq_boost_supported(void)
+{
+	return 0;
+}
+static inline int cpufreq_boost_enabled(void)
+{
+	return 0;
+}
+#endif
 /* the following funtion is for cpufreq core use only */
 struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu);
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v11 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution
  2013-12-13 16:38 ` [PATCH v11 " Lukasz Majewski
  2013-12-13 16:38   ` [PATCH v11 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
@ 2013-12-13 16:38   ` Lukasz Majewski
  2013-12-13 16:38   ` [PATCH v11 3/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
                     ` (4 subsequent siblings)
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-13 16:38 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, linux-samsung-soc

The Intel's hardware based boost solution driver has been changed to cooperate with
common cpufreq boost framework.

The global sysfs boost attribute entry code (/sys/devices/system/cpu/cpufreq/boost)
has been moved to a core cpufreq code. This attribute is now only visible,
when cpufreq driver supports it.

The _store_boost() function has been redesigned to be used as set_boost
callback.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v11:
- None

Changes for v10:
- None

Changes for v9:
- None

Changes for v8:
- None

Changes for v7:
- Remove superfluous acpi_cpufreq_driver.boost_supported = false at
  acpi_cpufreq_boost_init()

Changes for v6:
- Perform acpi_cpufreq_boost_init initialization before cpufreq_driver
  registration
- Compile store_boost() only when CONFIG_X86_ACPI_CPUFREQ_CPB defined
- Use boost_enabled flag defined at acpi_cpufreq_driver to store information
  about boost state
- Instead of using cpufreq_set_boost_enabled(), modify the boost_enable in
  the acpi driver code

Changes for v5:
- Remove acpi-cpufreq's boost_enabled global flag and reuse one defined at
  cpufreq core

Changes for v4:
- add _store_boost to acpi_cpufreq_driver structure

Changes for v3:
- Bring back boost_enabled as a global flag
- Move boost_supported to cpufreq_driver structure

Changes for v2:
- Replace boost_enabled and boost_supported global flags with proper entries
  at struct cpufreq_driver.
- Removal of struct cpufreq_boost

 drivers/cpufreq/acpi-cpufreq.c |   86 ++++++++++++++--------------------------
 1 file changed, 29 insertions(+), 57 deletions(-)

diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c
index caf41eb..79e5608 100644
--- a/drivers/cpufreq/acpi-cpufreq.c
+++ b/drivers/cpufreq/acpi-cpufreq.c
@@ -80,7 +80,6 @@ static struct acpi_processor_performance __percpu *acpi_perf_data;
 static struct cpufreq_driver acpi_cpufreq_driver;
 
 static unsigned int acpi_pstate_strict;
-static bool boost_enabled, boost_supported;
 static struct msr __percpu *msrs;
 
 static bool boost_state(unsigned int cpu)
@@ -133,49 +132,16 @@ static void boost_set_msrs(bool enable, const struct cpumask *cpumask)
 	wrmsr_on_cpus(cpumask, msr_addr, msrs);
 }
 
-static ssize_t _store_boost(const char *buf, size_t count)
+static int _store_boost(int val)
 {
-	int ret;
-	unsigned long val = 0;
-
-	if (!boost_supported)
-		return -EINVAL;
-
-	ret = kstrtoul(buf, 10, &val);
-	if (ret || (val > 1))
-		return -EINVAL;
-
-	if ((val && boost_enabled) || (!val && !boost_enabled))
-		return count;
-
 	get_online_cpus();
-
 	boost_set_msrs(val, cpu_online_mask);
-
 	put_online_cpus();
-
-	boost_enabled = val;
 	pr_debug("Core Boosting %sabled.\n", val ? "en" : "dis");
 
-	return count;
-}
-
-static ssize_t store_global_boost(struct kobject *kobj, struct attribute *attr,
-				  const char *buf, size_t count)
-{
-	return _store_boost(buf, count);
-}
-
-static ssize_t show_global_boost(struct kobject *kobj,
-				 struct attribute *attr, char *buf)
-{
-	return sprintf(buf, "%u\n", boost_enabled);
+	return 0;
 }
 
-static struct global_attr global_boost = __ATTR(boost, 0644,
-						show_global_boost,
-						store_global_boost);
-
 static ssize_t show_freqdomain_cpus(struct cpufreq_policy *policy, char *buf)
 {
 	struct acpi_cpufreq_data *data = per_cpu(acfreq_data, policy->cpu);
@@ -186,15 +152,32 @@ static ssize_t show_freqdomain_cpus(struct cpufreq_policy *policy, char *buf)
 cpufreq_freq_attr_ro(freqdomain_cpus);
 
 #ifdef CONFIG_X86_ACPI_CPUFREQ_CPB
+static ssize_t store_boost(const char *buf, size_t count)
+{
+	int ret;
+	unsigned long val = 0;
+
+	if (!acpi_cpufreq_driver.boost_supported)
+		return -EINVAL;
+
+	ret = kstrtoul(buf, 10, &val);
+	if (ret || (val > 1))
+		return -EINVAL;
+
+	_store_boost((int) val);
+
+	return count;
+}
+
 static ssize_t store_cpb(struct cpufreq_policy *policy, const char *buf,
 			 size_t count)
 {
-	return _store_boost(buf, count);
+	return store_boost(buf, count);
 }
 
 static ssize_t show_cpb(struct cpufreq_policy *policy, char *buf)
 {
-	return sprintf(buf, "%u\n", boost_enabled);
+	return sprintf(buf, "%u\n", acpi_cpufreq_driver.boost_enabled);
 }
 
 cpufreq_freq_attr_rw(cpb);
@@ -554,7 +537,7 @@ static int boost_notify(struct notifier_block *nb, unsigned long action,
 	switch (action) {
 	case CPU_UP_PREPARE:
 	case CPU_UP_PREPARE_FROZEN:
-		boost_set_msrs(boost_enabled, cpumask);
+		boost_set_msrs(acpi_cpufreq_driver.boost_enabled, cpumask);
 		break;
 
 	case CPU_DOWN_PREPARE:
@@ -911,6 +894,7 @@ static struct cpufreq_driver acpi_cpufreq_driver = {
 	.resume		= acpi_cpufreq_resume,
 	.name		= "acpi-cpufreq",
 	.attr		= acpi_cpufreq_attr,
+	.set_boost      = _store_boost,
 };
 
 static void __init acpi_cpufreq_boost_init(void)
@@ -921,33 +905,22 @@ static void __init acpi_cpufreq_boost_init(void)
 		if (!msrs)
 			return;
 
-		boost_supported = true;
-		boost_enabled = boost_state(0);
-
+		acpi_cpufreq_driver.boost_supported = true;
+		acpi_cpufreq_driver.boost_enabled = boost_state(0);
 		get_online_cpus();
 
 		/* Force all MSRs to the same value */
-		boost_set_msrs(boost_enabled, cpu_online_mask);
+		boost_set_msrs(acpi_cpufreq_driver.boost_enabled,
+			       cpu_online_mask);
 
 		register_cpu_notifier(&boost_nb);
 
 		put_online_cpus();
-	} else
-		global_boost.attr.mode = 0444;
-
-	/* We create the boost file in any case, though for systems without
-	 * hardware support it will be read-only and hardwired to return 0.
-	 */
-	if (cpufreq_sysfs_create_file(&(global_boost.attr)))
-		pr_warn(PFX "could not register global boost sysfs file\n");
-	else
-		pr_debug("registered global boost sysfs file\n");
+	}
 }
 
 static void __exit acpi_cpufreq_boost_exit(void)
 {
-	cpufreq_sysfs_remove_file(&(global_boost.attr));
-
 	if (msrs) {
 		unregister_cpu_notifier(&boost_nb);
 
@@ -993,12 +966,11 @@ static int __init acpi_cpufreq_init(void)
 			*iter = &cpb;
 	}
 #endif
+	acpi_cpufreq_boost_init();
 
 	ret = cpufreq_register_driver(&acpi_cpufreq_driver);
 	if (ret)
 		free_acpi_perf_data();
-	else
-		acpi_cpufreq_boost_init();
 
 	return ret;
 }
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v11 3/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST
  2013-12-13 16:38 ` [PATCH v11 " Lukasz Majewski
  2013-12-13 16:38   ` [PATCH v11 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
  2013-12-13 16:38   ` [PATCH v11 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
@ 2013-12-13 16:38   ` Lukasz Majewski
  2013-12-13 16:38   ` [PATCH v11 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
                     ` (3 subsequent siblings)
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-13 16:38 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, linux-samsung-soc

For safety reasons new flag - CONFIG_CPU_FREQ_BOOST_SW has been added.
Only after selecting "EXYNOS Frequency Overclocking - Software" Kconfig
option the software managed boost is enabled. It also selects thermal
subsystem to be compiled in. Thermal is necessary for disabling boost
and cooling down the device when overheating detected.

Boost _MUST_NOT_ work without thermal subsystem with properly defined
overheating temperatures.

This option doesn't affect x86's ACPI hardware managed boost support
(i.e. Intel, AMD). In this situation boost management is embedded at
hardware.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v11:
- None

Changes for v10:
- None

Changes for v9:
- None

Changes for v8:
- None

Changes for v7:
- Remove superfluous "default n" definition
- Generic CPU_FREQ_BOOST_SW depends on THERMAL

Changes for v6:
- CPU_FREQ_BOOST_SW [1] is now defined as "invisible" bool option.
- Platform dependent ARM_EXYNOS_CPU_FREQ_BOOST_SW config option has been
  added. It depends on ARM_EXYNOS_CPUFREQ options and selects
  EXYNOS_THERMAL with the main boost config [1].

Changes for v5:
- New patch

 drivers/cpufreq/Kconfig     |    4 ++++
 drivers/cpufreq/Kconfig.arm |   15 +++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
index 38093e2..c8818c1 100644
--- a/drivers/cpufreq/Kconfig
+++ b/drivers/cpufreq/Kconfig
@@ -20,6 +20,10 @@ if CPU_FREQ
 config CPU_FREQ_GOV_COMMON
 	bool
 
+config CPU_FREQ_BOOST_SW
+	bool
+	depends on THERMAL
+
 config CPU_FREQ_STAT
 	tristate "CPU frequency translation statistics"
 	default y
diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm
index ce52ed9..25599d6 100644
--- a/drivers/cpufreq/Kconfig.arm
+++ b/drivers/cpufreq/Kconfig.arm
@@ -64,6 +64,21 @@ config ARM_EXYNOS5440_CPUFREQ
 
 	  If in doubt, say N.
 
+config ARM_EXYNOS_CPU_FREQ_BOOST_SW
+	bool "EXYNOS Frequency Overclocking - Software"
+	depends on ARM_EXYNOS_CPUFREQ
+	select CPU_FREQ_BOOST_SW
+	select EXYNOS_THERMAL
+	help
+	  This driver supports software managed overclocking (BOOST).
+	  It allows usage of special frequencies for Samsung Exynos
+	  processors if thermal conditions are appropriate.
+
+	  It reguires, for safe operation, thermal framework with properly
+	  defined trip points.
+
+	  If in doubt, say N.
+
 config ARM_HIGHBANK_CPUFREQ
 	tristate "Calxeda Highbank-based"
 	depends on ARCH_HIGHBANK
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v11 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework
  2013-12-13 16:38 ` [PATCH v11 " Lukasz Majewski
                     ` (2 preceding siblings ...)
  2013-12-13 16:38   ` [PATCH v11 3/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
@ 2013-12-13 16:38   ` Lukasz Majewski
  2013-12-13 16:38   ` [PATCH v11 5/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
                     ` (2 subsequent siblings)
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-13 16:38 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, linux-samsung-soc

The cpufreq_driver's boost_supported flag is true only when boost
support is explicitly enabled. Boost related attributes are exported only
under the same condition.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v11:
- None

Changes for v10:
- None

Changes for v9:
- The exynos_cpufreq_attr[] has been replaced by generic_cpufreq_attr[],
  therefore the cpufreq_freq_attr_scaling_boost_freqs is now added at
  freq_table.c file.

Changes for v8:
- None

Changes for v7:
- Replace CONFIG_CPU_FREQ_BOOST_SW with CONFIG_ARM_EXYNOS_CPU_FREQ_BOOST_SW
- Move boost_supported initialization to struct cpufreq_driver exynos_driver

Changes for v6:
- Replace exynos_driver.boost_supported = 1 to = true
- Protect boost attributes export with CONFIG_CPU_FREQ_BOOST_SW

Changes for v5:
- None

Changes for v4:
- None

Changes for v3:
- Remove low level boost code
- Move boost management code to cpufreq core code
- Use boost_supported flag to indicate if driver supports over clocking

Changes for v2:
- Removal of struct cpufreq_boost
- Removal of the CONFIG_CPU_FREQ_BOOST flag
- low_level_boost with valid address when boost is supported

 drivers/cpufreq/exynos-cpufreq.c |    3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/cpufreq/exynos-cpufreq.c b/drivers/cpufreq/exynos-cpufreq.c
index f3c2287..3cd6d2e 100644
--- a/drivers/cpufreq/exynos-cpufreq.c
+++ b/drivers/cpufreq/exynos-cpufreq.c
@@ -226,6 +226,9 @@ static struct cpufreq_driver exynos_driver = {
 	.exit		= cpufreq_generic_exit,
 	.name		= "exynos_cpufreq",
 	.attr		= cpufreq_generic_attr,
+#ifdef CONFIG_ARM_EXYNOS_CPU_FREQ_BOOST_SW
+	.boost_supported = true,
+#endif
 #ifdef CONFIG_PM
 	.suspend	= exynos_cpufreq_suspend,
 	.resume		= exynos_cpufreq_resume,
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v11 5/7] Documentation:cpufreq:boost: Update BOOST documentation
  2013-12-13 16:38 ` [PATCH v11 " Lukasz Majewski
                     ` (3 preceding siblings ...)
  2013-12-13 16:38   ` [PATCH v11 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
@ 2013-12-13 16:38   ` Lukasz Majewski
  2013-12-13 16:38   ` [PATCH v11 6/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
  2013-12-13 16:38   ` [PATCH v11 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412) Lukasz Majewski
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-13 16:38 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, linux-samsung-soc

Since the support for software and hardware controlled boosting has been
added, the corresponding Documentation entry had been updated.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v11:
- None

Changes for v10:
- None

Changes for v9:
- None

Changes for v8:
- None

Changes for v7:
- None

Changes for v6:
- None

Changes for v5:
- New patch

 Documentation/cpu-freq/boost.txt |   26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/Documentation/cpu-freq/boost.txt b/Documentation/cpu-freq/boost.txt
index 9b4edfc..dd62e13 100644
--- a/Documentation/cpu-freq/boost.txt
+++ b/Documentation/cpu-freq/boost.txt
@@ -17,8 +17,8 @@ Introduction
 Some CPUs support a functionality to raise the operating frequency of
 some cores in a multi-core package if certain conditions apply, mostly
 if the whole chip is not fully utilized and below it's intended thermal
-budget. This is done without operating system control by a combination
-of hardware and firmware.
+budget. The decision about boost disable/enable is made either at hardware
+(e.g. x86) or software (e.g ARM).
 On Intel CPUs this is called "Turbo Boost", AMD calls it "Turbo-Core",
 in technical documentation "Core performance boost". In Linux we use
 the term "boost" for convenience.
@@ -48,24 +48,24 @@ be desirable:
 User controlled switch
 ----------------------
 
-To allow the user to toggle the boosting functionality, the acpi-cpufreq
-driver exports a sysfs knob to disable it. There is a file:
+To allow the user to toggle the boosting functionality, the cpufreq core
+driver exports a sysfs knob to enable or disable it. There is a file:
 /sys/devices/system/cpu/cpufreq/boost
 which can either read "0" (boosting disabled) or "1" (boosting enabled).
-Reading the file is always supported, even if the processor does not
-support boosting. In this case the file will be read-only and always
-reads as "0". Explicitly changing the permissions and writing to that
-file anyway will return EINVAL.
+The file is exported only when cpufreq driver supports boosting.
+Explicitly changing the permissions and writing to that file anyway will
+return EINVAL.
 
 On supported CPUs one can write either a "0" or a "1" into this file.
 This will either disable the boost functionality on all cores in the
-whole system (0) or will allow the hardware to boost at will (1).
+whole system (0) or will allow the software or hardware to boost at will
+(1).
 
 Writing a "1" does not explicitly boost the system, but just allows the
-CPU (and the firmware) to boost at their discretion. Some implementations
-take external factors like the chip's temperature into account, so
-boosting once does not necessarily mean that it will occur every time
-even using the exact same software setup.
+CPU to boost at their discretion. Some implementations take external
+factors like the chip's temperature into account, so boosting once does
+not necessarily mean that it will occur every time even using the exact
+same software setup.
 
 
 AMD legacy cpb switch
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v11 6/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ
  2013-12-13 16:38 ` [PATCH v11 " Lukasz Majewski
                     ` (4 preceding siblings ...)
  2013-12-13 16:38   ` [PATCH v11 5/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
@ 2013-12-13 16:38   ` Lukasz Majewski
  2013-12-13 16:38   ` [PATCH v11 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412) Lukasz Majewski
  6 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-13 16:38 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, linux-samsung-soc

Special driver data flag (CPUFREQ_BOOST_FREQ) has been added to indicate
frequency, which can be only enabled for BOOST mode.
This frequency shall be used only for limited time, since it might cause
target device to overheat.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v11:
- None

Changes for v10:
- None

Changes for v9:
- None

Changes for v8:
- None

Changes for v7:
- None

Changes for v6:
- New patch

 drivers/cpufreq/exynos4x12-cpufreq.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/cpufreq/exynos4x12-cpufreq.c b/drivers/cpufreq/exynos4x12-cpufreq.c
index efad5e6..77ae129 100644
--- a/drivers/cpufreq/exynos4x12-cpufreq.c
+++ b/drivers/cpufreq/exynos4x12-cpufreq.c
@@ -32,7 +32,7 @@ static unsigned int exynos4x12_volt_table[] = {
 };
 
 static struct cpufreq_frequency_table exynos4x12_freq_table[] = {
-	{L0, CPUFREQ_ENTRY_INVALID},
+	{CPUFREQ_BOOST_FREQ, 1500 * 1000},
 	{L1, 1400 * 1000},
 	{L2, 1300 * 1000},
 	{L3, 1200 * 1000},
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v11 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412)
  2013-12-13 16:38 ` [PATCH v11 " Lukasz Majewski
                     ` (5 preceding siblings ...)
  2013-12-13 16:38   ` [PATCH v11 6/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
@ 2013-12-13 16:38   ` Lukasz Majewski
  2013-12-19 14:50       ` Eduardo Valentin
  6 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-13 16:38 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, linux-samsung-soc

This patch provides auto disable/enable operation for boost. It uses already
present thermal infrastructure to provide boost hysteresis.
The TMU data has been modified to work properly with or without boost.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

---
Changes for v11:
    - Use only one thermal data set
    - Adjust Exynos4412 thermal data to work with or without BOOST

Changes for v10:
    - Remove boost related code from thermal_core.c
    - Use already present thermal infrastructure to provide thermal hysteresis
    - Introduce special set of TMU data for BOOST

Changes for v9:
    - None

Changes for v8:
    - Move cpufreq_boost_* stub functions definition (needed when cpufreq
      is not compiled in) to cpufreq.h at cpufreq core support commit

Changes for v7:
    - None

Changes for v6:
    - Disable boost only when supported and enabled
    - Protect boost related thermal_zone_device struct fields with mutex
    - Evaluate temperature trend during boost enable decision
    - Create separate methods to handle boost enable/disable
      (thermal_boost_{enable|disable}) operations
    - Boost is disabled at any trip point passage (not only the non critical one)
    - Add stub definitions for cpufreq boost functions used when
      CONFIG_CPU_FREQ is NOT defined.

Changes for v5:
    - Move boost disable code from cpu_cooling.c to thermal_core.c
      (to handle_non_critical_trips)
    - Extent struct thermal_zone_device by adding overheated bool flag
    - Implement auto enable of boost after device cools down
    - Introduce boost_polling flag, which indicates if thermal uses it's predefined
      pool delay or has woken up thermal workqueue only to wait until device
      cools down.

Changes for v4:
    - New patch

 drivers/thermal/samsung/exynos_tmu_data.c |   12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/thermal/samsung/exynos_tmu_data.c b/drivers/thermal/samsung/exynos_tmu_data.c
index 073c292..476b768 100644
--- a/drivers/thermal/samsung/exynos_tmu_data.c
+++ b/drivers/thermal/samsung/exynos_tmu_data.c
@@ -131,8 +131,8 @@ static const struct exynos_tmu_registers exynos4412_tmu_registers = {
 
 #define EXYNOS4412_TMU_DATA \
 	.threshold_falling = 10, \
-	.trigger_levels[0] = 85, \
-	.trigger_levels[1] = 103, \
+	.trigger_levels[0] = 70, \
+	.trigger_levels[1] = 95, \
 	.trigger_levels[2] = 110, \
 	.trigger_levels[3] = 120, \
 	.trigger_enable[0] = true, \
@@ -155,12 +155,12 @@ static const struct exynos_tmu_registers exynos4412_tmu_registers = {
 	.second_point_trim = 85, \
 	.default_temp_offset = 50, \
 	.freq_tab[0] = { \
-		.freq_clip_max = 800 * 1000, \
-		.temp_level = 85, \
+		.freq_clip_max = 1400 * 1000, \
+		.temp_level = 70, \
 	}, \
 	.freq_tab[1] = { \
-		.freq_clip_max = 200 * 1000, \
-		.temp_level = 103, \
+		.freq_clip_max = 400 * 1000, \
+		.temp_level = 95, \
 	}, \
 	.freq_tab_count = 2, \
 	.registers = &exynos4412_tmu_registers, \
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* Re: [PATCH v11 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412)
  2013-12-13 16:38   ` [PATCH v11 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412) Lukasz Majewski
@ 2013-12-19 14:50       ` Eduardo Valentin
  0 siblings, 0 replies; 329+ messages in thread
From: Eduardo Valentin @ 2013-12-19 14:50 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin,
	cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	linux-kernel, Bartlomiej Zolnierkiewicz, Myungjoo Ham,
	durgadoss.r, linux-samsung-soc

[-- Attachment #1: Type: text/plain, Size: 3658 bytes --]

On 13-12-2013 12:38, Lukasz Majewski wrote:
> This patch provides auto disable/enable operation for boost. It uses already
> present thermal infrastructure to provide boost hysteresis.
> The TMU data has been modified to work properly with or without boost.
> 
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

Acked-by: Eduardo Valentin <eduardo.valentin@ti.com>

Looks better to me now. You might consider refactoring this driver to be
frequency independent, if possible. But that is a different subject
other than this patch.

> 
> ---
> Changes for v11:
>     - Use only one thermal data set
>     - Adjust Exynos4412 thermal data to work with or without BOOST
> 
> Changes for v10:
>     - Remove boost related code from thermal_core.c
>     - Use already present thermal infrastructure to provide thermal hysteresis
>     - Introduce special set of TMU data for BOOST
> 
> Changes for v9:
>     - None
> 
> Changes for v8:
>     - Move cpufreq_boost_* stub functions definition (needed when cpufreq
>       is not compiled in) to cpufreq.h at cpufreq core support commit
> 
> Changes for v7:
>     - None
> 
> Changes for v6:
>     - Disable boost only when supported and enabled
>     - Protect boost related thermal_zone_device struct fields with mutex
>     - Evaluate temperature trend during boost enable decision
>     - Create separate methods to handle boost enable/disable
>       (thermal_boost_{enable|disable}) operations
>     - Boost is disabled at any trip point passage (not only the non critical one)
>     - Add stub definitions for cpufreq boost functions used when
>       CONFIG_CPU_FREQ is NOT defined.
> 
> Changes for v5:
>     - Move boost disable code from cpu_cooling.c to thermal_core.c
>       (to handle_non_critical_trips)
>     - Extent struct thermal_zone_device by adding overheated bool flag
>     - Implement auto enable of boost after device cools down
>     - Introduce boost_polling flag, which indicates if thermal uses it's predefined
>       pool delay or has woken up thermal workqueue only to wait until device
>       cools down.
> 
> Changes for v4:
>     - New patch
> 
>  drivers/thermal/samsung/exynos_tmu_data.c |   12 ++++++------
>  1 file changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/thermal/samsung/exynos_tmu_data.c b/drivers/thermal/samsung/exynos_tmu_data.c
> index 073c292..476b768 100644
> --- a/drivers/thermal/samsung/exynos_tmu_data.c
> +++ b/drivers/thermal/samsung/exynos_tmu_data.c
> @@ -131,8 +131,8 @@ static const struct exynos_tmu_registers exynos4412_tmu_registers = {
>  
>  #define EXYNOS4412_TMU_DATA \
>  	.threshold_falling = 10, \
> -	.trigger_levels[0] = 85, \
> -	.trigger_levels[1] = 103, \
> +	.trigger_levels[0] = 70, \
> +	.trigger_levels[1] = 95, \
>  	.trigger_levels[2] = 110, \
>  	.trigger_levels[3] = 120, \
>  	.trigger_enable[0] = true, \
> @@ -155,12 +155,12 @@ static const struct exynos_tmu_registers exynos4412_tmu_registers = {
>  	.second_point_trim = 85, \
>  	.default_temp_offset = 50, \
>  	.freq_tab[0] = { \
> -		.freq_clip_max = 800 * 1000, \
> -		.temp_level = 85, \
> +		.freq_clip_max = 1400 * 1000, \
> +		.temp_level = 70, \
>  	}, \
>  	.freq_tab[1] = { \
> -		.freq_clip_max = 200 * 1000, \
> -		.temp_level = 103, \
> +		.freq_clip_max = 400 * 1000, \
> +		.temp_level = 95, \
>  	}, \
>  	.freq_tab_count = 2, \
>  	.registers = &exynos4412_tmu_registers, \
> 


-- 
You have got to be excited about what you are doing. (L. Lamport)

Eduardo Valentin


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 295 bytes --]

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v11 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412)
@ 2013-12-19 14:50       ` Eduardo Valentin
  0 siblings, 0 replies; 329+ messages in thread
From: Eduardo Valentin @ 2013-12-19 14:50 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Viresh Kumar, Rafael J. Wysocki, Zhang Rui, Eduardo Valentin,
	cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	linux-kernel, Bartlomiej Zolnierkiewicz, Myungjoo Ham,
	durgadoss.r, linux-samsung-soc

[-- Attachment #1: Type: text/plain, Size: 3658 bytes --]

On 13-12-2013 12:38, Lukasz Majewski wrote:
> This patch provides auto disable/enable operation for boost. It uses already
> present thermal infrastructure to provide boost hysteresis.
> The TMU data has been modified to work properly with or without boost.
> 
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>

Acked-by: Eduardo Valentin <eduardo.valentin@ti.com>

Looks better to me now. You might consider refactoring this driver to be
frequency independent, if possible. But that is a different subject
other than this patch.

> 
> ---
> Changes for v11:
>     - Use only one thermal data set
>     - Adjust Exynos4412 thermal data to work with or without BOOST
> 
> Changes for v10:
>     - Remove boost related code from thermal_core.c
>     - Use already present thermal infrastructure to provide thermal hysteresis
>     - Introduce special set of TMU data for BOOST
> 
> Changes for v9:
>     - None
> 
> Changes for v8:
>     - Move cpufreq_boost_* stub functions definition (needed when cpufreq
>       is not compiled in) to cpufreq.h at cpufreq core support commit
> 
> Changes for v7:
>     - None
> 
> Changes for v6:
>     - Disable boost only when supported and enabled
>     - Protect boost related thermal_zone_device struct fields with mutex
>     - Evaluate temperature trend during boost enable decision
>     - Create separate methods to handle boost enable/disable
>       (thermal_boost_{enable|disable}) operations
>     - Boost is disabled at any trip point passage (not only the non critical one)
>     - Add stub definitions for cpufreq boost functions used when
>       CONFIG_CPU_FREQ is NOT defined.
> 
> Changes for v5:
>     - Move boost disable code from cpu_cooling.c to thermal_core.c
>       (to handle_non_critical_trips)
>     - Extent struct thermal_zone_device by adding overheated bool flag
>     - Implement auto enable of boost after device cools down
>     - Introduce boost_polling flag, which indicates if thermal uses it's predefined
>       pool delay or has woken up thermal workqueue only to wait until device
>       cools down.
> 
> Changes for v4:
>     - New patch
> 
>  drivers/thermal/samsung/exynos_tmu_data.c |   12 ++++++------
>  1 file changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/thermal/samsung/exynos_tmu_data.c b/drivers/thermal/samsung/exynos_tmu_data.c
> index 073c292..476b768 100644
> --- a/drivers/thermal/samsung/exynos_tmu_data.c
> +++ b/drivers/thermal/samsung/exynos_tmu_data.c
> @@ -131,8 +131,8 @@ static const struct exynos_tmu_registers exynos4412_tmu_registers = {
>  
>  #define EXYNOS4412_TMU_DATA \
>  	.threshold_falling = 10, \
> -	.trigger_levels[0] = 85, \
> -	.trigger_levels[1] = 103, \
> +	.trigger_levels[0] = 70, \
> +	.trigger_levels[1] = 95, \
>  	.trigger_levels[2] = 110, \
>  	.trigger_levels[3] = 120, \
>  	.trigger_enable[0] = true, \
> @@ -155,12 +155,12 @@ static const struct exynos_tmu_registers exynos4412_tmu_registers = {
>  	.second_point_trim = 85, \
>  	.default_temp_offset = 50, \
>  	.freq_tab[0] = { \
> -		.freq_clip_max = 800 * 1000, \
> -		.temp_level = 85, \
> +		.freq_clip_max = 1400 * 1000, \
> +		.temp_level = 70, \
>  	}, \
>  	.freq_tab[1] = { \
> -		.freq_clip_max = 200 * 1000, \
> -		.temp_level = 103, \
> +		.freq_clip_max = 400 * 1000, \
> +		.temp_level = 95, \
>  	}, \
>  	.freq_tab_count = 2, \
>  	.registers = &exynos4412_tmu_registers, \
> 


-- 
You have got to be excited about what you are doing. (L. Lamport)

Eduardo Valentin


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 295 bytes --]

^ permalink raw reply	[flat|nested] 329+ messages in thread

* [PATCH v12 0/7] cpufreq:boost: CPU Boost mode support
  2013-06-06  7:07 [PATCH 0/5] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                   ` (16 preceding siblings ...)
  2013-12-13 16:38 ` [PATCH v11 " Lukasz Majewski
@ 2013-12-20 14:24 ` Lukasz Majewski
  2013-12-20 14:24   ` [PATCH v12 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
                     ` (7 more replies)
  17 siblings, 8 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-20 14:24 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, Zhang Rui, linux-samsung-soc

This patch series introduces support for CPU overclocking technique
called Boost.

It is a follow up of a LAB governor proposal. Boost is a LAB component:
http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq

Boost unifies hardware based solution (e.g. Intel Nehalem) with
software oriented one (like the one done at Exynos).
For this reason cpufreq/freq_table code has been reorganized to include
common code.

Important design decisions:
- Boost related code is compiled-in unconditionally to cpufreq core and
  disabled by default. The cpufreq_driver is responsibile for setting
  boost_supported flag and providing set_boost callback(if HW support
  is needed). For software managed boost, special Kconfig flag -
  CONFIG_CPU_FREQ_BOOST_SW has been defined. It will be selected only
  when a target platform has thermal framework properly configured.

- struct cpufreq_driver has been extended with boost related fields:
        -- boost_supported - when driver supports boosting
        -- boost_enabled - boost state
        -- set_boost - callback to function, which is necessary to
           enable/disable boost

- Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost) is visible
  _only_ when cpufreq driver supports Boost.

- No special spin_lock for Boost was created. The one from cpufreq core
  was reused.

- The Boost code doesn't rely on any policy. When boost state is changed,
  then the policy list is iterated and proper adjustements are done.

- To improve safety level, the thermal framework is also extended to disable
  software boosting, when thermal trip point is reached. After cooling down
  the boost can be enabled again. This emulates behaviour similar to HW
  managed boost (like x86)

Tested at HW:
       Exynos 4412 3.13-rc4 Linux
       Intel Core i7-3770 3.13-rc4 Linux

Above patches were posted on top of kernel_pm/bleeding-edge
(SHA1: bd0f3a5d9dce48a917ce1f1047534d79c725149)

Lukasz Majewski (7):
  cpufreq: Add boost frequency support in core
  cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common
    boost solution
  cpufreq:boost:Kconfig: Provide support for software managed BOOST
  cpufreq:exynos:Extend Exynos cpufreq driver to support boost
    framework
  Documentation:cpufreq:boost: Update BOOST documentation
  cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ
  thermal:exynos:boost: Automatic enable/disable of BOOST feature (at
    Exynos4412)

 Documentation/cpu-freq/boost.txt          |   26 +++----
 drivers/cpufreq/Kconfig                   |    4 +
 drivers/cpufreq/Kconfig.arm               |   15 ++++
 drivers/cpufreq/acpi-cpufreq.c            |   86 +++++++--------------
 drivers/cpufreq/cpufreq.c                 |  118 ++++++++++++++++++++++++++++-
 drivers/cpufreq/exynos-cpufreq.c          |    3 +
 drivers/cpufreq/exynos4x12-cpufreq.c      |    2 +-
 drivers/cpufreq/freq_table.c              |   56 ++++++++++++--
 drivers/thermal/samsung/exynos_tmu_data.c |   12 +--
 include/linux/cpufreq.h                   |   24 ++++++
 10 files changed, 261 insertions(+), 85 deletions(-)

-- 
1.7.10.4


^ permalink raw reply	[flat|nested] 329+ messages in thread

* [PATCH v12 1/7] cpufreq: Add boost frequency support in core
  2013-12-20 14:24 ` [PATCH v12 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
@ 2013-12-20 14:24   ` Lukasz Majewski
  2013-12-20 14:24   ` [PATCH v12 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
                     ` (6 subsequent siblings)
  7 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-20 14:24 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, Zhang Rui, linux-samsung-soc

This commit adds boost frequency support in cpufreq core (Hardware &
Software). Some SoCs (like Exynos4 - e.g. 4x12) allow setting frequency
above its normal operation limits. Such mode shall be only used for a
short time.

Overclocking (boost) support is essentially provided by platform
dependent cpufreq driver.

This commit unifies support for SW and HW (Intel) overclocking solutions
in the core cpufreq driver. Previously the "boost" sysfs attribute was
defined at acpi driver code. By default boost is disabled. One global
attribute is available at: /sys/devices/system/cpu/cpufreq/boost.

It only shows up when cpufreq driver supports overclocking.
Under the hood frequencies dedicated for boosting are marked with a
special flag (CPUFREQ_BOOST_FREQ) at driver's frequency table.
It is the user's concern to enable/disable overclocking with a proper call
to sysfs.

The cpufreq_boost_trigger_state() function is defined non static on purpose.
It is used later with thermal subsystem to provide automatic enable/disable
of the BOOST feature.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v12:
- None

Changes for v11:
- None

Changes for v10:
- None

Changes for v9:
- Add cpufreq_freq_attr_scaling_boost_freqs to *cpufreq_generic_attr table
- Introduce CONFIG_CPU_FREQ_BOOST_SW generic config flag to show BOOST
  frequencies only when cpufreq driver supports boost

Changes for v8:
- Correction of error message at cpufreq_boost_trigger_state() function
- Rewrite the cpufreq_boost_set_sw() function to print error message and
  break the loop when policy adjustment fails

Changes for v7:
- Properly change cpufreq_driver->boost_enabled when set_boost() fails
  (=0 to =!state)
- Add likely() around cpufreq_driver
- Remove parenthesis around boost.attr

Changes for v6:
- Remove sysfs boost attribute when subsys_iterface_unregister() fails
- Move global boost_enabled variable from cpufreq.c to platform dependent
  struct cpufreq_driver
- pr_err() message is also printed when boost disable fails
- Call __cpufreq_governor() to force recalculation of next frequency when
  boost is triggered. It is needed with i.e. performance class of governors
- Change cpufreq_boost_enable_sw() -> cpufreq_boost_set_sw()
- Rename .enable_boost function pointer to .set_boost

Changes for v5:
- Rename cpufreq_boost_trigger_state_sw() to cpufreq_boost_enable_sw()
- Extent cpufreq_register_driver() to check if cpufreq driver provided
  boost_enable callback. If not provided, then use cpufreq_boost_enable_sw()
- Use single call to cpufreq_driver->enable_boost() with cpufreq driver
  provided callback or default SW boost enable routine
- Move pr_debug call to store_boost() from cpufreq_boost_trigger_state()
- Change the user_policy.max value when SW boost is toggled. It is necessary
  for proper operation of e.g. thermal subsystem.
- Add check if cpufreq_driver pointer is not NULL at
  cpufreq_boost_supported() routine
- Add EXPORT_SYMBOL_GPL for cpufreq_boost_supported() and
  cpufreq_boost_enabled()
- Remove extra check for cpufreq_boost_supported() at
  cpufreq_freq_table_cpuinfo()
- Explanation of show boost logic at show_available_freqs()
- Add cpufreq_set_boost_enabled() method to set initial value of boost_enabled
  global flag

Changes for v4:
- Remove boost parameter from cpufreq_frequency_table_cpuinfo() function
- Introduce cpufreq_boost_supported() method
- Use of cpufreq_boost_supported() and cpufreq_boost_enabled() to decide
  if frequency shall be skipped
- Rename set_boost_freq() to enable_boost()
- cpufreq_attr_available_freq() moved to freq_table.c
- Use policy list to get access to cpufreq policies
- Rename global boost flag (cpufreq_boost_enabled -> boost_enabled)
- pr_err corrected ( %sable)
- Remove sanity check at cpufreq_boost_trigger_state() entrance [to test if
  boost is supported]
- Use either HW (boost_enable) callback or SW managed boost
- Introduce new cpufreq_boost_trigger_state_sw() method to handle boost
  at SW.
- Protect boost_enabled manipulation with lock.

Changes for v3:
- Method for reading boost status
- Removal of cpufreq_frequency_table_max()
- Extent cpufreq_frequency_table_cpuinfo() to support boost parameter
- boost_supported flag added to cpufreq_driver struct
- "boost" sysfs attribute control flag removed
- One global flag describing state of the boost defined at cpufreq core
- Rename cpufreq_driver's low_level_boost field to set_boost_freq()
- Usage of cpufreq_sysfs_{remove|add}_file() routines

Changes for v2:
- Removal of cpufreq_boost structure and move its fields to cpufreq_driver
  structure
- Flag to indicate if global boost attribute is already defined
- Extent the pr_{err|debbug} functions to show current function names

 drivers/cpufreq/cpufreq.c    |  118 +++++++++++++++++++++++++++++++++++++++++-
 drivers/cpufreq/freq_table.c |   56 +++++++++++++++++---
 include/linux/cpufreq.h      |   24 +++++++++
 3 files changed, 190 insertions(+), 8 deletions(-)

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 02d534d..33774cc 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -324,6 +324,33 @@ EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
 /*********************************************************************
  *                          SYSFS INTERFACE                          *
  *********************************************************************/
+ssize_t show_boost(struct kobject *kobj,
+				 struct attribute *attr, char *buf)
+{
+	return sprintf(buf, "%d\n", cpufreq_driver->boost_enabled);
+}
+
+static ssize_t store_boost(struct kobject *kobj, struct attribute *attr,
+				  const char *buf, size_t count)
+{
+	int ret, enable;
+
+	ret = sscanf(buf, "%d", &enable);
+	if (ret != 1 || enable < 0 || enable > 1)
+		return -EINVAL;
+
+	if (cpufreq_boost_trigger_state(enable)) {
+		pr_err("%s: Cannot %s BOOST!\n", __func__,
+		       enable ? "enable" : "disable");
+		return -EINVAL;
+	}
+
+	pr_debug("%s: cpufreq BOOST %s\n", __func__,
+		 enable ? "enabled" : "disabled");
+
+	return count;
+}
+define_one_global_rw(boost);
 
 static struct cpufreq_governor *__find_governor(const char *str_governor)
 {
@@ -2106,6 +2133,73 @@ static struct notifier_block __refdata cpufreq_cpu_notifier = {
 };
 
 /*********************************************************************
+ *               BOOST						     *
+ *********************************************************************/
+static int cpufreq_boost_set_sw(int state)
+{
+	struct cpufreq_frequency_table *freq_table;
+	struct cpufreq_policy *policy;
+	int ret = -EINVAL;
+
+	list_for_each_entry(policy, &cpufreq_policy_list, policy_list) {
+		freq_table = cpufreq_frequency_get_table(policy->cpu);
+		if (freq_table) {
+			ret = cpufreq_frequency_table_cpuinfo(policy,
+							freq_table);
+			if (ret) {
+				pr_err("%s: Policy frequency update failed\n",
+				       __func__);
+				break;
+			}
+			policy->user_policy.max = policy->max;
+			__cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
+		}
+	}
+
+	return ret;
+}
+
+int cpufreq_boost_trigger_state(int state)
+{
+	unsigned long flags;
+	int ret = 0;
+
+	if (cpufreq_driver->boost_enabled == state)
+		return 0;
+
+	write_lock_irqsave(&cpufreq_driver_lock, flags);
+	cpufreq_driver->boost_enabled = state;
+	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
+
+	ret = cpufreq_driver->set_boost(state);
+	if (ret) {
+		write_lock_irqsave(&cpufreq_driver_lock, flags);
+		cpufreq_driver->boost_enabled = !state;
+		write_unlock_irqrestore(&cpufreq_driver_lock, flags);
+
+		pr_err("%s: Cannot %s BOOST\n", __func__,
+		       state ? "enable" : "disable");
+	}
+
+	return ret;
+}
+
+int cpufreq_boost_supported(void)
+{
+	if (likely(cpufreq_driver))
+		return cpufreq_driver->boost_supported;
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(cpufreq_boost_supported);
+
+int cpufreq_boost_enabled(void)
+{
+	return cpufreq_driver->boost_enabled;
+}
+EXPORT_SYMBOL_GPL(cpufreq_boost_enabled);
+
+/*********************************************************************
  *               REGISTER / UNREGISTER CPUFREQ DRIVER                *
  *********************************************************************/
 
@@ -2145,9 +2239,25 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 	cpufreq_driver = driver_data;
 	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
 
+	if (cpufreq_boost_supported()) {
+		/*
+		 * Check if driver provides function to enable boost -
+		 * if not, use cpufreq_boost_set_sw as default
+		 */
+		if (!cpufreq_driver->set_boost)
+			cpufreq_driver->set_boost = cpufreq_boost_set_sw;
+
+		ret = cpufreq_sysfs_create_file(&boost.attr);
+		if (ret) {
+			pr_err("%s: cannot register global BOOST sysfs file\n",
+				__func__);
+			goto err_null_driver;
+		}
+	}
+
 	ret = subsys_interface_register(&cpufreq_interface);
 	if (ret)
-		goto err_null_driver;
+		goto err_boost_unreg;
 
 	if (!(cpufreq_driver->flags & CPUFREQ_STICKY)) {
 		int i;
@@ -2174,6 +2284,9 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 	return 0;
 err_if_unreg:
 	subsys_interface_unregister(&cpufreq_interface);
+err_boost_unreg:
+	if (cpufreq_boost_supported())
+		cpufreq_sysfs_remove_file(&boost.attr);
 err_null_driver:
 	write_lock_irqsave(&cpufreq_driver_lock, flags);
 	cpufreq_driver = NULL;
@@ -2200,6 +2313,9 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
 	pr_debug("unregistering driver %s\n", driver->name);
 
 	subsys_interface_unregister(&cpufreq_interface);
+	if (cpufreq_boost_supported())
+		cpufreq_sysfs_remove_file(&boost.attr);
+
 	unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
 
 	down_write(&cpufreq_rwsem);
diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c
index 3458d27..776e88a 100644
--- a/drivers/cpufreq/freq_table.c
+++ b/drivers/cpufreq/freq_table.c
@@ -32,6 +32,10 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
 
 			continue;
 		}
+		if (!cpufreq_boost_enabled()
+		    && table[i].driver_data == CPUFREQ_BOOST_FREQ)
+			continue;
+
 		pr_debug("table entry %u: %u kHz, %u driver_data\n",
 					i, freq, table[i].driver_data);
 		if (freq < min_freq)
@@ -182,7 +186,8 @@ static DEFINE_PER_CPU(struct cpufreq_frequency_table *, cpufreq_show_table);
 /**
  * show_available_freqs - show available frequencies for the specified CPU
  */
-static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
+static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf,
+				    bool show_boost)
 {
 	unsigned int i = 0;
 	unsigned int cpu = policy->cpu;
@@ -197,6 +202,20 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
 	for (i = 0; (table[i].frequency != CPUFREQ_TABLE_END); i++) {
 		if (table[i].frequency == CPUFREQ_ENTRY_INVALID)
 			continue;
+		/*
+		 * show_boost = true and driver_data = BOOST freq
+		 * display BOOST freqs
+		 *
+		 * show_boost = false and driver_data = BOOST freq
+		 * show_boost = true and driver_data != BOOST freq
+		 * continue - do not display anything
+		 *
+		 * show_boost = false and driver_data != BOOST freq
+		 * display NON BOOST freqs
+		 */
+		if (show_boost ^ (table[i].driver_data == CPUFREQ_BOOST_FREQ))
+			continue;
+
 		count += sprintf(&buf[count], "%d ", table[i].frequency);
 	}
 	count += sprintf(&buf[count], "\n");
@@ -205,16 +224,39 @@ static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf)
 
 }
 
-struct freq_attr cpufreq_freq_attr_scaling_available_freqs = {
-	.attr = { .name = "scaling_available_frequencies",
-		  .mode = 0444,
-		},
-	.show = show_available_freqs,
-};
+#define cpufreq_attr_available_freq(_name)	  \
+struct freq_attr cpufreq_freq_attr_##_name##_freqs =     \
+__ATTR_RO(_name##_frequencies)
+
+/**
+ * show_scaling_available_frequencies - show available normal frequencies for
+ * the specified CPU
+ */
+static ssize_t scaling_available_frequencies_show(struct cpufreq_policy *policy,
+						  char *buf)
+{
+	return show_available_freqs(policy, buf, false);
+}
+cpufreq_attr_available_freq(scaling_available);
 EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_available_freqs);
 
+/**
+ * show_available_boost_freqs - show available boost frequencies for
+ * the specified CPU
+ */
+static ssize_t scaling_boost_frequencies_show(struct cpufreq_policy *policy,
+					      char *buf)
+{
+	return show_available_freqs(policy, buf, true);
+}
+cpufreq_attr_available_freq(scaling_boost);
+EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_boost_freqs);
+
 struct freq_attr *cpufreq_generic_attr[] = {
 	&cpufreq_freq_attr_scaling_available_freqs,
+#ifdef CONFIG_CPU_FREQ_BOOST_SW
+	&cpufreq_freq_attr_scaling_boost_freqs,
+#endif
 	NULL,
 };
 EXPORT_SYMBOL_GPL(cpufreq_generic_attr);
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index dc196bb..a0cbb7c 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -225,6 +225,11 @@ struct cpufreq_driver {
 	int	(*suspend)	(struct cpufreq_policy *policy);
 	int	(*resume)	(struct cpufreq_policy *policy);
 	struct freq_attr	**attr;
+
+	/* platform specific boost support code */
+	bool                    boost_supported;
+	bool                    boost_enabled;
+	int     (*set_boost)    (int state);
 };
 
 /* flags */
@@ -420,6 +425,7 @@ extern struct cpufreq_governor cpufreq_gov_conservative;
 
 #define CPUFREQ_ENTRY_INVALID ~0
 #define CPUFREQ_TABLE_END     ~1
+#define CPUFREQ_BOOST_FREQ    ~2
 
 struct cpufreq_frequency_table {
 	unsigned int	driver_data; /* driver specific data, not used by core */
@@ -443,6 +449,24 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
 void cpufreq_frequency_table_update_policy_cpu(struct cpufreq_policy *policy);
 ssize_t cpufreq_show_cpus(const struct cpumask *mask, char *buf);
 
+#ifdef CONFIG_CPU_FREQ
+int cpufreq_boost_trigger_state(int state);
+int cpufreq_boost_supported(void);
+int cpufreq_boost_enabled(void);
+#else
+static inline int cpufreq_boost_trigger_state(int state)
+{
+	return 0;
+}
+static inline int cpufreq_boost_supported(void)
+{
+	return 0;
+}
+static inline int cpufreq_boost_enabled(void)
+{
+	return 0;
+}
+#endif
 /* the following funtion is for cpufreq core use only */
 struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu);
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v12 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution
  2013-12-20 14:24 ` [PATCH v12 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
  2013-12-20 14:24   ` [PATCH v12 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
@ 2013-12-20 14:24   ` Lukasz Majewski
  2013-12-20 14:24   ` [PATCH v12 3/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
                     ` (5 subsequent siblings)
  7 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-20 14:24 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, Zhang Rui, linux-samsung-soc

The Intel's hardware based boost solution driver has been changed to cooperate with
common cpufreq boost framework.

The global sysfs boost attribute entry code (/sys/devices/system/cpu/cpufreq/boost)
has been moved to a core cpufreq code. This attribute is now only visible,
when cpufreq driver supports it.

The _store_boost() function has been redesigned to be used as set_boost
callback.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v12:
- None

Changes for v11:
- None

Changes for v10:
- None

Changes for v9:
- None

Changes for v8:
- None

Changes for v7:
- Remove superfluous acpi_cpufreq_driver.boost_supported = false at
  acpi_cpufreq_boost_init()

Changes for v6:
- Perform acpi_cpufreq_boost_init initialization before cpufreq_driver
  registration
- Compile store_boost() only when CONFIG_X86_ACPI_CPUFREQ_CPB defined
- Use boost_enabled flag defined at acpi_cpufreq_driver to store information
  about boost state
- Instead of using cpufreq_set_boost_enabled(), modify the boost_enable in
  the acpi driver code

Changes for v5:
- Remove acpi-cpufreq's boost_enabled global flag and reuse one defined at
  cpufreq core

Changes for v4:
- add _store_boost to acpi_cpufreq_driver structure

Changes for v3:
- Bring back boost_enabled as a global flag
- Move boost_supported to cpufreq_driver structure

Changes for v2:
- Replace boost_enabled and boost_supported global flags with proper entries
  at struct cpufreq_driver.
- Removal of struct cpufreq_boost

 drivers/cpufreq/acpi-cpufreq.c |   86 ++++++++++++++--------------------------
 1 file changed, 29 insertions(+), 57 deletions(-)

diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c
index caf41eb..79e5608 100644
--- a/drivers/cpufreq/acpi-cpufreq.c
+++ b/drivers/cpufreq/acpi-cpufreq.c
@@ -80,7 +80,6 @@ static struct acpi_processor_performance __percpu *acpi_perf_data;
 static struct cpufreq_driver acpi_cpufreq_driver;
 
 static unsigned int acpi_pstate_strict;
-static bool boost_enabled, boost_supported;
 static struct msr __percpu *msrs;
 
 static bool boost_state(unsigned int cpu)
@@ -133,49 +132,16 @@ static void boost_set_msrs(bool enable, const struct cpumask *cpumask)
 	wrmsr_on_cpus(cpumask, msr_addr, msrs);
 }
 
-static ssize_t _store_boost(const char *buf, size_t count)
+static int _store_boost(int val)
 {
-	int ret;
-	unsigned long val = 0;
-
-	if (!boost_supported)
-		return -EINVAL;
-
-	ret = kstrtoul(buf, 10, &val);
-	if (ret || (val > 1))
-		return -EINVAL;
-
-	if ((val && boost_enabled) || (!val && !boost_enabled))
-		return count;
-
 	get_online_cpus();
-
 	boost_set_msrs(val, cpu_online_mask);
-
 	put_online_cpus();
-
-	boost_enabled = val;
 	pr_debug("Core Boosting %sabled.\n", val ? "en" : "dis");
 
-	return count;
-}
-
-static ssize_t store_global_boost(struct kobject *kobj, struct attribute *attr,
-				  const char *buf, size_t count)
-{
-	return _store_boost(buf, count);
-}
-
-static ssize_t show_global_boost(struct kobject *kobj,
-				 struct attribute *attr, char *buf)
-{
-	return sprintf(buf, "%u\n", boost_enabled);
+	return 0;
 }
 
-static struct global_attr global_boost = __ATTR(boost, 0644,
-						show_global_boost,
-						store_global_boost);
-
 static ssize_t show_freqdomain_cpus(struct cpufreq_policy *policy, char *buf)
 {
 	struct acpi_cpufreq_data *data = per_cpu(acfreq_data, policy->cpu);
@@ -186,15 +152,32 @@ static ssize_t show_freqdomain_cpus(struct cpufreq_policy *policy, char *buf)
 cpufreq_freq_attr_ro(freqdomain_cpus);
 
 #ifdef CONFIG_X86_ACPI_CPUFREQ_CPB
+static ssize_t store_boost(const char *buf, size_t count)
+{
+	int ret;
+	unsigned long val = 0;
+
+	if (!acpi_cpufreq_driver.boost_supported)
+		return -EINVAL;
+
+	ret = kstrtoul(buf, 10, &val);
+	if (ret || (val > 1))
+		return -EINVAL;
+
+	_store_boost((int) val);
+
+	return count;
+}
+
 static ssize_t store_cpb(struct cpufreq_policy *policy, const char *buf,
 			 size_t count)
 {
-	return _store_boost(buf, count);
+	return store_boost(buf, count);
 }
 
 static ssize_t show_cpb(struct cpufreq_policy *policy, char *buf)
 {
-	return sprintf(buf, "%u\n", boost_enabled);
+	return sprintf(buf, "%u\n", acpi_cpufreq_driver.boost_enabled);
 }
 
 cpufreq_freq_attr_rw(cpb);
@@ -554,7 +537,7 @@ static int boost_notify(struct notifier_block *nb, unsigned long action,
 	switch (action) {
 	case CPU_UP_PREPARE:
 	case CPU_UP_PREPARE_FROZEN:
-		boost_set_msrs(boost_enabled, cpumask);
+		boost_set_msrs(acpi_cpufreq_driver.boost_enabled, cpumask);
 		break;
 
 	case CPU_DOWN_PREPARE:
@@ -911,6 +894,7 @@ static struct cpufreq_driver acpi_cpufreq_driver = {
 	.resume		= acpi_cpufreq_resume,
 	.name		= "acpi-cpufreq",
 	.attr		= acpi_cpufreq_attr,
+	.set_boost      = _store_boost,
 };
 
 static void __init acpi_cpufreq_boost_init(void)
@@ -921,33 +905,22 @@ static void __init acpi_cpufreq_boost_init(void)
 		if (!msrs)
 			return;
 
-		boost_supported = true;
-		boost_enabled = boost_state(0);
-
+		acpi_cpufreq_driver.boost_supported = true;
+		acpi_cpufreq_driver.boost_enabled = boost_state(0);
 		get_online_cpus();
 
 		/* Force all MSRs to the same value */
-		boost_set_msrs(boost_enabled, cpu_online_mask);
+		boost_set_msrs(acpi_cpufreq_driver.boost_enabled,
+			       cpu_online_mask);
 
 		register_cpu_notifier(&boost_nb);
 
 		put_online_cpus();
-	} else
-		global_boost.attr.mode = 0444;
-
-	/* We create the boost file in any case, though for systems without
-	 * hardware support it will be read-only and hardwired to return 0.
-	 */
-	if (cpufreq_sysfs_create_file(&(global_boost.attr)))
-		pr_warn(PFX "could not register global boost sysfs file\n");
-	else
-		pr_debug("registered global boost sysfs file\n");
+	}
 }
 
 static void __exit acpi_cpufreq_boost_exit(void)
 {
-	cpufreq_sysfs_remove_file(&(global_boost.attr));
-
 	if (msrs) {
 		unregister_cpu_notifier(&boost_nb);
 
@@ -993,12 +966,11 @@ static int __init acpi_cpufreq_init(void)
 			*iter = &cpb;
 	}
 #endif
+	acpi_cpufreq_boost_init();
 
 	ret = cpufreq_register_driver(&acpi_cpufreq_driver);
 	if (ret)
 		free_acpi_perf_data();
-	else
-		acpi_cpufreq_boost_init();
 
 	return ret;
 }
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v12 3/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST
  2013-12-20 14:24 ` [PATCH v12 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
  2013-12-20 14:24   ` [PATCH v12 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
  2013-12-20 14:24   ` [PATCH v12 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
@ 2013-12-20 14:24   ` Lukasz Majewski
  2013-12-20 14:24   ` [PATCH v12 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
                     ` (4 subsequent siblings)
  7 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-20 14:24 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, Zhang Rui, linux-samsung-soc

For safety reasons new flag - CONFIG_CPU_FREQ_BOOST_SW has been added.
Only after selecting "EXYNOS Frequency Overclocking - Software" Kconfig
option the software managed boost is enabled. It also selects thermal
subsystem to be compiled in. Thermal is necessary for disabling boost
and cooling down the device when overheating detected.

Boost _MUST_NOT_ work without thermal subsystem with properly defined
overheating temperatures.

This option doesn't affect x86's ACPI hardware managed boost support
(i.e. Intel, AMD). In this situation boost management is embedded in
hardware.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v12:
- None

Changes for v11:
- None

Changes for v10:
- None

Changes for v9:
- None

Changes for v8:
- None

Changes for v7:
- Remove superfluous "default n" definition
- Generic CPU_FREQ_BOOST_SW depends on THERMAL

Changes for v6:
- CPU_FREQ_BOOST_SW [1] is now defined as "invisible" bool option.
- Platform dependent ARM_EXYNOS_CPU_FREQ_BOOST_SW config option has been
  added. It depends on ARM_EXYNOS_CPUFREQ options and selects
  EXYNOS_THERMAL with the main boost config [1].

Changes for v5:
- New patch

 drivers/cpufreq/Kconfig     |    4 ++++
 drivers/cpufreq/Kconfig.arm |   15 +++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
index 38093e2..c8818c1 100644
--- a/drivers/cpufreq/Kconfig
+++ b/drivers/cpufreq/Kconfig
@@ -20,6 +20,10 @@ if CPU_FREQ
 config CPU_FREQ_GOV_COMMON
 	bool
 
+config CPU_FREQ_BOOST_SW
+	bool
+	depends on THERMAL
+
 config CPU_FREQ_STAT
 	tristate "CPU frequency translation statistics"
 	default y
diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm
index ce52ed9..25599d6 100644
--- a/drivers/cpufreq/Kconfig.arm
+++ b/drivers/cpufreq/Kconfig.arm
@@ -64,6 +64,21 @@ config ARM_EXYNOS5440_CPUFREQ
 
 	  If in doubt, say N.
 
+config ARM_EXYNOS_CPU_FREQ_BOOST_SW
+	bool "EXYNOS Frequency Overclocking - Software"
+	depends on ARM_EXYNOS_CPUFREQ
+	select CPU_FREQ_BOOST_SW
+	select EXYNOS_THERMAL
+	help
+	  This driver supports software managed overclocking (BOOST).
+	  It allows usage of special frequencies for Samsung Exynos
+	  processors if thermal conditions are appropriate.
+
+	  It reguires, for safe operation, thermal framework with properly
+	  defined trip points.
+
+	  If in doubt, say N.
+
 config ARM_HIGHBANK_CPUFREQ
 	tristate "Calxeda Highbank-based"
 	depends on ARCH_HIGHBANK
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v12 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework
  2013-12-20 14:24 ` [PATCH v12 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                     ` (2 preceding siblings ...)
  2013-12-20 14:24   ` [PATCH v12 3/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
@ 2013-12-20 14:24   ` Lukasz Majewski
  2013-12-20 14:24   ` [PATCH v12 5/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
                     ` (3 subsequent siblings)
  7 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-20 14:24 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, Zhang Rui, linux-samsung-soc

The cpufreq_driver's boost_supported flag is true only when boost
support is explicitly enabled. Boost related attributes are exported only
under the same condition.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v12:
- None

Changes for v11:
- None

Changes for v10:
- None

Changes for v9:
- The exynos_cpufreq_attr[] has been replaced by generic_cpufreq_attr[],
  therefore the cpufreq_freq_attr_scaling_boost_freqs is now added at
  freq_table.c file.

Changes for v8:
- None

Changes for v7:
- Replace CONFIG_CPU_FREQ_BOOST_SW with CONFIG_ARM_EXYNOS_CPU_FREQ_BOOST_SW
- Move boost_supported initialization to struct cpufreq_driver exynos_driver

Changes for v6:
- Replace exynos_driver.boost_supported = 1 to = true
- Protect boost attributes export with CONFIG_CPU_FREQ_BOOST_SW

Changes for v5:
- None

Changes for v4:
- None

Changes for v3:
- Remove low level boost code
- Move boost management code to cpufreq core code
- Use boost_supported flag to indicate if driver supports over clocking

Changes for v2:
- Removal of struct cpufreq_boost
- Removal of the CONFIG_CPU_FREQ_BOOST flag
- low_level_boost with valid address when boost is supported

 drivers/cpufreq/exynos-cpufreq.c |    3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/cpufreq/exynos-cpufreq.c b/drivers/cpufreq/exynos-cpufreq.c
index f3c2287..3cd6d2e 100644
--- a/drivers/cpufreq/exynos-cpufreq.c
+++ b/drivers/cpufreq/exynos-cpufreq.c
@@ -226,6 +226,9 @@ static struct cpufreq_driver exynos_driver = {
 	.exit		= cpufreq_generic_exit,
 	.name		= "exynos_cpufreq",
 	.attr		= cpufreq_generic_attr,
+#ifdef CONFIG_ARM_EXYNOS_CPU_FREQ_BOOST_SW
+	.boost_supported = true,
+#endif
 #ifdef CONFIG_PM
 	.suspend	= exynos_cpufreq_suspend,
 	.resume		= exynos_cpufreq_resume,
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v12 5/7] Documentation:cpufreq:boost: Update BOOST documentation
  2013-12-20 14:24 ` [PATCH v12 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                     ` (3 preceding siblings ...)
  2013-12-20 14:24   ` [PATCH v12 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
@ 2013-12-20 14:24   ` Lukasz Majewski
  2013-12-20 14:24   ` [PATCH v12 6/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
                     ` (2 subsequent siblings)
  7 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-20 14:24 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, Zhang Rui, linux-samsung-soc

Since the support for software and hardware controlled boosting has been
added, the corresponding Documentation entry had been updated.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v12:
- None

Changes for v11:
- None

Changes for v10:
- None

Changes for v9:
- None

Changes for v8:
- None

Changes for v7:
- None

Changes for v6:
- None

Changes for v5:
- New patch

 Documentation/cpu-freq/boost.txt |   26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/Documentation/cpu-freq/boost.txt b/Documentation/cpu-freq/boost.txt
index 9b4edfc..dd62e13 100644
--- a/Documentation/cpu-freq/boost.txt
+++ b/Documentation/cpu-freq/boost.txt
@@ -17,8 +17,8 @@ Introduction
 Some CPUs support a functionality to raise the operating frequency of
 some cores in a multi-core package if certain conditions apply, mostly
 if the whole chip is not fully utilized and below it's intended thermal
-budget. This is done without operating system control by a combination
-of hardware and firmware.
+budget. The decision about boost disable/enable is made either at hardware
+(e.g. x86) or software (e.g ARM).
 On Intel CPUs this is called "Turbo Boost", AMD calls it "Turbo-Core",
 in technical documentation "Core performance boost". In Linux we use
 the term "boost" for convenience.
@@ -48,24 +48,24 @@ be desirable:
 User controlled switch
 ----------------------
 
-To allow the user to toggle the boosting functionality, the acpi-cpufreq
-driver exports a sysfs knob to disable it. There is a file:
+To allow the user to toggle the boosting functionality, the cpufreq core
+driver exports a sysfs knob to enable or disable it. There is a file:
 /sys/devices/system/cpu/cpufreq/boost
 which can either read "0" (boosting disabled) or "1" (boosting enabled).
-Reading the file is always supported, even if the processor does not
-support boosting. In this case the file will be read-only and always
-reads as "0". Explicitly changing the permissions and writing to that
-file anyway will return EINVAL.
+The file is exported only when cpufreq driver supports boosting.
+Explicitly changing the permissions and writing to that file anyway will
+return EINVAL.
 
 On supported CPUs one can write either a "0" or a "1" into this file.
 This will either disable the boost functionality on all cores in the
-whole system (0) or will allow the hardware to boost at will (1).
+whole system (0) or will allow the software or hardware to boost at will
+(1).
 
 Writing a "1" does not explicitly boost the system, but just allows the
-CPU (and the firmware) to boost at their discretion. Some implementations
-take external factors like the chip's temperature into account, so
-boosting once does not necessarily mean that it will occur every time
-even using the exact same software setup.
+CPU to boost at their discretion. Some implementations take external
+factors like the chip's temperature into account, so boosting once does
+not necessarily mean that it will occur every time even using the exact
+same software setup.
 
 
 AMD legacy cpb switch
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v12 6/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ
  2013-12-20 14:24 ` [PATCH v12 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                     ` (4 preceding siblings ...)
  2013-12-20 14:24   ` [PATCH v12 5/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
@ 2013-12-20 14:24   ` Lukasz Majewski
  2013-12-20 14:24   ` [PATCH v12 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412) Lukasz Majewski
  2014-01-07  6:58   ` [PATCH v12 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
  7 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-20 14:24 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, Zhang Rui, linux-samsung-soc

Special driver data flag (CPUFREQ_BOOST_FREQ) has been added to indicate
frequency, which can be only enabled for BOOST mode.
This frequency shall be used only for limited time, since it might cause
target device to overheat.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

---
Changes for v12:
- None

Changes for v11:
- None

Changes for v10:
- None

Changes for v9:
- None

Changes for v8:
- None

Changes for v7:
- None

Changes for v6:
- New patch

 drivers/cpufreq/exynos4x12-cpufreq.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/cpufreq/exynos4x12-cpufreq.c b/drivers/cpufreq/exynos4x12-cpufreq.c
index efad5e6..77ae129 100644
--- a/drivers/cpufreq/exynos4x12-cpufreq.c
+++ b/drivers/cpufreq/exynos4x12-cpufreq.c
@@ -32,7 +32,7 @@ static unsigned int exynos4x12_volt_table[] = {
 };
 
 static struct cpufreq_frequency_table exynos4x12_freq_table[] = {
-	{L0, CPUFREQ_ENTRY_INVALID},
+	{CPUFREQ_BOOST_FREQ, 1500 * 1000},
 	{L1, 1400 * 1000},
 	{L2, 1300 * 1000},
 	{L3, 1200 * 1000},
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* [PATCH v12 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412)
  2013-12-20 14:24 ` [PATCH v12 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                     ` (5 preceding siblings ...)
  2013-12-20 14:24   ` [PATCH v12 6/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
@ 2013-12-20 14:24   ` Lukasz Majewski
  2014-01-10  6:35     ` Zhang Rui
  2014-01-07  6:58   ` [PATCH v12 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
  7 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2013-12-20 14:24 UTC (permalink / raw)
  To: Viresh Kumar, Rafael J. Wysocki, Eduardo Valentin
  Cc: cpufreq, Linux PM list, Jonghwa Lee, Lukasz Majewski,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, Zhang Rui, linux-samsung-soc

This patch provides auto disable/enable operation for boost. It uses already
present thermal infrastructure to provide BOOST hysteresis.
The TMU data has been modified to work properly with or without BOOST.
Hence, the two first trip points with corresponding clip frequencies were
adjusted.

The first one was reduced from 85 to 70 degrees and clip frequency was
increased to 1.4 GHz from 800 MHz. This trip point is in fact responsible
for providing BOOST hysteresis. When temperature exceeds 70 deg, the maximal
non BOOST frequency for Exynos4412 is imposed.

Since the first trigger level has been "stolen" for BOOST, the second one
needs to be a compromise for the previously used two for non BOOST
configuration. The 95 deg with modified clip freq (to 400 MHz) shall provide
a good balance between cooling down the overheated device and throughput on
an acceptable level.

Two last trigger levels were not modified since, they cause platform shutdown
on emergency overheat situation.
Third trip point passage results in SW managed shut down of the system.
If the last trip point is crossed, the PMU HW generates the power off
signal.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Acked-by: Eduardo Valentin <eduardo.valentin@ti.com>

---
Changes for v12:
    - More verbose patch description to explain new TMU temperature assignment
      for Exynos4412

Changes for v11:
    - Use only one thermal data set
    - Adjust Exynos4412 thermal data to work with or without BOOST

Changes for v10:
    - Remove boost related code from thermal_core.c
    - Use already present thermal infrastructure to provide thermal hysteresis
    - Introduce special set of TMU data for BOOST

Changes for v9:
    - None

Changes for v8:
    - Move cpufreq_boost_* stub functions definition (needed when cpufreq
      is not compiled in) to cpufreq.h at cpufreq core support commit

Changes for v7:
    - None

Changes for v6:
    - Disable boost only when supported and enabled
    - Protect boost related thermal_zone_device struct fields with mutex
    - Evaluate temperature trend during boost enable decision
    - Create separate methods to handle boost enable/disable
      (thermal_boost_{enable|disable}) operations
    - Boost is disabled at any trip point passage (not only the non critical one)
    - Add stub definitions for cpufreq boost functions used when
      CONFIG_CPU_FREQ is NOT defined.

Changes for v5:
    - Move boost disable code from cpu_cooling.c to thermal_core.c
      (to handle_non_critical_trips)
    - Extent struct thermal_zone_device by adding overheated bool flag
    - Implement auto enable of boost after device cools down
    - Introduce boost_polling flag, which indicates if thermal uses it's predefined
      pool delay or has woken up thermal workqueue only to wait until device
      cools down.

Changes for v4:
    - New patch

 drivers/thermal/samsung/exynos_tmu_data.c |   12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/thermal/samsung/exynos_tmu_data.c b/drivers/thermal/samsung/exynos_tmu_data.c
index 073c292..476b768 100644
--- a/drivers/thermal/samsung/exynos_tmu_data.c
+++ b/drivers/thermal/samsung/exynos_tmu_data.c
@@ -131,8 +131,8 @@ static const struct exynos_tmu_registers exynos4412_tmu_registers = {
 
 #define EXYNOS4412_TMU_DATA \
 	.threshold_falling = 10, \
-	.trigger_levels[0] = 85, \
-	.trigger_levels[1] = 103, \
+	.trigger_levels[0] = 70, \
+	.trigger_levels[1] = 95, \
 	.trigger_levels[2] = 110, \
 	.trigger_levels[3] = 120, \
 	.trigger_enable[0] = true, \
@@ -155,12 +155,12 @@ static const struct exynos_tmu_registers exynos4412_tmu_registers = {
 	.second_point_trim = 85, \
 	.default_temp_offset = 50, \
 	.freq_tab[0] = { \
-		.freq_clip_max = 800 * 1000, \
-		.temp_level = 85, \
+		.freq_clip_max = 1400 * 1000, \
+		.temp_level = 70, \
 	}, \
 	.freq_tab[1] = { \
-		.freq_clip_max = 200 * 1000, \
-		.temp_level = 103, \
+		.freq_clip_max = 400 * 1000, \
+		.temp_level = 95, \
 	}, \
 	.freq_tab_count = 2, \
 	.registers = &exynos4412_tmu_registers, \
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 329+ messages in thread

* Re: [PATCH v12 0/7] cpufreq:boost: CPU Boost mode support
  2013-12-20 14:24 ` [PATCH v12 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
                     ` (6 preceding siblings ...)
  2013-12-20 14:24   ` [PATCH v12 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412) Lukasz Majewski
@ 2014-01-07  6:58   ` Lukasz Majewski
  2014-01-08  0:35     ` Rafael J. Wysocki
  7 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2014-01-07  6:58 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Lukasz Majewski, Viresh Kumar, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Myungjoo Ham, durgadoss.r, Zhang Rui,
	linux-samsung-soc, rjw

Hi Rafael,

> This patch series introduces support for CPU overclocking technique
> called Boost.
> 
> It is a follow up of a LAB governor proposal. Boost is a LAB
> component:
> http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq
> 
> Boost unifies hardware based solution (e.g. Intel Nehalem) with
> software oriented one (like the one done at Exynos).
> For this reason cpufreq/freq_table code has been reorganized to
> include common code.
> 
> Important design decisions:
> - Boost related code is compiled-in unconditionally to cpufreq core
> and disabled by default. The cpufreq_driver is responsibile for
> setting boost_supported flag and providing set_boost callback(if HW
> support is needed). For software managed boost, special Kconfig flag -
>   CONFIG_CPU_FREQ_BOOST_SW has been defined. It will be selected only
>   when a target platform has thermal framework properly configured.
> 
> - struct cpufreq_driver has been extended with boost related fields:
>         -- boost_supported - when driver supports boosting
>         -- boost_enabled - boost state
>         -- set_boost - callback to function, which is necessary to
>            enable/disable boost
> 
> - Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost) is
> visible _only_ when cpufreq driver supports Boost.
> 
> - No special spin_lock for Boost was created. The one from cpufreq
> core was reused.
> 
> - The Boost code doesn't rely on any policy. When boost state is
> changed, then the policy list is iterated and proper adjustements are
> done.
> 
> - To improve safety level, the thermal framework is also extended to
> disable software boosting, when thermal trip point is reached. After
> cooling down the boost can be enabled again. This emulates behaviour
> similar to HW managed boost (like x86)
> 
> Tested at HW:
>        Exynos 4412 3.13-rc4 Linux
>        Intel Core i7-3770 3.13-rc4 Linux
> 
> Above patches were posted on top of kernel_pm/bleeding-edge
> (SHA1: bd0f3a5d9dce48a917ce1f1047534d79c725149)
> 
> Lukasz Majewski (7):
>   cpufreq: Add boost frequency support in core
>   cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common
>     boost solution
>   cpufreq:boost:Kconfig: Provide support for software managed BOOST
>   cpufreq:exynos:Extend Exynos cpufreq driver to support boost
>     framework
>   Documentation:cpufreq:boost: Update BOOST documentation
>   cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ
>   thermal:exynos:boost: Automatic enable/disable of BOOST feature (at
>     Exynos4412)
> 
>  Documentation/cpu-freq/boost.txt          |   26 +++----
>  drivers/cpufreq/Kconfig                   |    4 +
>  drivers/cpufreq/Kconfig.arm               |   15 ++++
>  drivers/cpufreq/acpi-cpufreq.c            |   86
> +++++++-------------- drivers/cpufreq/cpufreq.c                 |
> 118 ++++++++++++++++++++++++++++-
> drivers/cpufreq/exynos-cpufreq.c          |    3 +
> drivers/cpufreq/exynos4x12-cpufreq.c      |    2 +-
> drivers/cpufreq/freq_table.c              |   56 ++++++++++++--
> drivers/thermal/samsung/exynos_tmu_data.c |   12 +--
> include/linux/cpufreq.h                   |   24 ++++++ 10 files
> changed, 261 insertions(+), 85 deletions(-)
> 

A gentle ping about BOOST patches.

Its been already acked by Viresh and Eduardo.

It applies on kernel_pm/bleeding_edge SHA1:
4836deb72c5e2a9af0cb2129c1149783a26d99ab

Thanks in advance.

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v12 0/7] cpufreq:boost: CPU Boost mode support
  2014-01-07  6:58   ` [PATCH v12 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
@ 2014-01-08  0:35     ` Rafael J. Wysocki
  2014-01-09  7:19       ` Lukasz Majewski
  2014-01-10  6:33       ` Zhang Rui
  0 siblings, 2 replies; 329+ messages in thread
From: Rafael J. Wysocki @ 2014-01-08  0:35 UTC (permalink / raw)
  To: Lukasz Majewski, Zhang Rui
  Cc: Viresh Kumar, Eduardo Valentin, cpufreq, Linux PM list,
	Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Myungjoo Ham, durgadoss.r,
	linux-samsung-soc, rjw

On Tuesday, January 07, 2014 07:58:24 AM Lukasz Majewski wrote:
> Hi Rafael,

Hi,

> > This patch series introduces support for CPU overclocking technique
> > called Boost.
> > 
> > It is a follow up of a LAB governor proposal. Boost is a LAB
> > component:
> > http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq
> > 
> > Boost unifies hardware based solution (e.g. Intel Nehalem) with
> > software oriented one (like the one done at Exynos).
> > For this reason cpufreq/freq_table code has been reorganized to
> > include common code.
> > 
> > Important design decisions:
> > - Boost related code is compiled-in unconditionally to cpufreq core
> > and disabled by default. The cpufreq_driver is responsibile for
> > setting boost_supported flag and providing set_boost callback(if HW
> > support is needed). For software managed boost, special Kconfig flag -
> >   CONFIG_CPU_FREQ_BOOST_SW has been defined. It will be selected only
> >   when a target platform has thermal framework properly configured.
> > 
> > - struct cpufreq_driver has been extended with boost related fields:
> >         -- boost_supported - when driver supports boosting
> >         -- boost_enabled - boost state
> >         -- set_boost - callback to function, which is necessary to
> >            enable/disable boost
> > 
> > - Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost) is
> > visible _only_ when cpufreq driver supports Boost.
> > 
> > - No special spin_lock for Boost was created. The one from cpufreq
> > core was reused.
> > 
> > - The Boost code doesn't rely on any policy. When boost state is
> > changed, then the policy list is iterated and proper adjustements are
> > done.
> > 
> > - To improve safety level, the thermal framework is also extended to
> > disable software boosting, when thermal trip point is reached. After
> > cooling down the boost can be enabled again. This emulates behaviour
> > similar to HW managed boost (like x86)
> > 
> > Tested at HW:
> >        Exynos 4412 3.13-rc4 Linux
> >        Intel Core i7-3770 3.13-rc4 Linux
> > 
> > Above patches were posted on top of kernel_pm/bleeding-edge
> > (SHA1: bd0f3a5d9dce48a917ce1f1047534d79c725149)
> > 
> > Lukasz Majewski (7):
> >   cpufreq: Add boost frequency support in core
> >   cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common
> >     boost solution
> >   cpufreq:boost:Kconfig: Provide support for software managed BOOST
> >   cpufreq:exynos:Extend Exynos cpufreq driver to support boost
> >     framework
> >   Documentation:cpufreq:boost: Update BOOST documentation
> >   cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ
> >   thermal:exynos:boost: Automatic enable/disable of BOOST feature (at
> >     Exynos4412)
> > 
> >  Documentation/cpu-freq/boost.txt          |   26 +++----
> >  drivers/cpufreq/Kconfig                   |    4 +
> >  drivers/cpufreq/Kconfig.arm               |   15 ++++
> >  drivers/cpufreq/acpi-cpufreq.c            |   86
> > +++++++-------------- drivers/cpufreq/cpufreq.c                 |
> > 118 ++++++++++++++++++++++++++++-
> > drivers/cpufreq/exynos-cpufreq.c          |    3 +
> > drivers/cpufreq/exynos4x12-cpufreq.c      |    2 +-
> > drivers/cpufreq/freq_table.c              |   56 ++++++++++++--
> > drivers/thermal/samsung/exynos_tmu_data.c |   12 +--
> > include/linux/cpufreq.h                   |   24 ++++++ 10 files
> > changed, 261 insertions(+), 85 deletions(-)
> > 
> 
> A gentle ping about BOOST patches.
> 
> Its been already acked by Viresh and Eduardo.
> 
> It applies on kernel_pm/bleeding_edge SHA1:
> 4836deb72c5e2a9af0cb2129c1149783a26d99ab

It looks like Rui is still looking into this.

Rui, are you fine with this series?

Rafael


^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v12 0/7] cpufreq:boost: CPU Boost mode support
  2014-01-08  0:35     ` Rafael J. Wysocki
@ 2014-01-09  7:19       ` Lukasz Majewski
  2014-01-10  6:33       ` Zhang Rui
  1 sibling, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2014-01-09  7:19 UTC (permalink / raw)
  To: Rafael J. Wysocki, Zhang Rui, Eduardo Valentin
  Cc: Viresh Kumar, cpufreq, Linux PM list, Jonghwa Lee,
	Lukasz Majewski, linux-kernel, Bartlomiej Zolnierkiewicz,
	Myungjoo Ham, durgadoss.r, linux-samsung-soc, rjw

Hi Rafael, Zhang,

> On Tuesday, January 07, 2014 07:58:24 AM Lukasz Majewski wrote:
> > Hi Rafael,
> 
> Hi,
> 
> > > This patch series introduces support for CPU overclocking
> > > technique called Boost.
> > > 
> > > It is a follow up of a LAB governor proposal. Boost is a LAB
> > > component:
> > > http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq
> > > 
> > > Boost unifies hardware based solution (e.g. Intel Nehalem) with
> > > software oriented one (like the one done at Exynos).
> > > For this reason cpufreq/freq_table code has been reorganized to
> > > include common code.
> > > 
> > > Important design decisions:
> > > - Boost related code is compiled-in unconditionally to cpufreq
> > > core and disabled by default. The cpufreq_driver is responsibile
> > > for setting boost_supported flag and providing set_boost
> > > callback(if HW support is needed). For software managed boost,
> > > special Kconfig flag - CONFIG_CPU_FREQ_BOOST_SW has been defined.
> > > It will be selected only when a target platform has thermal
> > > framework properly configured.
> > > 
> > > - struct cpufreq_driver has been extended with boost related
> > > fields: -- boost_supported - when driver supports boosting
> > >         -- boost_enabled - boost state
> > >         -- set_boost - callback to function, which is necessary to
> > >            enable/disable boost
> > > 
> > > - Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost) is
> > > visible _only_ when cpufreq driver supports Boost.
> > > 
> > > - No special spin_lock for Boost was created. The one from cpufreq
> > > core was reused.
> > > 
> > > - The Boost code doesn't rely on any policy. When boost state is
> > > changed, then the policy list is iterated and proper adjustements
> > > are done.
> > > 
> > > - To improve safety level, the thermal framework is also extended
> > > to disable software boosting, when thermal trip point is reached.
> > > After cooling down the boost can be enabled again. This emulates
> > > behaviour similar to HW managed boost (like x86)
> > > 
> > > Tested at HW:
> > >        Exynos 4412 3.13-rc4 Linux
> > >        Intel Core i7-3770 3.13-rc4 Linux
> > > 
> > > Above patches were posted on top of kernel_pm/bleeding-edge
> > > (SHA1: bd0f3a5d9dce48a917ce1f1047534d79c725149)
> > > 
> > > Lukasz Majewski (7):
> > >   cpufreq: Add boost frequency support in core
> > >   cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with
> > > common boost solution
> > >   cpufreq:boost:Kconfig: Provide support for software managed
> > > BOOST cpufreq:exynos:Extend Exynos cpufreq driver to support boost
> > >     framework
> > >   Documentation:cpufreq:boost: Update BOOST documentation
> > >   cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ
> > >   thermal:exynos:boost: Automatic enable/disable of BOOST feature
> > > (at Exynos4412)
> > > 
> > >  Documentation/cpu-freq/boost.txt          |   26 +++----
> > >  drivers/cpufreq/Kconfig                   |    4 +
> > >  drivers/cpufreq/Kconfig.arm               |   15 ++++
> > >  drivers/cpufreq/acpi-cpufreq.c            |   86
> > > +++++++-------------- drivers/cpufreq/cpufreq.c                 |
> > > 118 ++++++++++++++++++++++++++++-
> > > drivers/cpufreq/exynos-cpufreq.c          |    3 +
> > > drivers/cpufreq/exynos4x12-cpufreq.c      |    2 +-
> > > drivers/cpufreq/freq_table.c              |   56 ++++++++++++--
> > > drivers/thermal/samsung/exynos_tmu_data.c |   12 +--
> > > include/linux/cpufreq.h                   |   24 ++++++ 10 files
> > > changed, 261 insertions(+), 85 deletions(-)
> > > 
> > 
> > A gentle ping about BOOST patches.
> > 
> > Its been already acked by Viresh and Eduardo.
> > 
> > It applies on kernel_pm/bleeding_edge SHA1:
> > 4836deb72c5e2a9af0cb2129c1149783a26d99ab
> 
> It looks like Rui is still looking into this.
> 
> Rui, are you fine with this series?

I'd really appreciate Ack from Rui on this patch series.

However, after Rui's comments on v9, I've completely removed the BOOST
code from thermal core.

Since the v10, I've only adjusted default data for Exynos SoC. This
approach has been finally accepted by Eduardo (who is responsible for
this part of the thermal subsystem) on the v12.


> 
> Rafael
> 

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v12 0/7] cpufreq:boost: CPU Boost mode support
  2014-01-08  0:35     ` Rafael J. Wysocki
  2014-01-09  7:19       ` Lukasz Majewski
@ 2014-01-10  6:33       ` Zhang Rui
  2014-01-16  9:40         ` Lukasz Majewski
  1 sibling, 1 reply; 329+ messages in thread
From: Zhang Rui @ 2014-01-10  6:33 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Lukasz Majewski, Viresh Kumar, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Myungjoo Ham, durgadoss.r,
	linux-samsung-soc, rjw

On Wed, 2014-01-08 at 01:35 +0100, Rafael J. Wysocki wrote:
> On Tuesday, January 07, 2014 07:58:24 AM Lukasz Majewski wrote:
> > Hi Rafael,
> 
> Hi,
> 
> > > This patch series introduces support for CPU overclocking technique
> > > called Boost.
> > > 
> > > It is a follow up of a LAB governor proposal. Boost is a LAB
> > > component:
> > > http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq
> > > 
> > > Boost unifies hardware based solution (e.g. Intel Nehalem) with
> > > software oriented one (like the one done at Exynos).
> > > For this reason cpufreq/freq_table code has been reorganized to
> > > include common code.
> > > 
> > > Important design decisions:
> > > - Boost related code is compiled-in unconditionally to cpufreq core
> > > and disabled by default. The cpufreq_driver is responsibile for
> > > setting boost_supported flag and providing set_boost callback(if HW
> > > support is needed). For software managed boost, special Kconfig flag -
> > >   CONFIG_CPU_FREQ_BOOST_SW has been defined. It will be selected only
> > >   when a target platform has thermal framework properly configured.
> > > 
> > > - struct cpufreq_driver has been extended with boost related fields:
> > >         -- boost_supported - when driver supports boosting
> > >         -- boost_enabled - boost state
> > >         -- set_boost - callback to function, which is necessary to
> > >            enable/disable boost
> > > 
> > > - Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost) is
> > > visible _only_ when cpufreq driver supports Boost.
> > > 
> > > - No special spin_lock for Boost was created. The one from cpufreq
> > > core was reused.
> > > 
> > > - The Boost code doesn't rely on any policy. When boost state is
> > > changed, then the policy list is iterated and proper adjustements are
> > > done.
> > > 
> > > - To improve safety level, the thermal framework is also extended to
> > > disable software boosting, when thermal trip point is reached. After
> > > cooling down the boost can be enabled again. This emulates behaviour
> > > similar to HW managed boost (like x86)
> > > 
> > > Tested at HW:
> > >        Exynos 4412 3.13-rc4 Linux
> > >        Intel Core i7-3770 3.13-rc4 Linux
> > > 
> > > Above patches were posted on top of kernel_pm/bleeding-edge
> > > (SHA1: bd0f3a5d9dce48a917ce1f1047534d79c725149)
> > > 
> > > Lukasz Majewski (7):
> > >   cpufreq: Add boost frequency support in core
> > >   cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common
> > >     boost solution
> > >   cpufreq:boost:Kconfig: Provide support for software managed BOOST
> > >   cpufreq:exynos:Extend Exynos cpufreq driver to support boost
> > >     framework
> > >   Documentation:cpufreq:boost: Update BOOST documentation
> > >   cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ
> > >   thermal:exynos:boost: Automatic enable/disable of BOOST feature (at
> > >     Exynos4412)
> > > 
> > >  Documentation/cpu-freq/boost.txt          |   26 +++----
> > >  drivers/cpufreq/Kconfig                   |    4 +
> > >  drivers/cpufreq/Kconfig.arm               |   15 ++++
> > >  drivers/cpufreq/acpi-cpufreq.c            |   86
> > > +++++++-------------- drivers/cpufreq/cpufreq.c                 |
> > > 118 ++++++++++++++++++++++++++++-
> > > drivers/cpufreq/exynos-cpufreq.c          |    3 +
> > > drivers/cpufreq/exynos4x12-cpufreq.c      |    2 +-
> > > drivers/cpufreq/freq_table.c              |   56 ++++++++++++--
> > > drivers/thermal/samsung/exynos_tmu_data.c |   12 +--
> > > include/linux/cpufreq.h                   |   24 ++++++ 10 files
> > > changed, 261 insertions(+), 85 deletions(-)
> > > 
> > 
> > A gentle ping about BOOST patches.
> > 
> > Its been already acked by Viresh and Eduardo.
> > 
> > It applies on kernel_pm/bleeding_edge SHA1:
> > 4836deb72c5e2a9af0cb2129c1149783a26d99ab
> 
> It looks like Rui is still looking into this.
> 
> Rui, are you fine with this series?
> 
Yes, I'm okay with the thermal related parts of this patch set.

thanks,
rui
> Rafael
> 



^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v12 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412)
  2013-12-20 14:24   ` [PATCH v12 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412) Lukasz Majewski
@ 2014-01-10  6:35     ` Zhang Rui
  0 siblings, 0 replies; 329+ messages in thread
From: Zhang Rui @ 2014-01-10  6:35 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Viresh Kumar, Rafael J. Wysocki, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Myungjoo Ham, durgadoss.r,
	linux-samsung-soc

On Fri, 2013-12-20 at 15:24 +0100, Lukasz Majewski wrote:
> This patch provides auto disable/enable operation for boost. It uses already
> present thermal infrastructure to provide BOOST hysteresis.
> The TMU data has been modified to work properly with or without BOOST.
> Hence, the two first trip points with corresponding clip frequencies were
> adjusted.
> 
> The first one was reduced from 85 to 70 degrees and clip frequency was
> increased to 1.4 GHz from 800 MHz. This trip point is in fact responsible
> for providing BOOST hysteresis. When temperature exceeds 70 deg, the maximal
> non BOOST frequency for Exynos4412 is imposed.
> 
> Since the first trigger level has been "stolen" for BOOST, the second one
> needs to be a compromise for the previously used two for non BOOST
> configuration. The 95 deg with modified clip freq (to 400 MHz) shall provide
> a good balance between cooling down the overheated device and throughput on
> an acceptable level.
> 
> Two last trigger levels were not modified since, they cause platform shutdown
> on emergency overheat situation.
> Third trip point passage results in SW managed shut down of the system.
> If the last trip point is crossed, the PMU HW generates the power off
> signal.
> 
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
> Acked-by: Eduardo Valentin <eduardo.valentin@ti.com>

Reviewed-by: Zhang Rui <rui.zhang@intel.com>

thanks,
rui
> 
> ---
> Changes for v12:
>     - More verbose patch description to explain new TMU temperature assignment
>       for Exynos4412
> 
> Changes for v11:
>     - Use only one thermal data set
>     - Adjust Exynos4412 thermal data to work with or without BOOST
> 
> Changes for v10:
>     - Remove boost related code from thermal_core.c
>     - Use already present thermal infrastructure to provide thermal hysteresis
>     - Introduce special set of TMU data for BOOST
> 
> Changes for v9:
>     - None
> 
> Changes for v8:
>     - Move cpufreq_boost_* stub functions definition (needed when cpufreq
>       is not compiled in) to cpufreq.h at cpufreq core support commit
> 
> Changes for v7:
>     - None
> 
> Changes for v6:
>     - Disable boost only when supported and enabled
>     - Protect boost related thermal_zone_device struct fields with mutex
>     - Evaluate temperature trend during boost enable decision
>     - Create separate methods to handle boost enable/disable
>       (thermal_boost_{enable|disable}) operations
>     - Boost is disabled at any trip point passage (not only the non critical one)
>     - Add stub definitions for cpufreq boost functions used when
>       CONFIG_CPU_FREQ is NOT defined.
> 
> Changes for v5:
>     - Move boost disable code from cpu_cooling.c to thermal_core.c
>       (to handle_non_critical_trips)
>     - Extent struct thermal_zone_device by adding overheated bool flag
>     - Implement auto enable of boost after device cools down
>     - Introduce boost_polling flag, which indicates if thermal uses it's predefined
>       pool delay or has woken up thermal workqueue only to wait until device
>       cools down.
> 
> Changes for v4:
>     - New patch
> 
>  drivers/thermal/samsung/exynos_tmu_data.c |   12 ++++++------
>  1 file changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/thermal/samsung/exynos_tmu_data.c b/drivers/thermal/samsung/exynos_tmu_data.c
> index 073c292..476b768 100644
> --- a/drivers/thermal/samsung/exynos_tmu_data.c
> +++ b/drivers/thermal/samsung/exynos_tmu_data.c
> @@ -131,8 +131,8 @@ static const struct exynos_tmu_registers exynos4412_tmu_registers = {
>  
>  #define EXYNOS4412_TMU_DATA \
>  	.threshold_falling = 10, \
> -	.trigger_levels[0] = 85, \
> -	.trigger_levels[1] = 103, \
> +	.trigger_levels[0] = 70, \
> +	.trigger_levels[1] = 95, \
>  	.trigger_levels[2] = 110, \
>  	.trigger_levels[3] = 120, \
>  	.trigger_enable[0] = true, \
> @@ -155,12 +155,12 @@ static const struct exynos_tmu_registers exynos4412_tmu_registers = {
>  	.second_point_trim = 85, \
>  	.default_temp_offset = 50, \
>  	.freq_tab[0] = { \
> -		.freq_clip_max = 800 * 1000, \
> -		.temp_level = 85, \
> +		.freq_clip_max = 1400 * 1000, \
> +		.temp_level = 70, \
>  	}, \
>  	.freq_tab[1] = { \
> -		.freq_clip_max = 200 * 1000, \
> -		.temp_level = 103, \
> +		.freq_clip_max = 400 * 1000, \
> +		.temp_level = 95, \
>  	}, \
>  	.freq_tab_count = 2, \
>  	.registers = &exynos4412_tmu_registers, \



^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v12 0/7] cpufreq:boost: CPU Boost mode support
  2014-01-10  6:33       ` Zhang Rui
@ 2014-01-16  9:40         ` Lukasz Majewski
  2014-01-16 15:51           ` Rafael J. Wysocki
  0 siblings, 1 reply; 329+ messages in thread
From: Lukasz Majewski @ 2014-01-16  9:40 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Zhang Rui, Viresh Kumar, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Myungjoo Ham, durgadoss.r,
	linux-samsung-soc, rjw

Hi Rafael,

> On Wed, 2014-01-08 at 01:35 +0100, Rafael J. Wysocki wrote:
> > On Tuesday, January 07, 2014 07:58:24 AM Lukasz Majewski wrote:
> > > Hi Rafael,
> > 
> > Hi,
> > 
> > > > This patch series introduces support for CPU overclocking
> > > > technique called Boost.
> > > > 
> > > > It is a follow up of a LAB governor proposal. Boost is a LAB
> > > > component:
> > > > http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq
> > > > 
> > > > Boost unifies hardware based solution (e.g. Intel Nehalem) with
> > > > software oriented one (like the one done at Exynos).
> > > > For this reason cpufreq/freq_table code has been reorganized to
> > > > include common code.
> > > > 
> > > > Important design decisions:
> > > > - Boost related code is compiled-in unconditionally to cpufreq
> > > > core and disabled by default. The cpufreq_driver is
> > > > responsibile for setting boost_supported flag and providing
> > > > set_boost callback(if HW support is needed). For software
> > > > managed boost, special Kconfig flag - CONFIG_CPU_FREQ_BOOST_SW
> > > > has been defined. It will be selected only when a target
> > > > platform has thermal framework properly configured.
> > > > 
> > > > - struct cpufreq_driver has been extended with boost related
> > > > fields: -- boost_supported - when driver supports boosting
> > > >         -- boost_enabled - boost state
> > > >         -- set_boost - callback to function, which is necessary
> > > > to enable/disable boost
> > > > 
> > > > - Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost)
> > > > is visible _only_ when cpufreq driver supports Boost.
> > > > 
> > > > - No special spin_lock for Boost was created. The one from
> > > > cpufreq core was reused.
> > > > 
> > > > - The Boost code doesn't rely on any policy. When boost state is
> > > > changed, then the policy list is iterated and proper
> > > > adjustements are done.
> > > > 
> > > > - To improve safety level, the thermal framework is also
> > > > extended to disable software boosting, when thermal trip point
> > > > is reached. After cooling down the boost can be enabled again.
> > > > This emulates behaviour similar to HW managed boost (like x86)
> > > > 
> > > > Tested at HW:
> > > >        Exynos 4412 3.13-rc4 Linux
> > > >        Intel Core i7-3770 3.13-rc4 Linux
> > > > 
> > > > Above patches were posted on top of kernel_pm/bleeding-edge
> > > > (SHA1: bd0f3a5d9dce48a917ce1f1047534d79c725149)
> > > > 
> > > > Lukasz Majewski (7):
> > > >   cpufreq: Add boost frequency support in core
> > > >   cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with
> > > > common boost solution
> > > >   cpufreq:boost:Kconfig: Provide support for software managed
> > > > BOOST cpufreq:exynos:Extend Exynos cpufreq driver to support
> > > > boost framework
> > > >   Documentation:cpufreq:boost: Update BOOST documentation
> > > >   cpufreq:exynos4x12: Change L0 driver data to
> > > > CPUFREQ_BOOST_FREQ thermal:exynos:boost: Automatic
> > > > enable/disable of BOOST feature (at Exynos4412)
> > > > 
> > > >  Documentation/cpu-freq/boost.txt          |   26 +++----
> > > >  drivers/cpufreq/Kconfig                   |    4 +
> > > >  drivers/cpufreq/Kconfig.arm               |   15 ++++
> > > >  drivers/cpufreq/acpi-cpufreq.c            |   86
> > > > +++++++-------------- drivers/cpufreq/cpufreq.c
> > > > | 118 ++++++++++++++++++++++++++++-
> > > > drivers/cpufreq/exynos-cpufreq.c          |    3 +
> > > > drivers/cpufreq/exynos4x12-cpufreq.c      |    2 +-
> > > > drivers/cpufreq/freq_table.c              |   56 ++++++++++++--
> > > > drivers/thermal/samsung/exynos_tmu_data.c |   12 +--
> > > > include/linux/cpufreq.h                   |   24 ++++++ 10 files
> > > > changed, 261 insertions(+), 85 deletions(-)
> > > > 
> > > 
> > > A gentle ping about BOOST patches.
> > > 
> > > Its been already acked by Viresh and Eduardo.
> > > 
> > > It applies on kernel_pm/bleeding_edge SHA1:
> > > 4836deb72c5e2a9af0cb2129c1149783a26d99ab
> > 
> > It looks like Rui is still looking into this.
> > 
> > Rui, are you fine with this series?
> > 
> Yes, I'm okay with the thermal related parts of this patch set.
> 

Rafael, gentle reminder about BOOST patches ... :-)

> thanks,
> rui
> > Rafael
> > 
> 
> 


-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v12 0/7] cpufreq:boost: CPU Boost mode support
  2014-01-16  9:40         ` Lukasz Majewski
@ 2014-01-16 15:51           ` Rafael J. Wysocki
  2014-01-16 15:56             ` Lukasz Majewski
  0 siblings, 1 reply; 329+ messages in thread
From: Rafael J. Wysocki @ 2014-01-16 15:51 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Zhang Rui, Viresh Kumar, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Myungjoo Ham, durgadoss.r,
	linux-samsung-soc

On Thursday, January 16, 2014 10:40:08 AM Lukasz Majewski wrote:
> Hi Rafael,
> 
> > On Wed, 2014-01-08 at 01:35 +0100, Rafael J. Wysocki wrote:
> > > On Tuesday, January 07, 2014 07:58:24 AM Lukasz Majewski wrote:
> > > > Hi Rafael,
> > > 
> > > Hi,
> > > 
> > > > > This patch series introduces support for CPU overclocking
> > > > > technique called Boost.
> > > > > 
> > > > > It is a follow up of a LAB governor proposal. Boost is a LAB
> > > > > component:
> > > > > http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq
> > > > > 
> > > > > Boost unifies hardware based solution (e.g. Intel Nehalem) with
> > > > > software oriented one (like the one done at Exynos).
> > > > > For this reason cpufreq/freq_table code has been reorganized to
> > > > > include common code.
> > > > > 
> > > > > Important design decisions:
> > > > > - Boost related code is compiled-in unconditionally to cpufreq
> > > > > core and disabled by default. The cpufreq_driver is
> > > > > responsibile for setting boost_supported flag and providing
> > > > > set_boost callback(if HW support is needed). For software
> > > > > managed boost, special Kconfig flag - CONFIG_CPU_FREQ_BOOST_SW
> > > > > has been defined. It will be selected only when a target
> > > > > platform has thermal framework properly configured.
> > > > > 
> > > > > - struct cpufreq_driver has been extended with boost related
> > > > > fields: -- boost_supported - when driver supports boosting
> > > > >         -- boost_enabled - boost state
> > > > >         -- set_boost - callback to function, which is necessary
> > > > > to enable/disable boost
> > > > > 
> > > > > - Boost sysfs attribute (/sys/devices/system/cpu/cpufreq/boost)
> > > > > is visible _only_ when cpufreq driver supports Boost.
> > > > > 
> > > > > - No special spin_lock for Boost was created. The one from
> > > > > cpufreq core was reused.
> > > > > 
> > > > > - The Boost code doesn't rely on any policy. When boost state is
> > > > > changed, then the policy list is iterated and proper
> > > > > adjustements are done.
> > > > > 
> > > > > - To improve safety level, the thermal framework is also
> > > > > extended to disable software boosting, when thermal trip point
> > > > > is reached. After cooling down the boost can be enabled again.
> > > > > This emulates behaviour similar to HW managed boost (like x86)
> > > > > 
> > > > > Tested at HW:
> > > > >        Exynos 4412 3.13-rc4 Linux
> > > > >        Intel Core i7-3770 3.13-rc4 Linux
> > > > > 
> > > > > Above patches were posted on top of kernel_pm/bleeding-edge
> > > > > (SHA1: bd0f3a5d9dce48a917ce1f1047534d79c725149)
> > > > > 
> > > > > Lukasz Majewski (7):
> > > > >   cpufreq: Add boost frequency support in core
> > > > >   cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with
> > > > > common boost solution
> > > > >   cpufreq:boost:Kconfig: Provide support for software managed
> > > > > BOOST cpufreq:exynos:Extend Exynos cpufreq driver to support
> > > > > boost framework
> > > > >   Documentation:cpufreq:boost: Update BOOST documentation
> > > > >   cpufreq:exynos4x12: Change L0 driver data to
> > > > > CPUFREQ_BOOST_FREQ thermal:exynos:boost: Automatic
> > > > > enable/disable of BOOST feature (at Exynos4412)
> > > > > 
> > > > >  Documentation/cpu-freq/boost.txt          |   26 +++----
> > > > >  drivers/cpufreq/Kconfig                   |    4 +
> > > > >  drivers/cpufreq/Kconfig.arm               |   15 ++++
> > > > >  drivers/cpufreq/acpi-cpufreq.c            |   86
> > > > > +++++++-------------- drivers/cpufreq/cpufreq.c
> > > > > | 118 ++++++++++++++++++++++++++++-
> > > > > drivers/cpufreq/exynos-cpufreq.c          |    3 +
> > > > > drivers/cpufreq/exynos4x12-cpufreq.c      |    2 +-
> > > > > drivers/cpufreq/freq_table.c              |   56 ++++++++++++--
> > > > > drivers/thermal/samsung/exynos_tmu_data.c |   12 +--
> > > > > include/linux/cpufreq.h                   |   24 ++++++ 10 files
> > > > > changed, 261 insertions(+), 85 deletions(-)
> > > > > 
> > > > 
> > > > A gentle ping about BOOST patches.
> > > > 
> > > > Its been already acked by Viresh and Eduardo.
> > > > 
> > > > It applies on kernel_pm/bleeding_edge SHA1:
> > > > 4836deb72c5e2a9af0cb2129c1149783a26d99ab
> > > 
> > > It looks like Rui is still looking into this.
> > > 
> > > Rui, are you fine with this series?
> > > 
> > Yes, I'm okay with the thermal related parts of this patch set.
> > 
> 
> Rafael, gentle reminder about BOOST patches ... :-)

I'm about to take them for 3.14.

Thanks!

[PS: Please don't use the rjw@sisk.pl address, that domain is gone.]

-- 
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.

^ permalink raw reply	[flat|nested] 329+ messages in thread

* Re: [PATCH v12 0/7] cpufreq:boost: CPU Boost mode support
  2014-01-16 15:51           ` Rafael J. Wysocki
@ 2014-01-16 15:56             ` Lukasz Majewski
  0 siblings, 0 replies; 329+ messages in thread
From: Lukasz Majewski @ 2014-01-16 15:56 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Zhang Rui, Viresh Kumar, Eduardo Valentin, cpufreq,
	Linux PM list, Jonghwa Lee, Lukasz Majewski, linux-kernel,
	Bartlomiej Zolnierkiewicz, Myungjoo Ham, durgadoss.r,
	linux-samsung-soc

Hi Rafael,

> On Thursday, January 16, 2014 10:40:08 AM Lukasz Majewski wrote:
> > Hi Rafael,
> > 
> > > On Wed, 2014-01-08 at 01:35 +0100, Rafael J. Wysocki wrote:
> > > > On Tuesday, January 07, 2014 07:58:24 AM Lukasz Majewski wrote:
> > > > > Hi Rafael,
> > > > 
> > > > Hi,
> > > > 
> > > > > > This patch series introduces support for CPU overclocking
> > > > > > technique called Boost.
> > > > > > 
> > > > > > It is a follow up of a LAB governor proposal. Boost is a LAB
> > > > > > component:
> > > > > > http://thread.gmane.org/gmane.linux.kernel/1484746/match=cpufreq
> > > > > > 
> > > > > > Boost unifies hardware based solution (e.g. Intel Nehalem)
> > > > > > with software oriented one (like the one done at Exynos).
> > > > > > For this reason cpufreq/freq_table code has been
> > > > > > reorganized to include common code.
> > > > > > 
> > > > > > Important design decisions:
> > > > > > - Boost related code is compiled-in unconditionally to
> > > > > > cpufreq core and disabled by default. The cpufreq_driver is
> > > > > > responsibile for setting boost_supported flag and providing
> > > > > > set_boost callback(if HW support is needed). For software
> > > > > > managed boost, special Kconfig flag -
> > > > > > CONFIG_CPU_FREQ_BOOST_SW has been defined. It will be
> > > > > > selected only when a target platform has thermal framework
> > > > > > properly configured.
> > > > > > 
> > > > > > - struct cpufreq_driver has been extended with boost related
> > > > > > fields: -- boost_supported - when driver supports boosting
> > > > > >         -- boost_enabled - boost state
> > > > > >         -- set_boost - callback to function, which is
> > > > > > necessary to enable/disable boost
> > > > > > 
> > > > > > - Boost sysfs attribute
> > > > > > (/sys/devices/system/cpu/cpufreq/boost) is visible _only_
> > > > > > when cpufreq driver supports Boost.
> > > > > > 
> > > > > > - No special spin_lock for Boost was created. The one from
> > > > > > cpufreq core was reused.
> > > > > > 
> > > > > > - The Boost code doesn't rely on any policy. When boost
> > > > > > state is changed, then the policy list is iterated and
> > > > > > proper adjustements are done.
> > > > > > 
> > > > > > - To improve safety level, the thermal framework is also
> > > > > > extended to disable software boosting, when thermal trip
> > > > > > point is reached. After cooling down the boost can be
> > > > > > enabled again. This emulates behaviour similar to HW
> > > > > > managed boost (like x86)
> > > > > > 
> > > > > > Tested at HW:
> > > > > >        Exynos 4412 3.13-rc4 Linux
> > > > > >        Intel Core i7-3770 3.13-rc4 Linux
> > > > > > 
> > > > > > Above patches were posted on top of kernel_pm/bleeding-edge
> > > > > > (SHA1: bd0f3a5d9dce48a917ce1f1047534d79c725149)
> > > > > > 
> > > > > > Lukasz Majewski (7):
> > > > > >   cpufreq: Add boost frequency support in core
> > > > > >   cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work
> > > > > > with common boost solution
> > > > > >   cpufreq:boost:Kconfig: Provide support for software
> > > > > > managed BOOST cpufreq:exynos:Extend Exynos cpufreq driver
> > > > > > to support boost framework
> > > > > >   Documentation:cpufreq:boost: Update BOOST documentation
> > > > > >   cpufreq:exynos4x12: Change L0 driver data to
> > > > > > CPUFREQ_BOOST_FREQ thermal:exynos:boost: Automatic
> > > > > > enable/disable of BOOST feature (at Exynos4412)
> > > > > > 
> > > > > >  Documentation/cpu-freq/boost.txt          |   26 +++----
> > > > > >  drivers/cpufreq/Kconfig                   |    4 +
> > > > > >  drivers/cpufreq/Kconfig.arm               |   15 ++++
> > > > > >  drivers/cpufreq/acpi-cpufreq.c            |   86
> > > > > > +++++++-------------- drivers/cpufreq/cpufreq.c
> > > > > > | 118 ++++++++++++++++++++++++++++-
> > > > > > drivers/cpufreq/exynos-cpufreq.c          |    3 +
> > > > > > drivers/cpufreq/exynos4x12-cpufreq.c      |    2 +-
> > > > > > drivers/cpufreq/freq_table.c              |   56
> > > > > > ++++++++++++-- drivers/thermal/samsung/exynos_tmu_data.c
> > > > > > |   12 +-- include/linux/cpufreq.h                   |   24
> > > > > > ++++++ 10 files changed, 261 insertions(+), 85 deletions(-)
> > > > > > 
> > > > > 
> > > > > A gentle ping about BOOST patches.
> > > > > 
> > > > > Its been already acked by Viresh and Eduardo.
> > > > > 
> > > > > It applies on kernel_pm/bleeding_edge SHA1:
> > > > > 4836deb72c5e2a9af0cb2129c1149783a26d99ab
> > > > 
> > > > It looks like Rui is still looking into this.
> > > > 
> > > > Rui, are you fine with this series?
> > > > 
> > > Yes, I'm okay with the thermal related parts of this patch set.
> > > 
> > 
> > Rafael, gentle reminder about BOOST patches ... :-)
> 
> I'm about to take them for 3.14.
> 

Thanks :-)

> Thanks!
> 
> [PS: Please don't use the rjw@sisk.pl address, that domain is gone.]
> 

Ok, I will not use it.

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 329+ messages in thread

end of thread, other threads:[~2014-01-16 15:56 UTC | newest]

Thread overview: 329+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-06-06  7:07 [PATCH 0/5] cpufreq:boost: CPU Boost mode support Lukasz Majewski
2013-06-06  7:07 ` [PATCH 1/5] cpufreq: Define cpufreq_set_drv_attr_files() to add per CPU sysfs attributes Lukasz Majewski
2013-06-06  8:27   ` Viresh Kumar
2013-06-06  8:58     ` Lukasz Majewski
2013-06-06  9:00       ` Viresh Kumar
2013-06-06  9:16         ` Lukasz Majewski
2013-06-06  7:07 ` [PATCH 2/5] cpufreq:boost: Add support for software based CPU frequency boost Lukasz Majewski
2013-06-06 10:53   ` Viresh Kumar
2013-06-06 11:49     ` Lukasz Majewski
2013-06-06 15:46       ` Viresh Kumar
2013-06-07 13:27         ` Lukasz Majewski
2013-06-07 14:13           ` Viresh Kumar
2013-06-07 14:34             ` Lukasz Majewski
2013-06-07 14:44               ` Viresh Kumar
2013-06-07 14:43         ` Lukasz Majewski
2013-06-06  7:07 ` [PATCH 3/5] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
2013-06-06  7:07 ` [PATCH 4/5] cpufreq:exynos:Extend exynos cpufreq driver to support boost Lukasz Majewski
2013-06-06  7:07 ` [PATCH 5/5] cpufreq:boost:Kconfig: Enable boost support at Kconfig Lukasz Majewski
2013-06-06 14:49   ` Dave Jones
2013-06-06 15:14     ` Lukasz Majewski
2013-06-06 15:21       ` Dave Jones
2013-06-06 15:48         ` Viresh Kumar
2013-06-06 15:58   ` Borislav Petkov
2013-06-10 13:20     ` Lukasz Majewski
2013-06-10 13:22       ` Viresh Kumar
2013-06-10 13:42         ` Lukasz Majewski
2013-06-11  9:03 ` [PATCH v2 0/3] cpufreq:boost: CPU Boost mode support Lukasz Majewski
2013-06-11  9:03   ` [PATCH v2 1/3] cpufreq:boost: CPU frequency boost code unification for software and hardware solutions Lukasz Majewski
2013-06-12  5:09     ` Viresh Kumar
2013-06-12  7:39       ` Lukasz Majewski
2013-06-12  8:09         ` Viresh Kumar
2013-06-12  9:09           ` Lukasz Majewski
2013-06-12  9:25             ` Viresh Kumar
2013-06-12 12:30               ` Lukasz Majewski
2013-06-12 11:23         ` Rafael J. Wysocki
2013-06-12 11:40           ` Lukasz Majewski
2013-06-11  9:03   ` [PATCH v2 2/3] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
2013-06-11  9:03   ` [PATCH v2 3/3] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
2013-06-26 11:05     ` Viresh Kumar
2013-06-26 13:58       ` Lukasz Majewski
2013-06-27  4:02         ` Viresh Kumar
2013-06-27  6:31           ` Lukasz Majewski
2013-06-12  5:15   ` [PATCH v2 0/3] cpufreq:boost: CPU Boost mode support Viresh Kumar
2013-06-12  6:00     ` Lukasz Majewski
2013-06-12  6:05       ` Viresh Kumar
2013-06-14  7:38 ` [PATCH v3 " Lukasz Majewski
2013-06-14  7:38   ` [PATCH v3 1/3] cpufreq: Add boost frequency support in core Lukasz Majewski
2013-06-17  5:43     ` Viresh Kumar
2013-06-17  7:15       ` Lukasz Majewski
2013-06-17  7:43         ` Viresh Kumar
2013-06-17  9:08           ` Lukasz Majewski
2013-06-17  9:18             ` Viresh Kumar
2013-06-17  9:18               ` Viresh Kumar
2013-06-17  9:58               ` Lukasz Majewski
2013-06-17  9:58                 ` Lukasz Majewski
2013-06-17 13:10                 ` Viresh Kumar
2013-06-17 13:51                   ` Lukasz Majewski
2013-06-18  6:42                     ` Viresh Kumar
2013-06-18  8:24                       ` Lukasz Majewski
2013-06-18  8:40                         ` Viresh Kumar
2013-06-18  9:12                           ` Lukasz Majewski
2013-06-18 13:26                       ` Rafael J. Wysocki
2013-06-18 13:44                         ` Lukasz Majewski
2013-06-19  7:16                           ` Lukasz Majewski
2013-06-20  5:11                             ` Viresh Kumar
2013-06-20  6:41                               ` Lukasz Majewski
2013-06-20  5:05                           ` Viresh Kumar
2013-06-20  5:01                         ` Viresh Kumar
2013-06-20 10:04                           ` Lukasz Majewski
2013-06-14  7:38   ` [PATCH v3 2/3] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
2013-06-14  7:39   ` [PATCH v3 3/3] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
2013-06-17  3:20   ` [PATCH v3 0/3] cpufreq:boost: CPU Boost mode support Viresh Kumar
2013-06-17  5:41     ` Lukasz Majewski
2013-06-19 17:12 ` [PATCH v4 0/7] " Lukasz Majewski
2013-06-19 17:12   ` [PATCH v4 1/7] cpufreq: Store cpufreq policies in a list Lukasz Majewski
2013-06-26 10:35     ` Viresh Kumar
2013-06-26 10:54       ` Lukasz Majewski
2013-06-26 10:56         ` Viresh Kumar
2013-06-26 11:04           ` Lukasz Majewski
2013-06-26 11:08             ` Viresh Kumar
2013-06-26 12:15               ` Lukasz Majewski
2013-06-19 17:12   ` [PATCH v4 2/7] cpufreq: Add boost frequency support in core Lukasz Majewski
2013-06-19 17:48     ` Dirk Brandewie
2013-06-19 20:31       ` Lukasz Majewski
2013-06-19 22:25         ` Rafael J. Wysocki
2013-07-17  7:58           ` Viresh Kumar
2013-07-17 11:31             ` Rafael J. Wysocki
2013-07-17 13:01               ` Viresh Kumar
2013-07-17 14:59                 ` Lukasz Majewski
2013-07-18  7:51                   ` Viresh Kumar
2013-06-20  5:13     ` Viresh Kumar
2013-06-20 20:03       ` Rafael J. Wysocki
2013-06-21  6:23         ` Lukasz Majewski
2013-06-26 10:54     ` Viresh Kumar
2013-06-26 12:54       ` Lukasz Majewski
2013-06-26 14:02         ` Lukasz Majewski
2013-06-27  9:02         ` Viresh Kumar
2013-06-27  9:48           ` Lukasz Majewski
2013-06-27 10:25             ` Viresh Kumar
2013-06-27 11:07               ` Lukasz Majewski
2013-06-27 15:55       ` Lukasz Majewski
2013-06-28  3:40         ` Viresh Kumar
2013-06-28  6:49           ` Lukasz Majewski
2013-06-28  6:51             ` Viresh Kumar
2013-06-28  7:31               ` Lukasz Majewski
2013-06-19 17:12   ` [PATCH v4 3/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
2013-06-26 11:03     ` Viresh Kumar
2013-06-26 12:17       ` Lukasz Majewski
2013-06-19 17:12   ` [PATCH v4 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
2013-06-27  8:58     ` Viresh Kumar
2013-06-27  9:08       ` Lukasz Majewski
2013-06-19 17:12   ` [PATCH v4 5/7] cpufreq: Calculate number of busy CPUs Lukasz Majewski
2013-06-19 18:01     ` Dirk Brandewie
2013-06-19 20:58       ` Lukasz Majewski
2013-06-19 22:26         ` Rafael J. Wysocki
2013-06-27  9:36     ` Viresh Kumar
2013-06-27 10:58       ` Lukasz Majewski
2013-06-27 11:16         ` Viresh Kumar
2013-06-27 14:42           ` Lukasz Majewski
2013-06-28  3:50             ` Viresh Kumar
2013-06-28  6:54               ` Lukasz Majewski
2013-07-01  8:15                 ` Lukasz Majewski
2013-07-04  5:06                   ` Viresh Kumar
2013-07-04  5:43                     ` Lukasz Majewski
2013-07-04  6:28                       ` Viresh Kumar
2013-07-04  6:49                         ` Lukasz Majewski
2013-07-04 12:50                     ` Rafael J. Wysocki
2013-06-19 17:12   ` [PATCH v4 6/7] cpufreq: Enable software boost only when up to one busy core is running Lukasz Majewski
2013-06-19 17:12   ` [PATCH v4 7/7] thermal:boost: Disable boost when trip point is reached Lukasz Majewski
2013-06-26  7:48   ` [PATCH v4 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
2013-06-26  7:52     ` Viresh Kumar
2013-07-04  8:50 ` [PATCH v5 " Lukasz Majewski
2013-07-04  8:50   ` [PATCH v5 1/7] cpufreq: Store cpufreq policies in a list Lukasz Majewski
2013-07-16  8:51     ` Viresh Kumar
2013-07-16  9:39       ` Lukasz Majewski
2013-07-04  8:50   ` [PATCH v5 2/7] cpufreq: Add boost frequency support in core Lukasz Majewski
2013-07-16  9:41     ` Viresh Kumar
2013-07-16 12:06       ` Lukasz Majewski
2013-07-17  5:28         ` Viresh Kumar
2013-07-17  7:00           ` Lukasz Majewski
2013-07-04  8:50   ` [PATCH v5 3/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
2013-07-16 10:04     ` Viresh Kumar
2013-07-16 11:17       ` Lukasz Majewski
2013-07-04  8:50   ` [PATCH v5 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
2013-07-16  9:48     ` Viresh Kumar
2013-07-16 10:58       ` Lukasz Majewski
2013-07-04  8:50   ` [PATCH v5 5/7] thermal:boost: Automatic enable/disable of BOOST feature Lukasz Majewski
2013-07-04 17:19     ` R, Durgadoss
2013-07-04 20:58       ` Lukasz Majewski
2013-07-05  5:31         ` R, Durgadoss
2013-07-05  6:43           ` Lukasz Majewski
2013-07-11  8:08     ` Lukasz Majewski
2013-07-16  7:28       ` Lukasz Majewski
2013-07-04  8:50   ` [PATCH v5 6/7] cpufreq:boost:Kconfig: Enable software managed BOOST support at Kconfig Lukasz Majewski
2013-07-16  9:58     ` Viresh Kumar
2013-07-16 11:50       ` Lukasz Majewski
2013-07-17  5:24         ` Viresh Kumar
2013-07-17  7:17           ` Lukasz Majewski
2013-07-17  7:52             ` Viresh Kumar
2013-07-17  8:12               ` Lukasz Majewski
2013-07-17  8:29                 ` Viresh Kumar
2013-07-17  9:11                   ` Lukasz Majewski
2013-07-04  8:50   ` [PATCH v5 7/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
2013-07-16 10:01     ` Viresh Kumar
2013-07-16 11:33       ` Lukasz Majewski
2013-07-17  5:22         ` Viresh Kumar
2013-07-17  7:36           ` Lukasz Majewski
2013-07-17  7:59             ` Viresh Kumar
2013-07-17  8:13               ` Lukasz Majewski
2013-07-09  7:02   ` [PATCH v5 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
2013-07-09  7:04     ` Viresh Kumar
2013-07-16  7:26     ` Lukasz Majewski
2013-07-16  8:46       ` Viresh Kumar
2013-07-16  9:09         ` Lukasz Majewski
2013-07-25 16:33 ` [PATCH v6 0/8] " Lukasz Majewski
2013-07-25 16:33   ` [PATCH v6 1/8] cpufreq: Store cpufreq policies in a list Lukasz Majewski
2013-07-26 10:14     ` Viresh Kumar
2013-07-26 10:58       ` Lukasz Majewski
2013-07-26 11:02         ` Viresh Kumar
2013-07-26 12:46           ` Lukasz Majewski
2013-07-29  7:03             ` Viresh Kumar
2013-07-25 16:33   ` [PATCH v6 2/8] cpufreq: Add boost frequency support in core Lukasz Majewski
2013-07-26  7:17     ` Viresh Kumar
2013-07-26  8:33       ` Lukasz Majewski
2013-07-26  9:33         ` Viresh Kumar
2013-07-26 10:10           ` Lukasz Majewski
2013-07-26  9:36         ` Viresh Kumar
2013-07-26 10:11           ` Lukasz Majewski
2013-08-12  9:07           ` Lukasz Majewski
2013-08-12  9:10             ` Viresh Kumar
2013-07-26 12:36         ` Rafael J. Wysocki
2013-07-26 13:08           ` Lukasz Majewski
2013-07-25 16:33   ` [PATCH v6 3/8] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
2013-07-26  7:28     ` Viresh Kumar
2013-07-26  8:09       ` Lukasz Majewski
2013-07-26  9:24         ` Viresh Kumar
2013-07-26  9:44           ` Lukasz Majewski
2013-08-12  9:12           ` Lukasz Majewski
2013-08-12  9:14             ` Viresh Kumar
2013-07-25 16:33   ` [PATCH v6 4/8] thermal:boost: Automatic enable/disable of BOOST feature Lukasz Majewski
2013-08-12  9:17     ` Lukasz Majewski
2013-07-25 16:33   ` [PATCH v6 5/8] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
2013-07-26 10:24     ` Viresh Kumar
2013-07-26 11:21       ` Lukasz Majewski
2013-07-29  6:58         ` Viresh Kumar
2013-08-12 10:26           ` Lukasz Majewski
2013-08-12 10:28             ` Viresh Kumar
2013-08-12 10:50               ` Lukasz Majewski
2013-07-25 16:33   ` [PATCH v6 6/8] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
2013-07-26 10:26     ` Viresh Kumar
2013-07-26 11:26       ` Lukasz Majewski
2013-07-29  7:01         ` Viresh Kumar
2013-08-12  9:52       ` Lukasz Majewski
2013-07-25 16:33   ` [PATCH v6 7/8] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
2013-07-25 16:33   ` [PATCH v6 8/8] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
2013-07-26 10:28   ` [PATCH v6 0/8] cpufreq:boost: CPU Boost mode support Viresh Kumar
2013-08-13 10:08 ` [PATCH v7 0/7] " Lukasz Majewski
2013-08-13 10:08   ` [PATCH v7 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
2013-08-26  5:28     ` Viresh Kumar
2013-08-26  7:02       ` Lukasz Majewski
2013-08-26  7:06         ` Viresh Kumar
2013-08-26  7:11           ` Lukasz Majewski
2013-08-26 13:12             ` Rafael J. Wysocki
2013-08-26 14:00               ` Viresh Kumar
2013-08-26 14:46                 ` Lukasz Majewski
2013-08-13 10:08   ` [PATCH v7 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
2013-08-26  5:32     ` Viresh Kumar
2013-08-13 10:08   ` [PATCH v7 3/7] thermal:boost: Automatic enable/disable of BOOST feature Lukasz Majewski
2013-08-26  5:33     ` Viresh Kumar
2013-08-26  6:50       ` Lukasz Majewski
2013-08-13 10:08   ` [PATCH v7 4/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
2013-08-26  5:35     ` Viresh Kumar
2013-08-13 10:08   ` [PATCH v7 5/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
2013-08-26  5:36     ` Viresh Kumar
2013-08-13 10:08   ` [PATCH v7 6/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
2013-08-26  5:36     ` Viresh Kumar
2013-08-13 10:08   ` [PATCH v7 7/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
2013-08-26  5:37     ` Viresh Kumar
2013-08-19  6:38   ` [PATCH v7 0/7] cpufreq:boost: CPU Boost mode support Viresh Kumar
2013-08-19  6:50     ` Lukasz Majewski
2013-08-19 23:29       ` Rafael J. Wysocki
2013-08-20  8:11         ` Lukasz Majewski
2013-08-20 12:32           ` Rafael J. Wysocki
2013-08-26 15:50 ` [PATCH v8 " Lukasz Majewski
2013-08-26 15:50   ` [PATCH v8 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
2013-08-26 15:50   ` [PATCH v8 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
2013-08-26 15:50   ` [PATCH v8 3/7] thermal:boost: Automatic enable/disable of BOOST feature Lukasz Majewski
2013-08-26 15:50   ` [PATCH v8 4/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
2013-08-26 15:50   ` [PATCH v8 5/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
2013-08-26 15:50   ` [PATCH v8 6/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
2013-08-26 15:50   ` [PATCH v8 7/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
2013-09-20 16:00 ` [PATCH RESEND v8 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
2013-09-20 16:00   ` [PATCH RESEND v8 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
2013-09-20 16:00   ` [PATCH RESEND v8 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
2013-09-20 16:01   ` [PATCH RESEND v8 3/7] thermal:boost: Automatic enable/disable of BOOST feature Lukasz Majewski
2013-09-20 16:01   ` [PATCH RESEND v8 4/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
2013-09-20 16:01   ` [PATCH RESEND v8 5/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
2013-09-20 16:01   ` [PATCH RESEND v8 6/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
2013-09-20 16:01   ` [PATCH RESEND v8 7/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
2013-10-14 12:17 ` [PATCH v9 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
2013-10-14 12:17   ` [PATCH v9 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
2013-10-14 12:17   ` [PATCH v9 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
2013-10-14 12:17   ` [PATCH v9 3/7] thermal:boost: Automatic enable/disable of BOOST feature Lukasz Majewski
2013-10-15  9:32     ` Zhang Rui
2013-10-15 15:43       ` Lukasz Majewski
2013-10-17 15:09         ` Zhang, Rui
2013-10-14 12:17   ` [PATCH v9 4/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
2013-10-14 12:17   ` [PATCH v9 5/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
2013-10-14 12:17   ` [PATCH v9 6/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
2013-10-14 12:17   ` [PATCH v9 7/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
2013-11-05 17:26 ` [PATCH v10 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
2013-11-05 17:26   ` [PATCH v10 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
2013-11-05 17:26   ` [PATCH v10 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
2013-11-05 17:26   ` [PATCH v10 3/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
2013-11-05 17:26   ` [PATCH v10 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
2013-11-05 17:26   ` [PATCH v10 5/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
2013-11-05 17:26   ` [PATCH v10 6/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
2013-11-05 17:26   ` [PATCH v10 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412) Lukasz Majewski
2013-11-28 13:05     ` Lukasz Majewski
2013-12-02 14:53     ` Eduardo Valentin
2013-12-02 14:53       ` Eduardo Valentin
2013-12-03  7:31       ` Lukasz Majewski
2013-12-03 12:36         ` Eduardo Valentin
2013-12-03 12:36           ` Eduardo Valentin
2013-12-03 15:42           ` Lukasz Majewski
2013-12-04 14:10             ` Eduardo Valentin
2013-12-04 14:10               ` Eduardo Valentin
2013-12-05 11:03               ` Lukasz Majewski
2013-12-05 13:25                 ` Eduardo Valentin
2013-12-05 13:25                   ` Eduardo Valentin
2013-12-06 14:03                   ` Lukasz Majewski
2013-12-02 12:19 ` [PATCH RESEND v10 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
2013-12-02 12:19   ` [PATCH RESEND v10 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
2013-12-02 12:19   ` [PATCH RESEND v10 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
2013-12-02 12:19   ` [PATCH RESEND v10 3/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
2013-12-02 12:19   ` [PATCH RESEND v10 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
2013-12-02 12:19   ` [PATCH RESEND v10 5/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
2013-12-02 12:19   ` [PATCH RESEND v10 6/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
2013-12-02 12:19   ` [PATCH RESEND v10 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412) Lukasz Majewski
2013-12-04  6:59   ` [PATCH RESEND v10 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
2013-12-04 14:12     ` Eduardo Valentin
2013-12-04 14:12       ` Eduardo Valentin
2013-12-09 10:04       ` Lukasz Majewski
2013-12-13 16:38 ` [PATCH v11 " Lukasz Majewski
2013-12-13 16:38   ` [PATCH v11 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
2013-12-13 16:38   ` [PATCH v11 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
2013-12-13 16:38   ` [PATCH v11 3/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
2013-12-13 16:38   ` [PATCH v11 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
2013-12-13 16:38   ` [PATCH v11 5/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
2013-12-13 16:38   ` [PATCH v11 6/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
2013-12-13 16:38   ` [PATCH v11 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412) Lukasz Majewski
2013-12-19 14:50     ` Eduardo Valentin
2013-12-19 14:50       ` Eduardo Valentin
2013-12-20 14:24 ` [PATCH v12 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
2013-12-20 14:24   ` [PATCH v12 1/7] cpufreq: Add boost frequency support in core Lukasz Majewski
2013-12-20 14:24   ` [PATCH v12 2/7] cpufreq:acpi:x86: Adjust the acpi-cpufreq.c code to work with common boost solution Lukasz Majewski
2013-12-20 14:24   ` [PATCH v12 3/7] cpufreq:boost:Kconfig: Provide support for software managed BOOST Lukasz Majewski
2013-12-20 14:24   ` [PATCH v12 4/7] cpufreq:exynos:Extend Exynos cpufreq driver to support boost framework Lukasz Majewski
2013-12-20 14:24   ` [PATCH v12 5/7] Documentation:cpufreq:boost: Update BOOST documentation Lukasz Majewski
2013-12-20 14:24   ` [PATCH v12 6/7] cpufreq:exynos4x12: Change L0 driver data to CPUFREQ_BOOST_FREQ Lukasz Majewski
2013-12-20 14:24   ` [PATCH v12 7/7] thermal:exynos:boost: Automatic enable/disable of BOOST feature (at Exynos4412) Lukasz Majewski
2014-01-10  6:35     ` Zhang Rui
2014-01-07  6:58   ` [PATCH v12 0/7] cpufreq:boost: CPU Boost mode support Lukasz Majewski
2014-01-08  0:35     ` Rafael J. Wysocki
2014-01-09  7:19       ` Lukasz Majewski
2014-01-10  6:33       ` Zhang Rui
2014-01-16  9:40         ` Lukasz Majewski
2014-01-16 15:51           ` Rafael J. Wysocki
2014-01-16 15:56             ` Lukasz Majewski

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.