Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp129023pxj; Thu, 3 Jun 2021 02:40:20 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzC6Oj/E75USdehqQdxsohhSkyU1P5lOHz6pFD262eWcp2vFa2YMf6cFKNSPfUs/RnClyeW X-Received: by 2002:a17:906:606:: with SMTP id s6mr37709943ejb.206.1622713219779; Thu, 03 Jun 2021 02:40:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1622713219; cv=none; d=google.com; s=arc-20160816; b=BhdiU0K9DGj/katb7Turwia6Mwib51zMmTtZSVGsJd+awLeDuYIPKuSe3RfXRoQd49 owVC2TBLpa1pgizqEx04S5wq3Yi6fTzC3Xn/02GR+LCNQQffr9+CFtvpOnWblV1ONEm4 VDdRAemzKk8OyR5ZLtAqIofmb8TnmAtm+i2Jrt2clrwLlMnHAwRgEvLO9X05vvSK0BuH sewjyVOUPfmugPcFFx5Pc7ATzEhYIFJcdFi8EBJfVnY8m6nt1wzIbH67FlnXtkdxA8Xb beI4TcwbUyGlZzIMnlTH5R2LGenh0fT/LWhxAC6ZJJ5JYfWwISCFjvllOZIbn8uR0ao9 FPiA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=nq0h2Rai/tpUtSdSLeC5esAyt1vXtkpXm4C0UDmlQDU=; b=0ApcnnbeDRHM1X469vEKJxz/F9r3ZyXx+o73yGU8WSnJFNkmJNYqOPfhNV5Zlb4WA3 5XdqALmUNWgfIj/CdIV3wCYq4qTiGMGCJSoafEd1TtcDVl9kNlTwwbHkS0qp2DIexlal QdaCnQUM9g5mS36qQrKUaP8mEA8Ry99UOeZIM6+SJAZfCa6jAy3USrh6/3C5jqCUEe2W Y+YH+pyXEd9n2tLU0UrcTvPQGJP3SyESHJWk5rIIfeB00vT2o6mcDFuievXCdlNiBEgd k+/uW5HmFu40jfUHqq3lb34LcmC5KqwlbGZU96LC+vHuqCX0kCD4X9k4AF7F0QJUZvnK S96A== 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 linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id w24si2180368ejb.66.2021.06.03.02.39.57; Thu, 03 Jun 2021 02:40:19 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=hvMBLrYH; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229884AbhFCJhh (ORCPT + 99 others); Thu, 3 Jun 2021 05:37:37 -0400 Received: from mail-lf1-f41.google.com ([209.85.167.41]:39637 "EHLO mail-lf1-f41.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229810AbhFCJhg (ORCPT ); Thu, 3 Jun 2021 05:37:36 -0400 Received: by mail-lf1-f41.google.com with SMTP id p17so7076544lfc.6 for ; Thu, 03 Jun 2021 02:35:51 -0700 (PDT) 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=WOLi4E0vJdQLGbDzKWrk7rHYEeDVSAbUWwOitFYMP7VJPjax0gBLjypENHDzjPvWrv OPN6g6B0HnR4v6mA5VbOXyNoV5T5HYfsW6a0HMUfMfgrNyycs9CHRSLN/qp6gp8d3paO eoA+S3Mp1IGb+7Wg4fQhd6n+4gAHIAlXZUdKDBTywPswnHfHy/2tcSP5y1djshoO8mgt IKXsQEJoVz5DqAJACWdhpFGPKOyPw01f0ISfNEn/CFRFPLYPCI+r6SU95aG9swEceIRo d4PPqlH1z+wQqkYI03JNCIFF6labkq+14awEql293mro0WX0PicdOsXNRMBbZ6bCdLxA H9eQ== X-Gm-Message-State: AOAM530D3d/yQF+8tn1Yf+wRn2Ay/W74Ro5XILSsZl1IRFworiEbW3im T8QY+PqCJy3GhNVSUsMo9svCVA== X-Received: by 2002:a19:484d:: with SMTP id v74mr17856139lfa.396.1622712890381; Thu, 03 Jun 2021 02:34:50 -0700 (PDT) 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 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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(-) 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; }; -- 2.25.1