From: wangyijing@huawei•com (Yijing Wang)
To: linux-arm-kernel@lists•infradead.org
Subject: [RFC PATCH 00/11] Refactor MSI to support Non-PCI device
Date: Tue, 5 Aug 2014 10:12:01 +0800 [thread overview]
Message-ID: <53E03D71.5080800@huawei.com> (raw)
In-Reply-To: <201408041659.31364.arnd@arndb.de>
>>> The method you describe here makes sense for PCI devices that are required to support
>>> legacy interrupts and may or may not support MSI on a given system, but not so much
>>> for platform devices for which we know exactly whether we want to use MSI
>>> or legacy interrupts.
>>>
>>> In particular if you have a device that can only do MSI, the entire pci_enable_msi
>>> step is pointless: all we need to do is program the correct MSI target address/message
>>> pair into the device and register the handler.
>>
>> Yes, I almost agree if we won't change the existing hundreds of drivers, what
>> I worried about is some drivers may want to know the IRQ numbers, and use the IRQ
>> number to process different things, as I mentioned in another reply.
>> But we can also provide the interface which integrate MSI configuration and request_irq(),
>> if most drivers don't care the IRQ number.
>
> The driver would still have the option of getting the IRQ number for now: With
> the interface I imagine, you would get a 'struct msi_desc' pointer, from which
> you can look up the 'struct irq_desc' pointer (either embedded in msi_desc,
> or using a pointer from a member of msi_desc), and you can already get the
> interrupt number from the irq_desc.
>
> My point was that a well-written driver already does not care about the interrupt
> number: the only information a driver needs in the interrupt handler is a pointer
> to its own context, which we already derive from the irq_desc.
Agree, I will try to introduce this similar interface in next version, thanks!
>
> The main interface that currently requires the irq number is free_irq(), but
> I would argue that we can just add a wrapper that takes the msi_desc pointer
> as its first argument so the driver does not have to worry about it.
>
> We can add additional wrappers like that as needed.
OK
>>>> This is a huge change for device drivers, and some device drivers don't know which msi_chip
>>>> their MSI irq deliver to. I'm reworking the msi_chip, and try to use msi_chip to eliminate
>>>> all arch_msi_xxx() under every arch in kernel. And the important point is how to create the
>>>> binding for the MSI device to the target msi_chip.
>>>
>>> Which drivers are you thinking of? Again, I wouldn't expect to change any PCI drivers,
>>> but only platform drivers that do native MSI, so we only have to change drivers that
>>> do not support any MSI at all yet and that need to be changed anyway in order to add
>>> support.
>>
>> I mean platform device drivers, because we can find the target msi_chip by some platform
>> interfaces(like the existing of_pci_find_msi_chip_by_node()). So we no need to explicitly
>> provide the msi_chip as the function argument.
>
> Right, that works too. I was thinking we might need an interface that allows us to
> pick a particular msi_chip if there are several alternatives (e.g. one in the GIC
> and one in the PCI host), but you are right: we should normally be able to hardwire
> that information in DT or elsewhere, and just need the 'struct device pointer' which
> should probably be the first argument here.
>
> As you pointed out, it's common to have multiple MSIs for a single device, so we
> also need a context to pass around, so my suggestion would become something like:
>
> struct msi_desc *msi_request(struct device *dev, irq_handler_t handler,
> unsigned long flags, const char *name, void *data);
>
> It's possible that we have to add one or two more arguments here.
Good suggestion, thanks!
>
>>> A degenerate case of this would be a system where a PCI device sends its MSI into
>>> the host controller, that generates a legacy interrupt and that in turn gets
>>> sent to an irqchip which turns it back into an MSI for the GICv3. This would of
>>> course be very inefficient, but I think we should be able to express this with
>>> both the binding and the in-kernel framework just to be on the safe side.
>>
>> Yes, the best way to tell the kernel which msi_chip should deliver to is describe
>> the binding in DTS file. If a real degenerate case found, we can update the platform
>> interface which is responsible for getting the match msi_chip in future.
>
> Ok.
>
> Arnd
>
> .
>
--
Thanks!
Yijing
next prev parent reply other threads:[~2014-08-05 2:12 UTC|newest]
Thread overview: 41+ 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 ` [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 ` [RFC PATCH 02/11] PCI/MSI: Use new MSI type macro instead of PCI MSI flags Yijing Wang
2014-07-26 3:08 ` [RFC PATCH 03/11] PCI/MSI: Refactor pci_dev_msi_enabled() Yijing Wang
2014-08-05 22:35 ` Stuart Yoder
2014-08-06 1:23 ` Yijing Wang
2014-08-20 5:57 ` Bharat.Bhushan at freescale.com
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 ` [RFC PATCH 05/11] PCI/MSI: Move populate_msi_sysfs() out of msi_capability_init() 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 ` [RFC PATCH 07/11] PCI/MSI: Mask MSI-X entry in msix_setup_entries() 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 ` [RFC PATCH 09/11] PCI/MSI: refactor PCI MSI driver Yijing Wang
2014-08-20 6:06 ` Bharat.Bhushan at freescale.com
2014-08-20 6:34 ` Yijing Wang
2014-07-26 3:08 ` [RFC PATCH 10/11] PCI/MSI: Split the generic MSI code into new file Yijing Wang
2014-08-20 6:18 ` Bharat.Bhushan at freescale.com
2014-08-20 6:43 ` Yijing Wang
2014-07-26 3:08 ` [RFC PATCH 11/11] x86/MSI: Refactor x86 MSI code Yijing Wang
2014-08-20 6:20 ` Bharat.Bhushan at freescale.com
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-30 2:45 ` Yijing Wang
2014-07-30 6:47 ` Jiang Liu
2014-07-30 7:20 ` Yijing Wang
2014-08-01 13:16 ` Arnd Bergmann
2014-08-04 3:32 ` Yijing Wang
2014-08-04 14:45 ` Arnd Bergmann
2014-08-05 2:20 ` Yijing Wang
2014-08-01 13:52 ` Arnd Bergmann
2014-08-04 6:43 ` Yijing Wang
2014-08-04 14:59 ` Arnd Bergmann
2014-08-05 2:12 ` Yijing Wang [this message]
2014-08-01 10:27 ` arnab.basu at freescale.com
2014-08-04 3:03 ` Yijing Wang
2014-08-20 5:44 ` Bharat.Bhushan at freescale.com
2014-08-20 6:28 ` Yijing Wang
2014-08-20 7:41 ` Bharat.Bhushan at freescale.com
2014-08-20 7:55 ` Yijing Wang
2014-09-03 7:15 ` 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=53E03D71.5080800@huawei.com \
--to=wangyijing@huawei$(echo .)com \
--cc=linux-arm-kernel@lists$(echo .)infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
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