From: Thomas Gleixner <tglx@linutronix.de>
To: LKML <linux-kernel@vger.kernel.org>
Cc: Jiang Liu <jiang.liu@linux.intel.com>,
Bjorn Helgaas <bhelgaas@google.com>,
Grant Likely <grant.likely@linaro.org>,
Marc Zyngier <marc.zyngier@arm.com>,
Yingjoe Chen <yingjoe.chen@mediatek.com>,
Yijing Wang <wangyijing@huawei.com>
Subject: [patch 16/16] PCI/MSI: Enhance core to support hierarchy irqdomain
Date: Wed, 12 Nov 2014 13:43:17 -0000 [thread overview]
Message-ID: <20141112134121.196562300@linutronix.de> (raw)
In-Reply-To: 20141112133941.647950773@linutronix.de
[-- Attachment #1: pci-msi-enhance-core-to-support-hierarchy-irqdomain.patch --]
[-- Type: text/plain, Size: 3955 bytes --]
From: Jiang Liu <jiang.liu@linux.intel.com>
Enhance PCI MSI core to support hierarchy irqdomain, so the common
code can be shared across architectures.
[ tglx: Extracted and combined from several patches ]
Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Grant Likely <grant.likely@linaro.org>
Cc: Marc Zyngier <marc.zyngier@arm.com>
Cc: Yingjoe Chen <yingjoe.chen@mediatek.com>
Cc: Yijing Wang <wangyijing@huawei.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/Kconfig | 5 ++++
drivers/pci/msi.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++
include/linux/msi.h | 8 ++++++
3 files changed, 75 insertions(+)
Index: tip/drivers/pci/Kconfig
===================================================================
--- tip.orig/drivers/pci/Kconfig
+++ tip/drivers/pci/Kconfig
@@ -17,6 +17,11 @@ config PCI_MSI
If you don't know what to do here, say Y.
+config PCI_MSI_IRQ_DOMAIN
+ bool
+ depends on PCI_MSI
+ select GENERIC_MSI_IRQ_DOMAIN
+
config PCI_DEBUG
bool "PCI Debugging"
depends on PCI && DEBUG_KERNEL
Index: tip/drivers/pci/msi.c
===================================================================
--- tip.orig/drivers/pci/msi.c
+++ tip/drivers/pci/msi.c
@@ -19,6 +19,7 @@
#include <linux/errno.h>
#include <linux/io.h>
#include <linux/slab.h>
+#include <linux/irqdomain.h>
#include "pci.h"
@@ -1072,3 +1073,64 @@ int pci_enable_msix_range(struct pci_dev
return nvec;
}
EXPORT_SYMBOL(pci_enable_msix_range);
+
+#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
+void pci_msi_domain_write_msg(struct irq_data *irq_data, struct msi_msg *msg)
+{
+ struct msi_desc *desc = irq_data->msi_desc;
+
+ /*
+ * MSI-X message is written per-IRQ.
+ * MSI message denotes a contiguous group of IRQs, written for 0th IRQ.
+ */
+ if (desc->irq == irq_data->irq)
+ pci_write_msi_msg(desc, msg);
+}
+
+/*
+ * Generate a unique ID number for each possible MSI source, the ID number
+ * is only used within the irqdomain.
+ */
+irq_hw_number_t pci_msi_domain_calc_hwirq(struct pci_dev *dev,
+ struct msi_desc *desc)
+{
+ return (irq_hw_number_t)desc->msi_attrib.entry_nr |
+ PCI_DEVID(dev->bus->number, dev->devfn) << 11 |
+ (pci_domain_nr(dev->bus) & 0xFFFFFFFF) << 27;
+}
+
+int pci_msi_domain_alloc_irqs(struct irq_domain *domain, int type,
+ struct pci_dev *dev, void *arg)
+{
+ struct msi_domain_info *info = domain->host_data;
+ int node = dev_to_node(&dev->dev);
+ struct msi_desc *desc;
+ int i, virq;
+
+ list_for_each_entry(desc, &dev->msi_list, list) {
+ if (info->ops->calc_hwirq)
+ info->ops->calc_hwirq(info, arg, desc);
+
+ virq = irq_domain_alloc_irqs(domain, desc->nvec_used,
+ node, arg);
+ if (virq < 0) {
+ /* Special handling for pci_enable_msi_range(). */
+ if (type == PCI_CAP_ID_MSI && desc->nvec_used > 1)
+ return 1;
+ else
+ return -ENOSPC;
+ }
+ for (i = 0; i < desc->nvec_used; i++)
+ irq_set_msi_desc_off(virq, i, desc);
+ }
+
+ list_for_each_entry(desc, &dev->msi_list, list)
+ if (desc->nvec_used == 1)
+ dev_dbg(&dev->dev, "irq %d for MSI/MSI-X\n", virq);
+ else
+ dev_dbg(&dev->dev, "irq [%d-%d] for MSI/MSI-X\n",
+ virq, virq + desc->nvec_used - 1);
+
+ return 0;
+}
+#endif /* CONFIG_PCI_MSI_IRQ_DOMAIN */
Index: tip/include/linux/msi.h
===================================================================
--- tip.orig/include/linux/msi.h
+++ tip/include/linux/msi.h
@@ -112,4 +112,12 @@ struct msi_domain_info *msi_get_domain_i
#endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */
+#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
+void pci_msi_domain_write_msg(struct irq_data *irq_data, struct msi_msg *msg);
+int pci_msi_domain_alloc_irqs(struct irq_domain *domain, int type,
+ struct pci_dev *dev, void *arg);
+irq_hw_number_t pci_msi_domain_calc_hwirq(struct pci_dev *dev,
+ struct msi_desc *desc);
+#endif /* CONFIG_PCI_MSI_IRQ_DOMAIN */
+
#endif /* LINUX_MSI_H */
next prev parent reply other threads:[~2014-11-12 13:43 UTC|newest]
Thread overview: 94+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-12 13:42 [patch 00/16] genirq: Hierarchical irq domains and generic MSI interrupt code Thomas Gleixner
2014-11-12 13:42 ` [patch 01/16] irqdomain: Introduce new interfaces to support hierarchy irqdomains Thomas Gleixner
2014-11-18 9:24 ` Yun Wu (Abel)
2014-11-18 9:54 ` Thomas Gleixner
2014-11-18 11:48 ` Yun Wu (Abel)
2014-11-24 12:33 ` Yun Wu (Abel)
2014-11-24 13:13 ` Thomas Gleixner
2014-11-24 14:01 ` Yun Wu (Abel)
2014-11-24 14:11 ` Jiang Liu
2014-11-24 14:19 ` Yun Wu (Abel)
2014-11-24 14:33 ` Jiang Liu
2014-11-24 14:46 ` Yun Wu (Abel)
2014-11-24 14:32 ` Thomas Gleixner
2014-11-24 14:45 ` Yun Wu (Abel)
2014-11-12 13:42 ` [patch 02/16] irqdomain: Do irq_find_mapping and set_type for hierarchy irqdomain in case OF Thomas Gleixner
2014-11-12 13:42 ` [patch 03/16] genirq: Introduce helper functions to support stacked irq_chip Thomas Gleixner
2014-11-12 13:42 ` [patch 04/16] genirq: Introduce irq_chip.irq_compose_msi_msg() to support stacked irqchip Thomas Gleixner
2014-11-18 9:26 ` Yun Wu (Abel)
2014-11-18 10:02 ` Thomas Gleixner
2014-11-18 11:47 ` Yun Wu (Abel)
2014-11-18 12:43 ` Jiang Liu
2014-11-18 13:16 ` Yun Wu (Abel)
2014-11-18 13:25 ` Jiang Liu
2014-11-18 13:48 ` Yun Wu (Abel)
2014-11-18 13:55 ` Jiang Liu
2014-11-18 14:03 ` Yun Wu (Abel)
2014-11-18 14:06 ` Jiang Liu
2014-11-12 13:42 ` [patch 05/16] genirq: Add IRQ_SET_MASK_OK_DONE " Thomas Gleixner
2014-11-12 13:43 ` [patch 06/16] genirq: Split out flow handler typedefs into seperate header file Thomas Gleixner
2014-11-12 13:43 ` [patch 07/16] genirq: Introduce helper irq_domain_set_info() to reduce duplicated code Thomas Gleixner
2014-11-13 9:57 ` Yingjoe Chen
2014-11-13 10:00 ` Jiang Liu
2014-11-13 10:48 ` Marc Zyngier
2014-11-14 15:31 ` Marc Zyngier
2014-11-14 15:41 ` Jiang Liu
2014-11-14 17:35 ` Marc Zyngier
2014-11-15 1:26 ` Jiang Liu
2014-11-18 9:26 ` Yun Wu (Abel)
2014-11-18 10:03 ` Thomas Gleixner
2014-11-18 11:47 ` Yun Wu (Abel)
2014-11-18 12:38 ` Jiang Liu
2014-11-18 13:28 ` Yun Wu (Abel)
2014-11-18 13:37 ` Jiang Liu
2014-11-12 13:43 ` [patch 08/16] genirq: Introduce callback irq_chip.irq_write_msi_msg Thomas Gleixner
2014-11-18 9:26 ` Yun Wu (Abel)
2014-11-18 10:19 ` Thomas Gleixner
2014-11-18 13:33 ` Yun Wu (Abel)
2014-11-18 13:43 ` Jiang Liu
2014-11-18 13:52 ` Yun Wu (Abel)
2014-11-18 14:03 ` Jiang Liu
2014-11-18 14:15 ` Jiang Liu
2014-11-18 14:22 ` Yun Wu (Abel)
2014-11-18 14:29 ` Jiang Liu
2014-11-18 14:46 ` Yun Wu (Abel)
2014-11-18 17:14 ` Marc Zyngier
2014-11-19 3:38 ` Yun Wu (Abel)
2014-11-19 8:55 ` Marc Zyngier
2014-11-18 14:32 ` Thomas Gleixner
2014-11-19 6:57 ` Yun Wu (Abel)
2014-11-19 8:02 ` Jiang Liu
2014-11-19 9:20 ` Marc Zyngier
2014-12-10 9:26 ` Yun Wu (Abel)
2014-11-18 14:19 ` Thomas Gleixner
2014-11-18 14:34 ` Yun Wu (Abel)
2014-11-18 14:52 ` Jiang Liu
2014-11-19 3:47 ` Yun Wu (Abel)
2014-11-19 11:09 ` Thomas Gleixner
2014-11-18 17:21 ` Marc Zyngier
2014-11-19 3:40 ` Yun Wu (Abel)
2014-11-19 11:11 ` Thomas Gleixner
2014-12-10 9:11 ` Yun Wu (Abel)
2014-12-10 10:25 ` Thomas Gleixner
2014-12-11 3:01 ` Yun Wu (Abel)
2014-11-18 13:51 ` Jiang Liu
2014-11-12 13:43 ` [patch 09/16] genirq: Add generic msi irq domain support Thomas Gleixner
2014-11-18 12:07 ` Yun Wu (Abel)
2014-11-18 12:49 ` Jiang Liu
2014-11-18 13:55 ` Yun Wu (Abel)
2014-11-18 14:24 ` Thomas Gleixner
2014-11-18 14:39 ` Yun Wu (Abel)
2014-11-20 2:29 ` Jiang Liu
2014-11-12 13:43 ` [patch 10/16] PCI/MSI: Move cached entry functions to irq core Thomas Gleixner
2014-11-12 13:43 ` [patch 11/16] PCI/MSI: Remove unnecessary braces around single statements Thomas Gleixner
2014-11-12 13:43 ` [patch 12/16] PCI/MSI: Simplify PCI MSI code by initializing msi_desc.nvec_used earlier Thomas Gleixner
2014-11-12 13:43 ` [patch 13/16] PCI/MSI: Kill redundant call of irq_set_msi_desc() for MSI-X interrupts Thomas Gleixner
2014-11-12 13:43 ` [patch 14/16] PCI/MSI: Rename __read_msi_msg() to __pci_read_msi_msg() Thomas Gleixner
2014-11-12 13:43 ` [patch 15/16] PCI/MSI: Rename write_msi_msg() to pci_write_msi_msg() Thomas Gleixner
2014-11-12 16:50 ` Jiang Liu
2014-11-12 13:43 ` Thomas Gleixner [this message]
2014-11-12 15:29 ` [patch 16/16] PCI/MSI: Enhance core to support hierarchy irqdomain Marc Zyngier
2014-11-12 16:43 ` Thomas Gleixner
2014-11-12 14:13 ` [patch 00/16] genirq: Hierarchical irq domains and generic MSI interrupt code Yingjoe Chen
2014-11-12 14:48 ` Thomas Gleixner
2014-11-18 9:24 ` Yun Wu (Abel)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20141112134121.196562300@linutronix.de \
--to=tglx@linutronix.de \
--cc=bhelgaas@google.com \
--cc=grant.likely@linaro.org \
--cc=jiang.liu@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=marc.zyngier@arm.com \
--cc=wangyijing@huawei.com \
--cc=yingjoe.chen@mediatek.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.