Message ID | 20241024203855.1584416-1-Frank.Li@nxp.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [1/1] i3c: master: svc: Modify enabled_events bit 7:0 to act as IBI enable counter | expand |
Hi Frank, Frank.Li@nxp.com wrote on Thu, 24 Oct 2024 16:38:55 -0400: > Fix issue where disabling IBI on one device disables the entire IBI > interrupt. Modify bit 7:0 of enabled_events to serve as an IBI enable Is this bitfield arbitrary? Is there a rationale behind it? > counter, ensuring that the system IBI interrupt is disabled only when all > I3C devices have IBI disabled. > > Cc: stable@kernel.org > Fixes: 7ff730ca458e ("i3c: master: svc: enable the interrupt in the enable ibi function") > Signed-off-by: Frank Li <Frank.Li@nxp.com> Anyway, Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com> Thanks, Miquèl
On Fri, Oct 25, 2024 at 09:53:18AM +0200, Miquel Raynal wrote: > Hi Frank, > > Frank.Li@nxp.com wrote on Thu, 24 Oct 2024 16:38:55 -0400: > > > Fix issue where disabling IBI on one device disables the entire IBI > > interrupt. Modify bit 7:0 of enabled_events to serve as an IBI enable > > Is this bitfield arbitrary? > > Is there a rationale behind it? Max devices number under a I3C bus is 128 because dynamic address is 7 bit. So 8 bits for it should be enough. Bit31 as hotjoin, Bit30 reserved as control switch request. Frank > > > counter, ensuring that the system IBI interrupt is disabled only when all > > I3C devices have IBI disabled. > > > > Cc: stable@kernel.org > > Fixes: 7ff730ca458e ("i3c: master: svc: enable the interrupt in the enable ibi function") > > Signed-off-by: Frank Li <Frank.Li@nxp.com> > > Anyway, > > Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com> > > Thanks, > Miquèl
Hi Frank, Frank.li@nxp.com wrote on Fri, 25 Oct 2024 10:00:50 -0400: > On Fri, Oct 25, 2024 at 09:53:18AM +0200, Miquel Raynal wrote: > > Hi Frank, > > > > Frank.Li@nxp.com wrote on Thu, 24 Oct 2024 16:38:55 -0400: > > > > > Fix issue where disabling IBI on one device disables the entire IBI > > > interrupt. Modify bit 7:0 of enabled_events to serve as an IBI enable > > > > Is this bitfield arbitrary? > > > > Is there a rationale behind it? > > Max devices number under a I3C bus is 128 because dynamic address is 7 bit. > So 8 bits for it should be enough. > > Bit31 as hotjoin, Bit30 reserved as control switch request. Makes sense. Thanks, Miquèl
Hello, On 24/10/2024 16:38:55-0400, Frank Li wrote: > Fix issue where disabling IBI on one device disables the entire IBI > interrupt. Modify bit 7:0 of enabled_events to serve as an IBI enable > counter, ensuring that the system IBI interrupt is disabled only when all > I3C devices have IBI disabled. > > Cc: stable@kernel.org > Fixes: 7ff730ca458e ("i3c: master: svc: enable the interrupt in the enable ibi function") > Signed-off-by: Frank Li <Frank.Li@nxp.com> This doesn't apply on i3c/next after applying your patches, can you rebase? > --- > drivers/i3c/master/svc-i3c-master.c | 10 +++++----- > 1 file changed, 5 insertions(+), 5 deletions(-) > > diff --git a/drivers/i3c/master/svc-i3c-master.c b/drivers/i3c/master/svc-i3c-master.c > index d1ebfba3739c1..66fe0fc12c897 100644 > --- a/drivers/i3c/master/svc-i3c-master.c > +++ b/drivers/i3c/master/svc-i3c-master.c > @@ -130,8 +130,8 @@ > /* This parameter depends on the implementation and may be tuned */ > #define SVC_I3C_FIFO_SIZE 16 > > -#define SVC_I3C_EVENT_IBI BIT(0) > -#define SVC_I3C_EVENT_HOTJOIN BIT(1) > +#define SVC_I3C_EVENT_IBI GENMASK(7, 0) > +#define SVC_I3C_EVENT_HOTJOIN BIT(31) > > struct svc_i3c_cmd { > u8 addr; > @@ -214,7 +214,7 @@ struct svc_i3c_master { > spinlock_t lock; > } ibi; > struct mutex lock; > - int enabled_events; > + u32 enabled_events; > }; > > /** > @@ -1532,7 +1532,7 @@ static int svc_i3c_master_enable_ibi(struct i3c_dev_desc *dev) > return ret; > } > > - master->enabled_events |= SVC_I3C_EVENT_IBI; > + master->enabled_events++; > svc_i3c_master_enable_interrupts(master, SVC_I3C_MINT_SLVSTART); > > return i3c_master_enec_locked(m, dev->info.dyn_addr, I3C_CCC_EVENT_SIR); > @@ -1544,7 +1544,7 @@ static int svc_i3c_master_disable_ibi(struct i3c_dev_desc *dev) > struct svc_i3c_master *master = to_svc_i3c_master(m); > int ret; > > - master->enabled_events &= ~SVC_I3C_EVENT_IBI; > + master->enabled_events--; > if (!master->enabled_events) > svc_i3c_master_disable_interrupts(master); > > -- > 2.34.1 >
diff --git a/drivers/i3c/master/svc-i3c-master.c b/drivers/i3c/master/svc-i3c-master.c index d1ebfba3739c1..66fe0fc12c897 100644 --- a/drivers/i3c/master/svc-i3c-master.c +++ b/drivers/i3c/master/svc-i3c-master.c @@ -130,8 +130,8 @@ /* This parameter depends on the implementation and may be tuned */ #define SVC_I3C_FIFO_SIZE 16 -#define SVC_I3C_EVENT_IBI BIT(0) -#define SVC_I3C_EVENT_HOTJOIN BIT(1) +#define SVC_I3C_EVENT_IBI GENMASK(7, 0) +#define SVC_I3C_EVENT_HOTJOIN BIT(31) struct svc_i3c_cmd { u8 addr; @@ -214,7 +214,7 @@ struct svc_i3c_master { spinlock_t lock; } ibi; struct mutex lock; - int enabled_events; + u32 enabled_events; }; /** @@ -1532,7 +1532,7 @@ static int svc_i3c_master_enable_ibi(struct i3c_dev_desc *dev) return ret; } - master->enabled_events |= SVC_I3C_EVENT_IBI; + master->enabled_events++; svc_i3c_master_enable_interrupts(master, SVC_I3C_MINT_SLVSTART); return i3c_master_enec_locked(m, dev->info.dyn_addr, I3C_CCC_EVENT_SIR); @@ -1544,7 +1544,7 @@ static int svc_i3c_master_disable_ibi(struct i3c_dev_desc *dev) struct svc_i3c_master *master = to_svc_i3c_master(m); int ret; - master->enabled_events &= ~SVC_I3C_EVENT_IBI; + master->enabled_events--; if (!master->enabled_events) svc_i3c_master_disable_interrupts(master);
Fix issue where disabling IBI on one device disables the entire IBI interrupt. Modify bit 7:0 of enabled_events to serve as an IBI enable counter, ensuring that the system IBI interrupt is disabled only when all I3C devices have IBI disabled. Cc: stable@kernel.org Fixes: 7ff730ca458e ("i3c: master: svc: enable the interrupt in the enable ibi function") Signed-off-by: Frank Li <Frank.Li@nxp.com> --- drivers/i3c/master/svc-i3c-master.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)