Skip to content

Commit

Permalink
[POWERPC] Move xics_setup_8259_cascade() into platforms/pseries/setup.c
Browse files Browse the repository at this point in the history
The code in xics.c to setup the i8259 cascaded irq handler is not really
xics specific, so move it into setup.c - we will clean this up further in
a subsequent patch.

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
  • Loading branch information
Michael Ellerman authored and Paul Mackerras committed Apr 18, 2008
1 parent 47b9d9b commit 032ace7
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 52 deletions.
53 changes: 52 additions & 1 deletion arch/powerpc/platforms/pseries/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,51 @@ void pseries_8259_cascade(unsigned int irq, struct irq_desc *desc)
desc->chip->eoi(irq);
}

static void __init xics_setup_8259_cascade(void)
{
struct device_node *np, *old, *found = NULL;
int cascade, naddr;
const u32 *addrp;
unsigned long intack = 0;

for_each_node_by_type(np, "interrupt-controller")
if (of_device_is_compatible(np, "chrp,iic")) {
found = np;
break;
}
if (found == NULL) {
printk(KERN_DEBUG "xics: no ISA interrupt controller\n");
return;
}
cascade = irq_of_parse_and_map(found, 0);
if (cascade == NO_IRQ) {
printk(KERN_ERR "xics: failed to map cascade interrupt");
return;
}
pr_debug("xics: cascade mapped to irq %d\n", cascade);

for (old = of_node_get(found); old != NULL ; old = np) {
np = of_get_parent(old);
of_node_put(old);
if (np == NULL)
break;
if (strcmp(np->name, "pci") != 0)
continue;
addrp = of_get_property(np, "8259-interrupt-acknowledge", NULL);
if (addrp == NULL)
continue;
naddr = of_n_addr_cells(np);
intack = addrp[naddr-1];
if (naddr > 1)
intack |= ((unsigned long)addrp[naddr-2]) << 32;
}
if (intack)
printk(KERN_DEBUG "xics: PCI 8259 intack at 0x%016lx\n", intack);
i8259_init(found, intack);
of_node_put(found);
set_irq_chained_handler(cascade, pseries_8259_cascade);
}

static void __init pseries_mpic_init_IRQ(void)
{
struct device_node *np, *old, *cascade = NULL;
Expand Down Expand Up @@ -203,6 +248,12 @@ static void __init pseries_mpic_init_IRQ(void)
set_irq_chained_handler(cascade_irq, pseries_8259_cascade);
}

static void __init pseries_xics_init_IRQ(void)
{
xics_init_IRQ();
xics_setup_8259_cascade();
}

static void pseries_lpar_enable_pmcs(void)
{
unsigned long set, reset;
Expand Down Expand Up @@ -232,7 +283,7 @@ static void __init pseries_discover_pic(void)
smp_init_pseries_mpic();
return;
} else if (strstr(typep, "ppc-xicp")) {
ppc_md.init_IRQ = xics_init_IRQ;
ppc_md.init_IRQ = pseries_xics_init_IRQ;
setup_kexec_cpu_down_xics();
smp_init_pseries_xics();
return;
Expand Down
48 changes: 0 additions & 48 deletions arch/powerpc/platforms/pseries/xics.c
Original file line number Diff line number Diff line change
Expand Up @@ -655,52 +655,6 @@ static void __init xics_init_one_node(struct device_node *np,
}
}


static void __init xics_setup_8259_cascade(void)
{
struct device_node *np, *old, *found = NULL;
int cascade, naddr;
const u32 *addrp;
unsigned long intack = 0;

for_each_node_by_type(np, "interrupt-controller")
if (of_device_is_compatible(np, "chrp,iic")) {
found = np;
break;
}
if (found == NULL) {
printk(KERN_DEBUG "xics: no ISA interrupt controller\n");
return;
}
cascade = irq_of_parse_and_map(found, 0);
if (cascade == NO_IRQ) {
printk(KERN_ERR "xics: failed to map cascade interrupt");
return;
}
pr_debug("xics: cascade mapped to irq %d\n", cascade);

for (old = of_node_get(found); old != NULL ; old = np) {
np = of_get_parent(old);
of_node_put(old);
if (np == NULL)
break;
if (strcmp(np->name, "pci") != 0)
continue;
addrp = of_get_property(np, "8259-interrupt-acknowledge", NULL);
if (addrp == NULL)
continue;
naddr = of_n_addr_cells(np);
intack = addrp[naddr-1];
if (naddr > 1)
intack |= ((unsigned long)addrp[naddr-2]) << 32;
}
if (intack)
printk(KERN_DEBUG "xics: PCI 8259 intack at 0x%016lx\n", intack);
i8259_init(found, intack);
of_node_put(found);
set_irq_chained_handler(cascade, pseries_8259_cascade);
}

void __init xics_init_IRQ(void)
{
struct device_node *np;
Expand Down Expand Up @@ -733,8 +687,6 @@ void __init xics_init_IRQ(void)

xics_setup_cpu();

xics_setup_8259_cascade();

ppc64_boot_msg(0x21, "XICS Done");
}

Expand Down
3 changes: 0 additions & 3 deletions arch/powerpc/platforms/pseries/xics.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,4 @@ struct xics_ipi_struct {

extern struct xics_ipi_struct xics_ipi_message[NR_CPUS] __cacheline_aligned;

struct irq_desc;
extern void pseries_8259_cascade(unsigned int irq, struct irq_desc *desc);

#endif /* _POWERPC_KERNEL_XICS_H */

0 comments on commit 032ace7

Please sign in to comment.