Received: by 2002:a05:6a10:16a7:0:0:0:0 with SMTP id gp39csp4451139pxb; Tue, 10 Nov 2020 17:20:25 -0800 (PST) X-Google-Smtp-Source: ABdhPJzfRrcIvfoPdKff5T/kUTThDe3UChZljOIGkbk5ntelhR6KqTbNbvH484GEJedii1AVRkcS X-Received: by 2002:a17:906:40cb:: with SMTP id a11mr24138121ejk.217.1605057624973; Tue, 10 Nov 2020 17:20:24 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1605057624; cv=none; d=google.com; s=arc-20160816; b=Os7JMlz3wyApiXu/ruTl51kvA8Q9rJSDPLYQNMlv+1/zTZ9aOsy9CAZdbXKvBnSuIt DYECkOxCZ3imWP4A/TQ9kvwYk2H0ClZrgguQGsHPhP+2jpew0qw6VRZTZ43rN0TwoWzd 5u67Zd1+ysi1PQaiBi7fFlTPT28LZoXOELoRc1Fyq3ocKyosxcy4jrq6RN8iOrSEfMCr IZuVIRyRiBz0gJ8xvsfs3J5ka5s7hmE3FFn5/3Hi4sWvNrrGX6u3s2rjRzEa5FswX0nq hWrVuLzieptCLb57dL2tWO7ae2U7zUyGNOo6grfNzp31Vq/ZfacnYw5O47v0B5wCilhA 8K8A== 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=Dejh7lmuIs2BCjeD8ndvQApwvmyVhewJWcHAU0cSde8=; b=ZKIj/LXhz/OUiA3ba/sHUL8iaeyMxYeW6lr9yi5VzPgBKDG/74tj3O/aU7E9CF7XZL 8fGYY4vjLbFrRWddygYgrIlLDe/UcATs2T7ZCvIfRPOTHj1DOzSbi49u9iBth9cOBVPu yXAWf56XHRuZfNykcwfqp4YfraSzgVffKLpnjQkCdtF6gHyGpmplel89gQDA4akw7PFv uwguDUS2Bh96+iK8wGCtX2WYbFmNRGYjpeKpIu85UPG8gY1ruwslFyKswhThCFUtDjLG 2a/qXEaVKFZFh29DTrynI9Vz5PlGunXycIYDa/ZZmGnVRVPhkyDivJ7CYhV0wvjDkacX D4tA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=QjSBOZAR; 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 s21si300608ejb.142.2020.11.10.17.19.51; Tue, 10 Nov 2020 17:20:24 -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=QjSBOZAR; 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 S1732798AbgKKBPo (ORCPT + 99 others); Tue, 10 Nov 2020 20:15:44 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48796 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732783AbgKKBPk (ORCPT ); Tue, 10 Nov 2020 20:15:40 -0500 Received: from mail-wr1-x430.google.com (mail-wr1-x430.google.com [IPv6:2a00:1450:4864:20::430]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7D1DEC0613D4; Tue, 10 Nov 2020 17:15:39 -0800 (PST) Received: by mail-wr1-x430.google.com with SMTP id j7so748270wrp.3; Tue, 10 Nov 2020 17:15:39 -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=Dejh7lmuIs2BCjeD8ndvQApwvmyVhewJWcHAU0cSde8=; b=QjSBOZARcrdWJStH7uZPnvR6wLtwXmLilsBlXRNJ/q1uvotaTBIjVoTN7ljd97Uusc QTXN5BJ6dEjGVUTIzsGTZNxb+hGmZ1IVh1/PRHfa4fkcYeoh7tLJMBgbjoDDWpehJQzH iAxDepGc0TBPvoL0Ylm2u00qUbC9JI7/Y8B1UJpyZPGIvwVjGZ354wPonhlMQ56TDTGi 9oFjqXpFHEgPoWXfd3TSCmtZM3uU62A+ntXkiLYiWaIbmz2KRs5HPO2xqydWPIaB/H9v syrUtj6He3nLkmznOlbYPDypr9iWXhWxEpTdrlGmxbebrmQFeOaiphvRkDAAcTVJ6M4y IiyQ== 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=Dejh7lmuIs2BCjeD8ndvQApwvmyVhewJWcHAU0cSde8=; b=nkEL+OjIXznntXzOAjHeQwQItoT/lii8b0j4AGvYDFBEOCAmRb28ybtLFyXGMcZcrB GkcIVU/29H2j7x5sDiRpR3BK8ZB14WiBE8OFtPP7/S6/yYAoxMd7KQbK2WbsB9+VGW/V +IagZsjRApKb08yKf+2LERCLaWsifE69Ldtmt7KDnVUf1Y6/GjAIYHlf8iEtKmRDujph 11yIjYut9qrGFs2JdaM2CinlPektc0o/4AH3yNTTHo7T9H6NDGpKwceILB2tlhz5M/t5 MH7BSVhwmqhviAtbCC3FGkK0Gh+BZWNJGiR66zJx30pfaI2hUcNb4C7iyeQUOE2Px79m Xvjw== X-Gm-Message-State: AOAM533R5dYCLWhGL7YrlXnZNQeHkMeRf7xGxUz/Dch8ek+hEZU6HDO9 qGylJpTjV97H9sdAR9vemM0= X-Received: by 2002:adf:eb47:: with SMTP id u7mr26544953wrn.163.1605057338262; Tue, 10 Nov 2020 17:15:38 -0800 (PST) Received: from localhost.localdomain (109-252-193-159.dynamic.spd-mgts.ru. [109.252.193.159]) by smtp.gmail.com with ESMTPSA id g131sm564329wma.35.2020.11.10.17.15.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Nov 2020 17:15:37 -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 Subject: [PATCH v8 17/26] PM / devfreq: tegra30: Separate configurations per-SoC generation Date: Wed, 11 Nov 2020 04:14:47 +0300 Message-Id: <20201111011456.7875-18-digetx@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201111011456.7875-1-digetx@gmail.com> References: <20201111011456.7875-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 ed6d4469c8c7..36ba82c3898c 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; @@ -786,6 +809,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); @@ -859,9 +884,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; } @@ -923,9 +948,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