This is the mail archive of the
ecos-patches@sources.redhat.com
mailing list for the eCos project.
ixp425 interrupt handling tweak
- From: Mark Salter <msalter at redhat dot com>
- To: ecos-patches at sources dot redhat dot com
- Date: Tue, 8 Apr 2003 13:17:27 -0400 (EDT)
- Subject: ixp425 interrupt handling tweak
Index: hal/arm/xscale/ixp425/current/ChangeLog
===================================================================
RCS file: /cvs/ecos/ecos/packages/hal/arm/xscale/ixp425/current/ChangeLog,v
retrieving revision 1.2
diff -u -p -5 -r1.2 ChangeLog
--- hal/arm/xscale/ixp425/current/ChangeLog 6 Apr 2003 23:19:40 -0000 1.2
+++ hal/arm/xscale/ixp425/current/ChangeLog 8 Apr 2003 17:10:28 -0000
@@ -1,5 +1,15 @@
+2003-04-08 Mark Salter <msalter at redhat dot com>
+
+ * include/hal_var_ints.h (CYGHWR_HAL_GDB_PORT_VECTORS_MATCH): Define.
+
+ * src/ixp425_misc.c (hal_interrupt_mask): Mask QM1 interrupt is all
+ NPE interrupts are masked.
+ (hal_interrupt_unmask): Unmask QM1 is any NPE interrupts unmasked.
+
+ * include/hal_ixp425.h (IXP425_INTR_FIQ_ENC_ST): Fix offset.
+
2003-04-06 Mark Salter <msalter at redhat dot com>
* src/ixp425_pci.c (cyg_hal_plf_pci_init): Support non-host mode.
2003-02-22 Mark Salter <msalter at redhat dot com>
Index: hal/arm/xscale/ixp425/current/include/hal_ixp425.h
===================================================================
RCS file: /cvs/ecos/ecos/packages/hal/arm/xscale/ixp425/current/include/hal_ixp425.h,v
retrieving revision 1.1
diff -u -p -5 -r1.1 hal_ixp425.h
--- hal/arm/xscale/ixp425/current/include/hal_ixp425.h 18 Mar 2003 13:10:04 -0000 1.1
+++ hal/arm/xscale/ixp425/current/include/hal_ixp425.h 8 Apr 2003 17:10:28 -0000
@@ -6,11 +6,11 @@
//
//=============================================================================
//####ECOSGPLCOPYRIGHTBEGIN####
// -------------------------------------------
// This file is part of eCos, the Embedded Configurable Operating System.
-// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Red Hat, Inc.
//
// eCos is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 or (at your option) any later version.
//
@@ -268,11 +268,11 @@
#define IXP425_INTR_SEL REG32(IXP425_INTR_CFG_BASE,0x08)
#define IXP425_INTR_IRQ_ST REG32(IXP425_INTR_CFG_BASE,0x0C)
#define IXP425_INTR_FIQ_ST REG32(IXP425_INTR_CFG_BASE,0x10)
#define IXP425_INTR_PRTY REG32(IXP425_INTR_CFG_BASE,0x14)
#define IXP425_INTR_IRQ_ENC_ST REG32(IXP425_INTR_CFG_BASE,0x18)
-#define IXP425_INTR_FIQ_ENC_ST REG32(IXP425_INTR_CFG_BASE,0x18)
+#define IXP425_INTR_FIQ_ENC_ST REG32(IXP425_INTR_CFG_BASE,0x1C)
// --------------------------------------------------------------------------
// Timers (Chapter 15)
#define IXP425_OST_CFG_BASE 0xC8005000
#define IXP425_OST_TS REG32(IXP425_OST_CFG_BASE,0x00)
Index: hal/arm/xscale/ixp425/current/include/hal_var_ints.h
===================================================================
RCS file: /cvs/ecos/ecos/packages/hal/arm/xscale/ixp425/current/include/hal_var_ints.h,v
retrieving revision 1.1
diff -u -p -5 -r1.1 hal_var_ints.h
--- hal/arm/xscale/ixp425/current/include/hal_var_ints.h 18 Mar 2003 13:10:04 -0000 1.1
+++ hal/arm/xscale/ixp425/current/include/hal_var_ints.h 8 Apr 2003 17:10:28 -0000
@@ -8,11 +8,11 @@
//
//==========================================================================
//####ECOSGPLCOPYRIGHTBEGIN####
// -------------------------------------------
// This file is part of eCos, the Embedded Configurable Operating System.
-// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Red Hat, Inc.
//
// eCos is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 or (at your option) any later version.
//
@@ -119,8 +119,19 @@ hal_clock_reinitialize( int *pf
#define HAL_CLOCK_REINITIALIZE( _freq, _period, _old_hz ) \
hal_clock_reinitialize( &_freq, &_period, _old_hz )
#define HAL_PLATFORM_RESET_ENTRY 0x00000000
+
+
+// ------------------------------------------------------------------------
+// Used for to tell if interrupt belongs to GDB comm channel
+//
+#define CYGHWR_HAL_GDB_PORT_VECTORS_MATCH(_v_, _gv_) \
+ (((_v_) == (_gv_)) || \
+ ((_v_) == CYGNUM_HAL_INTERRUPT_QM1 && \
+ ((_gv_) == CYGNUM_HAL_INTERRUPT_NPEB || \
+ (_gv_) == CYGNUM_HAL_INTERRUPT_NPEC)))
+
#endif // CYGONCE_HAL_VAR_INTS_H
// EOF hal_var_ints.h
Index: hal/arm/xscale/ixp425/current/src/ixp425_misc.c
===================================================================
RCS file: /cvs/ecos/ecos/packages/hal/arm/xscale/ixp425/current/src/ixp425_misc.c,v
retrieving revision 1.1
diff -u -p -5 -r1.1 ixp425_misc.c
--- hal/arm/xscale/ixp425/current/src/ixp425_misc.c 18 Mar 2003 13:10:04 -0000 1.1
+++ hal/arm/xscale/ixp425/current/src/ixp425_misc.c 8 Apr 2003 17:10:34 -0000
@@ -129,37 +129,60 @@ hal_IRQ_handler(void)
}
void
hal_interrupt_mask(int vector)
{
+ unsigned val;
+
if (vector < CYGNUM_HAL_ISR_MIN || CYGNUM_HAL_ISR_MAX < vector)
return;
#if CYGNUM_HAL_ISR_MAX > CYGNUM_HAL_VAR_ISR_MAX
if (vector > CYGNUM_HAL_VAR_ISR_MAX) {
HAL_PLF_INTERRUPT_MASK(vector);
return;
}
#endif
- *IXP425_INTR_EN &= ~(1 << vector);
+ val = *IXP425_INTR_EN & ~(1 << vector);
+
+ // If unmasking NPE interrupt, also unmask QM1 which is
+ // shared by all NPE ports.
+ if (vector == CYGNUM_HAL_INTERRUPT_NPEB ||
+ vector == CYGNUM_HAL_INTERRUPT_NPEC) {
+ if (!(val & (CYGNUM_HAL_INTERRUPT_NPEB | CYGNUM_HAL_INTERRUPT_NPEC)))
+ val &= ~(1 << CYGNUM_HAL_INTERRUPT_QM1);
+ }
+
+ *IXP425_INTR_EN = val;
}
void
hal_interrupt_unmask(int vector)
{
+ unsigned val;
+
if (vector < CYGNUM_HAL_ISR_MIN || CYGNUM_HAL_ISR_MAX < vector)
return;
#if CYGNUM_HAL_ISR_MAX > CYGNUM_HAL_VAR_ISR_MAX
if (vector > CYGNUM_HAL_VAR_ISR_MAX) {
HAL_PLF_INTERRUPT_UNMASK(vector);
return;
}
#endif
- *IXP425_INTR_EN |= (1 << vector);
+ val = *IXP425_INTR_EN | (1 << vector);
+
+ // If all NPE interrupts are masked, also mask QM1 which is
+ // shared by all NPE ports.
+ if (vector == CYGNUM_HAL_INTERRUPT_NPEB ||
+ vector == CYGNUM_HAL_INTERRUPT_NPEC) {
+ val |= (1 << CYGNUM_HAL_INTERRUPT_QM1);
+ }
+
+ *IXP425_INTR_EN = val;
}
void
hal_interrupt_acknowledge(int vector)
{