public inbox for linux-i3c@lists.infradead.org
 help / color / mirror / Atom feed
* [PATCH] i3c: dw: Disable IBI IRQ depends on hot-join and SIR enabling
@ 2024-01-19  5:45 Dylan Hung
  2024-02-18 23:32 ` Alexandre Belloni
  2024-05-01  6:22 ` Jeremy Kerr
  0 siblings, 2 replies; 7+ messages in thread
From: Dylan Hung @ 2024-01-19  5:45 UTC (permalink / raw)
  To: alexandre.belloni, jk, joel, u.kleine-koenig, gustavoars,
	krzysztof.kozlowski, zenghuchen, matt, linux-i3c, linux-kernel
  Cc: BMC-SW

Disable IBI IRQ signal and status only when hot-join and SIR enabling of
all target devices attached to the bus are disabled.

Fixes: e389b1d72a62 ("i3c: dw: Add support for in-band interrupts")

Signed-off-by: Dylan Hung <dylan_hung@aspeedtech.com>
---
 drivers/i3c/master/dw-i3c-master.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/i3c/master/dw-i3c-master.c b/drivers/i3c/master/dw-i3c-master.c
index ef5751e91cc9..276153e10f5a 100644
--- a/drivers/i3c/master/dw-i3c-master.c
+++ b/drivers/i3c/master/dw-i3c-master.c
@@ -1163,8 +1163,10 @@ static void dw_i3c_master_set_sir_enabled(struct dw_i3c_master *master,
 		global = reg == 0xffffffff;
 		reg &= ~BIT(idx);
 	} else {
-		global = reg == 0;
+		bool hj_rejected = !!(readl(master->regs + DEVICE_CTRL) & DEV_CTRL_HOT_JOIN_NACK);
+
 		reg |= BIT(idx);
+		global = (reg == 0xffffffff) && hj_rejected;
 	}
 	writel(reg, master->regs + IBI_SIR_REQ_REJECT);
 
-- 
2.25.1


-- 
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH] i3c: dw: Disable IBI IRQ depends on hot-join and SIR enabling
  2024-01-19  5:45 [PATCH] i3c: dw: Disable IBI IRQ depends on hot-join and SIR enabling Dylan Hung
@ 2024-02-18 23:32 ` Alexandre Belloni
  2024-05-01  6:22 ` Jeremy Kerr
  1 sibling, 0 replies; 7+ messages in thread
From: Alexandre Belloni @ 2024-02-18 23:32 UTC (permalink / raw)
  To: jk, joel, u.kleine-koenig, gustavoars, krzysztof.kozlowski,
	zenghuchen, matt, linux-i3c, linux-kernel, Dylan Hung
  Cc: BMC-SW

On Fri, 19 Jan 2024 13:45:47 +0800, Dylan Hung wrote:
> Disable IBI IRQ signal and status only when hot-join and SIR enabling of
> all target devices attached to the bus are disabled.
> 
> Fixes: e389b1d72a62 ("i3c: dw: Add support for in-band interrupts")
> 
> 

Applied, thanks!

[1/1] i3c: dw: Disable IBI IRQ depends on hot-join and SIR enabling
      https://git.kernel.org/abelloni/c/10201396ef64

Best regards,

-- 
Alexandre Belloni, co-owner and COO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

-- 
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] i3c: dw: Disable IBI IRQ depends on hot-join and SIR enabling
  2024-01-19  5:45 [PATCH] i3c: dw: Disable IBI IRQ depends on hot-join and SIR enabling Dylan Hung
  2024-02-18 23:32 ` Alexandre Belloni
@ 2024-05-01  6:22 ` Jeremy Kerr
  2024-05-02  5:24   ` Dylan Hung
  1 sibling, 1 reply; 7+ messages in thread
From: Jeremy Kerr @ 2024-05-01  6:22 UTC (permalink / raw)
  To: Dylan Hung, alexandre.belloni, joel, u.kleine-koenig, gustavoars,
	krzysztof.kozlowski, zenghuchen, matt, linux-i3c, linux-kernel
  Cc: BMC-SW

Hi Dylan,

Just a question on a prior patch you sent:

> Disable IBI IRQ signal and status only when hot-join and SIR enabling
> of all target devices attached to the bus are disabled.
> 
> Fixes: e389b1d72a62 ("i3c: dw: Add support for in-band interrupts")

[...]

> --- a/drivers/i3c/master/dw-i3c-master.c
> +++ b/drivers/i3c/master/dw-i3c-master.c
> @@ -1163,8 +1163,10 @@ static void dw_i3c_master_set_sir_enabled(struct dw_i3c_master *master,
>                 global = reg == 0xffffffff;
>                 reg &= ~BIT(idx);
>         } else {
> -               global = reg == 0;
> +               bool hj_rejected = !!(readl(master->regs + DEVICE_CTRL) & DEV_CTRL_HOT_JOIN_NACK);
> +
>                 reg |= BIT(idx);
> +               global = (reg == 0xffffffff) && hj_rejected;
>         }
>         writel(reg, master->regs + IBI_SIR_REQ_REJECT);
>  

My interpretation of this change is that we keep the "global" IBI irq
enabled if hot-join-nack is set (ie, always, because we don't support
hot join, and configure the hardware to nack all hot join requests).

However, we never enable the hot-join NACK interrupt - IBI_QUEUE_CTRL
bit 0 is never set. So I can't see how we would ever get an interrupt
for the hot join NACK case anyway. Because of that, this patch is just
keeping the IBI threshold interrupt always enabled for no reason.

Or is something else happening here? Is there another cause for the IBI
threshold IRQs?

Cheers,


Jeremy

-- 
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c

^ permalink raw reply	[flat|nested] 7+ messages in thread

* RE: [PATCH] i3c: dw: Disable IBI IRQ depends on hot-join and SIR enabling
  2024-05-01  6:22 ` Jeremy Kerr
@ 2024-05-02  5:24   ` Dylan Hung
  2024-05-06  5:09     ` Jeremy Kerr
  0 siblings, 1 reply; 7+ messages in thread
From: Dylan Hung @ 2024-05-02  5:24 UTC (permalink / raw)
  To: Jeremy Kerr, alexandre.belloni@bootlin.com, joel@jms.id.au,
	u.kleine-koenig@pengutronix.de, gustavoars@kernel.org,
	krzysztof.kozlowski@linaro.org, zenghuchen@google.com,
	matt@codeconstruct.com.au, linux-i3c@lists.infradead.org,
	linux-kernel@vger.kernel.org
  Cc: BMC-SW

Hi Jeremy,

> -----Original Message-----
> From: Jeremy Kerr <jk@codeconstruct.com.au>
> Sent: Wednesday, May 1, 2024 2:22 PM
> To: Dylan Hung <dylan_hung@aspeedtech.com>;
> alexandre.belloni@bootlin.com; joel@jms.id.au; u.kleine-
> koenig@pengutronix.de; gustavoars@kernel.org;
> krzysztof.kozlowski@linaro.org; zenghuchen@google.com;
> matt@codeconstruct.com.au; linux-i3c@lists.infradead.org; linux-
> kernel@vger.kernel.org
> Cc: BMC-SW <BMC-SW@aspeedtech.com>
> Subject: Re: [PATCH] i3c: dw: Disable IBI IRQ depends on hot-join and SIR
> enabling
> 
> Hi Dylan,
> 
> Just a question on a prior patch you sent:
> 
> > Disable IBI IRQ signal and status only when hot-join and SIR enabling
> > of all target devices attached to the bus are disabled.
> >
> > Fixes: e389b1d72a62 ("i3c: dw: Add support for in-band interrupts")
> 
> [...]
> 
> > --- a/drivers/i3c/master/dw-i3c-master.c
> > +++ b/drivers/i3c/master/dw-i3c-master.c
> > @@ -1163,8 +1163,10 @@ static void
> > dw_i3c_master_set_sir_enabled(struct dw_i3c_master *master,
> >                 global = reg == 0xffffffff;
> >                 reg &= ~BIT(idx);
> >         } else {
> > -               global = reg == 0;
> > +               bool hj_rejected = !!(readl(master->regs +
> > +DEVICE_CTRL) & DEV_CTRL_HOT_JOIN_NACK);
> > +
> >                 reg |= BIT(idx);
> > +               global = (reg == 0xffffffff) && hj_rejected;
> >         }
> >         writel(reg, master->regs + IBI_SIR_REQ_REJECT);
> >
>

```
	if (global)
		dw_i3c_master_enable_sir_signal(master, enable);
```

> My interpretation of this change is that we keep the "global" IBI irq enabled if
> hot-join-nack is set (ie, always, because we don't support hot join, and
> configure the hardware to nack all hot join requests).
> 
I would like to clarify the control logic, incorporating the principle of disabling the SIR interrupt signal:

Case 1:
When `DEV_CTRL_HOT_JOIN_NACK` is set, indicating `hj_rejected` is true, it signifies the controller's non-receptiveness to the hot-join event. Consequently, we can safely disable the SIR interrupt signal if none of the target devices request SIR (reg == 0xffffffff).

Case 2:
When `DEV_CTRL_HOT_JOIN_NACK` is unset, indicating `hj_rejected` is false, this indicates the controller's readiness to engage with the hot-join event. Therefore, it's imperative to keep the SIR interrupt signal enabled, even if not all target devices request SIR. In this case, `global` is false and `enable` is false.

Here's a summary table to illustrate the logic:

| enable | reg==0xffffffff? | hj_rejected? | global | result                            |
|---         |---                          |---                   |---         |---                                  |
| false     | true                      | true                | true     | disable SIR interrupt |
| false     | false                     | true                | false     | keep SIR interrupt    |
| false     | true                      | false               | false     | keep SIR interrupt    |
| false     | false                     | false               | false     | keep SIR interrupt    |

> However, we never enable the hot-join NACK interrupt - IBI_QUEUE_CTRL bit
> 0 is never set. So I can't see how we would ever get an interrupt for the hot
> join NACK case anyway. Because of that, this patch is just keeping the IBI
> threshold interrupt always enabled for no reason.
> 

Billy recently submitted a change to implement the hot-join enabling/disabling. Therefore, it is timely to consider the hot-join functionality.
https://patchwork.kernel.org/project/linux-i3c/patch/20240429073624.256830-1-billy_tsai@aspeedtech.com/

> Or is something else happening here? Is there another cause for the IBI
> threshold IRQs?
> 
> Cheers,
> 
> 
> Jeremy
-- 
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] i3c: dw: Disable IBI IRQ depends on hot-join and SIR enabling
  2024-05-02  5:24   ` Dylan Hung
@ 2024-05-06  5:09     ` Jeremy Kerr
  2024-05-06  5:48       ` Dylan Hung
  0 siblings, 1 reply; 7+ messages in thread
From: Jeremy Kerr @ 2024-05-06  5:09 UTC (permalink / raw)
  To: Dylan Hung, alexandre.belloni@bootlin.com, joel@jms.id.au,
	u.kleine-koenig@pengutronix.de, gustavoars@kernel.org,
	krzysztof.kozlowski@linaro.org, zenghuchen@google.com,
	matt@codeconstruct.com.au, linux-i3c@lists.infradead.org,
	linux-kernel@vger.kernel.org
  Cc: BMC-SW

Hi Dylan,

Thanks for the response! I have a couple of follow-up things though:

> > My interpretation of this change is that we keep the "global" IBI irq enabled if
> > hot-join-nack is set (ie, always, because we don't support hot join, and
> > configure the hardware to nack all hot join requests).
> > 
> I would like to clarify the control logic, incorporating the principle
> of disabling the SIR interrupt signal:
> 
> Case 1:
> When `DEV_CTRL_HOT_JOIN_NACK` is set, indicating `hj_rejected` is
> true, it signifies the controller's non-receptiveness to the hot-join
> event. Consequently, we can safely disable the SIR interrupt signal if
> none of the target devices request SIR (reg == 0xffffffff).
> 
> Case 2:
> When `DEV_CTRL_HOT_JOIN_NACK` is unset, indicating `hj_rejected` is
> false, this indicates the controller's readiness to engage with the
> hot-join event. Therefore, it's imperative to keep the SIR interrupt
> signal enabled, even if not all target devices request SIR. In this
> case, `global` is false and `enable` is false.

Yep, I see what you're doing there, but it looks like the correct state
would never be set if we're not enabling/disabling the IBIs separately;
with this code, we would only ever enable the SIR for the HJ if we
*also* happen to enable IBIs.

The initial state would be to have all SIRs masked.

> Billy recently submitted a change to implement the hot-join enabling/disabling. Therefore, it is timely to consider the hot-join functionality.
> https://patchwork.kernel.org/project/linux-i3c/patch/20240429073624.256830-1-billy_tsai@aspeedtech.com/

Yep, I saw that, excellent! It's next on my list to take a look at.

It's just a little unusual that we're enabling the HJ interrupt before
actually having the HJ support though.

Cheers,


Jeremy

-- 
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c

^ permalink raw reply	[flat|nested] 7+ messages in thread

* RE: [PATCH] i3c: dw: Disable IBI IRQ depends on hot-join and SIR enabling
  2024-05-06  5:09     ` Jeremy Kerr
@ 2024-05-06  5:48       ` Dylan Hung
  2024-05-06  6:58         ` Jeremy Kerr
  0 siblings, 1 reply; 7+ messages in thread
From: Dylan Hung @ 2024-05-06  5:48 UTC (permalink / raw)
  To: Jeremy Kerr, alexandre.belloni@bootlin.com, joel@jms.id.au,
	u.kleine-koenig@pengutronix.de, gustavoars@kernel.org,
	krzysztof.kozlowski@linaro.org, zenghuchen@google.com,
	matt@codeconstruct.com.au, linux-i3c@lists.infradead.org,
	linux-kernel@vger.kernel.org
  Cc: BMC-SW

Hi Jeremy,

> -----Original Message-----
> From: Jeremy Kerr <jk@codeconstruct.com.au>
> Sent: Monday, May 6, 2024 1:10 PM
> To: Dylan Hung <dylan_hung@aspeedtech.com>;
> alexandre.belloni@bootlin.com; joel@jms.id.au; u.kleine-
> koenig@pengutronix.de; gustavoars@kernel.org;
> krzysztof.kozlowski@linaro.org; zenghuchen@google.com;
> matt@codeconstruct.com.au; linux-i3c@lists.infradead.org; linux-
> kernel@vger.kernel.org
> Cc: BMC-SW <BMC-SW@aspeedtech.com>
> Subject: Re: [PATCH] i3c: dw: Disable IBI IRQ depends on hot-join and SIR
> enabling
> 
> Hi Dylan,
> 
> Thanks for the response! I have a couple of follow-up things though:
> 
> > > My interpretation of this change is that we keep the "global" IBI
> > > irq enabled if hot-join-nack is set (ie, always, because we don't
> > > support hot join, and configure the hardware to nack all hot join
> requests).
> > >
> > I would like to clarify the control logic, incorporating the principle
> > of disabling the SIR interrupt signal:
> >
> > Case 1:
> > When `DEV_CTRL_HOT_JOIN_NACK` is set, indicating `hj_rejected` is
> > true, it signifies the controller's non-receptiveness to the hot-join
> > event. Consequently, we can safely disable the SIR interrupt signal if
> > none of the target devices request SIR (reg == 0xffffffff).
> >
> > Case 2:
> > When `DEV_CTRL_HOT_JOIN_NACK` is unset, indicating `hj_rejected` is
> > false, this indicates the controller's readiness to engage with the
> > hot-join event. Therefore, it's imperative to keep the SIR interrupt
> > signal enabled, even if not all target devices request SIR. In this
> > case, `global` is false and `enable` is false.
> 
> Yep, I see what you're doing there, but it looks like the correct state would
> never be set if we're not enabling/disabling the IBIs separately; with this code,
> we would only ever enable the SIR for the HJ if we
> *also* happen to enable IBIs.

When we want to enable the SIR, the current code doesn't check whether the
hot-join is enable or not. The modification I made pertains to disabling the SIR interrupt.
It doesn't alter the logic for enabling the SIR.

```
	reg = readl(master->regs + IBI_SIR_REQ_REJECT);
	if (enable) {
		global = reg == 0xffffffff;
		reg &= ~BIT(idx);
	}
```

> 
> The initial state would be to have all SIRs masked.
> 

Yes, indeed. The "global" variable is also true because "reg == 0xffffffff" is true.
Therefore, the INTR_IBI_THLD_STAT bit will be set in the following code.

> > Billy recently submitted a change to implement the hot-join
> enabling/disabling. Therefore, it is timely to consider the hot-join
> functionality.
> > https://patchwork.kernel.org/project/linux-i3c/patch/20240429073624.25
> > 6830-1-billy_tsai@aspeedtech.com/
> 
> Yep, I saw that, excellent! It's next on my list to take a look at.
> 
> It's just a little unusual that we're enabling the HJ interrupt before actually
> having the HJ support though.
> 
> Cheers,
> 
> 
> Jeremy
-- 
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] i3c: dw: Disable IBI IRQ depends on hot-join and SIR enabling
  2024-05-06  5:48       ` Dylan Hung
@ 2024-05-06  6:58         ` Jeremy Kerr
  0 siblings, 0 replies; 7+ messages in thread
From: Jeremy Kerr @ 2024-05-06  6:58 UTC (permalink / raw)
  To: Dylan Hung, alexandre.belloni@bootlin.com, joel@jms.id.au,
	u.kleine-koenig@pengutronix.de, gustavoars@kernel.org,
	krzysztof.kozlowski@linaro.org, zenghuchen@google.com,
	matt@codeconstruct.com.au, linux-i3c@lists.infradead.org,
	linux-kernel@vger.kernel.org
  Cc: BMC-SW

Hi Dylan,

> > The initial state would be to have all SIRs masked.
> > 
> 
> Yes, indeed. The "global" variable is also true because "reg ==
> 0xffffffff" is true.
> Therefore, the INTR_IBI_THLD_STAT bit will be set in the following
> code.

That's mainly my point - none of this code is ever run unless the
->enable_ibi or ->disable_ibi controller callback is invoked.

So we'll end up with the HJ interrupt only being enabled if some i3c
device driver enables IBIs, which is a bit of a weird side-effect.

It probably makes more sense when the rest of the HJ code is added, but
not so much as a standalone patch.

Cheers,


Jeremy

-- 
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2024-05-06  6:58 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-01-19  5:45 [PATCH] i3c: dw: Disable IBI IRQ depends on hot-join and SIR enabling Dylan Hung
2024-02-18 23:32 ` Alexandre Belloni
2024-05-01  6:22 ` Jeremy Kerr
2024-05-02  5:24   ` Dylan Hung
2024-05-06  5:09     ` Jeremy Kerr
2024-05-06  5:48       ` Dylan Hung
2024-05-06  6:58         ` Jeremy Kerr

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox