[PATCH] bsps/powerpc: Introduction of interrupt locks

Chris Johns chrisj at rtems.org
Thu Apr 18 02:04:51 UTC 2024


Hi Vincenzo,

Welcome to RTEMS.

What hardware in the shared VME PowerPC family of BSPS has this change been
tested on?

Thanks
Chris

On 17/4/2024 5:34 pm, Vincenzo Calabretta wrote:
> Interrupt locks are introduced in shared vme device drivers to enable
> compilation in an SMP configuration of the qoriq BSP.
> ---
>  bsps/powerpc/shared/vme/vmeTsi148.c   | 44 ++++++++++++++-------------
>  bsps/powerpc/shared/vme/vmeUniverse.c | 40 +++++++++++++-----------
>  2 files changed, 45 insertions(+), 39 deletions(-)
> 
> diff --git a/bsps/powerpc/shared/vme/vmeTsi148.c b/bsps/powerpc/shared/vme/vmeTsi148.c
> index aaabb1b28d..a6f0ac87ab 100644
> --- a/bsps/powerpc/shared/vme/vmeTsi148.c
> +++ b/bsps/powerpc/shared/vme/vmeTsi148.c
> @@ -545,16 +545,17 @@ vmeTsi148Reset(void)
>  	vmeTsi148ResetXX(THEBASE);
>  }
>  
> +RTEMS_INTERRUPT_LOCK_DEFINE( static, vmeTsi148_lock, "vmeTsi148_lock" )
>  void
>  vmeTsi148ResetBusXX(BERegister *base)
>  {
> -unsigned long flags;
>  uint32_t      v;
> +rtems_interrupt_lock_context lock_context;
>  
> -	rtems_interrupt_disable(flags);
> +  	rtems_interrupt_lock_acquire( &vmeTsi148_lock, &lock_context );
>  	v = TSI_RD(base, TSI_VCTRL_REG);
>  	TSI_WR(base, TSI_VCTRL_REG, v | TSI_VCTRL_SRESET);
> -	rtems_interrupt_enable(flags);
> +	rtems_interrupt_lock_release( &vmeTsi148_lock, &lock_context );
>  }
>  
>  void
> @@ -1410,7 +1411,8 @@ int
>  vmeTsi148IntRoute(unsigned int level, unsigned int pin)
>  {
>  int				i;
> -unsigned long	mask, shift, mapreg, flags, wire;
> +unsigned long	mask, shift, mapreg, wire;
> +rtems_interrupt_lock_context lock_context;
>  
>  	if ( pin >= TSI_NUM_WIRES || ! tsi_wire[pin] || !vmeTsi148IrqMgrInstalled )
>  		return -1;
> @@ -1442,8 +1444,7 @@ unsigned long	mask, shift, mapreg, flags, wire;
>  	/* wires are offset by 1 so we can initialize the wire table to all zeros */
>  	wire = (tsi_wire[pin]-1) << shift;
>  
> -rtems_interrupt_disable(flags);
> -
> +	rtems_interrupt_lock_acquire( &vmeTsi148_lock, &lock_context );
>  	for ( i = 0; i<TSI_NUM_WIRES; i++ ) {
>  		wire_mask[i] &= ~mask;
>  	}
> @@ -1453,7 +1454,7 @@ rtems_interrupt_disable(flags);
>  	mask |= wire;
>  	TSI_WR( THEBASE, mapreg, mask );
>  
> -rtems_interrupt_enable(flags);
> +	rtems_interrupt_lock_release( &vmeTsi148_lock, &lock_context );
>  	return 0;
>  }
>  
> @@ -1461,9 +1462,9 @@ VmeTsi148ISR
>  vmeTsi148ISRGet(unsigned long vector, void **parg)
>  {
>  VmeTsi148ISR	  rval = 0;
> -unsigned long	  flags;
>  volatile IRQEntry *p;
>  int               v = uni2tsivec(vector);
> +rtems_interrupt_lock_context lock_context;
>  
>  
>  	if ( v < 0 )
> @@ -1471,13 +1472,13 @@ int               v = uni2tsivec(vector);
>  
>  	p = irqHdlTbl + v;
>  
> -	rtems_interrupt_disable(flags);
> +	rtems_interrupt_lock_acquire( &vmeTsi148_lock, &lock_context );
>  		if ( *p ) {
>  			if ( parg )
>  				*parg = (*p)->usrData;
>  			rval = (*p)->isr;
>  		}
> -	rtems_interrupt_enable(flags);
> +	rtems_interrupt_lock_release( &vmeTsi148_lock, &lock_context );
>  
>  	return rval;
>  }
> @@ -1794,8 +1795,8 @@ vmeTsi148InstallISR(unsigned long vector, VmeTsi148ISR hdl, void *arg)
>  {
>  IRQEntry          ip;
>  int				  v;
> -unsigned long	  flags;
>  volatile IRQEntry *p;
> +rtems_interrupt_lock_context lock_context;
>  
>  		if ( !vmeTsi148IrqMgrInstalled || (v = uni2tsivec(vector)) < 0 )
>  			return -1;
> @@ -1808,14 +1809,14 @@ volatile IRQEntry *p;
>  		ip->isr=hdl;
>  		ip->usrData=arg;
>  
> -		rtems_interrupt_disable(flags);
> +		rtems_interrupt_lock_acquire( &vmeTsi148_lock, &lock_context );
>  		if (*p) {
> -			rtems_interrupt_enable(flags);
> +			rtems_interrupt_lock_release( &vmeTsi148_lock, &lock_context );
>  			free(ip);
>  			return -1;
>  		}
>  		*p = ip;
> -		rtems_interrupt_enable(flags);
> +		rtems_interrupt_lock_release( &vmeTsi148_lock, &lock_context );
>  		return 0;
>  }
>  
> @@ -1824,22 +1825,22 @@ vmeTsi148RemoveISR(unsigned long vector, VmeTsi148ISR hdl, void *arg)
>  {
>  int               v;
>  IRQEntry          ip;
> -unsigned long     flags;
>  volatile IRQEntry *p;
> +rtems_interrupt_lock_context lock_context;
>  
>  		if ( !vmeTsi148IrqMgrInstalled || (v = uni2tsivec(vector)) < 0 )
>  			return -1;
>  
>  		p = irqHdlTbl + v;
>  
> -		rtems_interrupt_disable(flags);
> +		rtems_interrupt_lock_acquire( &vmeTsi148_lock, &lock_context );
>  		ip = *p;
>  		if ( !ip || ip->isr!=hdl || ip->usrData!=arg ) {
> -				rtems_interrupt_enable(flags);
> +				rtems_interrupt_lock_release( &vmeTsi148_lock, &lock_context );
>  				return -1;
>  		}
>  		*p = 0;
> -		rtems_interrupt_enable(flags);
> +		rtems_interrupt_lock_release( &vmeTsi148_lock, &lock_context );
>  
>  		free(ip);
>  		return 0;
> @@ -1849,8 +1850,9 @@ static int
>  intDoEnDis(unsigned int level, int dis)
>  {
>  BERegister		*b = THEBASE;
> -unsigned long	flags, v;
> +unsigned long		 v;
>  int				shift;
> +rtems_interrupt_lock_context lock_context;
>  
>  	if (  ! vmeTsi148IrqMgrInstalled || (shift = lvl2bitno(level)) < 0 )
>  		return -1;
> @@ -1860,7 +1862,7 @@ int				shift;
>  	if ( !dis )
>  		return (int)(v & TSI_RD(b, TSI_INTEO_REG) & TSI_RD(b, TSI_INTEN_REG)) ? 1 : 0;
>  
> -	rtems_interrupt_disable(flags);
> +	rtems_interrupt_lock_acquire( &vmeTsi148_lock, &lock_context );
>  	if ( dis<0 ) {
>  		TSI_WR(b, TSI_INTEN_REG, TSI_RD(b, TSI_INTEN_REG) & ~v);
>  		TSI_WR(b, TSI_INTEO_REG, TSI_RD(b, TSI_INTEO_REG) & ~v);
> @@ -1868,7 +1870,7 @@ int				shift;
>  		TSI_WR(b, TSI_INTEN_REG, TSI_RD(b, TSI_INTEN_REG) |  v);
>  		TSI_WR(b, TSI_INTEO_REG, TSI_RD(b, TSI_INTEO_REG) |  v);
>  	}
> -	rtems_interrupt_enable(flags);
> +	rtems_interrupt_lock_release( &vmeTsi148_lock, &lock_context );
>  	return 0;
>  }
>  
> diff --git a/bsps/powerpc/shared/vme/vmeUniverse.c b/bsps/powerpc/shared/vme/vmeUniverse.c
> index f636cfea09..3ea94d87b0 100644
> --- a/bsps/powerpc/shared/vme/vmeUniverse.c
> +++ b/bsps/powerpc/shared/vme/vmeUniverse.c
> @@ -1746,11 +1746,14 @@ int shift = -1;
>  	return shift;
>  }
>  
> +RTEMS_INTERRUPT_LOCK_DEFINE( static, vmeUniverse_lock, "vmeUniverse_lock" )
> +
>  int
>  vmeUniverseIntRoute(unsigned int level, unsigned int pin)
>  {
>  int				i, shift;
> -unsigned long	mask, mapreg, flags, wire;
> +unsigned long	mask, mapreg, wire;
> +rtems_interrupt_lock_context lock_context;
>  
>  	if ( pin >= UNIV_NUM_WIRES || ! universe_wire[pin] || !vmeUniverseIrqMgrInstalled )
>  		return -1;
> @@ -1779,7 +1782,7 @@ unsigned long	mask, mapreg, flags, wire;
>  	/* wires are offset by 1 so we can initialize the wire table to all zeros */
>  	wire = (universe_wire[pin]-1) << shift;
>  
> -rtems_interrupt_disable(flags);
> +	rtems_interrupt_lock_acquire( &vmeUniverse_lock, &lock_context );
>  
>  	for ( i = 0; i<UNIV_NUM_WIRES; i++ ) {
>  		wire_mask[i] &= ~mask;
> @@ -1790,27 +1793,27 @@ rtems_interrupt_disable(flags);
>  	mask |= wire;
>  	vmeUniverseWriteReg( mask, mapreg );
>  
> -rtems_interrupt_enable(flags);
> +	rtems_interrupt_lock_release( &vmeUniverse_lock, &lock_context );
>  	return 0;
>  }
>  
>  VmeUniverseISR
>  vmeUniverseISRGet(unsigned long vector, void **parg)
>  {
> -unsigned long             flags;
>  VmeUniverseISR			  rval = 0;
>  volatile UniverseIRQEntry *pe  = universeHdlTbl + vector;
> +rtems_interrupt_lock_context lock_context;
>  
>  	if ( vector>=UNIV_NUM_INT_VECS || ! *pe )
>  		return 0;
>  
> -	rtems_interrupt_disable(flags);
> +	rtems_interrupt_lock_acquire( &vmeUniverse_lock, &lock_context );
>  		if ( *pe ) {
>  			if (parg)
>  				*parg=(*pe)->usrData;
>  			rval = (*pe)->isr;
>  		}
> -	rtems_interrupt_enable(flags);
> +	rtems_interrupt_lock_release( &vmeUniverse_lock, &lock_context );
>  	return rval;
>  }
>  
> @@ -2251,8 +2254,8 @@ int
>  vmeUniverseInstallISR(unsigned long vector, VmeUniverseISR hdl, void *arg)
>  {
>  UniverseIRQEntry          ip;
> -unsigned long             flags;
>  volatile UniverseIRQEntry *pe;
> +rtems_interrupt_lock_context lock_context;
>  
>  		if (vector>sizeof(universeHdlTbl)/sizeof(universeHdlTbl[0]) || !vmeUniverseIrqMgrInstalled)
>  				return -1;
> @@ -2265,15 +2268,15 @@ volatile UniverseIRQEntry *pe;
>  		ip->isr=hdl;
>  		ip->usrData=arg;
>  
> -	rtems_interrupt_disable(flags);
> +		rtems_interrupt_lock_acquire( &vmeUniverse_lock, &lock_context );
>  		if ( *pe ) {
>  			/* oops; someone intervened */
> -			rtems_interrupt_enable(flags);
> +			rtems_interrupt_lock_release( &vmeUniverse_lock, &lock_context );
>  			free(ip);
>  			return -1;
>  		}
>  		*pe = ip;
> -	rtems_interrupt_enable(flags);
> +		rtems_interrupt_lock_release( &vmeUniverse_lock, &lock_context );
>  		return 0;
>  }
>  
> @@ -2281,22 +2284,22 @@ int
>  vmeUniverseRemoveISR(unsigned long vector, VmeUniverseISR hdl, void *arg)
>  {
>  UniverseIRQEntry          ip;
> -unsigned long             flags;
>  volatile UniverseIRQEntry *pe;
> +rtems_interrupt_lock_context lock_context;
>  
>  		if (vector>sizeof(universeHdlTbl)/sizeof(universeHdlTbl[0]) || !vmeUniverseIrqMgrInstalled)
>  				return -1;
>  
>  		pe = universeHdlTbl + vector;
>  
> -	rtems_interrupt_disable(flags);
> +		rtems_interrupt_lock_acquire( &vmeUniverse_lock, &lock_context );
>  		ip = *pe;
>  		if (!ip || ip->isr!=hdl || ip->usrData!=arg) {
> -			rtems_interrupt_enable(flags);
> +			rtems_interrupt_lock_release( &vmeUniverse_lock, &lock_context );
>  			return -1;
>  		}
>  		*pe = 0;
> -	rtems_interrupt_enable(flags);
> +		rtems_interrupt_lock_release( &vmeUniverse_lock, &lock_context );
>  		free(ip);
>  		return 0;
>  }
> @@ -2304,8 +2307,9 @@ volatile UniverseIRQEntry *pe;
>  static int
>  intDoEnDis(unsigned int level, int dis)
>  {
> -unsigned long	flags, v;
> +unsigned long		v;
>  int				shift;
> +rtems_interrupt_lock_context lock_context;
>  
>  	if (  ! vmeUniverseIrqMgrInstalled || (shift = lvl2bit(level)) < 0 )
>  		return -1;
> @@ -2315,14 +2319,14 @@ int				shift;
>  	if ( !dis )
>  		return vmeUniverseReadReg(UNIV_REGOFF_LINT_EN) & v ? 1 : 0;
>  
> -	rtems_interrupt_disable(flags);
> +	rtems_interrupt_lock_acquire( &vmeUniverse_lock, &lock_context );
>  	if ( dis<0 )
>  		vmeUniverseWriteReg( vmeUniverseReadReg(UNIV_REGOFF_LINT_EN) & ~v, UNIV_REGOFF_LINT_EN );
>  	else {
>  		vmeUniverseWriteReg( vmeUniverseReadReg(UNIV_REGOFF_LINT_EN) |  v, UNIV_REGOFF_LINT_EN  );
>  	}
> -	rtems_interrupt_enable(flags);
> -		return 0;
> +	rtems_interrupt_lock_release( &vmeUniverse_lock, &lock_context );
> +	return 0;
>  }
>  
>  int


More information about the devel mailing list