diff options
Diffstat (limited to 'meta-eas/recipes-kernel/linux/linux-renesas/0032-arm64-add-sysfs-cpu_capacity-attribute.patch')
-rw-r--r-- | meta-eas/recipes-kernel/linux/linux-renesas/0032-arm64-add-sysfs-cpu_capacity-attribute.patch | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/meta-eas/recipes-kernel/linux/linux-renesas/0032-arm64-add-sysfs-cpu_capacity-attribute.patch b/meta-eas/recipes-kernel/linux/linux-renesas/0032-arm64-add-sysfs-cpu_capacity-attribute.patch new file mode 100644 index 0000000..83f9e38 --- /dev/null +++ b/meta-eas/recipes-kernel/linux/linux-renesas/0032-arm64-add-sysfs-cpu_capacity-attribute.patch @@ -0,0 +1,130 @@ +From 4454a804e1015b7699441e42d36dd8be8b0ee897 Mon Sep 17 00:00:00 2001 +From: Juri Lelli <juri.lelli@arm.com> +Date: Wed, 14 Oct 2015 12:02:05 +0100 +Subject: [PATCH 32/92] arm64: add sysfs cpu_capacity attribute + +Add a sysfs cpu_capacity attribute with which it is possible to read and +write (thus over-writing default values) CPUs capacity. This might be +useful in situations where values needs changing after boot. + +The new attribute shows up as: + + /sys/devices/system/cpu/cpu*/cpu_capacity + +Cc: Catalin Marinas <catalin.marinas@arm.com> +Cc: Will Deacon <will.deacon@arm.com> +Cc: Mark Brown <broonie@kernel.org> +Cc: Sudeep Holla <sudeep.holla@arm.com> +Signed-off-by: Juri Lelli <juri.lelli@arm.com> +--- + arch/arm64/kernel/topology.c | 73 ++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 73 insertions(+) + +diff --git a/arch/arm64/kernel/topology.c b/arch/arm64/kernel/topology.c +index b75b0ba..cff34cc 100644 +--- a/arch/arm64/kernel/topology.c ++++ b/arch/arm64/kernel/topology.c +@@ -26,6 +26,7 @@ + #include <asm/topology.h> + + static DEFINE_PER_CPU(unsigned long, cpu_scale) = SCHED_CAPACITY_SCALE; ++static DEFINE_MUTEX(cpu_scale_mutex); + + unsigned long arch_scale_cpu_capacity(struct sched_domain *sd, int cpu) + { +@@ -37,6 +38,76 @@ static void set_capacity_scale(unsigned int cpu, unsigned long capacity) + per_cpu(cpu_scale, cpu) = capacity; + } + ++#ifdef CONFIG_PROC_SYSCTL ++#include <asm/cpu.h> ++#include <linux/string.h> ++static ssize_t show_cpu_capacity(struct device *dev, ++ struct device_attribute *attr, ++ char *buf) ++{ ++ struct cpu *cpu = container_of(dev, struct cpu, dev); ++ ssize_t rc; ++ int cpunum = cpu->dev.id; ++ unsigned long capacity = arch_scale_cpu_capacity(NULL, cpunum); ++ ++ rc = sprintf(buf, "%lu\n", capacity); ++ ++ return rc; ++} ++ ++static ssize_t store_cpu_capacity(struct device *dev, ++ struct device_attribute *attr, ++ const char *buf, ++ size_t count) ++{ ++ struct cpu *cpu = container_of(dev, struct cpu, dev); ++ int this_cpu = cpu->dev.id, i; ++ unsigned long new_capacity; ++ ssize_t ret; ++ ++ if (count) { ++ char *p = (char *) buf; ++ ++ ret = kstrtoul(p, 0, &new_capacity); ++ if (ret) ++ return ret; ++ if (new_capacity > SCHED_CAPACITY_SCALE) ++ return -EINVAL; ++ ++ mutex_lock(&cpu_scale_mutex); ++ for_each_cpu(i, &cpu_topology[this_cpu].core_sibling) ++ set_capacity_scale(i, new_capacity); ++ mutex_unlock(&cpu_scale_mutex); ++ } ++ ++ return count; ++} ++ ++static DEVICE_ATTR(cpu_capacity, ++ 0644, ++ show_cpu_capacity, ++ store_cpu_capacity); ++ ++static int register_cpu_capacity_sysctl(void) ++{ ++ int i; ++ struct device *cpu; ++ ++ for_each_possible_cpu(i) { ++ cpu = get_cpu_device(i); ++ if (!cpu) { ++ pr_err("%s: too early to get CPU%d device!\n", ++ __func__, i); ++ continue; ++ } ++ device_create_file(cpu, &dev_attr_cpu_capacity); ++ } ++ ++ return 0; ++} ++late_initcall(register_cpu_capacity_sysctl); ++#endif ++ + static u32 capacity_scale; + static u32 *raw_capacity; + static bool cap_parsing_failed; +@@ -87,6 +158,7 @@ static void normalize_cpu_capacity(void) + return; + + pr_debug("cpu_capacity: capacity_scale=%u\n", capacity_scale); ++ mutex_lock(&cpu_scale_mutex); + for_each_possible_cpu(cpu) { + pr_debug("cpu_capacity: cpu=%d raw_capacity=%u\n", + cpu, raw_capacity[cpu]); +@@ -96,6 +168,7 @@ static void normalize_cpu_capacity(void) + pr_debug("cpu_capacity: CPU%d cpu_capacity=%lu\n", + cpu, arch_scale_cpu_capacity(NULL, cpu)); + } ++ mutex_unlock(&cpu_scale_mutex); + } + + #ifdef CONFIG_CPU_FREQ +-- +1.9.1 + |