[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