[PATCH] bsps/powerpc: Introduction of interrupt locks

Vincenzo Calabretta vincenzo.calabretta at embedded-brains.de
Wed Apr 17 07:34:30 UTC 2024


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
-- 
2.35.3



More information about the devel mailing list