Re: [PATCH v3 20/42] sparc/irq: Implement new interrupt directives
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
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_