| # |
| # (C) COPYRIGHT 2017, 2019 ARM Limited. All rights reserved. |
| # |
| # This program is free software and is provided to you under the terms of the |
| # GNU General Public License version 2 as published by the Free Software |
| # Foundation, and any use by you of this program is subject to the terms |
| # of such GNU licence. |
| # |
| # This program is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with this program; if not, you can access it online at |
| # http://www.gnu.org/licenses/gpl-2.0.html. |
| # |
| # SPDX-License-Identifier: GPL-2.0 |
| # |
| # |
| |
| * ARM Mali Midgard OPP |
| |
| * OPP Table Node |
| |
| This describes the OPPs belonging to a device. This node can have following |
| properties: |
| |
| Required properties: |
| - compatible: Allow OPPs to express their compatibility. It should be: |
| "operating-points-v2", "operating-points-v2-mali". |
| |
| - OPP nodes: One or more OPP nodes describing voltage-current-frequency |
| combinations. Their name isn't significant but their phandle can be used to |
| reference an OPP. |
| |
| * OPP Node |
| |
| This defines voltage-current-frequency combinations along with other related |
| properties. |
| |
| Required properties: |
| - opp-hz: Nominal frequency in Hz, expressed as a 64-bit big-endian integer. |
| This should be treated as a relative performance measurement, taking both GPU |
| frequency and core mask into account. |
| |
| Optional properties: |
| - opp-hz-real: List of one or two real frequencies in Hz, expressed as 64-bit |
| big-endian integers. They shall correspond to the clocks declared under |
| the Mali device node, and follow the same order. |
| |
| - opp-core-mask: Shader core mask. If neither this or opp-core-count are present |
| then all shader cores will be used for this OPP. |
| |
| - opp-core-count: Number of cores to use for this OPP. If this is present then |
| the driver will build a core mask using the available core mask provided by |
| the GPU hardware. |
| |
| If neither this nor opp-core-mask are present then all shader cores will be |
| used for this OPP. |
| |
| If both this and opp-core-mask are present then opp-core-mask is ignored. |
| |
| - opp-microvolt: List of one or two voltages in micro Volts. They shall correspond |
| to the regulators declared under the Mali device node, and follow the order: |
| "toplevel", "shadercores". |
| |
| A single regulator's voltage is specified with an array of size one or three. |
| Single entry is for target voltage and three entries are for <target min max> |
| voltages. |
| |
| Entries for multiple regulators must be present in the same order as |
| regulators are specified in device's DT node. |
| |
| - opp-microvolt-<name>: Named opp-microvolt property. This is exactly similar to |
| the above opp-microvolt property, but allows multiple voltage ranges to be |
| provided for the same OPP. At runtime, the platform can pick a <name> and |
| matching opp-microvolt-<name> property will be enabled for all OPPs. If the |
| platform doesn't pick a specific <name> or the <name> doesn't match with any |
| opp-microvolt-<name> properties, then opp-microvolt property shall be used, if |
| present. |
| |
| - opp-microamp: The maximum current drawn by the device in microamperes |
| considering system specific parameters (such as transients, process, aging, |
| maximum operating temperature range etc.) as necessary. This may be used to |
| set the most efficient regulator operating mode. |
| |
| Should only be set if opp-microvolt is set for the OPP. |
| |
| Entries for multiple regulators must be present in the same order as |
| regulators are specified in device's DT node. If this property isn't required |
| for few regulators, then this should be marked as zero for them. If it isn't |
| required for any regulator, then this property need not be present. |
| |
| - opp-microamp-<name>: Named opp-microamp property. Similar to |
| opp-microvolt-<name> property, but for microamp instead. |
| |
| - clock-latency-ns: Specifies the maximum possible transition latency (in |
| nanoseconds) for switching to this OPP from any other OPP. |
| |
| - turbo-mode: Marks the OPP to be used only for turbo modes. Turbo mode is |
| available on some platforms, where the device can run over its operating |
| frequency for a short duration of time limited by the device's power, current |
| and thermal limits. |
| |
| - opp-suspend: Marks the OPP to be used during device suspend. Only one OPP in |
| the table should have this. |
| |
| - opp-mali-errata-1485982: Marks the OPP to be selected for suspend clock. |
| This will be effective only if MALI_HW_ERRATA_1485982_USE_CLOCK_ALTERNATIVE is |
| enabled. It needs to be placed in any OPP that has proper suspend clock for |
| the HW workaround. |
| |
| - opp-supported-hw: This enables us to select only a subset of OPPs from the |
| larger OPP table, based on what version of the hardware we are running on. We |
| still can't have multiple nodes with the same opp-hz value in OPP table. |
| |
| It's an user defined array containing a hierarchy of hardware version numbers, |
| supported by the OPP. For example: a platform with hierarchy of three levels |
| of versions (A, B and C), this field should be like <X Y Z>, where X |
| corresponds to Version hierarchy A, Y corresponds to version hierarchy B and Z |
| corresponds to version hierarchy C. |
| |
| Each level of hierarchy is represented by a 32 bit value, and so there can be |
| only 32 different supported version per hierarchy. i.e. 1 bit per version. A |
| value of 0xFFFFFFFF will enable the OPP for all versions for that hierarchy |
| level. And a value of 0x00000000 will disable the OPP completely, and so we |
| never want that to happen. |
| |
| If 32 values aren't sufficient for a version hierarchy, than that version |
| hierarchy can be contained in multiple 32 bit values. i.e. <X Y Z1 Z2> in the |
| above example, Z1 & Z2 refer to the version hierarchy Z. |
| |
| - status: Marks the node enabled/disabled. |
| |
| Example for a Juno with 1 clock and 1 regulator: |
| |
| gpu_opp_table: opp_table0 { |
| compatible = "operating-points-v2", "operating-points-v2-mali"; |
| |
| opp@112500000 { |
| opp-hz = /bits/ 64 <112500000>; |
| opp-hz-real = /bits/ 64 <450000000>; |
| opp-microvolt = <820000>; |
| opp-core-mask = /bits/ 64 <0x1>; |
| opp-suspend; |
| opp-mali-errata-1485982; |
| }; |
| opp@225000000 { |
| opp-hz = /bits/ 64 <225000000>; |
| opp-hz-real = /bits/ 64 <450000000>; |
| opp-microvolt = <820000>; |
| opp-core-count = <2>; |
| }; |
| opp@450000000 { |
| opp-hz = /bits/ 64 <450000000>; |
| opp-hz-real = /bits/ 64 <450000000>; |
| opp-microvolt = <820000>; |
| opp-core-mask = /bits/ 64 <0xf>; |
| }; |
| opp@487500000 { |
| opp-hz = /bits/ 64 <487500000>; |
| opp-microvolt = <825000>; |
| }; |
| opp@525000000 { |
| opp-hz = /bits/ 64 <525000000>; |
| opp-microvolt = <850000>; |
| }; |
| opp@562500000 { |
| opp-hz = /bits/ 64 <562500000>; |
| opp-microvolt = <875000>; |
| }; |
| opp@600000000 { |
| opp-hz = /bits/ 64 <600000000>; |
| opp-microvolt = <900000>; |
| }; |
| }; |
| |
| Example for a Juno with 2 clocks and 2 regulators: |
| |
| gpu_opp_table: opp_table0 { |
| compatible = "operating-points-v2", "operating-points-v2-mali"; |
| |
| opp@0 { |
| opp-hz = /bits/ 64 <50000000>; |
| opp-hz-real = /bits/ 64 <50000000>, /bits/ 64 <45000000>; |
| opp-microvolt = <820000>, <800000>; |
| opp-core-mask = /bits/ 64 <0xf>; |
| }; |
| opp@1 { |
| opp-hz = /bits/ 64 <40000000>; |
| opp-hz-real = /bits/ 64 <40000000>, /bits/ 64 <35000000>; |
| opp-microvolt = <720000>, <700000>; |
| opp-core-mask = /bits/ 64 <0x7>; |
| }; |
| opp@2 { |
| opp-hz = /bits/ 64 <30000000>; |
| opp-hz-real = /bits/ 64 <30000000>, /bits/ 64 <25000000>; |
| opp-microvolt = <620000>, <700000>; |
| opp-core-mask = /bits/ 64 <0x3>; |
| }; |
| }; |