All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yijing Wang <wangyijing@huawei.com>
To: "Bharat.Bhushan@freescale.com" <Bharat.Bhushan@freescale.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Cc: Xinwei Hu <huxinwei@huawei.com>, Wuyun <wuyun.wu@huawei.com>,
	Bjorn Helgaas <bhelgaas@google.com>,
	"linux-pci@vger.kernel.org" <linux-pci@vger.kernel.org>,
	"Paul.Mundt@huawei.com" <Paul.Mundt@huawei.com>,
	"James E.J. Bottomley" <jejb@parisc-linux.org>,
	Marc Zyngier <marc.zyngier@arm.com>,
	"linux-arm-kernel@lists.infradead.org"
	<linux-arm-kernel@lists.infradead.org>,
	Russell King <linux@arm.linux.org.uk>,
	"linux-arch@vger.kernel.org" <linux-arch@vger.kernel.org>,
	"arnab.basu@freescale.com" <arnab.basu@freescale.com>,
	"virtualization@lists.linux-foundation.org"
	<virtualization@lists.linux-foundation.org>,
	Hanjun Guo <guohanjun@huawei.com>
Subject: Re: [RFC PATCH 11/11] x86/MSI: Refactor x86 MSI code
Date: Wed, 20 Aug 2014 15:01:06 +0800	[thread overview]
Message-ID: <53F447B2.5050501@huawei.com> (raw)
In-Reply-To: <8aad7eac1c4840dcbc7627409f69a292@BLUPR03MB566.namprd03.prod.outlook.com>

On 2014/8/20 14:20, Bharat.Bhushan@freescale.com wrote:
> 
> 
>> -----Original Message-----
>> From: linux-pci-owner@vger.kernel.org [mailto:linux-pci-owner@vger.kernel.org]
>> On Behalf Of Yijing Wang
>> Sent: Saturday, July 26, 2014 8:39 AM
>> To: linux-kernel@vger.kernel.org
>> Cc: Xinwei Hu; Wuyun; Bjorn Helgaas; linux-pci@vger.kernel.org;
>> Paul.Mundt@huawei.com; James E.J. Bottomley; Marc Zyngier; linux-arm-
>> kernel@lists.infradead.org; Russell King; linux-arch@vger.kernel.org; Basu
>> Arnab-B45036; virtualization@lists.linux-foundation.org; Hanjun Guo; Yijing Wang
>> Subject: [RFC PATCH 11/11] x86/MSI: Refactor x86 MSI code
> 
> Please provide description about what this refactoring is? Also does other architecture also need similar refactoring ?

Sorry, I will update all description in my new proposal.

I provided another patchset to decouple MSI driver and arch MSI code,
link: http://marc.info/?l=linux-pci&m=140782732604433&w=2

Based that, there are few changes related to arch MSI code.

I will rebas the patchset based that~

> 
> Thanks
> -Bharat
> 
>>
>> Signed-off-by: Yijing Wang <wangyijing@huawei.com>
>> ---
>>  arch/x86/include/asm/io_apic.h       |    2 +-
>>  arch/x86/include/asm/irq_remapping.h |    4 +-
>>  arch/x86/include/asm/pci.h           |    6 ++--
>>  arch/x86/include/asm/x86_init.h      |   10 +++---
>>  arch/x86/kernel/apic/io_apic.c       |   23 +++++++--------
>>  arch/x86/kernel/x86_init.c           |   12 ++++----
>>  drivers/iommu/amd_iommu.c            |   16 ++++++----
>>  drivers/iommu/intel_irq_remapping.c  |    9 ++++--
>>  drivers/iommu/irq_remapping.c        |   51 ++++++++++++++++-----------------
>>  drivers/iommu/irq_remapping.h        |    6 ++--
>>  drivers/msi/msi.c                    |    3 +-
>>  11 files changed, 72 insertions(+), 70 deletions(-)
>>
>> diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h
>> index 90f97b4..692a90f 100644
>> --- a/arch/x86/include/asm/io_apic.h
>> +++ b/arch/x86/include/asm/io_apic.h
>> @@ -158,7 +158,7 @@ extern int native_setup_ioapic_entry(int, struct
>> IO_APIC_route_entry *,
>>  				     struct io_apic_irq_attr *);
>>  extern void eoi_ioapic_irq(unsigned int irq, struct irq_cfg *cfg);
>>
>> -extern void native_compose_msi_msg(struct pci_dev *pdev,
>> +extern void native_compose_msi_msg(struct msi_irqs *msi,
>>  				   unsigned int irq, unsigned int dest,
>>  				   struct msi_msg *msg, u8 hpet_id);
>>  extern void native_eoi_ioapic_pin(int apic, int pin, int vector);
>> diff --git a/arch/x86/include/asm/irq_remapping.h
>> b/arch/x86/include/asm/irq_remapping.h
>> index b7747c4..a10003d 100644
>> --- a/arch/x86/include/asm/irq_remapping.h
>> +++ b/arch/x86/include/asm/irq_remapping.h
>> @@ -47,7 +47,7 @@ extern int setup_ioapic_remapped_entry(int irq,
>>  				       int vector,
>>  				       struct io_apic_irq_attr *attr);
>>  extern void free_remapped_irq(int irq);
>> -extern void compose_remapped_msi_msg(struct pci_dev *pdev,
>> +extern void compose_remapped_msi_msg(struct msi_irqs *msi,
>>  				     unsigned int irq, unsigned int dest,
>>  				     struct msi_msg *msg, u8 hpet_id);
>>  extern int setup_hpet_msi_remapped(unsigned int irq, unsigned int id);
>> @@ -77,7 +77,7 @@ static inline int setup_ioapic_remapped_entry(int irq,
>>  	return -ENODEV;
>>  }
>>  static inline void free_remapped_irq(int irq) { }
>> -static inline void compose_remapped_msi_msg(struct pci_dev *pdev,
>> +static inline void compose_remapped_msi_msg(struct msi_irqs *msi,
>>  					    unsigned int irq, unsigned int dest,
>>  					    struct msi_msg *msg, u8 hpet_id)
>>  {
>> diff --git a/arch/x86/include/asm/pci.h b/arch/x86/include/asm/pci.h
>> index 0892ea0..04c9ef6 100644
>> --- a/arch/x86/include/asm/pci.h
>> +++ b/arch/x86/include/asm/pci.h
>> @@ -96,10 +96,10 @@ extern void pci_iommu_alloc(void);
>>  #ifdef CONFIG_PCI_MSI
>>  /* implemented in arch/x86/kernel/apic/io_apic. */
>>  struct msi_desc;
>> -int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
>> +int native_setup_msi_irqs(struct msi_irqs *msi, int nvec, int type);
>>  void native_teardown_msi_irq(unsigned int irq);
>> -void native_restore_msi_irqs(struct pci_dev *dev);
>> -int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc,
>> +void native_restore_msi_irqs(struct msi_irqs *msi);
>> +int setup_msi_irq(struct msi_irqs *msi, struct msi_desc *msidesc,
>>  		  unsigned int irq_base, unsigned int irq_offset);
>>  #else
>>  #define native_setup_msi_irqs		NULL
>> diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h
>> index e45e4da..8e42f17 100644
>> --- a/arch/x86/include/asm/x86_init.h
>> +++ b/arch/x86/include/asm/x86_init.h
>> @@ -170,18 +170,18 @@ struct x86_platform_ops {
>>  	void (*apic_post_init)(void);
>>  };
>>
>> -struct pci_dev;
>> +struct msi_irqs;
>>  struct msi_msg;
>>  struct msi_desc;
>>
>>  struct x86_msi_ops {
>> -	int (*setup_msi_irqs)(struct pci_dev *dev, int nvec, int type);
>> -	void (*compose_msi_msg)(struct pci_dev *dev, unsigned int irq,
>> +	int (*setup_msi_irqs)(struct msi_irqs *msi, int nvec, int type);
>> +	void (*compose_msi_msg)(struct msi_irqs *msi, unsigned int irq,
>>  				unsigned int dest, struct msi_msg *msg,
>>  			       u8 hpet_id);
>>  	void (*teardown_msi_irq)(unsigned int irq);
>> -	void (*teardown_msi_irqs)(struct pci_dev *dev);
>> -	void (*restore_msi_irqs)(struct pci_dev *dev);
>> +	void (*teardown_msi_irqs)(struct msi_irqs *msi);
>> +	void (*restore_msi_irqs)(struct msi_irqs *msi);
>>  	int  (*setup_hpet_msi)(unsigned int irq, unsigned int id);
>>  	u32 (*msi_mask_irq)(struct msi_desc *desc, u32 mask, u32 flag);
>>  	u32 (*msix_mask_irq)(struct msi_desc *desc, u32 flag);
>> diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
>> index b833042..3cb4a6a 100644
>> --- a/arch/x86/kernel/apic/io_apic.c
>> +++ b/arch/x86/kernel/apic/io_apic.c
>> @@ -2939,7 +2939,7 @@ void arch_teardown_hwirq(unsigned int irq)
>>  /*
>>   * MSI message composition
>>   */
>> -void native_compose_msi_msg(struct pci_dev *pdev,
>> +void native_compose_msi_msg(struct msi_irqs *msi,
>>  			    unsigned int irq, unsigned int dest,
>>  			    struct msi_msg *msg, u8 hpet_id)
>>  {
>> @@ -2970,7 +2970,7 @@ void native_compose_msi_msg(struct pci_dev *pdev,
>>  }
>>
>>  #ifdef CONFIG_PCI_MSI
>> -static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq,
>> +static int msi_compose_msg(struct msi_irqs *msi, unsigned int irq,
>>  			   struct msi_msg *msg, u8 hpet_id)
>>  {
>>  	struct irq_cfg *cfg;
>> @@ -2990,7 +2990,7 @@ static int msi_compose_msg(struct pci_dev *pdev, unsigned
>> int irq,
>>  	if (err)
>>  		return err;
>>
>> -	x86_msi.compose_msi_msg(pdev, irq, dest, msg, hpet_id);
>> +	x86_msi.compose_msi_msg(msi, irq, dest, msg, hpet_id);
>>
>>  	return 0;
>>  }
>> @@ -3032,15 +3032,16 @@ static struct irq_chip msi_chip = {
>>  	.irq_retrigger		= ioapic_retrigger_irq,
>>  };
>>
>> -int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc,
>> +int setup_msi_irq(struct msi_irqs *msi, struct msi_desc *msidesc,
>>  		  unsigned int irq_base, unsigned int irq_offset)
>>  {
>>  	struct irq_chip *chip = &msi_chip;
>>  	struct msi_msg msg;
>>  	unsigned int irq = irq_base + irq_offset;
>>  	int ret;
>> +	struct pci_dev *dev = msi->data;
>>
>> -	ret = msi_compose_msg(dev, irq, &msg, -1);
>> +	ret = msi_compose_msg(msi, irq, &msg, -1);
>>  	if (ret < 0)
>>  		return ret;
>>
>> @@ -3062,24 +3063,22 @@ int setup_msi_irq(struct pci_dev *dev, struct msi_desc
>> *msidesc,
>>  	return 0;
>>  }
>>
>> -int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
>> +int native_setup_msi_irqs(struct msi_irqs *msi, int nvec, int type)
>>  {
>>  	struct msi_desc *msidesc;
>>  	unsigned int irq;
>> -	int node, ret;
>> +	int ret;
>>
>>  	/* Multiple MSI vectors only supported with interrupt remapping */
>>  	if (type == MSI_TYPE && nvec > 1)
>>  		return 1;
>>
>> -	node = dev_to_node(&dev->dev);
>> -
>> -	list_for_each_entry(msidesc, &dev->msi_list, list) {
>> -		irq = irq_alloc_hwirq(node);
>> +	list_for_each_entry(msidesc, &msi->msi_list, list) {
>> +		irq = irq_alloc_hwirq(msi->node);
>>  		if (!irq)
>>  			return -ENOSPC;
>>
>> -		ret = setup_msi_irq(dev, msidesc, irq, 0);
>> +		ret = setup_msi_irq(msi, msidesc, irq, 0);
>>  		if (ret < 0) {
>>  			irq_free_hwirq(irq);
>>  			return ret;
>> diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c
>> index e48b674..a277faf 100644
>> --- a/arch/x86/kernel/x86_init.c
>> +++ b/arch/x86/kernel/x86_init.c
>> @@ -121,14 +121,14 @@ struct x86_msi_ops x86_msi = {
>>  };
>>
>>  /* MSI arch specific hooks */
>> -int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
>> +int arch_setup_msi_irqs(struct msi_irqs *msi, int nvec, int type)
>>  {
>> -	return x86_msi.setup_msi_irqs(dev, nvec, type);
>> +	return x86_msi.setup_msi_irqs(msi, nvec, type);
>>  }
>>
>> -void arch_teardown_msi_irqs(struct pci_dev *dev)
>> +void arch_teardown_msi_irqs(struct msi_irqs *msi)
>>  {
>> -	x86_msi.teardown_msi_irqs(dev);
>> +	x86_msi.teardown_msi_irqs(msi);
>>  }
>>
>>  void arch_teardown_msi_irq(unsigned int irq)
>> @@ -136,9 +136,9 @@ void arch_teardown_msi_irq(unsigned int irq)
>>  	x86_msi.teardown_msi_irq(irq);
>>  }
>>
>> -void arch_restore_msi_irqs(struct pci_dev *dev)
>> +void arch_restore_msi_irqs(struct msi_irqs *msi)
>>  {
>> -	x86_msi.restore_msi_irqs(dev);
>> +	x86_msi.restore_msi_irqs(msi);
>>  }
>>  u32 arch_msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag)
>>  {
>> diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c
>> index 4aec6a2..0e45cb7 100644
>> --- a/drivers/iommu/amd_iommu.c
>> +++ b/drivers/iommu/amd_iommu.c
>> @@ -4237,7 +4237,7 @@ static int free_irq(int irq)
>>  	return 0;
>>  }
>>
>> -static void compose_msi_msg(struct pci_dev *pdev,
>> +static void compose_msi_msg(struct msi_irqs *msi,
>>  			    unsigned int irq, unsigned int dest,
>>  			    struct msi_msg *msg, u8 hpet_id)
>>  {
>> @@ -4265,33 +4265,35 @@ static void compose_msi_msg(struct pci_dev *pdev,
>>  	msg->data       = irte_info->index;
>>  }
>>
>> -static int msi_alloc_irq(struct pci_dev *pdev, int irq, int nvec)
>> +static int msi_alloc_irq(struct msi_irqs *msi, int irq, int nvec)
>>  {
>>  	struct irq_cfg *cfg;
>>  	int index;
>>  	u16 devid;
>> +	struct pci_dev *dev = msi->data;
>>
>> -	if (!pdev)
>> +	if (!dev)
>>  		return -EINVAL;
>>
>>  	cfg = irq_get_chip_data(irq);
>>  	if (!cfg)
>>  		return -EINVAL;
>>
>> -	devid = get_device_id(&pdev->dev);
>> +	devid = get_device_id(&dev->dev);
>>  	index = alloc_irq_index(cfg, devid, nvec);
>>
>>  	return index < 0 ? MAX_IRQS_PER_TABLE : index;
>>  }
>>
>> -static int msi_setup_irq(struct pci_dev *pdev, unsigned int irq,
>> +static int msi_setup_irq(struct msi_irqs *msi, unsigned int irq,
>>  			 int index, int offset)
>>  {
>>  	struct irq_2_irte *irte_info;
>>  	struct irq_cfg *cfg;
>>  	u16 devid;
>> +	struct pci_dev *dev = msi->data;
>>
>> -	if (!pdev)
>> +	if (!dev)
>>  		return -EINVAL;
>>
>>  	cfg = irq_get_chip_data(irq);
>> @@ -4301,7 +4303,7 @@ static int msi_setup_irq(struct pci_dev *pdev, unsigned
>> int irq,
>>  	if (index >= MAX_IRQS_PER_TABLE)
>>  		return 0;
>>
>> -	devid		= get_device_id(&pdev->dev);
>> +	devid		= get_device_id(&dev->dev);
>>  	irte_info	= &cfg->irq_2_irte;
>>
>>  	cfg->remapped	      = 1;
>> diff --git a/drivers/iommu/intel_irq_remapping.c
>> b/drivers/iommu/intel_irq_remapping.c
>> index 9b17489..d6bde63 100644
>> --- a/drivers/iommu/intel_irq_remapping.c
>> +++ b/drivers/iommu/intel_irq_remapping.c
>> @@ -1027,7 +1027,7 @@ intel_ioapic_set_affinity(struct irq_data *data, const
>> struct cpumask *mask,
>>  	return 0;
>>  }
>>
>> -static void intel_compose_msi_msg(struct pci_dev *pdev,
>> +static void intel_compose_msi_msg(struct msi_irqs *msi,
>>  				  unsigned int irq, unsigned int dest,
>>  				  struct msi_msg *msg, u8 hpet_id)
>>  {
>> @@ -1035,6 +1035,7 @@ static void intel_compose_msi_msg(struct pci_dev *pdev,
>>  	struct irte irte;
>>  	u16 sub_handle = 0;
>>  	int ir_index;
>> +	struct pci_dev *pdev = msi->data;
>>
>>  	cfg = irq_get_chip_data(irq);
>>
>> @@ -1064,10 +1065,11 @@ static void intel_compose_msi_msg(struct pci_dev *pdev,
>>   * and allocate 'nvec' consecutive interrupt-remapping table entries
>>   * in it.
>>   */
>> -static int intel_msi_alloc_irq(struct pci_dev *dev, int irq, int nvec)
>> +static int intel_msi_alloc_irq(struct msi_irqs *msi, int irq, int nvec)
>>  {
>>  	struct intel_iommu *iommu;
>>  	int index;
>> +	struct pci_dev *dev = msi->data;
>>
>>  	down_read(&dmar_global_lock);
>>  	iommu = map_dev_to_ir(dev);
>> @@ -1089,11 +1091,12 @@ static int intel_msi_alloc_irq(struct pci_dev *dev, int
>> irq, int nvec)
>>  	return index;
>>  }
>>
>> -static int intel_msi_setup_irq(struct pci_dev *pdev, unsigned int irq,
>> +static int intel_msi_setup_irq(struct msi_irqs *msi, unsigned int irq,
>>  			       int index, int sub_handle)
>>  {
>>  	struct intel_iommu *iommu;
>>  	int ret = -ENOENT;
>> +	struct pci_dev *pdev = msi->data;
>>
>>  	down_read(&dmar_global_lock);
>>  	iommu = map_dev_to_ir(pdev);
>> diff --git a/drivers/iommu/irq_remapping.c b/drivers/iommu/irq_remapping.c
>> index a3b1805..1fe14e5 100644
>> --- a/drivers/iommu/irq_remapping.c
>> +++ b/drivers/iommu/irq_remapping.c
>> @@ -24,8 +24,8 @@ int no_x2apic_optout;
>>
>>  static struct irq_remap_ops *remap_ops;
>>
>> -static int msi_alloc_remapped_irq(struct pci_dev *pdev, int irq, int nvec);
>> -static int msi_setup_remapped_irq(struct pci_dev *pdev, unsigned int irq,
>> +static int msi_alloc_remapped_irq(struct msi_irqs *msi, int irq, int nvec);
>> +static int msi_setup_remapped_irq(struct msi_irqs *msi, unsigned int irq,
>>  				  int index, int sub_handle);
>>  static int set_remapped_irq_affinity(struct irq_data *data,
>>  				     const struct cpumask *mask,
>> @@ -49,19 +49,19 @@ static void irq_remapping_disable_io_apic(void)
>>  		disconnect_bsp_APIC(0);
>>  }
>>
>> -static int do_setup_msi_irqs(struct pci_dev *dev, int nvec)
>> +static int do_setup_msi_irqs(struct msi_irqs *msi, int nvec)
>>  {
>>  	int ret, sub_handle, nvec_pow2, index = 0;
>>  	unsigned int irq;
>>  	struct msi_desc *msidesc;
>>
>> -	WARN_ON(!list_is_singular(&dev->msi_list));
>> -	msidesc = list_entry(dev->msi_list.next, struct msi_desc, list);
>> +	WARN_ON(!list_is_singular(&msi->msi_list));
>> +	msidesc = list_entry(msi->msi_list.next, struct msi_desc, list);
>>  	WARN_ON(msidesc->irq);
>>  	WARN_ON(msidesc->msi_attrib.multiple);
>>  	WARN_ON(msidesc->nvec_used);
>>
>> -	irq = irq_alloc_hwirqs(nvec, dev_to_node(&dev->dev));
>> +	irq = irq_alloc_hwirqs(nvec, msi->node);
>>  	if (irq == 0)
>>  		return -ENOSPC;
>>
>> @@ -70,18 +70,18 @@ static int do_setup_msi_irqs(struct pci_dev *dev, int nvec)
>>  	msidesc->msi_attrib.multiple = ilog2(nvec_pow2);
>>  	for (sub_handle = 0; sub_handle < nvec; sub_handle++) {
>>  		if (!sub_handle) {
>> -			index = msi_alloc_remapped_irq(dev, irq, nvec_pow2);
>> +			index = msi_alloc_remapped_irq(msi, irq, nvec_pow2);
>>  			if (index < 0) {
>>  				ret = index;
>>  				goto error;
>>  			}
>>  		} else {
>> -			ret = msi_setup_remapped_irq(dev, irq + sub_handle,
>> +			ret = msi_setup_remapped_irq(msi, irq + sub_handle,
>>  						     index, sub_handle);
>>  			if (ret < 0)
>>  				goto error;
>>  		}
>> -		ret = setup_msi_irq(dev, msidesc, irq, sub_handle);
>> +		ret = setup_msi_irq(msi, msidesc, irq, sub_handle);
>>  		if (ret < 0)
>>  			goto error;
>>  	}
>> @@ -101,30 +101,29 @@ error:
>>  	return ret;
>>  }
>>
>> -static int do_setup_msix_irqs(struct pci_dev *dev, int nvec)
>> +static int do_setup_msix_irqs(struct msi_irqs *msi, int nvec)
>>  {
>>  	int node, ret, sub_handle, index = 0;
>>  	struct msi_desc *msidesc;
>>  	unsigned int irq;
>>
>> -	node		= dev_to_node(&dev->dev);
>>  	sub_handle	= 0;
>>
>> -	list_for_each_entry(msidesc, &dev->msi_list, list) {
>> +	list_for_each_entry(msidesc, &msi->msi_list, list) {
>>
>> -		irq = irq_alloc_hwirq(node);
>> +		irq = irq_alloc_hwirq(msi->node);
>>  		if (irq == 0)
>>  			return -1;
>>
>>  		if (sub_handle == 0)
>> -			ret = index = msi_alloc_remapped_irq(dev, irq, nvec);
>> +			ret = index = msi_alloc_remapped_irq(msi, irq, nvec);
>>  		else
>> -			ret = msi_setup_remapped_irq(dev, irq, index, sub_handle);
>> +			ret = msi_setup_remapped_irq(msi, irq, index, sub_handle);
>>
>>  		if (ret < 0)
>>  			goto error;
>>
>> -		ret = setup_msi_irq(dev, msidesc, irq, 0);
>> +		ret = setup_msi_irq(msi, msidesc, irq, 0);
>>  		if (ret < 0)
>>  			goto error;
>>
>> @@ -139,13 +138,13 @@ error:
>>  	return ret;
>>  }
>>
>> -static int irq_remapping_setup_msi_irqs(struct pci_dev *dev,
>> +static int irq_remapping_setup_msi_irqs(struct msi_irqs *msi,
>>  					int nvec, int type)
>>  {
>>  	if (type == MSI_TYPE)
>> -		return do_setup_msi_irqs(dev, nvec);
>> +		return do_setup_msi_irqs(msi, nvec);
>>  	else
>> -		return do_setup_msix_irqs(dev, nvec);
>> +		return do_setup_msix_irqs(msi, nvec);
>>  }
>>
>>  static void eoi_ioapic_pin_remapped(int apic, int pin, int vector)
>> @@ -314,33 +313,33 @@ void free_remapped_irq(int irq)
>>  		remap_ops->free_irq(irq);
>>  }
>>
>> -void compose_remapped_msi_msg(struct pci_dev *pdev,
>> +void compose_remapped_msi_msg(struct msi_irqs *msi,
>>  			      unsigned int irq, unsigned int dest,
>>  			      struct msi_msg *msg, u8 hpet_id)
>>  {
>>  	struct irq_cfg *cfg = irq_get_chip_data(irq);
>>
>>  	if (!irq_remapped(cfg))
>> -		native_compose_msi_msg(pdev, irq, dest, msg, hpet_id);
>> +		native_compose_msi_msg(msi, irq, dest, msg, hpet_id);
>>  	else if (remap_ops && remap_ops->compose_msi_msg)
>> -		remap_ops->compose_msi_msg(pdev, irq, dest, msg, hpet_id);
>> +		remap_ops->compose_msi_msg(msi, irq, dest, msg, hpet_id);
>>  }
>>
>> -static int msi_alloc_remapped_irq(struct pci_dev *pdev, int irq, int nvec)
>> +static int msi_alloc_remapped_irq(struct msi_irqs *msi, int irq, int nvec)
>>  {
>>  	if (!remap_ops || !remap_ops->msi_alloc_irq)
>>  		return -ENODEV;
>>
>> -	return remap_ops->msi_alloc_irq(pdev, irq, nvec);
>> +	return remap_ops->msi_alloc_irq(msi, irq, nvec);
>>  }
>>
>> -static int msi_setup_remapped_irq(struct pci_dev *pdev, unsigned int irq,
>> +static int msi_setup_remapped_irq(struct msi_irqs *msi, unsigned int irq,
>>  				  int index, int sub_handle)
>>  {
>>  	if (!remap_ops || !remap_ops->msi_setup_irq)
>>  		return -ENODEV;
>>
>> -	return remap_ops->msi_setup_irq(pdev, irq, index, sub_handle);
>> +	return remap_ops->msi_setup_irq(msi, irq, index, sub_handle);
>>  }
>>
>>  int setup_hpet_msi_remapped(unsigned int irq, unsigned int id)
>> diff --git a/drivers/iommu/irq_remapping.h b/drivers/iommu/irq_remapping.h
>> index 90c4dae..59c4cfb 100644
>> --- a/drivers/iommu/irq_remapping.h
>> +++ b/drivers/iommu/irq_remapping.h
>> @@ -69,15 +69,15 @@ struct irq_remap_ops {
>>  	int (*free_irq)(int);
>>
>>  	/* Create MSI msg to use for interrupt remapping */
>> -	void (*compose_msi_msg)(struct pci_dev *,
>> +	void (*compose_msi_msg)(struct msi_irqs *,
>>  				unsigned int, unsigned int,
>>  				struct msi_msg *, u8);
>>
>>  	/* Allocate remapping resources for MSI */
>> -	int (*msi_alloc_irq)(struct pci_dev *, int, int);
>> +	int (*msi_alloc_irq)(struct msi_irqs *, int, int);
>>
>>  	/* Setup the remapped MSI irq */
>> -	int (*msi_setup_irq)(struct pci_dev *, unsigned int, int, int);
>> +	int (*msi_setup_irq)(struct msi_irqs *, unsigned int, int, int);
>>
>>  	/* Setup interrupt remapping for an HPET MSI */
>>  	int (*setup_hpet_msi)(unsigned int, unsigned int);
>> diff --git a/drivers/msi/msi.c b/drivers/msi/msi.c
>> index 3fbd539..8462c6c 100644
>> --- a/drivers/msi/msi.c
>> +++ b/drivers/msi/msi.c
>> @@ -510,9 +510,8 @@ int msix_capability_init(struct msi_irqs *msi, void __iomem
>> *base,
>>
>>  	/* Set MSI-X enabled bits and unmask the function */
>>  	msi_set_intx(msi, 0);
>> -	msi->msix_enabled = 1;
>> -
>>  	msi_set_enable(msi, 1, MSIX_TYPE);
>> +	msi->msix_enabled = 1;
>>
>>  	return 0;
>>
>> --
>> 1.7.1
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-pci" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
> 
> .
> 


-- 
Thanks!
Yijing

WARNING: multiple messages have this Message-ID (diff)
From: wangyijing@huawei.com (Yijing Wang)
To: linux-arm-kernel@lists.infradead.org
Subject: [RFC PATCH 11/11] x86/MSI: Refactor x86 MSI code
Date: Wed, 20 Aug 2014 15:01:06 +0800	[thread overview]
Message-ID: <53F447B2.5050501@huawei.com> (raw)
In-Reply-To: <8aad7eac1c4840dcbc7627409f69a292@BLUPR03MB566.namprd03.prod.outlook.com>

On 2014/8/20 14:20, Bharat.Bhushan at freescale.com wrote:
> 
> 
>> -----Original Message-----
>> From: linux-pci-owner at vger.kernel.org [mailto:linux-pci-owner at vger.kernel.org]
>> On Behalf Of Yijing Wang
>> Sent: Saturday, July 26, 2014 8:39 AM
>> To: linux-kernel at vger.kernel.org
>> Cc: Xinwei Hu; Wuyun; Bjorn Helgaas; linux-pci at vger.kernel.org;
>> Paul.Mundt at huawei.com; James E.J. Bottomley; Marc Zyngier; linux-arm-
>> kernel at lists.infradead.org; Russell King; linux-arch at vger.kernel.org; Basu
>> Arnab-B45036; virtualization at lists.linux-foundation.org; Hanjun Guo; Yijing Wang
>> Subject: [RFC PATCH 11/11] x86/MSI: Refactor x86 MSI code
> 
> Please provide description about what this refactoring is? Also does other architecture also need similar refactoring ?

Sorry, I will update all description in my new proposal.

I provided another patchset to decouple MSI driver and arch MSI code,
link: http://marc.info/?l=linux-pci&m=140782732604433&w=2

Based that, there are few changes related to arch MSI code.

I will rebas the patchset based that~

> 
> Thanks
> -Bharat
> 
>>
>> Signed-off-by: Yijing Wang <wangyijing@huawei.com>
>> ---
>>  arch/x86/include/asm/io_apic.h       |    2 +-
>>  arch/x86/include/asm/irq_remapping.h |    4 +-
>>  arch/x86/include/asm/pci.h           |    6 ++--
>>  arch/x86/include/asm/x86_init.h      |   10 +++---
>>  arch/x86/kernel/apic/io_apic.c       |   23 +++++++--------
>>  arch/x86/kernel/x86_init.c           |   12 ++++----
>>  drivers/iommu/amd_iommu.c            |   16 ++++++----
>>  drivers/iommu/intel_irq_remapping.c  |    9 ++++--
>>  drivers/iommu/irq_remapping.c        |   51 ++++++++++++++++-----------------
>>  drivers/iommu/irq_remapping.h        |    6 ++--
>>  drivers/msi/msi.c                    |    3 +-
>>  11 files changed, 72 insertions(+), 70 deletions(-)
>>
>> diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h
>> index 90f97b4..692a90f 100644
>> --- a/arch/x86/include/asm/io_apic.h
>> +++ b/arch/x86/include/asm/io_apic.h
>> @@ -158,7 +158,7 @@ extern int native_setup_ioapic_entry(int, struct
>> IO_APIC_route_entry *,
>>  				     struct io_apic_irq_attr *);
>>  extern void eoi_ioapic_irq(unsigned int irq, struct irq_cfg *cfg);
>>
>> -extern void native_compose_msi_msg(struct pci_dev *pdev,
>> +extern void native_compose_msi_msg(struct msi_irqs *msi,
>>  				   unsigned int irq, unsigned int dest,
>>  				   struct msi_msg *msg, u8 hpet_id);
>>  extern void native_eoi_ioapic_pin(int apic, int pin, int vector);
>> diff --git a/arch/x86/include/asm/irq_remapping.h
>> b/arch/x86/include/asm/irq_remapping.h
>> index b7747c4..a10003d 100644
>> --- a/arch/x86/include/asm/irq_remapping.h
>> +++ b/arch/x86/include/asm/irq_remapping.h
>> @@ -47,7 +47,7 @@ extern int setup_ioapic_remapped_entry(int irq,
>>  				       int vector,
>>  				       struct io_apic_irq_attr *attr);
>>  extern void free_remapped_irq(int irq);
>> -extern void compose_remapped_msi_msg(struct pci_dev *pdev,
>> +extern void compose_remapped_msi_msg(struct msi_irqs *msi,
>>  				     unsigned int irq, unsigned int dest,
>>  				     struct msi_msg *msg, u8 hpet_id);
>>  extern int setup_hpet_msi_remapped(unsigned int irq, unsigned int id);
>> @@ -77,7 +77,7 @@ static inline int setup_ioapic_remapped_entry(int irq,
>>  	return -ENODEV;
>>  }
>>  static inline void free_remapped_irq(int irq) { }
>> -static inline void compose_remapped_msi_msg(struct pci_dev *pdev,
>> +static inline void compose_remapped_msi_msg(struct msi_irqs *msi,
>>  					    unsigned int irq, unsigned int dest,
>>  					    struct msi_msg *msg, u8 hpet_id)
>>  {
>> diff --git a/arch/x86/include/asm/pci.h b/arch/x86/include/asm/pci.h
>> index 0892ea0..04c9ef6 100644
>> --- a/arch/x86/include/asm/pci.h
>> +++ b/arch/x86/include/asm/pci.h
>> @@ -96,10 +96,10 @@ extern void pci_iommu_alloc(void);
>>  #ifdef CONFIG_PCI_MSI
>>  /* implemented in arch/x86/kernel/apic/io_apic. */
>>  struct msi_desc;
>> -int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
>> +int native_setup_msi_irqs(struct msi_irqs *msi, int nvec, int type);
>>  void native_teardown_msi_irq(unsigned int irq);
>> -void native_restore_msi_irqs(struct pci_dev *dev);
>> -int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc,
>> +void native_restore_msi_irqs(struct msi_irqs *msi);
>> +int setup_msi_irq(struct msi_irqs *msi, struct msi_desc *msidesc,
>>  		  unsigned int irq_base, unsigned int irq_offset);
>>  #else
>>  #define native_setup_msi_irqs		NULL
>> diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h
>> index e45e4da..8e42f17 100644
>> --- a/arch/x86/include/asm/x86_init.h
>> +++ b/arch/x86/include/asm/x86_init.h
>> @@ -170,18 +170,18 @@ struct x86_platform_ops {
>>  	void (*apic_post_init)(void);
>>  };
>>
>> -struct pci_dev;
>> +struct msi_irqs;
>>  struct msi_msg;
>>  struct msi_desc;
>>
>>  struct x86_msi_ops {
>> -	int (*setup_msi_irqs)(struct pci_dev *dev, int nvec, int type);
>> -	void (*compose_msi_msg)(struct pci_dev *dev, unsigned int irq,
>> +	int (*setup_msi_irqs)(struct msi_irqs *msi, int nvec, int type);
>> +	void (*compose_msi_msg)(struct msi_irqs *msi, unsigned int irq,
>>  				unsigned int dest, struct msi_msg *msg,
>>  			       u8 hpet_id);
>>  	void (*teardown_msi_irq)(unsigned int irq);
>> -	void (*teardown_msi_irqs)(struct pci_dev *dev);
>> -	void (*restore_msi_irqs)(struct pci_dev *dev);
>> +	void (*teardown_msi_irqs)(struct msi_irqs *msi);
>> +	void (*restore_msi_irqs)(struct msi_irqs *msi);
>>  	int  (*setup_hpet_msi)(unsigned int irq, unsigned int id);
>>  	u32 (*msi_mask_irq)(struct msi_desc *desc, u32 mask, u32 flag);
>>  	u32 (*msix_mask_irq)(struct msi_desc *desc, u32 flag);
>> diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
>> index b833042..3cb4a6a 100644
>> --- a/arch/x86/kernel/apic/io_apic.c
>> +++ b/arch/x86/kernel/apic/io_apic.c
>> @@ -2939,7 +2939,7 @@ void arch_teardown_hwirq(unsigned int irq)
>>  /*
>>   * MSI message composition
>>   */
>> -void native_compose_msi_msg(struct pci_dev *pdev,
>> +void native_compose_msi_msg(struct msi_irqs *msi,
>>  			    unsigned int irq, unsigned int dest,
>>  			    struct msi_msg *msg, u8 hpet_id)
>>  {
>> @@ -2970,7 +2970,7 @@ void native_compose_msi_msg(struct pci_dev *pdev,
>>  }
>>
>>  #ifdef CONFIG_PCI_MSI
>> -static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq,
>> +static int msi_compose_msg(struct msi_irqs *msi, unsigned int irq,
>>  			   struct msi_msg *msg, u8 hpet_id)
>>  {
>>  	struct irq_cfg *cfg;
>> @@ -2990,7 +2990,7 @@ static int msi_compose_msg(struct pci_dev *pdev, unsigned
>> int irq,
>>  	if (err)
>>  		return err;
>>
>> -	x86_msi.compose_msi_msg(pdev, irq, dest, msg, hpet_id);
>> +	x86_msi.compose_msi_msg(msi, irq, dest, msg, hpet_id);
>>
>>  	return 0;
>>  }
>> @@ -3032,15 +3032,16 @@ static struct irq_chip msi_chip = {
>>  	.irq_retrigger		= ioapic_retrigger_irq,
>>  };
>>
>> -int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc,
>> +int setup_msi_irq(struct msi_irqs *msi, struct msi_desc *msidesc,
>>  		  unsigned int irq_base, unsigned int irq_offset)
>>  {
>>  	struct irq_chip *chip = &msi_chip;
>>  	struct msi_msg msg;
>>  	unsigned int irq = irq_base + irq_offset;
>>  	int ret;
>> +	struct pci_dev *dev = msi->data;
>>
>> -	ret = msi_compose_msg(dev, irq, &msg, -1);
>> +	ret = msi_compose_msg(msi, irq, &msg, -1);
>>  	if (ret < 0)
>>  		return ret;
>>
>> @@ -3062,24 +3063,22 @@ int setup_msi_irq(struct pci_dev *dev, struct msi_desc
>> *msidesc,
>>  	return 0;
>>  }
>>
>> -int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
>> +int native_setup_msi_irqs(struct msi_irqs *msi, int nvec, int type)
>>  {
>>  	struct msi_desc *msidesc;
>>  	unsigned int irq;
>> -	int node, ret;
>> +	int ret;
>>
>>  	/* Multiple MSI vectors only supported with interrupt remapping */
>>  	if (type == MSI_TYPE && nvec > 1)
>>  		return 1;
>>
>> -	node = dev_to_node(&dev->dev);
>> -
>> -	list_for_each_entry(msidesc, &dev->msi_list, list) {
>> -		irq = irq_alloc_hwirq(node);
>> +	list_for_each_entry(msidesc, &msi->msi_list, list) {
>> +		irq = irq_alloc_hwirq(msi->node);
>>  		if (!irq)
>>  			return -ENOSPC;
>>
>> -		ret = setup_msi_irq(dev, msidesc, irq, 0);
>> +		ret = setup_msi_irq(msi, msidesc, irq, 0);
>>  		if (ret < 0) {
>>  			irq_free_hwirq(irq);
>>  			return ret;
>> diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c
>> index e48b674..a277faf 100644
>> --- a/arch/x86/kernel/x86_init.c
>> +++ b/arch/x86/kernel/x86_init.c
>> @@ -121,14 +121,14 @@ struct x86_msi_ops x86_msi = {
>>  };
>>
>>  /* MSI arch specific hooks */
>> -int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
>> +int arch_setup_msi_irqs(struct msi_irqs *msi, int nvec, int type)
>>  {
>> -	return x86_msi.setup_msi_irqs(dev, nvec, type);
>> +	return x86_msi.setup_msi_irqs(msi, nvec, type);
>>  }
>>
>> -void arch_teardown_msi_irqs(struct pci_dev *dev)
>> +void arch_teardown_msi_irqs(struct msi_irqs *msi)
>>  {
>> -	x86_msi.teardown_msi_irqs(dev);
>> +	x86_msi.teardown_msi_irqs(msi);
>>  }
>>
>>  void arch_teardown_msi_irq(unsigned int irq)
>> @@ -136,9 +136,9 @@ void arch_teardown_msi_irq(unsigned int irq)
>>  	x86_msi.teardown_msi_irq(irq);
>>  }
>>
>> -void arch_restore_msi_irqs(struct pci_dev *dev)
>> +void arch_restore_msi_irqs(struct msi_irqs *msi)
>>  {
>> -	x86_msi.restore_msi_irqs(dev);
>> +	x86_msi.restore_msi_irqs(msi);
>>  }
>>  u32 arch_msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag)
>>  {
>> diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c
>> index 4aec6a2..0e45cb7 100644
>> --- a/drivers/iommu/amd_iommu.c
>> +++ b/drivers/iommu/amd_iommu.c
>> @@ -4237,7 +4237,7 @@ static int free_irq(int irq)
>>  	return 0;
>>  }
>>
>> -static void compose_msi_msg(struct pci_dev *pdev,
>> +static void compose_msi_msg(struct msi_irqs *msi,
>>  			    unsigned int irq, unsigned int dest,
>>  			    struct msi_msg *msg, u8 hpet_id)
>>  {
>> @@ -4265,33 +4265,35 @@ static void compose_msi_msg(struct pci_dev *pdev,
>>  	msg->data       = irte_info->index;
>>  }
>>
>> -static int msi_alloc_irq(struct pci_dev *pdev, int irq, int nvec)
>> +static int msi_alloc_irq(struct msi_irqs *msi, int irq, int nvec)
>>  {
>>  	struct irq_cfg *cfg;
>>  	int index;
>>  	u16 devid;
>> +	struct pci_dev *dev = msi->data;
>>
>> -	if (!pdev)
>> +	if (!dev)
>>  		return -EINVAL;
>>
>>  	cfg = irq_get_chip_data(irq);
>>  	if (!cfg)
>>  		return -EINVAL;
>>
>> -	devid = get_device_id(&pdev->dev);
>> +	devid = get_device_id(&dev->dev);
>>  	index = alloc_irq_index(cfg, devid, nvec);
>>
>>  	return index < 0 ? MAX_IRQS_PER_TABLE : index;
>>  }
>>
>> -static int msi_setup_irq(struct pci_dev *pdev, unsigned int irq,
>> +static int msi_setup_irq(struct msi_irqs *msi, unsigned int irq,
>>  			 int index, int offset)
>>  {
>>  	struct irq_2_irte *irte_info;
>>  	struct irq_cfg *cfg;
>>  	u16 devid;
>> +	struct pci_dev *dev = msi->data;
>>
>> -	if (!pdev)
>> +	if (!dev)
>>  		return -EINVAL;
>>
>>  	cfg = irq_get_chip_data(irq);
>> @@ -4301,7 +4303,7 @@ static int msi_setup_irq(struct pci_dev *pdev, unsigned
>> int irq,
>>  	if (index >= MAX_IRQS_PER_TABLE)
>>  		return 0;
>>
>> -	devid		= get_device_id(&pdev->dev);
>> +	devid		= get_device_id(&dev->dev);
>>  	irte_info	= &cfg->irq_2_irte;
>>
>>  	cfg->remapped	      = 1;
>> diff --git a/drivers/iommu/intel_irq_remapping.c
>> b/drivers/iommu/intel_irq_remapping.c
>> index 9b17489..d6bde63 100644
>> --- a/drivers/iommu/intel_irq_remapping.c
>> +++ b/drivers/iommu/intel_irq_remapping.c
>> @@ -1027,7 +1027,7 @@ intel_ioapic_set_affinity(struct irq_data *data, const
>> struct cpumask *mask,
>>  	return 0;
>>  }
>>
>> -static void intel_compose_msi_msg(struct pci_dev *pdev,
>> +static void intel_compose_msi_msg(struct msi_irqs *msi,
>>  				  unsigned int irq, unsigned int dest,
>>  				  struct msi_msg *msg, u8 hpet_id)
>>  {
>> @@ -1035,6 +1035,7 @@ static void intel_compose_msi_msg(struct pci_dev *pdev,
>>  	struct irte irte;
>>  	u16 sub_handle = 0;
>>  	int ir_index;
>> +	struct pci_dev *pdev = msi->data;
>>
>>  	cfg = irq_get_chip_data(irq);
>>
>> @@ -1064,10 +1065,11 @@ static void intel_compose_msi_msg(struct pci_dev *pdev,
>>   * and allocate 'nvec' consecutive interrupt-remapping table entries
>>   * in it.
>>   */
>> -static int intel_msi_alloc_irq(struct pci_dev *dev, int irq, int nvec)
>> +static int intel_msi_alloc_irq(struct msi_irqs *msi, int irq, int nvec)
>>  {
>>  	struct intel_iommu *iommu;
>>  	int index;
>> +	struct pci_dev *dev = msi->data;
>>
>>  	down_read(&dmar_global_lock);
>>  	iommu = map_dev_to_ir(dev);
>> @@ -1089,11 +1091,12 @@ static int intel_msi_alloc_irq(struct pci_dev *dev, int
>> irq, int nvec)
>>  	return index;
>>  }
>>
>> -static int intel_msi_setup_irq(struct pci_dev *pdev, unsigned int irq,
>> +static int intel_msi_setup_irq(struct msi_irqs *msi, unsigned int irq,
>>  			       int index, int sub_handle)
>>  {
>>  	struct intel_iommu *iommu;
>>  	int ret = -ENOENT;
>> +	struct pci_dev *pdev = msi->data;
>>
>>  	down_read(&dmar_global_lock);
>>  	iommu = map_dev_to_ir(pdev);
>> diff --git a/drivers/iommu/irq_remapping.c b/drivers/iommu/irq_remapping.c
>> index a3b1805..1fe14e5 100644
>> --- a/drivers/iommu/irq_remapping.c
>> +++ b/drivers/iommu/irq_remapping.c
>> @@ -24,8 +24,8 @@ int no_x2apic_optout;
>>
>>  static struct irq_remap_ops *remap_ops;
>>
>> -static int msi_alloc_remapped_irq(struct pci_dev *pdev, int irq, int nvec);
>> -static int msi_setup_remapped_irq(struct pci_dev *pdev, unsigned int irq,
>> +static int msi_alloc_remapped_irq(struct msi_irqs *msi, int irq, int nvec);
>> +static int msi_setup_remapped_irq(struct msi_irqs *msi, unsigned int irq,
>>  				  int index, int sub_handle);
>>  static int set_remapped_irq_affinity(struct irq_data *data,
>>  				     const struct cpumask *mask,
>> @@ -49,19 +49,19 @@ static void irq_remapping_disable_io_apic(void)
>>  		disconnect_bsp_APIC(0);
>>  }
>>
>> -static int do_setup_msi_irqs(struct pci_dev *dev, int nvec)
>> +static int do_setup_msi_irqs(struct msi_irqs *msi, int nvec)
>>  {
>>  	int ret, sub_handle, nvec_pow2, index = 0;
>>  	unsigned int irq;
>>  	struct msi_desc *msidesc;
>>
>> -	WARN_ON(!list_is_singular(&dev->msi_list));
>> -	msidesc = list_entry(dev->msi_list.next, struct msi_desc, list);
>> +	WARN_ON(!list_is_singular(&msi->msi_list));
>> +	msidesc = list_entry(msi->msi_list.next, struct msi_desc, list);
>>  	WARN_ON(msidesc->irq);
>>  	WARN_ON(msidesc->msi_attrib.multiple);
>>  	WARN_ON(msidesc->nvec_used);
>>
>> -	irq = irq_alloc_hwirqs(nvec, dev_to_node(&dev->dev));
>> +	irq = irq_alloc_hwirqs(nvec, msi->node);
>>  	if (irq == 0)
>>  		return -ENOSPC;
>>
>> @@ -70,18 +70,18 @@ static int do_setup_msi_irqs(struct pci_dev *dev, int nvec)
>>  	msidesc->msi_attrib.multiple = ilog2(nvec_pow2);
>>  	for (sub_handle = 0; sub_handle < nvec; sub_handle++) {
>>  		if (!sub_handle) {
>> -			index = msi_alloc_remapped_irq(dev, irq, nvec_pow2);
>> +			index = msi_alloc_remapped_irq(msi, irq, nvec_pow2);
>>  			if (index < 0) {
>>  				ret = index;
>>  				goto error;
>>  			}
>>  		} else {
>> -			ret = msi_setup_remapped_irq(dev, irq + sub_handle,
>> +			ret = msi_setup_remapped_irq(msi, irq + sub_handle,
>>  						     index, sub_handle);
>>  			if (ret < 0)
>>  				goto error;
>>  		}
>> -		ret = setup_msi_irq(dev, msidesc, irq, sub_handle);
>> +		ret = setup_msi_irq(msi, msidesc, irq, sub_handle);
>>  		if (ret < 0)
>>  			goto error;
>>  	}
>> @@ -101,30 +101,29 @@ error:
>>  	return ret;
>>  }
>>
>> -static int do_setup_msix_irqs(struct pci_dev *dev, int nvec)
>> +static int do_setup_msix_irqs(struct msi_irqs *msi, int nvec)
>>  {
>>  	int node, ret, sub_handle, index = 0;
>>  	struct msi_desc *msidesc;
>>  	unsigned int irq;
>>
>> -	node		= dev_to_node(&dev->dev);
>>  	sub_handle	= 0;
>>
>> -	list_for_each_entry(msidesc, &dev->msi_list, list) {
>> +	list_for_each_entry(msidesc, &msi->msi_list, list) {
>>
>> -		irq = irq_alloc_hwirq(node);
>> +		irq = irq_alloc_hwirq(msi->node);
>>  		if (irq == 0)
>>  			return -1;
>>
>>  		if (sub_handle == 0)
>> -			ret = index = msi_alloc_remapped_irq(dev, irq, nvec);
>> +			ret = index = msi_alloc_remapped_irq(msi, irq, nvec);
>>  		else
>> -			ret = msi_setup_remapped_irq(dev, irq, index, sub_handle);
>> +			ret = msi_setup_remapped_irq(msi, irq, index, sub_handle);
>>
>>  		if (ret < 0)
>>  			goto error;
>>
>> -		ret = setup_msi_irq(dev, msidesc, irq, 0);
>> +		ret = setup_msi_irq(msi, msidesc, irq, 0);
>>  		if (ret < 0)
>>  			goto error;
>>
>> @@ -139,13 +138,13 @@ error:
>>  	return ret;
>>  }
>>
>> -static int irq_remapping_setup_msi_irqs(struct pci_dev *dev,
>> +static int irq_remapping_setup_msi_irqs(struct msi_irqs *msi,
>>  					int nvec, int type)
>>  {
>>  	if (type == MSI_TYPE)
>> -		return do_setup_msi_irqs(dev, nvec);
>> +		return do_setup_msi_irqs(msi, nvec);
>>  	else
>> -		return do_setup_msix_irqs(dev, nvec);
>> +		return do_setup_msix_irqs(msi, nvec);
>>  }
>>
>>  static void eoi_ioapic_pin_remapped(int apic, int pin, int vector)
>> @@ -314,33 +313,33 @@ void free_remapped_irq(int irq)
>>  		remap_ops->free_irq(irq);
>>  }
>>
>> -void compose_remapped_msi_msg(struct pci_dev *pdev,
>> +void compose_remapped_msi_msg(struct msi_irqs *msi,
>>  			      unsigned int irq, unsigned int dest,
>>  			      struct msi_msg *msg, u8 hpet_id)
>>  {
>>  	struct irq_cfg *cfg = irq_get_chip_data(irq);
>>
>>  	if (!irq_remapped(cfg))
>> -		native_compose_msi_msg(pdev, irq, dest, msg, hpet_id);
>> +		native_compose_msi_msg(msi, irq, dest, msg, hpet_id);
>>  	else if (remap_ops && remap_ops->compose_msi_msg)
>> -		remap_ops->compose_msi_msg(pdev, irq, dest, msg, hpet_id);
>> +		remap_ops->compose_msi_msg(msi, irq, dest, msg, hpet_id);
>>  }
>>
>> -static int msi_alloc_remapped_irq(struct pci_dev *pdev, int irq, int nvec)
>> +static int msi_alloc_remapped_irq(struct msi_irqs *msi, int irq, int nvec)
>>  {
>>  	if (!remap_ops || !remap_ops->msi_alloc_irq)
>>  		return -ENODEV;
>>
>> -	return remap_ops->msi_alloc_irq(pdev, irq, nvec);
>> +	return remap_ops->msi_alloc_irq(msi, irq, nvec);
>>  }
>>
>> -static int msi_setup_remapped_irq(struct pci_dev *pdev, unsigned int irq,
>> +static int msi_setup_remapped_irq(struct msi_irqs *msi, unsigned int irq,
>>  				  int index, int sub_handle)
>>  {
>>  	if (!remap_ops || !remap_ops->msi_setup_irq)
>>  		return -ENODEV;
>>
>> -	return remap_ops->msi_setup_irq(pdev, irq, index, sub_handle);
>> +	return remap_ops->msi_setup_irq(msi, irq, index, sub_handle);
>>  }
>>
>>  int setup_hpet_msi_remapped(unsigned int irq, unsigned int id)
>> diff --git a/drivers/iommu/irq_remapping.h b/drivers/iommu/irq_remapping.h
>> index 90c4dae..59c4cfb 100644
>> --- a/drivers/iommu/irq_remapping.h
>> +++ b/drivers/iommu/irq_remapping.h
>> @@ -69,15 +69,15 @@ struct irq_remap_ops {
>>  	int (*free_irq)(int);
>>
>>  	/* Create MSI msg to use for interrupt remapping */
>> -	void (*compose_msi_msg)(struct pci_dev *,
>> +	void (*compose_msi_msg)(struct msi_irqs *,
>>  				unsigned int, unsigned int,
>>  				struct msi_msg *, u8);
>>
>>  	/* Allocate remapping resources for MSI */
>> -	int (*msi_alloc_irq)(struct pci_dev *, int, int);
>> +	int (*msi_alloc_irq)(struct msi_irqs *, int, int);
>>
>>  	/* Setup the remapped MSI irq */
>> -	int (*msi_setup_irq)(struct pci_dev *, unsigned int, int, int);
>> +	int (*msi_setup_irq)(struct msi_irqs *, unsigned int, int, int);
>>
>>  	/* Setup interrupt remapping for an HPET MSI */
>>  	int (*setup_hpet_msi)(unsigned int, unsigned int);
>> diff --git a/drivers/msi/msi.c b/drivers/msi/msi.c
>> index 3fbd539..8462c6c 100644
>> --- a/drivers/msi/msi.c
>> +++ b/drivers/msi/msi.c
>> @@ -510,9 +510,8 @@ int msix_capability_init(struct msi_irqs *msi, void __iomem
>> *base,
>>
>>  	/* Set MSI-X enabled bits and unmask the function */
>>  	msi_set_intx(msi, 0);
>> -	msi->msix_enabled = 1;
>> -
>>  	msi_set_enable(msi, 1, MSIX_TYPE);
>> +	msi->msix_enabled = 1;
>>
>>  	return 0;
>>
>> --
>> 1.7.1
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-pci" in
>> the body of a message to majordomo at vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
> 
> .
> 


-- 
Thanks!
Yijing

  reply	other threads:[~2014-08-20  7:02 UTC|newest]

Thread overview: 145+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-26  3:08 [RFC PATCH 00/11] Refactor MSI to support Non-PCI device Yijing Wang
2014-07-26  3:08 ` Yijing Wang
2014-07-26  3:08 ` Yijing Wang
2014-07-26  3:08 ` [RFC PATCH 01/11] PCI/MSI: Use pci_dev->msi_cap instead of msi_desc->msi_attrib.pos Yijing Wang
2014-07-26  3:08   ` Yijing Wang
2014-07-26  3:08   ` Yijing Wang
2014-07-26  3:08 ` Yijing Wang
2014-07-26  3:08 ` [RFC PATCH 02/11] PCI/MSI: Use new MSI type macro instead of PCI MSI flags Yijing Wang
2014-07-26  3:08   ` Yijing Wang
2014-07-26  3:08   ` Yijing Wang
2014-07-26  3:08 ` Yijing Wang
2014-07-26  3:08 ` [RFC PATCH 03/11] PCI/MSI: Refactor pci_dev_msi_enabled() Yijing Wang
2014-07-26  3:08 ` Yijing Wang
2014-07-26  3:08   ` Yijing Wang
2014-07-26  3:08   ` Yijing Wang
2014-08-05 22:35   ` Stuart Yoder
2014-08-05 22:35     ` Stuart Yoder
2014-08-05 22:35     ` Stuart Yoder
2014-08-06  1:23     ` Yijing Wang
2014-08-06  1:23       ` Yijing Wang
2014-08-06  1:23       ` Yijing Wang
2014-08-06  1:23     ` Yijing Wang
2014-08-20  5:57   ` Bharat.Bhushan
2014-08-20  5:57   ` Bharat.Bhushan
2014-08-20  5:57     ` Bharat.Bhushan at freescale.com
2014-08-20  5:57     ` Bharat.Bhushan
2014-08-20  5:57     ` Bharat.Bhushan
2014-08-20  6:30     ` Yijing Wang
2014-08-20  6:30       ` Yijing Wang
2014-08-20  6:30     ` Yijing Wang
2014-07-26  3:08 ` [RFC PATCH 04/11] PCI/MSI: Move MSIX table address mapping out of msix_capability_init Yijing Wang
2014-07-26  3:08 ` Yijing Wang
2014-07-26  3:08   ` Yijing Wang
2014-07-26  3:08   ` Yijing Wang
2014-07-26  3:08 ` [RFC PATCH 05/11] PCI/MSI: Move populate_msi_sysfs() out of msi_capability_init() Yijing Wang
2014-07-26  3:08   ` Yijing Wang
2014-07-26  3:08   ` Yijing Wang
2014-07-26  3:08   ` Yijing Wang
2014-07-26  3:08 ` Yijing Wang
2014-07-26  3:08 ` [RFC PATCH 06/11] PCI/MSI: Save MSI irq in PCI MSI layer Yijing Wang
2014-07-26  3:08   ` Yijing Wang
2014-07-26  3:08   ` Yijing Wang
2014-07-26  3:08   ` Yijing Wang
2014-07-26  3:08 ` Yijing Wang
2014-07-26  3:08 ` [RFC PATCH 07/11] PCI/MSI: Mask MSI-X entry in msix_setup_entries() Yijing Wang
2014-07-26  3:08 ` Yijing Wang
2014-07-26  3:08   ` Yijing Wang
2014-07-26  3:08   ` Yijing Wang
2014-07-26  3:08 ` [RFC PATCH 08/11] PCI/MSI: Introduce new struct msi_irqs and struct msi_ops Yijing Wang
2014-07-26  3:08   ` Yijing Wang
2014-07-26  3:08   ` Yijing Wang
2014-07-26  3:08 ` Yijing Wang
2014-07-26  3:08 ` [RFC PATCH 09/11] PCI/MSI: refactor PCI MSI driver Yijing Wang
2014-07-26  3:08   ` Yijing Wang
2014-07-26  3:08   ` Yijing Wang
2014-08-20  6:06   ` Bharat.Bhushan
2014-08-20  6:06     ` Bharat.Bhushan at freescale.com
2014-08-20  6:06     ` Bharat.Bhushan
2014-08-20  6:34     ` Yijing Wang
2014-08-20  6:34       ` Yijing Wang
2014-08-20  6:34     ` Yijing Wang
2014-07-26  3:08 ` Yijing Wang
2014-07-26  3:08 ` [RFC PATCH 10/11] PCI/MSI: Split the generic MSI code into new file Yijing Wang
2014-07-26  3:08   ` Yijing Wang
2014-07-26  3:08   ` Yijing Wang
2014-08-20  6:18   ` Bharat.Bhushan
2014-08-20  6:18     ` Bharat.Bhushan at freescale.com
2014-08-20  6:18     ` Bharat.Bhushan
2014-08-20  6:43     ` Yijing Wang
2014-08-20  6:43       ` Yijing Wang
2014-08-20  6:43     ` Yijing Wang
2014-07-26  3:08 ` Yijing Wang
2014-07-26  3:08 ` [RFC PATCH 11/11] x86/MSI: Refactor x86 MSI code Yijing Wang
2014-07-26  3:08 ` Yijing Wang
2014-07-26  3:08   ` Yijing Wang
2014-07-26  3:08   ` Yijing Wang
2014-08-20  6:20   ` Bharat.Bhushan
2014-08-20  6:20     ` Bharat.Bhushan at freescale.com
2014-08-20  6:20     ` Bharat.Bhushan
2014-08-20  7:01     ` Yijing Wang [this message]
2014-08-20  7:01       ` Yijing Wang
2014-08-20  7:01     ` Yijing Wang
2014-07-29 14:08 ` [RFC PATCH 00/11] Refactor MSI to support Non-PCI device Arnd Bergmann
2014-07-29 14:08   ` Arnd Bergmann
2014-07-29 14:08   ` Arnd Bergmann
2014-07-30  2:45   ` Yijing Wang
2014-07-30  2:45     ` Yijing Wang
2014-07-30  2:45     ` Yijing Wang
2014-07-30  2:45     ` Yijing Wang
2014-07-30  6:47     ` Jiang Liu
2014-07-30  6:47       ` Jiang Liu
2014-07-30  7:20       ` Yijing Wang
2014-07-30  7:20         ` Yijing Wang
2014-07-30  7:20         ` Yijing Wang
2014-08-01 13:16         ` Arnd Bergmann
2014-08-01 13:16           ` Arnd Bergmann
2014-08-01 13:16           ` Arnd Bergmann
2014-08-04  3:32           ` Yijing Wang
2014-08-04  3:32             ` Yijing Wang
2014-08-04  3:32             ` Yijing Wang
2014-08-04 14:45             ` Arnd Bergmann
2014-08-04 14:45               ` Arnd Bergmann
2014-08-05  2:20               ` Yijing Wang
2014-08-05  2:20               ` Yijing Wang
2014-08-05  2:20                 ` Yijing Wang
2014-08-05  2:20                 ` Yijing Wang
2014-08-04 14:45             ` Arnd Bergmann
2014-08-04  3:32           ` Yijing Wang
2014-07-30  7:20       ` Yijing Wang
2014-07-30  6:47     ` Jiang Liu
2014-08-01 13:52     ` Arnd Bergmann
2014-08-01 13:52     ` Arnd Bergmann
2014-08-01 13:52       ` Arnd Bergmann
2014-08-04  6:43       ` Yijing Wang
2014-08-04  6:43         ` Yijing Wang
2014-08-04  6:43         ` Yijing Wang
2014-08-04  6:43         ` Yijing Wang
2014-08-04 14:59         ` Arnd Bergmann
2014-08-04 14:59           ` Arnd Bergmann
2014-08-04 14:59           ` Arnd Bergmann
2014-08-05  2:12           ` Yijing Wang
2014-08-05  2:12             ` Yijing Wang
2014-08-05  2:12             ` Yijing Wang
2014-08-05  2:12             ` Yijing Wang
2014-08-01 10:27 ` arnab.basu
2014-08-01 10:27 ` arnab.basu
2014-08-01 10:27   ` arnab.basu at freescale.com
2014-08-04  3:03   ` Yijing Wang
2014-08-04  3:03     ` Yijing Wang
2014-08-20  5:44     ` Bharat.Bhushan
2014-08-20  5:44       ` Bharat.Bhushan at freescale.com
2014-08-20  5:44       ` Bharat.Bhushan
2014-08-20  6:28       ` Yijing Wang
2014-08-20  6:28         ` Yijing Wang
2014-08-20  7:41         ` Bharat.Bhushan
2014-08-20  7:41           ` Bharat.Bhushan at freescale.com
2014-08-20  7:55           ` Yijing Wang
2014-08-20  7:55           ` Yijing Wang
2014-08-20  7:55             ` Yijing Wang
2014-09-03  7:15           ` Yijing Wang
2014-09-03  7:15           ` Yijing Wang
2014-09-03  7:15             ` Yijing Wang
2014-08-20  7:41         ` Bharat.Bhushan
2014-08-20  6:28       ` Yijing Wang
2014-08-04  3:03   ` 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=53F447B2.5050501@huawei.com \
    --to=wangyijing@huawei.com \
    --cc=Bharat.Bhushan@freescale.com \
    --cc=Paul.Mundt@huawei.com \
    --cc=arnab.basu@freescale.com \
    --cc=bhelgaas@google.com \
    --cc=guohanjun@huawei.com \
    --cc=huxinwei@huawei.com \
    --cc=jejb@parisc-linux.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    --cc=marc.zyngier@arm.com \
    --cc=virtualization@lists.linux-foundation.org \
    --cc=wuyun.wu@huawei.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.