Re: [PATCH V6 01/21] irqchip: tegra: Do not disable COP IRQ during suspend

2019-08-02 Thread Dmitry Osipenko
02.08.2019 16:05, Peter De Schrijver пишет:
> On Thu, Jul 25, 2019 at 01:59:09PM +0300, Dmitry Osipenko wrote:
>> 25.07.2019 13:38, Peter De Schrijver пишет:
>>> On Thu, Jul 25, 2019 at 01:33:48PM +0300, Peter De Schrijver wrote:
 On Thu, Jul 25, 2019 at 01:05:13PM +0300, Dmitry Osipenko wrote:
> 25.07.2019 12:55, Peter De Schrijver пишет:
>> On Mon, Jul 22, 2019 at 12:54:51PM +0300, Dmitry Osipenko wrote:
>>>
>>> All Tegra SoCs support SC7, hence the 'supports_sc7' and the comment
>>> doesn't sound correct to me. Something like 'firmware_sc7' should suit
>>> better here.
>>>
 +  writel_relaxed(~0ul, ictlr + ICTLR_COP_IER_CLR);
>>>
>>> Secondly, I'm also not sure why COP interrupts need to be disabled for
>>> pre-T210 at all, since COP is unused. This looks to me like it was
>>> cut-n-pasted from downstream kernel without a good reason and could be
>>> simply removed.
>>
>> I don't think we can rely on the fact that COP is unused. People can
>> write their own code to run on COP.
>
> 1. Not upstream - doesn't matter.
>

 The code is not part of the kernel, so obviously it's not upstream?

> 2. That's not very good if something unknown is running on COP and then
> kernel suddenly intervenes, don't you think so?

 Unless the code was written with this in mind.

>>
>> In that case, please see 1. ;)
>>
> 
> In general the kernel should not touch the COP interrupts I think.
> 
>>>
>>> Looking at this again, I don't think we need to enable the IRQ at all.
>>
>> Could you please clarify? The code only saves/restores COP's interrupts
>> context across suspend-resume.
> 
> The sc7 entry firmware doesn't use interrupts.

Okay, it shouldn't hurt to clean up the LIC's code a tad by removing the
COP's bits, will make a patch.


Re: [PATCH V6 01/21] irqchip: tegra: Do not disable COP IRQ during suspend

2019-08-02 Thread Peter De Schrijver
On Thu, Jul 25, 2019 at 01:59:09PM +0300, Dmitry Osipenko wrote:
> 25.07.2019 13:38, Peter De Schrijver пишет:
> > On Thu, Jul 25, 2019 at 01:33:48PM +0300, Peter De Schrijver wrote:
> >> On Thu, Jul 25, 2019 at 01:05:13PM +0300, Dmitry Osipenko wrote:
> >>> 25.07.2019 12:55, Peter De Schrijver пишет:
>  On Mon, Jul 22, 2019 at 12:54:51PM +0300, Dmitry Osipenko wrote:
> >
> > All Tegra SoCs support SC7, hence the 'supports_sc7' and the comment
> > doesn't sound correct to me. Something like 'firmware_sc7' should suit
> > better here.
> >
> >> +  writel_relaxed(~0ul, ictlr + ICTLR_COP_IER_CLR);
> >
> > Secondly, I'm also not sure why COP interrupts need to be disabled for
> > pre-T210 at all, since COP is unused. This looks to me like it was
> > cut-n-pasted from downstream kernel without a good reason and could be
> > simply removed.
> 
>  I don't think we can rely on the fact that COP is unused. People can
>  write their own code to run on COP.
> >>>
> >>> 1. Not upstream - doesn't matter.
> >>>
> >>
> >> The code is not part of the kernel, so obviously it's not upstream?
> >>
> >>> 2. That's not very good if something unknown is running on COP and then
> >>> kernel suddenly intervenes, don't you think so?
> >>
> >> Unless the code was written with this in mind.
> >>
> 
> In that case, please see 1. ;)
> 

In general the kernel should not touch the COP interrupts I think.

> > 
> > Looking at this again, I don't think we need to enable the IRQ at all.
> 
> Could you please clarify? The code only saves/restores COP's interrupts
> context across suspend-resume.

The sc7 entry firmware doesn't use interrupts.

Peter.


Re: [PATCH V6 01/21] irqchip: tegra: Do not disable COP IRQ during suspend

2019-07-25 Thread Dmitry Osipenko
В Wed, 24 Jul 2019 16:09:53 -0700
Sowjanya Komatineni  пишет:

> On 7/22/19 4:35 PM, Dmitry Osipenko wrote:
> > 22.07.2019 21:38, Marc Zyngier пишет:  
> >> On Mon, 22 Jul 2019 09:21:21 -0700
> >> Sowjanya Komatineni  wrote:
> >>  
> >>> On 7/22/19 3:57 AM, Dmitry Osipenko wrote:  
>  22.07.2019 13:13, Marc Zyngier пишет:  
> > On 22/07/2019 10:54, Dmitry Osipenko wrote:  
> >> 21.07.2019 22:40, Sowjanya Komatineni пишет:  
> >>> Tegra210 platforms use sc7 entry firmware to program Tegra
> >>> LP0/SC7 entry sequence and sc7 entry firmware is run from
> >>> COP/BPMP-Lite.
> >>>
> >>> So, COP/BPMP-Lite still need IRQ function to finish SC7
> >>> suspend sequence for Tegra210.
> >>>
> >>> This patch has fix for leaving the COP IRQ enabled for
> >>> Tegra210 during interrupt controller suspend operation.
> >>>
> >>> Acked-by: Thierry Reding 
> >>> Signed-off-by: Sowjanya Komatineni 
> >>> ---
> >>>drivers/irqchip/irq-tegra.c | 20 ++--
> >>>1 file changed, 18 insertions(+), 2 deletions(-)
> >>>
> >>> diff --git a/drivers/irqchip/irq-tegra.c
> >>> b/drivers/irqchip/irq-tegra.c index
> >>> e1f771c72fc4..851f88cef508 100644 ---
> >>> a/drivers/irqchip/irq-tegra.c +++
> >>> b/drivers/irqchip/irq-tegra.c @@ -44,6 +44,7 @@ static
> >>> unsigned int num_ictlrs; 
> >>>struct tegra_ictlr_soc {
> >>>   unsigned int num_ictlrs;
> >>> + bool supports_sc7;
> >>>};
> >>>
> >>>static const struct tegra_ictlr_soc tegra20_ictlr_soc = {
> >>> @@ -56,6 +57,7 @@ static const struct tegra_ictlr_soc
> >>> tegra30_ictlr_soc = { 
> >>>static const struct tegra_ictlr_soc tegra210_ictlr_soc = {
> >>>   .num_ictlrs = 6,
> >>> + .supports_sc7 = true,
> >>>};
> >>>
> >>>static const struct of_device_id ictlr_matches[] = {
> >>> @@ -67,6 +69,7 @@ static const struct of_device_id
> >>> ictlr_matches[] = { 
> >>>struct tegra_ictlr_info {
> >>>   void __iomem *base[TEGRA_MAX_NUM_ICTLRS];
> >>> + const struct tegra_ictlr_soc *soc;
> >>>#ifdef CONFIG_PM_SLEEP
> >>>   u32 cop_ier[TEGRA_MAX_NUM_ICTLRS];
> >>>   u32 cop_iep[TEGRA_MAX_NUM_ICTLRS];
> >>> @@ -147,8 +150,20 @@ static int tegra_ictlr_suspend(void)
> >>>   lic->cop_ier[i] = readl_relaxed(ictlr +
> >>> ICTLR_COP_IER); lic->cop_iep[i] = readl_relaxed(ictlr +
> >>> ICTLR_COP_IEP_CLASS); 
> >>> - /* Disable COP interrupts */
> >>> - writel_relaxed(~0ul, ictlr +
> >>> ICTLR_COP_IER_CLR);
> >>> + /*
> >>> +  * AVP/COP/BPMP-Lite is the Tegra boot
> >>> processor.
> >>> +  *
> >>> +  * Tegra210 system suspend flow uses
> >>> sc7entry firmware which
> >>> +  * is executed by COP/BPMP and it includes
> >>> disabling COP IRQ,
> >>> +  * clamping CPU rail, turning off VDD_CPU,
> >>> and preparing the
> >>> +  * system to go to SC7/LP0.
> >>> +  *
> >>> +  * COP/BPMP wakes up when COP IRQ is
> >>> triggered and runs
> >>> +  * sc7entry-firmware. So need to keep COP
> >>> interrupt enabled.
> >>> +  */
> >>> + if (!lic->soc->supports_sc7)
> >>> + /* Disable COP interrupts if SC7 is
> >>> not supported */  
> >> All Tegra SoCs support SC7, hence the 'supports_sc7' and the
> >> comment doesn't sound correct to me. Something like
> >> 'firmware_sc7' should suit better here.  
> > If what you're saying is true, then the whole patch is wrong,
> > and the SC7 property should come from DT.  
>  It should be safe to assume that all of existing Tegra210
>  devices use the firmware for SC7, hence I wouldn't say that the
>  patch is entirely wrong. To me it's not entirely correct.  
> >>> Yes, all existing Tegra210 platforms uses sc7 entry firmware for
> >>> SC7 and AVP/COP IRQ need to be kept enabled as during suspend ATF
> >>> triggers IRQ to COP for SC7 entry fw execution.  
> > Okay, as I already wrote before, it looks to me that a more proper
> > solution should be to just remove everything related to COP from
> > this driver instead of adding custom quirks for T210.
> >
> > The disabling / restoring of COP interrupts should be relevant only
> > for the multimedia firmware on older Tegra SoCs. That firmware
> > won't be ever supported in the upstream simply because NVIDIA
> > abandoned the support for older hardware in the downstream and
> > because it is not possible due to some legal weirdness (IIUC). The
> > only variant for upstream is reverse-engineering of hardware (not
> > the firmware BLOB) and writing proper opensource drivers for the
> > upstream kernel, which we're already doing and 

Re: [PATCH V6 01/21] irqchip: tegra: Do not disable COP IRQ during suspend

2019-07-25 Thread Dmitry Osipenko
25.07.2019 13:38, Peter De Schrijver пишет:
> On Thu, Jul 25, 2019 at 01:33:48PM +0300, Peter De Schrijver wrote:
>> On Thu, Jul 25, 2019 at 01:05:13PM +0300, Dmitry Osipenko wrote:
>>> 25.07.2019 12:55, Peter De Schrijver пишет:
 On Mon, Jul 22, 2019 at 12:54:51PM +0300, Dmitry Osipenko wrote:
>
> All Tegra SoCs support SC7, hence the 'supports_sc7' and the comment
> doesn't sound correct to me. Something like 'firmware_sc7' should suit
> better here.
>
>> +writel_relaxed(~0ul, ictlr + ICTLR_COP_IER_CLR);
>
> Secondly, I'm also not sure why COP interrupts need to be disabled for
> pre-T210 at all, since COP is unused. This looks to me like it was
> cut-n-pasted from downstream kernel without a good reason and could be
> simply removed.

 I don't think we can rely on the fact that COP is unused. People can
 write their own code to run on COP.
>>>
>>> 1. Not upstream - doesn't matter.
>>>
>>
>> The code is not part of the kernel, so obviously it's not upstream?
>>
>>> 2. That's not very good if something unknown is running on COP and then
>>> kernel suddenly intervenes, don't you think so?
>>
>> Unless the code was written with this in mind.
>>

In that case, please see 1. ;)

> 
> Looking at this again, I don't think we need to enable the IRQ at all.

Could you please clarify? The code only saves/restores COP's interrupts
context across suspend-resume.

Again, that's absolutely useless code for the upstream kernel which
could be removed safely to avoid the confusion, IMHO. I can type a patch
if you're agreeing.


Re: [PATCH V6 01/21] irqchip: tegra: Do not disable COP IRQ during suspend

2019-07-25 Thread Peter De Schrijver
On Thu, Jul 25, 2019 at 01:33:48PM +0300, Peter De Schrijver wrote:
> On Thu, Jul 25, 2019 at 01:05:13PM +0300, Dmitry Osipenko wrote:
> > 25.07.2019 12:55, Peter De Schrijver пишет:
> > > On Mon, Jul 22, 2019 at 12:54:51PM +0300, Dmitry Osipenko wrote:
> > >>
> > >> All Tegra SoCs support SC7, hence the 'supports_sc7' and the comment
> > >> doesn't sound correct to me. Something like 'firmware_sc7' should suit
> > >> better here.
> > >>
> > >>> +   writel_relaxed(~0ul, ictlr + ICTLR_COP_IER_CLR);
> > >>
> > >> Secondly, I'm also not sure why COP interrupts need to be disabled for
> > >> pre-T210 at all, since COP is unused. This looks to me like it was
> > >> cut-n-pasted from downstream kernel without a good reason and could be
> > >> simply removed.
> > > 
> > > I don't think we can rely on the fact that COP is unused. People can
> > > write their own code to run on COP.
> > 
> > 1. Not upstream - doesn't matter.
> > 
> 
> The code is not part of the kernel, so obviously it's not upstream?
> 
> > 2. That's not very good if something unknown is running on COP and then
> > kernel suddenly intervenes, don't you think so?
> 
> Unless the code was written with this in mind.
> 

Looking at this again, I don't think we need to enable the IRQ at all.

Peter.


Re: [PATCH V6 01/21] irqchip: tegra: Do not disable COP IRQ during suspend

2019-07-25 Thread Peter De Schrijver
On Thu, Jul 25, 2019 at 01:05:13PM +0300, Dmitry Osipenko wrote:
> 25.07.2019 12:55, Peter De Schrijver пишет:
> > On Mon, Jul 22, 2019 at 12:54:51PM +0300, Dmitry Osipenko wrote:
> >>
> >> All Tegra SoCs support SC7, hence the 'supports_sc7' and the comment
> >> doesn't sound correct to me. Something like 'firmware_sc7' should suit
> >> better here.
> >>
> >>> + writel_relaxed(~0ul, ictlr + ICTLR_COP_IER_CLR);
> >>
> >> Secondly, I'm also not sure why COP interrupts need to be disabled for
> >> pre-T210 at all, since COP is unused. This looks to me like it was
> >> cut-n-pasted from downstream kernel without a good reason and could be
> >> simply removed.
> > 
> > I don't think we can rely on the fact that COP is unused. People can
> > write their own code to run on COP.
> 
> 1. Not upstream - doesn't matter.
> 

The code is not part of the kernel, so obviously it's not upstream?

> 2. That's not very good if something unknown is running on COP and then
> kernel suddenly intervenes, don't you think so?

Unless the code was written with this in mind.

Peter.


Re: [PATCH V6 01/21] irqchip: tegra: Do not disable COP IRQ during suspend

2019-07-25 Thread Dmitry Osipenko
25.07.2019 12:55, Peter De Schrijver пишет:
> On Mon, Jul 22, 2019 at 12:54:51PM +0300, Dmitry Osipenko wrote:
>>
>> All Tegra SoCs support SC7, hence the 'supports_sc7' and the comment
>> doesn't sound correct to me. Something like 'firmware_sc7' should suit
>> better here.
>>
>>> +   writel_relaxed(~0ul, ictlr + ICTLR_COP_IER_CLR);
>>
>> Secondly, I'm also not sure why COP interrupts need to be disabled for
>> pre-T210 at all, since COP is unused. This looks to me like it was
>> cut-n-pasted from downstream kernel without a good reason and could be
>> simply removed.
> 
> I don't think we can rely on the fact that COP is unused. People can
> write their own code to run on COP.

1. Not upstream - doesn't matter.

2. That's not very good if something unknown is running on COP and then
kernel suddenly intervenes, don't you think so?


Re: [PATCH V6 01/21] irqchip: tegra: Do not disable COP IRQ during suspend

2019-07-25 Thread Peter De Schrijver
On Mon, Jul 22, 2019 at 12:54:51PM +0300, Dmitry Osipenko wrote:
> 
> All Tegra SoCs support SC7, hence the 'supports_sc7' and the comment
> doesn't sound correct to me. Something like 'firmware_sc7' should suit
> better here.
> 
> > +   writel_relaxed(~0ul, ictlr + ICTLR_COP_IER_CLR);
> 
> Secondly, I'm also not sure why COP interrupts need to be disabled for
> pre-T210 at all, since COP is unused. This looks to me like it was
> cut-n-pasted from downstream kernel without a good reason and could be
> simply removed.

I don't think we can rely on the fact that COP is unused. People can
write their own code to run on COP.

Peter.


Re: [PATCH V6 01/21] irqchip: tegra: Do not disable COP IRQ during suspend

2019-07-24 Thread Sowjanya Komatineni



On 7/22/19 4:35 PM, Dmitry Osipenko wrote:

22.07.2019 21:38, Marc Zyngier пишет:

On Mon, 22 Jul 2019 09:21:21 -0700
Sowjanya Komatineni  wrote:


On 7/22/19 3:57 AM, Dmitry Osipenko wrote:

22.07.2019 13:13, Marc Zyngier пишет:

On 22/07/2019 10:54, Dmitry Osipenko wrote:

21.07.2019 22:40, Sowjanya Komatineni пишет:

Tegra210 platforms use sc7 entry firmware to program Tegra LP0/SC7 entry
sequence and sc7 entry firmware is run from COP/BPMP-Lite.

So, COP/BPMP-Lite still need IRQ function to finish SC7 suspend sequence
for Tegra210.

This patch has fix for leaving the COP IRQ enabled for Tegra210 during
interrupt controller suspend operation.

Acked-by: Thierry Reding 
Signed-off-by: Sowjanya Komatineni 
---
   drivers/irqchip/irq-tegra.c | 20 ++--
   1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/drivers/irqchip/irq-tegra.c b/drivers/irqchip/irq-tegra.c
index e1f771c72fc4..851f88cef508 100644
--- a/drivers/irqchip/irq-tegra.c
+++ b/drivers/irqchip/irq-tegra.c
@@ -44,6 +44,7 @@ static unsigned int num_ictlrs;
   
   struct tegra_ictlr_soc {

unsigned int num_ictlrs;
+   bool supports_sc7;
   };
   
   static const struct tegra_ictlr_soc tegra20_ictlr_soc = {

@@ -56,6 +57,7 @@ static const struct tegra_ictlr_soc tegra30_ictlr_soc = {
   
   static const struct tegra_ictlr_soc tegra210_ictlr_soc = {

.num_ictlrs = 6,
+   .supports_sc7 = true,
   };
   
   static const struct of_device_id ictlr_matches[] = {

@@ -67,6 +69,7 @@ static const struct of_device_id ictlr_matches[] = {
   
   struct tegra_ictlr_info {

void __iomem *base[TEGRA_MAX_NUM_ICTLRS];
+   const struct tegra_ictlr_soc *soc;
   #ifdef CONFIG_PM_SLEEP
u32 cop_ier[TEGRA_MAX_NUM_ICTLRS];
u32 cop_iep[TEGRA_MAX_NUM_ICTLRS];
@@ -147,8 +150,20 @@ static int tegra_ictlr_suspend(void)
lic->cop_ier[i] = readl_relaxed(ictlr + ICTLR_COP_IER);
lic->cop_iep[i] = readl_relaxed(ictlr + ICTLR_COP_IEP_CLASS);
   
-		/* Disable COP interrupts */

-   writel_relaxed(~0ul, ictlr + ICTLR_COP_IER_CLR);
+   /*
+* AVP/COP/BPMP-Lite is the Tegra boot processor.
+*
+* Tegra210 system suspend flow uses sc7entry firmware which
+* is executed by COP/BPMP and it includes disabling COP IRQ,
+* clamping CPU rail, turning off VDD_CPU, and preparing the
+* system to go to SC7/LP0.
+*
+* COP/BPMP wakes up when COP IRQ is triggered and runs
+* sc7entry-firmware. So need to keep COP interrupt enabled.
+*/
+   if (!lic->soc->supports_sc7)
+   /* Disable COP interrupts if SC7 is not supported */

All Tegra SoCs support SC7, hence the 'supports_sc7' and the comment
doesn't sound correct to me. Something like 'firmware_sc7' should suit
better here.

If what you're saying is true, then the whole patch is wrong, and the
SC7 property should come from DT.

It should be safe to assume that all of existing Tegra210 devices use
the firmware for SC7, hence I wouldn't say that the patch is entirely
wrong. To me it's not entirely correct.

Yes, all existing Tegra210 platforms uses sc7 entry firmware for SC7 and
AVP/COP IRQ need to be kept enabled as during suspend ATF triggers IRQ
to COP for SC7 entry fw execution.

Okay, as I already wrote before, it looks to me that a more proper
solution should be to just remove everything related to COP from this
driver instead of adding custom quirks for T210.

The disabling / restoring of COP interrupts should be relevant only for
the multimedia firmware on older Tegra SoCs. That firmware won't be ever
supported in the upstream simply because NVIDIA abandoned the support
for older hardware in the downstream and because it is not possible due
to some legal weirdness (IIUC). The only variant for upstream is
reverse-engineering of hardware (not the firmware BLOB) and writing
proper opensource drivers for the upstream kernel, which we're already
doing and have success to a some extent.


That's not the question. Dmitry says that the SC7 support is not a
property of the SoC, but mostly a platform decision on whether the
firmware supports SC7 or not.

To me, that's a clear indication that this should not be hardcoded in
the driver, but instead obtained dynamically, via DT or otherwise.

We already have an nvidia,suspend-mode property in the device-tree of
the Power Management Controller node (all Tegra SoCs) which defines what
suspending type is supported by a particular board.


+   writel_relaxed(~0ul, ictlr + ICTLR_COP_IER_CLR);

Secondly, I'm also not sure why COP interrupts need to be disabled for
pre-T210 at all, since COP is unused. This looks to me like it was
cut-n-pasted from downstream kernel without a good reason and could be
simply removed.

Please verify that this is actually the case. Tegra-2 

Re: [PATCH V6 01/21] irqchip: tegra: Do not disable COP IRQ during suspend

2019-07-22 Thread Dmitry Osipenko
22.07.2019 21:38, Marc Zyngier пишет:
> On Mon, 22 Jul 2019 09:21:21 -0700
> Sowjanya Komatineni  wrote:
> 
>> On 7/22/19 3:57 AM, Dmitry Osipenko wrote:
>>> 22.07.2019 13:13, Marc Zyngier пишет:  
 On 22/07/2019 10:54, Dmitry Osipenko wrote:  
> 21.07.2019 22:40, Sowjanya Komatineni пишет:  
>> Tegra210 platforms use sc7 entry firmware to program Tegra LP0/SC7 entry
>> sequence and sc7 entry firmware is run from COP/BPMP-Lite.
>>
>> So, COP/BPMP-Lite still need IRQ function to finish SC7 suspend sequence
>> for Tegra210.
>>
>> This patch has fix for leaving the COP IRQ enabled for Tegra210 during
>> interrupt controller suspend operation.
>>
>> Acked-by: Thierry Reding 
>> Signed-off-by: Sowjanya Komatineni 
>> ---
>>   drivers/irqchip/irq-tegra.c | 20 ++--
>>   1 file changed, 18 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/irqchip/irq-tegra.c b/drivers/irqchip/irq-tegra.c
>> index e1f771c72fc4..851f88cef508 100644
>> --- a/drivers/irqchip/irq-tegra.c
>> +++ b/drivers/irqchip/irq-tegra.c
>> @@ -44,6 +44,7 @@ static unsigned int num_ictlrs;
>>   
>>   struct tegra_ictlr_soc {
>>  unsigned int num_ictlrs;
>> +bool supports_sc7;
>>   };
>>   
>>   static const struct tegra_ictlr_soc tegra20_ictlr_soc = {
>> @@ -56,6 +57,7 @@ static const struct tegra_ictlr_soc tegra30_ictlr_soc 
>> = {
>>   
>>   static const struct tegra_ictlr_soc tegra210_ictlr_soc = {
>>  .num_ictlrs = 6,
>> +.supports_sc7 = true,
>>   };
>>   
>>   static const struct of_device_id ictlr_matches[] = {
>> @@ -67,6 +69,7 @@ static const struct of_device_id ictlr_matches[] = {
>>   
>>   struct tegra_ictlr_info {
>>  void __iomem *base[TEGRA_MAX_NUM_ICTLRS];
>> +const struct tegra_ictlr_soc *soc;
>>   #ifdef CONFIG_PM_SLEEP
>>  u32 cop_ier[TEGRA_MAX_NUM_ICTLRS];
>>  u32 cop_iep[TEGRA_MAX_NUM_ICTLRS];
>> @@ -147,8 +150,20 @@ static int tegra_ictlr_suspend(void)
>>  lic->cop_ier[i] = readl_relaxed(ictlr + ICTLR_COP_IER);
>>  lic->cop_iep[i] = readl_relaxed(ictlr + 
>> ICTLR_COP_IEP_CLASS);
>>   
>> -/* Disable COP interrupts */
>> -writel_relaxed(~0ul, ictlr + ICTLR_COP_IER_CLR);
>> +/*
>> + * AVP/COP/BPMP-Lite is the Tegra boot processor.
>> + *
>> + * Tegra210 system suspend flow uses sc7entry firmware 
>> which
>> + * is executed by COP/BPMP and it includes disabling 
>> COP IRQ,
>> + * clamping CPU rail, turning off VDD_CPU, and 
>> preparing the
>> + * system to go to SC7/LP0.
>> + *
>> + * COP/BPMP wakes up when COP IRQ is triggered and runs
>> + * sc7entry-firmware. So need to keep COP interrupt 
>> enabled.
>> + */
>> +if (!lic->soc->supports_sc7)
>> +/* Disable COP interrupts if SC7 is not 
>> supported */  
> All Tegra SoCs support SC7, hence the 'supports_sc7' and the comment
> doesn't sound correct to me. Something like 'firmware_sc7' should suit
> better here.  
 If what you're saying is true, then the whole patch is wrong, and the
 SC7 property should come from DT.  
>>> It should be safe to assume that all of existing Tegra210 devices use
>>> the firmware for SC7, hence I wouldn't say that the patch is entirely
>>> wrong. To me it's not entirely correct.  
>>
>> Yes, all existing Tegra210 platforms uses sc7 entry firmware for SC7 and 
>> AVP/COP IRQ need to be kept enabled as during suspend ATF triggers IRQ 
>> to COP for SC7 entry fw execution.

Okay, as I already wrote before, it looks to me that a more proper
solution should be to just remove everything related to COP from this
driver instead of adding custom quirks for T210.

The disabling / restoring of COP interrupts should be relevant only for
the multimedia firmware on older Tegra SoCs. That firmware won't be ever
supported in the upstream simply because NVIDIA abandoned the support
for older hardware in the downstream and because it is not possible due
to some legal weirdness (IIUC). The only variant for upstream is
reverse-engineering of hardware (not the firmware BLOB) and writing
proper opensource drivers for the upstream kernel, which we're already
doing and have success to a some extent.

> That's not the question. Dmitry says that the SC7 support is not a
> property of the SoC, but mostly a platform decision on whether the
> firmware supports SC7 or not.
> 
> To me, that's a clear indication that this should not be hardcoded in
> the driver, but instead obtained dynamically, via DT or otherwise.

We 

Re: [PATCH V6 01/21] irqchip: tegra: Do not disable COP IRQ during suspend

2019-07-22 Thread Marc Zyngier
On Mon, 22 Jul 2019 09:21:21 -0700
Sowjanya Komatineni  wrote:

> On 7/22/19 3:57 AM, Dmitry Osipenko wrote:
> > 22.07.2019 13:13, Marc Zyngier пишет:  
> >> On 22/07/2019 10:54, Dmitry Osipenko wrote:  
> >>> 21.07.2019 22:40, Sowjanya Komatineni пишет:  
>  Tegra210 platforms use sc7 entry firmware to program Tegra LP0/SC7 entry
>  sequence and sc7 entry firmware is run from COP/BPMP-Lite.
> 
>  So, COP/BPMP-Lite still need IRQ function to finish SC7 suspend sequence
>  for Tegra210.
> 
>  This patch has fix for leaving the COP IRQ enabled for Tegra210 during
>  interrupt controller suspend operation.
> 
>  Acked-by: Thierry Reding 
>  Signed-off-by: Sowjanya Komatineni 
>  ---
>    drivers/irqchip/irq-tegra.c | 20 ++--
>    1 file changed, 18 insertions(+), 2 deletions(-)
> 
>  diff --git a/drivers/irqchip/irq-tegra.c b/drivers/irqchip/irq-tegra.c
>  index e1f771c72fc4..851f88cef508 100644
>  --- a/drivers/irqchip/irq-tegra.c
>  +++ b/drivers/irqchip/irq-tegra.c
>  @@ -44,6 +44,7 @@ static unsigned int num_ictlrs;
>    
>    struct tegra_ictlr_soc {
>   unsigned int num_ictlrs;
>  +bool supports_sc7;
>    };
>    
>    static const struct tegra_ictlr_soc tegra20_ictlr_soc = {
>  @@ -56,6 +57,7 @@ static const struct tegra_ictlr_soc tegra30_ictlr_soc 
>  = {
>    
>    static const struct tegra_ictlr_soc tegra210_ictlr_soc = {
>   .num_ictlrs = 6,
>  +.supports_sc7 = true,
>    };
>    
>    static const struct of_device_id ictlr_matches[] = {
>  @@ -67,6 +69,7 @@ static const struct of_device_id ictlr_matches[] = {
>    
>    struct tegra_ictlr_info {
>   void __iomem *base[TEGRA_MAX_NUM_ICTLRS];
>  +const struct tegra_ictlr_soc *soc;
>    #ifdef CONFIG_PM_SLEEP
>   u32 cop_ier[TEGRA_MAX_NUM_ICTLRS];
>   u32 cop_iep[TEGRA_MAX_NUM_ICTLRS];
>  @@ -147,8 +150,20 @@ static int tegra_ictlr_suspend(void)
>   lic->cop_ier[i] = readl_relaxed(ictlr + ICTLR_COP_IER);
>   lic->cop_iep[i] = readl_relaxed(ictlr + 
>  ICTLR_COP_IEP_CLASS);
>    
>  -/* Disable COP interrupts */
>  -writel_relaxed(~0ul, ictlr + ICTLR_COP_IER_CLR);
>  +/*
>  + * AVP/COP/BPMP-Lite is the Tegra boot processor.
>  + *
>  + * Tegra210 system suspend flow uses sc7entry firmware 
>  which
>  + * is executed by COP/BPMP and it includes disabling 
>  COP IRQ,
>  + * clamping CPU rail, turning off VDD_CPU, and 
>  preparing the
>  + * system to go to SC7/LP0.
>  + *
>  + * COP/BPMP wakes up when COP IRQ is triggered and runs
>  + * sc7entry-firmware. So need to keep COP interrupt 
>  enabled.
>  + */
>  +if (!lic->soc->supports_sc7)
>  +/* Disable COP interrupts if SC7 is not 
>  supported */  
> >>> All Tegra SoCs support SC7, hence the 'supports_sc7' and the comment
> >>> doesn't sound correct to me. Something like 'firmware_sc7' should suit
> >>> better here.  
> >> If what you're saying is true, then the whole patch is wrong, and the
> >> SC7 property should come from DT.  
> > It should be safe to assume that all of existing Tegra210 devices use
> > the firmware for SC7, hence I wouldn't say that the patch is entirely
> > wrong. To me it's not entirely correct.  
> 
> Yes, all existing Tegra210 platforms uses sc7 entry firmware for SC7 and 
> AVP/COP IRQ need to be kept enabled as during suspend ATF triggers IRQ 
> to COP for SC7 entry fw execution.

That's not the question. Dmitry says that the SC7 support is not a
property of the SoC, but mostly a platform decision on whether the
firmware supports SC7 or not.

To me, that's a clear indication that this should not be hardcoded in
the driver, but instead obtained dynamically, via DT or otherwise.

> 
> 
>  +writel_relaxed(~0ul, ictlr + 
>  ICTLR_COP_IER_CLR);  
> >>> Secondly, I'm also not sure why COP interrupts need to be disabled for
> >>> pre-T210 at all, since COP is unused. This looks to me like it was
> >>> cut-n-pasted from downstream kernel without a good reason and could be
> >>> simply removed.  
> >> Please verify that this is actually the case. Tegra-2 definitely needed
> >> some level of poking, and I'm not keen on changing anything there until
> >> you (or someone else) has verified it on actual HW (see e307cc8941fc).  
> > Tested on Tegra20 and Tegra30, LP1 suspend-resume works perfectly fine
> > with all COP bits removed from the driver.
> >
> > AFAIK, the reason why downstream needed that disabling is that it uses
> 

Re: [PATCH V6 01/21] irqchip: tegra: Do not disable COP IRQ during suspend

2019-07-22 Thread Sowjanya Komatineni



On 7/22/19 3:57 AM, Dmitry Osipenko wrote:

22.07.2019 13:13, Marc Zyngier пишет:

On 22/07/2019 10:54, Dmitry Osipenko wrote:

21.07.2019 22:40, Sowjanya Komatineni пишет:

Tegra210 platforms use sc7 entry firmware to program Tegra LP0/SC7 entry
sequence and sc7 entry firmware is run from COP/BPMP-Lite.

So, COP/BPMP-Lite still need IRQ function to finish SC7 suspend sequence
for Tegra210.

This patch has fix for leaving the COP IRQ enabled for Tegra210 during
interrupt controller suspend operation.

Acked-by: Thierry Reding 
Signed-off-by: Sowjanya Komatineni 
---
  drivers/irqchip/irq-tegra.c | 20 ++--
  1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/drivers/irqchip/irq-tegra.c b/drivers/irqchip/irq-tegra.c
index e1f771c72fc4..851f88cef508 100644
--- a/drivers/irqchip/irq-tegra.c
+++ b/drivers/irqchip/irq-tegra.c
@@ -44,6 +44,7 @@ static unsigned int num_ictlrs;
  
  struct tegra_ictlr_soc {

unsigned int num_ictlrs;
+   bool supports_sc7;
  };
  
  static const struct tegra_ictlr_soc tegra20_ictlr_soc = {

@@ -56,6 +57,7 @@ static const struct tegra_ictlr_soc tegra30_ictlr_soc = {
  
  static const struct tegra_ictlr_soc tegra210_ictlr_soc = {

.num_ictlrs = 6,
+   .supports_sc7 = true,
  };
  
  static const struct of_device_id ictlr_matches[] = {

@@ -67,6 +69,7 @@ static const struct of_device_id ictlr_matches[] = {
  
  struct tegra_ictlr_info {

void __iomem *base[TEGRA_MAX_NUM_ICTLRS];
+   const struct tegra_ictlr_soc *soc;
  #ifdef CONFIG_PM_SLEEP
u32 cop_ier[TEGRA_MAX_NUM_ICTLRS];
u32 cop_iep[TEGRA_MAX_NUM_ICTLRS];
@@ -147,8 +150,20 @@ static int tegra_ictlr_suspend(void)
lic->cop_ier[i] = readl_relaxed(ictlr + ICTLR_COP_IER);
lic->cop_iep[i] = readl_relaxed(ictlr + ICTLR_COP_IEP_CLASS);
  
-		/* Disable COP interrupts */

-   writel_relaxed(~0ul, ictlr + ICTLR_COP_IER_CLR);
+   /*
+* AVP/COP/BPMP-Lite is the Tegra boot processor.
+*
+* Tegra210 system suspend flow uses sc7entry firmware which
+* is executed by COP/BPMP and it includes disabling COP IRQ,
+* clamping CPU rail, turning off VDD_CPU, and preparing the
+* system to go to SC7/LP0.
+*
+* COP/BPMP wakes up when COP IRQ is triggered and runs
+* sc7entry-firmware. So need to keep COP interrupt enabled.
+*/
+   if (!lic->soc->supports_sc7)
+   /* Disable COP interrupts if SC7 is not supported */

All Tegra SoCs support SC7, hence the 'supports_sc7' and the comment
doesn't sound correct to me. Something like 'firmware_sc7' should suit
better here.

If what you're saying is true, then the whole patch is wrong, and the
SC7 property should come from DT.

It should be safe to assume that all of existing Tegra210 devices use
the firmware for SC7, hence I wouldn't say that the patch is entirely
wrong. To me it's not entirely correct.


Yes, all existing Tegra210 platforms uses sc7 entry firmware for SC7 and 
AVP/COP IRQ need to be kept enabled as during suspend ATF triggers IRQ 
to COP for SC7 entry fw execution.




+   writel_relaxed(~0ul, ictlr + ICTLR_COP_IER_CLR);

Secondly, I'm also not sure why COP interrupts need to be disabled for
pre-T210 at all, since COP is unused. This looks to me like it was
cut-n-pasted from downstream kernel without a good reason and could be
simply removed.

Please verify that this is actually the case. Tegra-2 definitely needed
some level of poking, and I'm not keen on changing anything there until
you (or someone else) has verified it on actual HW (see e307cc8941fc).

Tested on Tegra20 and Tegra30, LP1 suspend-resume works perfectly fine
with all COP bits removed from the driver.

AFAIK, the reason why downstream needed that disabling is that it uses
proprietary firmware which is running on the COP and that firmware is
usually a BLOB audio/video DEC-ENC driver which doesn't cleanup
interrupts after itself. That firmware is not applicable for the
upstream kernel, hence there is no need to care about it.


Joseph, can you please shed some light here?


SC7 entry flow uses 3rd party ATF (arm-trusted FW) blob which is the one that 
actually loads SC7 entry firmware and triggers IRQ to AVP/COP which causes COP 
to wakeup and run SC7 entry FW.

So when SC7 support is enabled, IRQ need to be kept enabled and when SC7 FW 
starts execution, it will disable COP IRQ.




Re: [PATCH V6 01/21] irqchip: tegra: Do not disable COP IRQ during suspend

2019-07-22 Thread Dmitry Osipenko
22.07.2019 13:13, Marc Zyngier пишет:
> On 22/07/2019 10:54, Dmitry Osipenko wrote:
>> 21.07.2019 22:40, Sowjanya Komatineni пишет:
>>> Tegra210 platforms use sc7 entry firmware to program Tegra LP0/SC7 entry
>>> sequence and sc7 entry firmware is run from COP/BPMP-Lite.
>>>
>>> So, COP/BPMP-Lite still need IRQ function to finish SC7 suspend sequence
>>> for Tegra210.
>>>
>>> This patch has fix for leaving the COP IRQ enabled for Tegra210 during
>>> interrupt controller suspend operation.
>>>
>>> Acked-by: Thierry Reding 
>>> Signed-off-by: Sowjanya Komatineni 
>>> ---
>>>  drivers/irqchip/irq-tegra.c | 20 ++--
>>>  1 file changed, 18 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/drivers/irqchip/irq-tegra.c b/drivers/irqchip/irq-tegra.c
>>> index e1f771c72fc4..851f88cef508 100644
>>> --- a/drivers/irqchip/irq-tegra.c
>>> +++ b/drivers/irqchip/irq-tegra.c
>>> @@ -44,6 +44,7 @@ static unsigned int num_ictlrs;
>>>  
>>>  struct tegra_ictlr_soc {
>>> unsigned int num_ictlrs;
>>> +   bool supports_sc7;
>>>  };
>>>  
>>>  static const struct tegra_ictlr_soc tegra20_ictlr_soc = {
>>> @@ -56,6 +57,7 @@ static const struct tegra_ictlr_soc tegra30_ictlr_soc = {
>>>  
>>>  static const struct tegra_ictlr_soc tegra210_ictlr_soc = {
>>> .num_ictlrs = 6,
>>> +   .supports_sc7 = true,
>>>  };
>>>  
>>>  static const struct of_device_id ictlr_matches[] = {
>>> @@ -67,6 +69,7 @@ static const struct of_device_id ictlr_matches[] = {
>>>  
>>>  struct tegra_ictlr_info {
>>> void __iomem *base[TEGRA_MAX_NUM_ICTLRS];
>>> +   const struct tegra_ictlr_soc *soc;
>>>  #ifdef CONFIG_PM_SLEEP
>>> u32 cop_ier[TEGRA_MAX_NUM_ICTLRS];
>>> u32 cop_iep[TEGRA_MAX_NUM_ICTLRS];
>>> @@ -147,8 +150,20 @@ static int tegra_ictlr_suspend(void)
>>> lic->cop_ier[i] = readl_relaxed(ictlr + ICTLR_COP_IER);
>>> lic->cop_iep[i] = readl_relaxed(ictlr + ICTLR_COP_IEP_CLASS);
>>>  
>>> -   /* Disable COP interrupts */
>>> -   writel_relaxed(~0ul, ictlr + ICTLR_COP_IER_CLR);
>>> +   /*
>>> +* AVP/COP/BPMP-Lite is the Tegra boot processor.
>>> +*
>>> +* Tegra210 system suspend flow uses sc7entry firmware which
>>> +* is executed by COP/BPMP and it includes disabling COP IRQ,
>>> +* clamping CPU rail, turning off VDD_CPU, and preparing the
>>> +* system to go to SC7/LP0.
>>> +*
>>> +* COP/BPMP wakes up when COP IRQ is triggered and runs
>>> +* sc7entry-firmware. So need to keep COP interrupt enabled.
>>> +*/
>>> +   if (!lic->soc->supports_sc7)
>>> +   /* Disable COP interrupts if SC7 is not supported */
>>
>> All Tegra SoCs support SC7, hence the 'supports_sc7' and the comment
>> doesn't sound correct to me. Something like 'firmware_sc7' should suit
>> better here.
> 
> If what you're saying is true, then the whole patch is wrong, and the
> SC7 property should come from DT.

It should be safe to assume that all of existing Tegra210 devices use
the firmware for SC7, hence I wouldn't say that the patch is entirely
wrong. To me it's not entirely correct.

>>
>>> +   writel_relaxed(~0ul, ictlr + ICTLR_COP_IER_CLR);
>>
>> Secondly, I'm also not sure why COP interrupts need to be disabled for
>> pre-T210 at all, since COP is unused. This looks to me like it was
>> cut-n-pasted from downstream kernel without a good reason and could be
>> simply removed.
> 
> Please verify that this is actually the case. Tegra-2 definitely needed
> some level of poking, and I'm not keen on changing anything there until
> you (or someone else) has verified it on actual HW (see e307cc8941fc).

Tested on Tegra20 and Tegra30, LP1 suspend-resume works perfectly fine
with all COP bits removed from the driver.

AFAIK, the reason why downstream needed that disabling is that it uses
proprietary firmware which is running on the COP and that firmware is
usually a BLOB audio/video DEC-ENC driver which doesn't cleanup
interrupts after itself. That firmware is not applicable for the
upstream kernel, hence there is no need to care about it.

> Joseph, can you please shed some light here?



Re: [PATCH V6 01/21] irqchip: tegra: Do not disable COP IRQ during suspend

2019-07-22 Thread Marc Zyngier
On 22/07/2019 10:54, Dmitry Osipenko wrote:
> 21.07.2019 22:40, Sowjanya Komatineni пишет:
>> Tegra210 platforms use sc7 entry firmware to program Tegra LP0/SC7 entry
>> sequence and sc7 entry firmware is run from COP/BPMP-Lite.
>>
>> So, COP/BPMP-Lite still need IRQ function to finish SC7 suspend sequence
>> for Tegra210.
>>
>> This patch has fix for leaving the COP IRQ enabled for Tegra210 during
>> interrupt controller suspend operation.
>>
>> Acked-by: Thierry Reding 
>> Signed-off-by: Sowjanya Komatineni 
>> ---
>>  drivers/irqchip/irq-tegra.c | 20 ++--
>>  1 file changed, 18 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/irqchip/irq-tegra.c b/drivers/irqchip/irq-tegra.c
>> index e1f771c72fc4..851f88cef508 100644
>> --- a/drivers/irqchip/irq-tegra.c
>> +++ b/drivers/irqchip/irq-tegra.c
>> @@ -44,6 +44,7 @@ static unsigned int num_ictlrs;
>>  
>>  struct tegra_ictlr_soc {
>>  unsigned int num_ictlrs;
>> +bool supports_sc7;
>>  };
>>  
>>  static const struct tegra_ictlr_soc tegra20_ictlr_soc = {
>> @@ -56,6 +57,7 @@ static const struct tegra_ictlr_soc tegra30_ictlr_soc = {
>>  
>>  static const struct tegra_ictlr_soc tegra210_ictlr_soc = {
>>  .num_ictlrs = 6,
>> +.supports_sc7 = true,
>>  };
>>  
>>  static const struct of_device_id ictlr_matches[] = {
>> @@ -67,6 +69,7 @@ static const struct of_device_id ictlr_matches[] = {
>>  
>>  struct tegra_ictlr_info {
>>  void __iomem *base[TEGRA_MAX_NUM_ICTLRS];
>> +const struct tegra_ictlr_soc *soc;
>>  #ifdef CONFIG_PM_SLEEP
>>  u32 cop_ier[TEGRA_MAX_NUM_ICTLRS];
>>  u32 cop_iep[TEGRA_MAX_NUM_ICTLRS];
>> @@ -147,8 +150,20 @@ static int tegra_ictlr_suspend(void)
>>  lic->cop_ier[i] = readl_relaxed(ictlr + ICTLR_COP_IER);
>>  lic->cop_iep[i] = readl_relaxed(ictlr + ICTLR_COP_IEP_CLASS);
>>  
>> -/* Disable COP interrupts */
>> -writel_relaxed(~0ul, ictlr + ICTLR_COP_IER_CLR);
>> +/*
>> + * AVP/COP/BPMP-Lite is the Tegra boot processor.
>> + *
>> + * Tegra210 system suspend flow uses sc7entry firmware which
>> + * is executed by COP/BPMP and it includes disabling COP IRQ,
>> + * clamping CPU rail, turning off VDD_CPU, and preparing the
>> + * system to go to SC7/LP0.
>> + *
>> + * COP/BPMP wakes up when COP IRQ is triggered and runs
>> + * sc7entry-firmware. So need to keep COP interrupt enabled.
>> + */
>> +if (!lic->soc->supports_sc7)
>> +/* Disable COP interrupts if SC7 is not supported */
> 
> All Tegra SoCs support SC7, hence the 'supports_sc7' and the comment
> doesn't sound correct to me. Something like 'firmware_sc7' should suit
> better here.

If what you're saying is true, then the whole patch is wrong, and the
SC7 property should come from DT.

> 
>> +writel_relaxed(~0ul, ictlr + ICTLR_COP_IER_CLR);
> 
> Secondly, I'm also not sure why COP interrupts need to be disabled for
> pre-T210 at all, since COP is unused. This looks to me like it was
> cut-n-pasted from downstream kernel without a good reason and could be
> simply removed.

Please verify that this is actually the case. Tegra-2 definitely needed
some level of poking, and I'm not keen on changing anything there until
you (or someone else) has verified it on actual HW (see e307cc8941fc).

Joseph, can you please shed some light here?

M.
-- 
Jazz is not dead. It just smells funny...


Re: [PATCH V6 01/21] irqchip: tegra: Do not disable COP IRQ during suspend

2019-07-22 Thread Dmitry Osipenko
21.07.2019 22:40, Sowjanya Komatineni пишет:
> Tegra210 platforms use sc7 entry firmware to program Tegra LP0/SC7 entry
> sequence and sc7 entry firmware is run from COP/BPMP-Lite.
> 
> So, COP/BPMP-Lite still need IRQ function to finish SC7 suspend sequence
> for Tegra210.
> 
> This patch has fix for leaving the COP IRQ enabled for Tegra210 during
> interrupt controller suspend operation.
> 
> Acked-by: Thierry Reding 
> Signed-off-by: Sowjanya Komatineni 
> ---
>  drivers/irqchip/irq-tegra.c | 20 ++--
>  1 file changed, 18 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/irqchip/irq-tegra.c b/drivers/irqchip/irq-tegra.c
> index e1f771c72fc4..851f88cef508 100644
> --- a/drivers/irqchip/irq-tegra.c
> +++ b/drivers/irqchip/irq-tegra.c
> @@ -44,6 +44,7 @@ static unsigned int num_ictlrs;
>  
>  struct tegra_ictlr_soc {
>   unsigned int num_ictlrs;
> + bool supports_sc7;
>  };
>  
>  static const struct tegra_ictlr_soc tegra20_ictlr_soc = {
> @@ -56,6 +57,7 @@ static const struct tegra_ictlr_soc tegra30_ictlr_soc = {
>  
>  static const struct tegra_ictlr_soc tegra210_ictlr_soc = {
>   .num_ictlrs = 6,
> + .supports_sc7 = true,
>  };
>  
>  static const struct of_device_id ictlr_matches[] = {
> @@ -67,6 +69,7 @@ static const struct of_device_id ictlr_matches[] = {
>  
>  struct tegra_ictlr_info {
>   void __iomem *base[TEGRA_MAX_NUM_ICTLRS];
> + const struct tegra_ictlr_soc *soc;
>  #ifdef CONFIG_PM_SLEEP
>   u32 cop_ier[TEGRA_MAX_NUM_ICTLRS];
>   u32 cop_iep[TEGRA_MAX_NUM_ICTLRS];
> @@ -147,8 +150,20 @@ static int tegra_ictlr_suspend(void)
>   lic->cop_ier[i] = readl_relaxed(ictlr + ICTLR_COP_IER);
>   lic->cop_iep[i] = readl_relaxed(ictlr + ICTLR_COP_IEP_CLASS);
>  
> - /* Disable COP interrupts */
> - writel_relaxed(~0ul, ictlr + ICTLR_COP_IER_CLR);
> + /*
> +  * AVP/COP/BPMP-Lite is the Tegra boot processor.
> +  *
> +  * Tegra210 system suspend flow uses sc7entry firmware which
> +  * is executed by COP/BPMP and it includes disabling COP IRQ,
> +  * clamping CPU rail, turning off VDD_CPU, and preparing the
> +  * system to go to SC7/LP0.
> +  *
> +  * COP/BPMP wakes up when COP IRQ is triggered and runs
> +  * sc7entry-firmware. So need to keep COP interrupt enabled.
> +  */
> + if (!lic->soc->supports_sc7)
> + /* Disable COP interrupts if SC7 is not supported */

All Tegra SoCs support SC7, hence the 'supports_sc7' and the comment
doesn't sound correct to me. Something like 'firmware_sc7' should suit
better here.

> + writel_relaxed(~0ul, ictlr + ICTLR_COP_IER_CLR);

Secondly, I'm also not sure why COP interrupts need to be disabled for
pre-T210 at all, since COP is unused. This looks to me like it was
cut-n-pasted from downstream kernel without a good reason and could be
simply removed.

>   /* Disable CPU interrupts */
>   writel_relaxed(~0ul, ictlr + ICTLR_CPU_IER_CLR);
> @@ -339,6 +354,7 @@ static int __init tegra_ictlr_init(struct device_node 
> *node,
>   goto out_unmap;
>   }
>  
> + lic->soc = soc;
>   tegra_ictlr_syscore_init();
>  
>   pr_info("%pOF: %d interrupts forwarded to %pOF\n",
> 



Re: [PATCH V6 01/21] irqchip: tegra: Do not disable COP IRQ during suspend

2019-07-21 Thread Marc Zyngier
On Sun, 21 Jul 2019 12:40:40 -0700
Sowjanya Komatineni  wrote:

> Tegra210 platforms use sc7 entry firmware to program Tegra LP0/SC7 entry
> sequence and sc7 entry firmware is run from COP/BPMP-Lite.
> 
> So, COP/BPMP-Lite still need IRQ function to finish SC7 suspend sequence
> for Tegra210.
> 
> This patch has fix for leaving the COP IRQ enabled for Tegra210 during
> interrupt controller suspend operation.
> 
> Acked-by: Thierry Reding 
> Signed-off-by: Sowjanya Komatineni 

Acked-by: Marc Zyngier 

Please let me know how you want this to be merged (either via the
irqchip tree as a standalone patch, or as part of the series via
another tree).

Thanks,

M.
-- 
Without deviation from the norm, progress is not possible.


[PATCH V6 01/21] irqchip: tegra: Do not disable COP IRQ during suspend

2019-07-21 Thread Sowjanya Komatineni
Tegra210 platforms use sc7 entry firmware to program Tegra LP0/SC7 entry
sequence and sc7 entry firmware is run from COP/BPMP-Lite.

So, COP/BPMP-Lite still need IRQ function to finish SC7 suspend sequence
for Tegra210.

This patch has fix for leaving the COP IRQ enabled for Tegra210 during
interrupt controller suspend operation.

Acked-by: Thierry Reding 
Signed-off-by: Sowjanya Komatineni 
---
 drivers/irqchip/irq-tegra.c | 20 ++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/drivers/irqchip/irq-tegra.c b/drivers/irqchip/irq-tegra.c
index e1f771c72fc4..851f88cef508 100644
--- a/drivers/irqchip/irq-tegra.c
+++ b/drivers/irqchip/irq-tegra.c
@@ -44,6 +44,7 @@ static unsigned int num_ictlrs;
 
 struct tegra_ictlr_soc {
unsigned int num_ictlrs;
+   bool supports_sc7;
 };
 
 static const struct tegra_ictlr_soc tegra20_ictlr_soc = {
@@ -56,6 +57,7 @@ static const struct tegra_ictlr_soc tegra30_ictlr_soc = {
 
 static const struct tegra_ictlr_soc tegra210_ictlr_soc = {
.num_ictlrs = 6,
+   .supports_sc7 = true,
 };
 
 static const struct of_device_id ictlr_matches[] = {
@@ -67,6 +69,7 @@ static const struct of_device_id ictlr_matches[] = {
 
 struct tegra_ictlr_info {
void __iomem *base[TEGRA_MAX_NUM_ICTLRS];
+   const struct tegra_ictlr_soc *soc;
 #ifdef CONFIG_PM_SLEEP
u32 cop_ier[TEGRA_MAX_NUM_ICTLRS];
u32 cop_iep[TEGRA_MAX_NUM_ICTLRS];
@@ -147,8 +150,20 @@ static int tegra_ictlr_suspend(void)
lic->cop_ier[i] = readl_relaxed(ictlr + ICTLR_COP_IER);
lic->cop_iep[i] = readl_relaxed(ictlr + ICTLR_COP_IEP_CLASS);
 
-   /* Disable COP interrupts */
-   writel_relaxed(~0ul, ictlr + ICTLR_COP_IER_CLR);
+   /*
+* AVP/COP/BPMP-Lite is the Tegra boot processor.
+*
+* Tegra210 system suspend flow uses sc7entry firmware which
+* is executed by COP/BPMP and it includes disabling COP IRQ,
+* clamping CPU rail, turning off VDD_CPU, and preparing the
+* system to go to SC7/LP0.
+*
+* COP/BPMP wakes up when COP IRQ is triggered and runs
+* sc7entry-firmware. So need to keep COP interrupt enabled.
+*/
+   if (!lic->soc->supports_sc7)
+   /* Disable COP interrupts if SC7 is not supported */
+   writel_relaxed(~0ul, ictlr + ICTLR_COP_IER_CLR);
 
/* Disable CPU interrupts */
writel_relaxed(~0ul, ictlr + ICTLR_CPU_IER_CLR);
@@ -339,6 +354,7 @@ static int __init tegra_ictlr_init(struct device_node *node,
goto out_unmap;
}
 
+   lic->soc = soc;
tegra_ictlr_syscore_init();
 
pr_info("%pOF: %d interrupts forwarded to %pOF\n",
-- 
2.7.4