genirq: Move irq_chip_write_msi_msg() helper to core
[firefly-linux-kernel-4.4.55.git] / include / linux / irq.h
index 03f48d936f6690a17f196f4e8707f6aece369a56..33da579d727cd31a2f24dcbb7565341f8ef8de2a 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/spinlock.h>
 #include <linux/cpumask.h>
 #include <linux/gfp.h>
+#include <linux/irqhandler.h>
 #include <linux/irqreturn.h>
 #include <linux/irqnr.h>
 #include <linux/errno.h>
 
 struct seq_file;
 struct module;
-struct irq_desc;
-struct irq_data;
-typedef        void (*irq_flow_handler_t)(unsigned int irq,
-                                           struct irq_desc *desc);
-typedef        void (*irq_preflow_handler_t)(struct irq_data *data);
+struct msi_msg;
 
 /*
  * IRQ line status.
@@ -113,10 +110,14 @@ enum {
  *
  * IRQ_SET_MASK_OK     - OK, core updates irq_data.affinity
  * IRQ_SET_MASK_NOCPY  - OK, chip did update irq_data.affinity
+ * IRQ_SET_MASK_OK_DONE        - Same as IRQ_SET_MASK_OK for core. Special code to
+ *                       support stacked irqchips, which indicates skipping
+ *                       all descendent irqchips.
  */
 enum {
        IRQ_SET_MASK_OK = 0,
        IRQ_SET_MASK_OK_NOCOPY,
+       IRQ_SET_MASK_OK_DONE,
 };
 
 struct msi_desc;
@@ -133,6 +134,8 @@ struct irq_domain;
  * @chip:              low level interrupt hardware access
  * @domain:            Interrupt translation domain; responsible for mapping
  *                     between hwirq number and linux irq number.
+ * @parent_data:       pointer to parent struct irq_data to support hierarchy
+ *                     irq_domain
  * @handler_data:      per-IRQ data for the irq_chip methods
  * @chip_data:         platform-specific per-chip private data for the chip
  *                     methods, to allow shared chip implementations
@@ -151,6 +154,9 @@ struct irq_data {
        unsigned int            state_use_accessors;
        struct irq_chip         *chip;
        struct irq_domain       *domain;
+#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
+       struct irq_data         *parent_data;
+#endif
        void                    *handler_data;
        void                    *chip_data;
        struct msi_desc         *msi_desc;
@@ -315,6 +321,8 @@ static inline irq_hw_number_t irqd_to_hwirq(struct irq_data *d)
  *                             any other callback related to this irq
  * @irq_release_resources:     optional to release resources acquired with
  *                             irq_request_resources
+ * @irq_compose_msi_msg:       optional to compose message content for MSI
+ * @irq_write_msi_msg: optional to write message content for MSI
  * @flags:             chip specific flags
  */
 struct irq_chip {
@@ -351,6 +359,9 @@ struct irq_chip {
        int             (*irq_request_resources)(struct irq_data *data);
        void            (*irq_release_resources)(struct irq_data *data);
 
+       void            (*irq_compose_msi_msg)(struct irq_data *data, struct msi_msg *msg);
+       void            (*irq_write_msi_msg)(struct irq_data *data, struct msi_msg *msg);
+
        unsigned long   flags;
 };
 
@@ -438,6 +449,18 @@ extern void handle_percpu_devid_irq(unsigned int irq, struct irq_desc *desc);
 extern void handle_bad_irq(unsigned int irq, struct irq_desc *desc);
 extern void handle_nested_irq(unsigned int irq);
 
+extern int irq_chip_compose_msi_msg(struct irq_data *data, struct msi_msg *msg);
+#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
+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);
+extern void irq_chip_unmask_parent(struct irq_data *data);
+extern void irq_chip_eoi_parent(struct irq_data *data);
+extern int irq_chip_set_affinity_parent(struct irq_data *data,
+                                       const struct cpumask *dest,
+                                       bool force);
+#endif
+
 /* Handling of unhandled and spurious interrupts: */
 extern void note_interrupt(unsigned int irq, struct irq_desc *desc,
                           irqreturn_t action_ret);