[PATCH] bsps/powerpc: Introduction of interrupt locks
Christian MAUDERER
christian.mauderer at embedded-brains.de
Fri Apr 19 08:12:35 UTC 2024
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 at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
--
--------------------------------------------
embedded brains GmbH & Co. KG
Herr Christian MAUDERER
Dornierstr. 4
82178 Puchheim
Germany
email: christian.mauderer at 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/
More information about the devel
mailing list