From patchwork Sun Aug 11 21:22:57 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1145431 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="BiQzBctp"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 466BqD4g78z9sML for ; Mon, 12 Aug 2019 07:26:00 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726307AbfHKVYg (ORCPT ); Sun, 11 Aug 2019 17:24:36 -0400 Received: from mail-lf1-f65.google.com ([209.85.167.65]:35748 "EHLO mail-lf1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726011AbfHKVYg (ORCPT ); Sun, 11 Aug 2019 17:24:36 -0400 Received: by mail-lf1-f65.google.com with SMTP id p197so72932572lfa.2; Sun, 11 Aug 2019 14:24:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=vAb/Wbf6jN1XW90qv7LwGWyr9ST9lsuKJ6ZQmhSvlSc=; b=BiQzBctpmmIl+DFhnqskDUHKskSo70mqGg1OwBP/RXn4hVZKsZ4ALnHKRktswCxBnb lKoOsK3+O7kJqldO3u8NO9YN+jp5sbOQlOEp71WoBhehpMq1q7hMe20oGA1BITIuWvsh +rso/niw88+7Jo6HLGesqBPeg98rIoSB/6Fc+c50l9iAukOSt6rSI234+dxJ5QXmJ7Of c7cx2dWCff+hDss7roSvWQ4aQISVEaZ5Pketk99LR9aEyebQ1nCoRIUkReJKYJl6gn2X 81HU+485Z6MA+lglnnjKJo3thoklFZHNx2OrkP8cXhdftd3sqgi+sVHCqYgBEuzAetLu yTCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=vAb/Wbf6jN1XW90qv7LwGWyr9ST9lsuKJ6ZQmhSvlSc=; b=D9aHh4i/3VJ3/kAwtJh23s+tNkiEw43E9c+WkxHDacVlD8fzFWySW8E0G1t1ApaYhr b/16rgWHDKIDKBDmuXopvJSASKjcD6GR+BktDdcrWLBTcQsR/SdhXdvqo0pDCS+ACtyp Il4YO8/JVFOuwW05lVSA0TqbZ1YI7TVDuvvfIcEdg/BwK44rF1zUTANgZxrsaNcNP60i f6Kjfw5Z4j+v2JRRi1mJji9ruRcQoAKBi3AjWUxZOlUhAHEUwnyDrwE4LJ58P9EwZ4zn K0JMrvxtZN/mQWhjjT/udfeEhIx7kj2svDlY9HoiYYVUvx8E9KIYXl0nT4Le3unyAAX5 o+1A== X-Gm-Message-State: APjAAAXPqBlzFuiiuTISvrMqfnbF34+ZIr7BSHjjsKzgAKTlZ2g9fReb LIQYJBL4Cf7+N5TlWIoCp+8= X-Google-Smtp-Source: APXvYqwPPfBbW+6UiJYYLhkZT+EkEJxDbuPYn5DSBVbyEmbRNgL/5ZWcnD59iJknxOczk2VBKsm3cQ== X-Received: by 2002:ac2:5492:: with SMTP id t18mr5694040lfk.41.1565558674126; Sun, 11 Aug 2019 14:24:34 -0700 (PDT) Received: from localhost.localdomain ([94.29.34.218]) by smtp.gmail.com with ESMTPSA id f1sm20470806ljk.86.2019.08.11.14.24.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Aug 2019 14:24:33 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v6 01/19] PM / devfreq: tegra30: Change irq type to unsigned int Date: Mon, 12 Aug 2019 00:22:57 +0300 Message-Id: <20190811212315.12689-2-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190811212315.12689-1-digetx@gmail.com> References: <20190811212315.12689-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 Reviewed-by: Chanwoo Choi Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index a6ba75f4106d..a27300f40b0b 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -160,7 +160,7 @@ struct tegra_devfreq { struct tegra_devfreq_device devices[ARRAY_SIZE(actmon_device_configs)]; - int irq; + unsigned int irq; }; struct tegra_actmon_emc_ratio { @@ -618,12 +618,12 @@ static int tegra_devfreq_probe(struct platform_device *pdev) return PTR_ERR(tegra->emc_clock); } - tegra->irq = platform_get_irq(pdev, 0); - if (tegra->irq < 0) { - err = tegra->irq; + err = platform_get_irq(pdev, 0); + if (err < 0) { dev_err(&pdev->dev, "Failed to get IRQ: %d\n", err); return err; } + tegra->irq = err; reset_control_assert(tegra->reset); From patchwork Sun Aug 11 21:22:58 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1145430 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="Y8BTGfCG"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 466Bq700lDz9sNm for ; Mon, 12 Aug 2019 07:25:54 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726598AbfHKVYl (ORCPT ); Sun, 11 Aug 2019 17:24:41 -0400 Received: from mail-lf1-f67.google.com ([209.85.167.67]:40545 "EHLO mail-lf1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726053AbfHKVYh (ORCPT ); Sun, 11 Aug 2019 17:24:37 -0400 Received: by mail-lf1-f67.google.com with SMTP id b17so72980648lff.7; Sun, 11 Aug 2019 14:24:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Ox12S6Tw4A+nuZKMeS2Wc28MQmpMbXQ3Ba/CygAYf44=; b=Y8BTGfCGniq4bJ0CqppedXBe5j5ZegDHPgvitHCeO2ltxAHAc0aexmlIOYylWwQxQA PYteCTtF+VBNnQgTnn2tioReEaHOzGU42BZAtTdn/MY/YivKrnwPPdmE/YeDCppqbjr7 dCiMduLU4wLfTGWUsVQuOv5kBIXqAJ1f4mqdoSdfa9ydD5n70hN1+fq1WQi51GFjJC2g u36Px93VW9V4axlTP6wcpQUa8LNQhomxOt45APgoPubNGJde+fj2WJmRJ/iimh34a+zf MkcXTDOItYFtuHngOX7vASQqt+7EfN2caD5hUKBQAHOC1FR1SlvgKZsaC/bduv1jfT6u f6rA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Ox12S6Tw4A+nuZKMeS2Wc28MQmpMbXQ3Ba/CygAYf44=; b=Qkl0f0oT4rgLErB2MBWNuHcgckkSsMgHwPXx1adtqkhc/g+sTkzzTQmxZ3HSBCVukp 2T8FLTV7oW4/4KyZYGbPTRGCXLN8WKKAp+DRKsLsLBzP2A13WUxbAymFrX9IE4nHb33I pz1EsAEomMVXoc7hA+RQhDRcIJEIgPerLZRKxYDqTtG2w009QUBmTFU+Mk21nadvBoa0 NxbxPxnmI8aBYUuL/7+oJkIjkLMuzmT8kt9dbagSaL++u4YmqlHPyppXNhoFJEsxnBFZ 5hjWVWhsPg7cJY+8w2JAY6+weDROWWMBzfGraPXihl+M52hdia50Y5K1Kxr5SSrIgMUR iqPw== X-Gm-Message-State: APjAAAWiS5qTSFaoEK+NN7hYj0CFcKfuMxszGNunZnF9HehViXlWNbgX cMBBJcee61X1scQuUDKTrAM= X-Google-Smtp-Source: APXvYqxYm1jADNAExQVyud8MIdtnf2FQEfrx6aLn1FkM5FMS+sO9pAHQE157Mq03gXG1po6oozVtHQ== X-Received: by 2002:a19:6753:: with SMTP id e19mr18200363lfj.187.1565558675021; Sun, 11 Aug 2019 14:24:35 -0700 (PDT) Received: from localhost.localdomain ([94.29.34.218]) by smtp.gmail.com with ESMTPSA id f1sm20470806ljk.86.2019.08.11.14.24.34 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Aug 2019 14:24:34 -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 v6 02/19] PM / devfreq: tegra30: Keep interrupt disabled while governor is stopped Date: Mon, 12 Aug 2019 00:22:58 +0300 Message-Id: <20190811212315.12689-3-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190811212315.12689-1-digetx@gmail.com> References: <20190811212315.12689-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 Reviewed-by: Chanwoo Choi --- drivers/devfreq/tegra30-devfreq.c | 47 ++++++++++++++++--------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index a27300f40b0b..8be6a33beb9c 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -416,8 +417,6 @@ static void tegra_actmon_start(struct tegra_devfreq *tegra) { unsigned int i; - disable_irq(tegra->irq); - actmon_writel(tegra, ACTMON_SAMPLING_PERIOD - 1, ACTMON_GLB_PERIOD_CTRL); @@ -442,8 +441,6 @@ static void tegra_actmon_stop(struct tegra_devfreq *tegra) } actmon_write_barrier(tegra); - - enable_irq(tegra->irq); } static int tegra_devfreq_target(struct device *dev, unsigned long *freq, @@ -552,6 +549,12 @@ static int tegra_governor_event_handler(struct devfreq *devfreq, { struct tegra_devfreq *tegra = dev_get_drvdata(devfreq->dev.parent); + /* + * Couple device with the governor early as it is needed at + * the moment of governor's start (used by ISR). + */ + tegra->devfreq = devfreq; + switch (event) { case DEVFREQ_GOV_START: devfreq_monitor_start(devfreq); @@ -586,10 +589,11 @@ static struct devfreq_governor tegra_devfreq_governor = { static int tegra_devfreq_probe(struct platform_device *pdev) { - struct tegra_devfreq *tegra; struct tegra_devfreq_device *dev; - unsigned int i; + struct tegra_devfreq *tegra; + struct devfreq *devfreq; unsigned long rate; + unsigned int i; int err; tegra = devm_kzalloc(&pdev->dev, sizeof(*tegra), GFP_KERNEL); @@ -625,6 +629,16 @@ static int tegra_devfreq_probe(struct platform_device *pdev) } tegra->irq = err; + irq_set_status_flags(tegra->irq, IRQ_NOAUTOEN); + + err = devm_request_threaded_irq(&pdev->dev, tegra->irq, NULL, + actmon_thread_isr, IRQF_ONESHOT, + "tegra-devfreq", tegra); + if (err) { + dev_err(&pdev->dev, "Interrupt request failed: %d\n", err); + return err; + } + reset_control_assert(tegra->reset); err = clk_prepare_enable(tegra->clock); @@ -672,28 +686,15 @@ static int tegra_devfreq_probe(struct platform_device *pdev) } tegra_devfreq_profile.initial_freq = clk_get_rate(tegra->emc_clock); - tegra->devfreq = devfreq_add_device(&pdev->dev, - &tegra_devfreq_profile, - "tegra_actmon", - NULL); - if (IS_ERR(tegra->devfreq)) { - err = PTR_ERR(tegra->devfreq); + devfreq = devfreq_add_device(&pdev->dev, &tegra_devfreq_profile, + "tegra_actmon", NULL); + if (IS_ERR(devfreq)) { + err = PTR_ERR(devfreq); goto remove_governor; } - err = devm_request_threaded_irq(&pdev->dev, tegra->irq, NULL, - actmon_thread_isr, IRQF_ONESHOT, - "tegra-devfreq", tegra); - if (err) { - dev_err(&pdev->dev, "Interrupt request failed: %d\n", err); - goto remove_devfreq; - } - return 0; -remove_devfreq: - devfreq_remove_device(tegra->devfreq); - remove_governor: devfreq_remove_governor(&tegra_devfreq_governor); From patchwork Sun Aug 11 21:22:59 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1145414 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="JUv9lW5n"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 466Bnk2CKRz9sNk for ; Mon, 12 Aug 2019 07:24:42 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726581AbfHKVYk (ORCPT ); Sun, 11 Aug 2019 17:24:40 -0400 Received: from mail-lf1-f68.google.com ([209.85.167.68]:46095 "EHLO mail-lf1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726011AbfHKVYj (ORCPT ); Sun, 11 Aug 2019 17:24:39 -0400 Received: by mail-lf1-f68.google.com with SMTP id n19so4570929lfe.13; Sun, 11 Aug 2019 14:24:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=1OA59L/PDO/fIoCl0NQYE6ljbPRlOkug9V9TGpbxlIc=; b=JUv9lW5njksmaD8ch2/SJNVcVcX8NtbJeEzG840Ig1el7pRWb+UlPcVvtj6DRQgp/O WXgKkDtg6sBpi+hwcw0u3FiIvTleXHAuSb8HHWiITJnAOLfCMv2RE91O1mMED8w1xYcC GB6sXqHgsrCmj6FR4pKffnLTDuU7oqvwRHiaaFmv/Klm0KAUB4AEgrrExxPrjaSCfu2+ 5qGOzNCTtFOrS/WHvuP0VzsB3vwfKT2xHfsZSTPq5l81vGGsq2F0XONuvJax0wpfgUg5 Dk79MITunH879dnyGzwvVtAwEooyIZdtLu24DgzKdrVMF/ueEJI9yIv8n2vKmqQf9wBT T9Gw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=1OA59L/PDO/fIoCl0NQYE6ljbPRlOkug9V9TGpbxlIc=; b=AC40eqop6Tekm4ZKovsS1Inn47zldps5nC2Bu7tcuxnX2I2gyjcrJgYO17q/l3VnkB tcIHadDtya/y8Q5sV+wgJZY5TvUchRldLdNdR2LFVIje1qMBn9GbNNIy3fSbwQMMNMCp 1a/WxX/Mn976vez1OvPV6PsCnqsaPq9ASxW1UURHqPwbVZp3+HOJle2GBVNLYqK8KL+w TU50vsm0aAFIF+l9nXZjaos3aCofAZtI1FGw6w1QycvNhs08OmNbe1QF25p+BbFO2zmI nfmF2pLvCx/rRSukNV2gWjJ5T33gtCKitg7y4DH9r0dWRCHuJ6curerjcrPsbImTQXiP TRvg== X-Gm-Message-State: APjAAAVX30FnIlbIUJ9kONZ7LHE+QO/JS1cRMl1i31KFHNFKzvUXA2Sm GzM12pzZiITLfiHgi+Ph7caL7ps6 X-Google-Smtp-Source: APXvYqxjNpeeSLWI0UiOnnxT6EHSg5NjwRTzCnnRQgyc+Pe1MOP/1PoEPTX5sVZQceEoiX5Rx2OgDQ== X-Received: by 2002:ac2:42cc:: with SMTP id n12mr18145019lfl.47.1565558676793; Sun, 11 Aug 2019 14:24:36 -0700 (PDT) Received: from localhost.localdomain ([94.29.34.218]) by smtp.gmail.com with ESMTPSA id f1sm20470806ljk.86.2019.08.11.14.24.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Aug 2019 14:24:35 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v6 03/19] PM / devfreq: tegra30: Handle possible round-rate error Date: Mon, 12 Aug 2019 00:22:59 +0300 Message-Id: <20190811212315.12689-4-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190811212315.12689-1-digetx@gmail.com> References: <20190811212315.12689-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 Reviewed-by: Chanwoo Choi --- drivers/devfreq/tegra30-devfreq.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index 8be6a33beb9c..bfee9d43de1e 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -592,8 +592,8 @@ static int tegra_devfreq_probe(struct platform_device *pdev) struct tegra_devfreq_device *dev; struct tegra_devfreq *tegra; struct devfreq *devfreq; - unsigned long rate; unsigned int i; + long rate; int err; tegra = devm_kzalloc(&pdev->dev, sizeof(*tegra), GFP_KERNEL); @@ -650,8 +650,14 @@ static int tegra_devfreq_probe(struct platform_device *pdev) reset_control_deassert(tegra->reset); - tegra->max_freq = clk_round_rate(tegra->emc_clock, ULONG_MAX) / KHZ; + rate = clk_round_rate(tegra->emc_clock, ULONG_MAX); + if (rate < 0) { + dev_err(&pdev->dev, "Failed to round clock rate: %ld\n", rate); + return rate; + } + tegra->cur_freq = clk_get_rate(tegra->emc_clock) / KHZ; + tegra->max_freq = rate / KHZ; for (i = 0; i < ARRAY_SIZE(actmon_device_configs); i++) { dev = tegra->devices + i; @@ -662,6 +668,13 @@ static int tegra_devfreq_probe(struct platform_device *pdev) for (rate = 0; rate <= tegra->max_freq * KHZ; rate++) { rate = clk_round_rate(tegra->emc_clock, rate); + if (rate < 0) { + dev_err(&pdev->dev, + "Failed to round clock rate: %ld\n", rate); + err = rate; + goto remove_opps; + } + err = dev_pm_opp_add(&pdev->dev, rate, 0); if (err) { dev_err(&pdev->dev, "Failed to add OPP: %d\n", err); From patchwork Sun Aug 11 21:23:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1145413 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="JsbeilFh"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 466Bnj5m87z9sNC for ; Mon, 12 Aug 2019 07:24:41 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726571AbfHKVYk (ORCPT ); Sun, 11 Aug 2019 17:24:40 -0400 Received: from mail-lf1-f68.google.com ([209.85.167.68]:35752 "EHLO mail-lf1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726556AbfHKVYj (ORCPT ); Sun, 11 Aug 2019 17:24:39 -0400 Received: by mail-lf1-f68.google.com with SMTP id p197so72932614lfa.2; Sun, 11 Aug 2019 14:24:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=bdIejvgC5kaa3wn/Z/zklRDPf5qDMoTs2AWg86KAKyQ=; b=JsbeilFh064YudHZNhzW9vVIdbpx9qansY2Bq3s4vLP+pGg5hJyEf6KJCqLfRE3/Nk A4AdH1EgJvm1GbQ6wkpA/DXOZoQQSEHtEy01mJQSxYC6kwULizV8a7ZDkXdQ8VFPxU86 3MXGgj2V2Bv+0ZpVZ5Vyp5P0xlvKqfuq+4czREsmdf6f/ZaCN/llezpAQ9GKRGgldcGj VaKV/lYIFDbkpBzocqzWm9joY8z+bO7Tx/1FIHkco8y8UmjqD/W8gVJwAU91B1UmyOyb U+jendFhxmgbKLYWzAMBnVgligEZvgfgLgKV0DBoAtpoLgVAhM8gavEuAOqs6GfD2kBD MiIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=bdIejvgC5kaa3wn/Z/zklRDPf5qDMoTs2AWg86KAKyQ=; b=MN5Bj4Ljn+Rw+jCH+rTvMvCGy9sSxaLzvmLMLY0U4n0Y/OCUfAB35wli75f70iwNR7 Hl8gkuLNFtTPOLCJ4Q+MnNj7oRoqzB/dBOgavcPDERqfwlc+ypLtKdxORAeJUKYEQ+Q6 795L7R0lY59UlgvjJ8Ua/YZd1BzmK0kMTlUZoCtryFqSeBYjDLB+3hIa3i+exrM/Qp9/ 2j4dOD16Ef6/Aeo4i3jg6A8i2tMa1RFsK9RY8ocxGwvBOCThpMaiSL1drV6GbiIhlMC+ M90aMUPKz4q+GeftrgvHdNCmKHN4BLWL2GmorLKJj1tRgseP6XQWcPHbAzrQhi/gv7Fn GNZw== X-Gm-Message-State: APjAAAVoz/ZR+P2XDoTkYdLvSfnwEwzFSp/D+YGsMdg5xKBJJxRMNCnO bjM0ERl82r9xNB//a5j3TXs= X-Google-Smtp-Source: APXvYqws9Pr8A3WN64dmdxHD+coa1H/LB/wrGZOVjEKesT82UJlWeU3RKD9qOFnzg2VLBJADWphvGg== X-Received: by 2002:ac2:546c:: with SMTP id e12mr9902736lfn.133.1565558677699; Sun, 11 Aug 2019 14:24:37 -0700 (PDT) Received: from localhost.localdomain ([94.29.34.218]) by smtp.gmail.com with ESMTPSA id f1sm20470806ljk.86.2019.08.11.14.24.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Aug 2019 14:24:37 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v6 04/19] PM / devfreq: tegra30: Drop write-barrier Date: Mon, 12 Aug 2019 00:23:00 +0300 Message-Id: <20190811212315.12689-5-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190811212315.12689-1-digetx@gmail.com> References: <20190811212315.12689-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. Reviewed-by: Chanwoo Choi Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index bfee9d43de1e..ee14bf534c0d 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -230,12 +230,6 @@ static void tegra_devfreq_update_wmark(struct tegra_devfreq *tegra, ACTMON_DEV_LOWER_WMARK); } -static void actmon_write_barrier(struct tegra_devfreq *tegra) -{ - /* ensure the update has reached the ACTMON */ - readl(tegra->regs + ACTMON_GLB_STATUS); -} - static void actmon_isr_device(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev) { @@ -287,8 +281,6 @@ static void actmon_isr_device(struct tegra_devfreq *tegra, device_writel(dev, dev_ctrl, ACTMON_DEV_CTRL); device_writel(dev, ACTMON_INTR_STATUS_CLEAR, ACTMON_DEV_INTR_STATUS); - - actmon_write_barrier(tegra); } static unsigned long actmon_cpu_to_emc_rate(struct tegra_devfreq *tegra, @@ -376,8 +368,6 @@ static int tegra_actmon_rate_notify_cb(struct notifier_block *nb, tegra_devfreq_update_wmark(tegra, dev); } - actmon_write_barrier(tegra); - return NOTIFY_OK; } @@ -423,8 +413,6 @@ static void tegra_actmon_start(struct tegra_devfreq *tegra) for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) tegra_actmon_configure_device(tegra, &tegra->devices[i]); - actmon_write_barrier(tegra); - enable_irq(tegra->irq); } @@ -439,8 +427,6 @@ static void tegra_actmon_stop(struct tegra_devfreq *tegra) device_writel(&tegra->devices[i], ACTMON_INTR_STATUS_CLEAR, ACTMON_DEV_INTR_STATUS); } - - actmon_write_barrier(tegra); } static int tegra_devfreq_target(struct device *dev, unsigned long *freq, From patchwork Sun Aug 11 21:23:01 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1145428 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="Bo0DvMWp"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 466Bq118tlz9sNC for ; Mon, 12 Aug 2019 07:25:49 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726581AbfHKVZo (ORCPT ); Sun, 11 Aug 2019 17:25:44 -0400 Received: from mail-lj1-f194.google.com ([209.85.208.194]:38122 "EHLO mail-lj1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726557AbfHKVYm (ORCPT ); Sun, 11 Aug 2019 17:24:42 -0400 Received: by mail-lj1-f194.google.com with SMTP id r9so96614996ljg.5; Sun, 11 Aug 2019 14:24:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Z+D4amdoS+CtUBZsRTGRL9HUIA0YaiJWDQzAsmv9gmA=; b=Bo0DvMWpqA/aC7y1PuZR5g4MQESXagIKxo0QnFc3JUdSl2Z1D7LyzTDs1CWYhZiqAC zTjgcJbOg8WtF3kqTREkXteo1GVtUyTraYnHlDguSemMHEWYgO5J8PzfapFREcJVPeGC ymphOjXZmyDKj2wxyEvgC9SPIwkDTLRFMsuc25XKNYfOsiSL2OniTZXUGRR/4rETzLmn fdOx5pcaRQSIPKbf0jvRDV2lQBoWh+GAzc7h25gXyGNgvy5evMy8wcFDnFMeNZ3vQBUV cH5aK/2Tarbjo+czBCndeVDfaq36BmuHUABlhuw6/Qes5611c8ILI4GyPXeumEPE+Jbj 79Mg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Z+D4amdoS+CtUBZsRTGRL9HUIA0YaiJWDQzAsmv9gmA=; b=c8S0rAM27SRYJMhg3lGPrBx3eLFFp+B5rzHgh/ayk/ELDPfgRPDFuxm7p911OlICD+ 4FQBZN0sqVbotcyePi5Mxntpg0rJ7Rlk9d8pUNtYxh3nCXjzEZozK8n1Bw8aOxeMKYgM bBcxhJ+6oD1M6Bsga1gAzvNBVmnmxgZUrYAkw1W3tkyJndSLcKdC6eAbDJAzpuic3X/7 DVc8k3u/SU51sCvtXc7yzR+RnDjJ4DzEVl/MMIUYWGQ4UDB6dPXGgrKojTDvN3Bqc0I4 zK7zD2TkVwRFV1zQ7RgcXZiYmqzS30s3U9EynOfUf7LOkscchhf8E4msqqHkiSHKUClB Q49A== X-Gm-Message-State: APjAAAV/dZNET4XJ/MdZKVJgSL2q0zucpPpSA7kQXZ+o2eLG49PSGIp0 /ySRZl2TKF27Z660okLVH0Y= X-Google-Smtp-Source: APXvYqzjUUIQU9YthmDtMAtiwq0Jal5CmHgaPk+9swAKuR3w7TOKEJFyhbA/N3dfohhDi7urlTPWrQ== X-Received: by 2002:a2e:9048:: with SMTP id n8mr17224197ljg.37.1565558678707; Sun, 11 Aug 2019 14:24:38 -0700 (PDT) Received: from localhost.localdomain ([94.29.34.218]) by smtp.gmail.com with ESMTPSA id f1sm20470806ljk.86.2019.08.11.14.24.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Aug 2019 14:24:38 -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 v6 05/19] PM / devfreq: tegra30: Set up watermarks properly Date: Mon, 12 Aug 2019 00:23:01 +0300 Message-Id: <20190811212315.12689-6-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190811212315.12689-1-digetx@gmail.com> References: <20190811212315.12689-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 | 293 +++++++++++++++++++++--------- 1 file changed, 209 insertions(+), 84 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index ee14bf534c0d..2331052fd8bd 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -47,6 +47,8 @@ #define ACTMON_DEV_INTR_CONSECUTIVE_UPPER BIT(31) #define ACTMON_DEV_INTR_CONSECUTIVE_LOWER BIT(30) +#define ACTMON_DEV_INTR_AVG_BELOW_WMARK BIT(25) +#define ACTMON_DEV_INTR_AVG_ABOVE_WMARK BIT(24) #define ACTMON_ABOVE_WMARK_WINDOW 1 #define ACTMON_BELOW_WMARK_WINDOW 3 @@ -63,9 +65,8 @@ * ACTMON_AVERAGE_WINDOW_LOG2: default value for @DEV_CTRL_K_VAL, which * translates to 2 ^ (K_VAL + 1). ex: 2 ^ (6 + 1) = 128 */ -#define ACTMON_AVERAGE_WINDOW_LOG2 6 -#define ACTMON_SAMPLING_PERIOD 12 /* ms */ -#define ACTMON_DEFAULT_AVG_BAND 6 /* 1/10 of % */ +#define ACTMON_AVERAGE_WINDOW_LOG2 6 +#define ACTMON_SAMPLING_PERIOD 12 /* ms */ #define KHZ 1000 @@ -142,9 +143,6 @@ struct tegra_devfreq_device { * watermark breaches. */ unsigned long boost_freq; - - /* Optimal frequency calculated from the stats for this device */ - unsigned long target_freq; }; struct tegra_devfreq { @@ -156,7 +154,6 @@ struct tegra_devfreq { struct clk *emc_clock; unsigned long max_freq; - unsigned long cur_freq; struct notifier_block rate_change_nb; struct tegra_devfreq_device devices[ARRAY_SIZE(actmon_device_configs)]; @@ -205,42 +202,182 @@ static unsigned long do_percent(unsigned long val, unsigned int pct) return val * pct / 100; } +static unsigned long actmon_cpu_to_emc_rate(struct tegra_devfreq *tegra) +{ + struct tegra_actmon_emc_ratio *ratio = actmon_emc_ratios; + unsigned int cpu_freq = cpufreq_quick_get(0); + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(actmon_emc_ratios); i++, ratio++) { + if (cpu_freq >= ratio->cpu_freq) { + if (ratio->emc_freq >= tegra->max_freq) + return tegra->max_freq; + else + return ratio->emc_freq; + } + } + + return 0; +} + +static unsigned long +tegra_actmon_account_cpu_freq(struct tegra_devfreq *tegra, + struct tegra_devfreq_device *dev, + unsigned long target_freq) +{ + unsigned long static_cpu_emc_freq; + + if (dev->config->avg_dependency_threshold && + dev->config->avg_dependency_threshold < dev->avg_count) { + static_cpu_emc_freq = actmon_cpu_to_emc_rate(tegra); + target_freq = max(target_freq, static_cpu_emc_freq); + } + + return target_freq; +} + +static unsigned long tegra_actmon_lower_freq(struct tegra_devfreq *tegra, + unsigned long target_freq) +{ + unsigned long lower = target_freq; + struct dev_pm_opp *opp; + + opp = dev_pm_opp_find_freq_floor(tegra->devfreq->dev.parent, &lower); + if (IS_ERR(opp)) + lower = 0; + else + dev_pm_opp_put(opp); + + return lower; +} + +static unsigned long tegra_actmon_upper_freq(struct tegra_devfreq *tegra, + unsigned long target_freq) +{ + unsigned long upper = target_freq + 1; + struct dev_pm_opp *opp; + + opp = dev_pm_opp_find_freq_ceil(tegra->devfreq->dev.parent, &upper); + if (IS_ERR(opp)) + upper = ULONG_MAX; + else + dev_pm_opp_put(opp); + + return upper; +} + +static void tegra_actmon_get_lower_upper(struct tegra_devfreq *tegra, + struct tegra_devfreq_device *dev, + unsigned long target_freq, + unsigned long *lower, + unsigned long *upper) +{ + /* + * Memory frequencies are guaranteed to have 1MHz granularity + * and thus we need this rounding down to get a proper watermarks + * range in a case where target_freq falls into a range of + * next_possible_opp_freq - 1MHz. + */ + target_freq = round_down(target_freq, 1000000); + + /* watermarks are set at the borders of the corresponding OPPs */ + *lower = tegra_actmon_lower_freq(tegra, target_freq); + *upper = tegra_actmon_upper_freq(tegra, target_freq); + + *lower /= KHZ; + *upper /= KHZ; + + /* + * The upper watermark should take into account CPU's frequency + * because cpu_to_emc_rate() may override the target_freq with + * a higher value and thus upper watermark need to be set up + * accordingly to avoid parasitic upper-events. + */ + *upper = tegra_actmon_account_cpu_freq(tegra, dev, *upper); + + *lower *= ACTMON_SAMPLING_PERIOD; + *upper *= ACTMON_SAMPLING_PERIOD; +} + static void tegra_devfreq_update_avg_wmark(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev) { - u32 avg = dev->avg_count; - u32 avg_band_freq = tegra->max_freq * ACTMON_DEFAULT_AVG_BAND / KHZ; - u32 band = avg_band_freq * ACTMON_SAMPLING_PERIOD; + unsigned long lower, upper, freq; - device_writel(dev, avg + band, ACTMON_DEV_AVG_UPPER_WMARK); + freq = dev->avg_count / ACTMON_SAMPLING_PERIOD * KHZ; + tegra_actmon_get_lower_upper(tegra, dev, freq, &lower, &upper); - avg = max(dev->avg_count, band); - device_writel(dev, avg - band, ACTMON_DEV_AVG_LOWER_WMARK); + /* + * We want to get interrupts when MCCPU client crosses the + * dependency threshold in order to take into / out of account + * the CPU's freq. + */ + if (lower < dev->config->avg_dependency_threshold && + upper > dev->config->avg_dependency_threshold) { + if (dev->avg_count < dev->config->avg_dependency_threshold) + upper = dev->config->avg_dependency_threshold; + else + lower = dev->config->avg_dependency_threshold; + } + + device_writel(dev, lower, ACTMON_DEV_AVG_LOWER_WMARK); + device_writel(dev, upper, ACTMON_DEV_AVG_UPPER_WMARK); } static void tegra_devfreq_update_wmark(struct tegra_devfreq *tegra, - struct tegra_devfreq_device *dev) + struct tegra_devfreq_device *dev, + unsigned long freq) { - u32 val = tegra->cur_freq * ACTMON_SAMPLING_PERIOD; + unsigned long lower, upper, delta; + + /* + * Boosting logic kicks-in once lower / upper watermark is hit. + * The watermarks are based on the updated EMC rate and the + * average activity. + * + * The higher watermark is set in accordance to the EMC rate + * because we want to set it to the highest mark here and EMC rate + * represents that mark. The consecutive-upper interrupts are + * always enabled and we don't want to receive them if they won't + * do anything useful, hence the upper watermark is capped to maximum. + * Note that the EMC rate is changed once boosting pushed the rate + * too high, in that case boosting-up will be stopped because + * upper watermark is much higher now and it is *important* to + * stop the unwanted interrupts. + */ + tegra_actmon_get_lower_upper(tegra, dev, freq - 1, &lower, &upper); + + delta = do_percent(upper - lower, dev->config->boost_up_threshold); + device_writel(dev, lower + delta, ACTMON_DEV_UPPER_WMARK); - device_writel(dev, do_percent(val, dev->config->boost_up_threshold), - ACTMON_DEV_UPPER_WMARK); + /* + * Meanwhile the lower mark is based on the average value + * because it is the lowest possible consecutive-mark for this + * device. Once that mark is hit and boosting is stopped, the + * interrupt is disabled by ISR. + */ + freq = dev->avg_count / ACTMON_SAMPLING_PERIOD * KHZ; + tegra_actmon_get_lower_upper(tegra, dev, freq, &lower, &upper); - device_writel(dev, do_percent(val, dev->config->boost_down_threshold), - ACTMON_DEV_LOWER_WMARK); + delta = do_percent(upper - lower, dev->config->boost_down_threshold); + device_writel(dev, lower + delta, ACTMON_DEV_LOWER_WMARK); } static void actmon_isr_device(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev) { - u32 intr_status, dev_ctrl; + u32 intr_status, dev_ctrl, avg_intr_mask; dev->avg_count = device_readl(dev, ACTMON_DEV_AVG_COUNT); - tegra_devfreq_update_avg_wmark(tegra, dev); - intr_status = device_readl(dev, ACTMON_DEV_INTR_STATUS); dev_ctrl = device_readl(dev, ACTMON_DEV_CTRL); + avg_intr_mask = ACTMON_DEV_INTR_AVG_BELOW_WMARK | + ACTMON_DEV_INTR_AVG_ABOVE_WMARK; + + if (intr_status & avg_intr_mask) + tegra_devfreq_update_avg_wmark(tegra, dev); + if (intr_status & ACTMON_DEV_INTR_CONSECUTIVE_UPPER) { /* * new_boost = min(old_boost * up_coef + step, max_freq) @@ -253,8 +390,6 @@ static void actmon_isr_device(struct tegra_devfreq *tegra, if (dev->boost_freq >= tegra->max_freq) dev->boost_freq = tegra->max_freq; - else - dev_ctrl |= ACTMON_DEV_CTRL_CONSECUTIVE_ABOVE_WMARK_EN; } else if (intr_status & ACTMON_DEV_INTR_CONSECUTIVE_LOWER) { /* * new_boost = old_boost * down_coef @@ -263,63 +398,37 @@ static void actmon_isr_device(struct tegra_devfreq *tegra, dev->boost_freq = do_percent(dev->boost_freq, dev->config->boost_down_coeff); - dev_ctrl |= ACTMON_DEV_CTRL_CONSECUTIVE_ABOVE_WMARK_EN; - if (dev->boost_freq < (ACTMON_BOOST_FREQ_STEP >> 1)) dev->boost_freq = 0; - else - dev_ctrl |= ACTMON_DEV_CTRL_CONSECUTIVE_BELOW_WMARK_EN; } - if (dev->config->avg_dependency_threshold) { - if (dev->avg_count >= dev->config->avg_dependency_threshold) - dev_ctrl |= ACTMON_DEV_CTRL_CONSECUTIVE_BELOW_WMARK_EN; - else if (dev->boost_freq == 0) - dev_ctrl &= ~ACTMON_DEV_CTRL_CONSECUTIVE_BELOW_WMARK_EN; + if (intr_status & avg_intr_mask) { + /* + * Once average watermark is hit, it means that the memory + * activity changed significantly and thus boosting-up shall + * be reset because EMC clock rate will be changed and + * boosting will restart in this case. + */ + dev->boost_freq = 0; } - device_writel(dev, dev_ctrl, ACTMON_DEV_CTRL); + /* no boosting => no need for consecutive-down interrupt */ + if (dev->boost_freq == 0) + dev_ctrl &= ~ACTMON_DEV_CTRL_CONSECUTIVE_BELOW_WMARK_EN; + device_writel(dev, dev_ctrl, ACTMON_DEV_CTRL); device_writel(dev, ACTMON_INTR_STATUS_CLEAR, ACTMON_DEV_INTR_STATUS); } -static unsigned long actmon_cpu_to_emc_rate(struct tegra_devfreq *tegra, - unsigned long cpu_freq) -{ - unsigned int i; - struct tegra_actmon_emc_ratio *ratio = actmon_emc_ratios; - - for (i = 0; i < ARRAY_SIZE(actmon_emc_ratios); i++, ratio++) { - if (cpu_freq >= ratio->cpu_freq) { - if (ratio->emc_freq >= tegra->max_freq) - return tegra->max_freq; - else - return ratio->emc_freq; - } - } - - return 0; -} - -static void actmon_update_target(struct tegra_devfreq *tegra, - struct tegra_devfreq_device *dev) +static unsigned long actmon_update_target(struct tegra_devfreq *tegra, + struct tegra_devfreq_device *dev) { - unsigned long cpu_freq = 0; - unsigned long static_cpu_emc_freq = 0; - unsigned int avg_sustain_coef; - - if (dev->config->avg_dependency_threshold) { - cpu_freq = cpufreq_get(0); - static_cpu_emc_freq = actmon_cpu_to_emc_rate(tegra, cpu_freq); - } + unsigned long target_freq; - dev->target_freq = dev->avg_count / ACTMON_SAMPLING_PERIOD; - avg_sustain_coef = 100 * 100 / dev->config->boost_up_threshold; - dev->target_freq = do_percent(dev->target_freq, avg_sustain_coef); - dev->target_freq += dev->boost_freq; + target_freq = dev->avg_count / ACTMON_SAMPLING_PERIOD + dev->boost_freq; + target_freq = tegra_actmon_account_cpu_freq(tegra, dev, target_freq); - if (dev->avg_count >= dev->config->avg_dependency_threshold) - dev->target_freq = max(dev->target_freq, static_cpu_emc_freq); + return target_freq; } static irqreturn_t actmon_thread_isr(int irq, void *data) @@ -351,8 +460,8 @@ static int tegra_actmon_rate_notify_cb(struct notifier_block *nb, unsigned long action, void *ptr) { struct clk_notifier_data *data = ptr; - struct tegra_devfreq *tegra; struct tegra_devfreq_device *dev; + struct tegra_devfreq *tegra; unsigned int i; if (action != POST_RATE_CHANGE) @@ -360,12 +469,28 @@ static int tegra_actmon_rate_notify_cb(struct notifier_block *nb, tegra = container_of(nb, struct tegra_devfreq, rate_change_nb); - tegra->cur_freq = data->new_rate / KHZ; - + /* + * EMC rate could change due to three reasons: + * + * 1. Average watermark hit + * 2. Boosting overflow + * 3. CPU freq change + * + * Once rate is changed, the consecutive watermarks need to be + * updated in order for boosting to work properly and to avoid + * unnecessary interrupts. Note that the consecutive range is set for + * all of devices using the same rate, hence if CPU is doing much + * less than the other memory clients, then its upper watermark will + * be very high in comparison to the actual activity (lower watermark) + * and thus unnecessary upper-interrupts will be suppressed. + * + * The average watermarks also should be updated because of 3. + */ for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) { dev = &tegra->devices[i]; - tegra_devfreq_update_wmark(tegra, dev); + tegra_devfreq_update_avg_wmark(tegra, dev); + tegra_devfreq_update_wmark(tegra, dev, data->new_rate); } return NOTIFY_OK; @@ -374,15 +499,14 @@ static int tegra_actmon_rate_notify_cb(struct notifier_block *nb, static void tegra_actmon_configure_device(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev) { - u32 val = 0; - - dev->target_freq = tegra->cur_freq; + u32 val = 0, target_freq; - dev->avg_count = tegra->cur_freq * ACTMON_SAMPLING_PERIOD; + target_freq = clk_get_rate(tegra->emc_clock) / KHZ; + dev->avg_count = target_freq * ACTMON_SAMPLING_PERIOD; device_writel(dev, dev->avg_count, ACTMON_DEV_INIT_AVG); tegra_devfreq_update_avg_wmark(tegra, dev); - tegra_devfreq_update_wmark(tegra, dev); + tegra_devfreq_update_wmark(tegra, dev, target_freq); device_writel(dev, ACTMON_COUNT_WEIGHT, ACTMON_DEV_COUNT_WEIGHT); device_writel(dev, ACTMON_INTR_STATUS_CLEAR, ACTMON_DEV_INTR_STATUS); @@ -469,13 +593,13 @@ static int tegra_devfreq_get_dev_status(struct device *dev, struct tegra_devfreq_device *actmon_dev; unsigned long cur_freq; - cur_freq = READ_ONCE(tegra->cur_freq); + cur_freq = clk_get_rate(tegra->emc_clock); /* To be used by the tegra governor */ stat->private_data = tegra; /* The below are to be used by the other governors */ - stat->current_frequency = cur_freq * KHZ; + stat->current_frequency = cur_freq; actmon_dev = &tegra->devices[MCALL]; @@ -486,7 +610,7 @@ static int tegra_devfreq_get_dev_status(struct device *dev, stat->busy_time *= 100 / BUS_SATURATION_RATIO; /* Number of cycles in a sampling period */ - stat->total_time = ACTMON_SAMPLING_PERIOD * cur_freq; + stat->total_time = cur_freq / KHZ * ACTMON_SAMPLING_PERIOD; stat->busy_time = min(stat->busy_time, stat->total_time); @@ -505,6 +629,7 @@ static int tegra_governor_get_target(struct devfreq *devfreq, struct devfreq_dev_status *stat; struct tegra_devfreq *tegra; struct tegra_devfreq_device *dev; + unsigned long dev_target_freq; unsigned long target_freq = 0; unsigned int i; int err; @@ -520,9 +645,9 @@ static int tegra_governor_get_target(struct devfreq *devfreq, for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) { dev = &tegra->devices[i]; - actmon_update_target(tegra, dev); + dev_target_freq = actmon_update_target(tegra, dev); - target_freq = max(target_freq, dev->target_freq); + target_freq = max(target_freq, dev_target_freq); } *freq = target_freq * KHZ; @@ -642,7 +767,6 @@ static int tegra_devfreq_probe(struct platform_device *pdev) return rate; } - tegra->cur_freq = clk_get_rate(tegra->emc_clock) / KHZ; tegra->max_freq = rate / KHZ; for (i = 0; i < ARRAY_SIZE(actmon_device_configs); i++) { @@ -671,7 +795,8 @@ static int tegra_devfreq_probe(struct platform_device *pdev) platform_set_drvdata(pdev, tegra); tegra->rate_change_nb.notifier_call = tegra_actmon_rate_notify_cb; - err = clk_notifier_register(tegra->emc_clock, &tegra->rate_change_nb); + err = clk_notifier_register(tegra->emc_clock, + &tegra->rate_change_nb); if (err) { dev_err(&pdev->dev, "Failed to register rate change notifier\n"); From patchwork Sun Aug 11 21:23:02 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1145429 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="VYGkYGWS"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 466Bq634sGz9sML for ; Mon, 12 Aug 2019 07:25:54 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726978AbfHKVZt (ORCPT ); Sun, 11 Aug 2019 17:25:49 -0400 Received: from mail-lf1-f65.google.com ([209.85.167.65]:35751 "EHLO mail-lf1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726558AbfHKVYl (ORCPT ); Sun, 11 Aug 2019 17:24:41 -0400 Received: by mail-lf1-f65.google.com with SMTP id p197so72932640lfa.2; Sun, 11 Aug 2019 14:24:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=g5tURnCPvlR1FgVTUPFvio04s8CzBn2V+f8QGTCwOFA=; b=VYGkYGWSyIqV3/bTw9edC/ZAEXMemhmm7+oIA4bTuiwZ5TpSwXb1uj4gAbqdkmGAJ/ zTmk4QjPrLARFZzIivPK5ykVD2TwD9GOlgbGxwpgMUJsfJdrRnvTuVpmHzCgI+qGNJA+ b/QOVd9gjb0BIuXOzJpSbm91Yl5Hw/df5Vt0O63dtVWQ6BXC2y2w3WOZHgoXDaTOBZ1N zATzakfMHMb+bKucVFg3hmSkPpyg/IOTr77h/0uFKTa7k68i/zFtxRfi1/JPXI+R44tE AxsLxER77eUmuy8SNTmcBOBzh7i4R/fjME/kb65AUUMteAIg7HhDPEwwZ/qrpbrMDhmg NaIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=g5tURnCPvlR1FgVTUPFvio04s8CzBn2V+f8QGTCwOFA=; b=dOQ/yRt85wws++9ZWbtg5V2sAQeg0qQhTp4t8ZM/KwM2bcSuGNZygtwaKrkBuXujBG Kz4Ad+lshZl3qoHb8jat/trIZNm/SbDKcLDc5BQAugBnTl4IZOH0IJMnCc9cqcRRPWqP XJVoY0J+SEuZFB0yakWbw4we5iv/nSfvCeRe9hHpY9XovItZNSmSxSypmPsQ2MGsN2tT LKV+/4/NcNREtPdjolrDHpRXPvk6/cj0UVLX3t3nLMXcEadHqGsjq3OILvD6LaXX4KeH pixlBYltL25T6MtPMz3BuPjlcg5izzYqdqeDLtLASDMtxqy/gQNNaEIKz8nPn1SiR2Lx /Fnw== X-Gm-Message-State: APjAAAXlKyDYJ/jRXxHC24HU8uDNmWWoFC4JPb2GsQ+qyJZQqwNbb9Lq 3y5327ve9zI6Ci5gXjTNlSIyeZWa X-Google-Smtp-Source: APXvYqzWsbha/k+n8Lk/bwRxmFe2Qn/10AKfanB58Juj0zMzr1JTJBamAVUy1w7zA/JAMhV9jY5gmg== X-Received: by 2002:ac2:5097:: with SMTP id f23mr18381795lfm.130.1565558679611; Sun, 11 Aug 2019 14:24:39 -0700 (PDT) Received: from localhost.localdomain ([94.29.34.218]) by smtp.gmail.com with ESMTPSA id f1sm20470806ljk.86.2019.08.11.14.24.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Aug 2019 14:24:39 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v6 06/19] PM / devfreq: tegra30: Tune up boosting thresholds Date: Mon, 12 Aug 2019 00:23:02 +0300 Message-Id: <20190811212315.12689-7-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190811212315.12689-1-digetx@gmail.com> References: <20190811212315.12689-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. Reviewed-by: Chanwoo Choi Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index 2331052fd8bd..4525c051f85c 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -111,8 +111,8 @@ static struct tegra_devfreq_device_config actmon_device_configs[] = { .irq_mask = 1 << 26, .boost_up_coeff = 200, .boost_down_coeff = 50, - .boost_up_threshold = 60, - .boost_down_threshold = 40, + .boost_up_threshold = 50, + .boost_down_threshold = 25, }, { /* MCCPU: memory accesses from the CPUs */ From patchwork Sun Aug 11 21:23:03 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1145427 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="OqFbk6iw"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 466Bpw1r0jz9sNk for ; Mon, 12 Aug 2019 07:25:44 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726011AbfHKVYn (ORCPT ); Sun, 11 Aug 2019 17:24:43 -0400 Received: from mail-lj1-f194.google.com ([209.85.208.194]:39816 "EHLO mail-lj1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726608AbfHKVYm (ORCPT ); Sun, 11 Aug 2019 17:24:42 -0400 Received: by mail-lj1-f194.google.com with SMTP id x4so4489350ljj.6; Sun, 11 Aug 2019 14:24:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=WHBbqbfFd0BRb3uV6lTGI/raeYIwezEYsIDJ6CAqnew=; b=OqFbk6iwLnqsGRMtC/MYv0suH7fPUNq7+bv5RzfXskXXP9ehrE4Zcd4CXjLboi3XBE uj9hrOdKWUbZTSfbcwgWa3LDVRbeF3+darWxSbn7Ze9Cu8UzBDqX4EOG6rT8NNwgGMml 1+8UYQjW6oZqqHnbG18iMdNhdka5ELclGcTBowi3nV5KIUzyq2olHv/K5Xc4AbZlwGEw obEVbyfQk+xqAfsnUxJB9qu8I6/1SZGv7x7/OdF9e1PZBl62+UN0qS+/MQttemVFxyh1 Kb4kmkDruHI6cOHKiX8q9g6wfCXvP7I7mDELr5S9D6uIzfajs58oNC0f97SmmCJPRTyp E+/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=WHBbqbfFd0BRb3uV6lTGI/raeYIwezEYsIDJ6CAqnew=; b=QqZq3vRGp1xTUemiwAOL/wMI8YuSKsLtWjulyIWQURyPAJJazLbQXsE+evBMomGyAH ghhuLSaCr2eFIlRgZNV8RhakabC36yVCkswtylIPA/a5sZL0sj+5vbXezyoOu5VRshGy D1qyTz1FWXNx7J/to/AOhmCpvK2Ljl6fRkDgsajfggqT6u8IC3dZW8njMAhG58f32A7g Klpspd2zX15OTs1cnwPrpd1NbG1NplPwxr0SLpJEf/lhvmB+BbOLeSaBa9G++8cvE0KU Q+TCaTwySdoIb25/55zmFbjQLOPERMhi4UykdgX5q2Gm0o6Jsd0OWL14Ov6yHEn5+d/t kYng== X-Gm-Message-State: APjAAAWdOep5cy3SPsE+TEEor5Rc/X2dEXEA/KAz9il+sQBAMjj2abcJ CU6ifOR6b/mrLZpcJYJrrXo= X-Google-Smtp-Source: APXvYqzsQDvY7UD2ZL8jsnn27hiQ+tE+iBp/E3vQN+pBQQPB96Rlrxg1h86DWBZHQjOl3dIPHWZdPQ== X-Received: by 2002:a2e:720c:: with SMTP id n12mr2689511ljc.53.1565558680560; Sun, 11 Aug 2019 14:24:40 -0700 (PDT) Received: from localhost.localdomain ([94.29.34.218]) by smtp.gmail.com with ESMTPSA id f1sm20470806ljk.86.2019.08.11.14.24.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Aug 2019 14:24:40 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v6 07/19] PM / devfreq: tegra30: Fix integer overflow on CPU's freq max out Date: Mon, 12 Aug 2019 00:23:03 +0300 Message-Id: <20190811212315.12689-8-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190811212315.12689-1-digetx@gmail.com> References: <20190811212315.12689-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. Reviewed-by: Chanwoo Choi Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index 4525c051f85c..70dce58212a4 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -70,6 +70,8 @@ #define KHZ 1000 +#define KHZ_MAX (ULONG_MAX / KHZ) + /* Assume that the bus is saturated if the utilization is 25% */ #define BUS_SATURATION_RATIO 25 @@ -167,7 +169,7 @@ struct tegra_actmon_emc_ratio { }; static struct tegra_actmon_emc_ratio actmon_emc_ratios[] = { - { 1400000, ULONG_MAX }, + { 1400000, KHZ_MAX }, { 1200000, 750000 }, { 1100000, 600000 }, { 1000000, 500000 }, From patchwork Sun Aug 11 21:23:04 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1145426 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="IW7Zur0S"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 466Bpv51mDz9sML for ; Mon, 12 Aug 2019 07:25:43 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726668AbfHKVZi (ORCPT ); Sun, 11 Aug 2019 17:25:38 -0400 Received: from mail-lj1-f193.google.com ([209.85.208.193]:45348 "EHLO mail-lj1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726626AbfHKVYn (ORCPT ); Sun, 11 Aug 2019 17:24:43 -0400 Received: by mail-lj1-f193.google.com with SMTP id t3so8078326ljj.12; Sun, 11 Aug 2019 14:24:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=8iZqkZqXjTfAXjJSJnLg5xR1FkU/5dVzGt00ebVBBCo=; b=IW7Zur0Sb2bl1EsIa3wcpM/Goklf8Dqbc2Gape4C5nuMApNEADUdr0iY4VcJi4uwxD bnKWzzEoAp0l/RTxGYNoYmXw6gCfwqp9xb99D6qk6xycerNKkoRSDvv7HtyiNNa1ZpiE fiJx+T8JaWc1OU0FL23bNAJcTEHkUe0O+rByqRR6g1VUs0Yt6wT0OomkhCgSjAt8VTdc qN56pNIZ44GQW6Lz07KCv5xyR5N7/UcrVZGmQt4FaBn/GEOS5co+7g05kuXxnyRhOoDD pPGaFkigvSKnadviR82o7aKaqXnrX/ORfb7NAoG8y+/uvyWMZaDkb3ttYyfitmBxoRfG MReg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=8iZqkZqXjTfAXjJSJnLg5xR1FkU/5dVzGt00ebVBBCo=; b=JWnxRv8AxI4fUn77oq9ZoRlQhW0uCMLfxYcouYoTYff5CBWh+9uI1e06Kj8ZfLZNOD ET8r0LdT0oxHGM44pWveCCS/EcuM6jkWPtvhamcDKT2F3sq14IIRCa0Q5rWpYEk0nrx8 oogAVirGy66Fo2eJiJNHCaDPIDDUVpdjk08i8g+SGcSGH9VNzWmOzwU2iQVUav+aw5W5 W5yPQHRXFyN3/s4ZthVygpWXdCrVtMa3hSJT9cHHoM1lbkf/2dbgJjOHGcDROdsIo0Lq CUjKjIGzyWPb4/uEg72trh6iXq66c3uDyyqehRjNd2BSlj3s69TqTqUAKTmfO/728I8Z a3tA== X-Gm-Message-State: APjAAAV6Bet+u22Z5BqMRPqoQ3ie91t73QNMvrz43LJrbPoXnrijWTaH 5/yw4vp0NTC+JTywpAUgI3A= X-Google-Smtp-Source: APXvYqya0zCiYcOoJRRq2kn3mBYGFFSvmTYY9YIjtGxboGLtlI1nvjKso8rkvFoY3s6j9g+bhH5/HQ== X-Received: by 2002:a2e:970a:: with SMTP id r10mr16237270lji.115.1565558681453; Sun, 11 Aug 2019 14:24:41 -0700 (PDT) Received: from localhost.localdomain ([94.29.34.218]) by smtp.gmail.com with ESMTPSA id f1sm20470806ljk.86.2019.08.11.14.24.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Aug 2019 14:24:41 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v6 08/19] PM / devfreq: tegra30: Ensure that target freq won't overflow Date: Mon, 12 Aug 2019 00:23:04 +0300 Message-Id: <20190811212315.12689-9-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190811212315.12689-1-digetx@gmail.com> References: <20190811212315.12689-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 We already had few integer overflow bugs, let's limit the freq for consistency. Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index 70dce58212a4..ca499368ee81 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -430,7 +430,7 @@ static unsigned long actmon_update_target(struct tegra_devfreq *tegra, target_freq = dev->avg_count / ACTMON_SAMPLING_PERIOD + dev->boost_freq; target_freq = tegra_actmon_account_cpu_freq(tegra, dev, target_freq); - return target_freq; + return min(target_freq, tegra->max_freq); } static irqreturn_t actmon_thread_isr(int irq, void *data) From patchwork Sun Aug 11 21:23:05 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1145425 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="i7nkqieV"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 466Bpq4hcTz9sNf for ; Mon, 12 Aug 2019 07:25:38 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726812AbfHKVZd (ORCPT ); Sun, 11 Aug 2019 17:25:33 -0400 Received: from mail-lf1-f65.google.com ([209.85.167.65]:40547 "EHLO mail-lf1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726647AbfHKVYp (ORCPT ); Sun, 11 Aug 2019 17:24:45 -0400 Received: by mail-lf1-f65.google.com with SMTP id b17so72980744lff.7; Sun, 11 Aug 2019 14:24:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=2KvKm2ALIBuaggfliWdwhYglH+E1CmsiYLiIW5ZnHiw=; b=i7nkqieV28ECsAU15gQst7GR5+WrTIgIn6hUZKd3JOyPaIM6piA0CDkLJWcrX0sojx zxET6p0DiM7f1fn7ZlaEBqmoIq2zVYQv9LcdNC2sbcZ4f9v1yoFF0RGSXqJ/guaQST7n Erd4CuOd2zv4JYYH5RzXcGAF7O0G+paaJjcUIVzAmyCAd4fl0hlouunbd2S2xf93B/uk hm/LCkJs7MI9Ekmrd+60w16wfYBObKq7dw8bhbXaMwpftaXPHJtBpHiaodzl8t0DszMY fpnAAwbwnUHNXjPPUTnKZoF4byZcYoK/2jasxttOYwDnOh3KqR/sLYhiwZVnPL1cKEY8 fl+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=2KvKm2ALIBuaggfliWdwhYglH+E1CmsiYLiIW5ZnHiw=; b=o2Vs490kAy6lvtS/K9h1UHbUJkZfFbotCnObKvbMH2s0A3Zgyj3y6yaZ9VI7lGgS5A dnNbwWlhF4E5+riXRR/N0pCXGv9XuSwwoazClngtuyQg4xPeP/JfyBAR1I9r8gSgkiJ8 DR5An2zCL1PPCcb6jWtqBSLcvZCkKHYVZy+tjuI5+nivm+OToJ0xOGYAzXxM6/9c8Cyu Znt+f6PH2gNcNr8hZFQApwEJxSfjHaQvu4X3OPrTMuBjeF1pOxcRlOrZwQE6dkRrfmg/ nwxUwbtu/3itHHhuJeWcXVfObIL3znOUggXL07OPZZKbsuev8vBAtFIO7nqSn7544AgU Jg9w== X-Gm-Message-State: APjAAAXHgEkMuHsYoxZBGfLXQpG6f24eTM/9lOyGRyhvItoFOeXr5hQj PbL3BPzX6voxOU52eHGJHpg= X-Google-Smtp-Source: APXvYqy2fHl3qx5OpLM91UBPOUTnASL3+aNkDgeQaGhAh9dGQbYQGvwN6DVov6i303yJ07+oo4o+xg== X-Received: by 2002:ac2:47e8:: with SMTP id b8mr15652944lfp.84.1565558682361; Sun, 11 Aug 2019 14:24:42 -0700 (PDT) Received: from localhost.localdomain ([94.29.34.218]) by smtp.gmail.com with ESMTPSA id f1sm20470806ljk.86.2019.08.11.14.24.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Aug 2019 14:24:41 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v6 09/19] PM / devfreq: tegra30: Use kHz units uniformly in the code Date: Mon, 12 Aug 2019 00:23:05 +0300 Message-Id: <20190811212315.12689-10-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190811212315.12689-1-digetx@gmail.com> References: <20190811212315.12689-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 | 81 +++++++++++++++++++------------ 1 file changed, 49 insertions(+), 32 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index ca499368ee81..43d50b4366dd 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -137,8 +137,11 @@ struct tegra_devfreq_device { const struct tegra_devfreq_device_config *config; void __iomem *regs; - /* Average event count sampled in the last interrupt */ - u32 avg_count; + /* + * Average event count sampled in the last interrupt and converted + * to frequency value. + */ + u32 avg_freq; /* * Extra frequency to increase the target by due to consecutive @@ -222,6 +225,14 @@ static unsigned long actmon_cpu_to_emc_rate(struct tegra_devfreq *tegra) return 0; } +static unsigned long +tegra_actmon_dev_avg_dependency_freq(struct tegra_devfreq *tegra, + struct tegra_devfreq_device *dev) +{ + return dev->config->avg_dependency_threshold / + ACTMON_SAMPLING_PERIOD; +} + static unsigned long tegra_actmon_account_cpu_freq(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev, @@ -229,13 +240,15 @@ tegra_actmon_account_cpu_freq(struct tegra_devfreq *tegra, { unsigned long static_cpu_emc_freq; - if (dev->config->avg_dependency_threshold && - dev->config->avg_dependency_threshold < dev->avg_count) { + if (!dev->config->avg_dependency_threshold) + return target_freq; + + if (dev->avg_freq > tegra_actmon_dev_avg_dependency_freq(tegra, dev)) static_cpu_emc_freq = actmon_cpu_to_emc_rate(tegra); - target_freq = max(target_freq, static_cpu_emc_freq); - } + else + static_cpu_emc_freq = 0; - return target_freq; + return max(target_freq, static_cpu_emc_freq); } static unsigned long tegra_actmon_lower_freq(struct tegra_devfreq *tegra, @@ -261,7 +274,7 @@ static unsigned long tegra_actmon_upper_freq(struct tegra_devfreq *tegra, opp = dev_pm_opp_find_freq_ceil(tegra->devfreq->dev.parent, &upper); if (IS_ERR(opp)) - upper = ULONG_MAX; + upper = KHZ_MAX; else dev_pm_opp_put(opp); @@ -280,15 +293,12 @@ static void tegra_actmon_get_lower_upper(struct tegra_devfreq *tegra, * range in a case where target_freq falls into a range of * next_possible_opp_freq - 1MHz. */ - target_freq = round_down(target_freq, 1000000); + target_freq = round_down(target_freq, 1000); /* watermarks are set at the borders of the corresponding OPPs */ *lower = tegra_actmon_lower_freq(tegra, target_freq); *upper = tegra_actmon_upper_freq(tegra, target_freq); - *lower /= KHZ; - *upper /= KHZ; - /* * The upper watermark should take into account CPU's frequency * because cpu_to_emc_rate() may override the target_freq with @@ -304,10 +314,11 @@ static void tegra_actmon_get_lower_upper(struct tegra_devfreq *tegra, static void tegra_devfreq_update_avg_wmark(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev) { - unsigned long lower, upper, freq; + unsigned long avg_dependency_freq, lower, upper; + + tegra_actmon_get_lower_upper(tegra, dev, dev->avg_freq, &lower, &upper); - freq = dev->avg_count / ACTMON_SAMPLING_PERIOD * KHZ; - tegra_actmon_get_lower_upper(tegra, dev, freq, &lower, &upper); + avg_dependency_freq = tegra_actmon_dev_avg_dependency_freq(tegra, dev); /* * We want to get interrupts when MCCPU client crosses the @@ -316,7 +327,7 @@ static void tegra_devfreq_update_avg_wmark(struct tegra_devfreq *tegra, */ if (lower < dev->config->avg_dependency_threshold && upper > dev->config->avg_dependency_threshold) { - if (dev->avg_count < dev->config->avg_dependency_threshold) + if (dev->avg_freq < avg_dependency_freq) upper = dev->config->avg_dependency_threshold; else lower = dev->config->avg_dependency_threshold; @@ -358,8 +369,7 @@ static void tegra_devfreq_update_wmark(struct tegra_devfreq *tegra, * device. Once that mark is hit and boosting is stopped, the * interrupt is disabled by ISR. */ - freq = dev->avg_count / ACTMON_SAMPLING_PERIOD * KHZ; - tegra_actmon_get_lower_upper(tegra, dev, freq, &lower, &upper); + tegra_actmon_get_lower_upper(tegra, dev, dev->avg_freq, &lower, &upper); delta = do_percent(upper - lower, dev->config->boost_down_threshold); device_writel(dev, lower + delta, ACTMON_DEV_LOWER_WMARK); @@ -368,12 +378,14 @@ static void tegra_devfreq_update_wmark(struct tegra_devfreq *tegra, static void actmon_isr_device(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev) { - u32 intr_status, dev_ctrl, avg_intr_mask; + u32 intr_status, dev_ctrl, avg_intr_mask, avg_count; - dev->avg_count = device_readl(dev, ACTMON_DEV_AVG_COUNT); intr_status = device_readl(dev, ACTMON_DEV_INTR_STATUS); + avg_count = device_readl(dev, ACTMON_DEV_AVG_COUNT); dev_ctrl = device_readl(dev, ACTMON_DEV_CTRL); + dev->avg_freq = avg_count / ACTMON_SAMPLING_PERIOD; + avg_intr_mask = ACTMON_DEV_INTR_AVG_BELOW_WMARK | ACTMON_DEV_INTR_AVG_ABOVE_WMARK; @@ -427,7 +439,7 @@ static unsigned long actmon_update_target(struct tegra_devfreq *tegra, { unsigned long target_freq; - target_freq = dev->avg_count / ACTMON_SAMPLING_PERIOD + dev->boost_freq; + target_freq = dev->avg_freq + dev->boost_freq; target_freq = tegra_actmon_account_cpu_freq(tegra, dev, target_freq); return min(target_freq, tegra->max_freq); @@ -464,6 +476,7 @@ static int tegra_actmon_rate_notify_cb(struct notifier_block *nb, struct clk_notifier_data *data = ptr; struct tegra_devfreq_device *dev; struct tegra_devfreq *tegra; + unsigned long freq; unsigned int i; if (action != POST_RATE_CHANGE) @@ -471,6 +484,8 @@ static int tegra_actmon_rate_notify_cb(struct notifier_block *nb, tegra = container_of(nb, struct tegra_devfreq, rate_change_nb); + freq = data->new_rate / KHZ; + /* * EMC rate could change due to three reasons: * @@ -492,7 +507,7 @@ static int tegra_actmon_rate_notify_cb(struct notifier_block *nb, dev = &tegra->devices[i]; tegra_devfreq_update_avg_wmark(tegra, dev); - tegra_devfreq_update_wmark(tegra, dev, data->new_rate); + tegra_devfreq_update_wmark(tegra, dev, freq); } return NOTIFY_OK; @@ -501,14 +516,14 @@ static int tegra_actmon_rate_notify_cb(struct notifier_block *nb, static void tegra_actmon_configure_device(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev) { - u32 val = 0, target_freq; + u32 val = 0; - target_freq = clk_get_rate(tegra->emc_clock) / KHZ; - dev->avg_count = target_freq * ACTMON_SAMPLING_PERIOD; - device_writel(dev, dev->avg_count, ACTMON_DEV_INIT_AVG); + dev->avg_freq = clk_get_rate(tegra->emc_clock) / KHZ; + device_writel(dev, dev->avg_freq * ACTMON_SAMPLING_PERIOD, + ACTMON_DEV_INIT_AVG); tegra_devfreq_update_avg_wmark(tegra, dev); - tegra_devfreq_update_wmark(tegra, dev, target_freq); + tegra_devfreq_update_wmark(tegra, dev, dev->avg_freq); device_writel(dev, ACTMON_COUNT_WEIGHT, ACTMON_DEV_COUNT_WEIGHT); device_writel(dev, ACTMON_INTR_STATUS_CLEAR, ACTMON_DEV_INTR_STATUS); @@ -572,7 +587,7 @@ static int tegra_devfreq_target(struct device *dev, unsigned long *freq, rate = dev_pm_opp_get_freq(opp); dev_pm_opp_put(opp); - err = clk_set_min_rate(tegra->emc_clock, rate); + err = clk_set_min_rate(tegra->emc_clock, rate * KHZ); if (err) return err; @@ -595,7 +610,7 @@ static int tegra_devfreq_get_dev_status(struct device *dev, struct tegra_devfreq_device *actmon_dev; unsigned long cur_freq; - cur_freq = clk_get_rate(tegra->emc_clock); + cur_freq = clk_get_rate(tegra->emc_clock) / KHZ; /* To be used by the tegra governor */ stat->private_data = tegra; @@ -612,7 +627,7 @@ static int tegra_devfreq_get_dev_status(struct device *dev, stat->busy_time *= 100 / BUS_SATURATION_RATIO; /* Number of cycles in a sampling period */ - stat->total_time = cur_freq / KHZ * ACTMON_SAMPLING_PERIOD; + stat->total_time = cur_freq * ACTMON_SAMPLING_PERIOD; stat->busy_time = min(stat->busy_time, stat->total_time); @@ -652,7 +667,7 @@ static int tegra_governor_get_target(struct devfreq *devfreq, target_freq = max(target_freq, dev_target_freq); } - *freq = target_freq * KHZ; + *freq = target_freq; return 0; } @@ -787,7 +802,7 @@ static int tegra_devfreq_probe(struct platform_device *pdev) goto remove_opps; } - err = dev_pm_opp_add(&pdev->dev, rate, 0); + err = dev_pm_opp_add(&pdev->dev, rate / KHZ, 0); if (err) { dev_err(&pdev->dev, "Failed to add OPP: %d\n", err); goto remove_opps; @@ -812,6 +827,8 @@ static int tegra_devfreq_probe(struct platform_device *pdev) } tegra_devfreq_profile.initial_freq = clk_get_rate(tegra->emc_clock); + tegra_devfreq_profile.initial_freq /= KHZ; + devfreq = devfreq_add_device(&pdev->dev, &tegra_devfreq_profile, "tegra_actmon", NULL); if (IS_ERR(devfreq)) { From patchwork Sun Aug 11 21:23:06 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1145424 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="ZD/9ixO2"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 466Bpj2CSDz9sNk for ; Mon, 12 Aug 2019 07:25:33 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726704AbfHKVYr (ORCPT ); Sun, 11 Aug 2019 17:24:47 -0400 Received: from mail-lj1-f196.google.com ([209.85.208.196]:35774 "EHLO mail-lj1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726668AbfHKVYq (ORCPT ); Sun, 11 Aug 2019 17:24:46 -0400 Received: by mail-lj1-f196.google.com with SMTP id l14so6678598lje.2; Sun, 11 Aug 2019 14:24:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=VR4VQoyRWVM0Kw8sF0Cq63P0RsRTjzSwRUSf5aLb+kM=; b=ZD/9ixO25odQdlnP4wfN5pSIBJzFoN79VQ84W5O5/0W/602i12KKrq3AsGAffSVnNX b3jqMr7jMP2uMO7vdcKztaWoiQrQIsTu9PRrRP/Rwxyx10LaBfj9uvOf6qhnJjtpAZdf jv+eqSyquBJnavRHhunKsIMYJN8f3Jn5bSvL910ThcmxSmLnmC6mtQTd1ARJdfvqBj/N cAWVJG+E5LEx/JCTKOoT5SGuPycYxOavoVcf5CrXQy9tbUe/3SBN47ywftcK8aDn8Y7x cOuoA/rmv0vGbhhpR8rMydXUz4OcrtXHjxPFfJc+r8SPWOWuljknhyNUyhylc1G1X4KK cflQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=VR4VQoyRWVM0Kw8sF0Cq63P0RsRTjzSwRUSf5aLb+kM=; b=UpSWunk9z5bmFdk5bmysvjjAT0EP09iqS2yP7YLLzrNfiOW50BPX+MArDvnR23n3cE syMz5fXmKN8XV7pEZvq9Tkqegj1LgI+v7vIIOMH97TSDHcmCuRWcMPwLxmHGB9UBDn0o gcmvPlSUZtehJzC4lJa2LZ8Scq2xcN5siwxkw7gRYPoXkqkdeFFFGkU+gONw1e3QOMYe ugEyByD5hlJE7xRUpJAEAatEesP7lWcKHvjX/ne9tWTTSvUCZlEssoqpwnbkldHJMeWv FwTdjcIEf2Asd72CnhJZfAyq3qk4kf4ZVsy5e+4J/cTTINaW/Gilatiy3B75Ney5Qhlt 3IVA== X-Gm-Message-State: APjAAAVlF3WG+GMu1rifqnbOV+GtqsNRN/biZWjkNR5rpZBlkfm4+IL4 ZrLF+scPnVtJxIDa2MuQu5w= X-Google-Smtp-Source: APXvYqzhyQl+7fxoJDBOnfUxFOmPXVKfEdfg4c2MXCtDsNm6WqSrcaY8GI2PzXK5vs6aawbeBZ6yAQ== X-Received: by 2002:a2e:534a:: with SMTP id t10mr16278040ljd.109.1565558683337; Sun, 11 Aug 2019 14:24:43 -0700 (PDT) Received: from localhost.localdomain ([94.29.34.218]) by smtp.gmail.com with ESMTPSA id f1sm20470806ljk.86.2019.08.11.14.24.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Aug 2019 14:24:42 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v6 10/19] PM / devfreq: tegra30: Reduce unnecessary interrupts activity Date: Mon, 12 Aug 2019 00:23:06 +0300 Message-Id: <20190811212315.12689-11-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190811212315.12689-1-digetx@gmail.com> References: <20190811212315.12689-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 are cases where unnecessary ACTMON interrupts could be avoided, like when one memory client device requests higher clock rate than the other or when clock rate is manually limited using sysfs devfreq parameters. These cases could be avoided by tuning upper watermark or disabling hardware events when min/max boosting thresholds are reached. Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 87 ++++++++++++++++++++++++++++--- 1 file changed, 80 insertions(+), 7 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index 43d50b4366dd..a2623de56d20 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -312,7 +312,8 @@ static void tegra_actmon_get_lower_upper(struct tegra_devfreq *tegra, } static void tegra_devfreq_update_avg_wmark(struct tegra_devfreq *tegra, - struct tegra_devfreq_device *dev) + struct tegra_devfreq_device *dev, + unsigned long freq) { unsigned long avg_dependency_freq, lower, upper; @@ -320,6 +321,22 @@ static void tegra_devfreq_update_avg_wmark(struct tegra_devfreq *tegra, avg_dependency_freq = tegra_actmon_dev_avg_dependency_freq(tegra, dev); + /* + * If cumulative EMC frequency selection (MCALL / min_freq) is + * higher than the device's, then there is no need to set upper + * watermark to a lower value because it will result in unnecessary + * upper interrupts. + * + * Note that average watermarks are also updated after EMC + * clock rate change, hence if clock rate goes down, then the + * watermarks will be set in accordance to the new rate after + * changing the rate. There are other ways to achieve the same + * result, but this one is probably the least churning, although + * it may look a bit convoluted. + */ + if (freq * ACTMON_SAMPLING_PERIOD > upper) + upper = freq * ACTMON_SAMPLING_PERIOD; + /* * We want to get interrupts when MCCPU client crosses the * dependency threshold in order to take into / out of account @@ -361,7 +378,18 @@ static void tegra_devfreq_update_wmark(struct tegra_devfreq *tegra, tegra_actmon_get_lower_upper(tegra, dev, freq - 1, &lower, &upper); delta = do_percent(upper - lower, dev->config->boost_up_threshold); - device_writel(dev, lower + delta, ACTMON_DEV_UPPER_WMARK); + + /* + * The memory events count could go a bit higher than the maximum + * defined by the OPPs, hence make the upper watermark infinitely + * high to avoid unnecessary upper interrupts in that case. + */ + if (freq == tegra->max_freq) + upper = ULONG_MAX; + else + upper = lower + delta; + + device_writel(dev, upper, ACTMON_DEV_UPPER_WMARK); /* * Meanwhile the lower mark is based on the average value @@ -379,6 +407,7 @@ static void actmon_isr_device(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev) { u32 intr_status, dev_ctrl, avg_intr_mask, avg_count; + unsigned long freq; intr_status = device_readl(dev, ACTMON_DEV_INTR_STATUS); avg_count = device_readl(dev, ACTMON_DEV_AVG_COUNT); @@ -389,8 +418,10 @@ static void actmon_isr_device(struct tegra_devfreq *tegra, avg_intr_mask = ACTMON_DEV_INTR_AVG_BELOW_WMARK | ACTMON_DEV_INTR_AVG_ABOVE_WMARK; - if (intr_status & avg_intr_mask) - tegra_devfreq_update_avg_wmark(tegra, dev); + if (intr_status & avg_intr_mask) { + freq = clk_get_rate(tegra->emc_clock) / KHZ; + tegra_devfreq_update_avg_wmark(tegra, dev, freq); + } if (intr_status & ACTMON_DEV_INTR_CONSECUTIVE_UPPER) { /* @@ -412,6 +443,8 @@ static void actmon_isr_device(struct tegra_devfreq *tegra, dev->boost_freq = do_percent(dev->boost_freq, dev->config->boost_down_coeff); + dev_ctrl |= ACTMON_DEV_CTRL_CONSECUTIVE_ABOVE_WMARK_EN; + if (dev->boost_freq < (ACTMON_BOOST_FREQ_STEP >> 1)) dev->boost_freq = 0; } @@ -427,8 +460,16 @@ static void actmon_isr_device(struct tegra_devfreq *tegra, } /* no boosting => no need for consecutive-down interrupt */ - if (dev->boost_freq == 0) + if (dev->boost_freq == 0) { dev_ctrl &= ~ACTMON_DEV_CTRL_CONSECUTIVE_BELOW_WMARK_EN; + dev_ctrl |= ACTMON_DEV_CTRL_CONSECUTIVE_ABOVE_WMARK_EN; + } + + /* boosting max-out => no need for consecutive-up interrupt */ + if (dev->boost_freq == tegra->max_freq) { + dev_ctrl &= ~ACTMON_DEV_CTRL_CONSECUTIVE_ABOVE_WMARK_EN; + dev_ctrl |= ACTMON_DEV_CTRL_CONSECUTIVE_BELOW_WMARK_EN; + } device_writel(dev, dev_ctrl, ACTMON_DEV_CTRL); device_writel(dev, ACTMON_INTR_STATUS_CLEAR, ACTMON_DEV_INTR_STATUS); @@ -437,8 +478,40 @@ static void actmon_isr_device(struct tegra_devfreq *tegra, static unsigned long actmon_update_target(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev) { + u32 avg_count, avg_freq, old_upper, new_upper, dev_ctrl; unsigned long target_freq; + /* + * The avg_count / avg_freq is getting snapshoted on device's + * interrupt, but there are cases where actual value need to + * be utilized on target's update, like CPUFreq boosting and + * overriding the min freq via /sys/class/devfreq/devfreq0/min_freq + * because we're optimizing the upper watermark based on the + * actual EMC frequency. This means that interrupt may be + * inactive for a long time and thus making snapshoted value + * outdated. + */ + avg_count = device_readl(dev, ACTMON_DEV_AVG_COUNT); + avg_freq = avg_count / ACTMON_SAMPLING_PERIOD; + + old_upper = tegra_actmon_upper_freq(tegra, dev->avg_freq); + new_upper = tegra_actmon_upper_freq(tegra, avg_freq); + + /* similar to ISR, see comments in actmon_isr_device() */ + if (old_upper != new_upper) { + if (dev->boost_freq == tegra->max_freq) { + dev_ctrl = device_readl(dev, ACTMON_DEV_CTRL); + + dev_ctrl &= ~ACTMON_DEV_CTRL_CONSECUTIVE_BELOW_WMARK_EN; + dev_ctrl |= ACTMON_DEV_CTRL_CONSECUTIVE_ABOVE_WMARK_EN; + + device_writel(dev, dev_ctrl, ACTMON_DEV_CTRL); + } + + dev->avg_freq = avg_freq; + dev->boost_freq = 0; + } + target_freq = dev->avg_freq + dev->boost_freq; target_freq = tegra_actmon_account_cpu_freq(tegra, dev, target_freq); @@ -506,7 +579,7 @@ static int tegra_actmon_rate_notify_cb(struct notifier_block *nb, for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) { dev = &tegra->devices[i]; - tegra_devfreq_update_avg_wmark(tegra, dev); + tegra_devfreq_update_avg_wmark(tegra, dev, freq); tegra_devfreq_update_wmark(tegra, dev, freq); } @@ -522,7 +595,7 @@ static void tegra_actmon_configure_device(struct tegra_devfreq *tegra, device_writel(dev, dev->avg_freq * ACTMON_SAMPLING_PERIOD, ACTMON_DEV_INIT_AVG); - tegra_devfreq_update_avg_wmark(tegra, dev); + tegra_devfreq_update_avg_wmark(tegra, dev, dev->avg_freq); tegra_devfreq_update_wmark(tegra, dev, dev->avg_freq); device_writel(dev, ACTMON_COUNT_WEIGHT, ACTMON_DEV_COUNT_WEIGHT); From patchwork Sun Aug 11 21:23:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1145421 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="K8NcLYds"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 466BpP1W1Tz9sNC for ; Mon, 12 Aug 2019 07:25:17 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726885AbfHKVZQ (ORCPT ); Sun, 11 Aug 2019 17:25:16 -0400 Received: from mail-lf1-f68.google.com ([209.85.167.68]:44452 "EHLO mail-lf1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726671AbfHKVYs (ORCPT ); Sun, 11 Aug 2019 17:24:48 -0400 Received: by mail-lf1-f68.google.com with SMTP id v16so1262761lfg.11; Sun, 11 Aug 2019 14:24:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=zC/znG0N0CSKGhWxUGhpQfsWmb43MyH6pjJkqgSDjCY=; b=K8NcLYdsw7FG99yjT/5n8KVqLeoX9eQZ0iJ1vI1fsYXSQijSMHtN1Mk1HJjepckLv1 xU2rVvoKgSl5WmEsH+DsFG2LeY9QyQrAUmRMxfF8k575YWYWH51qSzEnw1mFz7GmeU8i kRR0YMsMWtp2NUIMclB3EepFJkUkQNAWpt1/awG+hp8NH4tLqoH8Ca5n21wgrOM9npKc zeVyYSwpiAhxTLXhuoQufEdKkWwtAuL4SrGGCPR2jVM8p0BSRtPAO/Ax2tsiYJfcoAS5 90MR0UtmxW7OGiDVNFjZ7Y0xwaTnFisaSxOUPuVZzZ1fuVwd06Ll2XE5vMf74pl1KnZN XYXg== 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=zC/znG0N0CSKGhWxUGhpQfsWmb43MyH6pjJkqgSDjCY=; b=nxoZ9QC6OsOB1j+Yp/E5KCk5eq/bSfN3VQYHDZfEnSoNrpwJfx+lvQb6cmidnrWP+V ijx+AkDoK9VErNhNUDtp5HJgeGch/6/H6rdzGDhL97asIw4zjTwxOP6fof6taMZopLf/ poWVFt/UeM9Lw9Sk5Ar5zbmhNSwO23J+SfttaG9KhZJ3punHwbe29T5uCCq3SqBXxIZ1 ujOn18vI4tV8weqaT8Xz5PnE3mTjBitBNcfXJufbv8dYpAoZpHNPsNNYnUWMGf/H1Qgz 559kHnMlcrc+zzUuwJj2T1uX1SfhR3YwZGyk84zIb2qvngqqQSuOmy7DquVGt3ny0ePh O7iA== X-Gm-Message-State: APjAAAX1Xx6dtKqXdQaJkjEQw/cE8RjgKwhchWCIgNFkQDJkiEbb4V2H 1aEiCe6YYTLOvkJyMY/P4RA= X-Google-Smtp-Source: APXvYqz9CzUPng5ieKnkGyAjk4IrmRR5TZoxbQAlst8NmjkUuY4kKHm3bZHGqLjWeEVsXCyt3Of61w== X-Received: by 2002:ac2:5c4f:: with SMTP id s15mr19582043lfp.74.1565558684259; Sun, 11 Aug 2019 14:24:44 -0700 (PDT) Received: from localhost.localdomain ([94.29.34.218]) by smtp.gmail.com with ESMTPSA id f1sm20470806ljk.86.2019.08.11.14.24.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Aug 2019 14:24:43 -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 v6 11/19] PM / devfreq: tegra30: Use CPUFreq notifier Date: Mon, 12 Aug 2019 00:23:07 +0300 Message-Id: <20190811212315.12689-12-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190811212315.12689-1-digetx@gmail.com> References: <20190811212315.12689-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 Reviewed-by: Chanwoo Choi --- drivers/devfreq/tegra30-devfreq.c | 173 ++++++++++++++++++++++++++---- 1 file changed, 153 insertions(+), 20 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index a2623de56d20..a260812f7744 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -17,6 +17,7 @@ #include #include #include +#include #include "governor.h" @@ -34,6 +35,8 @@ #define ACTMON_DEV_CTRL_CONSECUTIVE_ABOVE_WMARK_EN BIT(30) #define ACTMON_DEV_CTRL_ENB BIT(31) +#define ACTMON_DEV_CTRL_STOP 0x00000000 + #define ACTMON_DEV_UPPER_WMARK 0x4 #define ACTMON_DEV_LOWER_WMARK 0x8 #define ACTMON_DEV_INIT_AVG 0xc @@ -159,7 +162,10 @@ struct tegra_devfreq { struct clk *emc_clock; unsigned long max_freq; - struct notifier_block rate_change_nb; + struct notifier_block clk_rate_change_nb; + + struct delayed_work cpufreq_update_work; + struct notifier_block cpu_rate_change_nb; struct tegra_devfreq_device devices[ARRAY_SIZE(actmon_device_configs)]; @@ -207,10 +213,10 @@ static unsigned long do_percent(unsigned long val, unsigned int pct) return val * pct / 100; } -static unsigned long actmon_cpu_to_emc_rate(struct tegra_devfreq *tegra) +static unsigned long actmon_cpu_to_emc_rate(struct tegra_devfreq *tegra, + unsigned int cpu_freq) { struct tegra_actmon_emc_ratio *ratio = actmon_emc_ratios; - unsigned int cpu_freq = cpufreq_quick_get(0); unsigned int i; for (i = 0; i < ARRAY_SIZE(actmon_emc_ratios); i++, ratio++) { @@ -244,7 +250,8 @@ tegra_actmon_account_cpu_freq(struct tegra_devfreq *tegra, return target_freq; if (dev->avg_freq > tegra_actmon_dev_avg_dependency_freq(tegra, dev)) - static_cpu_emc_freq = actmon_cpu_to_emc_rate(tegra); + static_cpu_emc_freq = actmon_cpu_to_emc_rate( + tegra, cpufreq_quick_get(0)); else static_cpu_emc_freq = 0; @@ -543,8 +550,8 @@ static irqreturn_t actmon_thread_isr(int irq, void *data) return handled ? IRQ_HANDLED : IRQ_NONE; } -static int tegra_actmon_rate_notify_cb(struct notifier_block *nb, - unsigned long action, void *ptr) +static int tegra_actmon_clk_notify_cb(struct notifier_block *nb, + unsigned long action, void *ptr) { struct clk_notifier_data *data = ptr; struct tegra_devfreq_device *dev; @@ -555,7 +562,7 @@ static int tegra_actmon_rate_notify_cb(struct notifier_block *nb, if (action != POST_RATE_CHANGE) return NOTIFY_OK; - tegra = container_of(nb, struct tegra_devfreq, rate_change_nb); + tegra = container_of(nb, struct tegra_devfreq, clk_rate_change_nb); freq = data->new_rate / KHZ; @@ -586,6 +593,94 @@ static int tegra_actmon_rate_notify_cb(struct notifier_block *nb, return NOTIFY_OK; } +static void tegra_actmon_delayed_update(struct work_struct *work) +{ + struct tegra_devfreq *tegra = container_of(work, struct tegra_devfreq, + cpufreq_update_work.work); + + mutex_lock(&tegra->devfreq->lock); + update_devfreq(tegra->devfreq); + mutex_unlock(&tegra->devfreq->lock); +} + +static unsigned long +tegra_actmon_cpufreq_contribution(struct tegra_devfreq *tegra, + unsigned int cpu_freq) +{ + unsigned long freq, static_cpu_emc_freq; + + /* check whether CPU's freq is taken into account at all */ + freq = tegra_actmon_dev_avg_dependency_freq(tegra, + &tegra->devices[MCCPU]); + if (tegra->devices[MCCPU].avg_freq <= freq) + return 0; + + static_cpu_emc_freq = actmon_cpu_to_emc_rate(tegra, cpu_freq); + + /* compare static CPU-EMC freq with MCALL */ + freq = tegra->devices[MCALL].avg_freq + + tegra->devices[MCALL].boost_freq; + + freq = tegra_actmon_upper_freq(tegra, freq); + + if (freq == tegra->max_freq || freq >= static_cpu_emc_freq) + return 0; + + /* compare static CPU-EMC freq with MCCPU */ + freq = tegra->devices[MCCPU].avg_freq + + tegra->devices[MCCPU].boost_freq; + + freq = tegra_actmon_upper_freq(tegra, freq); + + if (freq == tegra->max_freq || freq >= static_cpu_emc_freq) + return 0; + + return static_cpu_emc_freq; +} + +static int tegra_actmon_cpu_notify_cb(struct notifier_block *nb, + unsigned long action, void *ptr) +{ + struct cpufreq_freqs *freqs = ptr; + struct tegra_devfreq *tegra; + unsigned long old, new, delay; + + if (action != CPUFREQ_POSTCHANGE) + return NOTIFY_OK; + + tegra = container_of(nb, struct tegra_devfreq, cpu_rate_change_nb); + + /* + * Quickly check whether CPU frequency should be taken into account + * at all, without blocking CPUFreq's core. + */ + if (mutex_trylock(&tegra->devfreq->lock)) { + old = tegra_actmon_cpufreq_contribution(tegra, freqs->old); + new = tegra_actmon_cpufreq_contribution(tegra, freqs->new); + mutex_unlock(&tegra->devfreq->lock); + + /* + * If CPU's frequency shouldn't be taken into account at + * the moment, then there is no need to update the devfreq's + * state because ISR will re-check CPU's frequency on the + * next interrupt. + */ + if (old == new) + return NOTIFY_OK; + } + + /* + * CPUFreq driver should support CPUFREQ_ASYNC_NOTIFICATION in order + * to allow asynchronous notifications. This means we can't block + * here for too long, otherwise CPUFreq's core will complain with a + * warning splat. + */ + delay = msecs_to_jiffies(ACTMON_SAMPLING_PERIOD); + schedule_delayed_work(&tegra->cpufreq_update_work, delay); + + return NOTIFY_OK; +} + static void tegra_actmon_configure_device(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev) { @@ -617,9 +712,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, ACTMON_DEV_CTRL_STOP, ACTMON_DEV_CTRL); + device_writel(dev, ACTMON_INTR_STATUS_CLEAR, ACTMON_DEV_INTR_STATUS); +} + +static int tegra_actmon_start(struct tegra_devfreq *tegra) { unsigned int i; + int err; actmon_writel(tegra, ACTMON_SAMPLING_PERIOD - 1, ACTMON_GLB_PERIOD_CTRL); @@ -627,7 +729,30 @@ static void tegra_actmon_start(struct tegra_devfreq *tegra) for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) tegra_actmon_configure_device(tegra, &tegra->devices[i]); + /* + * We are estimating CPU's memory bandwidth requirement based on + * amount of memory accesses and system's load, judging by CPU's + * frequency. We also don't want to receive events about CPU's + * frequency transaction when governor is stopped, hence notifier + * is registered dynamically. + */ + err = cpufreq_register_notifier(&tegra->cpu_rate_change_nb, + CPUFREQ_TRANSITION_NOTIFIER); + if (err) { + dev_err(tegra->devfreq->dev.parent, + "Failed to register rate change notifier: %d\n", err); + goto err_stop; + } + enable_irq(tegra->irq); + + return 0; + +err_stop: + for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) + tegra_actmon_stop_device(&tegra->devices[i]); + + return err; } static void tegra_actmon_stop(struct tegra_devfreq *tegra) @@ -636,11 +761,13 @@ static void tegra_actmon_stop(struct tegra_devfreq *tegra) disable_irq(tegra->irq); - for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) { - device_writel(&tegra->devices[i], 0x00000000, ACTMON_DEV_CTRL); - device_writel(&tegra->devices[i], ACTMON_INTR_STATUS_CLEAR, - ACTMON_DEV_INTR_STATUS); - } + cpufreq_unregister_notifier(&tegra->cpu_rate_change_nb, + CPUFREQ_TRANSITION_NOTIFIER); + + cancel_delayed_work_sync(&tegra->cpufreq_update_work); + + for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) + tegra_actmon_stop_device(&tegra->devices[i]); } static int tegra_devfreq_target(struct device *dev, unsigned long *freq, @@ -749,6 +876,7 @@ static int tegra_governor_event_handler(struct devfreq *devfreq, unsigned int event, void *data) { struct tegra_devfreq *tegra = dev_get_drvdata(devfreq->dev.parent); + int ret = 0; /* * Couple device with the governor early as it is needed at @@ -759,7 +887,7 @@ static int tegra_governor_event_handler(struct devfreq *devfreq, switch (event) { case DEVFREQ_GOV_START: devfreq_monitor_start(devfreq); - tegra_actmon_start(tegra); + ret = tegra_actmon_start(tegra); break; case DEVFREQ_GOV_STOP: @@ -774,11 +902,11 @@ static int tegra_governor_event_handler(struct devfreq *devfreq, case DEVFREQ_GOV_RESUME: devfreq_monitor_resume(devfreq); - tegra_actmon_start(tegra); + ret = tegra_actmon_start(tegra); break; } - return 0; + return ret; } static struct devfreq_governor tegra_devfreq_governor = { @@ -884,9 +1012,14 @@ static int tegra_devfreq_probe(struct platform_device *pdev) platform_set_drvdata(pdev, tegra); - tegra->rate_change_nb.notifier_call = tegra_actmon_rate_notify_cb; + tegra->cpu_rate_change_nb.notifier_call = tegra_actmon_cpu_notify_cb; + + INIT_DELAYED_WORK(&tegra->cpufreq_update_work, + tegra_actmon_delayed_update); + + tegra->clk_rate_change_nb.notifier_call = tegra_actmon_clk_notify_cb; err = clk_notifier_register(tegra->emc_clock, - &tegra->rate_change_nb); + &tegra->clk_rate_change_nb); if (err) { dev_err(&pdev->dev, "Failed to register rate change notifier\n"); @@ -915,7 +1048,7 @@ static int tegra_devfreq_probe(struct platform_device *pdev) devfreq_remove_governor(&tegra_devfreq_governor); unreg_notifier: - clk_notifier_unregister(tegra->emc_clock, &tegra->rate_change_nb); + clk_notifier_unregister(tegra->emc_clock, &tegra->clk_rate_change_nb); remove_opps: dev_pm_opp_remove_all_dynamic(&pdev->dev); @@ -933,7 +1066,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 Sun Aug 11 21:23:08 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1145423 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="rTUtHuiP"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 466Bph3v6kz9sNC for ; Mon, 12 Aug 2019 07:25:32 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726917AbfHKVZ0 (ORCPT ); Sun, 11 Aug 2019 17:25:26 -0400 Received: from mail-lf1-f66.google.com ([209.85.167.66]:46098 "EHLO mail-lf1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726688AbfHKVYr (ORCPT ); Sun, 11 Aug 2019 17:24:47 -0400 Received: by mail-lf1-f66.google.com with SMTP id n19so4571023lfe.13; Sun, 11 Aug 2019 14:24:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Lns2F1Z8CpqknymSvh5W98Sjrak+4HxbHPvWO55eGpU=; b=rTUtHuiPNe7o8K8j17CoKUgmNGCABvr1V/0mZfK2hx64sgNJ+Qe4d/ATdBExamK5D3 RuO65xa1Ct4j53rk86GHcJ4W+7VfZTUdGt+AISGhyzWM/ycpbVooGbcwv+yYdJSRDQhK anGvprizBk8gK8rUieCSjbMGgN1TOwxDTl3weYZy1yTgknWaMv1dcm5td+zRi2asDz6Y cOLCu38Y/itGS2aQHzU3iiVmB22kZsTVUOZzq2qUVyUB0MAibJFX0N6Y2NFWQAWJFzhK 2+45C7oSyI72RM2uAAc1hEEwHMA/LyjbIj5/SmEa/WSWmiYPcsaIj8YmxfsNaEphl5vD ImPw== 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=Lns2F1Z8CpqknymSvh5W98Sjrak+4HxbHPvWO55eGpU=; b=S6WBbP6VNOgA2a+v9NrR7EgB1cQL+skIiwo0d4C+zZn7vaVBQVlggRc/1RB5HB2rgN ZrPeGehDAF/Xui7EuAH+i248Fneyo+8lolxGwt6V+mCUizkOeUeMfwO9FuSfAPzflqIB +PX+4LgLhKpg1+ypz8qA8eSpapQPXJXGnVd5rqJ/C1mvkeV13natemFPM15nGHI7Lnn+ iYoFxNBmLq24HatOCo/6B+tf2IlQq1nMYBd5sJV5RlpB8TvUd+v21iGrhYl8oS9JNe8K TvcXSQE3dMr/+LMJuMgu3p+azW1+kQttfGL/JlSQDoFgBFd+7HFUk578rYDxhONYzekM mvPw== X-Gm-Message-State: APjAAAVE6VHQC8j3/AUwYusBwoq0HiqXv1Le2UzM6BX9Pf9iT2Xd7etl BT6h2Jd7jRaYnvMIPuaqsdg= X-Google-Smtp-Source: APXvYqzVb1EudV5q+8upA2GUBirn8Fc7LPgdchyfJk8YU0+8PpxmVn2hfZm4lkVV8o1NdDfH1RaC3g== X-Received: by 2002:ac2:5dfb:: with SMTP id z27mr18248162lfq.128.1565558685294; Sun, 11 Aug 2019 14:24:45 -0700 (PDT) Received: from localhost.localdomain ([94.29.34.218]) by smtp.gmail.com with ESMTPSA id f1sm20470806ljk.86.2019.08.11.14.24.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Aug 2019 14:24:44 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Jonathan Hunter , Tomeu Vizoso Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v6 12/19] PM / devfreq: tegra30: Move clk-notifier's registration to governor's start Date: Mon, 12 Aug 2019 00:23:08 +0300 Message-Id: <20190811212315.12689-13-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190811212315.12689-1-digetx@gmail.com> References: <20190811212315.12689-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. Reviewed-by: Chanwoo Choi Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 33 ++++++++++++++++++------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index a260812f7744..bad9836b1eea 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -726,6 +726,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]); @@ -752,6 +765,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; } @@ -768,6 +783,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, @@ -1012,24 +1029,16 @@ static int tegra_devfreq_probe(struct platform_device *pdev) platform_set_drvdata(pdev, tegra); + tegra->clk_rate_change_nb.notifier_call = tegra_actmon_clk_notify_cb; tegra->cpu_rate_change_nb.notifier_call = tegra_actmon_cpu_notify_cb; INIT_DELAYED_WORK(&tegra->cpufreq_update_work, tegra_actmon_delayed_update); - tegra->clk_rate_change_nb.notifier_call = tegra_actmon_clk_notify_cb; - err = clk_notifier_register(tegra->emc_clock, - &tegra->clk_rate_change_nb); - if (err) { - dev_err(&pdev->dev, - "Failed to register rate change notifier\n"); - goto remove_opps; - } - err = devfreq_add_governor(&tegra_devfreq_governor); if (err) { dev_err(&pdev->dev, "Failed to add governor: %d\n", err); - goto unreg_notifier; + goto remove_opps; } tegra_devfreq_profile.initial_freq = clk_get_rate(tegra->emc_clock); @@ -1047,9 +1056,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); @@ -1066,7 +1072,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 Sun Aug 11 21:23:09 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1145422 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="gjsyse6w"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 466BpY6wWvz9sNk for ; Mon, 12 Aug 2019 07:25:25 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726881AbfHKVZQ (ORCPT ); Sun, 11 Aug 2019 17:25:16 -0400 Received: from mail-lf1-f67.google.com ([209.85.167.67]:39606 "EHLO mail-lf1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726694AbfHKVYs (ORCPT ); Sun, 11 Aug 2019 17:24:48 -0400 Received: by mail-lf1-f67.google.com with SMTP id x3so19207715lfn.6; Sun, 11 Aug 2019 14:24:46 -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=1DipR4hwlo+C3xieASjVQKlAxunkARzuIH2w7oPgSg0=; b=gjsyse6wDQwZA4x+EK9knjC9/CpkfAp9T5JAVNm63P+Hs51Z7jUl8hCAxM4g+5zPHi Ay7+ZsRhwLUtIxWTBhWEgGT7f7wXMUd3scx0J7hCBjy5Lj3hVrlXKqBYrMv6JJlljzwm wfhoJQPX3Y73TLHed1K6qqV8OmWnUU0ov+UyMOYurtDPHVbmi4xXLU2kWQvfErkL+MdO bBD21VRaWwooDP0lW68btSVyLtrFl5btrZZe5RC3Kbg/OsKpO8me6FdewHQBhAxjv6GQ MjDGnHLFgmBPAwxUq0LxLmcEJooV0V5wAP9UDL9VFlg3hsiDwTogaCery5s/XUkR5Zkz J/kg== 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=1DipR4hwlo+C3xieASjVQKlAxunkARzuIH2w7oPgSg0=; b=RNat1D9Zmxuz88PAsAvP5mFsghAFZMk0V3kdiIn/XSBjAPMayhyA+CVPYL4xnGoKn3 4VrMPLyZCR8tjqMklK+oBU0P3Sq0Nxj0jFwvZ28f3sWtscRy/MgUifNrLgxGbuYNuxir z6sx8hlTzMkWv20OPoSXhD+T9K662pHacTZvfhC8sofi4ZKj3GbEszW+lpFeP2EiaTon pttNqtP6C0Pf52aJm/pP0bBJr7GMpJ/l5TSBvbzutdZ/9XDoxsIII4p9eyFpVj9ZOQ27 pLj4nVJP79RcH0+dJBPbnHE+B5InvTdpG3jn18UXwzGbY1nDTafqoJ2qIQdGO49n359H JA/Q== X-Gm-Message-State: APjAAAWT99B2EH5573ilD2OKPLjb1imP/k+YdzMQw9VNBA+L5xA6QgRx R6150hTk3XIFeu1CV7xE1rw= X-Google-Smtp-Source: APXvYqyzYo4TOGkWXwCOZT/8T07hDkQuGj2IQhFTkTVwQKv7xIItsXzSOD+douKo2pEtw/JwgX5pbg== X-Received: by 2002:a19:4f42:: with SMTP id a2mr17836593lfk.23.1565558686247; Sun, 11 Aug 2019 14:24:46 -0700 (PDT) Received: from localhost.localdomain ([94.29.34.218]) by smtp.gmail.com with ESMTPSA id f1sm20470806ljk.86.2019.08.11.14.24.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Aug 2019 14:24:45 -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 v6 13/19] PM / devfreq: tegra30: Reset boosting on startup Date: Mon, 12 Aug 2019 00:23:09 +0300 Message-Id: <20190811212315.12689-14-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190811212315.12689-1-digetx@gmail.com> References: <20190811212315.12689-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. Reviewed-by: Chanwoo Choi Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index bad9836b1eea..5002dca4c403 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -686,6 +686,9 @@ static void tegra_actmon_configure_device(struct tegra_devfreq *tegra, { u32 val = 0; + /* reset boosting on governor's restart */ + dev->boost_freq = 0; + dev->avg_freq = clk_get_rate(tegra->emc_clock) / KHZ; device_writel(dev, dev->avg_freq * ACTMON_SAMPLING_PERIOD, ACTMON_DEV_INIT_AVG); From patchwork Sun Aug 11 21:23:10 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1145420 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="OUJSTFxc"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 466BpM1BRpz9sNC for ; Mon, 12 Aug 2019 07:25:15 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726740AbfHKVYu (ORCPT ); Sun, 11 Aug 2019 17:24:50 -0400 Received: from mail-lf1-f65.google.com ([209.85.167.65]:35756 "EHLO mail-lf1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726710AbfHKVYt (ORCPT ); Sun, 11 Aug 2019 17:24:49 -0400 Received: by mail-lf1-f65.google.com with SMTP id p197so72932747lfa.2; Sun, 11 Aug 2019 14:24:47 -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=MKUZF2FyqOuJG4YssHrLj6QM+BeSa8vzOdT/eItzhxo=; b=OUJSTFxcMTtokWOHIwkTbrYYBHXEsYMfNzi6hOENx/wwads+EHnyF6dPILvT+RCHca Pg/jZQuCaR0rE6rduarIKzKkJfmnG6G46pl7hocVBJ/AoRWRfhAOSywtwa8frbi1qGnl Ms556rmhS+JEsNw+py6Q/FXlpvSLe9SMQyY2M3auLVOpBUw9kOYKsf5zraHau76/poGI lSyQMdaMA9GvUBKHls7oFrtTmkj4+169crgKkG1Wi8Bx+s7vdid35no4EEgFLfjBGc74 oBlPZscv6RLgBT9oSJZmuE6p3ESgrpBPNdk6JNQYt7MFM5JXmmJMte5FQzLqj/HRtSkq hIKw== 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=MKUZF2FyqOuJG4YssHrLj6QM+BeSa8vzOdT/eItzhxo=; b=Pn9IJAsxLb5A/7EnaMNpitFNqblKS6i5fCUayQAQF3cCeMCWPFp4mBPVnYRbTzqwH5 V/EEPnEW1SGHg+XXlTT3bfrmaBVgAxSECuuY7bfiyndNupKMQQ0RFSEep691i87qt/Ea 32FTvovYdZOu/1WaFA5rXEoHOehUwfZx7jPzmxdRFa2Wush+Tw1HdipVsJbi6O3N93hT S26Wvgg1ptbeWo/7T8NfraQGajpWcD8vFZnEFLjSNU7I6xbrOOC7wCN5DfPriHnru/XZ BmlPxT3hEwmrARaNYu+EyZVydENtCqw81krFKznyJEMrxCjweU+bJbuBRwVAtOT2RUl1 opZQ== X-Gm-Message-State: APjAAAXeFp2FzkYkKGGBKNARq7obzWvNN7dyURdUkNMaGRjWYYQRElpR nO8kpCVFhHwbsc1ZA6YX3XE= X-Google-Smtp-Source: APXvYqxyCbTtr3F2c5qyx23V9a3mg+QuEgFDHiuEHZ75u4VumkSDxnKNZ4jJfMRcJMG1gXDOhT5VqA== X-Received: by 2002:ac2:4157:: with SMTP id c23mr17799835lfi.173.1565558687140; Sun, 11 Aug 2019 14:24:47 -0700 (PDT) Received: from localhost.localdomain ([94.29.34.218]) by smtp.gmail.com with ESMTPSA id f1sm20470806ljk.86.2019.08.11.14.24.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Aug 2019 14:24:46 -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 v6 14/19] PM / devfreq: tegra30: Don't enable consecutive-down interrupt on startup Date: Mon, 12 Aug 2019 00:23:10 +0300 Message-Id: <20190811212315.12689-15-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190811212315.12689-1-digetx@gmail.com> References: <20190811212315.12689-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 Reviewed-by: Chanwoo Choi --- 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 5002dca4c403..a0a1ac09a824 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -708,7 +708,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 Sun Aug 11 21:23:11 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1145418 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="p8hnGGEg"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 466BpC5W2Gz9sNm for ; Mon, 12 Aug 2019 07:25:07 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726774AbfHKVYv (ORCPT ); Sun, 11 Aug 2019 17:24:51 -0400 Received: from mail-lf1-f67.google.com ([209.85.167.67]:46100 "EHLO mail-lf1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726721AbfHKVYu (ORCPT ); Sun, 11 Aug 2019 17:24:50 -0400 Received: by mail-lf1-f67.google.com with SMTP id n19so4571054lfe.13; Sun, 11 Aug 2019 14:24:48 -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=YjdyDUArQgVNGBFF8GoRE+JSrDDre7zGJm+qLt81K8o=; b=p8hnGGEga7xbaoiK8QM2im6a4gRD5t1/+F2SoZjGEHYEWw+64u+ChRwxfjul54Qvto QH600IGoSiBBqy5k5sgWoaFrqwrHeBw57a27aPq+nG5v2ee1fC7ApfZxF02ajw5SJlaP n7iVhhSE0W2yNiXTwz8TM8MpXQLJsUHNgIcxVBDPWEzkqEcHXHR+0BIZHtTGk6PKCy0l /f87d00w4sju3OtvU5QxCP6/UONk/zeK+NiI+LSriVUTsaXwJWXdtIhpMrCwDBCp06DL NHZYwxXj8sy19o70GcNDuHsIgQ9ma/nPH6hfZyxBDD+DXtmUqFirRvLXySJHKT1JlqEI IN2w== 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=YjdyDUArQgVNGBFF8GoRE+JSrDDre7zGJm+qLt81K8o=; b=lBtNG5nabeyRnBkXE//dX+2Vp7aOmAVSaQSWMD8PmX6P7kqE0CD0POxe82JCpqDIOh YHEhfFE54zkx+DwCn7nWcvCmZPGQ/sg5VmuTkjzGvXYwxXqI1GBBUElzIl5rU0XUahyZ fQ7xvQG3xjqoc39N48TV20yr61Zi4TxyCf9XYDgkao6B6cbQFFs97b2dv5ijbDU8p3B8 nlavX0p8zN/9PW1QH/k+KyCxo7EsBIu//rGl2HiqB6/n97U22/iNpZbMn8DNFoeqyh9o MhbDlnCwSZS8q3zfFpnD4zDF2W6KHxIg2fvOFUr3mfZJItr1yF5Jmj6YVPE/fHDtcyzq DEJQ== X-Gm-Message-State: APjAAAW3ikvxIkeyZ3ox4fhf3U1YDdaZzSL4ruSSlXfAb39pYUk4/wga 90dyAjtgpYD9igRcn+nPBX4= X-Google-Smtp-Source: APXvYqwKQQsMoVhyRZmSzdVFefMc6sJLJH0M8Hou3BmHB2GmOGiOnPht9RKvftyERp3cTkPfO41izA== X-Received: by 2002:ac2:5336:: with SMTP id f22mr8350527lfh.180.1565558688021; Sun, 11 Aug 2019 14:24:48 -0700 (PDT) Received: from localhost.localdomain ([94.29.34.218]) by smtp.gmail.com with ESMTPSA id f1sm20470806ljk.86.2019.08.11.14.24.47 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Aug 2019 14:24:47 -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 v6 15/19] PM / devfreq: tegra30: Constify structs Date: Mon, 12 Aug 2019 00:23:11 +0300 Message-Id: <20190811212315.12689-16-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190811212315.12689-1-digetx@gmail.com> References: <20190811212315.12689-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. Reviewed-by: Chanwoo Choi Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index a0a1ac09a824..6446bf705b97 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -109,7 +109,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, @@ -177,7 +177,7 @@ struct tegra_actmon_emc_ratio { unsigned long emc_freq; }; -static struct tegra_actmon_emc_ratio actmon_emc_ratios[] = { +static const struct tegra_actmon_emc_ratio actmon_emc_ratios[] = { { 1400000, KHZ_MAX }, { 1200000, 750000 }, { 1100000, 600000 }, @@ -216,7 +216,7 @@ static unsigned long do_percent(unsigned long val, unsigned int pct) static unsigned long actmon_cpu_to_emc_rate(struct tegra_devfreq *tegra, unsigned int cpu_freq) { - struct tegra_actmon_emc_ratio *ratio = actmon_emc_ratios; + const struct tegra_actmon_emc_ratio *ratio = actmon_emc_ratios; unsigned int i; for (i = 0; i < ARRAY_SIZE(actmon_emc_ratios); i++, ratio++) { From patchwork Sun Aug 11 21:23:12 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1145419 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="E7Wa4n4N"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 466BpJ6nvyz9sNm for ; Mon, 12 Aug 2019 07:25:12 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726581AbfHKVZI (ORCPT ); Sun, 11 Aug 2019 17:25:08 -0400 Received: from mail-lj1-f194.google.com ([209.85.208.194]:37594 "EHLO mail-lj1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726668AbfHKVYv (ORCPT ); Sun, 11 Aug 2019 17:24:51 -0400 Received: by mail-lj1-f194.google.com with SMTP id z28so42402170ljn.4; Sun, 11 Aug 2019 14:24:49 -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=Rl6+31atTzQWuYNYtIscWWP4waaXRqkRH1JYAHXA7qo=; b=E7Wa4n4NPUKQwZdlNhZKtzrj+RvWL4+5uEcIovqr+2z5rXp9LeGnD9qs5O5qtOSU2Y N9WZ2u2lb/GuI0dKaOoeVoJjzBov8IpIUCGNORkXz8npEDh20/VAgVgL7S+ftMcUXCIK Logo5HDU2Z9oj4WoG75eidjaP6KSh9h3uVRzGuE9wsm5c5BzMH1ycnoqhQ27urHm5lN/ QuoBL76Mf7RSDjaZYGtcYJjKmJ6EohWR8xctr3WTT/DAhsuWgna6u5aB6RgjcgbNJ7nc 3ZAHEuju6tBCpj7j+xqkhb/VR879J/voe8XAYQRGwhB4bjv1u6m6zcR1Zk5ZVSW89bLN wCuQ== 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=Rl6+31atTzQWuYNYtIscWWP4waaXRqkRH1JYAHXA7qo=; b=nmNMaHUZRBB8xTbngaLZhoR1qnYBFgzgnQVvwrOVXjd8+aqgZVwmVuBFomOXZSf+gb nBp2WqUmvwr0pgpDUxissMD87QshYoLUpDQriovxXi8zO+m44rm1K1lTho4GtUTZ+xyL 1nJup7NPqNFSsQ+rhjgMBZGDMJraHECoNMwV8gFFzy/NISbLH2GB0PjSeEuzI4KQK+Do azhnQPVs950vA6Q3SQ9U15/liWM1nN2L9pX3aTEwqSbj6BAFgsCf3shhzEKuigp9bFho +G2azMhf0+US/P6JNB+cer8r97PYU7gNmpi4g4cw17dcgtClNZLQfc7bZslEtjXPAHc3 udJA== X-Gm-Message-State: APjAAAXtlyfqLrtHU+JxjIHsVBTSV0YmVs0/3irwiw+Gqu5IbM3+Av4/ Yn/3d5QV+hSyDCtJU8EemvI= X-Google-Smtp-Source: APXvYqzHtU9rlVXZhSkiDGaXlN5i553leooIWDeLx8jkbmJh4GnQ3MtB/Lkil+RIHWX04JDijslb/A== X-Received: by 2002:a2e:7013:: with SMTP id l19mr17256049ljc.141.1565558688909; Sun, 11 Aug 2019 14:24:48 -0700 (PDT) Received: from localhost.localdomain ([94.29.34.218]) by smtp.gmail.com with ESMTPSA id f1sm20470806ljk.86.2019.08.11.14.24.48 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Aug 2019 14:24:48 -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 v6 16/19] PM / devfreq: tegra30: Include appropriate header Date: Mon, 12 Aug 2019 00:23:12 +0300 Message-Id: <20190811212315.12689-17-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190811212315.12689-1-digetx@gmail.com> References: <20190811212315.12689-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 It's not very correct to include mod_devicetable.h for the OF device drivers and of_device.h should be included instead. Reviewed-by: Chanwoo Choi Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index 6446bf705b97..9753985c9131 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include #include From patchwork Sun Aug 11 21:23:13 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1145415 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="XR7JXM2t"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 466Bny4pwNz9sNm for ; Mon, 12 Aug 2019 07:24:54 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726796AbfHKVYw (ORCPT ); Sun, 11 Aug 2019 17:24:52 -0400 Received: from mail-lj1-f194.google.com ([209.85.208.194]:33097 "EHLO mail-lj1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726758AbfHKVYw (ORCPT ); Sun, 11 Aug 2019 17:24:52 -0400 Received: by mail-lj1-f194.google.com with SMTP id z17so8177943ljz.0; Sun, 11 Aug 2019 14:24:50 -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=etmyJ8NDuEkpkehamLf+URJIlzZFEVYkuu77P3IBsfM=; b=XR7JXM2tRUkthQ97FN4JN2D4mChDkusaiD6wyobi9XCGIboYJrAxbszWX9mRFkzY6J OMykSerGSKhj8iwqymUuJI0mP5ZS+qhga8iwXBkgT7ZQks5733bBQw71S5p+lJHJJt9r y1UbRWghmhb+yUJDt6BJAeGkIzQj2OXUlcIkZj6Afn4bYbTa7IrZPaApCgKFSR4/7jU4 JbORS/aCiWYMDqqa+8n8mn9NtFm5H8FSfRiHBVZ09QSm9qOd0JRbVCFRTs0xpm7gx52o 9Ukge/2J3zB92w6+8WH3+5uQqbxfrTGYgeDI83XKFnb2WLpKf8h68T3BOxL7XrvYNjeX 3CAw== 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=etmyJ8NDuEkpkehamLf+URJIlzZFEVYkuu77P3IBsfM=; b=c3EIWqLPl3hcx9Jikn8ecig+91sbfOI2QtTVNUgoqxc7VFIKnTnf+xVDclUhLc4Te6 Oi9D5kKPjYZHzkW4ReCWwfAEOUiW99s4C9NYii6sf/Qibi81ny89ufsfVY5NBKTy0wx9 y7d+MaZnflLr5uNqChJfn8qvaRdbQfgTNxFu+LUEGu/gR6IA7Atm2jhiomIIePurbSUn l25coB71nfLjA3CNk820g6KUOT+Aek0ib7b6TMdW7b9HLDbWPivlHzgQ/+zMdyvHkKZA 1AJbO/NkJOUlL/Vdfu8w4y0nzz1yAloKD78MPMNCQskaSxYhji6nMo5fpmyA+N9zm/fL k+xQ== X-Gm-Message-State: APjAAAX3KY4Jd4xfHpYGbeFra2pt0rzi4oXG2Ux815oWR3Z4zhjtrDwo ztOV0SAlUUYVx1mGybR9YVU= X-Google-Smtp-Source: APXvYqzir4uH/KRi6sERHQmP+keyTASgopDNK32wn+9dLri0OfqfQanJ5f5Xu4Hgs627HgAVszizAw== X-Received: by 2002:a2e:6e0c:: with SMTP id j12mr17251875ljc.123.1565558689810; Sun, 11 Aug 2019 14:24:49 -0700 (PDT) Received: from localhost.localdomain ([94.29.34.218]) by smtp.gmail.com with ESMTPSA id f1sm20470806ljk.86.2019.08.11.14.24.48 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Aug 2019 14:24:49 -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 v6 17/19] PM / devfreq: tegra30: Increase sampling period to 16ms Date: Mon, 12 Aug 2019 00:23:13 +0300 Message-Id: <20190811212315.12689-18-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190811212315.12689-1-digetx@gmail.com> References: <20190811212315.12689-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 Increase sampling period by 4ms to get a nicer pow2 value, converting diving into shifts in the code. That's more preferable for Tegra30 that doesn't have hardware divider instructions because of older Cortex-A9 CPU. In a result boosting events are delayed by 4ms, which is not sensible in practice at all. Reviewed-by: Chanwoo Choi Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index 9753985c9131..8adc0ff48b45 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -69,7 +69,7 @@ * translates to 2 ^ (K_VAL + 1). ex: 2 ^ (6 + 1) = 128 */ #define ACTMON_AVERAGE_WINDOW_LOG2 6 -#define ACTMON_SAMPLING_PERIOD 12 /* ms */ +#define ACTMON_SAMPLING_PERIOD 16 /* ms */ #define KHZ 1000 From patchwork Sun Aug 11 21:23:14 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1145417 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="jBE2q//1"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 466BpC0K07z9sML for ; Mon, 12 Aug 2019 07:25:07 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726721AbfHKVYx (ORCPT ); Sun, 11 Aug 2019 17:24:53 -0400 Received: from mail-lj1-f195.google.com ([209.85.208.195]:42639 "EHLO mail-lj1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726710AbfHKVYx (ORCPT ); Sun, 11 Aug 2019 17:24:53 -0400 Received: by mail-lj1-f195.google.com with SMTP id 15so4846087ljr.9; Sun, 11 Aug 2019 14:24:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=qYF3Rqm4TqMv387u1JVvYrQ9Rm4YuzrDkdXu+uqilyI=; b=jBE2q//1dnda371W0I5LI4mkONmVg3P1jhRd1JsRdGj/zM2mqkrKu4DuRGjZRlzUjH 5oCdPMYkkFiD/GY/lspmz+WCvFhqs6daeTG629aaG7xmCySMDHBvSqTB/4YpavWJgGH3 Da4vuqk/3jHqePPKrKF+tNak4Q0cMfi9xM4reCMGX/uiuvrmbBRTn1h78EMP1gvORAkh i7YGG/839wXlA2S9te4AVjzFnrHKvfjPV8LXjrw82MRfDDspXgAuBla0XWWDKylHhoZK x/vj+ykgWi4PCbp8UVQ0q3RgtaV209Fjol/JNJ6JH/LpcDW8fWTCTMAJdGMjgIi+6fOw ZMkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=qYF3Rqm4TqMv387u1JVvYrQ9Rm4YuzrDkdXu+uqilyI=; b=N5usY6+vjGF0cSQktsVeNcLpc+KgHJSRbkELMSEXTlrCQF8iCNEjzXmtbSQlKb6tpG UENikrhJyT3BfKmxxjdUkQZzvZlVhrxvlGWZEEBHGk+JgL3VsJxRw7MdM2QL52/DeoYH Bvw44hLCTB30vS4vAqH7Dudw94rwaFS9Xj2UEjno28NvOlrO1azNEdhtpD7sIkW/XTgu wLmjghwVjt/YiVE4YjrI78G7wwVSlfHFzJAlLeRoQbZgZFQK1uxT3C5mmdjsX6hnHNY+ Vz+DR4J94NxY5pkkzfgHhEJ5AQ4HlE9m5Arvf48Hlhv6ycksB5Nojc5QxYE8IpkebaDE uGpQ== X-Gm-Message-State: APjAAAWoGnuAv5h0qfuX2xOnyqwgZB0uSrVp4MgIrWM5e1K6ZPxh1VFU EdhaM7iI8llaZRi4sFcXmqk= X-Google-Smtp-Source: APXvYqwJmfAW2KhtHm3TEcRrUQZGTMdE+NIkq6jnpxe/7EprcU2ivr/iZNzVoO910v5vI/FimjJtdw== X-Received: by 2002:a2e:8705:: with SMTP id m5mr6110161lji.9.1565558690699; Sun, 11 Aug 2019 14:24:50 -0700 (PDT) Received: from localhost.localdomain ([94.29.34.218]) by smtp.gmail.com with ESMTPSA id f1sm20470806ljk.86.2019.08.11.14.24.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Aug 2019 14:24:50 -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 v6 18/19] PM / devfreq: tegra30: Support variable polling interval Date: Mon, 12 Aug 2019 00:23:14 +0300 Message-Id: <20190811212315.12689-19-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190811212315.12689-1-digetx@gmail.com> References: <20190811212315.12689-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 ACTMON governor is interrupt-driven and currently hardware's polling interval is fixed to 16ms in the driver. Devfreq supports variable polling interval by the generic governors, let's re-use the generic interface for changing of the polling interval. Now the polling interval can be changed dynamically via /sys/class/devfreq/devfreq0/polling_interval. Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 71 ++++++++++++++++++++++--------- 1 file changed, 50 insertions(+), 21 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index 8adc0ff48b45..e30314bd571a 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -236,7 +237,7 @@ tegra_actmon_dev_avg_dependency_freq(struct tegra_devfreq *tegra, struct tegra_devfreq_device *dev) { return dev->config->avg_dependency_threshold / - ACTMON_SAMPLING_PERIOD; + tegra->devfreq->profile->polling_ms; } static unsigned long @@ -314,8 +315,8 @@ static void tegra_actmon_get_lower_upper(struct tegra_devfreq *tegra, */ *upper = tegra_actmon_account_cpu_freq(tegra, dev, *upper); - *lower *= ACTMON_SAMPLING_PERIOD; - *upper *= ACTMON_SAMPLING_PERIOD; + *lower *= tegra->devfreq->profile->polling_ms; + *upper *= tegra->devfreq->profile->polling_ms; } static void tegra_devfreq_update_avg_wmark(struct tegra_devfreq *tegra, @@ -341,8 +342,8 @@ static void tegra_devfreq_update_avg_wmark(struct tegra_devfreq *tegra, * result, but this one is probably the least churning, although * it may look a bit convoluted. */ - if (freq * ACTMON_SAMPLING_PERIOD > upper) - upper = freq * ACTMON_SAMPLING_PERIOD; + if (freq * tegra->devfreq->profile->polling_ms > upper) + upper = freq * tegra->devfreq->profile->polling_ms; /* * We want to get interrupts when MCCPU client crosses the @@ -420,7 +421,7 @@ static void actmon_isr_device(struct tegra_devfreq *tegra, avg_count = device_readl(dev, ACTMON_DEV_AVG_COUNT); dev_ctrl = device_readl(dev, ACTMON_DEV_CTRL); - dev->avg_freq = avg_count / ACTMON_SAMPLING_PERIOD; + dev->avg_freq = avg_count / tegra->devfreq->profile->polling_ms; avg_intr_mask = ACTMON_DEV_INTR_AVG_BELOW_WMARK | ACTMON_DEV_INTR_AVG_ABOVE_WMARK; @@ -499,7 +500,7 @@ static unsigned long actmon_update_target(struct tegra_devfreq *tegra, * outdated. */ avg_count = device_readl(dev, ACTMON_DEV_AVG_COUNT); - avg_freq = avg_count / ACTMON_SAMPLING_PERIOD; + avg_freq = avg_count / tegra->devfreq->profile->polling_ms; old_upper = tegra_actmon_upper_freq(tegra, dev->avg_freq); new_upper = tegra_actmon_upper_freq(tegra, avg_freq); @@ -675,7 +676,7 @@ static int tegra_actmon_cpu_notify_cb(struct notifier_block *nb, * here for too long, otherwise CPUFreq's core will complain with a * warning splat. */ - delay = msecs_to_jiffies(ACTMON_SAMPLING_PERIOD); + delay = msecs_to_jiffies(tegra->devfreq->profile->polling_ms); schedule_delayed_work(&tegra->cpufreq_update_work, delay); return NOTIFY_OK; @@ -690,7 +691,7 @@ static void tegra_actmon_configure_device(struct tegra_devfreq *tegra, dev->boost_freq = 0; dev->avg_freq = clk_get_rate(tegra->emc_clock) / KHZ; - device_writel(dev, dev->avg_freq * ACTMON_SAMPLING_PERIOD, + device_writel(dev, dev->avg_freq * tegra->devfreq->profile->polling_ms, ACTMON_DEV_INIT_AVG); tegra_devfreq_update_avg_wmark(tegra, dev, dev->avg_freq); @@ -725,7 +726,14 @@ static int tegra_actmon_start(struct tegra_devfreq *tegra) unsigned int i; int err; - actmon_writel(tegra, ACTMON_SAMPLING_PERIOD - 1, + if (!tegra->devfreq->stop_polling) + return 0; + + tegra->devfreq->previous_freq = clk_get_rate(tegra->emc_clock) / KHZ; + tegra->devfreq->last_stat_updated = jiffies; + tegra->devfreq->stop_polling = false; + + actmon_writel(tegra, tegra->devfreq->profile->polling_ms - 1, ACTMON_GLB_PERIOD_CTRL); /* @@ -776,6 +784,11 @@ static void tegra_actmon_stop(struct tegra_devfreq *tegra) { unsigned int i; + if (tegra->devfreq->stop_polling) + return; + + mutex_unlock(&tegra->devfreq->lock); + disable_irq(tegra->irq); cpufreq_unregister_notifier(&tegra->cpu_rate_change_nb, @@ -783,10 +796,16 @@ static void tegra_actmon_stop(struct tegra_devfreq *tegra) cancel_delayed_work_sync(&tegra->cpufreq_update_work); + mutex_lock(&tegra->devfreq->lock); + for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) tegra_actmon_stop_device(&tegra->devices[i]); clk_notifier_unregister(tegra->emc_clock, &tegra->clk_rate_change_nb); + + devfreq_update_status(tegra->devfreq, tegra->devfreq->previous_freq); + + tegra->devfreq->stop_polling = true; } static int tegra_devfreq_target(struct device *dev, unsigned long *freq, @@ -846,7 +865,7 @@ static int tegra_devfreq_get_dev_status(struct device *dev, stat->busy_time *= 100 / BUS_SATURATION_RATIO; /* Number of cycles in a sampling period */ - stat->total_time = cur_freq * ACTMON_SAMPLING_PERIOD; + stat->total_time = cur_freq * tegra->devfreq->profile->polling_ms; stat->busy_time = min(stat->busy_time, stat->total_time); @@ -854,7 +873,7 @@ static int tegra_devfreq_get_dev_status(struct device *dev, } static struct devfreq_dev_profile tegra_devfreq_profile = { - .polling_ms = 0, + .polling_ms = ACTMON_SAMPLING_PERIOD, .target = tegra_devfreq_target, .get_dev_status = tegra_devfreq_get_dev_status, }; @@ -895,8 +914,11 @@ static int tegra_governor_event_handler(struct devfreq *devfreq, unsigned int event, void *data) { struct tegra_devfreq *tegra = dev_get_drvdata(devfreq->dev.parent); + unsigned int new_delay, *delay_ptr = data; int ret = 0; + mutex_lock(&devfreq->lock); + /* * Couple device with the governor early as it is needed at * the moment of governor's start (used by ISR). @@ -905,26 +927,33 @@ static int tegra_governor_event_handler(struct devfreq *devfreq, switch (event) { case DEVFREQ_GOV_START: - devfreq_monitor_start(devfreq); + devfreq->stop_polling = true; + /* fall through */ + case DEVFREQ_GOV_RESUME: ret = tegra_actmon_start(tegra); break; case DEVFREQ_GOV_STOP: - tegra_actmon_stop(tegra); - devfreq_monitor_stop(devfreq); - break; - + /* fall through */ case DEVFREQ_GOV_SUSPEND: tegra_actmon_stop(tegra); - devfreq_monitor_suspend(devfreq); break; - case DEVFREQ_GOV_RESUME: - devfreq_monitor_resume(devfreq); - ret = tegra_actmon_start(tegra); + case DEVFREQ_GOV_INTERVAL: + new_delay = *delay_ptr; + + if (!new_delay || new_delay > 256) { + ret = -EINVAL; + } else { + tegra_actmon_stop(tegra); + devfreq->profile->polling_ms = new_delay; + ret = tegra_actmon_start(tegra); + } break; } + mutex_unlock(&devfreq->lock); + return ret; } From patchwork Sun Aug 11 21:23:15 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1145416 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="P51t0m3r"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 466Bp85kj4z9sML for ; Mon, 12 Aug 2019 07:25:04 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726812AbfHKVYy (ORCPT ); Sun, 11 Aug 2019 17:24:54 -0400 Received: from mail-lj1-f195.google.com ([209.85.208.195]:36377 "EHLO mail-lj1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726789AbfHKVYx (ORCPT ); Sun, 11 Aug 2019 17:24:53 -0400 Received: by mail-lj1-f195.google.com with SMTP id u15so1645772ljl.3; Sun, 11 Aug 2019 14:24:52 -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=o7LGlq6WIVQMLtb/JEtFncARlenXInquAoE0QDVW21U=; b=P51t0m3rzz0PnQOdu2pOxpETktNoisJUH72+SbZPzsmw9KgYP1PMraJK99BR99qkxa Hcl1qqDbcvH/fE0z1IJom0SsGKljkT0HZKKWGUHqsC+Hjd4wTH5wQRxe5MCEKXHvY03y OqTJeUSCBF3h36AnAQHmFlc6KagyLk25Rt5YLzblEu0Zdd/GlSxivXawqJDX7qRKydxe X8Q47iE9OdFkXsASbni2Or/BQZxx0w047gDLhegRnwQsNjWFOd1BJBLDgm14556UJ/Zm TWxIs97EDiGpwhveypfNLeT3amBCtEHz5J+i18XKQn1aZfG2333mUsDDvibssXt+dtoR Po9g== 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=o7LGlq6WIVQMLtb/JEtFncARlenXInquAoE0QDVW21U=; b=IAgOUU5cnUOCyEj5rkDSBJ2QcB94Cl8ONdYPPBDCS3P3fRe3d3ody+1hQy5baxETJu buznkAggIBDQl/eCpzvTtvMuy4ptoZZei+GZAhokirHsLkmUqdCPWbCRX7odkBsWi7ox mfY7qOSevs7tmuGnR/OERfsocuVDBQazQHwrS+qH6YHMiMtsfHM5zDXoxGhf7vyh+lZ2 ihq6nv+i2D4sUB8qiOwPoVT2gk3Tlwv9oc+Z8ooIw03OfakJJXyYHh90/T9olqaBKs68 KVBdmaTiwPTj3VKPjNkGtqH6smnTnCKw0Kj2/764YeeOKtjnmwTLkwXqvhfiK9eqmTSf SnXw== X-Gm-Message-State: APjAAAVjCc+pYBXRI0NYI6SkDv3PyvKR6WopwP5Ac0uA55WeeCuaqcj1 /uxIQp6TU0slo+njOBwYzJU= X-Google-Smtp-Source: APXvYqwLe+JA9gDyV0I4Abvwjk3D+0Nufs1khKyHDrSKSFRdXMkl7MVQamMrjYtd6zjrlU56W0uF1Q== X-Received: by 2002:a2e:9b84:: with SMTP id z4mr17382353lji.75.1565558691639; Sun, 11 Aug 2019 14:24:51 -0700 (PDT) Received: from localhost.localdomain ([94.29.34.218]) by smtp.gmail.com with ESMTPSA id f1sm20470806ljk.86.2019.08.11.14.24.50 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Aug 2019 14:24:51 -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 v6 19/19] PM / devfreq: tegra20/30: Add Dmitry as a maintainer Date: Mon, 12 Aug 2019 00:23:15 +0300 Message-Id: <20190811212315.12689-20-digetx@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190811212315.12689-1-digetx@gmail.com> References: <20190811212315.12689-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 Tegra20+ devfreq drivers recently and want to help keep them working and evolving in the future. Acked-by: Chanwoo Choi Signed-off-by: Dmitry Osipenko --- MAINTAINERS | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index e60f5c361969..8a78abe4739e 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -10420,6 +10420,15 @@ F: include/linux/memblock.h F: mm/memblock.c F: Documentation/core-api/boot-time-mm.rst +MEMORY FREQUENCY SCALING DRIVERS FOR NVIDIA TEGRA +M: Dmitry Osipenko +L: linux-pm@vger.kernel.org +L: linux-tegra@vger.kernel.org +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mzx/devfreq.git +S: Maintained +F: drivers/devfreq/tegra20-devfreq.c +F: drivers/devfreq/tegra30-devfreq.c + MEMORY MANAGEMENT L: linux-mm@kvack.org W: http://www.linux-mm.org