aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/include/linux/msi.h
diff options
context:
space:
mode:
authorMarc Zyngier <marc.zyngier@arm.com>2018-05-08 13:14:30 +0100
committerThomas Gleixner <tglx@linutronix.de>2018-05-13 15:58:59 +0200
commit0be8153cbc2af9a96e9ab8631fc3ba23bb52dbe3 (patch)
tree84328dcb38f9a9d81ce2086419fe40d7b24909dc /include/linux/msi.h
parentgenirq/irq_sim: Use the SPDX license identifier in the header (diff)
downloadwireguard-linux-0be8153cbc2af9a96e9ab8631fc3ba23bb52dbe3.tar.xz
wireguard-linux-0be8153cbc2af9a96e9ab8631fc3ba23bb52dbe3.zip
genirq/msi: Allow level-triggered MSIs to be exposed by MSI providers
So far, MSIs have been used to signal edge-triggered interrupts, as a write is a good model for an edge (you can't "unwrite" something). On the other hand, routing zillions of wires in an SoC because you need level interrupts is a bit extreme. People have come up with a variety of schemes to support this, which involves sending two messages: one to signal the interrupt, and one to clear it. Since the kernel cannot represent this, we've ended up with side-band mechanisms that are pretty awful. Instead, let's acknoledge the requirement, and ensure that, under the right circumstances, the irq_compose_msg and irq_write_msg can take as a parameter an array of two messages instead of a pointer to a single one. We also add some checking that the compose method only clobbers the second message if the MSI domain has been created with the MSI_FLAG_LEVEL_CAPABLE flags. Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: Rob Herring <robh@kernel.org> Cc: Jason Cooper <jason@lakedaemon.net> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> Cc: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com> Cc: Miquel Raynal <miquel.raynal@bootlin.com> Link: https://lkml.kernel.org/r/20180508121438.11301-2-marc.zyngier@arm.com
Diffstat (limited to 'include/linux/msi.h')
-rw-r--r--include/linux/msi.h2
1 files changed, 2 insertions, 0 deletions
diff --git a/include/linux/msi.h b/include/linux/msi.h
index 1f1bbb5b4679..5839d8062dfc 100644
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -289,6 +289,8 @@ enum {
* MSI_FLAG_ACTIVATE_EARLY has been set.
*/
MSI_FLAG_MUST_REACTIVATE = (1 << 5),
+ /* Is level-triggered capable, using two messages */
+ MSI_FLAG_LEVEL_CAPABLE = (1 << 6),
};
int msi_domain_set_affinity(struct irq_data *data, const struct cpumask *mask,