Re: [PATCH v3 20/42] sparc/irq: Implement new interrupt directives

2021-07-23 Thread Gedare Bloom
On Fri, Jul 23, 2021 at 7:58 AM Sebastian Huber
 wrote:
>
> Update #3269.
> ---
>  bsps/sparc/erc32/include/bsp/irq.h |  3 +-
>  bsps/sparc/erc32/include/erc32.h   | 12 -
>  bsps/sparc/leon2/include/bsp/irq.h |  3 +-
>  bsps/sparc/leon2/include/leon.h| 16 +-
>  bsps/sparc/leon3/start/eirq.c  | 87 +++---
>  bsps/sparc/shared/irq/irq-shared.c | 48 ++---
>  6 files changed, 148 insertions(+), 21 deletions(-)
>
> diff --git a/bsps/sparc/erc32/include/bsp/irq.h 
> b/bsps/sparc/erc32/include/bsp/irq.h
> index a61f51d6b6..83b383ba7a 100644
> --- a/bsps/sparc/erc32/include/bsp/irq.h
> +++ b/bsps/sparc/erc32/include/bsp/irq.h
> @@ -23,8 +23,7 @@
>  #define BSP_INTERRUPT_VECTOR_MAX_STD 15 /* Standard IRQ controller */
>  #define BSP_INTERRUPT_VECTOR_COUNT (BSP_INTERRUPT_VECTOR_MAX_STD + 1)
>
> -/* No extra check is needed */
> -#undef BSP_INTERRUPT_CUSTOM_VALID_VECTOR
> +#define BSP_INTERRUPT_CUSTOM_VALID_VECTOR
>
>  RTEMS_INLINE_ROUTINE rtems_status_code bsp_interrupt_set_affinity(
>rtems_vector_number   vector,
> diff --git a/bsps/sparc/erc32/include/erc32.h 
> b/bsps/sparc/erc32/include/erc32.h
> index a677b13d25..f9cdbc960a 100644
> --- a/bsps/sparc/erc32/include/erc32.h
> +++ b/bsps/sparc/erc32/include/erc32.h
> @@ -352,7 +352,7 @@ static __inline__ int bsp_irq_fixup(int irq)
>  \
>  _level = sparc_disable_interrupts(); \
>  ERC32_MEC.Test_Control = ERC32_MEC.Test_Control | 0x8; \
> -ERC32_MEC.Interrupt_Force = (1 << (_source)); \
> +ERC32_MEC.Interrupt_Force |= (1 << (_source)); \
>  sparc_enable_interrupts( _level ); \
>} while (0)
>
> @@ -406,7 +406,17 @@ static __inline__ int bsp_irq_fixup(int irq)
>  /* Make all SPARC BSPs have common macros for interrupt handling on local 
> CPU */
>  #define BSP_Clear_interrupt(_source) ERC32_Clear_interrupt(_source)
>  #define BSP_Force_interrupt(_source) ERC32_Force_interrupt(_source)
> +#define BSP_Clear_forced_interrupt( _source ) \
> +  do { \
> +uint32_t _level; \
> +\
> +_level = sparc_disable_interrupts(); \
> +  ERC32_MEC.Interrupt_Force &= ~(1 << (_source)); \
> +sparc_enable_interrupts( _level ); \
> +  } while (0)
>  #define BSP_Is_interrupt_pending(_source) ERC32_Is_interrupt_pending(_source)
> +#define BSP_Is_interrupt_forced(_source) \
> +  (ERC32_MEC.Interrupt_Force & (1 << (_source)))
>  #define BSP_Is_interrupt_masked(_source) ERC32_Is_interrupt_masked(_source)
>  #define BSP_Unmask_interrupt(_source) ERC32_Unmask_interrupt(_source)
>  #define BSP_Mask_interrupt(_source) ERC32_Mask_interrupt(_source)
> diff --git a/bsps/sparc/leon2/include/bsp/irq.h 
> b/bsps/sparc/leon2/include/bsp/irq.h
> index 5f2359014a..a4ce3c55ff 100644
> --- a/bsps/sparc/leon2/include/bsp/irq.h
> +++ b/bsps/sparc/leon2/include/bsp/irq.h
> @@ -21,7 +21,6 @@
>  #define BSP_INTERRUPT_VECTOR_MAX_STD 15 /* Standard IRQ controller */
>  #define BSP_INTERRUPT_VECTOR_COUNT (BSP_INTERRUPT_VECTOR_MAX_STD + 1)
>
> -/* No extra check is needed */
> -#undef BSP_INTERRUPT_CUSTOM_VALID_VECTOR
> +#define BSP_INTERRUPT_CUSTOM_VALID_VECTOR
>
>  #endif /* LIBBSP_LEON2_IRQ_CONFIG_H */
> diff --git a/bsps/sparc/leon2/include/leon.h b/bsps/sparc/leon2/include/leon.h
> index fc90e1f7e6..11196aee6d 100644
> --- a/bsps/sparc/leon2/include/leon.h
> +++ b/bsps/sparc/leon2/include/leon.h
> @@ -295,7 +295,11 @@ static __inline__ int bsp_irq_fixup(int irq)
>
>  #define LEON_Force_interrupt( _source ) \
>do { \
> -LEON_REG.Interrupt_Force = (1 << (_source)); \
> +uint32_t _level; \
> +\
> +_level = sparc_disable_interrupts(); \
> +  LEON_REG.Interrupt_Force |= (1 << (_source)); \
> +sparc_enable_interrupts( _level ); \
>} while (0)
>
>  #define LEON_Is_interrupt_pending( _source ) \
> @@ -348,7 +352,17 @@ static __inline__ int bsp_irq_fixup(int irq)
>  /* Make all SPARC BSPs have common macros for interrupt handling */
>  #define BSP_Clear_interrupt(_source) LEON_Clear_interrupt(_source)
>  #define BSP_Force_interrupt(_source) LEON_Force_interrupt(_source)
> +#define BSP_Clear_forced_interrupt( _source ) \
> +  do { \
> +uint32_t _level; \
> +\
> +_level = sparc_disable_interrupts(); \
> +  LEON_REG.Interrupt_Force &= ~(1 << (_source)); \
> +sparc_enable_interrupts( _level ); \
> +  } while (0)
>  #define BSP_Is_interrupt_pending(_source) LEON_Is_interrupt_pending(_source)
> +#define BSP_Is_interrupt_forced(_source) \
> +  (LEON_REG.Interrupt_Force & (1 << (_source)))
>  #define BSP_Is_interrupt_masked(_source) LEON_Is_interrupt_masked(_source)
>  #define BSP_Unmask_interrupt(_source) LEON_Unmask_interrupt(_source)
>  #define BSP_Mask_interrupt(_source) LEON_Mask_interrupt(_source)
> diff --git a/bsps/sparc/leon3/start/eirq.c b/bsps/sparc/leon3/start/eirq.c
> index 5519d6efe7..80c0efd3fa 100644
> --- a/bsps/sparc/leon3/start/eirq.c
> +++ b/bsps/sparc/leon3/start/eirq.c
> @@ -66,6 +66,20 @@ rtems_status_code bsp_interrupt_get_attributes(
>rtems_inter

[PATCH v3 20/42] sparc/irq: Implement new interrupt directives

2021-07-23 Thread Sebastian Huber
Update #3269.
---
 bsps/sparc/erc32/include/bsp/irq.h |  3 +-
 bsps/sparc/erc32/include/erc32.h   | 12 -
 bsps/sparc/leon2/include/bsp/irq.h |  3 +-
 bsps/sparc/leon2/include/leon.h| 16 +-
 bsps/sparc/leon3/start/eirq.c  | 87 +++---
 bsps/sparc/shared/irq/irq-shared.c | 48 ++---
 6 files changed, 148 insertions(+), 21 deletions(-)

diff --git a/bsps/sparc/erc32/include/bsp/irq.h 
b/bsps/sparc/erc32/include/bsp/irq.h
index a61f51d6b6..83b383ba7a 100644
--- a/bsps/sparc/erc32/include/bsp/irq.h
+++ b/bsps/sparc/erc32/include/bsp/irq.h
@@ -23,8 +23,7 @@
 #define BSP_INTERRUPT_VECTOR_MAX_STD 15 /* Standard IRQ controller */
 #define BSP_INTERRUPT_VECTOR_COUNT (BSP_INTERRUPT_VECTOR_MAX_STD + 1)
 
-/* No extra check is needed */
-#undef BSP_INTERRUPT_CUSTOM_VALID_VECTOR
+#define BSP_INTERRUPT_CUSTOM_VALID_VECTOR
 
 RTEMS_INLINE_ROUTINE rtems_status_code bsp_interrupt_set_affinity(
   rtems_vector_number   vector,
diff --git a/bsps/sparc/erc32/include/erc32.h b/bsps/sparc/erc32/include/erc32.h
index a677b13d25..f9cdbc960a 100644
--- a/bsps/sparc/erc32/include/erc32.h
+++ b/bsps/sparc/erc32/include/erc32.h
@@ -352,7 +352,7 @@ static __inline__ int bsp_irq_fixup(int irq)
 \
 _level = sparc_disable_interrupts(); \
 ERC32_MEC.Test_Control = ERC32_MEC.Test_Control | 0x8; \
-ERC32_MEC.Interrupt_Force = (1 << (_source)); \
+ERC32_MEC.Interrupt_Force |= (1 << (_source)); \
 sparc_enable_interrupts( _level ); \
   } while (0)
 
@@ -406,7 +406,17 @@ static __inline__ int bsp_irq_fixup(int irq)
 /* Make all SPARC BSPs have common macros for interrupt handling on local CPU 
*/
 #define BSP_Clear_interrupt(_source) ERC32_Clear_interrupt(_source)
 #define BSP_Force_interrupt(_source) ERC32_Force_interrupt(_source)
+#define BSP_Clear_forced_interrupt( _source ) \
+  do { \
+uint32_t _level; \
+\
+_level = sparc_disable_interrupts(); \
+  ERC32_MEC.Interrupt_Force &= ~(1 << (_source)); \
+sparc_enable_interrupts( _level ); \
+  } while (0)
 #define BSP_Is_interrupt_pending(_source) ERC32_Is_interrupt_pending(_source)
+#define BSP_Is_interrupt_forced(_source) \
+  (ERC32_MEC.Interrupt_Force & (1 << (_source)))
 #define BSP_Is_interrupt_masked(_source) ERC32_Is_interrupt_masked(_source)
 #define BSP_Unmask_interrupt(_source) ERC32_Unmask_interrupt(_source)
 #define BSP_Mask_interrupt(_source) ERC32_Mask_interrupt(_source)
diff --git a/bsps/sparc/leon2/include/bsp/irq.h 
b/bsps/sparc/leon2/include/bsp/irq.h
index 5f2359014a..a4ce3c55ff 100644
--- a/bsps/sparc/leon2/include/bsp/irq.h
+++ b/bsps/sparc/leon2/include/bsp/irq.h
@@ -21,7 +21,6 @@
 #define BSP_INTERRUPT_VECTOR_MAX_STD 15 /* Standard IRQ controller */
 #define BSP_INTERRUPT_VECTOR_COUNT (BSP_INTERRUPT_VECTOR_MAX_STD + 1)
 
-/* No extra check is needed */
-#undef BSP_INTERRUPT_CUSTOM_VALID_VECTOR
+#define BSP_INTERRUPT_CUSTOM_VALID_VECTOR
 
 #endif /* LIBBSP_LEON2_IRQ_CONFIG_H */
diff --git a/bsps/sparc/leon2/include/leon.h b/bsps/sparc/leon2/include/leon.h
index fc90e1f7e6..11196aee6d 100644
--- a/bsps/sparc/leon2/include/leon.h
+++ b/bsps/sparc/leon2/include/leon.h
@@ -295,7 +295,11 @@ static __inline__ int bsp_irq_fixup(int irq)
 
 #define LEON_Force_interrupt( _source ) \
   do { \
-LEON_REG.Interrupt_Force = (1 << (_source)); \
+uint32_t _level; \
+\
+_level = sparc_disable_interrupts(); \
+  LEON_REG.Interrupt_Force |= (1 << (_source)); \
+sparc_enable_interrupts( _level ); \
   } while (0)
 
 #define LEON_Is_interrupt_pending( _source ) \
@@ -348,7 +352,17 @@ static __inline__ int bsp_irq_fixup(int irq)
 /* Make all SPARC BSPs have common macros for interrupt handling */
 #define BSP_Clear_interrupt(_source) LEON_Clear_interrupt(_source)
 #define BSP_Force_interrupt(_source) LEON_Force_interrupt(_source)
+#define BSP_Clear_forced_interrupt( _source ) \
+  do { \
+uint32_t _level; \
+\
+_level = sparc_disable_interrupts(); \
+  LEON_REG.Interrupt_Force &= ~(1 << (_source)); \
+sparc_enable_interrupts( _level ); \
+  } while (0)
 #define BSP_Is_interrupt_pending(_source) LEON_Is_interrupt_pending(_source)
+#define BSP_Is_interrupt_forced(_source) \
+  (LEON_REG.Interrupt_Force & (1 << (_source)))
 #define BSP_Is_interrupt_masked(_source) LEON_Is_interrupt_masked(_source)
 #define BSP_Unmask_interrupt(_source) LEON_Unmask_interrupt(_source)
 #define BSP_Mask_interrupt(_source) LEON_Mask_interrupt(_source)
diff --git a/bsps/sparc/leon3/start/eirq.c b/bsps/sparc/leon3/start/eirq.c
index 5519d6efe7..80c0efd3fa 100644
--- a/bsps/sparc/leon3/start/eirq.c
+++ b/bsps/sparc/leon3/start/eirq.c
@@ -66,6 +66,20 @@ rtems_status_code bsp_interrupt_get_attributes(
   rtems_interrupt_attributes *attributes
 )
 {
+  bool is_standard_interrupt;
+
+  is_standard_interrupt = (vector <= BSP_INTERRUPT_VECTOR_MAX_STD);
+  attributes->is_maskable = (vector != 15);
+  attributes->can_enable = true;
+  attributes->maybe_enable = true;
+  attributes->can_