summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavankumar Kondeti <pkondeti@codeaurora.org>2015-05-07 17:14:48 +0530
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 21:25:59 -0700
commit6c98c21f9e7253ba25b831bd13852e295b341cfa (patch)
treee7a2d445c52e86f542a5392f7673f7ce5d71bbf1
parent5796af4921425206827a6005412f43622cbfc0db (diff)
arm64: topology: Allow specifying the CPU efficiency from device tree
The efficiency of a CPU can vary across SoCs depending on the cache size, bus interconnect frequencies etc. Allow specifying this from the device tree. This value overrides the default values hardcoded in the efficiency table. Change-Id: Ie9ba69e11317e6eb6462630226355747d1def646 Signed-off-by: Pavankumar Kondeti <pkondeti@codeaurora.org>
-rw-r--r--Documentation/devicetree/bindings/arm/cpus.txt14
-rw-r--r--arch/arm64/kernel/topology.c30
2 files changed, 36 insertions, 8 deletions
diff --git a/Documentation/devicetree/bindings/arm/cpus.txt b/Documentation/devicetree/bindings/arm/cpus.txt
index 3a07a87fef20..71314d5ab0d8 100644
--- a/Documentation/devicetree/bindings/arm/cpus.txt
+++ b/Documentation/devicetree/bindings/arm/cpus.txt
@@ -212,6 +212,20 @@ nodes to be present and contain the properties described below.
property identifying a 64-bit zero-initialised
memory location.
+ - efficiency
+ Usage: optional.
+ Value type: <u32>
+ Definition:
+ # Specifies the CPU efficiency. The CPU efficiency is
+ a unit less number and it is intended to show relative
+ performance of CPUs when normalized for clock frequency
+ (instructions per cycle performance).
+
+ The efficiency of a CPU can vary across SoCs depending
+ on the cache size, bus interconnect frequencies etc.
+ This value overrides the default efficiency value
+ defined for the corresponding CPU architecture.
+
- qcom,saw
Usage: required for systems that have an "enable-method"
property value of "qcom,kpss-acc-v1" or
diff --git a/arch/arm64/kernel/topology.c b/arch/arm64/kernel/topology.c
index e562e0f43a42..67fc833a26af 100644
--- a/arch/arm64/kernel/topology.c
+++ b/arch/arm64/kernel/topology.c
@@ -278,6 +278,7 @@ static void __init parse_dt_cpu_power(void)
for_each_possible_cpu(cpu) {
const u32 *rate;
int len;
+ u32 efficiency;
/* Too early to use cpu->of_node */
cn = of_get_cpu_node(cpu, NULL);
@@ -286,16 +287,29 @@ static void __init parse_dt_cpu_power(void)
continue;
}
- for (cpu_eff = table_efficiency; cpu_eff->compatible; cpu_eff++)
- if (of_device_is_compatible(cn, cpu_eff->compatible))
- break;
+ /*
+ * The CPU efficiency value passed from the device tree
+ * overrides the value defined in the table_efficiency[]
+ */
+ if (of_property_read_u32(cn, "efficiency", &efficiency) < 0) {
- if (cpu_eff->compatible == NULL) {
- pr_warn("%s: Unknown CPU type\n", cn->full_name);
- continue;
+ for (cpu_eff = table_efficiency;
+ cpu_eff->compatible; cpu_eff++)
+
+ if (of_device_is_compatible(cn,
+ cpu_eff->compatible))
+ break;
+
+ if (cpu_eff->compatible == NULL) {
+ pr_warn("%s: Unknown CPU type\n",
+ cn->full_name);
+ continue;
+ }
+
+ efficiency = cpu_eff->efficiency;
}
- per_cpu(cpu_efficiency, cpu) = cpu_eff->efficiency;
+ per_cpu(cpu_efficiency, cpu) = efficiency;
rate = of_get_property(cn, "clock-frequency", &len);
if (!rate || len != 4) {
@@ -304,7 +318,7 @@ static void __init parse_dt_cpu_power(void)
continue;
}
- capacity = ((be32_to_cpup(rate)) >> 20) * cpu_eff->efficiency;
+ capacity = ((be32_to_cpup(rate)) >> 20) * efficiency;
/* Save min capacity of the system */
if (capacity < min_capacity)