The OF irq handling code has been overloading the term 'map' to refer to both parsing the data in the device tree and mapping it to the internal linux irq system. This is probably because the device tree does have the concept of an 'interrupt-map' function for translating interrupt references from one node to another, but 'map' is still confusing when the primary purpose of some of the functions are to parse the DT data. This patch renames all the of_irq_map_* functions to of_irq_parse_* which makes it clear that there is a difference between the parsing phase and the mapping phase. Kernel code can make use of just the parsing or just the mapping support as needed by the subsystem. The patch was generated mechanically with a handful of sed commands. Signed-off-by: Grant Likely <grant.likely@linaro.org> Acked-by: Michal Simek <monstr@monstr.eu> Acked-by: Tony Lindgren <tony@atomide.com> Cc: Ralf Baechle <ralf@linux-mips.org> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
104 lines
2.4 KiB
C
104 lines
2.4 KiB
C
/*
|
|
* Copyright 2006-2007, Michael Ellerman, IBM Corporation.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; version 2 of the
|
|
* License.
|
|
*
|
|
*/
|
|
|
|
#include <linux/irq.h>
|
|
#include <linux/bitmap.h>
|
|
#include <linux/msi.h>
|
|
#include <asm/mpic.h>
|
|
#include <asm/prom.h>
|
|
#include <asm/hw_irq.h>
|
|
#include <asm/ppc-pci.h>
|
|
#include <asm/msi_bitmap.h>
|
|
|
|
#include <sysdev/mpic.h>
|
|
|
|
void mpic_msi_reserve_hwirq(struct mpic *mpic, irq_hw_number_t hwirq)
|
|
{
|
|
/* The mpic calls this even when there is no allocator setup */
|
|
if (!mpic->msi_bitmap.bitmap)
|
|
return;
|
|
|
|
msi_bitmap_reserve_hwirq(&mpic->msi_bitmap, hwirq);
|
|
}
|
|
|
|
#ifdef CONFIG_MPIC_U3_HT_IRQS
|
|
static int mpic_msi_reserve_u3_hwirqs(struct mpic *mpic)
|
|
{
|
|
irq_hw_number_t hwirq;
|
|
const struct irq_domain_ops *ops = mpic->irqhost->ops;
|
|
struct device_node *np;
|
|
int flags, index, i;
|
|
struct of_irq oirq;
|
|
|
|
pr_debug("mpic: found U3, guessing msi allocator setup\n");
|
|
|
|
/* Reserve source numbers we know are reserved in the HW.
|
|
*
|
|
* This is a bit of a mix of U3 and U4 reserves but that's going
|
|
* to work fine, we have plenty enugh numbers left so let's just
|
|
* mark anything we don't like reserved.
|
|
*/
|
|
for (i = 0; i < 8; i++)
|
|
msi_bitmap_reserve_hwirq(&mpic->msi_bitmap, i);
|
|
|
|
for (i = 42; i < 46; i++)
|
|
msi_bitmap_reserve_hwirq(&mpic->msi_bitmap, i);
|
|
|
|
for (i = 100; i < 105; i++)
|
|
msi_bitmap_reserve_hwirq(&mpic->msi_bitmap, i);
|
|
|
|
for (i = 124; i < mpic->num_sources; i++)
|
|
msi_bitmap_reserve_hwirq(&mpic->msi_bitmap, i);
|
|
|
|
|
|
np = NULL;
|
|
while ((np = of_find_all_nodes(np))) {
|
|
pr_debug("mpic: mapping hwirqs for %s\n", np->full_name);
|
|
|
|
index = 0;
|
|
while (of_irq_parse_one(np, index++, &oirq) == 0) {
|
|
ops->xlate(mpic->irqhost, NULL, oirq.specifier,
|
|
oirq.size, &hwirq, &flags);
|
|
msi_bitmap_reserve_hwirq(&mpic->msi_bitmap, hwirq);
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
#else
|
|
static int mpic_msi_reserve_u3_hwirqs(struct mpic *mpic)
|
|
{
|
|
return -1;
|
|
}
|
|
#endif
|
|
|
|
int mpic_msi_init_allocator(struct mpic *mpic)
|
|
{
|
|
int rc;
|
|
|
|
rc = msi_bitmap_alloc(&mpic->msi_bitmap, mpic->num_sources,
|
|
mpic->irqhost->of_node);
|
|
if (rc)
|
|
return rc;
|
|
|
|
rc = msi_bitmap_reserve_dt_hwirqs(&mpic->msi_bitmap);
|
|
if (rc > 0) {
|
|
if (mpic->flags & MPIC_U3_HT_IRQS)
|
|
rc = mpic_msi_reserve_u3_hwirqs(mpic);
|
|
|
|
if (rc) {
|
|
msi_bitmap_free(&mpic->msi_bitmap);
|
|
return rc;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|