From: Marc Zyngier <marc.zyngier@arm.com>
To: Jiang Liu <jiang.liu@linux.intel.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>,
Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>,
"grant.likely@linaro.org" <grant.likely@linaro.org>,
Yijing Wang <wangyijing@huawei.com>,
Yingjoe Chen <yingjoe.chen@mediatek.com>,
Borislav Petkov <bp@alien8.de>, "H. Peter Anvin" <hpa@zytor.com>,
Matthias Brugger <matthias.bgg@gmail.com>,
Alexander Gordeev <agordeev@redhat.com>,
Tony Luck <tony.luck@intel.com>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-pci@vger.kernel.org" <linux-pci@vger.kernel.org>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>
Subject: Re: [Patch V1 6/6] PCI, MSI: Provide mechanism to alloc/free MSI/MSIX interrupt from irqdomain
Date: Thu, 13 Nov 2014 19:46:01 +0000 [thread overview]
Message-ID: <54650A79.1020408@arm.com> (raw)
In-Reply-To: <1415879029-20098-8-git-send-email-jiang.liu@linux.intel.com>
Hi Jiang,
On 13/11/14 11:43, Jiang Liu wrote:
> Provide mechanism to directly alloc/free MSI/MSIX interrupt from
> irqdomain, which will be used to replace arch_setup_msi_irq()/
> arch_setup_msi_irqs()/arch_teardown_msi_irq()/arch_teardown_msi_irqs().
>
> To kill weak functions, this patch introduce a new weak function
> arch_get_pci_msi_domain(), which is to retrieve the MSI irqdomain
> for a PCI device. This weak function could be killed once we get
> a common way to associate MSI domain with PCI device.
>
> Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
> ---
> drivers/pci/msi.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++----
> include/linux/msi.h | 3 +++
> 2 files changed, 59 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
> index 0319c21dd208..6f8a2f93187a 100644
> --- a/drivers/pci/msi.c
> +++ b/drivers/pci/msi.c
> @@ -27,8 +27,41 @@ static int pci_msi_enable = 1;
>
> #define msix_table_size(flags) ((flags & PCI_MSIX_FLAGS_QSIZE) + 1)
>
> -/* Arch hooks */
> +#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
> +static struct irq_domain *pci_msi_default_domain;
> +
> +struct irq_domain * __weak arch_get_pci_msi_domain(struct pci_dev *dev)
> +{
> + return pci_msi_default_domain;
> +}
> +
> +static int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
> +{
> + struct irq_domain *domain;
>
> + domain = arch_get_pci_msi_domain(dev);
> + if (domain)
> + return pci_msi_domain_alloc_irqs(domain, type, dev);
> +
> + return arch_setup_msi_irqs(dev, nvec, type);
> +}
> +
> +static void pci_msi_teardown_msi_irqs(struct pci_dev *dev)
> +{
> + struct irq_domain *domain;
> +
> + domain = arch_get_pci_msi_domain(dev);
> + if (domain)
> + pci_msi_domain_free_irqs(domain, dev);
> + else
> + arch_teardown_msi_irqs(dev);
> +}
> +#else
> +#define pci_msi_setup_msi_irqs arch_setup_msi_irqs
> +#define pci_msi_teardown_msi_irqs arch_teardown_msi_irqs
> +#endif
> +
> +/* Arch hooks */
> int __weak arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc)
> {
> struct msi_chip *chip = dev->bus->msi;
> @@ -329,7 +362,7 @@ static void free_msi_irqs(struct pci_dev *dev)
> for (i = 0; i < entry->nvec_used; i++)
> BUG_ON(irq_has_action(entry->irq + i));
>
> - arch_teardown_msi_irqs(dev);
> + pci_msi_teardown_msi_irqs(dev);
>
> list_for_each_entry_safe(entry, tmp, &dev->msi_list, list) {
> if (entry->msi_attrib.is_msix) {
> @@ -581,7 +614,7 @@ static int msi_capability_init(struct pci_dev *dev, int nvec)
> list_add_tail(&entry->list, &dev->msi_list);
>
> /* Configure MSI capability structure */
> - ret = arch_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSI);
> + ret = pci_msi_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSI);
> if (ret) {
> msi_mask_irq(entry, mask, ~mask);
> free_msi_irqs(dev);
> @@ -696,7 +729,7 @@ static int msix_capability_init(struct pci_dev *dev,
> if (ret)
> return ret;
>
> - ret = arch_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSIX);
> + ret = pci_msi_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSIX);
> if (ret)
> goto out_avail;
>
> @@ -1183,4 +1216,23 @@ void pci_msi_domain_free_irqs(struct irq_domain *domain, struct pci_dev *dev)
> {
> msi_domain_free_irqs(domain, &dev->dev);
> }
> +
> +struct irq_domain *pci_msi_create_default_irq_domain(struct device_node *node,
> + struct msi_domain_info *info, struct irq_domain *parent)
> +{
> + struct irq_domain *domain;
> + static DEFINE_MUTEX(pci_msi_domain_lock);
> +
> + mutex_lock(&pci_msi_domain_lock);
> + if (pci_msi_default_domain) {
> + pr_err("PCI: default irq domain for PCI MSI has already been created.\n");
> + domain = NULL;
> + } else {
> + domain = msi_create_irq_domain(node, info, parent);
Surely this needs to be a call to pci_msi_create_irq_domain().
Otherwise, not much is working on the PCI side...
Thanks,
M.
--
Jazz is not dead. It just smells funny...
WARNING: multiple messages have this Message-ID (diff)
From: marc.zyngier@arm.com (Marc Zyngier)
To: linux-arm-kernel@lists.infradead.org
Subject: [Patch V1 6/6] PCI, MSI: Provide mechanism to alloc/free MSI/MSIX interrupt from irqdomain
Date: Thu, 13 Nov 2014 19:46:01 +0000 [thread overview]
Message-ID: <54650A79.1020408@arm.com> (raw)
In-Reply-To: <1415879029-20098-8-git-send-email-jiang.liu@linux.intel.com>
Hi Jiang,
On 13/11/14 11:43, Jiang Liu wrote:
> Provide mechanism to directly alloc/free MSI/MSIX interrupt from
> irqdomain, which will be used to replace arch_setup_msi_irq()/
> arch_setup_msi_irqs()/arch_teardown_msi_irq()/arch_teardown_msi_irqs().
>
> To kill weak functions, this patch introduce a new weak function
> arch_get_pci_msi_domain(), which is to retrieve the MSI irqdomain
> for a PCI device. This weak function could be killed once we get
> a common way to associate MSI domain with PCI device.
>
> Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
> ---
> drivers/pci/msi.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++----
> include/linux/msi.h | 3 +++
> 2 files changed, 59 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
> index 0319c21dd208..6f8a2f93187a 100644
> --- a/drivers/pci/msi.c
> +++ b/drivers/pci/msi.c
> @@ -27,8 +27,41 @@ static int pci_msi_enable = 1;
>
> #define msix_table_size(flags) ((flags & PCI_MSIX_FLAGS_QSIZE) + 1)
>
> -/* Arch hooks */
> +#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
> +static struct irq_domain *pci_msi_default_domain;
> +
> +struct irq_domain * __weak arch_get_pci_msi_domain(struct pci_dev *dev)
> +{
> + return pci_msi_default_domain;
> +}
> +
> +static int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
> +{
> + struct irq_domain *domain;
>
> + domain = arch_get_pci_msi_domain(dev);
> + if (domain)
> + return pci_msi_domain_alloc_irqs(domain, type, dev);
> +
> + return arch_setup_msi_irqs(dev, nvec, type);
> +}
> +
> +static void pci_msi_teardown_msi_irqs(struct pci_dev *dev)
> +{
> + struct irq_domain *domain;
> +
> + domain = arch_get_pci_msi_domain(dev);
> + if (domain)
> + pci_msi_domain_free_irqs(domain, dev);
> + else
> + arch_teardown_msi_irqs(dev);
> +}
> +#else
> +#define pci_msi_setup_msi_irqs arch_setup_msi_irqs
> +#define pci_msi_teardown_msi_irqs arch_teardown_msi_irqs
> +#endif
> +
> +/* Arch hooks */
> int __weak arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc)
> {
> struct msi_chip *chip = dev->bus->msi;
> @@ -329,7 +362,7 @@ static void free_msi_irqs(struct pci_dev *dev)
> for (i = 0; i < entry->nvec_used; i++)
> BUG_ON(irq_has_action(entry->irq + i));
>
> - arch_teardown_msi_irqs(dev);
> + pci_msi_teardown_msi_irqs(dev);
>
> list_for_each_entry_safe(entry, tmp, &dev->msi_list, list) {
> if (entry->msi_attrib.is_msix) {
> @@ -581,7 +614,7 @@ static int msi_capability_init(struct pci_dev *dev, int nvec)
> list_add_tail(&entry->list, &dev->msi_list);
>
> /* Configure MSI capability structure */
> - ret = arch_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSI);
> + ret = pci_msi_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSI);
> if (ret) {
> msi_mask_irq(entry, mask, ~mask);
> free_msi_irqs(dev);
> @@ -696,7 +729,7 @@ static int msix_capability_init(struct pci_dev *dev,
> if (ret)
> return ret;
>
> - ret = arch_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSIX);
> + ret = pci_msi_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSIX);
> if (ret)
> goto out_avail;
>
> @@ -1183,4 +1216,23 @@ void pci_msi_domain_free_irqs(struct irq_domain *domain, struct pci_dev *dev)
> {
> msi_domain_free_irqs(domain, &dev->dev);
> }
> +
> +struct irq_domain *pci_msi_create_default_irq_domain(struct device_node *node,
> + struct msi_domain_info *info, struct irq_domain *parent)
> +{
> + struct irq_domain *domain;
> + static DEFINE_MUTEX(pci_msi_domain_lock);
> +
> + mutex_lock(&pci_msi_domain_lock);
> + if (pci_msi_default_domain) {
> + pr_err("PCI: default irq domain for PCI MSI has already been created.\n");
> + domain = NULL;
> + } else {
> + domain = msi_create_irq_domain(node, info, parent);
Surely this needs to be a call to pci_msi_create_irq_domain().
Otherwise, not much is working on the PCI side...
Thanks,
M.
--
Jazz is not dead. It just smells funny...
next prev parent reply other threads:[~2014-11-13 19:46 UTC|newest]
Thread overview: 74+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-13 11:43 [Patch V1 0/6] Refine generic/PCI MSI irqodmian interfaces Jiang Liu
2014-11-13 11:43 ` Jiang Liu
2014-11-13 11:43 ` [Patch V1 1/6] PCI, MSI: Fix errors caused by commit e5f1a59c4e12 Jiang Liu
2014-11-13 11:43 ` Jiang Liu
2014-11-13 11:43 ` [Patch V1 2/6] PCI, MSI: Introduce helpers to hide struct msi_desc implemenation details Jiang Liu
2014-11-13 11:43 ` Jiang Liu
2014-11-13 11:43 ` [Patch V1 3/6] genirq: Introduce msi_domain_{alloc|free}_irqs() Jiang Liu
2014-11-13 11:43 ` Jiang Liu
2014-11-13 20:23 ` Marc Zyngier
2014-11-13 20:23 ` Marc Zyngier
2014-11-14 0:18 ` Jiang Liu
2014-11-14 0:18 ` Jiang Liu
2014-11-13 11:43 ` [Patch V1 3/6] genirq: Introduce msi_irq_domain_{alloc|free}_irqs() Jiang Liu
2014-11-13 11:43 ` Jiang Liu
2014-11-13 12:34 ` Yijing Wang
2014-11-13 12:34 ` Yijing Wang
2014-11-13 12:41 ` Jiang Liu
2014-11-13 12:41 ` Jiang Liu
2014-11-13 12:57 ` Yijing Wang
2014-11-13 12:57 ` Yijing Wang
2014-11-13 11:43 ` [Patch V1 4/6] genirq: Provide default callbacks for msi_domain_ops Jiang Liu
2014-11-13 11:43 ` Jiang Liu
2014-11-13 11:43 ` [Patch V1 5/6] PCI, MSI: Refine irqdomain interfaces to simplify its usage Jiang Liu
2014-11-13 11:43 ` Jiang Liu
2014-11-13 11:43 ` [Patch V1 6/6] PCI, MSI: Provide mechanism to alloc/free MSI/MSIX interrupt from irqdomain Jiang Liu
2014-11-13 11:43 ` Jiang Liu
2014-11-13 19:46 ` Marc Zyngier [this message]
2014-11-13 19:46 ` Marc Zyngier
2014-11-13 12:28 ` [Patch V1 0/6] Refine generic/PCI MSI irqodmian interfaces Yijing Wang
2014-11-13 12:28 ` Yijing Wang
2014-11-13 12:39 ` Jiang Liu
2014-11-13 12:39 ` Jiang Liu
2014-11-13 12:55 ` Yijing Wang
2014-11-13 12:55 ` Yijing Wang
2014-11-13 13:03 ` Jiang Liu
2014-11-13 13:03 ` Jiang Liu
2014-11-13 13:05 ` Jiang Liu
2014-11-13 13:05 ` Jiang Liu
2014-11-13 21:00 ` Marc Zyngier
2014-11-13 21:00 ` Marc Zyngier
2014-11-13 21:11 ` Thomas Gleixner
2014-11-13 21:11 ` Thomas Gleixner
2014-11-13 21:28 ` Marc Zyngier
2014-11-13 21:28 ` Marc Zyngier
2014-11-14 15:54 ` Jiang Liu
2014-11-14 15:54 ` Jiang Liu
2014-11-14 16:13 ` Marc Zyngier
2014-11-14 16:13 ` Marc Zyngier
2014-11-14 0:25 ` Jiang Liu
2014-11-14 0:25 ` Jiang Liu
2014-11-14 1:09 ` Yijing Wang
2014-11-14 1:09 ` Yijing Wang
2014-11-14 1:22 ` Jiang Liu
2014-11-14 1:22 ` Jiang Liu
2014-11-14 1:31 ` Thomas Gleixner
2014-11-14 1:31 ` Thomas Gleixner
2014-11-14 1:39 ` Jiang Liu
2014-11-14 1:39 ` Jiang Liu
2014-11-14 12:13 ` Thomas Gleixner
2014-11-14 12:13 ` Thomas Gleixner
2014-11-14 14:11 ` Yijing Wang
2014-11-14 14:11 ` Yijing Wang
2014-11-14 14:26 ` Jiang Liu
2014-11-14 14:26 ` Jiang Liu
2014-11-14 15:16 ` Marc Zyngier
2014-11-14 15:16 ` Marc Zyngier
2014-11-14 15:25 ` Jiang Liu
2014-11-14 15:25 ` Jiang Liu
2014-11-14 16:03 ` Marc Zyngier
2014-11-14 16:03 ` Marc Zyngier
2014-11-14 17:11 ` Lucas Stach
2014-11-14 17:11 ` Lucas Stach
2014-11-14 2:16 ` Yijing Wang
2014-11-14 2:16 ` Yijing Wang
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=54650A79.1020408@arm.com \
--to=marc.zyngier@arm.com \
--cc=agordeev@redhat.com \
--cc=bhelgaas@google.com \
--cc=bp@alien8.de \
--cc=grant.likely@linaro.org \
--cc=hpa@zytor.com \
--cc=jiang.liu@linux.intel.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=matthias.bgg@gmail.com \
--cc=mingo@redhat.com \
--cc=tglx@linutronix.de \
--cc=tony.luck@intel.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.