linux-pci.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Yijing Wang <wangyijing@huawei.com>
To: Lucas Stach <l.stach@pengutronix.de>
Cc: Bjorn Helgaas <bhelgaas@google.com>,
	Xinwei Hu <huxinwei@huawei.com>, Wuyun <wuyun.wu@huawei.com>,
	<linux-pci@vger.kernel.org>,
	<linux-arm-kernel@lists.infradead.org>,
	Russell King <linux@arm.linux.org.uk>,
	<linux-arch@vger.kernel.org>, <arnab.basu@freescale.com>,
	<Bharat.Bhushan@freescale.com>, <x86@kernel.org>,
	Arnd Bergmann <arnd@arndb.de>,
	Thomas Gleixner <tglx@linutronix.de>,
	"Konrad Rzeszutek Wilk" <konrad.wilk@oracle.com>,
	<xen-devel@lists.xenproject.org>, Joerg Roedel <joro@8bytes.org>,
	<iommu@lists.linux-foundation.org>, <linux-mips@linux-mips.org>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	<linuxppc-dev@lists.ozlabs.org>, <linux-s390@vger.kernel.org>,
	Sebastian Ott <sebott@linux.vnet.ibm.com>,
	"Tony Luck" <tony.luck@intel.com>, <linux-ia64@vger.kernel.org>,
	"David S. Miller" <davem@davemloft.net>,
	<sparclinux@vger.kernel.org>, Chris Metcalf <cmetcalf@tilera.com>,
	Ralf Baechle <ralf@linux-mips.org>
Subject: Re: [PATCH v1 05/21] PCI/MSI: Introduce weak arch_find_msi_chip() to find MSI chip
Date: Tue, 16 Sep 2014 10:08:43 +0800	[thread overview]
Message-ID: <54179BAB.7030506@huawei.com> (raw)
In-Reply-To: <1410792154.3314.7.camel@pengutronix.de>

On 2014/9/15 22:42, Lucas Stach wrote:
> Am Freitag, den 05.09.2014, 18:09 +0800 schrieb Yijing Wang:
>> Introduce weak arch_find_msi_chip() to find the match msi_chip.
>> Currently, MSI chip associates pci bus to msi_chip. Because in
>> ARM platform, there may be more than one MSI controller in system.
>> Associate pci bus to msi_chip help pci device to find the match
>> msi_chip and setup MSI/MSI-X irq correctly. But in other platform,
>> like in x86. we only need one MSI chip, because all device use
>> the same MSI address/data and irq etc. So it's no need to associate
>> pci bus to MSI chip, just use a arch function, arch_find_msi_chip()
>> to return the MSI chip for simplicity. The default weak
>> arch_find_msi_chip() used in ARM platform, find the MSI chip
>> by pci bus.
>>
> Hm, while one weak function sounds much better than the plethora we have
> now, I wonder how much work it would be to associate the msi_chip with
> the pci bus on other arches the same way as done on ARM. This way we
> could kill this calling into arch specific functions which would make
> things a bit clearer to follow I think.

That's a heavy work to associate msi_chip with the pci_bus in all platforms,
And only in ARM platform, there are two or more different msi_chips which maybe
associate pci hostbridge or irq chip. In other platforms, only one MSI chip
exists at the same time. Another reason is I don't think associate the msi_chip
with pci bus is a good idea to make PCI device find its own msi_chip.
All PCI devices under the same PCI hostbridge should have the same msi_chip,
and now a property "msi-parent" is defined to help pci hostbridge to find its matched
msi_chip. I like to associate the msi_chip with a pci hostbridge. So we don't need to
add a lot of pcibios_add_bus() to do that.

I inspected all MSI chip drivers, and found there are two different relations between msi_chip and PCI hostbridge
1. MSI chip is a irq chip, like irq_armada_370_xp, PCI hostbridge platform device use "msi-parent" to find msi_chip by of_node.
2. MSI chip is integrated into PCI hostbridge, so msi_chip->dev is the PCI hostbridge platform device.

So long as we use PCI hostbridge platform device as the parent of PCI hostbridge, every PCI device under the hostbridge
can find the msi_chip by it.

All MSI chip drivers now except pci-mvebu have been passed the hostbridge platform dev as the parent.
pci_common_init_dev(pcie->dev, &hw);
			^
Pseudo code like:

struct msi_chip *pcibios_find_msi_chip(struct pci_dev *dev)
 {
       struct pci_bus *root;
       struct pci_host_bridge *bridge;
       struct msi_chip *chip;
       struct device_node *node, *msi_node;

       /* First we find msi_chip by the phb of_node */    <-------- MSI chip is a irq chip
       root = pci_find_root_bus(dev->bus);
       node = pcibios_get_phb_of_node(root);
       if (node) {
               msi_node = of_parse_phandle(n, "msi-parent", 0);
               of_node_put(node);
               if (msi_node)
                       return of_pci_find_msi_chip_by_node(msi_node);
       }


       /* Some msi_chip are integrated into pci hostbridge,
        * we find it by phb device pointer.
        */
       if (bridge && bridge->dev.parent) {		<-----------MSI chip is integrated into PCI hostbridge
               down_read(&pci_msi_chip_sem);
               list_for_each_entry(chip, &pci_msi_chip_list, list) {
                       if (chip->dev == bridge->dev.parent) {
                               up_read(pci_msi_chip_sem);
                               return chip;
                       }
                }
               up_read(&pci_msi_chip_sem);
        }


        return NULL;
 }

Thanks!
Yijing.


> 
> Regards,
> Lucas
> 
>> Signed-off-by: Yijing Wang <wangyijing@huawei.com>
>> ---
>>  drivers/pci/msi.c |    7 ++++++-
>>  1 files changed, 6 insertions(+), 1 deletions(-)
>>
>> diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
>> index a77e7f7..539c11d 100644
>> --- a/drivers/pci/msi.c
>> +++ b/drivers/pci/msi.c
>> @@ -29,9 +29,14 @@ static int pci_msi_enable = 1;
>>  
>>  /* Arch hooks */
>>  
>> +struct msi_chip * __weak arch_find_msi_chip(struct pci_dev *dev)
>> +{
>> +	return dev->bus->msi;
>> +}
>> +
>>  int __weak arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc)
>>  {
>> -	struct msi_chip *chip = dev->bus->msi;
>> +	struct msi_chip *chip = arch_find_msi_chip(dev);
>>  	int err;
>>  
>>  	if (!chip || !chip->setup_irq)
> 


-- 
Thanks!
Yijing


  reply	other threads:[~2014-09-16  2:09 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-05 10:09 [PATCH v1 00/21] Use MSI chip to configure MSI/MSI-X in all platforms Yijing Wang
2014-09-05 10:09 ` [PATCH v1 01/21] PCI/MSI: Clean up struct msi_chip argument Yijing Wang
2014-09-05 10:09 ` [PATCH v1 02/21] PCI/MSI: Remove useless bus->msi assignment Yijing Wang
2014-09-05 10:09 ` [PATCH v1 03/21] MSI: Remove the redundant irq_set_chip_data() Yijing Wang
2014-09-15 14:00   ` Lucas Stach
2014-09-16  1:30     ` Yijing Wang
2014-09-16 10:29       ` Lucas Stach
2014-09-16 10:37         ` Yijing Wang
2014-09-05 10:09 ` [PATCH v1 04/21] x86/xen/MSI: Eliminate arch_msix_mask_irq() and arch_msi_mask_irq() Yijing Wang
2014-09-10 12:36   ` [Xen-devel] " David Vrabel
2014-09-11  1:22     ` Yijing Wang
2014-09-11 13:08       ` David Vrabel
2014-09-05 10:09 ` [PATCH v1 05/21] PCI/MSI: Introduce weak arch_find_msi_chip() to find MSI chip Yijing Wang
2014-09-15 14:42   ` Lucas Stach
2014-09-16  2:08     ` Yijing Wang [this message]
2014-09-05 10:09 ` [PATCH v1 06/21] PCI/MSI: Refactor struct msi_chip to make it become more common Yijing Wang
2014-09-15 14:44   ` Lucas Stach
2014-09-16  2:09     ` Yijing Wang
2014-09-05 10:09 ` [PATCH v1 07/21] x86/MSI: Use MSI chip framework to configure MSI/MSI-X irq Yijing Wang
2014-09-05 10:09 ` [PATCH v1 08/21] x86/xen/MSI: " Yijing Wang
2014-09-05 14:29   ` [Xen-devel] " David Vrabel
2014-09-09  2:06     ` Yijing Wang
2014-09-10 12:38       ` David Vrabel
2014-09-10 14:59         ` Konrad Rzeszutek Wilk
2014-09-11  1:28           ` Yijing Wang
2014-09-11  1:27         ` Yijing Wang
2014-09-05 10:09 ` [PATCH v1 09/21] Irq_remapping/MSI: " Yijing Wang
2014-09-05 10:42   ` Sergei Shtylyov
2014-09-05 11:30     ` wangyijing
2014-09-05 10:09 ` [PATCH v1 10/21] x86/MSI: Remove unused MSI weak arch functions Yijing Wang
2014-09-05 10:09 ` [PATCH v1 11/21] MIPS/Octeon/MSI: Use MSI chip framework to configure MSI/MSI-X irq Yijing Wang
2014-09-05 10:09 ` [PATCH v1 12/21] MIPS/Xlp: Remove the dead function destroy_irq() to fix build error Yijing Wang
2014-09-05 10:09 ` [PATCH v1 13/21] MIPS/Xlp/MSI: Use MSI chip framework to configure MSI/MSI-X irq Yijing Wang
2014-09-05 10:09 ` [PATCH v1 14/21] MIPS/Xlr/MSI: " Yijing Wang
2014-09-05 10:10 ` [PATCH v1 15/21] Powerpc/MSI: " Yijing Wang
2014-09-05 10:47   ` Sergei Shtylyov
2014-09-05 11:33     ` wangyijing
2014-09-05 11:41       ` Sergei Shtylyov
2014-09-16  5:28   ` Michael Ellerman
2014-09-16  5:40     ` Yijing Wang
2014-09-05 10:10 ` [PATCH v1 16/21] s390/MSI: " Yijing Wang
2014-09-16 11:35   ` Sebastian Ott
2014-09-17  1:24     ` Yijing Wang
2014-09-05 10:10 ` [PATCH v1 17/21] arm/iop13xx/MSI: " Yijing Wang
2014-09-05 10:10 ` [PATCH v1 18/21] IA64/MSI: " Yijing Wang
2014-09-05 10:10 ` [PATCH v1 19/21] Sparc/MSI: " Yijing Wang
2014-09-05 10:10 ` [PATCH v1 20/21] tile/MSI: " Yijing Wang
2014-09-05 10:10 ` [PATCH v1 21/21] PCI/MSI: Clean up unused MSI arch functions Yijing Wang
2014-09-15 14:47   ` Lucas Stach
2014-09-16  2:09     ` Yijing Wang
2014-09-23 21:09 ` [PATCH v1 00/21] Use MSI chip to configure MSI/MSI-X in all platforms Bjorn Helgaas
2014-09-24  3:52   ` 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=54179BAB.7030506@huawei.com \
    --to=wangyijing@huawei.com \
    --cc=Bharat.Bhushan@freescale.com \
    --cc=arnab.basu@freescale.com \
    --cc=arnd@arndb.de \
    --cc=benh@kernel.crashing.org \
    --cc=bhelgaas@google.com \
    --cc=cmetcalf@tilera.com \
    --cc=davem@davemloft.net \
    --cc=huxinwei@huawei.com \
    --cc=iommu@lists.linux-foundation.org \
    --cc=joro@8bytes.org \
    --cc=konrad.wilk@oracle.com \
    --cc=l.stach@pengutronix.de \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-ia64@vger.kernel.org \
    --cc=linux-mips@linux-mips.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=ralf@linux-mips.org \
    --cc=sebott@linux.vnet.ibm.com \
    --cc=sparclinux@vger.kernel.org \
    --cc=tglx@linutronix.de \
    --cc=tony.luck@intel.com \
    --cc=wuyun.wu@huawei.com \
    --cc=x86@kernel.org \
    --cc=xen-devel@lists.xenproject.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).