Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp754210pxu; Thu, 3 Dec 2020 11:45:09 -0800 (PST) X-Google-Smtp-Source: ABdhPJxQl8ZpiKu9ML3sbDmC7Cll72/Lk7PazXx+J8QP6kJ9P16TbZmEF8QtQg4uS6bjgL7oCR6F X-Received: by 2002:a50:d78f:: with SMTP id w15mr4335932edi.227.1607024709464; Thu, 03 Dec 2020 11:45:09 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1607024709; cv=none; d=google.com; s=arc-20160816; b=ZEjjR2/MSSQ+sW1OOgAvUbgFdS+29Zxf9542nCEh3DGM4w19FbuMxvmCqlAclnF53D ophSZopdWn49HqDSkeiia57n++8gQyfpczUmkcEcBIoEYj4afBM4xo2CFRyvGn20PHpz n5Fwub7+Kc4s6cBJBAcfKaGP7uZyJlWsMGaUV6z5XsrOu5CO36JQNN5BaCoIzBW46Y2B szUywgEkijjqXmixyzFGXOAGFQ1UrTBDs7At2+2IwMOpIyeCiLeG1fo+T/gv4+L2awrK Rh7zXmsO/XyCH6Z5Px6freYS3ni+yrOMN2zBbUgnsJkDVOtBAP3k26QKnlrov7PKrWwL WLUA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=3Y9KUYQXFWobegekZ4zPhL5ARhA2nWflhNK/oNr6bdk=; b=nMCz3sC28i+d7dIcvXqYhO57iPB3nbuZBMAr9FWgCB+0SpB9Iv7GOefONvaNvfpd0P sm5Nh23Q/J1DTk5tIjTz/X9r8RhFmDgl0UhiVbsLvRMC8r2vUuKJi9oJt+4ChQbcJRjo RwGFD+IsSzQchgwhRbJhWYKF80fuXKOJfALf5vaIW6N0Ud+pVm1dbGnciPb5cAP4yTir p5hUo2kx6JdjAdVmdx6WRz+/7SpuoqJMJVFzJnkTxBAOMxCaCzOJ497f35fyT8XrY6R4 QUckgzVgAkX+FrV5JBlXYlEQRZjSkaVqqKJooYtGp7W0qWhHyhnCt62HzF+XHYWnw8fX gFmQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=W1SMYDSw; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id q23si1922377edb.184.2020.12.03.11.44.46; Thu, 03 Dec 2020 11:45:09 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=W1SMYDSw; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731777AbgLCT0l (ORCPT + 99 others); Thu, 3 Dec 2020 14:26:41 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58052 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731657AbgLCT0T (ORCPT ); Thu, 3 Dec 2020 14:26:19 -0500 Received: from mail-lj1-x22a.google.com (mail-lj1-x22a.google.com [IPv6:2a00:1450:4864:20::22a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D087FC08E85F; Thu, 3 Dec 2020 11:25:04 -0800 (PST) Received: by mail-lj1-x22a.google.com with SMTP id r18so3846532ljc.2; Thu, 03 Dec 2020 11:25:04 -0800 (PST) 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=3Y9KUYQXFWobegekZ4zPhL5ARhA2nWflhNK/oNr6bdk=; b=W1SMYDSwQrazalVtKwzoZmkIVjBR7QZjIs/Z/b8avUZhobsWUwjfIUHhRp5PvqPlWn 9zJR/7aLT+pUdoZDG0GJ/nGsSIUvgk9qq2iOsjxXwfAs3hEaR++TzeOd3iJJS7f6cGGJ hHaGHEdZxtLCgon4c2H3Uan28dNicuZDuVUxy09LUeY4KR6S8zc4W0HWEzsZEp7jgXdT q/e6osqp4K+FFBITE/FDSZ85Umk0M5IbeirRjfGIiJNunr9GllFQCjAxJIzeQayZCWj9 fpJ3bn3CSyMTNOAO8WIyZMKDOGy0DbA+MkSbb4RnzfFOAJtzq+tz09xjCUq8C+TO9n2F CxoQ== 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=3Y9KUYQXFWobegekZ4zPhL5ARhA2nWflhNK/oNr6bdk=; b=DDvT9hvijPqfDzQoNw/HGUqdvyA5rheIjiqmmzpj6lDtgpQrbcWZvz1AkguIeEyhdY YkzHUS4FQIbk5cjLhP4yJVxsDrUcPo2fC/xtdbkBQM4XMi4Jyddwg2BhtTJv0xQyF6nP tRHdhQqq218DfKRbo4ld9brt1N5gBhdOPvGG7QgWSqlUZd34/bHCngNXJr5J1yugRcs1 VL4qjeLhAJVNnWleScAMyzfFmh2i99EeUn6RSoClx9e4h3vjN5sC9YJkrUERojdYQ3+Q l6ZwNF9JLjFKsJQt3JyGloW4n7aVKEtnPyRKCqEtzyLDRLWAPvVZ1vfdYTWEBRNTBEqt gliQ== X-Gm-Message-State: AOAM530ZrxjxIOOCYwsD+G2vWrio/cCnj5ovl1KomdDCfH9cNpDRb3MT dO+kjM8FH/0iij2RuZBMy3Y= X-Received: by 2002:a2e:b0d4:: with SMTP id g20mr1779527ljl.281.1607023503300; Thu, 03 Dec 2020 11:25:03 -0800 (PST) Received: from localhost.localdomain (109-252-192-53.dynamic.spd-mgts.ru. [109.252.192.53]) by smtp.gmail.com with ESMTPSA id z7sm861932lfq.50.2020.12.03.11.25.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 03 Dec 2020 11:25:02 -0800 (PST) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Georgi Djakov , Rob Herring , Michael Turquette , Stephen Boyd , Peter De Schrijver , MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Mikko Perttunen , Viresh Kumar , Peter Geis , Nicolas Chauvet , Krzysztof Kozlowski Cc: linux-tegra@vger.kernel.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org Subject: [PATCH v11 10/10] PM / devfreq: tegra30: Separate configurations per-SoC generation Date: Thu, 3 Dec 2020 22:24:39 +0300 Message-Id: <20201203192439.16177-11-digetx@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201203192439.16177-1-digetx@gmail.com> References: <20201203192439.16177-1-digetx@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Previously we were using count-weight of the T124 for T30 in order to get EMC clock rate that was reasonable for T30. In fact the count-weight should be x2 times smaller on T30, but then devfreq was producing a bit too low EMC clock rate for ISO memory clients, like display controller for example. Now both Tegra ACTMON and Tegra DRM display drivers support interconnect framework and display driver tells to ICC what a minimum memory bandwidth is needed, preventing FIFO underflows. Thus, now we can use a proper count-weight value for Tegra30 and MC_ALL device config needs a bit more aggressive boosting. Add a separate ACTMON driver configuration that is specific to Tegra30. Tested-by: Peter Geis Tested-by: Nicolas Chauvet Acked-by: Chanwoo Choi Signed-off-by: Dmitry Osipenko --- drivers/devfreq/tegra30-devfreq.c | 68 ++++++++++++++++++++++++------- 1 file changed, 54 insertions(+), 14 deletions(-) diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c index 145ef91ae092..117cad7968ab 100644 --- a/drivers/devfreq/tegra30-devfreq.c +++ b/drivers/devfreq/tegra30-devfreq.c @@ -57,13 +57,6 @@ #define ACTMON_BELOW_WMARK_WINDOW 3 #define ACTMON_BOOST_FREQ_STEP 16000 -/* - * Activity counter is incremented every 256 memory transactions, and each - * transaction takes 4 EMC clocks for Tegra124; So the COUNT_WEIGHT is - * 4 * 256 = 1024. - */ -#define ACTMON_COUNT_WEIGHT 0x400 - /* * ACTMON_AVERAGE_WINDOW_LOG2: default value for @DEV_CTRL_K_VAL, which * translates to 2 ^ (K_VAL + 1). ex: 2 ^ (6 + 1) = 128 @@ -111,7 +104,7 @@ enum tegra_actmon_device { MCCPU, }; -static const struct tegra_devfreq_device_config actmon_device_configs[] = { +static const struct tegra_devfreq_device_config tegra124_device_configs[] = { { /* MCALL: All memory accesses (including from the CPUs) */ .offset = 0x1c0, @@ -133,6 +126,28 @@ static const struct tegra_devfreq_device_config actmon_device_configs[] = { }, }; +static const struct tegra_devfreq_device_config tegra30_device_configs[] = { + { + /* MCALL: All memory accesses (including from the CPUs) */ + .offset = 0x1c0, + .irq_mask = 1 << 26, + .boost_up_coeff = 200, + .boost_down_coeff = 50, + .boost_up_threshold = 20, + .boost_down_threshold = 10, + }, + { + /* MCCPU: memory accesses from the CPUs */ + .offset = 0x200, + .irq_mask = 1 << 25, + .boost_up_coeff = 800, + .boost_down_coeff = 40, + .boost_up_threshold = 27, + .boost_down_threshold = 10, + .avg_dependency_threshold = 16000, /* 16MHz in kHz units */ + }, +}; + /** * struct tegra_devfreq_device - state specific to an ACTMON device * @@ -155,6 +170,12 @@ struct tegra_devfreq_device { unsigned long target_freq; }; +struct tegra_devfreq_soc_data { + const struct tegra_devfreq_device_config *configs; + /* Weight value for count measurements */ + unsigned int count_weight; +}; + struct tegra_devfreq { struct devfreq *devfreq; struct opp_table *opp_table; @@ -171,11 +192,13 @@ struct tegra_devfreq { struct delayed_work cpufreq_update_work; struct notifier_block cpu_rate_change_nb; - struct tegra_devfreq_device devices[ARRAY_SIZE(actmon_device_configs)]; + struct tegra_devfreq_device devices[2]; unsigned int irq; bool started; + + const struct tegra_devfreq_soc_data *soc; }; struct tegra_actmon_emc_ratio { @@ -488,7 +511,7 @@ static void tegra_actmon_configure_device(struct tegra_devfreq *tegra, tegra_devfreq_update_avg_wmark(tegra, dev); tegra_devfreq_update_wmark(tegra, dev); - device_writel(dev, ACTMON_COUNT_WEIGHT, ACTMON_DEV_COUNT_WEIGHT); + device_writel(dev, tegra->soc->count_weight, ACTMON_DEV_COUNT_WEIGHT); device_writel(dev, ACTMON_INTR_STATUS_CLEAR, ACTMON_DEV_INTR_STATUS); val |= ACTMON_DEV_CTRL_ENB_PERIODIC; @@ -779,6 +802,8 @@ static int tegra_devfreq_probe(struct platform_device *pdev) if (!tegra) return -ENOMEM; + tegra->soc = of_device_get_match_data(&pdev->dev); + tegra->regs = devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(tegra->regs)) return PTR_ERR(tegra->regs); @@ -852,9 +877,9 @@ static int tegra_devfreq_probe(struct platform_device *pdev) tegra->max_freq = rate / KHZ; - for (i = 0; i < ARRAY_SIZE(actmon_device_configs); i++) { + for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) { dev = tegra->devices + i; - dev->config = actmon_device_configs + i; + dev->config = tegra->soc->configs + i; dev->regs = tegra->regs + dev->config->offset; } @@ -916,9 +941,24 @@ static int tegra_devfreq_remove(struct platform_device *pdev) return 0; } +static const struct tegra_devfreq_soc_data tegra124_soc = { + .configs = tegra124_device_configs, + + /* + * Activity counter is incremented every 256 memory transactions, + * and each transaction takes 4 EMC clocks. + */ + .count_weight = 4 * 256, +}; + +static const struct tegra_devfreq_soc_data tegra30_soc = { + .configs = tegra30_device_configs, + .count_weight = 2 * 256, +}; + static const struct of_device_id tegra_devfreq_of_match[] = { - { .compatible = "nvidia,tegra30-actmon" }, - { .compatible = "nvidia,tegra124-actmon" }, + { .compatible = "nvidia,tegra30-actmon", .data = &tegra30_soc, }, + { .compatible = "nvidia,tegra124-actmon", .data = &tegra124_soc, }, { }, }; -- 2.29.2