All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yijing Wang <wangyijing@huawei.com>
To: Jiang Liu <jiang.liu@linux.intel.com>,
	Bjorn Helgaas <bhelgaas@google.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Ingo Molnar <mingo@redhat.com>,
	Grant Likely <grant.likely@linaro.org>,
	Marc Zyngier <marc.zyngier@arm.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>
Cc: Tony Luck <tony.luck@intel.com>, <linux-kernel@vger.kernel.org>,
	<linux-pci@vger.kernel.org>,
	<linux-arm-kernel@lists.infradead.org>
Subject: Re: [Patch V1 3/6] genirq: Introduce msi_irq_domain_{alloc|free}_irqs()
Date: Thu, 13 Nov 2014 20:57:55 +0800	[thread overview]
Message-ID: <5464AAD3.2020908@huawei.com> (raw)
In-Reply-To: <5464A6F6.3070506@linux.intel.com>

On 2014/11/13 20:41, Jiang Liu wrote:
> On 2014/11/13 20:34, Yijing Wang wrote:
>> Gerry, this patch seems to be the same as last one.
> Do you means patch 6/6? They are different:)

Oh, it's not the patch problem, I received two double patch.

> 
>>
>>
>> On 2014/11/13 19:43, Jiang Liu wrote:
>>> Introduce msi_irq_domain_{alloc|free}_irqs() to alloc/free interrupts
>>> from irqdomain for generic MSI interrupts.
>>>
>>> Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
>>> ---
>>>  include/linux/msi.h |   35 ++++++++++++++++++++++++++++++
>>>  kernel/irq/msi.c    |   59 +++++++++++++++++++++++++++++++++++++++++++++++++++
>>>  2 files changed, 94 insertions(+)
>>>
>>> diff --git a/include/linux/msi.h b/include/linux/msi.h
>>> index 714716a3ffdd..6b356a1410b2 100644
>>> --- a/include/linux/msi.h
>>> +++ b/include/linux/msi.h
>>> @@ -3,6 +3,7 @@
>>>  
>>>  #include <linux/kobject.h>
>>>  #include <linux/list.h>
>>> +#include <asm/hw_irq.h>		/* for msi_alloc_info_t */
>>>  
>>>  struct msi_msg {
>>>  	u32	address_lo;	/* low 32 bits of msi message address */
>>> @@ -100,7 +101,26 @@ struct irq_chip;
>>>  struct device_node;
>>>  struct msi_domain_info;
>>>  
>>> +#ifndef NUM_MSI_ALLOC_SCRATCHPAD_REGS
>>> +#define NUM_MSI_ALLOC_SCRATCHPAD_REGS	2
>>> +#endif
>>> +
>>> +/*
>>> + * Default structure for MSI interrupt allocation.
>>> + * Arch may overwrite it by define msi_alloc_info_t.
>>> + */
>>> +struct msi_alloc_info {
>>> +	struct msi_desc *desc;
>>> +	irq_hw_number_t hwirq;
>>> +	long		scratchpad[NUM_MSI_ALLOC_SCRATCHPAD_REGS];
>>> +};
>>> +
>>> +#ifndef msi_alloc_info_t
>>> +typedef struct msi_alloc_info msi_alloc_info_t;
>>> +#endif
>>> +
>>>  struct msi_domain_ops {
>>> +	/* Callbacks for msi_create_irq_domain() */
>>>  	void		(*calc_hwirq)(struct msi_domain_info *info, void *arg,
>>>  				      struct msi_desc *desc);
>>>  	irq_hw_number_t	(*get_hwirq)(struct msi_domain_info *info, void *arg);
>>> @@ -111,6 +131,19 @@ struct msi_domain_ops {
>>>  	void		(*msi_free)(struct irq_domain *domain,
>>>  				    struct msi_domain_info *info,
>>>  				    unsigned int virq);
>>> +
>>> +	/* Callbacks for msi_irq_domain_alloc_irqs() based on msi_descs */
>>> +	int		(*msi_check)(struct irq_domain *domain,
>>> +				     struct msi_domain_info *info,
>>> +				     struct device *dev);
>>> +	int		(*msi_prepare)(struct irq_domain *domain,
>>> +				       struct device *dev,
>>> +				       msi_alloc_info_t *arg);
>>> +	void		(*msi_finish)(msi_alloc_info_t *arg, int retval);
>>> +	void		(*set_desc)(msi_alloc_info_t *arg,
>>> +				    struct msi_desc *desc);
>>> +	int		(*handle_error)(struct irq_domain *domain,
>>> +					struct msi_desc *desc, int error);
>>>  };
>>>  
>>>  struct msi_domain_info {
>>> @@ -125,6 +158,8 @@ int msi_domain_set_affinity(struct irq_data *data, const struct cpumask *mask,
>>>  struct irq_domain *msi_create_irq_domain(struct device_node *of_node,
>>>  					 struct msi_domain_info *info,
>>>  					 struct irq_domain *parent);
>>> +int msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev);
>>> +void msi_domain_free_irqs(struct irq_domain *domain, struct device *dev);
>>>  struct msi_domain_info *msi_get_domain_info(struct irq_domain *domain);
>>>  
>>>  #endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */
>>> diff --git a/kernel/irq/msi.c b/kernel/irq/msi.c
>>> index 94d6d87ee23e..0b6665de3a60 100644
>>> --- a/kernel/irq/msi.c
>>> +++ b/kernel/irq/msi.c
>>> @@ -13,6 +13,9 @@
>>>  #include <linux/irqdomain.h>
>>>  #include <linux/msi.h>
>>>  
>>> +/* Temparory solution for building, will be removed later */
>>> +#include <linux/pci.h>
>>> +
>>>  void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
>>>  {
>>>  	*msg = entry->msg;
>>> @@ -124,6 +127,62 @@ struct irq_domain *msi_create_irq_domain(struct device_node *of_node,
>>>  	return domain;
>>>  }
>>>  
>>> +int msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev)
>>> +{
>>> +	int i, ret, virq = -1;
>>> +	msi_alloc_info_t arg;
>>> +	struct msi_desc *desc;
>>> +	struct msi_domain_info *info = domain->host_data;
>>> +	struct msi_domain_ops *ops = info->ops;
>>> +
>>> +	ret = ops->msi_check(domain, info, dev);
>>> +	if (ret == 0)
>>> +		ret = ops->msi_prepare(domain, dev, &arg);
>>> +	if (ret)
>>> +		return ret;
>>> +
>>> +	for_each_msi_entry(desc, dev) {
>>> +		ops->set_desc(&arg, desc);
>>> +
>>> +		virq = __irq_domain_alloc_irqs(domain, -1, desc->nvec_used,
>>> +					       dev_to_node(dev), &arg, false);
>>> +		if (virq < 0) {
>>> +			ret = -ENOSPC;
>>> +			if (ops->handle_error)
>>> +				ret = ops->handle_error(domain, desc, ret);
>>> +			if (ops->msi_finish)
>>> +				ops->msi_finish(&arg, ret);
>>> +			return ret;
>>> +		}
>>> +
>>> +		for (i = 0; i < desc->nvec_used; i++)
>>> +			irq_set_msi_desc_off(virq, i, desc);
>>> +	}
>>> +
>>> +	if (ops->msi_finish)
>>> +		ops->msi_finish(&arg, 0);
>>> +
>>> +	for_each_msi_entry(desc, dev) {
>>> +		if (desc->nvec_used == 1)
>>> +			dev_dbg(dev, "irq %d for MSI\n", virq);
>>> +		else
>>> +			dev_dbg(dev, "irq [%d-%d] for MSI\n",
>>> +				virq, virq + desc->nvec_used - 1);
>>> +	}
>>> +
>>> +	return 0;
>>> +}
>>> +
>>> +void msi_domain_free_irqs(struct irq_domain *domain, struct device *dev)
>>> +{
>>> +	struct msi_desc *desc;
>>> +
>>> +	for_each_msi_entry(desc, dev) {
>>> +		irq_domain_free_irqs(desc->irq, desc->nvec_used);
>>> +		desc->irq = 0;
>>> +	}
>>> +}
>>> +
>>>  struct msi_domain_info *msi_get_domain_info(struct irq_domain *domain)
>>>  {
>>>  	return (struct msi_domain_info *)domain->host_data;
>>>
>>
>>
> 
> .
> 


-- 
Thanks!
Yijing


WARNING: multiple messages have this Message-ID (diff)
From: wangyijing@huawei.com (Yijing Wang)
To: linux-arm-kernel@lists.infradead.org
Subject: [Patch V1 3/6] genirq: Introduce msi_irq_domain_{alloc|free}_irqs()
Date: Thu, 13 Nov 2014 20:57:55 +0800	[thread overview]
Message-ID: <5464AAD3.2020908@huawei.com> (raw)
In-Reply-To: <5464A6F6.3070506@linux.intel.com>

On 2014/11/13 20:41, Jiang Liu wrote:
> On 2014/11/13 20:34, Yijing Wang wrote:
>> Gerry, this patch seems to be the same as last one.
> Do you means patch 6/6? They are different:)

Oh, it's not the patch problem, I received two double patch.

> 
>>
>>
>> On 2014/11/13 19:43, Jiang Liu wrote:
>>> Introduce msi_irq_domain_{alloc|free}_irqs() to alloc/free interrupts
>>> from irqdomain for generic MSI interrupts.
>>>
>>> Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
>>> ---
>>>  include/linux/msi.h |   35 ++++++++++++++++++++++++++++++
>>>  kernel/irq/msi.c    |   59 +++++++++++++++++++++++++++++++++++++++++++++++++++
>>>  2 files changed, 94 insertions(+)
>>>
>>> diff --git a/include/linux/msi.h b/include/linux/msi.h
>>> index 714716a3ffdd..6b356a1410b2 100644
>>> --- a/include/linux/msi.h
>>> +++ b/include/linux/msi.h
>>> @@ -3,6 +3,7 @@
>>>  
>>>  #include <linux/kobject.h>
>>>  #include <linux/list.h>
>>> +#include <asm/hw_irq.h>		/* for msi_alloc_info_t */
>>>  
>>>  struct msi_msg {
>>>  	u32	address_lo;	/* low 32 bits of msi message address */
>>> @@ -100,7 +101,26 @@ struct irq_chip;
>>>  struct device_node;
>>>  struct msi_domain_info;
>>>  
>>> +#ifndef NUM_MSI_ALLOC_SCRATCHPAD_REGS
>>> +#define NUM_MSI_ALLOC_SCRATCHPAD_REGS	2
>>> +#endif
>>> +
>>> +/*
>>> + * Default structure for MSI interrupt allocation.
>>> + * Arch may overwrite it by define msi_alloc_info_t.
>>> + */
>>> +struct msi_alloc_info {
>>> +	struct msi_desc *desc;
>>> +	irq_hw_number_t hwirq;
>>> +	long		scratchpad[NUM_MSI_ALLOC_SCRATCHPAD_REGS];
>>> +};
>>> +
>>> +#ifndef msi_alloc_info_t
>>> +typedef struct msi_alloc_info msi_alloc_info_t;
>>> +#endif
>>> +
>>>  struct msi_domain_ops {
>>> +	/* Callbacks for msi_create_irq_domain() */
>>>  	void		(*calc_hwirq)(struct msi_domain_info *info, void *arg,
>>>  				      struct msi_desc *desc);
>>>  	irq_hw_number_t	(*get_hwirq)(struct msi_domain_info *info, void *arg);
>>> @@ -111,6 +131,19 @@ struct msi_domain_ops {
>>>  	void		(*msi_free)(struct irq_domain *domain,
>>>  				    struct msi_domain_info *info,
>>>  				    unsigned int virq);
>>> +
>>> +	/* Callbacks for msi_irq_domain_alloc_irqs() based on msi_descs */
>>> +	int		(*msi_check)(struct irq_domain *domain,
>>> +				     struct msi_domain_info *info,
>>> +				     struct device *dev);
>>> +	int		(*msi_prepare)(struct irq_domain *domain,
>>> +				       struct device *dev,
>>> +				       msi_alloc_info_t *arg);
>>> +	void		(*msi_finish)(msi_alloc_info_t *arg, int retval);
>>> +	void		(*set_desc)(msi_alloc_info_t *arg,
>>> +				    struct msi_desc *desc);
>>> +	int		(*handle_error)(struct irq_domain *domain,
>>> +					struct msi_desc *desc, int error);
>>>  };
>>>  
>>>  struct msi_domain_info {
>>> @@ -125,6 +158,8 @@ int msi_domain_set_affinity(struct irq_data *data, const struct cpumask *mask,
>>>  struct irq_domain *msi_create_irq_domain(struct device_node *of_node,
>>>  					 struct msi_domain_info *info,
>>>  					 struct irq_domain *parent);
>>> +int msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev);
>>> +void msi_domain_free_irqs(struct irq_domain *domain, struct device *dev);
>>>  struct msi_domain_info *msi_get_domain_info(struct irq_domain *domain);
>>>  
>>>  #endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */
>>> diff --git a/kernel/irq/msi.c b/kernel/irq/msi.c
>>> index 94d6d87ee23e..0b6665de3a60 100644
>>> --- a/kernel/irq/msi.c
>>> +++ b/kernel/irq/msi.c
>>> @@ -13,6 +13,9 @@
>>>  #include <linux/irqdomain.h>
>>>  #include <linux/msi.h>
>>>  
>>> +/* Temparory solution for building, will be removed later */
>>> +#include <linux/pci.h>
>>> +
>>>  void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
>>>  {
>>>  	*msg = entry->msg;
>>> @@ -124,6 +127,62 @@ struct irq_domain *msi_create_irq_domain(struct device_node *of_node,
>>>  	return domain;
>>>  }
>>>  
>>> +int msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev)
>>> +{
>>> +	int i, ret, virq = -1;
>>> +	msi_alloc_info_t arg;
>>> +	struct msi_desc *desc;
>>> +	struct msi_domain_info *info = domain->host_data;
>>> +	struct msi_domain_ops *ops = info->ops;
>>> +
>>> +	ret = ops->msi_check(domain, info, dev);
>>> +	if (ret == 0)
>>> +		ret = ops->msi_prepare(domain, dev, &arg);
>>> +	if (ret)
>>> +		return ret;
>>> +
>>> +	for_each_msi_entry(desc, dev) {
>>> +		ops->set_desc(&arg, desc);
>>> +
>>> +		virq = __irq_domain_alloc_irqs(domain, -1, desc->nvec_used,
>>> +					       dev_to_node(dev), &arg, false);
>>> +		if (virq < 0) {
>>> +			ret = -ENOSPC;
>>> +			if (ops->handle_error)
>>> +				ret = ops->handle_error(domain, desc, ret);
>>> +			if (ops->msi_finish)
>>> +				ops->msi_finish(&arg, ret);
>>> +			return ret;
>>> +		}
>>> +
>>> +		for (i = 0; i < desc->nvec_used; i++)
>>> +			irq_set_msi_desc_off(virq, i, desc);
>>> +	}
>>> +
>>> +	if (ops->msi_finish)
>>> +		ops->msi_finish(&arg, 0);
>>> +
>>> +	for_each_msi_entry(desc, dev) {
>>> +		if (desc->nvec_used == 1)
>>> +			dev_dbg(dev, "irq %d for MSI\n", virq);
>>> +		else
>>> +			dev_dbg(dev, "irq [%d-%d] for MSI\n",
>>> +				virq, virq + desc->nvec_used - 1);
>>> +	}
>>> +
>>> +	return 0;
>>> +}
>>> +
>>> +void msi_domain_free_irqs(struct irq_domain *domain, struct device *dev)
>>> +{
>>> +	struct msi_desc *desc;
>>> +
>>> +	for_each_msi_entry(desc, dev) {
>>> +		irq_domain_free_irqs(desc->irq, desc->nvec_used);
>>> +		desc->irq = 0;
>>> +	}
>>> +}
>>> +
>>>  struct msi_domain_info *msi_get_domain_info(struct irq_domain *domain)
>>>  {
>>>  	return (struct msi_domain_info *)domain->host_data;
>>>
>>
>>
> 
> .
> 


-- 
Thanks!
Yijing

  reply	other threads:[~2014-11-13 13:00 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 [this message]
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
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=5464AAD3.2020908@huawei.com \
    --to=wangyijing@huawei.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=marc.zyngier@arm.com \
    --cc=matthias.bgg@gmail.com \
    --cc=mingo@redhat.com \
    --cc=tglx@linutronix.de \
    --cc=tony.luck@intel.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.