linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: grant.likely@secretlab.ca (Grant Likely)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCHv5 01/11] irqdomain: add irq_alloc_mapping() function
Date: Sat, 27 Jul 2013 22:11:26 -0600	[thread overview]
Message-ID: <20130728041127.068613E08F8@localhost> (raw)
In-Reply-To: <1373889167-27878-2-git-send-email-thomas.petazzoni@free-electrons.com>

On Mon, 15 Jul 2013 13:52:37 +0200, Thomas Petazzoni <thomas.petazzoni@free-electrons.com> wrote:
> This commit extends the irqdomain subsystem with an
> irq_alloc_mapping() function which allows to let the irqdomain code
> find an available hwirq number in the range [ 0 ; domain size ] for
> the given domain, and create a virq mapping for it.
> 
> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
> ---
>  include/linux/irqdomain.h |  2 ++
>  kernel/irq/irqdomain.c    | 32 ++++++++++++++++++++++++++++++++
>  2 files changed, 34 insertions(+)
> 
> diff --git a/include/linux/irqdomain.h b/include/linux/irqdomain.h
> index c983ed1..1ffa336 100644
> --- a/include/linux/irqdomain.h
> +++ b/include/linux/irqdomain.h
> @@ -195,6 +195,8 @@ static inline unsigned int irq_linear_revmap(struct irq_domain *domain,
>  extern unsigned int irq_find_mapping(struct irq_domain *host,
>  				     irq_hw_number_t hwirq);
>  extern unsigned int irq_create_direct_mapping(struct irq_domain *host);
> +extern unsigned int irq_alloc_mapping(struct irq_domain *host,
> +				      irq_hw_number_t *hwirq);
>  extern int irq_create_strict_mappings(struct irq_domain *domain,
>  				      unsigned int irq_base,
>  				      irq_hw_number_t hwirq_base, int count);
> diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c
> index 706724e..b9ddb94 100644
> --- a/kernel/irq/irqdomain.c
> +++ b/kernel/irq/irqdomain.c
> @@ -375,6 +375,38 @@ unsigned int irq_create_direct_mapping(struct irq_domain *domain)
>  EXPORT_SYMBOL_GPL(irq_create_direct_mapping);
>  
>  /**
> + * irq_alloc_mapping() - Allocate an irq for mapping
> + * @domain: domain to allocate the irq for or NULL for default domain
> + * @hwirq:  reference to the returned hwirq
> + *
> + * This routine are used for irq controllers which can choose the
> + * hardware interrupt number from a range [ 0 ; domain size ], such as
> + * is often the case with PCI MSI controllers. The function will
> + * returned the allocated hwirq number in the hwirq pointer, and the
> + * corresponding virq number as the return value.
> + */
> +unsigned int irq_alloc_mapping(struct irq_domain *domain,
> +			       irq_hw_number_t *out_hwirq)
> +{
> +	irq_hw_number_t hwirq;
> +
> +	pr_debug("irq_alloc_mapping(0x%p)\n", domain);
> +
> +	for (hwirq = 0; hwirq < domain->hwirq_max; hwirq++)
> +		if (!irq_find_mapping(domain, hwirq))
> +			break;

Okay, you can add my acked-by, but only if you change the above hunk to:

	for (hwirq = 0; hwirq < domain->revmap_size; hwirq++)
		if (domain->linear_revmap[hwirq] == 0)
			break;

In some cases hwirq_max will be set to ~0, which means calling
irq_find_mapping about 4 billion times. Not safe. The above change
prevents that problem, but it also means the function won't work for the
tree map. A followup patch can be crafted to add support for the tree
mapping.

> +
> +	if (hwirq == domain->hwirq_max) {
> +		pr_debug("-> no available hwirq found\n");
> +		return 0;
> +	}
> +
> +	*out_hwirq = hwirq;
> +	return irq_create_mapping(domain, hwirq);

out_hwirq should *not* be modified if irq_create_mapping fails. You'll
need to rework the above to:

	rc = irq_create_mapping(domain, hwirq);
	if (rc)
		*out_hwirq = hwirq;
	return rc;

When the above two issues are fixed:

Acked-by: Grant Likely <grant.likely@linaro.org>

> +}
> +EXPORT_SYMBOL_GPL(irq_alloc_mapping);
> +
> +/**
>   * irq_create_mapping() - Map a hardware interrupt into linux irq space
>   * @domain: domain owning this hardware interrupt or NULL for default domain
>   * @hwirq: hardware irq number in that domain space
> -- 
> 1.8.1.2
> 

  parent reply	other threads:[~2013-07-28  4:11 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 [this message]
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
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=20130728041127.068613E08F8@localhost \
    --to=grant.likely@secretlab.ca \
    --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).