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 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel