From patchwork Wed Jun 26 01:32: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: 1122463 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="MxKfXKnP"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 45YQbh3BB0z9sBr for ; Wed, 26 Jun 2019 11:36:16 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726505AbfFZBfB (ORCPT ); Tue, 25 Jun 2019 21:35:01 -0400 Received: from mail-lf1-f66.google.com ([209.85.167.66]:41954 "EHLO mail-lf1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726077AbfFZBfA (ORCPT ); Tue, 25 Jun 2019 21:35:00 -0400 Received: by mail-lf1-f66.google.com with SMTP id 136so353131lfa.8; Tue, 25 Jun 2019 18:34:58 -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=1GRslL4EnHGZP4FEUc01VEaloEpJ+EJtnU0AoEc0Vkg=; b=MxKfXKnPT5mUDPoqglh5+YiohAZpvcCzyzIufEJPnla0muTv3ly39mxL5xkdwZ28zh sAnpH48Qu2jYcLaiMxQ/g0GAy+POkFl7vGZFEWd0+ejhJM7YgMrmMNMU7Lg4UG1gmPzW sQWsIfrKZ+SpFU6g8ODMs+LkoSEHYCoQ+Nv31OpEAk87957B+DpDChUJAA24O5QnhWFd T6JbsavoIi6e/HfTV81nKTSFMMKLSWLg3lkh4bSiO9rcNqdM41uZffUM79WLcdW78kBD hzwrPWUAXhm6A4n+zsF0uGyThYYqlOGriOtq3zsWvhUSFhncUIshrcVgowCgySNlfmit IoVA== 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=1GRslL4EnHGZP4FEUc01VEaloEpJ+EJtnU0AoEc0Vkg=; b=f7mzOq+cly+UZxwz2MqFEghFhtqb9JBxkP2eLBuZxm6B8XCA1Na4uy6LAFM9RqUrQy pn5D+3/FDo00+2vug6MLco5042zgm1Y+ov+5eKMD8SUkS4Hrueq6ZYc96hEtYtY94RYI B935M2Y13SwKhqRWKT2dXM1wFasweyvg4cgI+Vhqrdmw8HGtgBuhr7zNtP4Qx4O3IYAk X9ZqooiXz7PrEUvsEhxu4U/DLgzu3yG8vLM+1IknbLksbfee1x7LB7W809jWwHdTdmo+ xszajNJjPx4g2J4sklZOW2YVDW6tp1s7iO7oFf+XgiAvj1HFzggYj3jincgZnaHMbMzn /w2Q== X-Gm-Message-State: APjAAAWXqaj69YYxMyVq4spOyRf44aIOSQbFfyTvFp6nfONjzT4qzJ6E 6B8f6x7GY29QItN3SUUgmks= X-Google-Smtp-Source: APXvYqwAYLR5E9BD2lpKo/RSk2pbuwUzj90QG0Wyb23ZecxQAZBkqRtrgFTtPsw63j9o7CBQ/Nhu5Q== X-Received: by 2002:ac2:484f:: with SMTP id 15mr928166lfy.51.1561512897944; Tue, 25 Jun 2019 18:34:57 -0700 (PDT) Received: from localhost.localdomain (ppp91-79-162-197.pppoe.mtu-net.ru. [91.79.162.197]) by smtp.gmail.com with ESMTPSA id 199sm2549581ljf.44.2019.06.25.18.34.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Jun 2019 18:34:57 -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 v2 01/17] PM / devfreq: tegra30: Change irq type to unsigned int Date: Wed, 26 Jun 2019 04:32:35 +0300 Message-Id: <20190626013252.30470-2-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190626013252.30470-1-digetx@gmail.com> References: <20190626013252.30470-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org 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 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 Wed Jun 26 01:32: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: 1122465 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="bCFZHTxO"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 45YQbs57lkz9s3C for ; Wed, 26 Jun 2019 11:36:25 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726445AbfFZBgV (ORCPT ); Tue, 25 Jun 2019 21:36:21 -0400 Received: from mail-lj1-f196.google.com ([209.85.208.196]:38852 "EHLO mail-lj1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726474AbfFZBfB (ORCPT ); Tue, 25 Jun 2019 21:35:01 -0400 Received: by mail-lj1-f196.google.com with SMTP id r9so419130ljg.5; Tue, 25 Jun 2019 18:34:59 -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=12VJs13OPjF9DGDUp85PAmf8xnTp6sUbGcgLhNyWjKk=; b=bCFZHTxO8hFNGFQoD7MhmfzyaopgatsZDTQTw40ehNd5C/AXffLZ99d0wLKH+7nTkG i9nNN0Hb9q2W6IR0MqXED/Fot+zGCdp5x64Z85vL7XI2F6sxHxYgXxd38k+IdkkDQAs/ rEz43QQphJx7awgqZxZqKiZ7KQ+rdo1PJ1Woz2Sg8aVVObV188ZjIiTBAzbr78LGbM9n LxSQIq835ZrvRt1475ggJL6ib8wXVOvmgW/zUhhZlz827a9JV8boikdIJw/X949x7Jy/ 4ethC0XJh0/rANrrCjxyljW+bfHMNhZBx8IYPWvaA+QRptFKIvPJLFNx34tPLJlbbPwH zujA== 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=12VJs13OPjF9DGDUp85PAmf8xnTp6sUbGcgLhNyWjKk=; b=B92b78iD/f0f/IkVPYAacjh+uGQvYpEC7W3tK626woJS6sRazW55sb6PkLY2xd5Mba TaE7w5z6bVEriSAi9hsMFoxkTHwVZwXSmIF6H1jU8rb/m8ekhDW4llTgy/6zNYUOsGPj 8GXbBJtYg2pP+RVYMFq4ZjoXpJn7LodEslQPLC4qe79C7ho2NdvnhIg++d8MWWOC/Gij LrAnKTPQ39o7PrdsDt7Okl/xxaIhVo4Y2wu8LmXEV63YA4XZujBBRuPpjmuysY1vQ0H0 zPvg5carbMMrplC2NDVh1j9f0TYpq4uD871xIjKyant+sZEmF1PM+Syc0ZLGaEO2CNfg B/Sg== X-Gm-Message-State: APjAAAXUV+u/G5uqOr64tvm/5gyOii0ebE4mghWwlmxe8AiY6oAPA3un NSKVgsPFcR6G8/Y4lRggc70= X-Google-Smtp-Source: APXvYqzj30HCRH/mwgGyYtpVE/TQyMmsADgvUYhouduTFFXS9gx9/ktFlRueLPA8DrrOtbIwj4b6NA== X-Received: by 2002:a2e:9b03:: with SMTP id u3mr883297lji.15.1561512898917; Tue, 25 Jun 2019 18:34:58 -0700 (PDT) Received: from localhost.localdomain (ppp91-79-162-197.pppoe.mtu-net.ru. [91.79.162.197]) by smtp.gmail.com with ESMTPSA id 199sm2549581ljf.44.2019.06.25.18.34.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Jun 2019 18:34:58 -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 v2 02/17] PM / devfreq: tegra30: Keep interrupt disabled while governor is stopped Date: Wed, 26 Jun 2019 04:32:36 +0300 Message-Id: <20190626013252.30470-3-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190626013252.30470-1-digetx@gmail.com> References: <20190626013252.30470-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org 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 | 43 ++++++++++++++++--------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index a27300f40b0b..5e2b133babdd 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); + devfreq = devfreq_add_device(&pdev->dev, &tegra_devfreq_profile, + "tegra_actmon", NULL); if (IS_ERR(tegra->devfreq)) { err = PTR_ERR(tegra->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 Wed Jun 26 01:32:37 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1122464 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="d76iGYyS"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 45YQbp23sxz9sBb for ; Wed, 26 Jun 2019 11:36:22 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726667AbfFZBgQ (ORCPT ); Tue, 25 Jun 2019 21:36:16 -0400 Received: from mail-lj1-f195.google.com ([209.85.208.195]:34230 "EHLO mail-lj1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726037AbfFZBfC (ORCPT ); Tue, 25 Jun 2019 21:35:02 -0400 Received: by mail-lj1-f195.google.com with SMTP id p17so438047ljg.1; Tue, 25 Jun 2019 18:35:00 -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=jlaXfET5L4G5Q3oIQtoqkvvOO4wQfddYSuicKTgAAs4=; b=d76iGYySwJ0HbA4wCBB+K32trR9n3aJVDFZN2YnYjGSzsm0e64Yz8n4bH8W1a3K1r6 A9wfrE4tYzEjpJ8AGFSFj2hZ9bOZ+P0scmxD1GmUkdnnl13j5YMvdT1xWxkgvc8pttMv jDgQVoNzo1gFIuPCaub+3RLOgs0ZpCgO5Vk4et4p8dxvtr78hh0dDeIdDMo+y8bcfQdh 82vBcb/8XTcIll5nRHMhAdD5UFxK22tl2arG0TR2R92afEZdKpNwVO14ZmIv/szULp7M 9uwtfEAgAIo+XHJsnOf6vtH9ae5ELJPJp04AP3pVL1BVI+R/K3ZVrIzf9CyMkMcy35JM EsGw== 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=jlaXfET5L4G5Q3oIQtoqkvvOO4wQfddYSuicKTgAAs4=; b=XIQA/X4MdkpgklrCuGejBzxk+BXJ6Cq7nl6OY6wOvkORe0LTL0mJckZtbjmpMhBDDL wXt9KLmVYYUnE1qXOWQzZgUNLbLm4NtrBTOMwnsIqJIh3lMgtBSs05+OGMiZAIvBa7VV I978Y2Mb8bAzc5MdcWL//p+oD55VaEvd6LiPLq3NxMBmzX0LpXBIdR5dbGFBCEbFOMM9 DuwNmOA2CjDxj7PwxBjmOdiyuCvFiWaRF/cHawai4A9KSYqK8jQePgBxmFo8Fl8Bvk5N cWojvF1DheMDBcq9IiAiIkETpnu+R524jZ8lDkiGPgpsf8cKDIaKgm/U9S2GAgFDkN62 IMDQ== X-Gm-Message-State: APjAAAU6dmpppXIMZ8MIySm5xdR5yY9gnshSRvRzz62MOtRtLSbvpS34 szZYU6X/8dRe/Im7NB6W5vA= X-Google-Smtp-Source: APXvYqzZI/OpEA23RBsypoJZPODUG/O5VXeaDl28dauVTNmrLDwEX4dDM3FyHgwoNcQhAlXZ0S5Hug== X-Received: by 2002:a2e:9788:: with SMTP id y8mr879030lji.41.1561512899879; Tue, 25 Jun 2019 18:34:59 -0700 (PDT) Received: from localhost.localdomain (ppp91-79-162-197.pppoe.mtu-net.ru. [91.79.162.197]) by smtp.gmail.com with ESMTPSA id 199sm2549581ljf.44.2019.06.25.18.34.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Jun 2019 18:34:59 -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 v2 03/17] PM / devfreq: tegra30: Handle possible round-rate error Date: Wed, 26 Jun 2019 04:32:37 +0300 Message-Id: <20190626013252.30470-4-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190626013252.30470-1-digetx@gmail.com> References: <20190626013252.30470-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org 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 5e2b133babdd..5e606ae3f238 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 Wed Jun 26 01:32:38 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1122462 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="blagBfA/"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 45YQbf1zyCz9sCJ for ; Wed, 26 Jun 2019 11:36:14 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726077AbfFZBfD (ORCPT ); Tue, 25 Jun 2019 21:35:03 -0400 Received: from mail-lf1-f67.google.com ([209.85.167.67]:35545 "EHLO mail-lf1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726511AbfFZBfD (ORCPT ); Tue, 25 Jun 2019 21:35:03 -0400 Received: by mail-lf1-f67.google.com with SMTP id a25so376421lfg.2; Tue, 25 Jun 2019 18:35:01 -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=d/7wNA8MAMSp7e/mZW/Vod5RtNn1ZWLvCZTV21PmCFE=; b=blagBfA/RhbtGyvgWrThVNlgnXp2+faUZVnjQLZSgEuUcTLYdWEECrOA1eIrtCbeUh iMiKnkthJTBrqHKMTidO4emPabBb9cJDxG3CRwMiPuvQGJR79HfqIsk6gZptrnEPUgSR +sLNVsd9eDjGTc2ox/iMofkME/8JStaOLVyA/zCbwjGkV/7KGUXDuyqyaSofx+cFGU7T NHfZMaRF7PTLLM/JBmq2na6YPGOwwRteZxE+JSAUqAQfgxGP2YPnv17nixqepmXiudqA hMIQ3UAnBSkxl8ZOShKkOKoBuraeRLC+XA4bl44SgH+Lvvw147RO7c59wQZZ01kRRNYa 8MyQ== 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=d/7wNA8MAMSp7e/mZW/Vod5RtNn1ZWLvCZTV21PmCFE=; b=YZGaJey+h2l381OBC1IUJ+5SiTytOL9SFp5w8gtBeMXdP6xj7s6qq1ehm2T+UQQYCO nzoBMI+loClAAH2ZWOIC9NCvFvMnJQt+xD54w0A3WNSX0Dnkzo98TYSA6CX2lFH+VnJS ug1WlMCsk7cCfJBbRfIyu3n5f+za5mEztxgOPOk++Gg4d7djnap+GySgTOvX5oa1SJR1 HxvJYwua03DBw9y5KDivykMQ5JqpDqJSJgAuQod62K2j+UsMDmiph+KXuA4pagf3JStV 3d30HKyonXlFCN3ZpU8dOP2gc5AC3FdC+zxwJzZTJxq7WcYm9cYogk2B8SfPl31nolwa qQ7Q== X-Gm-Message-State: APjAAAUszM2r/bU9uWMfnvGkExQDpoyDdg3tCr/oJV6lgMtQVwecAmXK at3BN7WLdND0Xi64bvY3it0= X-Google-Smtp-Source: APXvYqz6FUD1Zdipfg2gu7u65/qlq6MzXzjmh6Cb2R0/kWZ8AhqdxteZ3yCgJEt/jUZGWFOjcYm9zA== X-Received: by 2002:a19:3f16:: with SMTP id m22mr903056lfa.104.1561512900865; Tue, 25 Jun 2019 18:35:00 -0700 (PDT) Received: from localhost.localdomain (ppp91-79-162-197.pppoe.mtu-net.ru. [91.79.162.197]) by smtp.gmail.com with ESMTPSA id 199sm2549581ljf.44.2019.06.25.18.34.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Jun 2019 18:35:00 -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 v2 04/17] PM / devfreq: tegra30: Drop write-barrier Date: Wed, 26 Jun 2019 04:32:38 +0300 Message-Id: <20190626013252.30470-5-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190626013252.30470-1-digetx@gmail.com> References: <20190626013252.30470-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org 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. 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 5e606ae3f238..4be7858c33bc 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 Wed Jun 26 01:32:39 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1122461 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="EU80bHHr"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 45YQbd0HPWz9sBb for ; Wed, 26 Jun 2019 11:36:13 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726576AbfFZBfG (ORCPT ); Tue, 25 Jun 2019 21:35:06 -0400 Received: from mail-lj1-f196.google.com ([209.85.208.196]:41839 "EHLO mail-lj1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726537AbfFZBfF (ORCPT ); Tue, 25 Jun 2019 21:35:05 -0400 Received: by mail-lj1-f196.google.com with SMTP id 205so408894ljj.8; Tue, 25 Jun 2019 18:35:02 -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=MlomMmW/7zcZYKIAjDyFHsxQADqtxyjkxFg21a+ilM4=; b=EU80bHHrsUzGbHDDcyyj/aQwS2M5oKCmhR1YYxpa4+5Z0Qwpm+u8MnKlFTLzKL+FwL wZTSVAxZpTakUn2KWbACU/wwroMS72eGFd8XeOqm0DXh/f42GEgTF/8VX9xJISzoEc0x SsvUDd/UQZ2H0H49nSFZrN6LolHXb9KOdst4B5YEjdNbQ32afumpHLf0vQEsBZRvMFoQ CYlc0+iNm/UQCcpRgXMe2vEb18zQ1JyN56g4vsjYSxzivOSO3MbY0An+gy31Xhd3UlLJ 9hy14s6LeADioU6+UsFENkE+VxLPs2LuQKmzrpj85mIteEmmA6nsWN/SDz1wT9aCJo94 mgsg== 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=MlomMmW/7zcZYKIAjDyFHsxQADqtxyjkxFg21a+ilM4=; b=lK1YGk+OBswFzZvKWBRo16pANCZ8eM2wmfvvVAtcnJMCalncJk61sdxhvG4bo+uKw4 GVpOvOISTP3ji4wY/BO99Gxoaa8GCQk/RobR2veU9is6E6ut1z87vNezaATJxqCfL5Xc NdYnrnP3nx9P3c54t0S+f/rHZOKI99VA+nMoNRioHMTMluPeQvSkkbZg6rNqdkJM15it paw2u9mzIfi0E3wfls0NIlyOhW+4Sxe9xG/+CYOUsG/68JkrVnDfyqB9yQCdUXxsPBc9 3Tu92H+Z5uxZHc1htCFyKx7IhZ2YpqHLTqJlgf6s3ca3b3XYT+alKfLiEySWhLRzX+xo 5bFA== X-Gm-Message-State: APjAAAX19OP32z140rGEup4RrluYTC7cLkqDCz7V8CESGxx0tZqIJewC cfcgjcMweo9HmSAZq/z1hzg= X-Google-Smtp-Source: APXvYqz38tANQm7O3j8+5A2Rkx0dYVx0sUTAN6V1XjUZUs4k6xz5mh+IZdHWH8V4qHH4Z9w+pCidaw== X-Received: by 2002:a2e:8345:: with SMTP id l5mr876302ljh.18.1561512901982; Tue, 25 Jun 2019 18:35:01 -0700 (PDT) Received: from localhost.localdomain (ppp91-79-162-197.pppoe.mtu-net.ru. [91.79.162.197]) by smtp.gmail.com with ESMTPSA id 199sm2549581ljf.44.2019.06.25.18.35.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Jun 2019 18:35:01 -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 v2 05/17] PM / devfreq: tegra30: Set up watermarks properly Date: Wed, 26 Jun 2019 04:32:39 +0300 Message-Id: <20190626013252.30470-6-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190626013252.30470-1-digetx@gmail.com> References: <20190626013252.30470-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org 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 | 295 +++++++++++++++++++++--------- 1 file changed, 209 insertions(+), 86 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index 4be7858c33bc..30c5b3531d6f 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,191 @@ 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_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; + + freq = dev->avg_count / ACTMON_SAMPLING_PERIOD * KHZ; + tegra_actmon_get_lower_upper(tegra, dev, freq, &lower, &upper); - device_writel(dev, avg + band, ACTMON_DEV_AVG_UPPER_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; + } - avg = max(dev->avg_count, band); - device_writel(dev, avg - band, ACTMON_DEV_AVG_LOWER_WMARK); + 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); - device_writel(dev, do_percent(val, dev->config->boost_up_threshold), - ACTMON_DEV_UPPER_WMARK); + 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_down_threshold), - ACTMON_DEV_LOWER_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); + + 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); + + /* + * 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; + } + if (intr_status & ACTMON_DEV_INTR_CONSECUTIVE_UPPER) { /* * new_boost = min(old_boost * up_coef + step, max_freq) @@ -253,8 +399,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 +407,26 @@ 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; - } + /* 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) -{ - 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); - } +static unsigned long actmon_update_target(struct tegra_devfreq *tegra, + struct tegra_devfreq_device *dev) +{ 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 +458,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 +467,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 +497,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 +591,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 +608,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 +627,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 +643,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 +765,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 +793,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 Wed Jun 26 01:32:40 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1122459 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="J/zWkhFq"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 45YQbX5cxjz9sDB for ; Wed, 26 Jun 2019 11:36:08 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726584AbfFZBfH (ORCPT ); Tue, 25 Jun 2019 21:35:07 -0400 Received: from mail-lf1-f66.google.com ([209.85.167.66]:43032 "EHLO mail-lf1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726544AbfFZBfF (ORCPT ); Tue, 25 Jun 2019 21:35:05 -0400 Received: by mail-lf1-f66.google.com with SMTP id j29so345356lfk.10; Tue, 25 Jun 2019 18:35:03 -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=dakuSXC8S+4d3ZwgTUxyU+C7IUHzNyF1kauoHOg6pX0=; b=J/zWkhFq0bg3fNHcialc5pkUp7773LPu/FpnnieGQB3C/hU0HezN98HbZojxjS38fd 33LvhjnWMFRFOxlEITiia62qce/x96BVnzu+9XYNVOok+jdFuyyIQxE3kwP5sXRtpmH2 7c0k0yZZ1RN52w/zt9CAGZ/y1ZeHh5q8YDSub43ZKFDHEwZueFgHAfcbKrQoEFiev9GY +lVJeVt9ni/lZLBaBQ6ipJe0WioEX/xbagpPQ8VaToKlYqEcmOwd071K5jVxuxVuOFzz vgRgKobhmxwQXKsHMv+itlWnr7auFiHT142Z0ALxqxDb49f8YIhTcOHqInUZWFPh1kfN 6gTg== 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=dakuSXC8S+4d3ZwgTUxyU+C7IUHzNyF1kauoHOg6pX0=; b=E3b5cB3AeCt/MmYdnh2Rm8ucixmaoXN6VpQaFezrzn1lswqKFYrYI+kP+sifqqiXTm 2y98Uql8Nx3dAbbsw1D7I/F4tVN6Q2ph8HyTf88LesBbOyy1/X6ngDu+uhvFnxAyBWGy uFlb7ZOHMk/y0uhhlbNWdqQ8vpx8tz8vlwA4rxpizlLO2XzsNdDXsLsxoVCO8hzENnH1 w86vLAD3Xw/bMuShFF66STrIkgL8tZXKNqRybEDgQuv2ZWKiDl3Mz1N4uwVNVEkR4wBL Eh6ey3/eKTqMpSNZNeIF2Ap9gufRZBsWC0rhYTmGfgpnhLBkbR1UXobtCspXcNPx+8qn +NTQ== X-Gm-Message-State: APjAAAV6BClo6j6EC8/ioIcC49FIbgDxqrAoYJpBH175EQ/zxYuV+dkn hX3m8JQDlcVx66WtKuLc9aE= X-Google-Smtp-Source: APXvYqwTA4+vjBE6dTRR+9PeAJurgBpFuRGPMd2Huei0KYA06uoksUuaOEXZRtyoYUJmWTBPFovrxw== X-Received: by 2002:ac2:5595:: with SMTP id v21mr885509lfg.54.1561512902954; Tue, 25 Jun 2019 18:35:02 -0700 (PDT) Received: from localhost.localdomain (ppp91-79-162-197.pppoe.mtu-net.ru. [91.79.162.197]) by smtp.gmail.com with ESMTPSA id 199sm2549581ljf.44.2019.06.25.18.35.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Jun 2019 18:35:02 -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 v2 06/17] PM / devfreq: tegra30: Tuneup boosting thresholds Date: Wed, 26 Jun 2019 04:32:40 +0300 Message-Id: <20190626013252.30470-7-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190626013252.30470-1-digetx@gmail.com> References: <20190626013252.30470-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org 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. 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 30c5b3531d6f..9b172e2acd40 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 Wed Jun 26 01:32:41 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1122457 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="K4d5KgVi"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 45YQbW2fxbz9sBb for ; Wed, 26 Jun 2019 11:36:07 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726798AbfFZBf7 (ORCPT ); Tue, 25 Jun 2019 21:35:59 -0400 Received: from mail-lf1-f68.google.com ([209.85.167.68]:38815 "EHLO mail-lf1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726554AbfFZBfH (ORCPT ); Tue, 25 Jun 2019 21:35:07 -0400 Received: by mail-lf1-f68.google.com with SMTP id b11so366462lfa.5; Tue, 25 Jun 2019 18:35:04 -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=JMrqyA3dVoAUmu6/xP6uwJ3H5zVMfGxQwAxV4fMeRwc=; b=K4d5KgVinNO7et21nvIYMFzhKBqUhPWvQvHMQ81yZdOi4iKqyzzuo43yt/3Uj6EN15 /gNUyFxF61KiSP2NZ4fLCAhdXaP/DgFY//1kAQUDymyQDgUxRFcE+ZqKPsG8eM4Ra3jr mN/Tvib54V1BkMk8I+Seu1E0vLwhGcvQDws5lvXMpg7QyEVR5JttAeBbpnWl5jVaJqAQ Fbw3DsSYUiUltlfnQG3j1FJmVN7V036k1rkaTFHcAioZ0Qhuvagw2fpL/1+N7Q6UuA+8 QaV1RASQpD6UNspOkGGOCBZTl5SR4051O32EeOQZgVJ0fdAPxMS+77/ZqjCG2hz6Z5nl +kqw== 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=JMrqyA3dVoAUmu6/xP6uwJ3H5zVMfGxQwAxV4fMeRwc=; b=Vnq1K+BUjIZ6YS6bY2wK4H6et/6XDNoVMcJ6LtL7Hb7oLWb6dqGEz5F/g7etzMhTjj 17WmeSq6e7ikSEUGjYtDlHNDBUZIHqa1DiF/UP+GJJWErdrknSsOKBo7xZGg2w0iTK5s rMLRz669CltKdYu6Wrf+WyNtOEhskhoFjE7Nnz3kYZdwTFs4N23rakI5gFxtIdj4ksWi zHqv/HlYsX08j8n+NLOu2bBXkhcJH+jguI0enfZIG+88iRATRoTFNxclVp6NtULkCv1X TNnAo5XcN2rzfmyQSI5WZWPcqW4pnJb4eaIFrznZwzUkjtzN0ljaAVMbqFz+ym8qDdiz jMaA== X-Gm-Message-State: APjAAAWKQyAlBKwnl3gvqqvQU7TV1Ms6tKSqGTe63sS4qWFV7ooy5u00 rT84AmGY5aJYEyFQS6pDmg8= X-Google-Smtp-Source: APXvYqySCRWaoWHOvauaJ+7uXDruKOKdEVze4i+/RgchKVL4LBL8PkVxvwig19vtlQ4ZgGa59fVwaA== X-Received: by 2002:a19:8116:: with SMTP id c22mr864971lfd.111.1561512903979; Tue, 25 Jun 2019 18:35:03 -0700 (PDT) Received: from localhost.localdomain (ppp91-79-162-197.pppoe.mtu-net.ru. [91.79.162.197]) by smtp.gmail.com with ESMTPSA id 199sm2549581ljf.44.2019.06.25.18.35.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Jun 2019 18:35:03 -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 v2 07/17] PM / devfreq: tegra30: Use CPUFreq notifier Date: Wed, 26 Jun 2019 04:32:41 +0300 Message-Id: <20190626013252.30470-8-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190626013252.30470-1-digetx@gmail.com> References: <20190626013252.30470-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org 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 | 105 +++++++++++++++++++++++++----- 1 file changed, 88 insertions(+), 17 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index 9b172e2acd40..a2cae8348dce 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -17,6 +17,7 @@ #include #include #include +#include #include "governor.h" @@ -154,7 +155,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 work_struct update_work; + struct notifier_block cpu_rate_change_nb; struct tegra_devfreq_device devices[ARRAY_SIZE(actmon_device_configs)]; @@ -454,8 +458,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; @@ -465,7 +469,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); /* * EMC rate could change due to three reasons: @@ -494,6 +498,37 @@ 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, + update_work); + + mutex_lock(&tegra->devfreq->lock); + update_devfreq(tegra->devfreq); + mutex_unlock(&tegra->devfreq->lock); +} + +static int tegra_actmon_cpu_notify_cb(struct notifier_block *nb, + unsigned long action, void *ptr) +{ + struct tegra_devfreq *tegra; + + if (action != CPUFREQ_POSTCHANGE) + return NOTIFY_OK; + + tegra = container_of(nb, struct tegra_devfreq, cpu_rate_change_nb); + + /* + * CPUFreq driver should support CPUFREQ_ASYNC_NOTIFICATIO in order + * to allow asynchronous notifications. This means we can't block + * here for too long, otherwise CPUFreq core will complain with a + * warning splat. + */ + schedule_work(&tegra->update_work); + + return NOTIFY_OK; +} + static void tegra_actmon_configure_device(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev) { @@ -525,9 +560,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); @@ -535,7 +577,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) @@ -544,11 +609,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_work_sync(&tegra->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, @@ -657,6 +724,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 @@ -667,7 +735,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: @@ -682,11 +750,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 = { @@ -792,9 +860,12 @@ 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_WORK(&tegra->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"); @@ -821,7 +892,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); @@ -839,7 +910,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 Wed Jun 26 01:32:42 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1122458 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="SIFhCJF4"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 45YQbX19S2z9s3C for ; Wed, 26 Jun 2019 11:36:08 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726382AbfFZBf7 (ORCPT ); Tue, 25 Jun 2019 21:35:59 -0400 Received: from mail-lj1-f194.google.com ([209.85.208.194]:35645 "EHLO mail-lj1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726511AbfFZBfH (ORCPT ); Tue, 25 Jun 2019 21:35:07 -0400 Received: by mail-lj1-f194.google.com with SMTP id x25so436085ljh.2; Tue, 25 Jun 2019 18:35:05 -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=rkIjugB4w8xYWi6r3cGW1MkswK/7WFKc1Uo0CWzihn8=; b=SIFhCJF4Z6BiFc34bYLSckvy/AB49CHacHOPR7hpYSwDZpILwa2ihcheHlVh5Ds/Gy 0tvwHQ1M0ZHn6Gl5Hnnvxdd/UERQ7q+X7HOGgWlZZ1AkWTs3cwX7k8Vq+IfBtaQlc9c+ 808b6Ouq8TBwr+6B2yzuRNEh5zP+Ey3+S6qkMdPXPO0bhO3cqo3AahU69WqiRlt3hrY+ YFXcuttt578UHLBtC7uJIA5wots5EQ8NU/dnIlRzFICMNZ00Oi3D+Nv4179eTP0fXu5f QERyEYrsEW0YMxuc4zWo7dOojyfqWuygXyuYcueR2GH7IgMG52iXOzYyg7zPpb5l5371 jWuA== 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=rkIjugB4w8xYWi6r3cGW1MkswK/7WFKc1Uo0CWzihn8=; b=jh4D//DYrV6AvsgFaxd36V2QLotT1l0MDaInudDIwkquoHRjrNFbfS18jBOEkCAy5j vAmL4Z0TFeP/vg+4BiIiFEqSlYZ9DbiNEv+yrT3mQPaRf3es6nozNazyXyOzFgTqsp4y m/41zatmftnyRpo96pV8CTkVXovrxB+h4mD3ggFBKSI93eO6rP6/yoRAaQWsNVzKQ7hN QqRkWk/KHPXUJBN+O6jgHGbijLSqkCwg5JfsT/8SO4oNmar5p9KbLUvwVZfcdfIQt1Hp T+Wt52AM/2iSXOsbg6aOphLnwnGPtim+mQ8fNXwTGXU1JaOsdTd8TINu6rBMBXWcmXzu ZIqg== X-Gm-Message-State: APjAAAUFvbNScATUywdi5UUMa6YEydlx8dxPSotSECm0wml7poOvMTKZ HU3ycerPMjfVTmbEi8Jx6zs= X-Google-Smtp-Source: APXvYqwGz4l+lBPFgkGFhrerCzKAmXHf1BrmDmDxFJJbN18QE/xJRcRgn4A/rDs5UlSkNKwFiV0q3A== X-Received: by 2002:a2e:9116:: with SMTP id m22mr883680ljg.216.1561512904939; Tue, 25 Jun 2019 18:35:04 -0700 (PDT) Received: from localhost.localdomain (ppp91-79-162-197.pppoe.mtu-net.ru. [91.79.162.197]) by smtp.gmail.com with ESMTPSA id 199sm2549581ljf.44.2019.06.25.18.35.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Jun 2019 18:35:04 -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 v2 08/17] PM / devfreq: tegra30: Move clk-notifier's registration to governor's start Date: Wed, 26 Jun 2019 04:32:42 +0300 Message-Id: <20190626013252.30470-9-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190626013252.30470-1-digetx@gmail.com> References: <20190626013252.30470-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org 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. 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 a2cae8348dce..8e1c56790ac3 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -574,6 +574,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]); @@ -600,6 +613,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; } @@ -616,6 +631,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, @@ -860,22 +877,14 @@ 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_WORK(&tegra->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); @@ -891,9 +900,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); @@ -910,7 +916,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 Wed Jun 26 01:32:43 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1122460 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="ZttdUf7h"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 45YQbc39BNz9s9h for ; Wed, 26 Jun 2019 11:36:12 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726652AbfFZBgH (ORCPT ); Tue, 25 Jun 2019 21:36:07 -0400 Received: from mail-lj1-f196.google.com ([209.85.208.196]:44666 "EHLO mail-lj1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726572AbfFZBfH (ORCPT ); Tue, 25 Jun 2019 21:35:07 -0400 Received: by mail-lj1-f196.google.com with SMTP id k18so395867ljc.11; Tue, 25 Jun 2019 18:35:06 -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=ES/vfze9v/7K/EDiZc6SJwTqcOwXLf9AWF6aBFoXttY=; b=ZttdUf7hWHbaB81wbjh+EvDj/Mpwg1YtoXbxtL0qk9UojPdodpPrruN5gkyJB+DeWc g6ONXUa27Hshc2cY42Ft0OZEJWsUI1doM2LjCLnmU9tVFulkDlgkeLqyTHuHjkwPdP0e gUz7NsOnV+qedlsefC2KhwEy5NcpzYHHp6/U+Zcy7FNzoUg/cmiTx0GwbThuOnSv1t6O HxMUTBLiXTXWnyLHAgc6h0nsB/ntEG7MZBUNjUi9CLrCjci+2568TsmkJHSrbgXTpqoh AvWgicDdRes/OCplKeNm15WIASM+o6Zk5QXPldsA+2sAhxdHUVjiHi3H3UJjYGRlYppi lHAQ== 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=ES/vfze9v/7K/EDiZc6SJwTqcOwXLf9AWF6aBFoXttY=; b=IJHeXVbvwHtp3C/IHXSyRgkAr7gg5Jb1ovBeCD+/FUjmJMxPfD/ci+Eaoef4CcMOtO ReLVIH6F9+o4UrCzmzxZL8CugjuZ+r+hjusSJFarEtqw7oRbYN1zvjnIByNzUA8Bq92Q +g0Q2YtEl+eFGokQ50eaklymqR0qNU3rOl1NncffIy243GjDyZgK0WekqPUvlhpv2PC6 TQ1dw+vjh7WwHBO4zSrkIt55uS4I95fejw6DDZNciOjmE0owiSaJEsyAiOsXXVQ82pY/ 6ySJwEE20B7gzNq/PRVTLVXi1+cD8kaNi2YESO2vcrYytTjptZ77Jgy4/9rwg1oPVhsR y2xw== X-Gm-Message-State: APjAAAU7O19ifMm7Aqj3P7kRLd+UKDD7TCpUiuxSjSQMx121QUlif/Kp mOjnH9fmGbH1KwoDeMnkBsA= X-Google-Smtp-Source: APXvYqwaZuxZv1us6taG9s9eaWKkPnGOJ76CBFEm46O4t7cCsWvFg84pMcQHQoAQfxQ+PF5jjvFsmw== X-Received: by 2002:a2e:9ad1:: with SMTP id p17mr938152ljj.34.1561512905920; Tue, 25 Jun 2019 18:35:05 -0700 (PDT) Received: from localhost.localdomain (ppp91-79-162-197.pppoe.mtu-net.ru. [91.79.162.197]) by smtp.gmail.com with ESMTPSA id 199sm2549581ljf.44.2019.06.25.18.35.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Jun 2019 18:35:05 -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 v2 09/17] PM / devfreq: tegra30: Reset boosting on startup Date: Wed, 26 Jun 2019 04:32:43 +0300 Message-Id: <20190626013252.30470-10-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190626013252.30470-1-digetx@gmail.com> References: <20190626013252.30470-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org 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. 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 8e1c56790ac3..b36d5d644c6e 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -534,6 +534,9 @@ static void tegra_actmon_configure_device(struct tegra_devfreq *tegra, { u32 val = 0, target_freq; + /* we don't want boosting on restart */ + dev->boost_freq = 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); From patchwork Wed Jun 26 01:32:44 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1122456 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="rrYWm0l2"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 45YQbN5Q4Zz9sBZ for ; Wed, 26 Jun 2019 11:36:00 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726606AbfFZBfJ (ORCPT ); Tue, 25 Jun 2019 21:35:09 -0400 Received: from mail-lf1-f67.google.com ([209.85.167.67]:46767 "EHLO mail-lf1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726579AbfFZBfI (ORCPT ); Tue, 25 Jun 2019 21:35:08 -0400 Received: by mail-lf1-f67.google.com with SMTP id z15so337846lfh.13; Tue, 25 Jun 2019 18:35:07 -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=hh+SuljLT/v5QlJa+5yRN2BFHrXujvc9GV7nQoXJXYE=; b=rrYWm0l2KI8Reu+pzKhzQ6HczTjd11xjaGFjRxe1YYbxW/imhDtPF26V72RLcotdTY /VK72yuG+yElhPJ/cVnyNxZXVuh1UDDmsbV48jXGh2kK1Fa5OYa8Xk6YRWhTWWhe8m2W VtdEdCuA11hyokZ0bpwqYfFP7dHd7CKl+xlOVLZsu9aT87V2uEbjLbHEWzn6sMDM8HPl PSjC5XOihYCOPumKFw5ZpmL18w2iJfcf6z0SDZFURaxsPd6TQBPktSMJPX0olrpEGiN0 BtlO4QwIa6iuUcVUojJgQddSttvwOhB/+hY4dttXMC5AylyzPY/71cdrm/vqBCjuMLIs /RZQ== 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=hh+SuljLT/v5QlJa+5yRN2BFHrXujvc9GV7nQoXJXYE=; b=hDMQbfuu4YQbejflZy7wTQUD2jS3aN2qavSlBeABCLJV9XTGQJBxPyCnPbFSJN5bUw yGzR5SZne8DFrQJTKe8rU2n4QJokB/9ltE7QTxTcrUfkn9OrhPYiF8BQcuD8iwmjOvhy A+21exzhHI0OpLc3XWI84hocAq+n24fjD9buJeeCGRazOsey73q8tuRzRvPbtht0sxwE wu/buCTqIx1gLmkYbtNqDOd/1pYjF8ZxSJlYjRvD9P0NF+kHmTU4jD8TbiQt9Q0lnNia HEtI4mCzA1FMSBNPmnbSMJDDEX9wpstfJ+NhF5uecghnOt2l6fn/XhCjGXqCC9UB+DUf bcoQ== X-Gm-Message-State: APjAAAUkp3HX3eSOESqYBdNiQExWy3zpLvbbm3EWovamlnA8CFB7tyBj 5p3UOISgj+jM6LQ0ph/pDgI= X-Google-Smtp-Source: APXvYqzptMlmHRCdPW5e6i2cUb3i/6SUt3o+QCn8vUXK93Wcf4VMY8ma+L3LcecBpKDyA0OtdGHBEQ== X-Received: by 2002:ac2:5b0c:: with SMTP id v12mr982808lfn.184.1561512906822; Tue, 25 Jun 2019 18:35:06 -0700 (PDT) Received: from localhost.localdomain (ppp91-79-162-197.pppoe.mtu-net.ru. [91.79.162.197]) by smtp.gmail.com with ESMTPSA id 199sm2549581ljf.44.2019.06.25.18.35.05 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Jun 2019 18:35:06 -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 v2 10/17] PM / devfreq: tegra30: Don't enable consecutive-down interrupt on startup Date: Wed, 26 Jun 2019 04:32:44 +0300 Message-Id: <20190626013252.30470-11-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190626013252.30470-1-digetx@gmail.com> References: <20190626013252.30470-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org 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 b36d5d644c6e..1e704289c129 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -556,7 +556,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 Wed Jun 26 01:32:45 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1122455 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Ku0oBhc7"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 45YQbL24vXz9sBZ for ; Wed, 26 Jun 2019 11:35:58 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726766AbfFZBfs (ORCPT ); Tue, 25 Jun 2019 21:35:48 -0400 Received: from mail-lf1-f68.google.com ([209.85.167.68]:35867 "EHLO mail-lf1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726597AbfFZBfK (ORCPT ); Tue, 25 Jun 2019 21:35:10 -0400 Received: by mail-lf1-f68.google.com with SMTP id q26so373559lfc.3; Tue, 25 Jun 2019 18:35:08 -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=Lr9hct+Hu7BhNIICiHqz94dDspYUGMjB7un5AqOfkn8=; b=Ku0oBhc7ox12UpHV0e4vGJO6Na9rBkoowUz034Hz6tMy4JdaY0pPKq+h+FmwNkItCv iD1ydpu/izyo1Giwh4q+fBwR54oexPlg/d+V6TJnl1Z7ikQ8CBiDHlK8EorcWecJOHK5 rLbKqMdVUsuTxYPueC3BoY0TBoFj0YxmNUMIvPbqf8ZGlt6wcdEGk1MSyZWuw/S0CZXg NDzcACOMG706RCQB14/uSSu4Qqlu26PHMag115IMHdmN0Z1r534qhVFeS6/6+CnGWlMv JkorFEig9VeTO0GFMNSixAiNY0R9I6fttai83g7fpWxXI1BKQZaWyE8yDMTubkGoppSU UdxA== 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=Lr9hct+Hu7BhNIICiHqz94dDspYUGMjB7un5AqOfkn8=; b=b2sVZOfuWbfsAZzAPwgZoJ4xwdKabKpPUR/K5/nM+uF2lju4Y2AxzWmO6tYWqjjO4W 8Zl7vZ2NVMUjOatw5x+aoU1T4lwnnDnu2/P5hR/drdEK+qgMfKW047w2vIPL2WL/pVlh OmDJrQgpuPYstySn1fTB1EaheMEiK59CxM/J/GOrCZAbYr3el2bjqMKQc9fcsH/zXdBA KVxg8c4UG6bgeuvbsWQvfDW1P6vS0rM0Ua1wttHlnNKhOKi6TuxcwaO6JJ7aX/x6YmE3 1rXc6Ph3NkzPKUYkmeE8Az3yKwY1mQIip9YG6aUZpNejONRjoomkr2BkWHQXnPY1eyXm /2yQ== X-Gm-Message-State: APjAAAXIKmmT0hFHWq2qz768pQ4ATQ9+hYh03ylAISYPKC3BI33oOXKv Nc/XOnjQSh3xn8Wp0qePhJc= X-Google-Smtp-Source: APXvYqy0n6S1Lj8myiKSxHCEcfEqaPsT++bQniuhf8JpepIqsAk12irADspqX4dTWQ9iShQkKwveSA== X-Received: by 2002:ac2:4c29:: with SMTP id u9mr933290lfq.100.1561512907742; Tue, 25 Jun 2019 18:35:07 -0700 (PDT) Received: from localhost.localdomain (ppp91-79-162-197.pppoe.mtu-net.ru. [91.79.162.197]) by smtp.gmail.com with ESMTPSA id 199sm2549581ljf.44.2019.06.25.18.35.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Jun 2019 18:35:07 -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 v2 11/17] PM / devfreq: tegra30: Add debug messages Date: Wed, 26 Jun 2019 04:32:45 +0300 Message-Id: <20190626013252.30470-12-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190626013252.30470-1-digetx@gmail.com> References: <20190626013252.30470-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org Add debug messages to know about what's happening in hardware and how driver reacts. Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 35 +++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index 1e704289c129..8ef7ed8d7e10 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -41,6 +41,7 @@ #define ACTMON_DEV_AVG_UPPER_WMARK 0x10 #define ACTMON_DEV_AVG_LOWER_WMARK 0x14 #define ACTMON_DEV_COUNT_WEIGHT 0x18 +#define ACTMON_DEV_COUNT 0x1c #define ACTMON_DEV_AVG_COUNT 0x20 #define ACTMON_DEV_INTR_STATUS 0x24 @@ -276,6 +277,9 @@ static void tegra_actmon_get_lower_upper(struct tegra_devfreq *tegra, unsigned long *lower, unsigned long *upper) { + struct device *ddev = tegra->devfreq->dev.parent; + u32 offset = dev->config->offset; + /* * Memory frequencies are guaranteed to have 1MHz granularity * and thus we need this rounding down to get a proper watermarks @@ -288,6 +292,9 @@ static void tegra_actmon_get_lower_upper(struct tegra_devfreq *tegra, *lower = tegra_actmon_lower_freq(tegra, target_freq); *upper = tegra_actmon_upper_freq(tegra, target_freq); + dev_dbg(ddev, "%03x: target_freq %lu lower freq %lu upper freq %lu\n", + offset, target_freq, *lower, *upper); + *lower /= KHZ; *upper /= KHZ; @@ -367,11 +374,31 @@ static void tegra_devfreq_update_wmark(struct tegra_devfreq *tegra, device_writel(dev, lower + delta, ACTMON_DEV_LOWER_WMARK); } +static void actmon_device_debug(struct tegra_devfreq *tegra, + struct tegra_devfreq_device *dev, + const char *prefix) +{ + dev_dbg(tegra->devfreq->dev.parent, + "%03x: %s: 0x%08x 0x%08x a %u %u %u c %u %u %u b %lu cpu %u\n", + dev->config->offset, prefix, + device_readl(dev, ACTMON_DEV_INTR_STATUS), + device_readl(dev, ACTMON_DEV_CTRL), + device_readl(dev, ACTMON_DEV_AVG_COUNT), + device_readl(dev, ACTMON_DEV_AVG_LOWER_WMARK), + device_readl(dev, ACTMON_DEV_AVG_UPPER_WMARK), + device_readl(dev, ACTMON_DEV_COUNT), + device_readl(dev, ACTMON_DEV_LOWER_WMARK), + device_readl(dev, ACTMON_DEV_UPPER_WMARK), + dev->boost_freq, cpufreq_get(0)); +} + static void actmon_isr_device(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev) { u32 intr_status, dev_ctrl, avg_intr_mask; + actmon_device_debug(tegra, dev, "isr+"); + dev->avg_count = device_readl(dev, ACTMON_DEV_AVG_COUNT); intr_status = device_readl(dev, ACTMON_DEV_INTR_STATUS); dev_ctrl = device_readl(dev, ACTMON_DEV_CTRL); @@ -421,6 +448,8 @@ 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_device_debug(tegra, dev, "isr-"); } static unsigned long actmon_update_target(struct tegra_devfreq *tegra, @@ -710,6 +739,7 @@ static struct devfreq_dev_profile tegra_devfreq_profile = { static int tegra_governor_get_target(struct devfreq *devfreq, unsigned long *freq) { + struct device *ddev = devfreq->dev.parent; struct devfreq_dev_status *stat; struct tegra_devfreq *tegra; struct tegra_devfreq_device *dev; @@ -732,6 +762,11 @@ static int tegra_governor_get_target(struct devfreq *devfreq, dev_target_freq = actmon_update_target(tegra, dev); target_freq = max(target_freq, dev_target_freq); + + dev_dbg(ddev, "%03x: upd: dev_target_freq %lu\n", + dev->config->offset, dev_target_freq); + + actmon_device_debug(tegra, dev, "upd"); } *freq = target_freq * KHZ; From patchwork Wed Jun 26 01:32:46 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1122454 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="AbH4pcNd"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 45YQb65qRMz9sBr for ; Wed, 26 Jun 2019 11:35:46 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726637AbfFZBfL (ORCPT ); Tue, 25 Jun 2019 21:35:11 -0400 Received: from mail-lf1-f66.google.com ([209.85.167.66]:35866 "EHLO mail-lf1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726603AbfFZBfL (ORCPT ); Tue, 25 Jun 2019 21:35:11 -0400 Received: by mail-lf1-f66.google.com with SMTP id q26so373583lfc.3; Tue, 25 Jun 2019 18:35:09 -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=WV5ZDccemhlsje66eKSsM4F/JJGKn8RfQodo1mruSeM=; b=AbH4pcNdyPt06Z0mmSeEmnN8W31BrZk1kgBX8vstDU/ZZq5f2eSFNswN4LjuAMuTAS YYl8x0uc2MQVRVt7zfWUVE4aH32796WquEWOtwTqy0v3H7rIXuMB1p6Z3HM4LBOOXc43 jNW5ziVmnXjFIgmh4q8oL/XL/Zpz+HOuMAA/a7SFcrP/xoQmGS1Wl6ZuH4LhYO3tyakA HBQH9SxWgWTqc8sv6stocy3I3NIbEiFg+4Mk43sZL32bio3KcSSGLXToyXTPzNfPHp0z vzs1zv3Bbo42TGZewmopa1TCSoqeWDTXgYYg/m8e5Pg9vdADuQB8kp6c8cw9RSpWiuo1 jqzg== 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=WV5ZDccemhlsje66eKSsM4F/JJGKn8RfQodo1mruSeM=; b=nCmbx60UWKWoiJusl3IuwZi595PH9A5/ayDQx18BlBH948aMk9QjYAZ61cUCa2zzIT KeVyaPQ4QQbgCUFvnW5yFmxpV+TtcXcZTv+UpyNvH/4PVWxx7rOdAaAz1tZTo6NQfVw2 9sDHrTjxm9HPYAJk/IPUqRASrIA7galeWaOucw8X9ZXlEv4ZD0IcovD7uzi4QZx2AaKh iqg5ic8uNUOdhFNU60PIiTHWN8h6e2C9cmDifGRNczTB/Bt0fhWTTt9/Ikz3Kc8fUBJj u23ubl4WFz9cZLXdfGMHGgRbz/ZReisGOmC+bI2hRw/yiOPY0ChbxNtqDy+KdJ1hyhVc Jzew== X-Gm-Message-State: APjAAAXBVBJv22FTjWc5+wsfxy2de0ZwVv5DF7oj6F+hBBNC8/LY9IZ+ cyrdIC1QWUUAvvdIupv/tEw= X-Google-Smtp-Source: APXvYqz3L26JxFW4sFzJhMVbOMK22ERvHOgsTDgmV/iPSQO3qUBMRetsfZRIkFMvAapV+WjHNw6WFg== X-Received: by 2002:a19:6519:: with SMTP id z25mr921099lfb.73.1561512908645; Tue, 25 Jun 2019 18:35:08 -0700 (PDT) Received: from localhost.localdomain (ppp91-79-162-197.pppoe.mtu-net.ru. [91.79.162.197]) by smtp.gmail.com with ESMTPSA id 199sm2549581ljf.44.2019.06.25.18.35.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Jun 2019 18:35:08 -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 v2 12/17] PM / devfreq: tegra30: Inline all one-line functions Date: Wed, 26 Jun 2019 04:32:46 +0300 Message-Id: <20190626013252.30470-13-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190626013252.30470-1-digetx@gmail.com> References: <20190626013252.30470-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org Depending on a kernel's configuration, a single line functions may not be inlined by compiler (like enabled ftracing for example). Let's inline such functions explicitly for consistency. Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index 8ef7ed8d7e10..8630dca99905 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -181,28 +181,29 @@ static struct tegra_actmon_emc_ratio actmon_emc_ratios[] = { { 250000, 100000 }, }; -static u32 actmon_readl(struct tegra_devfreq *tegra, u32 offset) +static inline u32 actmon_readl(struct tegra_devfreq *tegra, u32 offset) { return readl_relaxed(tegra->regs + offset); } -static void actmon_writel(struct tegra_devfreq *tegra, u32 val, u32 offset) +static inline void actmon_writel(struct tegra_devfreq *tegra, + u32 val, u32 offset) { writel_relaxed(val, tegra->regs + offset); } -static u32 device_readl(struct tegra_devfreq_device *dev, u32 offset) +static inline u32 device_readl(struct tegra_devfreq_device *dev, u32 offset) { return readl_relaxed(dev->regs + offset); } -static void device_writel(struct tegra_devfreq_device *dev, u32 val, - u32 offset) +static inline void device_writel(struct tegra_devfreq_device *dev, + u32 val, u32 offset) { writel_relaxed(val, dev->regs + offset); } -static unsigned long do_percent(unsigned long val, unsigned int pct) +static inline unsigned long do_percent(unsigned long val, unsigned int pct) { return val * pct / 100; } From patchwork Wed Jun 26 01:32:47 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1122453 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="dChPvA+S"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 45YQb61rLvz9sBp for ; Wed, 26 Jun 2019 11:35:46 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726645AbfFZBfM (ORCPT ); Tue, 25 Jun 2019 21:35:12 -0400 Received: from mail-lj1-f195.google.com ([209.85.208.195]:46916 "EHLO mail-lj1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726359AbfFZBfM (ORCPT ); Tue, 25 Jun 2019 21:35:12 -0400 Received: by mail-lj1-f195.google.com with SMTP id v24so387810ljg.13; Tue, 25 Jun 2019 18:35:10 -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=HXsLv96t3D/DFNftwnjnuD35+3kXf4vWE9UyrvgtOGg=; b=dChPvA+SqxAA1Z6Tp9WqN92ZKuIPyYQxRX437Mgt338KGoHrgEIjQIapPDN9u02vBS oJv36SGhjv4dzpfVlVgX2IYlVtT2Kf1UqznKQeRnl4lQ12Nw7rs4skmPvqArAxz/vlzu ilOv5CtaQ/7gT3ZpufDEW4eEArXoK7Fha9EQuf8zoVPkiqtKL+NEIXh6nbRHgt24zILT lMe3zk88UisrhyUXHSiVUY/HWzgLBQEgzTi+NFgQiCqfXfnsA26oXUC3yWLycq2BkHV4 R2Nv8boNWf+ldT2woWKLUrBY5M3+mJjXKRoIsUDmXlTwFFuTHH5csaoDJPP47duMZqZ2 GU9w== 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=HXsLv96t3D/DFNftwnjnuD35+3kXf4vWE9UyrvgtOGg=; b=klcpbdKyLbWzlnLfAzLO4tLkwQRUl2JScnKVjQo4R62Yd8HcarzIvx3ppfRvmrPLtS gBttHqVCPGdV/WVwjMUVahzjKb3fwvT5M/NDFtlLOFxWMgzzGT7pQ+mmoVubCBSMRPTL f2gbKIRlrd7iu5WnhV/tMxPXzc/slJ/w+LQC4R516+8cpm2rV8IQiH1Ub16bCfsEus8o uUyIrB2OF3M50+1tJqMWWC/2A5O3es6Ooxib+bpNYqIZB9xZrnlDvDwTVFBMHG2lbnDF NSEjKyvuJkHQmhylsdP/T2VrMpfGpZJBMgf7AsmMt4mBG8LYzc7IpY1zFyXlNk3xCn6N gbqg== X-Gm-Message-State: APjAAAXO7HFLhLYiDkvbd3P0Wpo1/KQ6R3f+bPhD0XV7qIlc9rHogjtr ye07Nm8n8vnhvCqQkwKixLk= X-Google-Smtp-Source: APXvYqz4ycpcGN8e89gCt9mh7l8m+0WO7cxqOqZhEqw+B21a91lcC1O3TpfY/narbhUKSHMOKLwp4A== X-Received: by 2002:a2e:3a05:: with SMTP id h5mr922887lja.114.1561512909584; Tue, 25 Jun 2019 18:35:09 -0700 (PDT) Received: from localhost.localdomain (ppp91-79-162-197.pppoe.mtu-net.ru. [91.79.162.197]) by smtp.gmail.com with ESMTPSA id 199sm2549581ljf.44.2019.06.25.18.35.08 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Jun 2019 18:35:09 -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 v2 13/17] PM / devfreq: tegra30: Constify structs Date: Wed, 26 Jun 2019 04:32:47 +0300 Message-Id: <20190626013252.30470-14-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190626013252.30470-1-digetx@gmail.com> References: <20190626013252.30470-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org Constify unmodifiable structs for consistency. 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 8630dca99905..d85de0e3dce0 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -106,7 +106,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, @@ -171,7 +171,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, ULONG_MAX }, { 1200000, 750000 }, { 1100000, 600000 }, @@ -210,7 +210,7 @@ static inline unsigned long do_percent(unsigned long val, unsigned int pct) static unsigned long actmon_cpu_to_emc_rate(struct tegra_devfreq *tegra) { - struct tegra_actmon_emc_ratio *ratio = actmon_emc_ratios; + const struct tegra_actmon_emc_ratio *ratio = actmon_emc_ratios; unsigned int cpu_freq = cpufreq_get(0); unsigned int i; From patchwork Wed Jun 26 01:32:48 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1122451 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="HfD0P73K"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 45YQZw5qYmz9sBp for ; Wed, 26 Jun 2019 11:35:36 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726653AbfFZBfN (ORCPT ); Tue, 25 Jun 2019 21:35:13 -0400 Received: from mail-lj1-f176.google.com ([209.85.208.176]:40520 "EHLO mail-lj1-f176.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726628AbfFZBfN (ORCPT ); Tue, 25 Jun 2019 21:35:13 -0400 Received: by mail-lj1-f176.google.com with SMTP id a21so410086ljh.7; Tue, 25 Jun 2019 18:35:11 -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=CGZLSAOSCX2ukpdIKr7yrA/D7uj3ejgsDhB+FZTC0rs=; b=HfD0P73KYrHLhypYu5if3iQFfdcXKuHHkiEZHCj8FNZCtZQceBrpfyVcIzDb1c8PXX C6InukuET6MfAZ34bcU+BTNXdEho+OgmcK9I/GDX4j39KIOAhrhcw8TR09Snd7iJBFqW Z5uYk1clVTbfCwq3QiFCjR4vZQ+k9815r6xDqyb8h0EJysjO8h34qLUJYSfTLQ6pKKPt KCa9IckTGpvE8bZMJNOcA42zHh3hov6h5CNCpki4mqIOCCL3zM7HzoxBTYWrNZWN1weL Fb9mgLbDdJMl7562fzqtZRoD6w9k+uCRkNwQhmmJEeTfKXO5FyXDZj9LzyqRX5TjiUPz PIxg== 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=CGZLSAOSCX2ukpdIKr7yrA/D7uj3ejgsDhB+FZTC0rs=; b=bPXRCDynsd1RNIk+Urhdkn+LhQ2oQr1CNbJXbHvzUo7tOl0+JLOlxSMO44E1VCaEa+ 6E+dVo49DeJmgao3wtrtrXUkwxDcyaEk0OvOOwzh4vFqyYBrHv9xqkktRqcimHuibxKG tLNXjAB24eHjjf/GfSmJf/mC23mCVmjtGWkmtQHm9Li5dOTrKRVsgAOD2ywdFvBRuJLN 1b0fGXaaE7IYgtdTyz3FsuXqNbb1l/zAxWtHd6RZFTk9kthziWOv1qn12vHh7OM3Yyp3 84Mp829jMVHHQw1vnDDUuRJq7eXUWcfdXa/FHK/HgA8vADdirLqNYWm05Li625cxhPpQ vbHw== X-Gm-Message-State: APjAAAUjqLxdAdzbK1RAIhgsgjXfz2Vm9lEG+EyKhhW+TGvSoxLzb2zC scGoIwryHQ8k63Jf91VOZ6s= X-Google-Smtp-Source: APXvYqxyQMkkvB0wQdu53o/X1w6Hh7JnOzM8e2r3q1Heim80uTnr8wdNnu8b8q/BDoiFrgm5VscYdQ== X-Received: by 2002:a2e:81c4:: with SMTP id s4mr879268ljg.182.1561512910494; Tue, 25 Jun 2019 18:35:10 -0700 (PDT) Received: from localhost.localdomain (ppp91-79-162-197.pppoe.mtu-net.ru. [91.79.162.197]) by smtp.gmail.com with ESMTPSA id 199sm2549581ljf.44.2019.06.25.18.35.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Jun 2019 18:35:10 -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 v2 14/17] PM / devfreq: tegra30: Ensure that target freq won't overflow Date: Wed, 26 Jun 2019 04:32:48 +0300 Message-Id: <20190626013252.30470-15-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190626013252.30470-1-digetx@gmail.com> References: <20190626013252.30470-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org Potentially very high boosting could cause an integer overflow for a highly clocked memory after conversion to MHz. Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index d85de0e3dce0..1dcc2d2fa9e0 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -458,6 +458,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 = min(target_freq, ULONG_MAX / KHZ); target_freq = tegra_actmon_account_cpu_freq(tegra, dev, target_freq); return target_freq; From patchwork Wed Jun 26 01:32:49 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1122452 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="RMh7VrO3"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 45YQb55TCSz9s9h for ; Wed, 26 Jun 2019 11:35:45 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726420AbfFZBfg (ORCPT ); Tue, 25 Jun 2019 21:35:36 -0400 Received: from mail-lj1-f196.google.com ([209.85.208.196]:42823 "EHLO mail-lj1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726640AbfFZBfN (ORCPT ); Tue, 25 Jun 2019 21:35:13 -0400 Received: by mail-lj1-f196.google.com with SMTP id t28so402222lje.9; Tue, 25 Jun 2019 18:35:12 -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=lHcA7DAn0vBlxU0r5wyvgS3+aE/PnlBNnqu4CBrs4zA=; b=RMh7VrO3Kb7bQZ6kh7oBcL397794Z/6zkMtmI2SjXX8lA5opCe4EyZhD3Up9+OguWc bfY7oLyopyRJOKS0oQmzDjo4ay6IfbcdCU9zngTO3EelSpUTor9GpG0GeQ/OqTCTCsOe eDlh+RJrvtpDGGxXmXT35r8BChzIQEkdTPI0ZikPykFzTNV0jLBeLw2qsl1PoLtFUB7w oukqtLkVFdSucZdRhBIcTzq56WauLqlGV6u1U9DbTnMq/yZg8+0Bg9dnc4BROA0FZ17B xzF+wxKl4FmI3ui2nqQ9g706J2iuUyqlgvJZOHMh5DqzHo5e9B5aV3YFnF2kTB80j7VB lsRg== 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=lHcA7DAn0vBlxU0r5wyvgS3+aE/PnlBNnqu4CBrs4zA=; b=GdnAuOdFpWfQ7oEhZCynZCvvO2h3qtl/Q2eY/N49pD5UXN7q9cxi6Wf4pZ2nFjf26S 2pKwrq/rQeDsbIZQvI3kzlzbJ21/o3IhDWc2eZmdH3SNriscCzs0arkpT1NsBhQ92j1k CQA3v1ddeMij0/Ci5ZbfKYM7lUsJmunDxqBOae+L0LM04vkNdS8J4Ww0L5UJYaus+6ip 5x2NiZ1HlIllSv3mvz++x/b9/S7d19HXThunWCcZloUid8ikSkE58dK/X1Q95HnGh0WH ankJpaJ1Ualzr5mcPDhyobpixC2KWGr02Bpv4n3yFGmfifw9fl4kVgPe7lZJfuMnFZvm DpCA== X-Gm-Message-State: APjAAAU+HAvJfnjrw3Lv2G9QLRk0Be2efsbT7nhwbcrIOaOCZMFAk8NS kTE/nqBYwI8gWz3nrZgqlJY= X-Google-Smtp-Source: APXvYqxbvr44HSxwBwgJXXdwqOJJW2psb8uCApxVdKSNKo3u64j9dYhUoArriWOhmNa3KxJwMaP7rA== X-Received: by 2002:a2e:730d:: with SMTP id o13mr838821ljc.81.1561512911446; Tue, 25 Jun 2019 18:35:11 -0700 (PDT) Received: from localhost.localdomain (ppp91-79-162-197.pppoe.mtu-net.ru. [91.79.162.197]) by smtp.gmail.com with ESMTPSA id 199sm2549581ljf.44.2019.06.25.18.35.10 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Jun 2019 18:35:10 -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 v2 15/17] PM / devfreq: tegra30: Fix integer overflow on CPU's freq max out Date: Wed, 26 Jun 2019 04:32:49 +0300 Message-Id: <20190626013252.30470-16-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190626013252.30470-1-digetx@gmail.com> References: <20190626013252.30470-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org 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. 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 1dcc2d2fa9e0..c03135000af7 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -172,7 +172,7 @@ struct tegra_actmon_emc_ratio { }; static const struct tegra_actmon_emc_ratio actmon_emc_ratios[] = { - { 1400000, ULONG_MAX }, + { 1400000, ULONG_MAX / KHZ }, { 1200000, 750000 }, { 1100000, 600000 }, { 1000000, 500000 }, From patchwork Wed Jun 26 01:32:50 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1122449 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="I0UN7PdN"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 45YQZZ23B0z9s5c for ; Wed, 26 Jun 2019 11:35:18 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726666AbfFZBfR (ORCPT ); Tue, 25 Jun 2019 21:35:17 -0400 Received: from mail-lf1-f67.google.com ([209.85.167.67]:40245 "EHLO mail-lf1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726650AbfFZBfP (ORCPT ); Tue, 25 Jun 2019 21:35:15 -0400 Received: by mail-lf1-f67.google.com with SMTP id a9so359090lff.7; Tue, 25 Jun 2019 18:35:13 -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=rqswAbjX+pKJ8n0aSqwpQRZfGBqsAS4kf0xi4kuYCCU=; b=I0UN7PdNR7xZg3kpKM/QWcexYIbPo5Gn5/Ouf2QbaYZ49Ff3Q4LHQQGDwqZnuk2yBk l0W02HfF0B/pR36acfDn+6cBl3YYZQMiut033xIJZU+5g7dZ6ekqiBRYIz/g8Q+1ix0q oYo0w9NbZRWQjxiBaPn5vC/IYUhJNTFfnjM6fcC/fVlK909VPF96Oja4R/I9dNcwyVi3 uRtMGkei9Ah7mQ+H93z9/3ymrmcEMIDqZItk+N5AslMzYb77OM/b186e1pdl9IOQN0Wc juQjn9vxNEY5Thp9fQTWt6npjC/MNSXPiDOFNG76g9oMblVlc7iKPoM32kQ/+uP9Neog Oh2Q== 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=rqswAbjX+pKJ8n0aSqwpQRZfGBqsAS4kf0xi4kuYCCU=; b=qd7Tal+lrro3ZkObjPVKX0aMC8Ir/BLhCBm6WqYJ7SKtPOnZQFpJjlU35/GhHfipuk ZrXHOS+fPZbs/dm79VQLOCc+MLriM+/eNuKm+fE+KNVS0vjeC++ivEci5ayb9ydkPFsh 4tnGh2yoyoB+j5BP4OiBO58gue7rYBtJe4uzB4T/u/bfAYtyaN1+y0K3mqkyIMk98hAC FepuAunv9FXvDuRZ8QA3lY+aEy8us8/Jh5Hu0CwlPu/qJDagncP7h2ctTUuZrxMM7qbS COVxBnc6x9JlcJIJqt3tFw6irMOS4hA6chqieOWqcSNz0UeffkoPBEcc4z2zJ6hTxPUR B6tw== X-Gm-Message-State: APjAAAWjt/M9DD0Q/ujfbhAWtzj/lwgayG/N2D1Z4KVB9iWYD7gAIyV6 HE10U9UcGNhe/klsqcno9fo= X-Google-Smtp-Source: APXvYqzAXHT1ud4m03K/2xs2tzTOwIRc0eJrl9Paf6rO0zl4d8n73AIwCbwElm2xwPJFEQoCwKe2Fw== X-Received: by 2002:a19:f20d:: with SMTP id q13mr917258lfh.65.1561512912443; Tue, 25 Jun 2019 18:35:12 -0700 (PDT) Received: from localhost.localdomain (ppp91-79-162-197.pppoe.mtu-net.ru. [91.79.162.197]) by smtp.gmail.com with ESMTPSA id 199sm2549581ljf.44.2019.06.25.18.35.11 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Jun 2019 18:35:11 -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 v2 16/17] PM / devfreq: tegra30: Use kHz units uniformly in the code Date: Wed, 26 Jun 2019 04:32:50 +0300 Message-Id: <20190626013252.30470-17-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190626013252.30470-1-digetx@gmail.com> References: <20190626013252.30470-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org 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 | 78 +++++++++++++++++-------------- 1 file changed, 43 insertions(+), 35 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index c03135000af7..778c5a940256 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -72,6 +72,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 @@ -124,7 +126,7 @@ static const struct tegra_devfreq_device_config actmon_device_configs[] = { .boost_down_coeff = 90, .boost_up_threshold = 27, .boost_down_threshold = 10, - .avg_dependency_threshold = 50000, + .avg_dependency_threshold = 50000 / ACTMON_SAMPLING_PERIOD, }, }; @@ -137,8 +139,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 @@ -172,7 +177,7 @@ struct tegra_actmon_emc_ratio { }; static const struct tegra_actmon_emc_ratio actmon_emc_ratios[] = { - { 1400000, ULONG_MAX / KHZ }, + { 1400000, KHZ_MAX }, { 1200000, 750000 }, { 1100000, 600000 }, { 1000000, 500000 }, @@ -234,7 +239,7 @@ 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) { + dev->config->avg_dependency_threshold < dev->avg_freq) { static_cpu_emc_freq = actmon_cpu_to_emc_rate(tegra); target_freq = max(target_freq, static_cpu_emc_freq); } @@ -265,7 +270,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); @@ -287,7 +292,7 @@ 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); @@ -296,9 +301,6 @@ static void tegra_actmon_get_lower_upper(struct tegra_devfreq *tegra, dev_dbg(ddev, "%03x: target_freq %lu lower freq %lu upper freq %lu\n", offset, target_freq, *lower, *upper); - *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 @@ -314,22 +316,23 @@ 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_threshold, lower, upper; - 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); + + avg_threshold = dev->config->avg_dependency_threshold; + avg_threshold = avg_threshold * ACTMON_SAMPLING_PERIOD; /* * 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; + if (lower < avg_threshold && upper > avg_threshold) { + if (dev->avg_freq < dev->config->avg_dependency_threshold) + upper = avg_threshold; else - lower = dev->config->avg_dependency_threshold; + lower = avg_threshold; } device_writel(dev, lower, ACTMON_DEV_AVG_LOWER_WMARK); @@ -368,8 +371,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); @@ -396,14 +398,16 @@ static void actmon_device_debug(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; actmon_device_debug(tegra, dev, "isr+"); - 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; @@ -457,8 +461,7 @@ static unsigned long actmon_update_target(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev) { unsigned long target_freq; - target_freq = dev->avg_count / ACTMON_SAMPLING_PERIOD + dev->boost_freq; - target_freq = min(target_freq, ULONG_MAX / KHZ); + target_freq = min(dev->avg_freq + dev->boost_freq, KHZ_MAX); target_freq = tegra_actmon_account_cpu_freq(tegra, dev, target_freq); return target_freq; @@ -495,6 +498,7 @@ static int tegra_actmon_clk_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) @@ -502,6 +506,8 @@ static int tegra_actmon_clk_notify_cb(struct notifier_block *nb, tegra = container_of(nb, struct tegra_devfreq, clk_rate_change_nb); + freq = data->new_rate / KHZ; + /* * EMC rate could change due to three reasons: * @@ -523,7 +529,7 @@ static int tegra_actmon_clk_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; @@ -563,17 +569,17 @@ static int tegra_actmon_cpu_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; /* we don't want boosting on restart */ dev->boost_freq = 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); @@ -685,7 +691,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; @@ -708,7 +714,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; @@ -725,7 +731,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); @@ -771,7 +777,7 @@ static int tegra_governor_get_target(struct devfreq *devfreq, actmon_device_debug(tegra, dev, "upd"); } - *freq = target_freq * KHZ; + *freq = target_freq; return 0; } @@ -907,7 +913,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; @@ -927,6 +933,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(tegra->devfreq)) { From patchwork Wed Jun 26 01:32:51 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1122450 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="VKglz/FD"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 45YQZw0Lkpz9s5c for ; Wed, 26 Jun 2019 11:35:36 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726664AbfFZBfQ (ORCPT ); Tue, 25 Jun 2019 21:35:16 -0400 Received: from mail-lj1-f194.google.com ([209.85.208.194]:42826 "EHLO mail-lj1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726307AbfFZBfP (ORCPT ); Tue, 25 Jun 2019 21:35:15 -0400 Received: by mail-lj1-f194.google.com with SMTP id t28so402285lje.9; Tue, 25 Jun 2019 18:35:14 -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=BUdUWTVBTb79ShDTghVClnAglKKtZu5mKsirPQrlfLI=; b=VKglz/FDbn1OhUHTaYNudawoF8YKq/c/gpdT8/OIlPIb5idbxCTUITBR0OV9gpGI7n yrLQist4pZHwVpnTpTo/R+9vGqVAWDtux8ac7XMJvn9xCLwd5Zqj82U2Yj0NDSeWa2KQ of9Vg+5g+Z613tuWgXkbH1OXXCfVxUOt41dxvfxU7ostcdmX5oXTt21zLDDBhibCUwi4 qlk7O0+mcwtHGbVzTypVsfgYDWJWMUtY5k0r2clw8MV4DRynCxsrVNO6YX1T4EB8WZD+ 4Aj0WPuG3XCW4KCVFE8JAPOM4kbWO9A4hOctSt4BZp6/R/lIK88x6pZ17RjBduzer2in +cqw== 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=BUdUWTVBTb79ShDTghVClnAglKKtZu5mKsirPQrlfLI=; b=SXAV6gsMiMhzmv7J2SCte1IcFSabhJc/vx30iu4yFZkOFeJM9La8qB6RyP2OYXeYSr T4r+oIGCFEKerPAz2EyNHW1x0xH5ZBhdnrgbnr+M9ANlnLVOQO/5N9+PINcx4zIxe/8M rri53OKq1giHuGX6GCTqbkoRCG+vfGJ6fN45/W7Ij7fOYY3bEqzuQw2I30kKwJjLGKox /F45Z4qBeJlegIt8aTU5KmIrxHxfpP3vgo3kPyPEyGYYmMdFyQksZYhMhs1SdbNChIDl CdG4ct9wZGOiYoTpnMZ0vv1r5sEv3IObTMoXs+uGdtTrxmw1zFPg0zGixy4kNbOpTkcs KGIw== X-Gm-Message-State: APjAAAUDXnnUWHIw7v9e807t/2FBqxDNOi6Kp1NKI/wzKNL0TY0ZyVy6 vJcmUrWbvQfgTJGELQt/V1XmD/Qk X-Google-Smtp-Source: APXvYqwznj8GWn1ttqhcfxa2m5bjBKiHSvHOjswdfkXI+wmI3vCRs8fpWZxljazmyQHGTpu7iWyaMw== X-Received: by 2002:a2e:63cd:: with SMTP id s74mr900911lje.164.1561512913370; Tue, 25 Jun 2019 18:35:13 -0700 (PDT) Received: from localhost.localdomain (ppp91-79-162-197.pppoe.mtu-net.ru. [91.79.162.197]) by smtp.gmail.com with ESMTPSA id 199sm2549581ljf.44.2019.06.25.18.35.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Jun 2019 18:35:12 -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 v2 17/17] PM / devfreq: tegra20/30: Add Dmitry as a maintainer Date: Wed, 26 Jun 2019 04:32:51 +0300 Message-Id: <20190626013252.30470-18-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190626013252.30470-1-digetx@gmail.com> References: <20190626013252.30470-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org I was contributing to the NVIDIA Tegra30+ devfreq drivers recently and want to help keep them working and evolving in the future. Signed-off-by: Dmitry Osipenko --- MAINTAINERS | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 792d2d927712..bfd827417a27 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -10250,6 +10250,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