From patchwork Fri Jul 26 23:15:55 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Saravana Kannan X-Patchwork-Id: 11061993 X-Patchwork-Delegate: viresh.linux@gmail.com Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 5025E912 for ; Fri, 26 Jul 2019 23:16:13 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 439FD2886C for ; Fri, 26 Jul 2019 23:16:13 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3728D28B2C; Fri, 26 Jul 2019 23:16:13 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.5 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI, USER_IN_DEF_DKIM_WL autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C9EA82886C for ; Fri, 26 Jul 2019 23:16:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728652AbfGZXQI (ORCPT ); Fri, 26 Jul 2019 19:16:08 -0400 Received: from mail-pg1-f202.google.com ([209.85.215.202]:47987 "EHLO mail-pg1-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728581AbfGZXQI (ORCPT ); Fri, 26 Jul 2019 19:16:08 -0400 Received: by mail-pg1-f202.google.com with SMTP id l11so12559527pgc.14 for ; Fri, 26 Jul 2019 16:16:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=KA0H2FQCKfPlRFALsSxO8aZCLEoa2YLftLw47C413O4=; b=sJDXZIgKg9OcRmohvvHtcgRd9n6H04cbduCDpZ+j2ttvA72wyN1yFoZs12chqGY8Lk tGQ5uUqwVG8PkUGAqlrvrJ/wj5CEAP6YEMLE+xzEzwJgBSVkd+ez7gcDk++waKbJiis2 IVU28mJGOUEFAr8wsHcultT5x1jzeBvKq2/4LbJT6JvRAubkU3lrSB6jUyaLsSx0OhvZ AheGdZ+7mwa/WhYtUkWUtbFgmP4D2xwcZqzsaTTfjU1vW0hFKLc+4ZpFtkC08F8Ej3QP +mCdy2ufEU3VUfryLY43xGe525YhCCPwbT+hcTvEk1xciA+vco77QQTPNbMztD7R6Am0 RKhQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=KA0H2FQCKfPlRFALsSxO8aZCLEoa2YLftLw47C413O4=; b=ebfw56hwcUfueK+btdwf5LvPAhoYl4t0qcIW2ZQk2XpTVHdF6Hybdrsj2UV5ysmrmQ OCvfJnQ3SrWBF0zBFlKaMQJUt7EK0f2PxQm7NLSXe7tr2qaYnAkZojCakVizsWrl+IQp MRrGqV0fnP/3Hjqi9nqg/7hHHYKtHo+7z/VEhr/s2au3FogpCKW/F9oFl3NV9XC++fLR /sFaEkUeZb+josrDoonx/O7nWostvLyvNdL9Q7EeIQ4wKvlv0SeD96M0ZBS7zJH3oprt /VjWw67SJzzEB6PJuY5wqQiIb9feYv1u+kcrq7W0Nn5uQp5OlFh0DYC/wpWhQ8EW2yh0 9p+Q== X-Gm-Message-State: APjAAAVodaQIyZZMsHFcMwl350mx81xPO837+m884h7XZSxubQlWcbkL t6SL+9twVMIsVhsdHASQCxrOa2Cj7oOsXkE= X-Google-Smtp-Source: APXvYqyGkZZFPN5EuIGupnn4DHO9UuijX2q5nto5Gkvcpzm3LokCNz3qgpWL2igfgyGgYQq8DTJ+LSIaiKvPEB4= X-Received: by 2002:a63:f959:: with SMTP id q25mr93212062pgk.357.1564182967047; Fri, 26 Jul 2019 16:16:07 -0700 (PDT) Date: Fri, 26 Jul 2019 16:15:55 -0700 In-Reply-To: <20190726231558.175130-1-saravanak@google.com> Message-Id: <20190726231558.175130-2-saravanak@google.com> Mime-Version: 1.0 References: <20190726231558.175130-1-saravanak@google.com> X-Mailer: git-send-email 2.22.0.709.g102302147b-goog Subject: [PATCH v4 1/3] dt-bindings: opp: Introduce opp-peak-KBps and opp-avg-KBps bindings From: Saravana Kannan To: Rob Herring , Mark Rutland , Viresh Kumar , Nishanth Menon , Stephen Boyd , "Rafael J. Wysocki" Cc: Saravana Kannan , Georgi Djakov , vincent.guittot@linaro.org, seansw@qti.qualcomm.com, daidavid1@codeaurora.org, adharmap@codeaurora.org, Rajendra Nayak , sibis@codeaurora.org, bjorn.andersson@linaro.org, evgreen@chromium.org, kernel-team@android.com, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Interconnects often quantify their performance points in terms of bandwidth. So, add opp-peak-KBps (required) and opp-avg-KBps (optional) to allow specifying Bandwidth OPP tables in DT. opp-peak-KBps is a required property that replace opp-hz for Bandwidth OPP tables. opp-avg-KBps is an optional property that can be used in Bandwidth OPP tables. Signed-off-by: Saravana Kannan --- Documentation/devicetree/bindings/opp/opp.txt | 15 ++++++++++++--- .../devicetree/bindings/property-units.txt | 4 ++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Documentation/devicetree/bindings/opp/opp.txt b/Documentation/devicetree/bindings/opp/opp.txt index 76b6c79604a5..b1eb49d6eab0 100644 --- a/Documentation/devicetree/bindings/opp/opp.txt +++ b/Documentation/devicetree/bindings/opp/opp.txt @@ -83,9 +83,14 @@ properties. Required properties: - opp-hz: Frequency in Hz, expressed as a 64-bit big-endian integer. This is a - required property for all device nodes but devices like power domains. The - power domain nodes must have another (implementation dependent) property which - uniquely identifies the OPP nodes. + required property for all device nodes but for devices like power domains or + bandwidth opp tables. The power domain nodes must have another (implementation + dependent) property which uniquely identifies the OPP nodes. The interconnect + opps are required to have the opp-peak-KBps property. + +- opp-peak-KBps: Peak bandwidth in kilobytes per second, expressed as a 32-bit + big-endian integer. This is a required property for all devices that don't + have opp-hz. For example, bandwidth OPP tables for interconnect paths. Optional properties: - opp-microvolt: voltage in micro Volts. @@ -132,6 +137,10 @@ Optional properties: - opp-level: A value representing the performance level of the device, expressed as a 32-bit integer. +- opp-avg-KBps: Average bandwidth in kilobytes per second, expressed as a + 32-bit big-endian integer. This property is only meaningful in OPP tables + where opp-peak-KBps is present. + - clock-latency-ns: Specifies the maximum possible transition latency (in nanoseconds) for switching to this OPP from any other OPP. diff --git a/Documentation/devicetree/bindings/property-units.txt b/Documentation/devicetree/bindings/property-units.txt index e9b8360b3288..ef4c4a199efa 100644 --- a/Documentation/devicetree/bindings/property-units.txt +++ b/Documentation/devicetree/bindings/property-units.txt @@ -41,3 +41,7 @@ Temperature Pressure ---------------------------------------- -kpascal : kilopascal + +Throughput +---------------------------------------- +-KBps : kilobytes per second From patchwork Fri Jul 26 23:15:56 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Saravana Kannan X-Patchwork-Id: 11061995 X-Patchwork-Delegate: viresh.linux@gmail.com Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 447E3912 for ; Fri, 26 Jul 2019 23:16:17 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 386A728AEF for ; Fri, 26 Jul 2019 23:16:17 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 295DA2886C; Fri, 26 Jul 2019 23:16:17 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.5 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI, USER_IN_DEF_DKIM_WL autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A895C2886C for ; Fri, 26 Jul 2019 23:16:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387500AbfGZXQM (ORCPT ); Fri, 26 Jul 2019 19:16:12 -0400 Received: from mail-pl1-f202.google.com ([209.85.214.202]:35893 "EHLO mail-pl1-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387490AbfGZXQL (ORCPT ); Fri, 26 Jul 2019 19:16:11 -0400 Received: by mail-pl1-f202.google.com with SMTP id a5so29310470pla.3 for ; Fri, 26 Jul 2019 16:16:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=T5820OQQJWp4mkgZ4wnYqdAO7VH4vOloLaIe1pVCzGw=; b=rDRdRt1bV5MKFBrQ5Vd/g9xRQEItk/yUTt63T3VAu7uVPL36GV1YsP8TrEfApHh+I/ 8bbXL0HHxWc22P7SJCdgHB37BXtOuvrmLVVdFhTs9g4WwVF5r4kkPGcAt3HvF1+moaUj AwvhyzbnGzr3w0LAodKf+WzNgW6GdxboES8/O+vahxIqabu5k3uT3vhMj+LO6twVi5wc a3GSBaZN+VAKQfJIsmlTui5z8KFOr6Xz8DsB5vPuK8l9/IJFxWGnz52ZxLQgsjz6e9Zh xRpBdWT1yrSApQhHHbg/QceFEAInyPa+alLPWEBITCYKzy2EVY7851E8imHAiTa1MnVO 7nMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=T5820OQQJWp4mkgZ4wnYqdAO7VH4vOloLaIe1pVCzGw=; b=HuJNvJ7FL0OqU+w/WFVmhlETJoVU0Nj0QQRmZSq3KE7UqwZh9GBVR13fdyAuGmzGOD 7dfKaJ3J/PkEB6lKpQIhWgYdD3Owkr5HJzTCmvp+AZmY6Nigs2NwvnUy/UB9jcl0OmzD KDCPJfSbxd1Qnk0StpIRnzm3w7ty3TPGvc36mGGPeuN5a49AawWncNjWZfxro+YUbUwr 0VGTtjZYSO8WB3D/mSphuHfeyCMKO0fWp5n+r3smWh889r5se/7eoRT9aVW9fFfHtAcQ lnbyrrzQXt/Ah/2PFd3DSVxk0KzbywcXRPDScukxRJs670yiCKbUVSVOUJdwLj/gLmbY tGzw== X-Gm-Message-State: APjAAAVBhNOXyu5g+OuzGAQTiVkvFcgGzEpULM+auFCub3IxXv+xaJoS 9udTuiWiN2EURLWgq+gYN6EySz4ImBTb5Ow= X-Google-Smtp-Source: APXvYqxvxCZ+h9e26rxDg8g/fbMxJWTK7jGlZs1GjHC9J00BqtPAYG3+n9U0MLf3JudpR+bNpSlJ2Y8Og3j2Btw= X-Received: by 2002:a63:520f:: with SMTP id g15mr89389221pgb.28.1564182970293; Fri, 26 Jul 2019 16:16:10 -0700 (PDT) Date: Fri, 26 Jul 2019 16:15:56 -0700 In-Reply-To: <20190726231558.175130-1-saravanak@google.com> Message-Id: <20190726231558.175130-3-saravanak@google.com> Mime-Version: 1.0 References: <20190726231558.175130-1-saravanak@google.com> X-Mailer: git-send-email 2.22.0.709.g102302147b-goog Subject: [PATCH v4 2/3] OPP: Add support for bandwidth OPP tables From: Saravana Kannan To: Rob Herring , Mark Rutland , Viresh Kumar , Nishanth Menon , Stephen Boyd , "Rafael J. Wysocki" Cc: Saravana Kannan , Georgi Djakov , vincent.guittot@linaro.org, seansw@qti.qualcomm.com, daidavid1@codeaurora.org, adharmap@codeaurora.org, Rajendra Nayak , sibis@codeaurora.org, bjorn.andersson@linaro.org, evgreen@chromium.org, kernel-team@android.com, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Not all devices quantify their performance points in terms of frequency. Devices like interconnects quantify their performance points in terms of bandwidth. We need a way to represent these bandwidth levels in OPP. So, add support for parsing bandwidth OPPs from DT. Signed-off-by: Saravana Kannan --- drivers/opp/of.c | 41 ++++++++++++++++++++++++++++++++--------- drivers/opp/opp.h | 4 +++- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/drivers/opp/of.c b/drivers/opp/of.c index b313aca9894f..ac73512f4416 100644 --- a/drivers/opp/of.c +++ b/drivers/opp/of.c @@ -523,6 +523,35 @@ void dev_pm_opp_of_remove_table(struct device *dev) } EXPORT_SYMBOL_GPL(dev_pm_opp_of_remove_table); +static int _read_opp_key(struct dev_pm_opp *new_opp, struct device_node *np) +{ + int ret; + u64 rate; + u32 bw; + + ret = of_property_read_u64(np, "opp-hz", &rate); + if (!ret) { + /* + * Rate is defined as an unsigned long in clk API, and so + * casting explicitly to its type. Must be fixed once rate is 64 + * bit guaranteed in clk API. + */ + new_opp->rate = (unsigned long)rate; + return 0; + } + + ret = of_property_read_u32(np, "opp-peak-KBps", &bw); + if (ret) + return ret; + new_opp->rate = (unsigned long) bw; + + ret = of_property_read_u32(np, "opp-avg-KBps", &bw); + if (!ret) + new_opp->avg_bw = (unsigned long) bw; + + return 0; +} + /** * _opp_add_static_v2() - Allocate static OPPs (As per 'v2' DT bindings) * @opp_table: OPP table @@ -560,22 +589,16 @@ static struct dev_pm_opp *_opp_add_static_v2(struct opp_table *opp_table, if (!new_opp) return ERR_PTR(-ENOMEM); - ret = of_property_read_u64(np, "opp-hz", &rate); + ret = _read_opp_key(new_opp, np); if (ret < 0) { /* "opp-hz" is optional for devices like power domains. */ if (!opp_table->is_genpd) { - dev_err(dev, "%s: opp-hz not found\n", __func__); + dev_err(dev, "%s: opp-hz or opp-peak-bw not found\n", + __func__); goto free_opp; } rate_not_available = true; - } else { - /* - * Rate is defined as an unsigned long in clk API, and so - * casting explicitly to its type. Must be fixed once rate is 64 - * bit guaranteed in clk API. - */ - new_opp->rate = (unsigned long)rate; } of_property_read_u32(np, "opp-level", &new_opp->level); diff --git a/drivers/opp/opp.h b/drivers/opp/opp.h index 01a500e2c40a..6bb238af9cac 100644 --- a/drivers/opp/opp.h +++ b/drivers/opp/opp.h @@ -56,7 +56,8 @@ extern struct list_head opp_tables; * @turbo: true if turbo (boost) OPP * @suspend: true if suspend OPP * @pstate: Device's power domain's performance state. - * @rate: Frequency in hertz + * @rate: Frequency in hertz OR Peak bandwidth in kilobytes per second + * @avg_bw: Average bandwidth in kilobytes per second * @level: Performance level * @supplies: Power supplies voltage/current values * @clock_latency_ns: Latency (in nanoseconds) of switching to this OPP's @@ -78,6 +79,7 @@ struct dev_pm_opp { bool suspend; unsigned int pstate; unsigned long rate; + unsigned long avg_bw; unsigned int level; struct dev_pm_opp_supply *supplies; From patchwork Fri Jul 26 23:15:57 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Saravana Kannan X-Patchwork-Id: 11061997 X-Patchwork-Delegate: viresh.linux@gmail.com Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id BBD6C6C5 for ; Fri, 26 Jul 2019 23:16:17 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AB62F2886C for ; Fri, 26 Jul 2019 23:16:17 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9ED2F28AEF; Fri, 26 Jul 2019 23:16:17 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.5 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI, USER_IN_DEF_DKIM_WL autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1CE7228B2C for ; Fri, 26 Jul 2019 23:16:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387626AbfGZXQP (ORCPT ); Fri, 26 Jul 2019 19:16:15 -0400 Received: from mail-pl1-f202.google.com ([209.85.214.202]:41246 "EHLO mail-pl1-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387516AbfGZXQO (ORCPT ); Fri, 26 Jul 2019 19:16:14 -0400 Received: by mail-pl1-f202.google.com with SMTP id i3so29314623plb.8 for ; Fri, 26 Jul 2019 16:16:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=fNB7qnI3bdYKnt/Y7nwqVEyFkilceT/R7ii1SBBbpUg=; b=LHarGmzTEPysrcMIeJATx6XiX40OooWzDYDrNxST2Z/MGCg3Q+JnXW3m8ALRa7i5er 9wxiWsIEkJAUILz3lCVvn0SVIpM/8VoLhwjC7duR+HXI1G1sj6qfF/liSPxCi3/qZBMk FEF3r5fZJIHidcu2q/jem64rfJEgMR0rDjOkKlvm9TIJ+qbpMx96wb7QRoY3vGLlWvM5 J1UX6OpBEYofI/8snQyxdbNwIWRcVSkQnFXx11epk1CIp31EK3Y32pS8pcfWs1W3HN4D tfSMC04k3dj7ZjBnQnDnEGscYpPNa+5yeFfDzZZod4RqOMiHnOUFew+7hqqbn4PK4rYy iVNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=fNB7qnI3bdYKnt/Y7nwqVEyFkilceT/R7ii1SBBbpUg=; b=iaEA4VFf2AFR9QrMIzoJLjSaPPbvT7UUqBEh/K32PcMyDCPC0yGMDpM43/aawQEDXm 0yn19C5Z8jbT9gU9wkjJz5y8ji4lmxDPLaUgrU74p2PSGoZuu1vZuxo0aktF/JdkYTM8 MK3bDBnBTHxdzTBPK8SRL6rDBHwTtr1iFdVVZYq46OwAKsfTGqjWMs6ttiXrW2X9lhBN njvh8oAsjNamO2N7orvFU2SwL7oFCntJKCh+tAsoHkyZ+DAeHdvVS89mt0368k+JcLNx rXnovMGBH+QCVtcaxpskhQ+tY+V56I7LMk6lrrJ50ufg+fyfcxCui8IOLEFx7S7WmneM aaIg== X-Gm-Message-State: APjAAAXmCPIe3PiW8NiZFsKANJBn96u35beEEbnGK6+FGg0rLcjRZV1I E9or44uwE9x8LU3stVLIS3WXXEJWWq8Zrr8= X-Google-Smtp-Source: APXvYqxckDAGi2179Dss4TNW7V5oQ+KtInskdy6iWs9OFmEWPem90rqPCK4YbUftHHL1Fka02rlirzxvHKTOXzs= X-Received: by 2002:a63:e306:: with SMTP id f6mr92102901pgh.39.1564182973407; Fri, 26 Jul 2019 16:16:13 -0700 (PDT) Date: Fri, 26 Jul 2019 16:15:57 -0700 In-Reply-To: <20190726231558.175130-1-saravanak@google.com> Message-Id: <20190726231558.175130-4-saravanak@google.com> Mime-Version: 1.0 References: <20190726231558.175130-1-saravanak@google.com> X-Mailer: git-send-email 2.22.0.709.g102302147b-goog Subject: [PATCH v4 3/3] OPP: Add helper function for bandwidth OPP tables From: Saravana Kannan To: Rob Herring , Mark Rutland , Viresh Kumar , Nishanth Menon , Stephen Boyd , "Rafael J. Wysocki" Cc: Saravana Kannan , Georgi Djakov , vincent.guittot@linaro.org, seansw@qti.qualcomm.com, daidavid1@codeaurora.org, adharmap@codeaurora.org, Rajendra Nayak , sibis@codeaurora.org, bjorn.andersson@linaro.org, evgreen@chromium.org, kernel-team@android.com, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The frequency OPP tables have helper functions to search for entries in the table based on frequency and get the frequency values for a given (or suspend) OPP entry. Add similar helper functions for bandwidth OPP tables to search for entries in the table based on peak bandwidth and to get the peak and average bandwidth for a given (or suspend) OPP entry. Signed-off-by: Saravana Kannan --- drivers/opp/core.c | 51 ++++++++++++++++++++++++++++++++++++++++++ include/linux/pm_opp.h | 19 ++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/drivers/opp/core.c b/drivers/opp/core.c index c094d5d20fd7..b36bc69341dc 100644 --- a/drivers/opp/core.c +++ b/drivers/opp/core.c @@ -127,6 +127,29 @@ unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp) } EXPORT_SYMBOL_GPL(dev_pm_opp_get_freq); +/** + * dev_pm_opp_get_bw() - Gets the bandwidth corresponding to an available opp + * @opp: opp for which frequency has to be returned for + * @avg_bw: Pointer where the corresponding average bandwidth is stored. + * Can be NULL. + * + * Return: Peak bandwidth in KBps corresponding to the opp, else + * return 0 + */ +unsigned long dev_pm_opp_get_bw(struct dev_pm_opp *opp, unsigned long *avg_bw) +{ + if (IS_ERR_OR_NULL(opp) || !opp->available) { + pr_err("%s: Invalid parameters\n", __func__); + return 0; + } + + if (avg_bw) + *avg_bw = opp->avg_bw; + + return opp->rate; +} +EXPORT_SYMBOL_GPL(dev_pm_opp_get_bw); + /** * dev_pm_opp_get_level() - Gets the level corresponding to an available opp * @opp: opp for which level value has to be returned for @@ -299,6 +322,34 @@ unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev) } EXPORT_SYMBOL_GPL(dev_pm_opp_get_suspend_opp_freq); +/** + * dev_pm_opp_get_suspend_opp_bw() - Get peak bandwidth of suspend opp in KBps + * @dev: device for which we do this operation + * @avg_bw: Pointer where the corresponding average bandwidth is stored. + * Can be NULL. + * + * Return: This function returns the peak bandwidth of the OPP marked as + * suspend_opp if one is available, else returns 0; + */ +unsigned long dev_pm_opp_get_suspend_opp_bw(struct device *dev, + unsigned long *avg_bw) +{ + struct opp_table *opp_table; + unsigned long peak_bw = 0; + + opp_table = _find_opp_table(dev); + if (IS_ERR(opp_table)) + return 0; + + if (opp_table->suspend_opp && opp_table->suspend_opp->available) + peak_bw = dev_pm_opp_get_bw(opp_table->suspend_opp, avg_bw); + + dev_pm_opp_put_opp_table(opp_table); + + return peak_bw; +} +EXPORT_SYMBOL_GPL(dev_pm_opp_get_suspend_opp_bw); + int _get_opp_count(struct opp_table *opp_table) { struct dev_pm_opp *opp; diff --git a/include/linux/pm_opp.h b/include/linux/pm_opp.h index af5021f27cb7..799b1defe1f7 100644 --- a/include/linux/pm_opp.h +++ b/include/linux/pm_opp.h @@ -82,6 +82,7 @@ void dev_pm_opp_put_opp_table(struct opp_table *opp_table); unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp); unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp); +unsigned long dev_pm_opp_get_bw(struct dev_pm_opp *opp, unsigned long *avg_bw); unsigned int dev_pm_opp_get_level(struct dev_pm_opp *opp); @@ -92,6 +93,8 @@ unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev); unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev); unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev); unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev); +unsigned long dev_pm_opp_get_suspend_opp_bw(struct device *dev, + unsigned long *avg_bw); struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev, unsigned long freq, @@ -158,6 +161,11 @@ static inline unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp) { return 0; } +static inline unsigned long dev_pm_opp_get_bw(struct dev_pm_opp *opp, + unsigned long *avg_bw) +{ + return 0; +} static inline unsigned int dev_pm_opp_get_level(struct dev_pm_opp *opp) { @@ -194,6 +202,12 @@ static inline unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev) return 0; } +static inline unsigned long dev_pm_opp_get_suspend_opp_bw(struct device *dev, + unsigned long *avg_bw) +{ + return 0; +} + static inline struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev, unsigned long freq, bool available) { @@ -329,6 +343,11 @@ static inline void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask #endif /* CONFIG_PM_OPP */ +#define dev_pm_opp_find_peak_bw_exact dev_pm_opp_find_freq_exact +#define dev_pm_opp_find_peak_bw_floor dev_pm_opp_find_freq_floor +#define dev_pm_opp_find_peak_bw_ceil_by_volt dev_pm_opp_find_freq_ceil_by_volt +#define dev_pm_opp_find_peak_bw_ceil dev_pm_opp_find_freq_ceil + #if defined(CONFIG_PM_OPP) && defined(CONFIG_OF) int dev_pm_opp_of_add_table(struct device *dev); int dev_pm_opp_of_add_table_indexed(struct device *dev, int index);