All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dmitry Osipenko <digetx@gmail.com>
To: Chanwoo Choi <cw00.choi@samsung.com>,
	Thierry Reding <thierry.reding@gmail.com>,
	Jonathan Hunter <jonathanh@nvidia.com>,
	MyungJoo Ham <myungjoo.ham@samsung.com>,
	Kyungmin Park <kyungmin.park@samsung.com>,
	Tomeu Vizoso <tomeu.vizoso@collabora.com>
Cc: linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-pm@vger.kernel.org
Subject: Re: [PATCH v2 10/19] PM / devfreq: tegra: Drop primary interrupt handler
Date: Tue, 16 Apr 2019 18:23:10 +0300	[thread overview]
Message-ID: <286d8d4a-f761-93d3-8b77-cf71a7d0dab3@gmail.com> (raw)
In-Reply-To: <93574885-d695-2288-a4c6-2b845ad8daaf@samsung.com>

16.04.2019 8:56, Chanwoo Choi пишет:
> Hi,
> 
> It looks good to me to drop the primary interrupt handler
> but I have some comments. Please check it.
> 
> On 19. 4. 15. 오후 11:54, Dmitry Osipenko wrote:
>> There is no real need in the primary interrupt handler, hence move
>> everything to the secondary (threaded) handler. In a result locking
>> is consistent now and there are no potential races with the interrupt
>> handler because it is protected with the devfreq's mutex.
>>
>> Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
>> ---
>>  drivers/devfreq/tegra-devfreq.c | 61 ++++++++++++---------------------
>>  1 file changed, 22 insertions(+), 39 deletions(-)
>>
>> diff --git a/drivers/devfreq/tegra-devfreq.c b/drivers/devfreq/tegra-devfreq.c
>> index 2a1464098200..69b557df5084 100644
>> --- a/drivers/devfreq/tegra-devfreq.c
>> +++ b/drivers/devfreq/tegra-devfreq.c
>> @@ -144,7 +144,6 @@ static struct tegra_devfreq_device_config actmon_device_configs[] = {
>>  struct tegra_devfreq_device {
>>  	const struct tegra_devfreq_device_config *config;
>>  	void __iomem *regs;
>> -	spinlock_t lock;
>>  
>>  	/* Average event count sampled in the last interrupt */
>>  	u32 avg_count;
>> @@ -249,11 +248,8 @@ static void actmon_write_barrier(struct tegra_devfreq *tegra)
>>  static void actmon_isr_device(struct tegra_devfreq *tegra,
>>  			      struct tegra_devfreq_device *dev)
>>  {
>> -	unsigned long flags;
>>  	u32 intr_status, dev_ctrl;
>>  
>> -	spin_lock_irqsave(&dev->lock, flags);
>> -
>>  	dev->avg_count = device_readl(dev, ACTMON_DEV_AVG_COUNT);
>>  	tegra_devfreq_update_avg_wmark(tegra, dev);
>>  
>> @@ -302,26 +298,6 @@ static void actmon_isr_device(struct tegra_devfreq *tegra,
>>  	device_writel(dev, ACTMON_INTR_STATUS_CLEAR, ACTMON_DEV_INTR_STATUS);
>>  
>>  	actmon_write_barrier(tegra);
>> -
>> -	spin_unlock_irqrestore(&dev->lock, flags);
>> -}
>> -
>> -static irqreturn_t actmon_isr(int irq, void *data)
>> -{
>> -	struct tegra_devfreq *tegra = data;
>> -	bool handled = false;
>> -	unsigned int i;
>> -	u32 val;
>> -
>> -	val = actmon_readl(tegra, ACTMON_GLB_STATUS);
>> -	for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) {
>> -		if (val & tegra->devices[i].config->irq_mask) {
>> -			actmon_isr_device(tegra, tegra->devices + i);
>> -			handled = true;
>> -		}
>> -	}
>> -
>> -	return handled ? IRQ_WAKE_THREAD : IRQ_NONE;
>>  }
>>  
>>  static unsigned long actmon_cpu_to_emc_rate(struct tegra_devfreq *tegra,
>> @@ -348,35 +324,46 @@ static void actmon_update_target(struct tegra_devfreq *tegra,
>>  	unsigned long cpu_freq = 0;
>>  	unsigned long static_cpu_emc_freq = 0;
>>  	unsigned int avg_sustain_coef;
>> -	unsigned long flags;
>> +	u32 avg_count;
>>  
>>  	if (dev->config->avg_dependency_threshold) {
>>  		cpu_freq = cpufreq_get(0);
>>  		static_cpu_emc_freq = actmon_cpu_to_emc_rate(tegra, cpu_freq);
>>  	}
>>  
>> -	spin_lock_irqsave(&dev->lock, flags);
>> -
>> -	dev->target_freq = dev->avg_count / ACTMON_SAMPLING_PERIOD;
>> +	avg_count = dev->avg_count;
>> +	dev->target_freq = avg_count / ACTMON_SAMPLING_PERIOD;
> 
> Actually, this change is not related to this patch.
> Please keep the original code.
> 
>>  	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;
>>  
>> -	if (dev->avg_count >= dev->config->avg_dependency_threshold)
>> +	if (avg_count >= dev->config->avg_dependency_threshold)
> 
> ditto.

Good catch, it's a leftover from v1 that I forgot to revert. Thank you.

[snip]

> 
> When I review this patch, I have a question
> about why tegra_actmon_rate_notify_cb is needed.
> 
> tegra_actmon_rate_notify_cb() do something
> when the clock rate of emc_clock is changed.
> I think that 'emc_clock' is changed by this driver.
> It means that the this driver can catch the change timing
> of emc_clock rate without notifier. 

The devfreq driver isn't the only driver of the EMC clock rate. The devfreq driver changes EMC freq dynamically based of on average memory usage activity, but for some hardware units (like display controller for example) there is a requirement for a minimum memory bandwidth (isochronous transactions) and hence when display is waking up from suspend it immediately requires an amount of memory bandwidth that could be higher than ACTMON hardware unit suggests and besides the ACTMON's reaction is delayed by the sampling period (12ms).

> IMO, it is possible to call tegra_devfreq_update_wmark()
> directly without clock notifier before calling
> 'clk_set_min_rate()/clk_set_rate()' in the tegra_devfreq_target().
> 
> With clock notifier, it cannot restore something for
> tegra_devfreq_update_wmark(tegra, dev) when failed to
> set the rate of emc_clk by 'clk_set_min_rate()/clk_set_rate()'.

The watermarks should be changed in accordance to the actual EMC clock rate. Given that EMC rate could be changed by something else than the devfreq driver, we need to re-adjust the watermarks to the actual values after the EMC rate-change completion. Please note that the clock notifier uses the POST_RATE_CHANGE event that happens only after successful completion of EMC clock rate change.

  reply	other threads:[~2019-04-16 15:23 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-04-15 14:54 [PATCH v2 00/19] NVIDIA Tegra devfreq improvements and Tegra20/30 support Dmitry Osipenko
2019-04-15 14:54 ` [PATCH v2 01/19] PM / devfreq: tegra: Fix kHz to Hz conversion Dmitry Osipenko
2019-04-16  1:45   ` Chanwoo Choi
2019-04-16 13:24     ` Dmitry Osipenko
2019-04-15 14:54 ` [PATCH v2 02/19] PM / devfreq: tegra: Replace readl-writel with relaxed versions Dmitry Osipenko
2019-04-17  1:02   ` Chanwoo Choi
2019-04-15 14:54 ` [PATCH v2 03/19] PM / devfreq: tegra: Don't ignore clk errors Dmitry Osipenko
2019-04-16  1:52   ` Chanwoo Choi
2019-04-16 13:42     ` Dmitry Osipenko
2019-04-15 14:54 ` [PATCH v2 04/19] PM / devfreq: tegra: Don't set EMC clock rate to maximum on probe Dmitry Osipenko
2019-04-16  1:59   ` Chanwoo Choi
2019-04-16 13:44     ` Dmitry Osipenko
2019-04-15 14:54 ` [PATCH v2 05/19] PM / devfreq: tegra: Replace write memory barrier with the read barrier Dmitry Osipenko
2019-04-16  8:00   ` Chanwoo Choi
2019-04-16 13:57     ` Dmitry Osipenko
2019-04-17  0:55       ` Chanwoo Choi
2019-04-15 14:54 ` [PATCH v2 06/19] PM / devfreq: tegra: Fix missed error checking on devfreq initialization failure Dmitry Osipenko
2019-04-16  2:32   ` Chanwoo Choi
2019-04-16 14:29     ` Dmitry Osipenko
2019-04-17  1:01       ` Chanwoo Choi
2019-04-15 14:54 ` [PATCH v2 07/19] PM / devfreq: tegra: Register clk notifier in the end of driver's probe Dmitry Osipenko
2019-04-15 14:54 ` [PATCH v2 08/19] PM / devfreq: tegra: Remove OPP entries on driver removal Dmitry Osipenko
2019-04-15 14:54 ` [PATCH v2 09/19] PM / devfreq: tegra: Change interrupt request order Dmitry Osipenko
2019-04-15 14:54 ` [PATCH v2 10/19] PM / devfreq: tegra: Drop primary interrupt handler Dmitry Osipenko
2019-04-16  5:56   ` Chanwoo Choi
2019-04-16 15:23     ` Dmitry Osipenko [this message]
2019-04-17  0:31       ` Chanwoo Choi
2019-04-15 14:54 ` [PATCH v2 11/19] PM / devfreq: tegra: De-initialize properly on driver's probe error Dmitry Osipenko
2019-04-16  6:21   ` Chanwoo Choi
2019-04-15 14:54 ` [PATCH v2 12/19] PM / devfreq: tegra: Avoid inconsistency of current frequency value Dmitry Osipenko
2019-04-16  7:15   ` Chanwoo Choi
2019-04-16 15:40     ` Dmitry Osipenko
2019-04-17  0:35       ` Chanwoo Choi
2019-04-15 14:54 ` [PATCH v2 13/19] PM / devfreq: tegra: Mark ACTMON's governor as immutable Dmitry Osipenko
2019-04-16  7:17   ` Chanwoo Choi
2019-04-15 14:55 ` [PATCH v2 14/19] PM / devfreq: tegra: Move governor registration to driver's probe Dmitry Osipenko
2019-04-16  7:30   ` Chanwoo Choi
2019-04-15 14:55 ` [PATCH v2 15/19] PM / devfreq: tegra: Synchronize IRQ after masking it in hardware Dmitry Osipenko
2019-04-16  7:41   ` Chanwoo Choi
2019-04-16 15:42     ` Dmitry Osipenko
2019-04-15 14:55 ` [PATCH v2 16/19] PM / devfreq: tegra: Reconfigure hardware on governor's restart Dmitry Osipenko
2019-04-15 14:55 ` [PATCH v2 17/19] PM / devfreq: tegra: Support Tegra30 Dmitry Osipenko
2019-04-16  7:48   ` Chanwoo Choi
2019-04-16 15:49     ` Dmitry Osipenko
2019-04-17  0:28       ` Chanwoo Choi
2019-04-15 14:55 ` [PATCH v2 18/19] PM / devfreq: tegra: Enable COMPILE_TEST for the driver Dmitry Osipenko
2019-04-16  7:43   ` Chanwoo Choi
2019-04-16 15:52     ` Dmitry Osipenko
2019-04-17  0:27       ` Chanwoo Choi
2019-04-15 14:55 ` [PATCH v2 19/19] PM / devfreq: Introduce driver for NVIDIA Tegra20 Dmitry Osipenko
2019-04-16  8:31   ` Chanwoo Choi
2019-04-16 16:11     ` Dmitry Osipenko
2019-04-17  0:26       ` Chanwoo Choi
2019-04-17  9:36         ` Dmitry Osipenko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=286d8d4a-f761-93d3-8b77-cf71a7d0dab3@gmail.com \
    --to=digetx@gmail.com \
    --cc=cw00.choi@samsung.com \
    --cc=jonathanh@nvidia.com \
    --cc=kyungmin.park@samsung.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=linux-tegra@vger.kernel.org \
    --cc=myungjoo.ham@samsung.com \
    --cc=thierry.reding@gmail.com \
    --cc=tomeu.vizoso@collabora.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.