irq_remapping: Introduce new interfaces to support hierarchical irqdomains
[firefly-linux-kernel-4.4.55.git] / drivers / iommu / irq_remapping.c
index 5617150fd8fb9924f16633ce65c3bb3e358ebb6b..c306421d86c1f3eb08dab9c605d0e94bd063d649 100644 (file)
@@ -345,7 +345,7 @@ void panic_if_irq_remap(const char *msg)
                panic(msg);
 }
 
-static void ir_ack_apic_edge(struct irq_data *data)
+void ir_ack_apic_edge(struct irq_data *data)
 {
        ack_APIC_irq();
 }
@@ -356,6 +356,19 @@ static void ir_ack_apic_level(struct irq_data *data)
        eoi_ioapic_irq(data->irq, irqd_cfg(data));
 }
 
+void irq_remapping_print_chip(struct irq_data *data, struct seq_file *p)
+{
+       /*
+        * Assume interrupt is remapped if the parent irqdomain isn't the
+        * vector domain, which is true for MSI, HPET and IOAPIC on x86
+        * platforms.
+        */
+       if (data->domain && data->domain->parent != arch_get_ir_parent_domain())
+               seq_printf(p, " IR-%s", data->chip->name);
+       else
+               seq_printf(p, " %s", data->chip->name);
+}
+
 static void ir_print_prefix(struct irq_data *data, struct seq_file *p)
 {
        seq_printf(p, " IR-%s", data->chip->name);
@@ -377,3 +390,38 @@ bool setup_remapped_irq(int irq, struct irq_cfg *cfg, struct irq_chip *chip)
        irq_remap_modify_chip_defaults(chip);
        return true;
 }
+
+/**
+ * irq_remapping_get_ir_irq_domain - Get the irqdomain associated with the IOMMU
+ *                                  device serving request @info
+ * @info: interrupt allocation information, used to identify the IOMMU device
+ *
+ * It's used to get parent irqdomain for HPET and IOAPIC irqdomains.
+ * Returns pointer to IRQ domain, or NULL on failure.
+ */
+struct irq_domain *
+irq_remapping_get_ir_irq_domain(struct irq_alloc_info *info)
+{
+       if (!remap_ops || !remap_ops->get_ir_irq_domain)
+               return NULL;
+
+       return remap_ops->get_ir_irq_domain(info);
+}
+
+/**
+ * irq_remapping_get_irq_domain - Get the irqdomain serving the request @info
+ * @info: interrupt allocation information, used to identify the IOMMU device
+ *
+ * There will be one PCI MSI/MSIX irqdomain associated with each interrupt
+ * remapping device, so this interface is used to retrieve the PCI MSI/MSIX
+ * irqdomain serving request @info.
+ * Returns pointer to IRQ domain, or NULL on failure.
+ */
+struct irq_domain *
+irq_remapping_get_irq_domain(struct irq_alloc_info *info)
+{
+       if (!remap_ops || !remap_ops->get_irq_domain)
+               return NULL;
+
+       return remap_ops->get_irq_domain(info);
+}