[Xen-devel] [PATCH v3 31/62] arm/acpi: Add a helper function to get interrupt type

Stefano Stabellini stefano.stabellini at eu.citrix.com
Thu Nov 26 04:33:41 PST 2015


On Tue, 17 Nov 2015, shannon.zhao at linaro.org wrote:
> From: Shannon Zhao <shannon.zhao at linaro.org>
> 
> Add a helper funtion to get the type of interrupts in ACPI table.
> 
> Signed-off-by: Shannon Zhao <shannon.zhao at linaro.org>
> ---
>  xen/arch/arm/acpi/lib.c    | 27 +++++++++++++++++++++++++++
>  xen/include/asm-arm/acpi.h | 39 +++++++++++++++++++++++++++++++++++++++
>  2 files changed, 66 insertions(+)
> 
> diff --git a/xen/arch/arm/acpi/lib.c b/xen/arch/arm/acpi/lib.c
> index d8b7635..47f4c6a 100644
> --- a/xen/arch/arm/acpi/lib.c
> +++ b/xen/arch/arm/acpi/lib.c
> @@ -43,3 +43,30 @@ bool_t __init acpi_psci_hvc_present(void)
>  {
>      return acpi_gbl_FADT.arm_boot_flags & ACPI_FADT_PSCI_USE_HVC;
>  }
> +
> +unsigned int acpi_get_irq_type(u32 flags)
> +{
> +    int trigger, polarity;
> +
> +    trigger = (flags & ACPI_GTDT_INTERRUPT_MODE) ? ACPI_EDGE_SENSITIVE

                         ^ GTDT? This is not specific to the GTDT table, right?


> +               : ACPI_LEVEL_SENSITIVE;
> +
> +    polarity = (flags & ACPI_GTDT_INTERRUPT_POLARITY) ? ACPI_ACTIVE_LOW

same here


> +                : ACPI_ACTIVE_HIGH;
> +
> +    switch (polarity) {
> +    case ACPI_ACTIVE_LOW:
> +        return trigger == ACPI_EDGE_SENSITIVE ?
> +            ACPI_IRQ_TYPE_EDGE_FALLING :
> +            ACPI_IRQ_TYPE_LEVEL_LOW;
> +    case ACPI_ACTIVE_HIGH:
> +        return trigger == ACPI_EDGE_SENSITIVE ?
> +            ACPI_IRQ_TYPE_EDGE_RISING :
> +            ACPI_IRQ_TYPE_LEVEL_HIGH;
> +    case ACPI_ACTIVE_BOTH:
> +        if (trigger == ACPI_EDGE_SENSITIVE)
> +            return ACPI_IRQ_TYPE_EDGE_BOTH;
> +    default:
> +        return ACPI_IRQ_TYPE_NONE;
> +    }
> +}
> diff --git a/xen/include/asm-arm/acpi.h b/xen/include/asm-arm/acpi.h
> index 714e596..214fc4e 100644
> --- a/xen/include/asm-arm/acpi.h
> +++ b/xen/include/asm-arm/acpi.h
> @@ -34,10 +34,12 @@ extern bool_t acpi_disabled;
>  bool_t __init acpi_psci_present(void);
>  bool_t __init acpi_psci_hvc_present(void);
>  void __init acpi_smp_init_cpus(void);
> +unsigned int acpi_get_irq_type(u32 flags);
>  #else
>  static inline bool_t acpi_psci_present(void) { return false; }
>  static inline bool_t acpi_psci_hvc_present(void) {return false; }
>  static inline void acpi_smp_init_cpus(void) { }
> +static inline unsigned int acpi_get_irq_type(u32 flags) { return 0; }
>  #endif /* CONFIG_ACPI */
>  
>  /* Basic configuration for ACPI */
> @@ -48,4 +50,41 @@ static inline void disable_acpi(void)
>  
>  #define ACPI_GTDT_INTR_MASK ( ACPI_GTDT_INTERRUPT_MODE | ACPI_GTDT_INTERRUPT_POLARITY )
>  
> +/* Triggering */
> +
> +#define ACPI_LEVEL_SENSITIVE            (u8) 0x00
> +#define ACPI_EDGE_SENSITIVE             (u8) 0x01
> +
> +/* Polarity */
> +
> +#define ACPI_ACTIVE_HIGH                (u8) 0x00
> +#define ACPI_ACTIVE_LOW                 (u8) 0x01
> +#define ACPI_ACTIVE_BOTH                (u8) 0x02
> +
> +/**
> + * IRQ line type.
> + *
> + * ACPI_IRQ_TYPE_NONE            - default, unspecified type
> + * ACPI_IRQ_TYPE_EDGE_RISING     - rising edge triggered
> + * ACPI_IRQ_TYPE_EDGE_FALLING    - falling edge triggered
> + * ACPI_IRQ_TYPE_EDGE_BOTH       - rising and falling edge triggered
> + * ACPI_IRQ_TYPE_LEVEL_HIGH      - high level triggered
> + * ACPI_IRQ_TYPE_LEVEL_LOW       - low level triggered
> + * ACPI_IRQ_TYPE_LEVEL_MASK      - Mask to filter out the level bits
> + * ACPI_IRQ_TYPE_SENSE_MASK      - Mask for all the above bits
> + * ACPI_IRQ_TYPE_INVALID         - Use to initialize the type
> + */
> +#define ACPI_IRQ_TYPE_NONE           0x00000000
> +#define ACPI_IRQ_TYPE_EDGE_RISING    0x00000001
> +#define ACPI_IRQ_TYPE_EDGE_FALLING   0x00000002
> +#define ACPI_IRQ_TYPE_EDGE_BOTH                           \
> +    (ACPI_IRQ_TYPE_EDGE_FALLING | ACPI_IRQ_TYPE_EDGE_RISING)
> +#define ACPI_IRQ_TYPE_LEVEL_HIGH     0x00000004
> +#define ACPI_IRQ_TYPE_LEVEL_LOW      0x00000008
> +#define ACPI_IRQ_TYPE_LEVEL_MASK                          \
> +    (ACPI_IRQ_TYPE_LEVEL_LOW | ACPI_IRQ_TYPE_LEVEL_HIGH)
> +#define ACPI_IRQ_TYPE_SENSE_MASK     0x0000000f
> +
> +#define ACPI_IRQ_TYPE_INVALID        0x00000010

Given that these are actually physical irq properties, they don't really
depend on ACPI or DT, in fact I believe these are taken from the device
tree definitions and renamed.

Instead of duplicating the irq types, I would make the device tree irq
types generic.



More information about the linux-arm-kernel mailing list