|
@@ -1416,6 +1416,38 @@ pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
|
|
|
NULL);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * pci_irqd_intx_xlate() - Translate PCI INTx value to an IRQ domain hwirq
|
|
|
+ * @d: the INTx IRQ domain
|
|
|
+ * @node: the DT node for the device whose interrupt we're translating
|
|
|
+ * @intspec: the interrupt specifier data from the DT
|
|
|
+ * @intsize: the number of entries in @intspec
|
|
|
+ * @out_hwirq: pointer at which to write the hwirq number
|
|
|
+ * @out_type: pointer at which to write the interrupt type
|
|
|
+ *
|
|
|
+ * Translate a PCI INTx interrupt number from device tree in the range 1-4, as
|
|
|
+ * stored in the standard PCI_INTERRUPT_PIN register, to a value in the range
|
|
|
+ * 0-3 suitable for use in a 4 entry IRQ domain. That is, subtract one from the
|
|
|
+ * INTx value to obtain the hwirq number.
|
|
|
+ *
|
|
|
+ * Returns 0 on success, or -EINVAL if the interrupt specifier is out of range.
|
|
|
+ */
|
|
|
+static inline int pci_irqd_intx_xlate(struct irq_domain *d,
|
|
|
+ struct device_node *node,
|
|
|
+ const u32 *intspec,
|
|
|
+ unsigned int intsize,
|
|
|
+ unsigned long *out_hwirq,
|
|
|
+ unsigned int *out_type)
|
|
|
+{
|
|
|
+ const u32 intx = intspec[0];
|
|
|
+
|
|
|
+ if (intx < PCI_INTERRUPT_INTA || intx > PCI_INTERRUPT_INTD)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ *out_hwirq = intx - PCI_INTERRUPT_INTA;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
#ifdef CONFIG_PCIEPORTBUS
|
|
|
extern bool pcie_ports_disabled;
|
|
|
extern bool pcie_ports_auto;
|