From patchwork Thu Jun 3 09:34:37 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ulf Hansson X-Patchwork-Id: 453240 Delivered-To: patches@linaro.org Received: by 2002:a02:c735:0:0:0:0:0 with SMTP id h21csp114849jao; Thu, 3 Jun 2021 02:34:50 -0700 (PDT) X-Received: by 2002:a05:6512:2316:: with SMTP id o22mr27113622lfu.510.1622712890761; Thu, 03 Jun 2021 02:34:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1622712890; cv=none; d=google.com; s=arc-20160816; b=pw7K1PFu3qnupGJ0sN3+C9O5Y0RDk/17dTHfz1/zVkgYO422GiFZGKhLTQcj+bOshy Fl1t+NLHsBrJffLtwWz7mSDp2sVErsLpmiA4nE0uJQLHfdAPiyY59xZFSOiievMyVNEq TFmkvbWnpthM4Dct204q0iMAJ7Gf/4IlCx8ZY5W5w5FdGCwEENAOnrW3Zc2fsUvVIOmT CV4DRJBAVO8jPrAJRJpEbvnPsD+ynhDdWhki1LNI2tETyyQod4r45yUH/VOqN38dOzkv 48m7c9XSCYSDkvxpURgOAGjVEk8wUXGvsungdg92SE8YlVgYMtDQGYQ4UMeLrw00gekc 0foA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=nq0h2Rai/tpUtSdSLeC5esAyt1vXtkpXm4C0UDmlQDU=; b=x9+isC3kKnBRZYaSAQQMz9mHEmlaedii4f0ECx7Dm6IuAAQxAst0SMvjIElEzCGdVk HITGtu5iSpEcj4meo6CFQvHji6WcMsXfKpInb2HlaSvQa6f+bQqLemceRZRPZRfkyjYJ WE0nUXHxOWsE9zUtUcclMZ5/gWmUzryzNWtw9hw2WuSR0/tM8xf1mnpYeDFM5mOvnQxa cyYXunTyCWWVN1tQ4aA8GcHpjk0q9slHhqTjBNa8lwIs8Ovlvrnl7oN6ttC5jZaLnfgQ 1o9iyxDdCRKs1loJRWom7cHCBro8mfaMIjeNmBslHiIRXjeVevM3JZcVUw8AN0kjMQgi RjKA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=hvMBLrYH; spf=pass (google.com: domain of ulf.hansson@linaro.org designates 209.85.220.41 as permitted sender) smtp.mailfrom=ulf.hansson@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) by mx.google.com with SMTPS id v124sor540722lfa.124.2021.06.03.02.34.50 for (Google Transport Security); Thu, 03 Jun 2021 02:34:50 -0700 (PDT) Received-SPF: pass (google.com: domain of ulf.hansson@linaro.org designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=hvMBLrYH; spf=pass (google.com: domain of ulf.hansson@linaro.org designates 209.85.220.41 as permitted sender) smtp.mailfrom=ulf.hansson@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=nq0h2Rai/tpUtSdSLeC5esAyt1vXtkpXm4C0UDmlQDU=; b=hvMBLrYHCWMkWfU02Uc00BYq14sjtXmNCStD4dBtsXGCWBEjBBlJ9efW5N1AKdpqP7 qrJnw+wWMzym/dBQYz45G2EhMvy/qWPkOd0m1PVBGC1NSzC2zxptrE01rJ1oJMSx3+nR ynDBRJO3tF4ZGcO7EWiBJUrx/5yloKy28jlr91fFiFglRRVejNwXUBgGhYWx6+i8ao3t qI/5ZevLBZwv7jGf9yxW/MJ0wLcoReVVlDUNbJWNCpxwb478Sb/fCg93UmihIUKSNe6D GfXjjW9ftXQfcPuz0+XRQJeqK+HNi6BZlMMF9jy5IWfTZurZ5d+GNelIO0vMeiP5Gs6K 1YRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=nq0h2Rai/tpUtSdSLeC5esAyt1vXtkpXm4C0UDmlQDU=; b=DJcZ6YAkYJnZON4htHCEBPrYJJJ4UPAE9GniIS2Fodh0sUZnnd/F1+xkKN/zUhCQ7i cDL/Ha/VjL0O8wmGQ4YNzAk2N6zVuJRhTFFu3ges5wdTUYfB73s2popLH15L+dSX/DKb 3vxQu1Xq3NbMPMEzVW9JvHtxkvkeh342Ywt7a2F/PGix1pqvraaj8Qkipj4+RYhj9ykC +h5xWgX0gCHgEF/XOZ/zwhupEgPuw9VR3zkj3lk+BYCK0xwcGgkGuAL565TkRYfLKL9W VlOlG394WLoTMJ2b5lIFL/wZMXrFxLRRcEgOPSWvel8HI6/BZTE/in3NO5lDY/WFoms8 XTqA== X-Gm-Message-State: AOAM531RU/RiExr+PHLtQqnr9dAMqWwrfqggdSN/6IqHRLFO0QNVkQNH MvY/sCjNVNLgBoP0EmAEQ8GTHGop X-Google-Smtp-Source: ABdhPJxpFSsYKrqvgqC4Q7kRSbSGZehZRwk2RDVpSloOM744iqlLBfS8I/728O1G7Wf6U2RfB4aqgQ== X-Received: by 2002:a19:484d:: with SMTP id v74mr17856139lfa.396.1622712890381; Thu, 03 Jun 2021 02:34:50 -0700 (PDT) Return-Path: Received: from localhost.localdomain (h-155-4-129-146.NA.cust.bahnhof.se. [155.4.129.146]) by smtp.gmail.com with ESMTPSA id q4sm263373lfc.172.2021.06.03.02.34.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 03 Jun 2021 02:34:49 -0700 (PDT) From: Ulf Hansson To: "Rafael J . Wysocki" , Viresh Kumar , linux-pm@vger.kernel.org Cc: Ulf Hansson , Dmitry Osipenko , Jonathan Hunter , Thierry Reding , Rajendra Nayak , Stephan Gerhold , Roja Rani Yarubandi , Bjorn Andersson , Vincent Guittot , Stephen Boyd , linux-kernel@vger.kernel.org Subject: [PATCH v2 3/4] PM: domains: Drop/restore performance state votes for devices at runtime PM Date: Thu, 3 Jun 2021 11:34:37 +0200 Message-Id: <20210603093438.138705-4-ulf.hansson@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210603093438.138705-1-ulf.hansson@linaro.org> References: <20210603093438.138705-1-ulf.hansson@linaro.org> MIME-Version: 1.0 A subsystem/driver that need to manage OPPs for its device, should typically drop its vote for the OPP when the device becomes runtime suspended. In this way, the corresponding aggregation of the performance state votes that is managed in genpd for the attached PM domain, may find that the aggregated vote can be decreased. Hence, it may allow genpd to set the lower performance state for the PM domain, thus avoiding to waste energy. To accomplish this, typically a subsystem/driver would need to call dev_pm_opp_set_rate|opp() for its device from its ->runtime_suspend() callback, to drop the vote for the OPP. Accordingly, it needs another call to dev_pm_opp_set_rate|opp() to restore the vote for the OPP from its ->runtime_resume() callback. To avoid boilerplate code in subsystems/driver to deal with these things, let's instead manage this internally in genpd. Signed-off-by: Ulf Hansson --- Changes in v2: - Rebased. - A few minor cosmetic changes. - Deal with the error path in genpd_runtime_resume(). --- drivers/base/power/domain.c | 27 +++++++++++++++++++++++++-- include/linux/pm_domain.h | 1 + 2 files changed, 26 insertions(+), 2 deletions(-) -- 2.25.1 Tested-by: Dmitry Osipenko diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c index ef25a5b18587..e5d97174c254 100644 --- a/drivers/base/power/domain.c +++ b/drivers/base/power/domain.c @@ -400,6 +400,23 @@ static int genpd_set_performance_state(struct device *dev, unsigned int state) return ret; } +static int genpd_drop_performance_state(struct device *dev) +{ + unsigned int prev_state = dev_gpd_data(dev)->performance_state; + + if (!genpd_set_performance_state(dev, 0)) + return prev_state; + + return 0; +} + +static void genpd_restore_performance_state(struct device *dev, + unsigned int state) +{ + if (state) + genpd_set_performance_state(dev, state); +} + /** * dev_pm_genpd_set_performance_state- Set performance state of device's power * domain. @@ -842,7 +859,8 @@ static int genpd_runtime_suspend(struct device *dev) { struct generic_pm_domain *genpd; bool (*suspend_ok)(struct device *__dev); - struct gpd_timing_data *td = &dev_gpd_data(dev)->td; + struct generic_pm_domain_data *gpd_data = dev_gpd_data(dev); + struct gpd_timing_data *td = &gpd_data->td; bool runtime_pm = pm_runtime_enabled(dev); ktime_t time_start; s64 elapsed_ns; @@ -899,6 +917,7 @@ static int genpd_runtime_suspend(struct device *dev) return 0; genpd_lock(genpd); + gpd_data->rpm_pstate = genpd_drop_performance_state(dev); genpd_power_off(genpd, true, 0); genpd_unlock(genpd); @@ -916,7 +935,8 @@ static int genpd_runtime_suspend(struct device *dev) static int genpd_runtime_resume(struct device *dev) { struct generic_pm_domain *genpd; - struct gpd_timing_data *td = &dev_gpd_data(dev)->td; + struct generic_pm_domain_data *gpd_data = dev_gpd_data(dev); + struct gpd_timing_data *td = &gpd_data->td; bool runtime_pm = pm_runtime_enabled(dev); ktime_t time_start; s64 elapsed_ns; @@ -940,6 +960,8 @@ static int genpd_runtime_resume(struct device *dev) genpd_lock(genpd); ret = genpd_power_on(genpd, 0); + if (!ret) + genpd_restore_performance_state(dev, gpd_data->rpm_pstate); genpd_unlock(genpd); if (ret) @@ -978,6 +1000,7 @@ static int genpd_runtime_resume(struct device *dev) err_poweroff: if (!pm_runtime_is_irq_safe(dev) || genpd_is_irq_safe(genpd)) { genpd_lock(genpd); + gpd_data->rpm_pstate = genpd_drop_performance_state(dev); genpd_power_off(genpd, true, 0); genpd_unlock(genpd); } diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h index dfcfbcecc34b..21a0577305ef 100644 --- a/include/linux/pm_domain.h +++ b/include/linux/pm_domain.h @@ -198,6 +198,7 @@ struct generic_pm_domain_data { struct notifier_block *power_nb; int cpu; unsigned int performance_state; + unsigned int rpm_pstate; ktime_t next_wakeup; void *data; };