This is the mail archive of the ecos-patches@sources.redhat.com mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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)
 {


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]