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

Reply via email to