From: thierry.reding@gmail.com (Thierry Reding)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCHv5 05/11] of: pci: add registry of MSI chips
Date: Mon, 29 Jul 2013 14:58:27 +0200 [thread overview]
Message-ID: <20130729125826.GH23152@manwe> (raw)
In-Reply-To: <20130729142600.63eeab50@skate>
On Mon, Jul 29, 2013 at 02:26:00PM +0200, Thomas Petazzoni wrote:
> Dear Thierry Reding,
>
> On Mon, 29 Jul 2013 08:54:31 +0200, Thierry Reding wrote:
>
> > > So what is your suggestion to allow the PCIe controller to retrieve the
> > > correct irq_domain if we have only one DT node for the IRQ controller
> > > that registers two irq_domains ?
> >
> > If I understand correctly, Grant isn't objecting to the introduction of
> > the lookup function, but rather its implementation. You could add a
> > pointer to a struct msi_chip within struct irq_domain and then iterate
> > over all irq_domain instances (see irq_find_host()) and find one which
> > has the correct device_node pointer and the msi_chip pointer set.
>
> Ah ok. The only trick is that we have to change irq_find_host() to
> *not* match on MSI domains. Can you check the below patch to see if it
> matches what Grant suggested? It works for me, and it allows to completely
> remove the registry of msi_chip in drivers/of, as well as the of_node
> pointer in struct msi_chip.
>
> Thanks!
>
> Thomas
>
> From c2c0137cb110270f96e1e0fa298a5d585b8d829e Mon Sep 17 00:00:00 2001
> From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
> Date: Mon, 29 Jul 2013 14:12:31 +0200
> Subject: [PATCHv6 05/11] irqdomain: add support to associate an irq_domain
> with a msi_chip
>
> Message Signaled Interrupts are a PCI-specific mechanism that allows
> PCI devices to notify interrupts to the CPU using in-band
> messages. The PCI subsystem represents an MSI-capable interrupt
> controller as an msi_chip structure, and this patch improves the
> irqdomain subsystem with a new pointer associating an irq_domain with
> the corresponding msi_chip.
>
> The __irq_domain_add() function is augmented with an additional
> argument, the 'msi_chip' pointer, and all callers of this function are
> updated.
>
> A new function irq_domain_add_msi() function is added to allow the
> registration of an MSI-type irq domain.
>
> The irq_find_host() function is modified to not match on MSI-type irq
> domains: a given DT device node may represent both a normal interrupt
> controller and a MSI interrupt controller. irq_find_host() should
> return the irq_domain that corresponds to the normal interupt
"interupt" -> "interrupt"
> controller.
>
> An irq_find_msi() function is added to get the MSI_type irq domain
"MSI_type" -> "MSI-type".
> given a DT device node.
And "irq domain" -> "IRQ domain" in all of the above.
> diff --git a/include/linux/irqdomain.h b/include/linux/irqdomain.h
[...]
> @@ -162,7 +167,16 @@ static inline struct irq_domain *irq_domain_add_tree(struct device_node *of_node
> const struct irq_domain_ops *ops,
> void *host_data)
> {
> - return __irq_domain_add(of_node, 0, ~0, 0, ops, host_data);
> + return __irq_domain_add(of_node, 0, ~0, 0, ops, NULL, host_data);
> +}
> +static inline struct irq_domain *irq_domain_add_msi(struct device_node *of_node,
> + unsigned int size,
> + const struct irq_domain_ops *ops,
> + struct msi_chip *msi_chip,
> + void *host_data)
> +{
> + return __irq_domain_add(of_node, size, size, 0, ops,
> + msi_chip, host_data);
> }
Given that the majority of interrupt controllers probably don't have any
MSI functionality, I wonder if perhaps this should be done in a more
helper-oriented way, see below...
> diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c
[...]
> @@ -198,6 +201,12 @@ struct irq_domain *irq_find_host(struct device_node *node)
> */
> mutex_lock(&irq_domain_mutex);
> list_for_each_entry(h, &irq_domain_list, link) {
> + /*
> + * We only want to match normal interrupt domains, not
> + * MSI domains
> + */
> + if (h->msi_chip)
> + continue;
> if (h->ops->match)
> rc = h->ops->match(h, node);
> else
> @@ -214,6 +223,28 @@ struct irq_domain *irq_find_host(struct device_node *node)
> EXPORT_SYMBOL_GPL(irq_find_host);
>
> /**
> + * irq_find_msi() - Locates a MSI domain for a given device node
> + * @node: device-tree node of the interrupt controller
> + */
> +struct irq_domain *irq_find_msi(struct device_node *node)
> +{
> + struct irq_domain *h, *found = NULL;
> +
> + mutex_lock(&irq_domain_mutex);
> + list_for_each_entry(h, &irq_domain_list, link) {
> + if (!h->msi_chip)
> + continue;
> + if (h->of_node && h->of_node == node) {
> + found = h;
> + break;
> + }
> + }
> + mutex_unlock(&irq_domain_mutex);
> + return found;
> +}
> +EXPORT_SYMBOL_GPL(irq_find_msi);
This doesn't quite copy what irq_find_host() does, since it ignores the
associated ops->match().
But given that ops->match() already provides a way to hook into the
lookup, perhaps we could add a function such as this:
int irq_domain_supports_msi(struct irq_domain *d, struct device_node *node)
{
if ((d->of_node == NULL) || (d->of_node != node))
return 0;
return d->msi_chip != NULL;
}
Then use that in drivers that expose MSI functionality via an IRQ domain
like this:
static const struct irq_domain_ops foo_irq_domain_ops = {
...
.match = irq_domain_supports_msi,
...
};
One problem with this is that it doesn't solve your problem where two
different IRQ domains are exposed by the same device, because the
irq_find_host() will still match the MSI IRQ domain for the non-MSI
device node as well. This could be solved by adding another match
function...
This goes in hand with the helper-style API that I mentioned above. But
it's really up to Grant to decide which way he wants this to go.
Thierry
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20130729/4b52a29e/attachment-0001.sig>
next prev parent reply other threads:[~2013-07-29 12:58 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-15 11:52 [PATCHv5 00/11] MSI support for Marvell EBU PCIe driver Thomas Petazzoni
2013-07-15 11:52 ` [PATCHv5 01/11] irqdomain: add irq_alloc_mapping() function Thomas Petazzoni
2013-07-16 8:31 ` Thomas Petazzoni
2013-07-28 4:11 ` Grant Likely
2013-07-15 11:52 ` [PATCHv5 02/11] PCI: use weak functions for MSI arch-specific functions Thomas Petazzoni
2013-07-25 18:37 ` Thierry Reding
2013-07-25 20:27 ` Bjorn Helgaas
2013-07-15 11:52 ` [PATCHv5 03/11] PCI: remove ARCH_SUPPORTS_MSI kconfig option Thomas Petazzoni
2013-07-15 11:52 ` [PATCHv5 04/11] PCI: Introduce new MSI chip infrastructure Thomas Petazzoni
2013-07-25 18:40 ` Thierry Reding
2013-07-25 20:26 ` Bjorn Helgaas
2013-07-15 11:52 ` [PATCHv5 05/11] of: pci: add registry of MSI chips Thomas Petazzoni
2013-07-15 16:12 ` Rob Herring
2013-07-28 4:33 ` Grant Likely
2013-07-28 14:27 ` Thomas Petazzoni
2013-07-29 6:54 ` Thierry Reding
2013-07-29 12:26 ` Thomas Petazzoni
2013-07-29 12:58 ` Thierry Reding [this message]
2013-07-29 13:04 ` Thomas Petazzoni
2013-08-01 9:17 ` Thomas Petazzoni
2013-07-31 15:14 ` Thomas Petazzoni
2013-07-15 11:52 ` [PATCHv5 06/11] irqchip: armada-370-xp: properly request resources Thomas Petazzoni
2013-07-15 11:52 ` [PATCHv5 07/11] irqchip: armada-370-xp: implement MSI support Thomas Petazzoni
2013-07-15 11:52 ` [PATCHv5 08/11] ARM: pci: add ->add_bus() and ->remove_bus() hooks to hw_pci Thomas Petazzoni
2013-07-16 8:29 ` Thomas Petazzoni
2013-07-25 16:53 ` Thierry Reding
2013-08-07 9:13 ` Thomas Petazzoni
2013-08-07 13:37 ` Thierry Reding
2013-08-07 15:06 ` Thomas Petazzoni
2013-07-25 16:57 ` Thierry Reding
2013-07-26 8:13 ` Thomas Petazzoni
2013-07-26 11:49 ` Jason Cooper
2013-07-26 22:46 ` Russell King - ARM Linux
2013-07-29 12:31 ` Thierry Reding
2013-07-15 11:52 ` [PATCHv5 09/11] ARM: mvebu: the MPIC now provides MSI controller features Thomas Petazzoni
2013-07-15 11:52 ` [PATCHv5 10/11] PCI: mvebu: add support for MSI Thomas Petazzoni
2013-07-15 11:52 ` [PATCHv5 11/11] ARM: mvebu: link PCIe controllers to the MSI controller Thomas Petazzoni
2013-07-15 15:34 ` [PATCHv5 00/11] MSI support for Marvell EBU PCIe driver Stephen Warren
2013-07-15 16:27 ` Thierry Reding
2013-07-16 8:33 ` Thomas Petazzoni
2013-07-16 21:05 ` Thierry Reding
2013-07-16 21:43 ` Thomas Petazzoni
2013-07-23 0:30 ` Bjorn Helgaas
2013-07-15 17:33 ` Jason Cooper
2013-07-16 8:43 ` Thomas Petazzoni
2013-07-16 13:15 ` Jason Cooper
2013-07-16 13:39 ` Thomas Petazzoni
2013-07-25 18:49 ` Thierry Reding
2013-07-25 19:02 ` Jason Cooper
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=20130729125826.GH23152@manwe \
--to=thierry.reding@gmail.com \
--cc=linux-arm-kernel@lists.infradead.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).