linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v6 0/3] Add required-opps support to devfreq passive gov
@ 2021-02-04  8:14 Hsin-Yi Wang
  2021-02-04  8:14 ` [PATCH v6 1/3] OPP: Add function to look up required OPP's for a given OPP Hsin-Yi Wang
                   ` (3 more replies)
  0 siblings, 4 replies; 10+ messages in thread
From: Hsin-Yi Wang @ 2021-02-04  8:14 UTC (permalink / raw)
  To: Viresh Kumar, linux-pm
  Cc: Nishanth Menon, Stephen Boyd, Rafael J . Wysocki, linux-kernel,
	MyungJoo Ham, Kyungmin Park, Chanwoo Choi, Saravana Kannan

The devfreq passive governor scales the frequency of a "child" device based
on the current frequency of a "parent" device (not parent/child in the
sense of device hierarchy). As of today, the passive governor requires one
of the following to work correctly:
1. The parent and child device have the same number of frequencies
2. The child device driver passes a mapping function to translate from
   parent frequency to child frequency.

When (1) is not true, (2) is the only option right now. But often times,
all that is required is a simple mapping from parent's frequency to child's
frequency.

Since OPPs already support pointing to other "required-opps", add support
for using that to map from parent device frequency to child device
frequency. That way, every child device driver doesn't have to implement a
separate mapping function anytime (1) isn't true.

Some common (but not comprehensive) reason for needing a devfreq passive
governor to adjust the frequency of one device based on another are:

1. These were the combination of frequencies that were validated/screened
   during the manufacturing process.
2. These are the sensible performance combinations between two devices
   interacting with each other. So that when one runs fast the other
   doesn't become the bottleneck.
3. Hardware bugs requiring some kind of frequency ratio between devices.

For example, the following mapping can't be captured in DT as it stands
today because the parent and child device have different number of OPPs.
But with this patch series, this mapping can be captured cleanly.

In arch/arm64/boot/dts/exynos/exynos5433-bus.dtsi you have something
like this with the following changes:

        bus_g2d_400: bus0 {
                compatible = "samsung,exynos-bus";
                clocks = <&cmu_top CLK_ACLK_G2D_400>;
                clock-names = "bus";
                operating-points-v2 = <&bus_g2d_400_opp_table>;
                status = "disabled";
        };

        bus_noc2: bus9 {
                compatible = "samsung,exynos-bus";
                clocks = <&cmu_mif CLK_ACLK_BUS2_400>;
                clock-names = "bus";
                operating-points-v2 = <&bus_noc2_opp_table>;
                status = "disabled";
        };

        bus_g2d_400_opp_table: opp_table2 {
                compatible = "operating-points-v2";
                opp-shared;

                opp-400000000 {
                        opp-hz = /bits/ 64 <400000000>;
                        opp-microvolt = <1075000>;
                        required-opps = <&noc2_400>;
                };
                opp-267000000 {
                        opp-hz = /bits/ 64 <267000000>;
                        opp-microvolt = <1000000>;
                        required-opps = <&noc2_200>;
                };
                opp-200000000 {
                        opp-hz = /bits/ 64 <200000000>;
                        opp-microvolt = <975000>;
                        required-opps = <&noc2_200>;
                };
                opp-160000000 {
                        opp-hz = /bits/ 64 <160000000>;
                        opp-microvolt = <962500>;
                        required-opps = <&noc2_134>;
                };
                opp-134000000 {
                        opp-hz = /bits/ 64 <134000000>;
                        opp-microvolt = <950000>;
                        required-opps = <&noc2_134>;
                };
                opp-100000000 {
                        opp-hz = /bits/ 64 <100000000>;
                        opp-microvolt = <937500>;
                        required-opps = <&noc2_100>;
                };
        };

        bus_noc2_opp_table: opp_table6 {
                compatible = "operating-points-v2";

                noc2_400: opp-400000000 {
                        opp-hz = /bits/ 64 <400000000>;
                };
                noc2_200: opp-200000000 {
                        opp-hz = /bits/ 64 <200000000>;
                };
                noc2_134: opp-134000000 {
                        opp-hz = /bits/ 64 <134000000>;
                };
                noc2_100: opp-100000000 {
                        opp-hz = /bits/ 64 <100000000>;
                };
        };

-Saravana

v5 -> v6:
- fix review comments

v4 -> v5:
- drop patch "OPP: Improve required-opps linking" and rebase to
  https://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm.git/log/?h=opp/linux-next
- Compare pointers in dev_pm_opp_xlate_required_opp().

v3 -> v4:
- Fixed documentation comments
- Fixed order of functions in .h file
- Renamed the new xlate API
- Caused _set_required_opps() to fail if all required opps tables aren't
  linked.
v2 -> v3:
- Rebased onto linux-next.
- Added documentation comment for new fields.
- Added support for lazy required-opps linking.
- Updated Ack/Reviewed-bys.
v1 -> v2:
- Cached OPP table reference in devfreq to avoid looking up every time.
- Renamed variable in passive governor to be more intuitive.
- Updated cover letter with examples.

Saravana Kannan (3):
  OPP: Add function to look up required OPP's for a given OPP
  PM / devfreq: Cache OPP table reference in devfreq
  PM / devfreq: Add required OPPs support to passive governor

 drivers/devfreq/devfreq.c          |  6 +++
 drivers/devfreq/governor_passive.c | 25 +++++++++----
 drivers/opp/core.c                 | 59 ++++++++++++++++++++++++++++++
 include/linux/devfreq.h            |  2 +
 include/linux/pm_opp.h             |  7 ++++
 5 files changed, 92 insertions(+), 7 deletions(-)

-- 
2.30.0.365.g02bc693789-goog


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

end of thread, other threads:[~2021-02-04 11:24 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-02-04  8:14 [PATCH v6 0/3] Add required-opps support to devfreq passive gov Hsin-Yi Wang
2021-02-04  8:14 ` [PATCH v6 1/3] OPP: Add function to look up required OPP's for a given OPP Hsin-Yi Wang
2021-02-04 11:03   ` Viresh Kumar
2021-02-04  8:14 ` [PATCH v6 2/3] PM / devfreq: Cache OPP table reference in devfreq Hsin-Yi Wang
2021-02-04  8:46   ` Chanwoo Choi
2021-02-04 11:05     ` Viresh Kumar
2021-02-04  8:14 ` [PATCH v6 3/3] PM / devfreq: Add required OPPs support to passive governor Hsin-Yi Wang
2021-02-04  8:51   ` Chanwoo Choi
2021-02-04 11:22   ` Viresh Kumar
2021-02-04 11:23 ` [PATCH v6 0/3] Add required-opps support to devfreq passive gov Viresh Kumar

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).