From patchwork Tue Jul 30 16:22:17 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 11066071 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 96CE6112C for ; Tue, 30 Jul 2019 16:32:25 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 87C7A2866D for ; Tue, 30 Jul 2019 16:32:25 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7C1342867C; Tue, 30 Jul 2019 16:32:25 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 2B60C2866D for ; Tue, 30 Jul 2019 16:32:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728858AbfG3QcX (ORCPT ); Tue, 30 Jul 2019 12:32:23 -0400 Received: from mail-wr1-f66.google.com ([209.85.221.66]:38848 "EHLO mail-wr1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731235AbfG3QcW (ORCPT ); Tue, 30 Jul 2019 12:32:22 -0400 Received: by mail-wr1-f66.google.com with SMTP id g17so66483537wrr.5; Tue, 30 Jul 2019 09:32:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=vAb/Wbf6jN1XW90qv7LwGWyr9ST9lsuKJ6ZQmhSvlSc=; b=B52Y6ecYwJ01MrPj5v1iQKo+08trN8HAitRyDdmF2eAeduJVshReg8PtQ1vLiEnyzz eeblqXSX9dvocNnfWLW+xQlWbeqGTSWQJPHkX56IzGecCNoFfvpsiKoyGfVkKWc9WQiD InPKWczClbZG3zyJtSxFuAR4nUxCC056S7h8ZG4mEg1K3CLvbNCsnHos+rC0ghNCARaO zWu6VeG89edOTp+oahNKF/lfcYLtK8S8tVCdp+YmpJ6JKyyDWdyo4yok/tyr6PbaIqIP G/rtO0b2dCCK0t7zlugrq4Y9ct1/2ePtUX4DYjN0dhb+ZmH1iXwmPazp9Q9a0julPj9M m5sQ== 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=vAb/Wbf6jN1XW90qv7LwGWyr9ST9lsuKJ6ZQmhSvlSc=; b=S0ms+tOiNuZGGhfl9Z4Lo0YIJyWopiKQsM5gb95r/HEK3+uUw+jx1Rnz7+SPzbPp/B DbuGsQ40Uy44jh2R73M2fQjerMCGtSKe0kPbwMibkhyFynvBTQ+Y1H8wSm5yQAau3clM 62Ef+56gje4sSx6431jk99kKOsKELfi9F69y02eTWKu/wepveWJt0joLya0YwvppIUJm qmL4xRP8YrZuNRdkA+gYHgmY053tR7O2zv480wwANhHU5L7/WoMjXd7zHEVCmShv88rX M0burzOzbBPQVtwbdxB+N+jCiTkPUdRI8VrOqmbtge+ILivqfeALuMnJC04dbdKt9niO hS3g== X-Gm-Message-State: APjAAAVTFQ9ooELM1sRTw7vmdftHYjiFVTyawQ9fDxR5CQvWBRiK09f9 lwFV70vvbbIjuuulaqaoDgM= X-Google-Smtp-Source: APXvYqz9QrAYsJsoZlzHjSb/eLW603ZuvezVphBqMkwt5SXjHAVKaSjp0aWaacXrI+0gT5y0RMczIQ== X-Received: by 2002:a5d:6a84:: with SMTP id s4mr51092367wru.125.1564504340045; Tue, 30 Jul 2019 09:32:20 -0700 (PDT) Received: from localhost.localdomain (ppp91-78-220-99.pppoe.mtu-net.ru. [91.78.220.99]) by smtp.gmail.com with ESMTPSA id c65sm64835175wma.44.2019.07.30.09.32.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jul 2019 09:32:19 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 01/20] PM / devfreq: tegra30: Change irq type to unsigned int Date: Tue, 30 Jul 2019 19:22:17 +0300 Message-Id: <20190730162236.6063-2-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190730162236.6063-1-digetx@gmail.com> References: <20190730162236.6063-1-digetx@gmail.com> MIME-Version: 1.0 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 IRQ numbers are always positive, hence the corresponding variable should be unsigned to keep types consistent. This is a minor change that cleans up code a tad more. Suggested-by: Thierry Reding Acked-by: MyungJoo Ham Reviewed-by: Chanwoo Choi Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index a6ba75f4106d..a27300f40b0b 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -160,7 +160,7 @@ struct tegra_devfreq { struct tegra_devfreq_device devices[ARRAY_SIZE(actmon_device_configs)]; - int irq; + unsigned int irq; }; struct tegra_actmon_emc_ratio { @@ -618,12 +618,12 @@ static int tegra_devfreq_probe(struct platform_device *pdev) return PTR_ERR(tegra->emc_clock); } - tegra->irq = platform_get_irq(pdev, 0); - if (tegra->irq < 0) { - err = tegra->irq; + err = platform_get_irq(pdev, 0); + if (err < 0) { dev_err(&pdev->dev, "Failed to get IRQ: %d\n", err); return err; } + tegra->irq = err; reset_control_assert(tegra->reset); From patchwork Tue Jul 30 16:22:18 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 11066115 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 0C0BC112C for ; Tue, 30 Jul 2019 16:34:08 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id F13BD28658 for ; Tue, 30 Jul 2019 16:34:07 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E524C286A1; Tue, 30 Jul 2019 16:34:07 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 7E46828658 for ; Tue, 30 Jul 2019 16:34:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729022AbfG3QeG (ORCPT ); Tue, 30 Jul 2019 12:34:06 -0400 Received: from mail-wm1-f67.google.com ([209.85.128.67]:33048 "EHLO mail-wm1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732677AbfG3QcX (ORCPT ); Tue, 30 Jul 2019 12:32:23 -0400 Received: by mail-wm1-f67.google.com with SMTP id h19so45682709wme.0; Tue, 30 Jul 2019 09:32:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Ox12S6Tw4A+nuZKMeS2Wc28MQmpMbXQ3Ba/CygAYf44=; b=jmyHZHsp2CKndQo92fDRhxclKrIGhfZzfr/veEVbopBWKo8QmsEdN0yPNlRdDHuqgZ sLGOOpuajf6gl0FEwHw9nMUEzZNAVgUyv9c+mjAY321LPQhEixQ0SzOdK24MWch+On5M mSdn8iJu/L3JjAP4xt5JY7428JXbWuIGybUMuLevrffyDYumSZGU9Tx+8ZVj1JPVDkFL Idp3bESlQZim8uo97NYBZlsIL8ChJRB1bTvYDpMKC+r0NF4X5PJfTODk8BxVtAcF8wvF fstXGFF95XLX7g1o80ZsC0+Etoh2ROKtecu5uX9X5QnQfgUZTsTqf+nUVRpV0iGco1KB gJoA== 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=Ox12S6Tw4A+nuZKMeS2Wc28MQmpMbXQ3Ba/CygAYf44=; b=bo2bnNUTFsy7mNlLGw67smpsUvf5i2S+5YFaw/vJoNhjVArLRhzw7ivR2YinspYASC htJn58NdkeOWx7+eFBVQzBVjmN/6ptxUftJSM9ph6QpN7IWkooNOzotjEqBImhCsPQcZ i1/qA/ByExUE6oSBUk4539HKwDwdk1fFIZ7NS9RvfCjaMe8sASWpCCeHIBf0a3iokYZ9 eJQ2ftna64TEWc0exJev/BFfIHrlC9gfJ0pVA0wXE171z0XXZAxqef0peFqQlqE9ECXJ arjjEUL7CGPy7GC+KGziy5PjxPoZB+l/hK9WRhmGVziU8pp3DeBUI77wcZwOT7bgB0CI 2cDQ== X-Gm-Message-State: APjAAAVr2Ya0ROD6civZzxP7IE13V3qlDoPzWF0+CbmBXmt9MGP/35DU qIX5vLSLtINCDqyGZ4eefrE= X-Google-Smtp-Source: APXvYqw8JG3pfF+XLVK0hRFO6f0QeIxfJhVD3nT6uYo73YjCX4jXxgT3T/dyU9HItd+TXHTqiM9k+Q== X-Received: by 2002:a7b:c106:: with SMTP id w6mr111461186wmi.80.1564504341406; Tue, 30 Jul 2019 09:32:21 -0700 (PDT) Received: from localhost.localdomain (ppp91-78-220-99.pppoe.mtu-net.ru. [91.78.220.99]) by smtp.gmail.com with ESMTPSA id c65sm64835175wma.44.2019.07.30.09.32.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jul 2019 09:32:20 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 02/20] PM / devfreq: tegra30: Keep interrupt disabled while governor is stopped Date: Tue, 30 Jul 2019 19:22:18 +0300 Message-Id: <20190730162236.6063-3-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190730162236.6063-1-digetx@gmail.com> References: <20190730162236.6063-1-digetx@gmail.com> MIME-Version: 1.0 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 There is no real need to keep interrupt always-enabled, will be nicer to keep it disabled while governor is inactive. Suggested-by: Thierry Reding Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 47 ++++++++++++++++--------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index a27300f40b0b..8be6a33beb9c 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -416,8 +417,6 @@ static void tegra_actmon_start(struct tegra_devfreq *tegra) { unsigned int i; - disable_irq(tegra->irq); - actmon_writel(tegra, ACTMON_SAMPLING_PERIOD - 1, ACTMON_GLB_PERIOD_CTRL); @@ -442,8 +441,6 @@ static void tegra_actmon_stop(struct tegra_devfreq *tegra) } actmon_write_barrier(tegra); - - enable_irq(tegra->irq); } static int tegra_devfreq_target(struct device *dev, unsigned long *freq, @@ -552,6 +549,12 @@ static int tegra_governor_event_handler(struct devfreq *devfreq, { struct tegra_devfreq *tegra = dev_get_drvdata(devfreq->dev.parent); + /* + * Couple device with the governor early as it is needed at + * the moment of governor's start (used by ISR). + */ + tegra->devfreq = devfreq; + switch (event) { case DEVFREQ_GOV_START: devfreq_monitor_start(devfreq); @@ -586,10 +589,11 @@ static struct devfreq_governor tegra_devfreq_governor = { static int tegra_devfreq_probe(struct platform_device *pdev) { - struct tegra_devfreq *tegra; struct tegra_devfreq_device *dev; - unsigned int i; + struct tegra_devfreq *tegra; + struct devfreq *devfreq; unsigned long rate; + unsigned int i; int err; tegra = devm_kzalloc(&pdev->dev, sizeof(*tegra), GFP_KERNEL); @@ -625,6 +629,16 @@ static int tegra_devfreq_probe(struct platform_device *pdev) } tegra->irq = err; + irq_set_status_flags(tegra->irq, IRQ_NOAUTOEN); + + err = devm_request_threaded_irq(&pdev->dev, tegra->irq, NULL, + actmon_thread_isr, IRQF_ONESHOT, + "tegra-devfreq", tegra); + if (err) { + dev_err(&pdev->dev, "Interrupt request failed: %d\n", err); + return err; + } + reset_control_assert(tegra->reset); err = clk_prepare_enable(tegra->clock); @@ -672,28 +686,15 @@ static int tegra_devfreq_probe(struct platform_device *pdev) } tegra_devfreq_profile.initial_freq = clk_get_rate(tegra->emc_clock); - tegra->devfreq = devfreq_add_device(&pdev->dev, - &tegra_devfreq_profile, - "tegra_actmon", - NULL); - if (IS_ERR(tegra->devfreq)) { - err = PTR_ERR(tegra->devfreq); + devfreq = devfreq_add_device(&pdev->dev, &tegra_devfreq_profile, + "tegra_actmon", NULL); + if (IS_ERR(devfreq)) { + err = PTR_ERR(devfreq); goto remove_governor; } - err = devm_request_threaded_irq(&pdev->dev, tegra->irq, NULL, - actmon_thread_isr, IRQF_ONESHOT, - "tegra-devfreq", tegra); - if (err) { - dev_err(&pdev->dev, "Interrupt request failed: %d\n", err); - goto remove_devfreq; - } - return 0; -remove_devfreq: - devfreq_remove_device(tegra->devfreq); - remove_governor: devfreq_remove_governor(&tegra_devfreq_governor); From patchwork Tue Jul 30 16:22:19 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 11066113 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 664BB112C for ; Tue, 30 Jul 2019 16:34:06 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 57AF628658 for ; Tue, 30 Jul 2019 16:34:06 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4B070286A1; Tue, 30 Jul 2019 16:34:06 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 DEFCE28671 for ; Tue, 30 Jul 2019 16:34:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732814AbfG3QcZ (ORCPT ); Tue, 30 Jul 2019 12:32:25 -0400 Received: from mail-wr1-f66.google.com ([209.85.221.66]:40452 "EHLO mail-wr1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725871AbfG3QcY (ORCPT ); Tue, 30 Jul 2019 12:32:24 -0400 Received: by mail-wr1-f66.google.com with SMTP id r1so66466211wrl.7; Tue, 30 Jul 2019 09:32:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=1OA59L/PDO/fIoCl0NQYE6ljbPRlOkug9V9TGpbxlIc=; b=UjPcaR49D0raHN5n5LpUrIqLVIYxGuUgcwKIDR20hVmAi42K9J3Teum4Dv8hqXp4tT sXOgPorkDuBqQmL7Yd44zH02PTJrqOu7El6TvYdo8KaOBvf1Qa9MIghdVG4OtX1st45d U2bP4rcMIten7LhVc7K6cy5G8rMFJy3w5U4dprMmCMGXfjPEVK/4QFwgr9dTLBoMElbq Tpa5+m03HzVrT1bM2I7m9+wv+D9Fz52UeeF9i6kIocwZKlAjbhLNenr86ggWwM6AJKoW UD+xuD+s6viJQiekJKb8f08MrYVnJzGzjq747zXbfzfBXE8vAxrvjPjsUPDojTbentmc aLJQ== 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=1OA59L/PDO/fIoCl0NQYE6ljbPRlOkug9V9TGpbxlIc=; b=XQPnX1+BYb4OC08bytCwkAwokaaUiHyhpMaVVsLgZax4DcRs8lSIgHGNWObNGtq0/7 OK/vR+J0kEDc4mzeF7U6E7EioZxkd4YAhTQf5icJGzdFERO8qVMKAefhO3Mbhhfs7Z48 tUI94U4NhsXJjMgB1A4MBdxngUTf55sSpb8vDdVFxl3vo3olYAJnfVAKQTPX3eDtLxTk gbbrCR2M5S4n4CyUZ/Bm1slXI3V7GDRVffyyMLzakq52UkKaUlmzjjcaCK3DPNI/r3lM BuQCAbUjNNVOpHBYdprKmrvBqAldhT0J0jC2JjUXJk+yvJcKaOAPGjZEuzRnlixe5+Dm wGig== X-Gm-Message-State: APjAAAXGWX7drDkAasrVPL/246iUmTKDTc5/Tq1+Lh43mv+D9J2NXqtu vzFtjubGgJkMYSTnkYk9swE= X-Google-Smtp-Source: APXvYqy55VJPIwBbpJxEJ+BkBJhd8VlXEglnPIl5cXskz3bIVLr622tIHUGMZfgTFWN6OuXcGhe+2w== X-Received: by 2002:adf:dd0f:: with SMTP id a15mr40299198wrm.265.1564504342627; Tue, 30 Jul 2019 09:32:22 -0700 (PDT) Received: from localhost.localdomain (ppp91-78-220-99.pppoe.mtu-net.ru. [91.78.220.99]) by smtp.gmail.com with ESMTPSA id c65sm64835175wma.44.2019.07.30.09.32.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jul 2019 09:32:22 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 03/20] PM / devfreq: tegra30: Handle possible round-rate error Date: Tue, 30 Jul 2019 19:22:19 +0300 Message-Id: <20190730162236.6063-4-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190730162236.6063-1-digetx@gmail.com> References: <20190730162236.6063-1-digetx@gmail.com> MIME-Version: 1.0 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 EMC clock rate rounding technically could fail, hence let's handle the error cases properly. Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index 8be6a33beb9c..bfee9d43de1e 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -592,8 +592,8 @@ static int tegra_devfreq_probe(struct platform_device *pdev) struct tegra_devfreq_device *dev; struct tegra_devfreq *tegra; struct devfreq *devfreq; - unsigned long rate; unsigned int i; + long rate; int err; tegra = devm_kzalloc(&pdev->dev, sizeof(*tegra), GFP_KERNEL); @@ -650,8 +650,14 @@ static int tegra_devfreq_probe(struct platform_device *pdev) reset_control_deassert(tegra->reset); - tegra->max_freq = clk_round_rate(tegra->emc_clock, ULONG_MAX) / KHZ; + rate = clk_round_rate(tegra->emc_clock, ULONG_MAX); + if (rate < 0) { + dev_err(&pdev->dev, "Failed to round clock rate: %ld\n", rate); + return rate; + } + tegra->cur_freq = clk_get_rate(tegra->emc_clock) / KHZ; + tegra->max_freq = rate / KHZ; for (i = 0; i < ARRAY_SIZE(actmon_device_configs); i++) { dev = tegra->devices + i; @@ -662,6 +668,13 @@ static int tegra_devfreq_probe(struct platform_device *pdev) for (rate = 0; rate <= tegra->max_freq * KHZ; rate++) { rate = clk_round_rate(tegra->emc_clock, rate); + if (rate < 0) { + dev_err(&pdev->dev, + "Failed to round clock rate: %ld\n", rate); + err = rate; + goto remove_opps; + } + err = dev_pm_opp_add(&pdev->dev, rate, 0); if (err) { dev_err(&pdev->dev, "Failed to add OPP: %d\n", err); From patchwork Tue Jul 30 16:22:20 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 11066105 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 35E59112C for ; Tue, 30 Jul 2019 16:33:49 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 25DAF28671 for ; Tue, 30 Jul 2019 16:33:49 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1A593286A1; Tue, 30 Jul 2019 16:33:49 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 B6C9228671 for ; Tue, 30 Jul 2019 16:33:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732859AbfG3Qcd (ORCPT ); Tue, 30 Jul 2019 12:32:33 -0400 Received: from mail-wm1-f68.google.com ([209.85.128.68]:35782 "EHLO mail-wm1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732810AbfG3Qc0 (ORCPT ); Tue, 30 Jul 2019 12:32:26 -0400 Received: by mail-wm1-f68.google.com with SMTP id l2so57213824wmg.0; Tue, 30 Jul 2019 09:32:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=bdIejvgC5kaa3wn/Z/zklRDPf5qDMoTs2AWg86KAKyQ=; b=D5TqpdBRVqAqqkcVW611wKboN66wqHhvyBXZmkN5Cs4e273DzmFV+h4/GrtALNRUSJ x8khvlkAAoVOpQ37fPdwufK7IqfDMGCQEbzHxI01spFwtTO9d99DFHkrUkfKP+mlzMYn BYUHUt7DvdftF0gdAarEy+1uB5bpwhf1tiWZ5uKBB3mTZSC+bFm5Jb1FJ1KBpRt+zOCx vyySytsAR8QwcyYUaeHZvScc0u+5q90wKWaPlupXK+hMY3AWLLVhPtQ4paGV0hf+2NVo LMH8mwvn5uBMaV5Hly9PdVcj3y1I+rOVVx1ebaFbPL8HScoJTTJoFC76el6PQlrF8/0x qVHQ== 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=bdIejvgC5kaa3wn/Z/zklRDPf5qDMoTs2AWg86KAKyQ=; b=ELQd/oE1py6q4e4qQzbIODyS8YUL2+WRj5P2oo6yx5iTFwyku4upL80hNqE0W23+9y 5W9DrRgexbuLCQn8bTMeQENevTp8ankiLv+zZB9WAKXLpCUZaCVxsK+sIXEjArQAJynD kB9nzk//zCj+briBGf5Y7lwIOMsyNoQRlaor2/+kUhjE0TBjGjZP3BmQv1ok3a1OToBJ trt/WUBiM9ihx6ear94LhECRWyAhvOel8PCYsYEEtTMnxZkRKQR6w5kM+cYIoT5FDJds SV0UaKxYAqcZc16oWuOHOxc9hJVXjXKdqzIQV+3ilviiAUmRJdKw5PHjof6ZPdZtsDAI zjsw== X-Gm-Message-State: APjAAAUFj4Ip3BVf4+3pkmhdKcp3zqKw/kQM2kUhOuJtKxF5+ei3MO8x rxSyznl1D6lQjkbuXm4NJ0g= X-Google-Smtp-Source: APXvYqys4KDqUTalkll3A+irj2HQVD4jyQL/DSD/vHU0bHldNWGX4UeyFKyJSxwHIq1EgzEplK2QGQ== X-Received: by 2002:a1c:3587:: with SMTP id c129mr109441547wma.90.1564504343908; Tue, 30 Jul 2019 09:32:23 -0700 (PDT) Received: from localhost.localdomain (ppp91-78-220-99.pppoe.mtu-net.ru. [91.78.220.99]) by smtp.gmail.com with ESMTPSA id c65sm64835175wma.44.2019.07.30.09.32.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jul 2019 09:32:23 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 04/20] PM / devfreq: tegra30: Drop write-barrier Date: Tue, 30 Jul 2019 19:22:20 +0300 Message-Id: <20190730162236.6063-5-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190730162236.6063-1-digetx@gmail.com> References: <20190730162236.6063-1-digetx@gmail.com> MIME-Version: 1.0 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 There is no need in a write-barrier now, given that interrupt masking is handled by CPU's GIC now. Hence we know exactly that interrupt won't fire after stopping the devfreq's governor. In other cases we don't care about potential buffering of the writes to hardware and thus there is no need to stall CPU. Reviewed-by: Chanwoo Choi Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index bfee9d43de1e..ee14bf534c0d 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -230,12 +230,6 @@ static void tegra_devfreq_update_wmark(struct tegra_devfreq *tegra, ACTMON_DEV_LOWER_WMARK); } -static void actmon_write_barrier(struct tegra_devfreq *tegra) -{ - /* ensure the update has reached the ACTMON */ - readl(tegra->regs + ACTMON_GLB_STATUS); -} - static void actmon_isr_device(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev) { @@ -287,8 +281,6 @@ static void actmon_isr_device(struct tegra_devfreq *tegra, device_writel(dev, dev_ctrl, ACTMON_DEV_CTRL); device_writel(dev, ACTMON_INTR_STATUS_CLEAR, ACTMON_DEV_INTR_STATUS); - - actmon_write_barrier(tegra); } static unsigned long actmon_cpu_to_emc_rate(struct tegra_devfreq *tegra, @@ -376,8 +368,6 @@ static int tegra_actmon_rate_notify_cb(struct notifier_block *nb, tegra_devfreq_update_wmark(tegra, dev); } - actmon_write_barrier(tegra); - return NOTIFY_OK; } @@ -423,8 +413,6 @@ static void tegra_actmon_start(struct tegra_devfreq *tegra) for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) tegra_actmon_configure_device(tegra, &tegra->devices[i]); - actmon_write_barrier(tegra); - enable_irq(tegra->irq); } @@ -439,8 +427,6 @@ static void tegra_actmon_stop(struct tegra_devfreq *tegra) device_writel(&tegra->devices[i], ACTMON_INTR_STATUS_CLEAR, ACTMON_DEV_INTR_STATUS); } - - actmon_write_barrier(tegra); } static int tegra_devfreq_target(struct device *dev, unsigned long *freq, From patchwork Tue Jul 30 16:22:21 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 11066111 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 9E4C414DB for ; Tue, 30 Jul 2019 16:34:01 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 896D128658 for ; Tue, 30 Jul 2019 16:34:01 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7B5332867C; Tue, 30 Jul 2019 16:34:01 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 5C82228658 for ; Tue, 30 Jul 2019 16:34:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732847AbfG3Qcd (ORCPT ); Tue, 30 Jul 2019 12:32:33 -0400 Received: from mail-wr1-f68.google.com ([209.85.221.68]:35030 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732820AbfG3Qc3 (ORCPT ); Tue, 30 Jul 2019 12:32:29 -0400 Received: by mail-wr1-f68.google.com with SMTP id y4so66495392wrm.2; Tue, 30 Jul 2019 09:32:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Z+D4amdoS+CtUBZsRTGRL9HUIA0YaiJWDQzAsmv9gmA=; b=PI29cbH94krRntP73xK6NMMd3mLqHyPk02GdPgVUoao1F3fssiVIHG3iQFJnFNpND9 fwoA8U3LpRy8MIXusIhFmHSCIHfTxAHO9Hi40d8If2CxHNyhX0u/wJ9HBk8m3GTC+HQq blwzxcOStjhV8dNcRavAZ4snIz3unUKSKQ9//YV3oMbIXgVnEYun6XFchjk1zUx5nnQC 2q1dVM8UqpayuGklXLZ0bU8k2lNTcXoQPmuvEaVNA7eRXr/7WrGMzLJI/Y3SKoJDto4g 9BRnPwS9pwAbGJHV9IqXfbthzOJf5Z9qAJQB/j9nZ2EjRkTMWAi/PtC0aDiPvK87R4pL jTfQ== 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=Z+D4amdoS+CtUBZsRTGRL9HUIA0YaiJWDQzAsmv9gmA=; b=SZ/jCEKy1XfkRphHDV/0qgxg4KeCC41FVIOcNullk3bqDzEDWFmJcpgvzOZK6kHoRY ll1Mzc1k4VPnVNVbtAFDkWGxQ/6lsI29yCoklFIRx/18hSaaJEGHpcyz9ifuDroZ4p3R jsONCrDrDsUhxD2MMBuupYneetuHfRdIStX//DGAPr/oQDSi2k+Fc/J+BH8Eabx7mUmO lM1Ow2FkkctGHbOl7dXICWnikZ2e9yqjpC7IqKfWclXWQeK+Lcv+RNxAV2VWPdFSIHLX ksBQIM9VGlZgLC18oqIeMOd8Y/ohr/Y/T7CRLxYrfmQin/q8I2bSXUb8vChTynkpOjqC mz5Q== X-Gm-Message-State: APjAAAUngdTROTN3apbTlDWbo8Cvy8kNSxg99pIRWRxgMzM2N/wWxZUa Fblg8MJeUZ1LRq6zKB6PisefJmMl X-Google-Smtp-Source: APXvYqxgEYCReKj4DM5k1QJqtUhLErD10myTtsnM3vENPLxeXJDsu975NNJizKsp7M68ST0V2sRmAA== X-Received: by 2002:a5d:4b50:: with SMTP id w16mr119994980wrs.132.1564504345404; Tue, 30 Jul 2019 09:32:25 -0700 (PDT) Received: from localhost.localdomain (ppp91-78-220-99.pppoe.mtu-net.ru. [91.78.220.99]) by smtp.gmail.com with ESMTPSA id c65sm64835175wma.44.2019.07.30.09.32.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jul 2019 09:32:24 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 05/20] PM / devfreq: tegra30: Set up watermarks properly Date: Tue, 30 Jul 2019 19:22:21 +0300 Message-Id: <20190730162236.6063-6-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190730162236.6063-1-digetx@gmail.com> References: <20190730162236.6063-1-digetx@gmail.com> MIME-Version: 1.0 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 current implementation is inaccurate and results in very intensive interrupt activity, which neglects the whole idea of polling offload to hardware. The reason of the shortcoming is that watermarks are not set up correctly and this results in ACTMON constantly asking to change freq and then these requests are ignored. The end result of this patch is that there are few hundreds of ACTMON's interrupts instead of tens thousands after few minutes of a working devfreq, meanwhile the transitions activity stays about the same and governor becomes more reactive. Since watermarks are set precisely correct now, the boosting logic is changed a tad to accommodate the change. The "average sustain coefficient" multiplier is gone now since there is no need to compensate the improper watermarks and EMC frequency-bump happens once boosting hits the upper watermark enough times, depending on the per-device boosting threshold. Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 293 +++++++++++++++++++++--------- 1 file changed, 209 insertions(+), 84 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index ee14bf534c0d..2331052fd8bd 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -47,6 +47,8 @@ #define ACTMON_DEV_INTR_CONSECUTIVE_UPPER BIT(31) #define ACTMON_DEV_INTR_CONSECUTIVE_LOWER BIT(30) +#define ACTMON_DEV_INTR_AVG_BELOW_WMARK BIT(25) +#define ACTMON_DEV_INTR_AVG_ABOVE_WMARK BIT(24) #define ACTMON_ABOVE_WMARK_WINDOW 1 #define ACTMON_BELOW_WMARK_WINDOW 3 @@ -63,9 +65,8 @@ * ACTMON_AVERAGE_WINDOW_LOG2: default value for @DEV_CTRL_K_VAL, which * translates to 2 ^ (K_VAL + 1). ex: 2 ^ (6 + 1) = 128 */ -#define ACTMON_AVERAGE_WINDOW_LOG2 6 -#define ACTMON_SAMPLING_PERIOD 12 /* ms */ -#define ACTMON_DEFAULT_AVG_BAND 6 /* 1/10 of % */ +#define ACTMON_AVERAGE_WINDOW_LOG2 6 +#define ACTMON_SAMPLING_PERIOD 12 /* ms */ #define KHZ 1000 @@ -142,9 +143,6 @@ struct tegra_devfreq_device { * watermark breaches. */ unsigned long boost_freq; - - /* Optimal frequency calculated from the stats for this device */ - unsigned long target_freq; }; struct tegra_devfreq { @@ -156,7 +154,6 @@ struct tegra_devfreq { struct clk *emc_clock; unsigned long max_freq; - unsigned long cur_freq; struct notifier_block rate_change_nb; struct tegra_devfreq_device devices[ARRAY_SIZE(actmon_device_configs)]; @@ -205,42 +202,182 @@ static unsigned long do_percent(unsigned long val, unsigned int pct) return val * pct / 100; } +static unsigned long actmon_cpu_to_emc_rate(struct tegra_devfreq *tegra) +{ + struct tegra_actmon_emc_ratio *ratio = actmon_emc_ratios; + unsigned int cpu_freq = cpufreq_quick_get(0); + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(actmon_emc_ratios); i++, ratio++) { + if (cpu_freq >= ratio->cpu_freq) { + if (ratio->emc_freq >= tegra->max_freq) + return tegra->max_freq; + else + return ratio->emc_freq; + } + } + + return 0; +} + +static unsigned long +tegra_actmon_account_cpu_freq(struct tegra_devfreq *tegra, + struct tegra_devfreq_device *dev, + unsigned long target_freq) +{ + unsigned long static_cpu_emc_freq; + + if (dev->config->avg_dependency_threshold && + dev->config->avg_dependency_threshold < dev->avg_count) { + static_cpu_emc_freq = actmon_cpu_to_emc_rate(tegra); + target_freq = max(target_freq, static_cpu_emc_freq); + } + + return target_freq; +} + +static unsigned long tegra_actmon_lower_freq(struct tegra_devfreq *tegra, + unsigned long target_freq) +{ + unsigned long lower = target_freq; + struct dev_pm_opp *opp; + + opp = dev_pm_opp_find_freq_floor(tegra->devfreq->dev.parent, &lower); + if (IS_ERR(opp)) + lower = 0; + else + dev_pm_opp_put(opp); + + return lower; +} + +static unsigned long tegra_actmon_upper_freq(struct tegra_devfreq *tegra, + unsigned long target_freq) +{ + unsigned long upper = target_freq + 1; + struct dev_pm_opp *opp; + + opp = dev_pm_opp_find_freq_ceil(tegra->devfreq->dev.parent, &upper); + if (IS_ERR(opp)) + upper = ULONG_MAX; + else + dev_pm_opp_put(opp); + + return upper; +} + +static void tegra_actmon_get_lower_upper(struct tegra_devfreq *tegra, + struct tegra_devfreq_device *dev, + unsigned long target_freq, + unsigned long *lower, + unsigned long *upper) +{ + /* + * Memory frequencies are guaranteed to have 1MHz granularity + * and thus we need this rounding down to get a proper watermarks + * range in a case where target_freq falls into a range of + * next_possible_opp_freq - 1MHz. + */ + target_freq = round_down(target_freq, 1000000); + + /* watermarks are set at the borders of the corresponding OPPs */ + *lower = tegra_actmon_lower_freq(tegra, target_freq); + *upper = tegra_actmon_upper_freq(tegra, target_freq); + + *lower /= KHZ; + *upper /= KHZ; + + /* + * The upper watermark should take into account CPU's frequency + * because cpu_to_emc_rate() may override the target_freq with + * a higher value and thus upper watermark need to be set up + * accordingly to avoid parasitic upper-events. + */ + *upper = tegra_actmon_account_cpu_freq(tegra, dev, *upper); + + *lower *= ACTMON_SAMPLING_PERIOD; + *upper *= ACTMON_SAMPLING_PERIOD; +} + static void tegra_devfreq_update_avg_wmark(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev) { - u32 avg = dev->avg_count; - u32 avg_band_freq = tegra->max_freq * ACTMON_DEFAULT_AVG_BAND / KHZ; - u32 band = avg_band_freq * ACTMON_SAMPLING_PERIOD; + unsigned long lower, upper, freq; - device_writel(dev, avg + band, ACTMON_DEV_AVG_UPPER_WMARK); + freq = dev->avg_count / ACTMON_SAMPLING_PERIOD * KHZ; + tegra_actmon_get_lower_upper(tegra, dev, freq, &lower, &upper); - avg = max(dev->avg_count, band); - device_writel(dev, avg - band, ACTMON_DEV_AVG_LOWER_WMARK); + /* + * We want to get interrupts when MCCPU client crosses the + * dependency threshold in order to take into / out of account + * the CPU's freq. + */ + if (lower < dev->config->avg_dependency_threshold && + upper > dev->config->avg_dependency_threshold) { + if (dev->avg_count < dev->config->avg_dependency_threshold) + upper = dev->config->avg_dependency_threshold; + else + lower = dev->config->avg_dependency_threshold; + } + + device_writel(dev, lower, ACTMON_DEV_AVG_LOWER_WMARK); + device_writel(dev, upper, ACTMON_DEV_AVG_UPPER_WMARK); } static void tegra_devfreq_update_wmark(struct tegra_devfreq *tegra, - struct tegra_devfreq_device *dev) + struct tegra_devfreq_device *dev, + unsigned long freq) { - u32 val = tegra->cur_freq * ACTMON_SAMPLING_PERIOD; + unsigned long lower, upper, delta; + + /* + * Boosting logic kicks-in once lower / upper watermark is hit. + * The watermarks are based on the updated EMC rate and the + * average activity. + * + * The higher watermark is set in accordance to the EMC rate + * because we want to set it to the highest mark here and EMC rate + * represents that mark. The consecutive-upper interrupts are + * always enabled and we don't want to receive them if they won't + * do anything useful, hence the upper watermark is capped to maximum. + * Note that the EMC rate is changed once boosting pushed the rate + * too high, in that case boosting-up will be stopped because + * upper watermark is much higher now and it is *important* to + * stop the unwanted interrupts. + */ + tegra_actmon_get_lower_upper(tegra, dev, freq - 1, &lower, &upper); + + delta = do_percent(upper - lower, dev->config->boost_up_threshold); + device_writel(dev, lower + delta, ACTMON_DEV_UPPER_WMARK); - device_writel(dev, do_percent(val, dev->config->boost_up_threshold), - ACTMON_DEV_UPPER_WMARK); + /* + * Meanwhile the lower mark is based on the average value + * because it is the lowest possible consecutive-mark for this + * device. Once that mark is hit and boosting is stopped, the + * interrupt is disabled by ISR. + */ + freq = dev->avg_count / ACTMON_SAMPLING_PERIOD * KHZ; + tegra_actmon_get_lower_upper(tegra, dev, freq, &lower, &upper); - device_writel(dev, do_percent(val, dev->config->boost_down_threshold), - ACTMON_DEV_LOWER_WMARK); + delta = do_percent(upper - lower, dev->config->boost_down_threshold); + device_writel(dev, lower + delta, ACTMON_DEV_LOWER_WMARK); } static void actmon_isr_device(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev) { - u32 intr_status, dev_ctrl; + u32 intr_status, dev_ctrl, avg_intr_mask; dev->avg_count = device_readl(dev, ACTMON_DEV_AVG_COUNT); - tegra_devfreq_update_avg_wmark(tegra, dev); - intr_status = device_readl(dev, ACTMON_DEV_INTR_STATUS); dev_ctrl = device_readl(dev, ACTMON_DEV_CTRL); + avg_intr_mask = ACTMON_DEV_INTR_AVG_BELOW_WMARK | + ACTMON_DEV_INTR_AVG_ABOVE_WMARK; + + if (intr_status & avg_intr_mask) + tegra_devfreq_update_avg_wmark(tegra, dev); + if (intr_status & ACTMON_DEV_INTR_CONSECUTIVE_UPPER) { /* * new_boost = min(old_boost * up_coef + step, max_freq) @@ -253,8 +390,6 @@ static void actmon_isr_device(struct tegra_devfreq *tegra, if (dev->boost_freq >= tegra->max_freq) dev->boost_freq = tegra->max_freq; - else - dev_ctrl |= ACTMON_DEV_CTRL_CONSECUTIVE_ABOVE_WMARK_EN; } else if (intr_status & ACTMON_DEV_INTR_CONSECUTIVE_LOWER) { /* * new_boost = old_boost * down_coef @@ -263,63 +398,37 @@ static void actmon_isr_device(struct tegra_devfreq *tegra, dev->boost_freq = do_percent(dev->boost_freq, dev->config->boost_down_coeff); - dev_ctrl |= ACTMON_DEV_CTRL_CONSECUTIVE_ABOVE_WMARK_EN; - if (dev->boost_freq < (ACTMON_BOOST_FREQ_STEP >> 1)) dev->boost_freq = 0; - else - dev_ctrl |= ACTMON_DEV_CTRL_CONSECUTIVE_BELOW_WMARK_EN; } - if (dev->config->avg_dependency_threshold) { - if (dev->avg_count >= dev->config->avg_dependency_threshold) - dev_ctrl |= ACTMON_DEV_CTRL_CONSECUTIVE_BELOW_WMARK_EN; - else if (dev->boost_freq == 0) - dev_ctrl &= ~ACTMON_DEV_CTRL_CONSECUTIVE_BELOW_WMARK_EN; + if (intr_status & avg_intr_mask) { + /* + * Once average watermark is hit, it means that the memory + * activity changed significantly and thus boosting-up shall + * be reset because EMC clock rate will be changed and + * boosting will restart in this case. + */ + dev->boost_freq = 0; } - device_writel(dev, dev_ctrl, ACTMON_DEV_CTRL); + /* no boosting => no need for consecutive-down interrupt */ + if (dev->boost_freq == 0) + dev_ctrl &= ~ACTMON_DEV_CTRL_CONSECUTIVE_BELOW_WMARK_EN; + device_writel(dev, dev_ctrl, ACTMON_DEV_CTRL); device_writel(dev, ACTMON_INTR_STATUS_CLEAR, ACTMON_DEV_INTR_STATUS); } -static unsigned long actmon_cpu_to_emc_rate(struct tegra_devfreq *tegra, - unsigned long cpu_freq) -{ - unsigned int i; - struct tegra_actmon_emc_ratio *ratio = actmon_emc_ratios; - - for (i = 0; i < ARRAY_SIZE(actmon_emc_ratios); i++, ratio++) { - if (cpu_freq >= ratio->cpu_freq) { - if (ratio->emc_freq >= tegra->max_freq) - return tegra->max_freq; - else - return ratio->emc_freq; - } - } - - return 0; -} - -static void actmon_update_target(struct tegra_devfreq *tegra, - struct tegra_devfreq_device *dev) +static unsigned long actmon_update_target(struct tegra_devfreq *tegra, + struct tegra_devfreq_device *dev) { - unsigned long cpu_freq = 0; - unsigned long static_cpu_emc_freq = 0; - unsigned int avg_sustain_coef; - - if (dev->config->avg_dependency_threshold) { - cpu_freq = cpufreq_get(0); - static_cpu_emc_freq = actmon_cpu_to_emc_rate(tegra, cpu_freq); - } + unsigned long target_freq; - dev->target_freq = dev->avg_count / ACTMON_SAMPLING_PERIOD; - avg_sustain_coef = 100 * 100 / dev->config->boost_up_threshold; - dev->target_freq = do_percent(dev->target_freq, avg_sustain_coef); - dev->target_freq += dev->boost_freq; + target_freq = dev->avg_count / ACTMON_SAMPLING_PERIOD + dev->boost_freq; + target_freq = tegra_actmon_account_cpu_freq(tegra, dev, target_freq); - if (dev->avg_count >= dev->config->avg_dependency_threshold) - dev->target_freq = max(dev->target_freq, static_cpu_emc_freq); + return target_freq; } static irqreturn_t actmon_thread_isr(int irq, void *data) @@ -351,8 +460,8 @@ static int tegra_actmon_rate_notify_cb(struct notifier_block *nb, unsigned long action, void *ptr) { struct clk_notifier_data *data = ptr; - struct tegra_devfreq *tegra; struct tegra_devfreq_device *dev; + struct tegra_devfreq *tegra; unsigned int i; if (action != POST_RATE_CHANGE) @@ -360,12 +469,28 @@ static int tegra_actmon_rate_notify_cb(struct notifier_block *nb, tegra = container_of(nb, struct tegra_devfreq, rate_change_nb); - tegra->cur_freq = data->new_rate / KHZ; - + /* + * EMC rate could change due to three reasons: + * + * 1. Average watermark hit + * 2. Boosting overflow + * 3. CPU freq change + * + * Once rate is changed, the consecutive watermarks need to be + * updated in order for boosting to work properly and to avoid + * unnecessary interrupts. Note that the consecutive range is set for + * all of devices using the same rate, hence if CPU is doing much + * less than the other memory clients, then its upper watermark will + * be very high in comparison to the actual activity (lower watermark) + * and thus unnecessary upper-interrupts will be suppressed. + * + * The average watermarks also should be updated because of 3. + */ for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) { dev = &tegra->devices[i]; - tegra_devfreq_update_wmark(tegra, dev); + tegra_devfreq_update_avg_wmark(tegra, dev); + tegra_devfreq_update_wmark(tegra, dev, data->new_rate); } return NOTIFY_OK; @@ -374,15 +499,14 @@ static int tegra_actmon_rate_notify_cb(struct notifier_block *nb, static void tegra_actmon_configure_device(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev) { - u32 val = 0; - - dev->target_freq = tegra->cur_freq; + u32 val = 0, target_freq; - dev->avg_count = tegra->cur_freq * ACTMON_SAMPLING_PERIOD; + target_freq = clk_get_rate(tegra->emc_clock) / KHZ; + dev->avg_count = target_freq * ACTMON_SAMPLING_PERIOD; device_writel(dev, dev->avg_count, ACTMON_DEV_INIT_AVG); tegra_devfreq_update_avg_wmark(tegra, dev); - tegra_devfreq_update_wmark(tegra, dev); + tegra_devfreq_update_wmark(tegra, dev, target_freq); device_writel(dev, ACTMON_COUNT_WEIGHT, ACTMON_DEV_COUNT_WEIGHT); device_writel(dev, ACTMON_INTR_STATUS_CLEAR, ACTMON_DEV_INTR_STATUS); @@ -469,13 +593,13 @@ static int tegra_devfreq_get_dev_status(struct device *dev, struct tegra_devfreq_device *actmon_dev; unsigned long cur_freq; - cur_freq = READ_ONCE(tegra->cur_freq); + cur_freq = clk_get_rate(tegra->emc_clock); /* To be used by the tegra governor */ stat->private_data = tegra; /* The below are to be used by the other governors */ - stat->current_frequency = cur_freq * KHZ; + stat->current_frequency = cur_freq; actmon_dev = &tegra->devices[MCALL]; @@ -486,7 +610,7 @@ static int tegra_devfreq_get_dev_status(struct device *dev, stat->busy_time *= 100 / BUS_SATURATION_RATIO; /* Number of cycles in a sampling period */ - stat->total_time = ACTMON_SAMPLING_PERIOD * cur_freq; + stat->total_time = cur_freq / KHZ * ACTMON_SAMPLING_PERIOD; stat->busy_time = min(stat->busy_time, stat->total_time); @@ -505,6 +629,7 @@ static int tegra_governor_get_target(struct devfreq *devfreq, struct devfreq_dev_status *stat; struct tegra_devfreq *tegra; struct tegra_devfreq_device *dev; + unsigned long dev_target_freq; unsigned long target_freq = 0; unsigned int i; int err; @@ -520,9 +645,9 @@ static int tegra_governor_get_target(struct devfreq *devfreq, for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) { dev = &tegra->devices[i]; - actmon_update_target(tegra, dev); + dev_target_freq = actmon_update_target(tegra, dev); - target_freq = max(target_freq, dev->target_freq); + target_freq = max(target_freq, dev_target_freq); } *freq = target_freq * KHZ; @@ -642,7 +767,6 @@ static int tegra_devfreq_probe(struct platform_device *pdev) return rate; } - tegra->cur_freq = clk_get_rate(tegra->emc_clock) / KHZ; tegra->max_freq = rate / KHZ; for (i = 0; i < ARRAY_SIZE(actmon_device_configs); i++) { @@ -671,7 +795,8 @@ static int tegra_devfreq_probe(struct platform_device *pdev) platform_set_drvdata(pdev, tegra); tegra->rate_change_nb.notifier_call = tegra_actmon_rate_notify_cb; - err = clk_notifier_register(tegra->emc_clock, &tegra->rate_change_nb); + err = clk_notifier_register(tegra->emc_clock, + &tegra->rate_change_nb); if (err) { dev_err(&pdev->dev, "Failed to register rate change notifier\n"); From patchwork Tue Jul 30 16:22:22 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 11066077 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 9BDF0186E for ; Tue, 30 Jul 2019 16:32:34 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8AEF22864E for ; Tue, 30 Jul 2019 16:32:34 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7F0A42866D; Tue, 30 Jul 2019 16:32:34 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 319A028704 for ; Tue, 30 Jul 2019 16:32:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732854AbfG3Qcd (ORCPT ); Tue, 30 Jul 2019 12:32:33 -0400 Received: from mail-wr1-f68.google.com ([209.85.221.68]:37083 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732828AbfG3Qc2 (ORCPT ); Tue, 30 Jul 2019 12:32:28 -0400 Received: by mail-wr1-f68.google.com with SMTP id n9so41401344wrr.4; Tue, 30 Jul 2019 09:32:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=g5tURnCPvlR1FgVTUPFvio04s8CzBn2V+f8QGTCwOFA=; b=IGInv4Z4YwMrX+CzLKwBULMOwtb1kMKFrTq5nNuQJXWIxGRIAxRnoRhL/V0wizQrc2 OYfkqFqb8nmpMrTo9SIAWsIHJP+aWJouQTY/LOHOCZvYu5hbbCALBhYFe6DmdiNBTp0L DCp9z6Bc4mJ5sXMG/uLNbAEJRkcXeI+OlsqPj4a5muYfK/QU2EKmdDqTaHUrDSyI67cd 2f5Hoq6j6xmbvpWaWycijHRihZuxYHaBY58LEuznOBmhb+2KRsWS6iwG+1ceup7Ss5qq DWz/uzhsDsC7ATPepc0H6DB5JvVFYqrNhfW7vNu0q1ckJzvq1+a5Tf/oN4dDe29E5ifo PXQQ== 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=g5tURnCPvlR1FgVTUPFvio04s8CzBn2V+f8QGTCwOFA=; b=aGNo+BO9D/+JEZmXqtzFk75iD6Ar5aPU+l05BA+CCgdFFdbE2CNYkIpAq4fuYY6IUG QeNl6p417OutPFcg2Fe0Otk/qJfM40x4iXH9g2X/2kAyrOrRBhP0/syoV2KTcXa5J+iG tOcv0kHLksGJNbDRy0L6Us5KVNEWXheEYlQU17PTgQTnuh+V2KCoUayJrz+3gZk/S8ZL MgdhjkE9b29uRXfrQuxoWcpVBE6YCUd/LfViJOuTOyLMj96oH/nl1byIOHEF766bmVEx L3bGQVM6sixydsdnEiu+NiYlADJ8/jnjKzuxW8UI8zKwt9cOxvpfH3mPsjrPbr5Dq/VU 9Ccg== X-Gm-Message-State: APjAAAVNl2AG3MuBV+J7UkM2GzooDjYSTlnXnzwSbERQ2SmfdqhddELT SIdepviy5KHCa6dPXC+MYp740ibt X-Google-Smtp-Source: APXvYqwd3YWgwQpq7SrWlW8v2kpTJkh48PQh6m24ruER9NF1l3cCVBckpMSQWVcPAfZly9ld9NEJfw== X-Received: by 2002:adf:ed8a:: with SMTP id c10mr132636248wro.33.1564504346710; Tue, 30 Jul 2019 09:32:26 -0700 (PDT) Received: from localhost.localdomain (ppp91-78-220-99.pppoe.mtu-net.ru. [91.78.220.99]) by smtp.gmail.com with ESMTPSA id c65sm64835175wma.44.2019.07.30.09.32.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jul 2019 09:32:26 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 06/20] PM / devfreq: tegra30: Tune up boosting thresholds Date: Tue, 30 Jul 2019 19:22:22 +0300 Message-Id: <20190730162236.6063-7-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190730162236.6063-1-digetx@gmail.com> References: <20190730162236.6063-1-digetx@gmail.com> MIME-Version: 1.0 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 Now that average-sustain coefficient / multiplier is gone, it won't hurt to re-tune the boosting thresholds to get a bit harder boosting for MCALL clients, resulting in a more reactive governing in a case of multimedia applications usage like 3d / video. Reviewed-by: Chanwoo Choi Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index 2331052fd8bd..4525c051f85c 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -111,8 +111,8 @@ static struct tegra_devfreq_device_config actmon_device_configs[] = { .irq_mask = 1 << 26, .boost_up_coeff = 200, .boost_down_coeff = 50, - .boost_up_threshold = 60, - .boost_down_threshold = 40, + .boost_up_threshold = 50, + .boost_down_threshold = 25, }, { /* MCCPU: memory accesses from the CPUs */ From patchwork Tue Jul 30 16:22:23 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 11066073 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 1FCC2112C for ; Tue, 30 Jul 2019 16:32:34 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0F6CD28671 for ; Tue, 30 Jul 2019 16:32:34 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 030082867C; Tue, 30 Jul 2019 16:32:33 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 A6C212864E for ; Tue, 30 Jul 2019 16:32:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725871AbfG3Qcc (ORCPT ); Tue, 30 Jul 2019 12:32:32 -0400 Received: from mail-wr1-f65.google.com ([209.85.221.65]:33964 "EHLO mail-wr1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732831AbfG3Qc3 (ORCPT ); Tue, 30 Jul 2019 12:32:29 -0400 Received: by mail-wr1-f65.google.com with SMTP id 31so66515162wrm.1; Tue, 30 Jul 2019 09:32:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=WHBbqbfFd0BRb3uV6lTGI/raeYIwezEYsIDJ6CAqnew=; b=NOsQUkAHUbBKJkEQDYdf9orMNjGdUlOLEbihtSpdWqMReWthFuC7gSvsnTq6k0HJu2 WXLTu49yiS9IkRNFuM2dmZWl53KqzY0aNt71mzrweHjPE95NsaErymAHmPPkL5Ui87Gv FzQzWg/IpryqzRPE2NvosLu0nhGrZKk9LTKV5OAbOsRSNQj31FjK4VgPtwH79V+v0Pnu hq7W8iwWInx+F+C8WYEfc9Qjm7Hw5Puff4FlMmcgbu+/dUemJkedAYBTzYjaG1U6FWJ9 pY3QFdmyJp4eUd+7GeLDXDRd03bJ+tr5rRaUe+zaXD6583btfDgfaIhhnuSvy5odbcU3 5hGQ== 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=WHBbqbfFd0BRb3uV6lTGI/raeYIwezEYsIDJ6CAqnew=; b=G5RY28pL4PbBwl+Xs69+XN3QCldEg9zLTXIi9k1A/yGW+zAttIudpNFWxZ55jn6v6a iFhjYYG4+nuE7vyN4tiLVl8jF+FwWkr7MiEaL6LvfonigFS2giK+s09BPpqo9pVPvb1m rkBd0gJnB8nESeoz2mR/ekmR027t/IkXehsCqLzopWDVaxgF/TmS+Mx59Kx4H0UAAkp+ lsZoSw1Y7UCUBpbPbxzK8CvljAqXkbnI3s01f7KN3++6fUU9EZYZ09mBmv6d++hmiLl5 rcrrz1Lr7fOTq3Tq36vv1Do+W5ZOsu/OE0qboVdkXDjeNPLvoK0iPqiMbmtJCnykjUb9 AytQ== X-Gm-Message-State: APjAAAW26sijGKqVZ1qAdU1pDJf2AziIpfa2GA8qjlUTYWVLEbmIJuWt IE5Vz7+3zS9j9g1ACOnGf40= X-Google-Smtp-Source: APXvYqzGQEp+w42idntKHGTPcZFnvHK7pxdgdlOjEGe3nu686QWc4MYOrCIqgRrUzTQ1l8Iif6Yd9w== X-Received: by 2002:adf:dd8e:: with SMTP id x14mr126350891wrl.344.1564504347946; Tue, 30 Jul 2019 09:32:27 -0700 (PDT) Received: from localhost.localdomain (ppp91-78-220-99.pppoe.mtu-net.ru. [91.78.220.99]) by smtp.gmail.com with ESMTPSA id c65sm64835175wma.44.2019.07.30.09.32.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jul 2019 09:32:27 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 07/20] PM / devfreq: tegra30: Fix integer overflow on CPU's freq max out Date: Tue, 30 Jul 2019 19:22:23 +0300 Message-Id: <20190730162236.6063-8-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190730162236.6063-1-digetx@gmail.com> References: <20190730162236.6063-1-digetx@gmail.com> MIME-Version: 1.0 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 There is another kHz-conversion bug in the code, resulting in integer overflow. Although, this time the resulting value is 4294966296 and it's close to ULONG_MAX, which is okay in this case. Reviewed-by: Chanwoo Choi Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index 4525c051f85c..70dce58212a4 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -70,6 +70,8 @@ #define KHZ 1000 +#define KHZ_MAX (ULONG_MAX / KHZ) + /* Assume that the bus is saturated if the utilization is 25% */ #define BUS_SATURATION_RATIO 25 @@ -167,7 +169,7 @@ struct tegra_actmon_emc_ratio { }; static struct tegra_actmon_emc_ratio actmon_emc_ratios[] = { - { 1400000, ULONG_MAX }, + { 1400000, KHZ_MAX }, { 1200000, 750000 }, { 1100000, 600000 }, { 1000000, 500000 }, From patchwork Tue Jul 30 16:22:24 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 11066075 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 3E0F514DB for ; Tue, 30 Jul 2019 16:32:34 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2E6812864E for ; Tue, 30 Jul 2019 16:32:34 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1F3DF2866D; Tue, 30 Jul 2019 16:32:34 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 C65972866D for ; Tue, 30 Jul 2019 16:32:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732842AbfG3Qcc (ORCPT ); Tue, 30 Jul 2019 12:32:32 -0400 Received: from mail-wr1-f66.google.com ([209.85.221.66]:45979 "EHLO mail-wr1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732835AbfG3Qca (ORCPT ); Tue, 30 Jul 2019 12:32:30 -0400 Received: by mail-wr1-f66.google.com with SMTP id f9so66460177wre.12; Tue, 30 Jul 2019 09:32:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=8iZqkZqXjTfAXjJSJnLg5xR1FkU/5dVzGt00ebVBBCo=; b=AAghT0wsfPhV/j6U/ghiBwRe0n/heMMEDTKhX2F4Ap9PQ0gtxj9cOQMPDtVpf1ZA/Y krISxNXiKhB/09kR6KwRsOdNFTzIcf3UjK0jRxbHmy3fvqHoG5hp+gxz4B+mnY4IKcW3 jTy43gQNCP4Tdml8w/wbqZo5jKjqwBHV2pDkpuhXsjiwXWypGHf0IsafhHKAKneOTrDs VSkA7xIUDqmMl9Babs+F8HtxIR2AFJhFKqd5J979soBf8Q8+3MTnkFuYYokY/4X50q2K O0yupl8qcgZoBfAe2jx0SUzeRYngNIL0PhuDadvxR8YwGhx/oR9FGB+u45y32nW7Mp1r /1xA== 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=8iZqkZqXjTfAXjJSJnLg5xR1FkU/5dVzGt00ebVBBCo=; b=B0i39xTkpg2LJKgK5ft855jvBqJvSWNlL3myr4jMPSKeVohNc6qY6L3lAd78c4RpbO RpJddkxfh8XG6akU+HmNnM5Jq6q0C5ac/sm5LOQSfu1RiNnfjuJQuQgYbnSYqdbBf5oR Iqcuj6aZImD4vfmOUS2g9qx3cnwGeT77APu+LUT+GQj3veQuChqjiZMaKaNhxhc8yHbB WZfW9JyN/Sd1M7sXR/uoOUOkL7356o1ePtn+L1UPYrFx0WwLme3wYBn367hLeuyEen7D TQO/IeLbzi4UQlI4m1VEMFDFjH1vzm6sWZN+HgwBqpVbn36Zm5k8l1KC27fIo9qnEKeL 4z/Q== X-Gm-Message-State: APjAAAU1xzFcgIKaOKIflbCllQ0uj3QiCoW/f/c3OMqdo6OHwJxNuI3W SHaO+y1Nir6xjHNTBm//lic= X-Google-Smtp-Source: APXvYqyEu3zYvYk5Z8X5j1eud/4T36h60HChVLwgzdl/ZXaiN1ilLV6HKBPnYOMEz55QfG+dw+3DXA== X-Received: by 2002:adf:e552:: with SMTP id z18mr131981622wrm.45.1564504349166; Tue, 30 Jul 2019 09:32:29 -0700 (PDT) Received: from localhost.localdomain (ppp91-78-220-99.pppoe.mtu-net.ru. [91.78.220.99]) by smtp.gmail.com with ESMTPSA id c65sm64835175wma.44.2019.07.30.09.32.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jul 2019 09:32:28 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 08/20] PM / devfreq: tegra30: Ensure that target freq won't overflow Date: Tue, 30 Jul 2019 19:22:24 +0300 Message-Id: <20190730162236.6063-9-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190730162236.6063-1-digetx@gmail.com> References: <20190730162236.6063-1-digetx@gmail.com> MIME-Version: 1.0 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 We already had few integer overflow bugs, let's limit the freq for consistency. Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index 70dce58212a4..ca499368ee81 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -430,7 +430,7 @@ static unsigned long actmon_update_target(struct tegra_devfreq *tegra, target_freq = dev->avg_count / ACTMON_SAMPLING_PERIOD + dev->boost_freq; target_freq = tegra_actmon_account_cpu_freq(tegra, dev, target_freq); - return target_freq; + return min(target_freq, tegra->max_freq); } static irqreturn_t actmon_thread_isr(int irq, void *data) From patchwork Tue Jul 30 16:22:25 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 11066109 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 B521F14DB for ; Tue, 30 Jul 2019 16:33:58 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A54E128658 for ; Tue, 30 Jul 2019 16:33:58 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 99CB92867C; Tue, 30 Jul 2019 16:33:58 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 D64DE28671 for ; Tue, 30 Jul 2019 16:33:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1733052AbfG3Qds (ORCPT ); Tue, 30 Jul 2019 12:33:48 -0400 Received: from mail-wr1-f65.google.com ([209.85.221.65]:40471 "EHLO mail-wr1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732840AbfG3Qce (ORCPT ); Tue, 30 Jul 2019 12:32:34 -0400 Received: by mail-wr1-f65.google.com with SMTP id r1so66466630wrl.7; Tue, 30 Jul 2019 09:32:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=2KvKm2ALIBuaggfliWdwhYglH+E1CmsiYLiIW5ZnHiw=; b=vKsw61Cu3HhF00J9L2OvZQAd2Org7P4W8QRpkOmA8ymw7nkS9+FTcj5XShqiLM9eC6 r/H/flopcf/S/0HBwsgB2Una4FZrXokZf4c8764JZHiIViO9VU4cLup6sRTYo1321g2w DO4Ufz4HFsESnyiLsJZES5I8e3VchBjUjkx5XyIp2EXdmti3BClu7FjB/WmxCkYU8TdE xmz+raBxw29E6XVRKAvfODj0BR3LG6Cehtde9ytce0+LlMU4WHVbeM1GWxTxvWl/amd7 I5VdPFJiyEICB3sLocqs4v9fnW7pMyrpvzNwXMSsGdrVWPybZ1rPAieaM2InTjoXFNvW EDeQ== 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=2KvKm2ALIBuaggfliWdwhYglH+E1CmsiYLiIW5ZnHiw=; b=udzdU/eWO9MTKmfWACFKBHe+XsiGiQ3H3c9hY2sT3Q0NEE5YsO8zyBP3s2uFIYaaSQ P7+8GvEjamZ6Vix9eq4V0vLpEPoJRmUIr7iFpiuF29FsvZCg4uIqg80BEulBLiTNmWOZ 5B36X0jLQZPYuPuQpGXystVnmAt0FwrwpLwAh1jKHc2RroSdPeflLu1lSVrEkJZPWNEZ AY8h9u/OC8Ucp/xlCOw0ve16SyxSYQrD+zw5LUvdEHbC+S2frlBgqrJ9HPgBFpYtXFWQ orz6CtKUVpDZ6R3TuDh07Kcgo30EdIBV3LVeMA7ifnPmFuI57xGaCPdymDkv9M6v4Fq7 ok+g== X-Gm-Message-State: APjAAAVySvMILyXVTYRrMQsF0cp58LHPEkzkO1Sm1Oiqi3nIoRKJAldj h72AGut3A73zvaZirwj8SaZQyMx7 X-Google-Smtp-Source: APXvYqyF179OO/fKrRAIOOkHZIa70Y8nDLcjW1bR3vrjvVImVIxyZaIAdt8iQVqKHf5CWj3QLYlfGg== X-Received: by 2002:a5d:5186:: with SMTP id k6mr25904366wrv.30.1564504350508; Tue, 30 Jul 2019 09:32:30 -0700 (PDT) Received: from localhost.localdomain (ppp91-78-220-99.pppoe.mtu-net.ru. [91.78.220.99]) by smtp.gmail.com with ESMTPSA id c65sm64835175wma.44.2019.07.30.09.32.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jul 2019 09:32:29 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 09/20] PM / devfreq: tegra30: Use kHz units uniformly in the code Date: Tue, 30 Jul 2019 19:22:25 +0300 Message-Id: <20190730162236.6063-10-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190730162236.6063-1-digetx@gmail.com> References: <20190730162236.6063-1-digetx@gmail.com> MIME-Version: 1.0 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 Now that all kHz-conversion related bugs are fixed, we can use the kHz uniformly. This makes code cleaner and avoids integer divisions in the code, which is useful in a case of Tegra30 that has Cortex A9 CPU that doesn't support integer division instructions, hence all divisions are actually made in software mode. Another small benefit from this change is that now powertop utility correctly displays devfreq's stats, for some reason it expects them to be in kHz. Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 81 +++++++++++++++++++------------ 1 file changed, 49 insertions(+), 32 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index ca499368ee81..43d50b4366dd 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -137,8 +137,11 @@ struct tegra_devfreq_device { const struct tegra_devfreq_device_config *config; void __iomem *regs; - /* Average event count sampled in the last interrupt */ - u32 avg_count; + /* + * Average event count sampled in the last interrupt and converted + * to frequency value. + */ + u32 avg_freq; /* * Extra frequency to increase the target by due to consecutive @@ -222,6 +225,14 @@ static unsigned long actmon_cpu_to_emc_rate(struct tegra_devfreq *tegra) return 0; } +static unsigned long +tegra_actmon_dev_avg_dependency_freq(struct tegra_devfreq *tegra, + struct tegra_devfreq_device *dev) +{ + return dev->config->avg_dependency_threshold / + ACTMON_SAMPLING_PERIOD; +} + static unsigned long tegra_actmon_account_cpu_freq(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev, @@ -229,13 +240,15 @@ tegra_actmon_account_cpu_freq(struct tegra_devfreq *tegra, { unsigned long static_cpu_emc_freq; - if (dev->config->avg_dependency_threshold && - dev->config->avg_dependency_threshold < dev->avg_count) { + if (!dev->config->avg_dependency_threshold) + return target_freq; + + if (dev->avg_freq > tegra_actmon_dev_avg_dependency_freq(tegra, dev)) static_cpu_emc_freq = actmon_cpu_to_emc_rate(tegra); - target_freq = max(target_freq, static_cpu_emc_freq); - } + else + static_cpu_emc_freq = 0; - return target_freq; + return max(target_freq, static_cpu_emc_freq); } static unsigned long tegra_actmon_lower_freq(struct tegra_devfreq *tegra, @@ -261,7 +274,7 @@ static unsigned long tegra_actmon_upper_freq(struct tegra_devfreq *tegra, opp = dev_pm_opp_find_freq_ceil(tegra->devfreq->dev.parent, &upper); if (IS_ERR(opp)) - upper = ULONG_MAX; + upper = KHZ_MAX; else dev_pm_opp_put(opp); @@ -280,15 +293,12 @@ static void tegra_actmon_get_lower_upper(struct tegra_devfreq *tegra, * range in a case where target_freq falls into a range of * next_possible_opp_freq - 1MHz. */ - target_freq = round_down(target_freq, 1000000); + target_freq = round_down(target_freq, 1000); /* watermarks are set at the borders of the corresponding OPPs */ *lower = tegra_actmon_lower_freq(tegra, target_freq); *upper = tegra_actmon_upper_freq(tegra, target_freq); - *lower /= KHZ; - *upper /= KHZ; - /* * The upper watermark should take into account CPU's frequency * because cpu_to_emc_rate() may override the target_freq with @@ -304,10 +314,11 @@ static void tegra_actmon_get_lower_upper(struct tegra_devfreq *tegra, static void tegra_devfreq_update_avg_wmark(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev) { - unsigned long lower, upper, freq; + unsigned long avg_dependency_freq, lower, upper; + + tegra_actmon_get_lower_upper(tegra, dev, dev->avg_freq, &lower, &upper); - freq = dev->avg_count / ACTMON_SAMPLING_PERIOD * KHZ; - tegra_actmon_get_lower_upper(tegra, dev, freq, &lower, &upper); + avg_dependency_freq = tegra_actmon_dev_avg_dependency_freq(tegra, dev); /* * We want to get interrupts when MCCPU client crosses the @@ -316,7 +327,7 @@ static void tegra_devfreq_update_avg_wmark(struct tegra_devfreq *tegra, */ if (lower < dev->config->avg_dependency_threshold && upper > dev->config->avg_dependency_threshold) { - if (dev->avg_count < dev->config->avg_dependency_threshold) + if (dev->avg_freq < avg_dependency_freq) upper = dev->config->avg_dependency_threshold; else lower = dev->config->avg_dependency_threshold; @@ -358,8 +369,7 @@ static void tegra_devfreq_update_wmark(struct tegra_devfreq *tegra, * device. Once that mark is hit and boosting is stopped, the * interrupt is disabled by ISR. */ - freq = dev->avg_count / ACTMON_SAMPLING_PERIOD * KHZ; - tegra_actmon_get_lower_upper(tegra, dev, freq, &lower, &upper); + tegra_actmon_get_lower_upper(tegra, dev, dev->avg_freq, &lower, &upper); delta = do_percent(upper - lower, dev->config->boost_down_threshold); device_writel(dev, lower + delta, ACTMON_DEV_LOWER_WMARK); @@ -368,12 +378,14 @@ static void tegra_devfreq_update_wmark(struct tegra_devfreq *tegra, static void actmon_isr_device(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev) { - u32 intr_status, dev_ctrl, avg_intr_mask; + u32 intr_status, dev_ctrl, avg_intr_mask, avg_count; - dev->avg_count = device_readl(dev, ACTMON_DEV_AVG_COUNT); intr_status = device_readl(dev, ACTMON_DEV_INTR_STATUS); + avg_count = device_readl(dev, ACTMON_DEV_AVG_COUNT); dev_ctrl = device_readl(dev, ACTMON_DEV_CTRL); + dev->avg_freq = avg_count / ACTMON_SAMPLING_PERIOD; + avg_intr_mask = ACTMON_DEV_INTR_AVG_BELOW_WMARK | ACTMON_DEV_INTR_AVG_ABOVE_WMARK; @@ -427,7 +439,7 @@ static unsigned long actmon_update_target(struct tegra_devfreq *tegra, { unsigned long target_freq; - target_freq = dev->avg_count / ACTMON_SAMPLING_PERIOD + dev->boost_freq; + target_freq = dev->avg_freq + dev->boost_freq; target_freq = tegra_actmon_account_cpu_freq(tegra, dev, target_freq); return min(target_freq, tegra->max_freq); @@ -464,6 +476,7 @@ static int tegra_actmon_rate_notify_cb(struct notifier_block *nb, struct clk_notifier_data *data = ptr; struct tegra_devfreq_device *dev; struct tegra_devfreq *tegra; + unsigned long freq; unsigned int i; if (action != POST_RATE_CHANGE) @@ -471,6 +484,8 @@ static int tegra_actmon_rate_notify_cb(struct notifier_block *nb, tegra = container_of(nb, struct tegra_devfreq, rate_change_nb); + freq = data->new_rate / KHZ; + /* * EMC rate could change due to three reasons: * @@ -492,7 +507,7 @@ static int tegra_actmon_rate_notify_cb(struct notifier_block *nb, dev = &tegra->devices[i]; tegra_devfreq_update_avg_wmark(tegra, dev); - tegra_devfreq_update_wmark(tegra, dev, data->new_rate); + tegra_devfreq_update_wmark(tegra, dev, freq); } return NOTIFY_OK; @@ -501,14 +516,14 @@ static int tegra_actmon_rate_notify_cb(struct notifier_block *nb, static void tegra_actmon_configure_device(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev) { - u32 val = 0, target_freq; + u32 val = 0; - target_freq = clk_get_rate(tegra->emc_clock) / KHZ; - dev->avg_count = target_freq * ACTMON_SAMPLING_PERIOD; - device_writel(dev, dev->avg_count, ACTMON_DEV_INIT_AVG); + dev->avg_freq = clk_get_rate(tegra->emc_clock) / KHZ; + device_writel(dev, dev->avg_freq * ACTMON_SAMPLING_PERIOD, + ACTMON_DEV_INIT_AVG); tegra_devfreq_update_avg_wmark(tegra, dev); - tegra_devfreq_update_wmark(tegra, dev, target_freq); + tegra_devfreq_update_wmark(tegra, dev, dev->avg_freq); device_writel(dev, ACTMON_COUNT_WEIGHT, ACTMON_DEV_COUNT_WEIGHT); device_writel(dev, ACTMON_INTR_STATUS_CLEAR, ACTMON_DEV_INTR_STATUS); @@ -572,7 +587,7 @@ static int tegra_devfreq_target(struct device *dev, unsigned long *freq, rate = dev_pm_opp_get_freq(opp); dev_pm_opp_put(opp); - err = clk_set_min_rate(tegra->emc_clock, rate); + err = clk_set_min_rate(tegra->emc_clock, rate * KHZ); if (err) return err; @@ -595,7 +610,7 @@ static int tegra_devfreq_get_dev_status(struct device *dev, struct tegra_devfreq_device *actmon_dev; unsigned long cur_freq; - cur_freq = clk_get_rate(tegra->emc_clock); + cur_freq = clk_get_rate(tegra->emc_clock) / KHZ; /* To be used by the tegra governor */ stat->private_data = tegra; @@ -612,7 +627,7 @@ static int tegra_devfreq_get_dev_status(struct device *dev, stat->busy_time *= 100 / BUS_SATURATION_RATIO; /* Number of cycles in a sampling period */ - stat->total_time = cur_freq / KHZ * ACTMON_SAMPLING_PERIOD; + stat->total_time = cur_freq * ACTMON_SAMPLING_PERIOD; stat->busy_time = min(stat->busy_time, stat->total_time); @@ -652,7 +667,7 @@ static int tegra_governor_get_target(struct devfreq *devfreq, target_freq = max(target_freq, dev_target_freq); } - *freq = target_freq * KHZ; + *freq = target_freq; return 0; } @@ -787,7 +802,7 @@ static int tegra_devfreq_probe(struct platform_device *pdev) goto remove_opps; } - err = dev_pm_opp_add(&pdev->dev, rate, 0); + err = dev_pm_opp_add(&pdev->dev, rate / KHZ, 0); if (err) { dev_err(&pdev->dev, "Failed to add OPP: %d\n", err); goto remove_opps; @@ -812,6 +827,8 @@ static int tegra_devfreq_probe(struct platform_device *pdev) } tegra_devfreq_profile.initial_freq = clk_get_rate(tegra->emc_clock); + tegra_devfreq_profile.initial_freq /= KHZ; + devfreq = devfreq_add_device(&pdev->dev, &tegra_devfreq_profile, "tegra_actmon", NULL); if (IS_ERR(devfreq)) { From patchwork Tue Jul 30 16:22:26 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 11066101 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 9B24D14DB for ; Tue, 30 Jul 2019 16:33:43 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8D0E22867C for ; Tue, 30 Jul 2019 16:33:43 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 818D028704; Tue, 30 Jul 2019 16:33:43 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 E2DC22867C for ; Tue, 30 Jul 2019 16:33:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732869AbfG3Qcf (ORCPT ); Tue, 30 Jul 2019 12:32:35 -0400 Received: from mail-wm1-f67.google.com ([209.85.128.67]:33057 "EHLO mail-wm1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732844AbfG3Qcf (ORCPT ); Tue, 30 Jul 2019 12:32:35 -0400 Received: by mail-wm1-f67.google.com with SMTP id h19so45683016wme.0; Tue, 30 Jul 2019 09:32:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=VR4VQoyRWVM0Kw8sF0Cq63P0RsRTjzSwRUSf5aLb+kM=; b=MWE4WW8GNN3YtmUCKPM0OyJFHS8jupaKtDda+b3Uj95xUzLJgurNgANypEL54gNyio ddnvMzR1dY71YuA2PIZGG1l3UedhYG9nsI6RBn+HPxr5ltmqoQK/mVaqecsDLL/8rej5 JEYdjN00M/8nvXhGjWGK3qGcd/LD/jAhgp78jzM927eSM2M40M+Azbl0HK/0fFsJKce2 OOuUzyAVuhaym7EH7fq7yg9nSNCmfhPGdghXEriDXbeMfFgwGKElExWiEWO0xYMYQkvh gFeqksUm/XZJpoVLyE+vbx1J1GUprQsnkbhP4fABHW0M5PSBsalyd/quHlSO4txaOBLW 8Tjg== 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=VR4VQoyRWVM0Kw8sF0Cq63P0RsRTjzSwRUSf5aLb+kM=; b=QmjdEELPb67CB34z7GNCqfaWVajbUSc73326fxo5VFqDX8UqZtmX9DB1AUen8CEk3n MAIcKfbOIkq92bDSgkmfg8aQDlVK0lF9KdwxRzmPmYJ9+sgZ4eIAebDoHKObd7aUtl3m gqSFsRGXiQbfIo93iTHQdYWKkZHb8axOYQr+GUK5m87HS0GpRVgoUjNncNW38SaJs9Kw jNE4skek1vaJfoIAP1sM6lJmEJIXcYTNN8qLyFiRp/XxgcosXe2UBXng+SMe+sflFH7h gY01SbNQOeY0TmV8satbPm3agAdAQgK/tyhW1q7uLLyt1cAswDWuygqnxDxSw24WSUO7 QUkw== X-Gm-Message-State: APjAAAW9a2cHKZ+dmqmOoo/BWN0EDGiiGgg8hnyJ/ht89HSxrKCJAejH qYHJjTmKiuzLH+wQMv4KLPw= X-Google-Smtp-Source: APXvYqyvc3G94+KKmdSDAPS3KKe4j7pACWN9X3kiv6FnPGmP+xR5AVtwWZXy0qPOPVzPrLyrZEuQhw== X-Received: by 2002:a1c:7c11:: with SMTP id x17mr39389104wmc.22.1564504351727; Tue, 30 Jul 2019 09:32:31 -0700 (PDT) Received: from localhost.localdomain (ppp91-78-220-99.pppoe.mtu-net.ru. [91.78.220.99]) by smtp.gmail.com with ESMTPSA id c65sm64835175wma.44.2019.07.30.09.32.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jul 2019 09:32:31 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 10/20] PM / devfreq: tegra30: Reduce unnecessary interrupts activity Date: Tue, 30 Jul 2019 19:22:26 +0300 Message-Id: <20190730162236.6063-11-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190730162236.6063-1-digetx@gmail.com> References: <20190730162236.6063-1-digetx@gmail.com> MIME-Version: 1.0 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 There are cases where unnecessary ACTMON interrupts could be avoided, like when one memory client device requests higher clock rate than the other or when clock rate is manually limited using sysfs devfreq parameters. These cases could be avoided by tuning upper watermark or disabling hardware events when min/max boosting thresholds are reached. Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 87 ++++++++++++++++++++++++++++--- 1 file changed, 80 insertions(+), 7 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index 43d50b4366dd..a2623de56d20 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -312,7 +312,8 @@ static void tegra_actmon_get_lower_upper(struct tegra_devfreq *tegra, } static void tegra_devfreq_update_avg_wmark(struct tegra_devfreq *tegra, - struct tegra_devfreq_device *dev) + struct tegra_devfreq_device *dev, + unsigned long freq) { unsigned long avg_dependency_freq, lower, upper; @@ -320,6 +321,22 @@ static void tegra_devfreq_update_avg_wmark(struct tegra_devfreq *tegra, avg_dependency_freq = tegra_actmon_dev_avg_dependency_freq(tegra, dev); + /* + * If cumulative EMC frequency selection (MCALL / min_freq) is + * higher than the device's, then there is no need to set upper + * watermark to a lower value because it will result in unnecessary + * upper interrupts. + * + * Note that average watermarks are also updated after EMC + * clock rate change, hence if clock rate goes down, then the + * watermarks will be set in accordance to the new rate after + * changing the rate. There are other ways to achieve the same + * result, but this one is probably the least churning, although + * it may look a bit convoluted. + */ + if (freq * ACTMON_SAMPLING_PERIOD > upper) + upper = freq * ACTMON_SAMPLING_PERIOD; + /* * We want to get interrupts when MCCPU client crosses the * dependency threshold in order to take into / out of account @@ -361,7 +378,18 @@ static void tegra_devfreq_update_wmark(struct tegra_devfreq *tegra, tegra_actmon_get_lower_upper(tegra, dev, freq - 1, &lower, &upper); delta = do_percent(upper - lower, dev->config->boost_up_threshold); - device_writel(dev, lower + delta, ACTMON_DEV_UPPER_WMARK); + + /* + * The memory events count could go a bit higher than the maximum + * defined by the OPPs, hence make the upper watermark infinitely + * high to avoid unnecessary upper interrupts in that case. + */ + if (freq == tegra->max_freq) + upper = ULONG_MAX; + else + upper = lower + delta; + + device_writel(dev, upper, ACTMON_DEV_UPPER_WMARK); /* * Meanwhile the lower mark is based on the average value @@ -379,6 +407,7 @@ static void actmon_isr_device(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev) { u32 intr_status, dev_ctrl, avg_intr_mask, avg_count; + unsigned long freq; intr_status = device_readl(dev, ACTMON_DEV_INTR_STATUS); avg_count = device_readl(dev, ACTMON_DEV_AVG_COUNT); @@ -389,8 +418,10 @@ static void actmon_isr_device(struct tegra_devfreq *tegra, avg_intr_mask = ACTMON_DEV_INTR_AVG_BELOW_WMARK | ACTMON_DEV_INTR_AVG_ABOVE_WMARK; - if (intr_status & avg_intr_mask) - tegra_devfreq_update_avg_wmark(tegra, dev); + if (intr_status & avg_intr_mask) { + freq = clk_get_rate(tegra->emc_clock) / KHZ; + tegra_devfreq_update_avg_wmark(tegra, dev, freq); + } if (intr_status & ACTMON_DEV_INTR_CONSECUTIVE_UPPER) { /* @@ -412,6 +443,8 @@ static void actmon_isr_device(struct tegra_devfreq *tegra, dev->boost_freq = do_percent(dev->boost_freq, dev->config->boost_down_coeff); + dev_ctrl |= ACTMON_DEV_CTRL_CONSECUTIVE_ABOVE_WMARK_EN; + if (dev->boost_freq < (ACTMON_BOOST_FREQ_STEP >> 1)) dev->boost_freq = 0; } @@ -427,8 +460,16 @@ static void actmon_isr_device(struct tegra_devfreq *tegra, } /* no boosting => no need for consecutive-down interrupt */ - if (dev->boost_freq == 0) + if (dev->boost_freq == 0) { dev_ctrl &= ~ACTMON_DEV_CTRL_CONSECUTIVE_BELOW_WMARK_EN; + dev_ctrl |= ACTMON_DEV_CTRL_CONSECUTIVE_ABOVE_WMARK_EN; + } + + /* boosting max-out => no need for consecutive-up interrupt */ + if (dev->boost_freq == tegra->max_freq) { + dev_ctrl &= ~ACTMON_DEV_CTRL_CONSECUTIVE_ABOVE_WMARK_EN; + dev_ctrl |= ACTMON_DEV_CTRL_CONSECUTIVE_BELOW_WMARK_EN; + } device_writel(dev, dev_ctrl, ACTMON_DEV_CTRL); device_writel(dev, ACTMON_INTR_STATUS_CLEAR, ACTMON_DEV_INTR_STATUS); @@ -437,8 +478,40 @@ static void actmon_isr_device(struct tegra_devfreq *tegra, static unsigned long actmon_update_target(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev) { + u32 avg_count, avg_freq, old_upper, new_upper, dev_ctrl; unsigned long target_freq; + /* + * The avg_count / avg_freq is getting snapshoted on device's + * interrupt, but there are cases where actual value need to + * be utilized on target's update, like CPUFreq boosting and + * overriding the min freq via /sys/class/devfreq/devfreq0/min_freq + * because we're optimizing the upper watermark based on the + * actual EMC frequency. This means that interrupt may be + * inactive for a long time and thus making snapshoted value + * outdated. + */ + avg_count = device_readl(dev, ACTMON_DEV_AVG_COUNT); + avg_freq = avg_count / ACTMON_SAMPLING_PERIOD; + + old_upper = tegra_actmon_upper_freq(tegra, dev->avg_freq); + new_upper = tegra_actmon_upper_freq(tegra, avg_freq); + + /* similar to ISR, see comments in actmon_isr_device() */ + if (old_upper != new_upper) { + if (dev->boost_freq == tegra->max_freq) { + dev_ctrl = device_readl(dev, ACTMON_DEV_CTRL); + + dev_ctrl &= ~ACTMON_DEV_CTRL_CONSECUTIVE_BELOW_WMARK_EN; + dev_ctrl |= ACTMON_DEV_CTRL_CONSECUTIVE_ABOVE_WMARK_EN; + + device_writel(dev, dev_ctrl, ACTMON_DEV_CTRL); + } + + dev->avg_freq = avg_freq; + dev->boost_freq = 0; + } + target_freq = dev->avg_freq + dev->boost_freq; target_freq = tegra_actmon_account_cpu_freq(tegra, dev, target_freq); @@ -506,7 +579,7 @@ static int tegra_actmon_rate_notify_cb(struct notifier_block *nb, for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) { dev = &tegra->devices[i]; - tegra_devfreq_update_avg_wmark(tegra, dev); + tegra_devfreq_update_avg_wmark(tegra, dev, freq); tegra_devfreq_update_wmark(tegra, dev, freq); } @@ -522,7 +595,7 @@ static void tegra_actmon_configure_device(struct tegra_devfreq *tegra, device_writel(dev, dev->avg_freq * ACTMON_SAMPLING_PERIOD, ACTMON_DEV_INIT_AVG); - tegra_devfreq_update_avg_wmark(tegra, dev); + tegra_devfreq_update_avg_wmark(tegra, dev, dev->avg_freq); tegra_devfreq_update_wmark(tegra, dev, dev->avg_freq); device_writel(dev, ACTMON_COUNT_WEIGHT, ACTMON_DEV_COUNT_WEIGHT); From patchwork Tue Jul 30 16:22:27 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 11066099 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 4F750112C for ; Tue, 30 Jul 2019 16:33:43 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4154028671 for ; Tue, 30 Jul 2019 16:33:43 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 358E628704; Tue, 30 Jul 2019 16:33:43 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 6712C28671 for ; Tue, 30 Jul 2019 16:33:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732877AbfG3Qcg (ORCPT ); Tue, 30 Jul 2019 12:32:36 -0400 Received: from mail-wr1-f68.google.com ([209.85.221.68]:45991 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732860AbfG3Qcg (ORCPT ); Tue, 30 Jul 2019 12:32:36 -0400 Received: by mail-wr1-f68.google.com with SMTP id f9so66460409wre.12; Tue, 30 Jul 2019 09:32:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=gdeErmdc8u99cfqR6bopaNzFUYq6DgK0A7xW8/rOWUE=; b=JmoydR9Zkor7ywvcUZ/Wjjdcu8jp2AxAI7TkTQ7/UG3ALXMvwIWhMG9n0FRbllPP16 y1wKvm477XLeSBeBlOt4ahD7yYmrFBU+15OVBhhEGJCdz/ELX66WtLstsRTuAeV4KjTf QyAlCQINE6HRpsxNx+Y7Jb5CZN/wZL4ajhWyygudpWm0Ov5UEsUxnw2n44vX9IDCkGJS soKxtXxcaHQsyhExKXUPKK+tQhmSqfgq8z6BPgWN3Yu1qMm9+/JQRYmoLlJZ3oRo/yF/ W+TTOtPSefsn4YOT/m5VJbffPq2JUPHcCDHFD0iPp4TYe9VW2ZudwB3Yje6LmEh5MjSR 9G5w== 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=gdeErmdc8u99cfqR6bopaNzFUYq6DgK0A7xW8/rOWUE=; b=HJ+B+0uYvTjKv0ptbXLZ7iPe1qVf7K/mtfysGqL8DTUh9c1zhCVOrD7lDvlce3g+A2 oLDQaNeUAAXU/S9vT01AXarRg0ChIIQXAaq7CAA3KvH+s1sTvDXxfgGCH5WCU5ImPyeI fiKdB9Ds0uVQwO3/4oFaxceLap6jst96xGjA4hhMMF0NYILaBR2zHktMPBhRaoazctCs 06peZNbWIreIriwH5c/8+oKg5rSzXWOmSKL34xepm5OUG4VtGaIXm6bHdfRmjMaxGQP9 tQ35tS9CstIf/henEFRJb6/fYHK4Zh5Pq+Thf3YmXGm5DE1RUAlEik3Az1TlnAemGNQf nEUw== X-Gm-Message-State: APjAAAVO9/Segd5jPbfmDWybtxUaNmhKsFQn2/msqtvq0nAzKp4b+YtS D+ZRb1LzX4OpW7DU0ihf8lA= X-Google-Smtp-Source: APXvYqyV7B0rvaKAgtplvUqwJvJ4F6cIHZdSemCwlRrZISDg+Fr/Kv/tRdomrMVYVy0AOeygVvSwtg== X-Received: by 2002:adf:cd90:: with SMTP id q16mr46820862wrj.118.1564504352993; Tue, 30 Jul 2019 09:32:32 -0700 (PDT) Received: from localhost.localdomain (ppp91-78-220-99.pppoe.mtu-net.ru. [91.78.220.99]) by smtp.gmail.com with ESMTPSA id c65sm64835175wma.44.2019.07.30.09.32.31 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jul 2019 09:32:32 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 11/20] PM / devfreq: tegra30: Use CPUFreq notifier Date: Tue, 30 Jul 2019 19:22:27 +0300 Message-Id: <20190730162236.6063-12-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190730162236.6063-1-digetx@gmail.com> References: <20190730162236.6063-1-digetx@gmail.com> MIME-Version: 1.0 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 CPU's client need to take into account that CPUFreq may change while memory activity not, staying high. Thus an appropriate frequency notifier should be used in addition to the clk-notifier. Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 171 ++++++++++++++++++++++++++---- 1 file changed, 151 insertions(+), 20 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index a2623de56d20..17de24d2ae32 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -17,6 +17,7 @@ #include #include #include +#include #include "governor.h" @@ -159,7 +160,10 @@ struct tegra_devfreq { struct clk *emc_clock; unsigned long max_freq; - struct notifier_block rate_change_nb; + struct notifier_block clk_rate_change_nb; + + struct delayed_work cpufreq_update_work; + struct notifier_block cpu_rate_change_nb; struct tegra_devfreq_device devices[ARRAY_SIZE(actmon_device_configs)]; @@ -207,10 +211,10 @@ static unsigned long do_percent(unsigned long val, unsigned int pct) return val * pct / 100; } -static unsigned long actmon_cpu_to_emc_rate(struct tegra_devfreq *tegra) +static unsigned long actmon_cpu_to_emc_rate(struct tegra_devfreq *tegra, + unsigned int cpu_freq) { struct tegra_actmon_emc_ratio *ratio = actmon_emc_ratios; - unsigned int cpu_freq = cpufreq_quick_get(0); unsigned int i; for (i = 0; i < ARRAY_SIZE(actmon_emc_ratios); i++, ratio++) { @@ -244,7 +248,8 @@ tegra_actmon_account_cpu_freq(struct tegra_devfreq *tegra, return target_freq; if (dev->avg_freq > tegra_actmon_dev_avg_dependency_freq(tegra, dev)) - static_cpu_emc_freq = actmon_cpu_to_emc_rate(tegra); + static_cpu_emc_freq = actmon_cpu_to_emc_rate( + tegra, cpufreq_quick_get(0)); else static_cpu_emc_freq = 0; @@ -543,8 +548,8 @@ static irqreturn_t actmon_thread_isr(int irq, void *data) return handled ? IRQ_HANDLED : IRQ_NONE; } -static int tegra_actmon_rate_notify_cb(struct notifier_block *nb, - unsigned long action, void *ptr) +static int tegra_actmon_clk_notify_cb(struct notifier_block *nb, + unsigned long action, void *ptr) { struct clk_notifier_data *data = ptr; struct tegra_devfreq_device *dev; @@ -555,7 +560,7 @@ static int tegra_actmon_rate_notify_cb(struct notifier_block *nb, if (action != POST_RATE_CHANGE) return NOTIFY_OK; - tegra = container_of(nb, struct tegra_devfreq, rate_change_nb); + tegra = container_of(nb, struct tegra_devfreq, clk_rate_change_nb); freq = data->new_rate / KHZ; @@ -586,6 +591,94 @@ static int tegra_actmon_rate_notify_cb(struct notifier_block *nb, return NOTIFY_OK; } +static void tegra_actmon_delayed_update(struct work_struct *work) +{ + struct tegra_devfreq *tegra = container_of(work, struct tegra_devfreq, + cpufreq_update_work.work); + + mutex_lock(&tegra->devfreq->lock); + update_devfreq(tegra->devfreq); + mutex_unlock(&tegra->devfreq->lock); +} + +static unsigned long +tegra_actmon_cpufreq_contribution(struct tegra_devfreq *tegra, + unsigned int cpu_freq) +{ + unsigned long freq, static_cpu_emc_freq; + + /* check whether CPU's freq is taken into account at all */ + freq = tegra_actmon_dev_avg_dependency_freq(tegra, + &tegra->devices[MCCPU]); + if (tegra->devices[MCCPU].avg_freq <= freq) + return 0; + + static_cpu_emc_freq = actmon_cpu_to_emc_rate(tegra, cpu_freq); + + /* compare static CPU-EMC freq with MCALL */ + freq = tegra->devices[MCALL].avg_freq + + tegra->devices[MCALL].boost_freq; + + freq = tegra_actmon_upper_freq(tegra, freq); + + if (freq == tegra->max_freq || freq >= static_cpu_emc_freq) + return 0; + + /* compare static CPU-EMC freq with MCCPU */ + freq = tegra->devices[MCCPU].avg_freq + + tegra->devices[MCCPU].boost_freq; + + freq = tegra_actmon_upper_freq(tegra, freq); + + if (freq == tegra->max_freq || freq >= static_cpu_emc_freq) + return 0; + + return static_cpu_emc_freq; +} + +static int tegra_actmon_cpu_notify_cb(struct notifier_block *nb, + unsigned long action, void *ptr) +{ + struct cpufreq_freqs *freqs = ptr; + struct tegra_devfreq *tegra; + unsigned long old, new, delay; + + if (action != CPUFREQ_POSTCHANGE) + return NOTIFY_OK; + + tegra = container_of(nb, struct tegra_devfreq, cpu_rate_change_nb); + + /* + * Quickly check whether CPU frequency should be taken into account + * at all, without blocking CPUFreq's core. + */ + if (mutex_trylock(&tegra->devfreq->lock)) { + old = tegra_actmon_cpufreq_contribution(tegra, freqs->old); + new = tegra_actmon_cpufreq_contribution(tegra, freqs->new); + mutex_unlock(&tegra->devfreq->lock); + + /* + * If CPU's frequency shouldn't be taken into account at + * the moment, then there is no need to update the devfreq's + * state because ISR will re-check CPU's frequency on the + * next interrupt. + */ + if (old == new) + return NOTIFY_OK; + } + + /* + * CPUFreq driver should support CPUFREQ_ASYNC_NOTIFICATION in order + * to allow asynchronous notifications. This means we can't block + * here for too long, otherwise CPUFreq's core will complain with a + * warning splat. + */ + delay = msecs_to_jiffies(ACTMON_SAMPLING_PERIOD); + schedule_delayed_work(&tegra->cpufreq_update_work, delay); + + return NOTIFY_OK; +} + static void tegra_actmon_configure_device(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev) { @@ -617,9 +710,16 @@ static void tegra_actmon_configure_device(struct tegra_devfreq *tegra, device_writel(dev, val, ACTMON_DEV_CTRL); } -static void tegra_actmon_start(struct tegra_devfreq *tegra) +static void tegra_actmon_stop_device(struct tegra_devfreq_device *dev) +{ + device_writel(dev, 0x00000000, ACTMON_DEV_CTRL); + device_writel(dev, ACTMON_INTR_STATUS_CLEAR, ACTMON_DEV_INTR_STATUS); +} + +static int tegra_actmon_start(struct tegra_devfreq *tegra) { unsigned int i; + int err; actmon_writel(tegra, ACTMON_SAMPLING_PERIOD - 1, ACTMON_GLB_PERIOD_CTRL); @@ -627,7 +727,30 @@ static void tegra_actmon_start(struct tegra_devfreq *tegra) for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) tegra_actmon_configure_device(tegra, &tegra->devices[i]); + /* + * We are estimating CPU's memory bandwidth requirement based on + * amount of memory accesses and system's load, judging by CPU's + * frequency. We also don't want to receive events about CPU's + * frequency transaction when governor is stopped, hence notifier + * is registered dynamically. + */ + err = cpufreq_register_notifier(&tegra->cpu_rate_change_nb, + CPUFREQ_TRANSITION_NOTIFIER); + if (err) { + dev_err(tegra->devfreq->dev.parent, + "Failed to register rate change notifier: %d\n", err); + goto err_stop; + } + enable_irq(tegra->irq); + + return 0; + +err_stop: + for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) + tegra_actmon_stop_device(&tegra->devices[i]); + + return err; } static void tegra_actmon_stop(struct tegra_devfreq *tegra) @@ -636,11 +759,13 @@ static void tegra_actmon_stop(struct tegra_devfreq *tegra) disable_irq(tegra->irq); - for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) { - device_writel(&tegra->devices[i], 0x00000000, ACTMON_DEV_CTRL); - device_writel(&tegra->devices[i], ACTMON_INTR_STATUS_CLEAR, - ACTMON_DEV_INTR_STATUS); - } + cpufreq_unregister_notifier(&tegra->cpu_rate_change_nb, + CPUFREQ_TRANSITION_NOTIFIER); + + cancel_delayed_work_sync(&tegra->cpufreq_update_work); + + for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) + tegra_actmon_stop_device(&tegra->devices[i]); } static int tegra_devfreq_target(struct device *dev, unsigned long *freq, @@ -749,6 +874,7 @@ static int tegra_governor_event_handler(struct devfreq *devfreq, unsigned int event, void *data) { struct tegra_devfreq *tegra = dev_get_drvdata(devfreq->dev.parent); + int ret = 0; /* * Couple device with the governor early as it is needed at @@ -759,7 +885,7 @@ static int tegra_governor_event_handler(struct devfreq *devfreq, switch (event) { case DEVFREQ_GOV_START: devfreq_monitor_start(devfreq); - tegra_actmon_start(tegra); + ret = tegra_actmon_start(tegra); break; case DEVFREQ_GOV_STOP: @@ -774,11 +900,11 @@ static int tegra_governor_event_handler(struct devfreq *devfreq, case DEVFREQ_GOV_RESUME: devfreq_monitor_resume(devfreq); - tegra_actmon_start(tegra); + ret = tegra_actmon_start(tegra); break; } - return 0; + return ret; } static struct devfreq_governor tegra_devfreq_governor = { @@ -884,9 +1010,14 @@ static int tegra_devfreq_probe(struct platform_device *pdev) platform_set_drvdata(pdev, tegra); - tegra->rate_change_nb.notifier_call = tegra_actmon_rate_notify_cb; + tegra->cpu_rate_change_nb.notifier_call = tegra_actmon_cpu_notify_cb; + + INIT_DELAYED_WORK(&tegra->cpufreq_update_work, + tegra_actmon_delayed_update); + + tegra->clk_rate_change_nb.notifier_call = tegra_actmon_clk_notify_cb; err = clk_notifier_register(tegra->emc_clock, - &tegra->rate_change_nb); + &tegra->clk_rate_change_nb); if (err) { dev_err(&pdev->dev, "Failed to register rate change notifier\n"); @@ -915,7 +1046,7 @@ static int tegra_devfreq_probe(struct platform_device *pdev) devfreq_remove_governor(&tegra_devfreq_governor); unreg_notifier: - clk_notifier_unregister(tegra->emc_clock, &tegra->rate_change_nb); + clk_notifier_unregister(tegra->emc_clock, &tegra->clk_rate_change_nb); remove_opps: dev_pm_opp_remove_all_dynamic(&pdev->dev); @@ -933,7 +1064,7 @@ static int tegra_devfreq_remove(struct platform_device *pdev) devfreq_remove_device(tegra->devfreq); devfreq_remove_governor(&tegra_devfreq_governor); - clk_notifier_unregister(tegra->emc_clock, &tegra->rate_change_nb); + clk_notifier_unregister(tegra->emc_clock, &tegra->clk_rate_change_nb); dev_pm_opp_remove_all_dynamic(&pdev->dev); reset_control_reset(tegra->reset); From patchwork Tue Jul 30 16:22:28 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 11066103 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 F2C52186E for ; Tue, 30 Jul 2019 16:33:43 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E3D4028671 for ; Tue, 30 Jul 2019 16:33:43 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D86FB2871C; Tue, 30 Jul 2019 16:33:43 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 65A7428671 for ; Tue, 30 Jul 2019 16:33:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728924AbfG3Qdm (ORCPT ); Tue, 30 Jul 2019 12:33:42 -0400 Received: from mail-wr1-f66.google.com ([209.85.221.66]:38882 "EHLO mail-wr1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732866AbfG3Qcg (ORCPT ); Tue, 30 Jul 2019 12:32:36 -0400 Received: by mail-wr1-f66.google.com with SMTP id g17so66484294wrr.5; Tue, 30 Jul 2019 09:32:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=p5ThkyaRUgULktlNTFDDxUH47fhVBKZuE6estEo8LTA=; b=Ed0osdwNwWTYs35A6MBKD50ixU+VAc2yIrHy1zd9Z1OGpwNim0xnBnN23/nFdU6wuX biWECficVlZjnMje7wxxatwe9kPxkBUA9n0EJ1GHUu5DplNn/+g+kRT2ZnuFEPnPxmHm vcy5gaOEU5KZsa7e3yFR/2vUqjhuIJ2L1XvKlK/jda2PYasZ95dAT5fKtIM+EFSfRE8y NGQBfwVhQNYXnykiD3AVj+2TWeRl3VC02ZL5R0+vmEAYfd6wZ6lbUa8MZzo9xxSMYyBW ntwp66F6WDEYGtCzM45NTHgkal5oi7UQtCgwtjYNsP+0Vdh/g6rLDlrTz9cqiJU58Zmn 7GdA== 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=p5ThkyaRUgULktlNTFDDxUH47fhVBKZuE6estEo8LTA=; b=XcvlgqTa9u/wx/h1P21qdkpZcvpdG818RDMbEtnDH/idtlB5ZbcwhPWmCb6oNY5suE e2LFo69ljwrFxTnP8xQXk8aLRCwKVySH9J10lGKP5tN0/vVFJzKC3gP7oQsyd01LAMbW VBFvjPxCO9TAmNe+z2aVO7++vR0fkNhYcX6S7YXWZMJhdvJE8wHj+CCGIIbhhiAdzBBR 2K6wz9OqQBWQ0T2KvdZFp5xvxEEm6Ry1GBc2bYzudZlMSuREwszniGP52RWKVkDCHk8N z4OzqS79hJ12qFDsujRZbdcRTvB4vxaS/GqGrhL9GNhZs9cRVz+7z/iJO/d908Fsp1a/ wu4Q== X-Gm-Message-State: APjAAAUsWAC4D/u3FvcD0sREQQslfUkb2l9j4rb27+kM2AHoT8DXTn2b whluvHEf6UebAxKmHyOLVOo= X-Google-Smtp-Source: APXvYqyMIeVTb36FM3vbkQArOFuuIzsuV2kzdOr+VE6k6QiY1AKWaNGhzPHg75im1hfdp+05z6YV+A== X-Received: by 2002:a5d:54c7:: with SMTP id x7mr99169710wrv.39.1564504354344; Tue, 30 Jul 2019 09:32:34 -0700 (PDT) Received: from localhost.localdomain (ppp91-78-220-99.pppoe.mtu-net.ru. [91.78.220.99]) by smtp.gmail.com with ESMTPSA id c65sm64835175wma.44.2019.07.30.09.32.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jul 2019 09:32:33 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 12/20] PM / devfreq: tegra30: Move clk-notifier's registration to governor's start Date: Tue, 30 Jul 2019 19:22:28 +0300 Message-Id: <20190730162236.6063-13-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190730162236.6063-1-digetx@gmail.com> References: <20190730162236.6063-1-digetx@gmail.com> MIME-Version: 1.0 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 There is no point in receiving of the notifications while governor is stopped, let's keep them disabled like we do for the CPU freq-change notifications. This also fixes a potential use-after-free bug if notification happens after device's removal. Reviewed-by: Chanwoo Choi Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 33 ++++++++++++++++++------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index 17de24d2ae32..762e17323095 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -724,6 +724,19 @@ static int tegra_actmon_start(struct tegra_devfreq *tegra) actmon_writel(tegra, ACTMON_SAMPLING_PERIOD - 1, ACTMON_GLB_PERIOD_CTRL); + /* + * CLK notifications are needed in order to reconfigure the upper + * consecutive watermark in accordance to the actual clock rate + * to avoid unnecessary upper interrupts. + */ + err = clk_notifier_register(tegra->emc_clock, + &tegra->clk_rate_change_nb); + if (err) { + dev_err(tegra->devfreq->dev.parent, + "Failed to register rate change notifier\n"); + return err; + } + for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) tegra_actmon_configure_device(tegra, &tegra->devices[i]); @@ -750,6 +763,8 @@ static int tegra_actmon_start(struct tegra_devfreq *tegra) for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) tegra_actmon_stop_device(&tegra->devices[i]); + clk_notifier_unregister(tegra->emc_clock, &tegra->clk_rate_change_nb); + return err; } @@ -766,6 +781,8 @@ static void tegra_actmon_stop(struct tegra_devfreq *tegra) for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) tegra_actmon_stop_device(&tegra->devices[i]); + + clk_notifier_unregister(tegra->emc_clock, &tegra->clk_rate_change_nb); } static int tegra_devfreq_target(struct device *dev, unsigned long *freq, @@ -1010,24 +1027,16 @@ static int tegra_devfreq_probe(struct platform_device *pdev) platform_set_drvdata(pdev, tegra); + tegra->clk_rate_change_nb.notifier_call = tegra_actmon_clk_notify_cb; tegra->cpu_rate_change_nb.notifier_call = tegra_actmon_cpu_notify_cb; INIT_DELAYED_WORK(&tegra->cpufreq_update_work, tegra_actmon_delayed_update); - tegra->clk_rate_change_nb.notifier_call = tegra_actmon_clk_notify_cb; - err = clk_notifier_register(tegra->emc_clock, - &tegra->clk_rate_change_nb); - if (err) { - dev_err(&pdev->dev, - "Failed to register rate change notifier\n"); - goto remove_opps; - } - err = devfreq_add_governor(&tegra_devfreq_governor); if (err) { dev_err(&pdev->dev, "Failed to add governor: %d\n", err); - goto unreg_notifier; + goto remove_opps; } tegra_devfreq_profile.initial_freq = clk_get_rate(tegra->emc_clock); @@ -1045,9 +1054,6 @@ static int tegra_devfreq_probe(struct platform_device *pdev) remove_governor: devfreq_remove_governor(&tegra_devfreq_governor); -unreg_notifier: - clk_notifier_unregister(tegra->emc_clock, &tegra->clk_rate_change_nb); - remove_opps: dev_pm_opp_remove_all_dynamic(&pdev->dev); @@ -1064,7 +1070,6 @@ static int tegra_devfreq_remove(struct platform_device *pdev) devfreq_remove_device(tegra->devfreq); devfreq_remove_governor(&tegra_devfreq_governor); - clk_notifier_unregister(tegra->emc_clock, &tegra->clk_rate_change_nb); dev_pm_opp_remove_all_dynamic(&pdev->dev); reset_control_reset(tegra->reset); From patchwork Tue Jul 30 16:22:29 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 11066079 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 336BA112C for ; Tue, 30 Jul 2019 16:32:40 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 236AD28658 for ; Tue, 30 Jul 2019 16:32:40 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 178CE28671; Tue, 30 Jul 2019 16:32:40 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 B9A0428658 for ; Tue, 30 Jul 2019 16:32:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732887AbfG3Qci (ORCPT ); Tue, 30 Jul 2019 12:32:38 -0400 Received: from mail-wr1-f66.google.com ([209.85.221.66]:45995 "EHLO mail-wr1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732875AbfG3Qch (ORCPT ); Tue, 30 Jul 2019 12:32:37 -0400 Received: by mail-wr1-f66.google.com with SMTP id f9so66460546wre.12; Tue, 30 Jul 2019 09:32:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Le+gPqc9tIQojy6SU5vThsC8LVskQQb69uxlrI0JsWQ=; b=ThonQR5NO1MwLW/8JmmHvoM0emVn+1GOrm2plUd6BXed715xsPEli04ZdADVsx8GK2 dyUcBuBzKG2Iprzjoo7Li3DfI2LnZnY5Y6Mt7gT3/lcViRTxmIBO5/wkuYktxR0mcXTo w1ZMqdWOVE2Sfe7XVhKjzPuj0elSi/fbsfjI3GKWVQeskiJIQPKy0gTTU7jl0jh49r5M a8bpYlU2aYGu9jGfccr6kv2YP1X7fuY/wSB0bh/ciOWJ5ZuVxW8fIk/oUgl2cA/fb+7k mGmsJtYBTolFmxOUSA31SclPoL3g/OHYJFzzKRNOx8szxVYUphX/tSZKM9ZY56Ub+Asy wupQ== 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=Le+gPqc9tIQojy6SU5vThsC8LVskQQb69uxlrI0JsWQ=; b=CAOfGVp5JvbtrhQY2jFb6Yg1ID8OntUWX6u0UvR3SHZSxMhpd/KmLepKgHcwmbFiM9 avoWKUiFXv86ZK6CoPul6jVH48jAYLFeF+FpSgE0QNuLyzb231/YtyzfFq3ZdneU10uy ldooUGIsyEO5K77MWRUisv61CVVaQLNYG5SLc98/v+rKtUPlVpdH8mz0+nuVcRziB64p C0ONAnM0ZR203u90Wf5VNuPN86DWybsxEy1UClRsmA67kJH5BRK7mn9fOXReMx7EIoKd 9x3SqY2I4D1BeJKCoDDYWsh9o12eW0FCeA30KnBNh5vpo8Qa1aQTR8QOwPXQ0wZSNljA 4oRQ== X-Gm-Message-State: APjAAAUwe9jhh1i8CCZ2/vZloqshECdnw2uhdxwzt3dx9YAFSGR97nwU v1Zj3lLJ44/AFgMutzg48Io= X-Google-Smtp-Source: APXvYqyAmW83NC2q6/Fkgl/M/lLil+J3NzM/Cyfj0gFaeMT8v1hCIN4G/cFmzhPIhHDkYfTXnRno8Q== X-Received: by 2002:a5d:4111:: with SMTP id l17mr5371078wrp.59.1564504355595; Tue, 30 Jul 2019 09:32:35 -0700 (PDT) Received: from localhost.localdomain (ppp91-78-220-99.pppoe.mtu-net.ru. [91.78.220.99]) by smtp.gmail.com with ESMTPSA id c65sm64835175wma.44.2019.07.30.09.32.34 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jul 2019 09:32:35 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 13/20] PM / devfreq: tegra30: Reset boosting on startup Date: Tue, 30 Jul 2019 19:22:29 +0300 Message-Id: <20190730162236.6063-14-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190730162236.6063-1-digetx@gmail.com> References: <20190730162236.6063-1-digetx@gmail.com> MIME-Version: 1.0 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 Governor could be stopped while boosting is active. We have assumption that everything is reset on governor's restart, including the boosting value, which was missed. Reviewed-by: Chanwoo Choi Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index 762e17323095..6e8ae20c3bf1 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -684,6 +684,9 @@ static void tegra_actmon_configure_device(struct tegra_devfreq *tegra, { u32 val = 0; + /* reset boosting on governor's restart */ + dev->boost_freq = 0; + dev->avg_freq = clk_get_rate(tegra->emc_clock) / KHZ; device_writel(dev, dev->avg_freq * ACTMON_SAMPLING_PERIOD, ACTMON_DEV_INIT_AVG); From patchwork Tue Jul 30 16:22:30 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 11066097 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 034F1112C for ; Tue, 30 Jul 2019 16:33:37 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E774328671 for ; Tue, 30 Jul 2019 16:33:36 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id DBB95286A1; Tue, 30 Jul 2019 16:33:36 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 95F2A28671 for ; Tue, 30 Jul 2019 16:33:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728909AbfG3Qdf (ORCPT ); Tue, 30 Jul 2019 12:33:35 -0400 Received: from mail-wm1-f66.google.com ([209.85.128.66]:39195 "EHLO mail-wm1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732883AbfG3Qcj (ORCPT ); Tue, 30 Jul 2019 12:32:39 -0400 Received: by mail-wm1-f66.google.com with SMTP id u25so46879524wmc.4; Tue, 30 Jul 2019 09:32:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=XmclFA46wXQuDKk5uU+iG4Yqz23zPEinY/Vi4hutc/w=; b=YzE3t3niR1sxF+pHCCy14dkq5ZkHYyuPBBhXGqVMPEu87NkE9mByMm+Ne1pro/Td4h ABOH40+V6NqDLxjHzKTyAgz8GTsiso6oGY6egD5cYOQcccf+KZ1/Y5wbpyk29Lcf2P58 lKtQCwj1V+F5LcDeM9awBXpKlGR5vwUp7ZdKAzjzbOlffYy+rLY+0xxWSXsFR1dMPoDd 918C1IC+j6XfF4xPJAazznoMGm971oxhh1e5+pd3z5PR/8KQbP/e4qzBpxeRlLOT8ail IqF5cdYaNk9UqN/qSJORWgtwyQtd2lv2tcZ/IfmbWIAUfTndu7haHdHgN/jaDAZAsW48 gUOg== 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=XmclFA46wXQuDKk5uU+iG4Yqz23zPEinY/Vi4hutc/w=; b=mwaRGsUFS3mlvWw+QcO2OYiii3Cj9Pq3cn0BpVDtyp813mAVjd+Qq8qMQYSoTuLpRF NRX7LaVcp5WQ+A/UEjFU5KzJq0dodKx9Wd9n4JsJHf2sEvt78vN7BILZTjWEE3aUfn75 nz8TICHlVobXEV6F+Q4ANrPcLAsR5wtg+SXmvv1nZA1p9rKRR2fXt8tDtIOnth5Z9j0U mCD+cmyuG4KWDhbOSMobsjXCUjisz3hwY2/odz1zq6f5pHsR+uati4KQ1TW/MikiMLuQ aISB3h3bwBhtCw70SDY0vzqb5hT9LlE7JoHcvklt/MhquucOlJPr4/EUmCYQ/pReGZpu Y6pA== X-Gm-Message-State: APjAAAXSUKHKM6eDlaZ1kiE/geTIqtADw2SxRMWkzdG1UE/4FmWAfFv7 TyiZR1vql+QYpCRXFjet1Zs= X-Google-Smtp-Source: APXvYqynTbyNtG8AXRPwfKrGReBamcnPasILdR5NqQ2fCTlANwgK6E99JMHjaF7yNi7IsN6hHN1YYw== X-Received: by 2002:a7b:ce95:: with SMTP id q21mr5650976wmj.65.1564504356860; Tue, 30 Jul 2019 09:32:36 -0700 (PDT) Received: from localhost.localdomain (ppp91-78-220-99.pppoe.mtu-net.ru. [91.78.220.99]) by smtp.gmail.com with ESMTPSA id c65sm64835175wma.44.2019.07.30.09.32.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jul 2019 09:32:36 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 14/20] PM / devfreq: tegra30: Don't enable consecutive-down interrupt on startup Date: Tue, 30 Jul 2019 19:22:30 +0300 Message-Id: <20190730162236.6063-15-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190730162236.6063-1-digetx@gmail.com> References: <20190730162236.6063-1-digetx@gmail.com> MIME-Version: 1.0 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 consecutive-down event tells that we should perform frequency de-boosting, but boosting is in a reset state on start and hence the event won't do anything useful for us and it will be just a dummy interrupt request. Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index 6e8ae20c3bf1..d0e971e51faf 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -706,7 +706,6 @@ static void tegra_actmon_configure_device(struct tegra_devfreq *tegra, << ACTMON_DEV_CTRL_CONSECUTIVE_ABOVE_WMARK_NUM_SHIFT; val |= ACTMON_DEV_CTRL_AVG_ABOVE_WMARK_EN; val |= ACTMON_DEV_CTRL_AVG_BELOW_WMARK_EN; - val |= ACTMON_DEV_CTRL_CONSECUTIVE_BELOW_WMARK_EN; val |= ACTMON_DEV_CTRL_CONSECUTIVE_ABOVE_WMARK_EN; val |= ACTMON_DEV_CTRL_ENB; From patchwork Tue Jul 30 16:22:31 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 11066081 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 BAE08112C for ; Tue, 30 Jul 2019 16:32:41 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id ABE6228658 for ; Tue, 30 Jul 2019 16:32:41 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A04CB28671; Tue, 30 Jul 2019 16:32:41 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 50EFF28658 for ; Tue, 30 Jul 2019 16:32:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732897AbfG3Qck (ORCPT ); Tue, 30 Jul 2019 12:32:40 -0400 Received: from mail-wr1-f68.google.com ([209.85.221.68]:42358 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732888AbfG3Qck (ORCPT ); Tue, 30 Jul 2019 12:32:40 -0400 Received: by mail-wr1-f68.google.com with SMTP id x1so16578485wrr.9; Tue, 30 Jul 2019 09:32:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=nd7tLxBm8dQITEK9axtPpPqVYzUfP392hOYHsa0EW0k=; b=Cg+uN4uizrV/T7W83ZxEUyWJbb+hhILW3fglpZrwRH/OnI6ozXiflVOBTAzcxPWu3a 9Tgjq3jObdpsOpgKdmwAsH/6tEOYWF4dBDRLUMFZx2QoXvNrm447rCkr0ilB1cCWRcbM caj39NrqYW/pt6WJTWlNhV+2FCkw/jEucIQRFCGln2Y9wL3rxMIhUk9nafw4OnYMbFZw LBmhv8f33qBQeIl2TgkjHVJ8uvmHuF8CTvbqocYPBRnYO6k7fMrgaB81B8ho8RsI/sXw 0+OkjtoDJEV4VKJADRnGExhQIyPxmZtQmvyC4cGg29fzWFaFTxhtCdv2bEUZgeqablBl Ldow== 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=nd7tLxBm8dQITEK9axtPpPqVYzUfP392hOYHsa0EW0k=; b=HxcqtAbZ6mtp9noAobzCbd0oA11ydYqkPbgr9Qh5XH1aV2mvkTa8fUNWmNOC6Heg6q Gv1lLBR+FxftZGAuvMtGM7DqJZwcIJB6ZcWps1BOWbFpymGNic7WPEbNps7hbOdTqZCO QfAyLjqmOEuP0df/p7v7xr7wWpA5EDBSg7lLmw7irt7nmlkZ3CC6aTWw7GpNozJW7cCP /g4vyA5Ebs7TfkNXIGb/LBQoIAibSNXNvqApuIYuiNb2+AwjG0DMuPtgFvTy/+njMmQP wBTIT+diXM10SbLiwHMMH8f/NtVrfPl7SDHg2J3+2RGD+tk9i3jPkLtj8VYIwKiFAPhO tHZA== X-Gm-Message-State: APjAAAUvFRRiL/bms1keGnU7k4x0r3WuG8tfmzqjwCFwkKYexjjO/5JQ JGOnN/bGheJj4NEZSof6MEA= X-Google-Smtp-Source: APXvYqwo7ZjhmT9rt89OVJ7JgdxmHw/3CqZKj7CV36y2FuC3Bwbts5t6Ni6GBwfHoGtz4zHu8PfxYA== X-Received: by 2002:adf:f84f:: with SMTP id d15mr126916096wrq.53.1564504358196; Tue, 30 Jul 2019 09:32:38 -0700 (PDT) Received: from localhost.localdomain (ppp91-78-220-99.pppoe.mtu-net.ru. [91.78.220.99]) by smtp.gmail.com with ESMTPSA id c65sm64835175wma.44.2019.07.30.09.32.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jul 2019 09:32:37 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 15/20] PM / devfreq: tegra30: Constify structs Date: Tue, 30 Jul 2019 19:22:31 +0300 Message-Id: <20190730162236.6063-16-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190730162236.6063-1-digetx@gmail.com> References: <20190730162236.6063-1-digetx@gmail.com> MIME-Version: 1.0 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 Constify unmodifiable structs, for consistency. Reviewed-by: Chanwoo Choi Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index d0e971e51faf..81efc3ddb486 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -107,7 +107,7 @@ enum tegra_actmon_device { MCCPU, }; -static struct tegra_devfreq_device_config actmon_device_configs[] = { +static const struct tegra_devfreq_device_config actmon_device_configs[] = { { /* MCALL: All memory accesses (including from the CPUs) */ .offset = 0x1c0, @@ -175,7 +175,7 @@ struct tegra_actmon_emc_ratio { unsigned long emc_freq; }; -static struct tegra_actmon_emc_ratio actmon_emc_ratios[] = { +static const struct tegra_actmon_emc_ratio actmon_emc_ratios[] = { { 1400000, KHZ_MAX }, { 1200000, 750000 }, { 1100000, 600000 }, @@ -214,7 +214,7 @@ static unsigned long do_percent(unsigned long val, unsigned int pct) static unsigned long actmon_cpu_to_emc_rate(struct tegra_devfreq *tegra, unsigned int cpu_freq) { - struct tegra_actmon_emc_ratio *ratio = actmon_emc_ratios; + const struct tegra_actmon_emc_ratio *ratio = actmon_emc_ratios; unsigned int i; for (i = 0; i < ARRAY_SIZE(actmon_emc_ratios); i++, ratio++) { From patchwork Tue Jul 30 16:22:32 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 11066089 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 4A9DE14DB for ; Tue, 30 Jul 2019 16:33:29 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3BD4528671 for ; Tue, 30 Jul 2019 16:33:29 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 308E3286A1; Tue, 30 Jul 2019 16:33:29 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 DE4EF28671 for ; Tue, 30 Jul 2019 16:33:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732908AbfG3Qcm (ORCPT ); Tue, 30 Jul 2019 12:32:42 -0400 Received: from mail-wr1-f67.google.com ([209.85.221.67]:33987 "EHLO mail-wr1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732892AbfG3Qcl (ORCPT ); Tue, 30 Jul 2019 12:32:41 -0400 Received: by mail-wr1-f67.google.com with SMTP id 31so66515759wrm.1; Tue, 30 Jul 2019 09:32:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=roPQylPXOP5pvvI0RbGtrGn/jUs09WcVvXOpVr0avoQ=; b=XFKbdyVVC6UyPajVeTCmcLIneaXJq7GXcA7JHauoV+q1ZWVJ+sYDXaSXBUJep6QH2W gmecNpC67gWuyQRbLa9m2syGcYs3e59bgRKoKZeUOWXsxBkmSBdNIoYUQIqh+NzHTAgJ nmOJNSi+zdz/l7IFIcDq9jqztV7pyiUOJ9YCO4OjLsYARgZOb1twEX4NOralRnw07oLE Lh4NFKL5uvvEDi9rFuIrVLBbTrjEcW+p4fAJu/EvZpVeUAhPQ2x28sPK5AcldKmyQaUl QUkKE4Eno9Tr11CPWGVONAgWd+61bbwaBqsq/ltT2crvABkx/FsWNBcpAXV0YdyUZmV2 mhMw== 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=roPQylPXOP5pvvI0RbGtrGn/jUs09WcVvXOpVr0avoQ=; b=quaUEuOp37QIgsMFA1X9NyHadAX9hOSHL/UgTcfY6VbMJF0UFiqxESe0UaDvcDpEkC wmDo+1DTwRNT394N6S5IiMBHG+gK7QcfT4gF+eJqtstTAzFEif7K4qIfuIQRjjVhONyf r/tAnMRXiH7+in6qah5SiGF604Xoc2v2R3nr+uKTaPV99te3Q7/4Y+79IPhNEgsAInW8 JOprSLlZJmyL7aAYVeqMaTd5MY3VLMNz/cWWq20a9xcCqwuT2n5X4oh4ZOUVI+gJEbmm siRd25BRNDQuae74hodWHjdvF4VCEIFJHTo5+OPq8clpMoF2Q42YhK+ybURO4y2fNhWH z6Og== X-Gm-Message-State: APjAAAUuOHVsQLRD8jZ3+9IXVyMBJe4LQydwTQOhq+jW859zyf0xwBBa 1KJw+gaolkqClrYT02MB6sA= X-Google-Smtp-Source: APXvYqxt9WbgMsjDb93KWckpdOBv27JhjHyK/F2R5hxH0ydzndgBHcRfAjTN5pqDmteqBRF1cYnzyg== X-Received: by 2002:adf:dbcb:: with SMTP id e11mr13552589wrj.272.1564504359436; Tue, 30 Jul 2019 09:32:39 -0700 (PDT) Received: from localhost.localdomain (ppp91-78-220-99.pppoe.mtu-net.ru. [91.78.220.99]) by smtp.gmail.com with ESMTPSA id c65sm64835175wma.44.2019.07.30.09.32.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jul 2019 09:32:39 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 16/20] PM / devfreq: tegra30: Include appropriate header Date: Tue, 30 Jul 2019 19:22:32 +0300 Message-Id: <20190730162236.6063-17-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190730162236.6063-1-digetx@gmail.com> References: <20190730162236.6063-1-digetx@gmail.com> MIME-Version: 1.0 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 It's not very correct to include mod_devicetable.h for the OF device drivers and of_device.h should be included instead. Reviewed-by: Chanwoo Choi Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index 81efc3ddb486..8280f96f4cb9 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include #include From patchwork Tue Jul 30 16:22:33 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 11066093 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 6851F112C for ; Tue, 30 Jul 2019 16:33:33 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5965028671 for ; Tue, 30 Jul 2019 16:33:33 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4D1A2286A1; Tue, 30 Jul 2019 16:33:33 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 EA21B28671 for ; Tue, 30 Jul 2019 16:33:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727994AbfG3Qd2 (ORCPT ); Tue, 30 Jul 2019 12:33:28 -0400 Received: from mail-wr1-f68.google.com ([209.85.221.68]:43288 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732902AbfG3Qcm (ORCPT ); Tue, 30 Jul 2019 12:32:42 -0400 Received: by mail-wr1-f68.google.com with SMTP id p13so66462911wru.10; Tue, 30 Jul 2019 09:32:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=GmdGNk4oNO4STFUUcJmXV87+bjb8OGrYJzjuXg++0eg=; b=YMR/EwvrgUn7iTeE2I0BcdmvIOc8h2UPagqrNRtz6XSKx1d4HDj8okgti2ywcWfduQ WeOSv0DL8lRGYJ6monsDZdgM3DmExNwTit4u9i8nxQczwa7yxlAY66y9sqZ7X+HS4Bfa Hh7MEQH6dOA4MfMro4mW/Wk5u4tW9Sn5dZhOwukpUQ3YWiTWo8r5RdsF/V2Q4HF6JIKs 0j1BpdPe0Oemxt559Uh/zoowFD1YHoBcyLJaBHpBVWUwmslPNJ3ZOcMTX3tJa8KBvCpN o8PW1dNxwjSJkhijdQP8DR0K2ICcXxVtOKKFPWDh8zWhpx7LeMGRGgDz+NIGp+OZbpVo Leeg== 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=GmdGNk4oNO4STFUUcJmXV87+bjb8OGrYJzjuXg++0eg=; b=lJmtEibUUaWIZvhg5fga1kCuxip4x8IU1f6WMhpVBgyZOgpOQtsQpNXlJWO9lG50lD e8tbs26x2uMzg/CHG7YKi59oDRvzEzkchjIJXXZPrxaIxS1JwmBp6nK1r+K5/ViH5ugD RBdbfSl6Y2k44SM/tD2zd+xqgq91rQZ5oKh2iL22Fli+gc3ZndldT7zYElvmk3S8vLZ2 EZaWRm4jPez8AG624TjN6CEYPhFzCqeePdjIrNgVUiL+8DpPlYz6B6JDgvMlqocBBDaT TDjJQFbhN3mFXeUkyB4XbyYk7UUTT8thwzfJKCgtVEx3OdjnobVCey4/gsgE+PqNcpwI Uw2A== X-Gm-Message-State: APjAAAWYb55CRAIfSSITjadCzXvWU431AiWbOQJnezXHfusxgEIbAjos OOj2NMMrmiOYEoQP9ViudseDHyWO X-Google-Smtp-Source: APXvYqyXHBWiO1COppwKmNpaAn5hNvdAM4G8Jq59l5I7Jb1x+FnRT3BqdlZXBqzfaTnwOLDDUgherg== X-Received: by 2002:adf:e552:: with SMTP id z18mr131982400wrm.45.1564504360757; Tue, 30 Jul 2019 09:32:40 -0700 (PDT) Received: from localhost.localdomain (ppp91-78-220-99.pppoe.mtu-net.ru. [91.78.220.99]) by smtp.gmail.com with ESMTPSA id c65sm64835175wma.44.2019.07.30.09.32.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jul 2019 09:32:40 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 17/20] PM / devfreq: tegra30: Increase sampling period to 16ms Date: Tue, 30 Jul 2019 19:22:33 +0300 Message-Id: <20190730162236.6063-18-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190730162236.6063-1-digetx@gmail.com> References: <20190730162236.6063-1-digetx@gmail.com> MIME-Version: 1.0 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 Increase sampling period by 4ms to get a nicer pow2 value, converting diving into shifts in the code. That's more preferable for Tegra30 that doesn't have hardware divider instructions because of older Cortex-A9 CPU. In a result boosting events are delayed by 4ms, which is not sensible in practice at all. Reviewed-by: Chanwoo Choi Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index 8280f96f4cb9..3543fba74b52 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -67,7 +67,7 @@ * translates to 2 ^ (K_VAL + 1). ex: 2 ^ (6 + 1) = 128 */ #define ACTMON_AVERAGE_WINDOW_LOG2 6 -#define ACTMON_SAMPLING_PERIOD 12 /* ms */ +#define ACTMON_SAMPLING_PERIOD 16 /* ms */ #define KHZ 1000 From patchwork Tue Jul 30 16:22:34 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 11066087 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 B3D3C112C for ; Tue, 30 Jul 2019 16:33:28 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A4CB928658 for ; Tue, 30 Jul 2019 16:33:28 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9952C2867C; Tue, 30 Jul 2019 16:33:28 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 4704A28658 for ; Tue, 30 Jul 2019 16:33:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732920AbfG3Qco (ORCPT ); Tue, 30 Jul 2019 12:32:44 -0400 Received: from mail-wr1-f65.google.com ([209.85.221.65]:46916 "EHLO mail-wr1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732910AbfG3Qco (ORCPT ); Tue, 30 Jul 2019 12:32:44 -0400 Received: by mail-wr1-f65.google.com with SMTP id z1so66453135wru.13; Tue, 30 Jul 2019 09:32:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=N4cjr07AsirEz91eg9mFm8o6OseSrE7ayitU1YySAxU=; b=adZyrNzXUPH6z65oVJ2iq2t4BMP5bIIVNTRVWLaTw+Wuq7M6NSo2zrbkofCsehR4oT 1fW8zX+pI2p0doHQ8moz3SSd4ScZXdBF0cC2NWxWAdX7zo9FUyCTR8U4owXw642Da6wv hTpGE0mDjratFeWcMuqlDcM6Mdq+c2P7X2/EIVnpp5BE41kBeRzuPLb5Dd4gIGibhRwN FL/TG1aQ+ExLnOUqbno/9tZZXm5Mi912EcNYNx3sZQFImLNgi932He5jgmcy+1mUiwH/ QzgjCfEXSkGpMTl/JlNSWKy54xS6Yk9RLW2TQyGP6k2+2UP4I6pWC3NANZlbhx4iSKdm EiBg== 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=N4cjr07AsirEz91eg9mFm8o6OseSrE7ayitU1YySAxU=; b=LnMNkUVuq9cNjfzxi94u5VMRe49rW2DYy0dBhzxURl6Mu48sy9iPiK/kw41KIiGbwv OJzYfdRWEL9g3IS8ybw9e+c9sXI8G1lZRun8k6HDpVEV+GqgZEosAqR/5gQ27bSofdva X2wdGEKdVTfjc8rL3lAxXp/1/82KU0ljALt8fPnDEgvpWI1WbGKmWohjv7D8RwIwLupl NS9wIS5vOr7tkloRPej3IpADiuSxHGY7lqJ7+qqYKal8SiG8VEvKhKcSqTiSaqFXe4+v hv/yPL0YmV+UCU7gzaoLz5cQMEzb2gxKHhM5jvbVCx9r2qPEFOFr8WkX1mJsi359Rr2T RnQA== X-Gm-Message-State: APjAAAW/sZQAvdgcExQO3mGSECWYKUMzcEpHzm/LfLyJ7PpKQuEF2W6K yZ6ClROq7DtG7PqPFQpWWpU= X-Google-Smtp-Source: APXvYqzBNTWBRAmBYoyVRsTlnA0EiMpuZZ5pGyv/H1nkJ2W314/JYJ1iZhIz/i4c5qfWNrga+gAhTA== X-Received: by 2002:adf:dd0f:: with SMTP id a15mr40300335wrm.265.1564504361969; Tue, 30 Jul 2019 09:32:41 -0700 (PDT) Received: from localhost.localdomain (ppp91-78-220-99.pppoe.mtu-net.ru. [91.78.220.99]) by smtp.gmail.com with ESMTPSA id c65sm64835175wma.44.2019.07.30.09.32.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jul 2019 09:32:41 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 18/20] PM / devfreq: tegra30: Define ACTMON_DEV_CTRL_STOP Date: Tue, 30 Jul 2019 19:22:34 +0300 Message-Id: <20190730162236.6063-19-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190730162236.6063-1-digetx@gmail.com> References: <20190730162236.6063-1-digetx@gmail.com> MIME-Version: 1.0 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 Add verbose definition for the client's device control register value that makes ACTMON to stop monitoring of the device. Suggested-by: Chanwoo Choi Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index 3543fba74b52..8adc0ff48b45 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -35,6 +35,8 @@ #define ACTMON_DEV_CTRL_CONSECUTIVE_ABOVE_WMARK_EN BIT(30) #define ACTMON_DEV_CTRL_ENB BIT(31) +#define ACTMON_DEV_CTRL_STOP 0x00000000 + #define ACTMON_DEV_UPPER_WMARK 0x4 #define ACTMON_DEV_LOWER_WMARK 0x8 #define ACTMON_DEV_INIT_AVG 0xc @@ -714,7 +716,7 @@ static void tegra_actmon_configure_device(struct tegra_devfreq *tegra, static void tegra_actmon_stop_device(struct tegra_devfreq_device *dev) { - device_writel(dev, 0x00000000, ACTMON_DEV_CTRL); + device_writel(dev, ACTMON_DEV_CTRL_STOP, ACTMON_DEV_CTRL); device_writel(dev, ACTMON_INTR_STATUS_CLEAR, ACTMON_DEV_INTR_STATUS); } From patchwork Tue Jul 30 16:22:35 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 11066083 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 9C071112C for ; Tue, 30 Jul 2019 16:32:48 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8BAC32866D for ; Tue, 30 Jul 2019 16:32:48 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7E4A82867C; Tue, 30 Jul 2019 16:32:48 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 D1CA42866D for ; Tue, 30 Jul 2019 16:32:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732929AbfG3Qcr (ORCPT ); Tue, 30 Jul 2019 12:32:47 -0400 Received: from mail-wm1-f66.google.com ([209.85.128.66]:54367 "EHLO mail-wm1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732917AbfG3Qcp (ORCPT ); Tue, 30 Jul 2019 12:32:45 -0400 Received: by mail-wm1-f66.google.com with SMTP id p74so57746940wme.4; Tue, 30 Jul 2019 09:32:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=qYF3Rqm4TqMv387u1JVvYrQ9Rm4YuzrDkdXu+uqilyI=; b=KS+e420+NAu/dA7XB01CZop138T8v8ZzBqAG2nsZlEVYlOZZbIUuQ9PgtmVM+8O7qN Ij4zZ9czjaP0LVOdlYcjxHhnWBHqSjoK8RXV7zBkIdtslqV4d6t35Ixo0BtiXCTX1MJc fF9L4DaPRZEPsZ7OPiyuU86xPYf71Xr+Uq+7RU+Vetc4+naBARLo7tXi7d2vd33XY81b U4jod+KIowK1nyKOh9PRW3fp8FSKZ84W5ItdSYmByHDMywviSbdz5j7KAsMgOgEJNUNC +QT/bc3Lvzu5Ly+mPhiUM+p/T+xqxBmzdZE04YonfbVA0Awv2C9ITRzxBtpcArvdpwqd nsPg== 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=qYF3Rqm4TqMv387u1JVvYrQ9Rm4YuzrDkdXu+uqilyI=; b=mlpW6gVs0o9aEXwCl0rV+vachVVX+QDOjBCaM7or2oMk+colXDNqA9XQYfYtQH1EPq ddgCP4XiSXgAG6un7qJC/ZD80OI9mOdNdcclEwgSzsClngxc8245xiP0tNxDWNbCulsW rXWXGk+ZjdEDTfKOAIPRiZbn3cJdHHoKgPnaQkgNxUCabnnyQ2GNKu/JkfyDLa0qeuP8 qDiqYlr4eqEuna2c9f1bXRvP9GpK2jxasPmFPSCYuOoej8Hg/H8/4CG9Ajy5y1omwU3u eX3q+jHbuQdZbbEgoA4DJi0uretai2cxkVmbM7B2vWnseSZOL8CRPbwtwIvrNcxPwfaw 1MZQ== X-Gm-Message-State: APjAAAUXXxjccfB3a14Ft60RC7JhmxiW5jkiNY+BxV9LnEWKfKL9BrgS yxHXSIrUaa9TUJ+bmxYJv+Y= X-Google-Smtp-Source: APXvYqyPRW+Jojt4iy78Skxns5lXBELJz+XeZ2TxYpXSmBSpylqCOUIWGxrnrc9douRXk6dolQpfZg== X-Received: by 2002:a1c:9e90:: with SMTP id h138mr109721512wme.67.1564504363244; Tue, 30 Jul 2019 09:32:43 -0700 (PDT) Received: from localhost.localdomain (ppp91-78-220-99.pppoe.mtu-net.ru. [91.78.220.99]) by smtp.gmail.com with ESMTPSA id c65sm64835175wma.44.2019.07.30.09.32.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jul 2019 09:32:42 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 19/20] PM / devfreq: tegra30: Support variable polling interval Date: Tue, 30 Jul 2019 19:22:35 +0300 Message-Id: <20190730162236.6063-20-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190730162236.6063-1-digetx@gmail.com> References: <20190730162236.6063-1-digetx@gmail.com> MIME-Version: 1.0 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 ACTMON governor is interrupt-driven and currently hardware's polling interval is fixed to 16ms in the driver. Devfreq supports variable polling interval by the generic governors, let's re-use the generic interface for changing of the polling interval. Now the polling interval can be changed dynamically via /sys/class/devfreq/devfreq0/polling_interval. Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 71 ++++++++++++++++++++++--------- 1 file changed, 50 insertions(+), 21 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index 8adc0ff48b45..e30314bd571a 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -236,7 +237,7 @@ tegra_actmon_dev_avg_dependency_freq(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev) { return dev->config->avg_dependency_threshold / - ACTMON_SAMPLING_PERIOD; + tegra->devfreq->profile->polling_ms; } static unsigned long @@ -314,8 +315,8 @@ static void tegra_actmon_get_lower_upper(struct tegra_devfreq *tegra, */ *upper = tegra_actmon_account_cpu_freq(tegra, dev, *upper); - *lower *= ACTMON_SAMPLING_PERIOD; - *upper *= ACTMON_SAMPLING_PERIOD; + *lower *= tegra->devfreq->profile->polling_ms; + *upper *= tegra->devfreq->profile->polling_ms; } static void tegra_devfreq_update_avg_wmark(struct tegra_devfreq *tegra, @@ -341,8 +342,8 @@ static void tegra_devfreq_update_avg_wmark(struct tegra_devfreq *tegra, * result, but this one is probably the least churning, although * it may look a bit convoluted. */ - if (freq * ACTMON_SAMPLING_PERIOD > upper) - upper = freq * ACTMON_SAMPLING_PERIOD; + if (freq * tegra->devfreq->profile->polling_ms > upper) + upper = freq * tegra->devfreq->profile->polling_ms; /* * We want to get interrupts when MCCPU client crosses the @@ -420,7 +421,7 @@ static void actmon_isr_device(struct tegra_devfreq *tegra, avg_count = device_readl(dev, ACTMON_DEV_AVG_COUNT); dev_ctrl = device_readl(dev, ACTMON_DEV_CTRL); - dev->avg_freq = avg_count / ACTMON_SAMPLING_PERIOD; + dev->avg_freq = avg_count / tegra->devfreq->profile->polling_ms; avg_intr_mask = ACTMON_DEV_INTR_AVG_BELOW_WMARK | ACTMON_DEV_INTR_AVG_ABOVE_WMARK; @@ -499,7 +500,7 @@ static unsigned long actmon_update_target(struct tegra_devfreq *tegra, * outdated. */ avg_count = device_readl(dev, ACTMON_DEV_AVG_COUNT); - avg_freq = avg_count / ACTMON_SAMPLING_PERIOD; + avg_freq = avg_count / tegra->devfreq->profile->polling_ms; old_upper = tegra_actmon_upper_freq(tegra, dev->avg_freq); new_upper = tegra_actmon_upper_freq(tegra, avg_freq); @@ -675,7 +676,7 @@ static int tegra_actmon_cpu_notify_cb(struct notifier_block *nb, * here for too long, otherwise CPUFreq's core will complain with a * warning splat. */ - delay = msecs_to_jiffies(ACTMON_SAMPLING_PERIOD); + delay = msecs_to_jiffies(tegra->devfreq->profile->polling_ms); schedule_delayed_work(&tegra->cpufreq_update_work, delay); return NOTIFY_OK; @@ -690,7 +691,7 @@ static void tegra_actmon_configure_device(struct tegra_devfreq *tegra, dev->boost_freq = 0; dev->avg_freq = clk_get_rate(tegra->emc_clock) / KHZ; - device_writel(dev, dev->avg_freq * ACTMON_SAMPLING_PERIOD, + device_writel(dev, dev->avg_freq * tegra->devfreq->profile->polling_ms, ACTMON_DEV_INIT_AVG); tegra_devfreq_update_avg_wmark(tegra, dev, dev->avg_freq); @@ -725,7 +726,14 @@ static int tegra_actmon_start(struct tegra_devfreq *tegra) unsigned int i; int err; - actmon_writel(tegra, ACTMON_SAMPLING_PERIOD - 1, + if (!tegra->devfreq->stop_polling) + return 0; + + tegra->devfreq->previous_freq = clk_get_rate(tegra->emc_clock) / KHZ; + tegra->devfreq->last_stat_updated = jiffies; + tegra->devfreq->stop_polling = false; + + actmon_writel(tegra, tegra->devfreq->profile->polling_ms - 1, ACTMON_GLB_PERIOD_CTRL); /* @@ -776,6 +784,11 @@ static void tegra_actmon_stop(struct tegra_devfreq *tegra) { unsigned int i; + if (tegra->devfreq->stop_polling) + return; + + mutex_unlock(&tegra->devfreq->lock); + disable_irq(tegra->irq); cpufreq_unregister_notifier(&tegra->cpu_rate_change_nb, @@ -783,10 +796,16 @@ static void tegra_actmon_stop(struct tegra_devfreq *tegra) cancel_delayed_work_sync(&tegra->cpufreq_update_work); + mutex_lock(&tegra->devfreq->lock); + for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) tegra_actmon_stop_device(&tegra->devices[i]); clk_notifier_unregister(tegra->emc_clock, &tegra->clk_rate_change_nb); + + devfreq_update_status(tegra->devfreq, tegra->devfreq->previous_freq); + + tegra->devfreq->stop_polling = true; } static int tegra_devfreq_target(struct device *dev, unsigned long *freq, @@ -846,7 +865,7 @@ static int tegra_devfreq_get_dev_status(struct device *dev, stat->busy_time *= 100 / BUS_SATURATION_RATIO; /* Number of cycles in a sampling period */ - stat->total_time = cur_freq * ACTMON_SAMPLING_PERIOD; + stat->total_time = cur_freq * tegra->devfreq->profile->polling_ms; stat->busy_time = min(stat->busy_time, stat->total_time); @@ -854,7 +873,7 @@ static int tegra_devfreq_get_dev_status(struct device *dev, } static struct devfreq_dev_profile tegra_devfreq_profile = { - .polling_ms = 0, + .polling_ms = ACTMON_SAMPLING_PERIOD, .target = tegra_devfreq_target, .get_dev_status = tegra_devfreq_get_dev_status, }; @@ -895,8 +914,11 @@ static int tegra_governor_event_handler(struct devfreq *devfreq, unsigned int event, void *data) { struct tegra_devfreq *tegra = dev_get_drvdata(devfreq->dev.parent); + unsigned int new_delay, *delay_ptr = data; int ret = 0; + mutex_lock(&devfreq->lock); + /* * Couple device with the governor early as it is needed at * the moment of governor's start (used by ISR). @@ -905,26 +927,33 @@ static int tegra_governor_event_handler(struct devfreq *devfreq, switch (event) { case DEVFREQ_GOV_START: - devfreq_monitor_start(devfreq); + devfreq->stop_polling = true; + /* fall through */ + case DEVFREQ_GOV_RESUME: ret = tegra_actmon_start(tegra); break; case DEVFREQ_GOV_STOP: - tegra_actmon_stop(tegra); - devfreq_monitor_stop(devfreq); - break; - + /* fall through */ case DEVFREQ_GOV_SUSPEND: tegra_actmon_stop(tegra); - devfreq_monitor_suspend(devfreq); break; - case DEVFREQ_GOV_RESUME: - devfreq_monitor_resume(devfreq); - ret = tegra_actmon_start(tegra); + case DEVFREQ_GOV_INTERVAL: + new_delay = *delay_ptr; + + if (!new_delay || new_delay > 256) { + ret = -EINVAL; + } else { + tegra_actmon_stop(tegra); + devfreq->profile->polling_ms = new_delay; + ret = tegra_actmon_start(tegra); + } break; } + mutex_unlock(&devfreq->lock); + return ret; } From patchwork Tue Jul 30 16:22:36 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 11066085 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 8785A14DB for ; Tue, 30 Jul 2019 16:33:26 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 780EE28658 for ; Tue, 30 Jul 2019 16:33:26 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6C5E72867C; Tue, 30 Jul 2019 16:33:26 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 14A1D28658 for ; Tue, 30 Jul 2019 16:33:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732932AbfG3Qcr (ORCPT ); Tue, 30 Jul 2019 12:32:47 -0400 Received: from mail-wm1-f65.google.com ([209.85.128.65]:35823 "EHLO mail-wm1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732924AbfG3Qcq (ORCPT ); Tue, 30 Jul 2019 12:32:46 -0400 Received: by mail-wm1-f65.google.com with SMTP id l2so57214847wmg.0; Tue, 30 Jul 2019 09:32:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=hKvLl5MtLqHMnv3zCjcaW8MF73v11AH4bgm8S8ldXCE=; b=GlqFb134XfxnMkEh6uLn1kRhDbMEnXJfanH+X3B32Z4zKb0sE8jm/rxkuSYxWHisOi OU3o1DyNgJk7/7GgUrWw5IhJtxiwz0Y2iiK/0eY7zdagnniETk2BjXEGHS/yR1kMuaWv 4ULJmslxpRwhmDfifIuTY7KyhK9ByrMfKd9Shhor0iFBaiYVotkTN//Ns7JYzgvhvj6y VitepvML8Gwaj5g9DLkZd4hfgCV0JQ6TnThaJ0wB9sADjyqQLmHgmd226tt4ZNqtflnS 8jzr1iOqhxicgKU5SD8/Rwt3B3CVao2lNUUr0NUSamKRp8o0dApg04ulG7OZzkjSHj8q /2OQ== 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=hKvLl5MtLqHMnv3zCjcaW8MF73v11AH4bgm8S8ldXCE=; b=qfkRlbqDaNpF83miNLFcOGuviPmFmAuT15ClTPwhi3afJ/i/U91R9hNblKs7f5OkPI N+sHTByAQQUzO7LeHzloZIk33DwLMU+r5oiyyycRutjDmKfYSlU8yrGMHMip05pCLAkf kRMOrqRZEqNDHd8+Pno01SJszwZi+6n0DL7V7O2OG6b+7qWy3wkbwjObEbUqMclhDsc4 ZFu97k84drx0Nsy8AanuC5LESDYUtIqEV2YPyXSc//icvQs5+OMFH0pikB6BNNiwagfE ZSU5JkytdejTIC4SumMHfSDXxaryvYvP8WZCb4gYYDiFC+JSoGXfe4z15CZtPJF0XBMG DyKQ== X-Gm-Message-State: APjAAAVsitiXWJ/gforVcxJIYPU/Fd5IGzHDWV8bvnf7XmM8phoj+U5k pvPm+JE+qJza9060qpDS3YK3B8EN X-Google-Smtp-Source: APXvYqy7ZambOH2FqJffPbsZIhK05NktYW91mK2UAxhPST/+7yvKY9FJpMgpADfq2QZ6C86Eb63VQQ== X-Received: by 2002:a1c:6a11:: with SMTP id f17mr98670207wmc.110.1564504364538; Tue, 30 Jul 2019 09:32:44 -0700 (PDT) Received: from localhost.localdomain (ppp91-78-220-99.pppoe.mtu-net.ru. [91.78.220.99]) by smtp.gmail.com with ESMTPSA id c65sm64835175wma.44.2019.07.30.09.32.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jul 2019 09:32:44 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 20/20] PM / devfreq: tegra20/30: Add Dmitry as a maintainer Date: Tue, 30 Jul 2019 19:22:36 +0300 Message-Id: <20190730162236.6063-21-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190730162236.6063-1-digetx@gmail.com> References: <20190730162236.6063-1-digetx@gmail.com> MIME-Version: 1.0 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 I was contributing to the NVIDIA Tegra20+ devfreq drivers recently and want to help keep them working and evolving in the future. Acked-by: Chanwoo Choi Signed-off-by: Dmitry Osipenko --- MAINTAINERS | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index cf2225b161f0..49010404fdea 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -10420,6 +10420,15 @@ F: include/linux/memblock.h F: mm/memblock.c F: Documentation/core-api/boot-time-mm.rst +MEMORY FREQUENCY SCALING DRIVERS FOR NVIDIA TEGRA +M: Dmitry Osipenko +L: linux-pm@vger.kernel.org +L: linux-tegra@vger.kernel.org +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mzx/devfreq.git +S: Maintained +F: drivers/devfreq/tegra20-devfreq.c +F: drivers/devfreq/tegra30-devfreq.c + MEMORY MANAGEMENT L: linux-mm@kvack.org W: http://www.linux-mm.org