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

--
--------------------------------------------
embedded brains GmbH & Co. KG
Herr Christian MAUDERER
Dornierstr. 4
82178 Puchheim
Germany
email:  christian.maude...@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/
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to