[PATCH] bsps/powerpc: Introduction of interrupt locks

Christian MAUDERER christian.mauderer at embedded-brains.de
Fri Apr 19 08:12:35 UTC 2024


Hello Chris,

it is tested on an MVME2500 which uses the powerpc/qoriq_e500 in an SMP 
configuration.

Best regards

Christian

On 2024-04-18 04:04, Chris Johns wrote:
> 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
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel

-- 
--------------------------------------------
embedded brains GmbH & Co. KG
Herr Christian MAUDERER
Dornierstr. 4
82178 Puchheim
Germany
email:  christian.mauderer at embedded-brains.de
phone:  +49-89-18 94 741 - 18
mobile: +49-176-152 206 08

Registergericht: Amtsgericht München
Registernummer: HRA 117265
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/


More information about the devel mailing list