diff options
Diffstat (limited to 'meta-eas/recipes-kernel/linux/linux-renesas/0023-Documentation-arm-define-DT-cpu-capacity-dmips-mhz-b.patch')
-rw-r--r-- | meta-eas/recipes-kernel/linux/linux-renesas/0023-Documentation-arm-define-DT-cpu-capacity-dmips-mhz-b.patch | 309 |
1 files changed, 309 insertions, 0 deletions
diff --git a/meta-eas/recipes-kernel/linux/linux-renesas/0023-Documentation-arm-define-DT-cpu-capacity-dmips-mhz-b.patch b/meta-eas/recipes-kernel/linux/linux-renesas/0023-Documentation-arm-define-DT-cpu-capacity-dmips-mhz-b.patch new file mode 100644 index 0000000..771327c --- /dev/null +++ b/meta-eas/recipes-kernel/linux/linux-renesas/0023-Documentation-arm-define-DT-cpu-capacity-dmips-mhz-b.patch @@ -0,0 +1,309 @@ +From 908654b226b9b67b12a5c07434cd1854d9a848e8 Mon Sep 17 00:00:00 2001 +From: Juri Lelli <juri.lelli@arm.com> +Date: Thu, 15 Oct 2015 14:49:00 +0100 +Subject: [PATCH 23/92] Documentation: arm: define DT cpu capacity-dmips-mhz + bindings + +ARM systems may be configured to have cpus with different power/performance +characteristics within the same chip. In this case, additional information +has to be made available to the kernel (the scheduler in particular) for it +to be aware of such differences and take decisions accordingly. + +Therefore, this patch aims at standardizing cpu capacities device tree +bindings for ARM platforms. Bindings define cpu capacity-dmips-mhz +parameter, to allow operating systems to retrieve such information from +the device tree and initialize related kernel structures, paving the way +for common code in the kernel to deal with heterogeneity. + +Cc: Rob Herring <robh+dt@kernel.org> +Cc: Pawel Moll <pawel.moll@arm.com> +Cc: Mark Rutland <mark.rutland@arm.com> +Cc: Ian Campbell <ijc+devicetree@hellion.org.uk> +Cc: Kumar Gala <galak@codeaurora.org> +Cc: Maxime Ripard <maxime.ripard@free-electrons.com> +Cc: Olof Johansson <olof@lixom.net> +Cc: Gregory CLEMENT <gregory.clement@free-electrons.com> +Cc: Paul Walmsley <paul@pwsan.com> +Cc: Linus Walleij <linus.walleij@linaro.org> +Cc: Chen-Yu Tsai <wens@csie.org> +Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> +Cc: devicetree@vger.kernel.org +Acked-by: Rob Herring <robh@kernel.org> +Acked-by: Vincent Guittot <vincent.guittot@linaro.org> +Signed-off-by: Juri Lelli <juri.lelli@arm.com> +--- + .../devicetree/bindings/arm/cpu-capacity.txt | 236 +++++++++++++++++++++ + Documentation/devicetree/bindings/arm/cpus.txt | 10 + + 2 files changed, 246 insertions(+) + create mode 100644 Documentation/devicetree/bindings/arm/cpu-capacity.txt + +diff --git a/Documentation/devicetree/bindings/arm/cpu-capacity.txt b/Documentation/devicetree/bindings/arm/cpu-capacity.txt +new file mode 100644 +index 0000000..7809fbe +--- /dev/null ++++ b/Documentation/devicetree/bindings/arm/cpu-capacity.txt +@@ -0,0 +1,236 @@ ++========================================== ++ARM CPUs capacity bindings ++========================================== ++ ++========================================== ++1 - Introduction ++========================================== ++ ++ARM systems may be configured to have cpus with different power/performance ++characteristics within the same chip. In this case, additional information has ++to be made available to the kernel for it to be aware of such differences and ++take decisions accordingly. ++ ++========================================== ++2 - CPU capacity definition ++========================================== ++ ++CPU capacity is a number that provides the scheduler information about CPUs ++heterogeneity. Such heterogeneity can come from micro-architectural differences ++(e.g., ARM big.LITTLE systems) or maximum frequency at which CPUs can run ++(e.g., SMP systems with multiple frequency domains). Heterogeneity in this ++context is about differing performance characteristics; this binding tries to ++capture a first-order approximation of the relative performance of CPUs. ++ ++CPU capacities are obtained by running a suitable benchmark. This binding makes ++no guarantees on the validity or suitability of any particular benchmark, the ++final capacity should, however, be: ++ ++* A "single-threaded" or CPU affine benchmark ++* Divided by the running frequency of the CPU executing the benchmark ++* Not subject to dynamic frequency scaling of the CPU ++ ++For the time being we however advise usage of the Dhrystone benchmark. What ++above thus becomes: ++ ++CPU capacities are obtained by running the Dhrystone benchmark on each CPU at ++max frequency (with caches enabled). The obtained DMIPS score is then divided ++by the frequency (in MHz) at which the benchmark has been run, so that ++DMIPS/MHz are obtained. Such values are then normalized w.r.t. the highest ++score obtained in the system. ++ ++========================================== ++3 - capacity-dmips-mhz ++========================================== ++ ++capacity-dmips-mhz is an optional cpu node [1] property: u32 value ++representing CPU capacity expressed in normalized DMIPS/MHz. At boot time, the ++maximum frequency available to the cpu is then used to calculate the capacity ++value internally used by the kernel. ++ ++capacity-dmips-mhz property is all-or-nothing: if it is specified for a cpu ++node, it has to be specified for every other cpu nodes, or the system will ++fall back to the default capacity value for every CPU. If cpufreq is not ++available, final capacities are calculated by directly using capacity-dmips- ++mhz values (normalized w.r.t. the highest value found while parsing the DT). ++ ++=========================================== ++4 - Examples ++=========================================== ++ ++Example 1 (ARM 64-bit, 6-cpu system, two clusters): ++capacities-dmips-mhz are scaled w.r.t. 1024 (cpu@0 and cpu@1) ++supposing cluster0@max-freq=1100 and custer1@max-freq=850, ++final capacities are 1024 for cluster0 and 446 for cluster1 ++ ++cpus { ++ #address-cells = <2>; ++ #size-cells = <0>; ++ ++ cpu-map { ++ cluster0 { ++ core0 { ++ cpu = <&A57_0>; ++ }; ++ core1 { ++ cpu = <&A57_1>; ++ }; ++ }; ++ ++ cluster1 { ++ core0 { ++ cpu = <&A53_0>; ++ }; ++ core1 { ++ cpu = <&A53_1>; ++ }; ++ core2 { ++ cpu = <&A53_2>; ++ }; ++ core3 { ++ cpu = <&A53_3>; ++ }; ++ }; ++ }; ++ ++ idle-states { ++ entry-method = "arm,psci"; ++ ++ CPU_SLEEP_0: cpu-sleep-0 { ++ compatible = "arm,idle-state"; ++ arm,psci-suspend-param = <0x0010000>; ++ local-timer-stop; ++ entry-latency-us = <100>; ++ exit-latency-us = <250>; ++ min-residency-us = <150>; ++ }; ++ ++ CLUSTER_SLEEP_0: cluster-sleep-0 { ++ compatible = "arm,idle-state"; ++ arm,psci-suspend-param = <0x1010000>; ++ local-timer-stop; ++ entry-latency-us = <800>; ++ exit-latency-us = <700>; ++ min-residency-us = <2500>; ++ }; ++ }; ++ ++ A57_0: cpu@0 { ++ compatible = "arm,cortex-a57","arm,armv8"; ++ reg = <0x0 0x0>; ++ device_type = "cpu"; ++ enable-method = "psci"; ++ next-level-cache = <&A57_L2>; ++ clocks = <&scpi_dvfs 0>; ++ cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; ++ capacity-dmips-mhz = <1024>; ++ }; ++ ++ A57_1: cpu@1 { ++ compatible = "arm,cortex-a57","arm,armv8"; ++ reg = <0x0 0x1>; ++ device_type = "cpu"; ++ enable-method = "psci"; ++ next-level-cache = <&A57_L2>; ++ clocks = <&scpi_dvfs 0>; ++ cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; ++ capacity-dmips-mhz = <1024>; ++ }; ++ ++ A53_0: cpu@100 { ++ compatible = "arm,cortex-a53","arm,armv8"; ++ reg = <0x0 0x100>; ++ device_type = "cpu"; ++ enable-method = "psci"; ++ next-level-cache = <&A53_L2>; ++ clocks = <&scpi_dvfs 1>; ++ cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; ++ capacity-dmips-mhz = <578>; ++ }; ++ ++ A53_1: cpu@101 { ++ compatible = "arm,cortex-a53","arm,armv8"; ++ reg = <0x0 0x101>; ++ device_type = "cpu"; ++ enable-method = "psci"; ++ next-level-cache = <&A53_L2>; ++ clocks = <&scpi_dvfs 1>; ++ cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; ++ capacity-dmips-mhz = <578>; ++ }; ++ ++ A53_2: cpu@102 { ++ compatible = "arm,cortex-a53","arm,armv8"; ++ reg = <0x0 0x102>; ++ device_type = "cpu"; ++ enable-method = "psci"; ++ next-level-cache = <&A53_L2>; ++ clocks = <&scpi_dvfs 1>; ++ cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; ++ capacity-dmips-mhz = <578>; ++ }; ++ ++ A53_3: cpu@103 { ++ compatible = "arm,cortex-a53","arm,armv8"; ++ reg = <0x0 0x103>; ++ device_type = "cpu"; ++ enable-method = "psci"; ++ next-level-cache = <&A53_L2>; ++ clocks = <&scpi_dvfs 1>; ++ cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; ++ capacity-dmips-mhz = <578>; ++ }; ++ ++ A57_L2: l2-cache0 { ++ compatible = "cache"; ++ }; ++ ++ A53_L2: l2-cache1 { ++ compatible = "cache"; ++ }; ++}; ++ ++Example 2 (ARM 32-bit, 4-cpu system, two clusters, ++ cpus 0,1@1GHz, cpus 2,3@500MHz): ++capacities-dmips-mhz are scaled w.r.t. 2 (cpu@0 and cpu@1), this means that first ++cpu@0 and cpu@1 are twice fast than cpu@2 and cpu@3 (at the same frequency) ++ ++cpus { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ cpu0: cpu@0 { ++ device_type = "cpu"; ++ compatible = "arm,cortex-a15"; ++ reg = <0>; ++ capacity-dmips-mhz = <2>; ++ }; ++ ++ cpu1: cpu@1 { ++ device_type = "cpu"; ++ compatible = "arm,cortex-a15"; ++ reg = <1>; ++ capacity-dmips-mhz = <2>; ++ }; ++ ++ cpu2: cpu@2 { ++ device_type = "cpu"; ++ compatible = "arm,cortex-a15"; ++ reg = <0x100>; ++ capacity-dmips-mhz = <1>; ++ }; ++ ++ cpu3: cpu@3 { ++ device_type = "cpu"; ++ compatible = "arm,cortex-a15"; ++ reg = <0x101>; ++ capacity-dmips-mhz = <1>; ++ }; ++}; ++ ++=========================================== ++5 - References ++=========================================== ++ ++[1] ARM Linux Kernel documentation - CPUs bindings ++ Documentation/devicetree/bindings/arm/cpus.txt +diff --git a/Documentation/devicetree/bindings/arm/cpus.txt b/Documentation/devicetree/bindings/arm/cpus.txt +index e6782d5..c1dcf4c 100644 +--- a/Documentation/devicetree/bindings/arm/cpus.txt ++++ b/Documentation/devicetree/bindings/arm/cpus.txt +@@ -241,6 +241,14 @@ nodes to be present and contain the properties described below. + # List of phandles to idle state nodes supported + by this cpu [3]. + ++ - capacity-dmips-mhz ++ Usage: Optional ++ Value type: <u32> ++ Definition: ++ # u32 value representing CPU capacity [3] in ++ DMIPS/MHz, relative to highest capacity-dmips-mhz ++ in the system. ++ + - rockchip,pmu + Usage: optional for systems that have an "enable-method" + property value of "rockchip,rk3066-smp" +@@ -464,3 +472,5 @@ cpus { + [2] arm/msm/qcom,kpss-acc.txt + [3] ARM Linux kernel documentation - idle states bindings + Documentation/devicetree/bindings/arm/idle-states.txt ++[3] ARM Linux kernel documentation - cpu capacity bindings ++ Documentation/devicetree/bindings/arm/cpu-capacity.txt +-- +1.9.1 + |