Merge branch 'irq/for-x86' into irq/core
authorThomas Gleixner <tglx@linutronix.de>
Sat, 20 Jun 2015 17:14:31 +0000 (19:14 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Sat, 20 Jun 2015 17:14:31 +0000 (19:14 +0200)
Get the infrastructure patches which are required for x86/apic into core

1  2 
include/linux/irq.h
kernel/irq/irqdesc.c
kernel/irq/irqdomain.c

diff --combined include/linux/irq.h
@@@ -126,13 -126,21 +126,21 @@@ struct msi_desc
  struct irq_domain;
  
  /**
-  * struct irq_data - per irq and irq chip data passed down to chip functions
+  * struct irq_common_data - per irq data shared by all irqchips
+  * @state_use_accessors: status information for irq chip functions.
+  *                    Use accessor functions to deal with it
+  */
+ struct irq_common_data {
+       unsigned int            state_use_accessors;
+ };
+ /**
+  * struct irq_data - per irq chip data passed down to chip functions
   * @mask:             precomputed bitmask for accessing the chip registers
   * @irq:              interrupt number
   * @hwirq:            hardware interrupt number, local to the interrupt domain
   * @node:             node index useful for balancing
-  * @state_use_accessors: status information for irq chip functions.
-  *                    Use accessor functions to deal with it
+  * @common:           point to data shared by all irqchips
   * @chip:             low level interrupt hardware access
   * @domain:           Interrupt translation domain; responsible for mapping
   *                    between hwirq number and linux irq number.
@@@ -153,7 -161,7 +161,7 @@@ struct irq_data 
        unsigned int            irq;
        unsigned long           hwirq;
        unsigned int            node;
-       unsigned int            state_use_accessors;
+       struct irq_common_data  *common;
        struct irq_chip         *chip;
        struct irq_domain       *domain;
  #ifdef        CONFIG_IRQ_DOMAIN_HIERARCHY
  };
  
  /*
-  * Bit masks for irq_data.state
+  * Bit masks for irq_common_data.state_use_accessors
   *
   * IRQD_TRIGGER_MASK          - Mask for the trigger type bits
   * IRQD_SETAFFINITY_PENDING   - Affinity setting is pending
@@@ -198,34 -206,36 +206,36 @@@ enum 
        IRQD_WAKEUP_ARMED               = (1 << 19),
  };
  
+ #define __irqd_to_state(d)            ((d)->common->state_use_accessors)
  static inline bool irqd_is_setaffinity_pending(struct irq_data *d)
  {
-       return d->state_use_accessors & IRQD_SETAFFINITY_PENDING;
+       return __irqd_to_state(d) & IRQD_SETAFFINITY_PENDING;
  }
  
  static inline bool irqd_is_per_cpu(struct irq_data *d)
  {
-       return d->state_use_accessors & IRQD_PER_CPU;
+       return __irqd_to_state(d) & IRQD_PER_CPU;
  }
  
  static inline bool irqd_can_balance(struct irq_data *d)
  {
-       return !(d->state_use_accessors & (IRQD_PER_CPU | IRQD_NO_BALANCING));
+       return !(__irqd_to_state(d) & (IRQD_PER_CPU | IRQD_NO_BALANCING));
  }
  
  static inline bool irqd_affinity_was_set(struct irq_data *d)
  {
-       return d->state_use_accessors & IRQD_AFFINITY_SET;
+       return __irqd_to_state(d) & IRQD_AFFINITY_SET;
  }
  
  static inline void irqd_mark_affinity_was_set(struct irq_data *d)
  {
-       d->state_use_accessors |= IRQD_AFFINITY_SET;
+       __irqd_to_state(d) |= IRQD_AFFINITY_SET;
  }
  
  static inline u32 irqd_get_trigger_type(struct irq_data *d)
  {
-       return d->state_use_accessors & IRQD_TRIGGER_MASK;
+       return __irqd_to_state(d) & IRQD_TRIGGER_MASK;
  }
  
  /*
   */
  static inline void irqd_set_trigger_type(struct irq_data *d, u32 type)
  {
-       d->state_use_accessors &= ~IRQD_TRIGGER_MASK;
-       d->state_use_accessors |= type & IRQD_TRIGGER_MASK;
+       __irqd_to_state(d) &= ~IRQD_TRIGGER_MASK;
+       __irqd_to_state(d) |= type & IRQD_TRIGGER_MASK;
  }
  
  static inline bool irqd_is_level_type(struct irq_data *d)
  {
-       return d->state_use_accessors & IRQD_LEVEL;
+       return __irqd_to_state(d) & IRQD_LEVEL;
  }
  
  static inline bool irqd_is_wakeup_set(struct irq_data *d)
  {
-       return d->state_use_accessors & IRQD_WAKEUP_STATE;
+       return __irqd_to_state(d) & IRQD_WAKEUP_STATE;
  }
  
  static inline bool irqd_can_move_in_process_context(struct irq_data *d)
  {
-       return d->state_use_accessors & IRQD_MOVE_PCNTXT;
+       return __irqd_to_state(d) & IRQD_MOVE_PCNTXT;
  }
  
  static inline bool irqd_irq_disabled(struct irq_data *d)
  {
-       return d->state_use_accessors & IRQD_IRQ_DISABLED;
+       return __irqd_to_state(d) & IRQD_IRQ_DISABLED;
  }
  
  static inline bool irqd_irq_masked(struct irq_data *d)
  {
-       return d->state_use_accessors & IRQD_IRQ_MASKED;
+       return __irqd_to_state(d) & IRQD_IRQ_MASKED;
  }
  
  static inline bool irqd_irq_inprogress(struct irq_data *d)
  {
-       return d->state_use_accessors & IRQD_IRQ_INPROGRESS;
+       return __irqd_to_state(d) & IRQD_IRQ_INPROGRESS;
  }
  
  static inline bool irqd_is_wakeup_armed(struct irq_data *d)
  {
-       return d->state_use_accessors & IRQD_WAKEUP_ARMED;
+       return __irqd_to_state(d) & IRQD_WAKEUP_ARMED;
  }
  
  
   */
  static inline void irqd_set_chained_irq_inprogress(struct irq_data *d)
  {
-       d->state_use_accessors |= IRQD_IRQ_INPROGRESS;
+       __irqd_to_state(d) |= IRQD_IRQ_INPROGRESS;
  }
  
  static inline void irqd_clr_chained_irq_inprogress(struct irq_data *d)
  {
-       d->state_use_accessors &= ~IRQD_IRQ_INPROGRESS;
+       __irqd_to_state(d) &= ~IRQD_IRQ_INPROGRESS;
  }
  
  static inline irq_hw_number_t irqd_to_hwirq(struct irq_data *d)
@@@ -462,8 -472,6 +472,8 @@@ extern void handle_nested_irq(unsigned 
  
  extern int irq_chip_compose_msi_msg(struct irq_data *data, struct msi_msg *msg);
  #ifdef        CONFIG_IRQ_DOMAIN_HIERARCHY
 +extern void irq_chip_enable_parent(struct irq_data *data);
 +extern void irq_chip_disable_parent(struct irq_data *data);
  extern void irq_chip_ack_parent(struct irq_data *data);
  extern int irq_chip_retrigger_hierarchy(struct irq_data *data);
  extern void irq_chip_mask_parent(struct irq_data *data);
@@@ -525,15 -533,6 +535,15 @@@ irq_set_chained_handler(unsigned int ir
        __irq_set_handler(irq, handle, 1, NULL);
  }
  
 +/*
 + * Set a highlevel chained flow handler and its data for a given IRQ.
 + * (a chained handler is automatically enabled and set to
 + *  IRQ_NOREQUEST, IRQ_NOPROBE, and IRQ_NOTHREAD)
 + */
 +void
 +irq_set_chained_handler_and_data(unsigned int irq, irq_flow_handler_t handle,
 +                               void *data);
 +
  void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set);
  
  static inline void irq_set_status_flags(unsigned int irq, unsigned long set)
@@@ -641,6 -640,23 +651,23 @@@ static inline u32 irq_get_trigger_type(
        return d ? irqd_get_trigger_type(d) : 0;
  }
  
+ static inline int irq_data_get_node(struct irq_data *d)
+ {
+       return d->node;
+ }
+ static inline struct cpumask *irq_get_affinity_mask(int irq)
+ {
+       struct irq_data *d = irq_get_irq_data(irq);
+       return d ? d->affinity : NULL;
+ }
+ static inline struct cpumask *irq_data_get_affinity_mask(struct irq_data *d)
+ {
+       return d->affinity;
+ }
  unsigned int arch_dynirq_lower_bound(unsigned int from);
  
  int __irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node,
diff --combined kernel/irq/irqdesc.c
@@@ -59,16 -59,10 +59,10 @@@ static void desc_smp_init(struct irq_de
  #endif
  }
  
- static inline int desc_node(struct irq_desc *desc)
- {
-       return desc->irq_data.node;
- }
  #else
  static inline int
  alloc_masks(struct irq_desc *desc, gfp_t gfp, int node) { return 0; }
  static inline void desc_smp_init(struct irq_desc *desc, int node) { }
- static inline int desc_node(struct irq_desc *desc) { return 0; }
  #endif
  
  static void desc_set_defaults(unsigned int irq, struct irq_desc *desc, int node,
@@@ -76,6 -70,7 +70,7 @@@
  {
        int cpu;
  
+       desc->irq_data.common = &desc->irq_common_data;
        desc->irq_data.irq = irq;
        desc->irq_data.chip = &no_irq_chip;
        desc->irq_data.chip_data = NULL;
@@@ -299,7 -294,7 +294,7 @@@ static void free_desc(unsigned int irq
        unsigned long flags;
  
        raw_spin_lock_irqsave(&desc->lock, flags);
-       desc_set_defaults(irq, desc, desc_node(desc), NULL);
+       desc_set_defaults(irq, desc, irq_desc_get_node(desc), NULL);
        raw_spin_unlock_irqrestore(&desc->lock, flags);
  }
  
@@@ -619,7 -614,7 +614,7 @@@ unsigned int kstat_irqs(unsigned int ir
  {
        struct irq_desc *desc = irq_to_desc(irq);
        int cpu;
 -      int sum = 0;
 +      unsigned int sum = 0;
  
        if (!desc || !desc->kstat_irqs)
                return 0;
   */
  unsigned int kstat_irqs_usr(unsigned int irq)
  {
 -      int sum;
 +      unsigned int sum;
  
        irq_lock_sparse();
        sum = kstat_irqs(irq);
diff --combined kernel/irq/irqdomain.c
@@@ -830,10 -830,12 +830,12 @@@ static struct irq_data *irq_domain_inse
  {
        struct irq_data *irq_data;
  
-       irq_data = kzalloc_node(sizeof(*irq_data), GFP_KERNEL, child->node);
+       irq_data = kzalloc_node(sizeof(*irq_data), GFP_KERNEL,
+                               irq_data_get_node(child));
        if (irq_data) {
                child->parent_data = irq_data;
                irq_data->irq = child->irq;
+               irq_data->common = child->common;
                irq_data->node = child->node;
                irq_data->domain = domain;
        }
@@@ -1232,27 -1234,6 +1234,27 @@@ struct irq_data *irq_domain_get_irq_dat
        return (irq_data && irq_data->domain == domain) ? irq_data : NULL;
  }
  
 +/**
 + * irq_domain_set_info - Set the complete data for a @virq in @domain
 + * @domain:           Interrupt domain to match
 + * @virq:             IRQ number
 + * @hwirq:            The hardware interrupt number
 + * @chip:             The associated interrupt chip
 + * @chip_data:                The associated interrupt chip data
 + * @handler:          The interrupt flow handler
 + * @handler_data:     The interrupt flow handler data
 + * @handler_name:     The interrupt handler name
 + */
 +void irq_domain_set_info(struct irq_domain *domain, unsigned int virq,
 +                       irq_hw_number_t hwirq, struct irq_chip *chip,
 +                       void *chip_data, irq_flow_handler_t handler,
 +                       void *handler_data, const char *handler_name)
 +{
 +      irq_set_chip_and_handler_name(virq, chip, handler, handler_name);
 +      irq_set_chip_data(virq, chip_data);
 +      irq_set_handler_data(virq, handler_data);
 +}
 +
  static void irq_domain_check_hierarchy(struct irq_domain *domain)
  {
  }