diff options
Diffstat (limited to 'arch/powerpc/platforms/pseries/xics.c')
-rw-r--r-- | arch/powerpc/platforms/pseries/xics.c | 44 |
1 files changed, 12 insertions, 32 deletions
diff --git a/arch/powerpc/platforms/pseries/xics.c b/arch/powerpc/platforms/pseries/xics.c index e98863025721..253972e5479f 100644 --- a/arch/powerpc/platforms/pseries/xics.c +++ b/arch/powerpc/platforms/pseries/xics.c | |||
@@ -34,6 +34,7 @@ | |||
34 | #include <asm/i8259.h> | 34 | #include <asm/i8259.h> |
35 | 35 | ||
36 | #include "xics.h" | 36 | #include "xics.h" |
37 | #include "plpar_wrappers.h" | ||
37 | 38 | ||
38 | #define XICS_IPI 2 | 39 | #define XICS_IPI 2 |
39 | #define XICS_IRQ_SPURIOUS 0 | 40 | #define XICS_IRQ_SPURIOUS 0 |
@@ -110,27 +111,6 @@ static inline void direct_qirr_info(int n_cpu, u8 value) | |||
110 | /* LPAR low level accessors */ | 111 | /* LPAR low level accessors */ |
111 | 112 | ||
112 | 113 | ||
113 | static inline long plpar_eoi(unsigned long xirr) | ||
114 | { | ||
115 | return plpar_hcall_norets(H_EOI, xirr); | ||
116 | } | ||
117 | |||
118 | static inline long plpar_cppr(unsigned long cppr) | ||
119 | { | ||
120 | return plpar_hcall_norets(H_CPPR, cppr); | ||
121 | } | ||
122 | |||
123 | static inline long plpar_ipi(unsigned long servernum, unsigned long mfrr) | ||
124 | { | ||
125 | return plpar_hcall_norets(H_IPI, servernum, mfrr); | ||
126 | } | ||
127 | |||
128 | static inline long plpar_xirr(unsigned long *xirr_ret) | ||
129 | { | ||
130 | unsigned long dummy; | ||
131 | return plpar_hcall(H_XIRR, 0, 0, 0, 0, xirr_ret, &dummy, &dummy); | ||
132 | } | ||
133 | |||
134 | static inline unsigned int lpar_xirr_info_get(int n_cpu) | 114 | static inline unsigned int lpar_xirr_info_get(int n_cpu) |
135 | { | 115 | { |
136 | unsigned long lpar_rc; | 116 | unsigned long lpar_rc; |
@@ -590,14 +570,14 @@ static void __init xics_init_one_node(struct device_node *np, | |||
590 | unsigned int *indx) | 570 | unsigned int *indx) |
591 | { | 571 | { |
592 | unsigned int ilen; | 572 | unsigned int ilen; |
593 | u32 *ireg; | 573 | const u32 *ireg; |
594 | 574 | ||
595 | /* This code does the theorically broken assumption that the interrupt | 575 | /* This code does the theorically broken assumption that the interrupt |
596 | * server numbers are the same as the hard CPU numbers. | 576 | * server numbers are the same as the hard CPU numbers. |
597 | * This happens to be the case so far but we are playing with fire... | 577 | * This happens to be the case so far but we are playing with fire... |
598 | * should be fixed one of these days. -BenH. | 578 | * should be fixed one of these days. -BenH. |
599 | */ | 579 | */ |
600 | ireg = (u32 *)get_property(np, "ibm,interrupt-server-ranges", NULL); | 580 | ireg = get_property(np, "ibm,interrupt-server-ranges", NULL); |
601 | 581 | ||
602 | /* Do that ever happen ? we'll know soon enough... but even good'old | 582 | /* Do that ever happen ? we'll know soon enough... but even good'old |
603 | * f80 does have that property .. | 583 | * f80 does have that property .. |
@@ -609,7 +589,7 @@ static void __init xics_init_one_node(struct device_node *np, | |||
609 | */ | 589 | */ |
610 | *indx = *ireg; | 590 | *indx = *ireg; |
611 | } | 591 | } |
612 | ireg = (u32 *)get_property(np, "reg", &ilen); | 592 | ireg = get_property(np, "reg", &ilen); |
613 | if (!ireg) | 593 | if (!ireg) |
614 | panic("xics_init_IRQ: can't find interrupt reg property"); | 594 | panic("xics_init_IRQ: can't find interrupt reg property"); |
615 | 595 | ||
@@ -635,7 +615,7 @@ static void __init xics_setup_8259_cascade(void) | |||
635 | { | 615 | { |
636 | struct device_node *np, *old, *found = NULL; | 616 | struct device_node *np, *old, *found = NULL; |
637 | int cascade, naddr; | 617 | int cascade, naddr; |
638 | u32 *addrp; | 618 | const u32 *addrp; |
639 | unsigned long intack = 0; | 619 | unsigned long intack = 0; |
640 | 620 | ||
641 | for_each_node_by_type(np, "interrupt-controller") | 621 | for_each_node_by_type(np, "interrupt-controller") |
@@ -661,7 +641,7 @@ static void __init xics_setup_8259_cascade(void) | |||
661 | break; | 641 | break; |
662 | if (strcmp(np->name, "pci") != 0) | 642 | if (strcmp(np->name, "pci") != 0) |
663 | continue; | 643 | continue; |
664 | addrp = (u32 *)get_property(np, "8259-interrupt-acknowledge", NULL); | 644 | addrp = get_property(np, "8259-interrupt-acknowledge", NULL); |
665 | if (addrp == NULL) | 645 | if (addrp == NULL) |
666 | continue; | 646 | continue; |
667 | naddr = prom_n_addr_cells(np); | 647 | naddr = prom_n_addr_cells(np); |
@@ -680,7 +660,8 @@ void __init xics_init_IRQ(void) | |||
680 | { | 660 | { |
681 | int i; | 661 | int i; |
682 | struct device_node *np; | 662 | struct device_node *np; |
683 | u32 *ireg, ilen, indx = 0; | 663 | u32 ilen, indx = 0; |
664 | const u32 *ireg; | ||
684 | int found = 0; | 665 | int found = 0; |
685 | 666 | ||
686 | ppc64_boot_msg(0x20, "XICS Init"); | 667 | ppc64_boot_msg(0x20, "XICS Init"); |
@@ -705,18 +686,17 @@ void __init xics_init_IRQ(void) | |||
705 | for (np = of_find_node_by_type(NULL, "cpu"); | 686 | for (np = of_find_node_by_type(NULL, "cpu"); |
706 | np; | 687 | np; |
707 | np = of_find_node_by_type(np, "cpu")) { | 688 | np = of_find_node_by_type(np, "cpu")) { |
708 | ireg = (u32 *)get_property(np, "reg", &ilen); | 689 | ireg = get_property(np, "reg", &ilen); |
709 | if (ireg && ireg[0] == get_hard_smp_processor_id(boot_cpuid)) { | 690 | if (ireg && ireg[0] == get_hard_smp_processor_id(boot_cpuid)) { |
710 | ireg = (u32 *)get_property(np, | 691 | ireg = get_property(np, |
711 | "ibm,ppc-interrupt-gserver#s", | 692 | "ibm,ppc-interrupt-gserver#s", &ilen); |
712 | &ilen); | ||
713 | i = ilen / sizeof(int); | 693 | i = ilen / sizeof(int); |
714 | if (ireg && i > 0) { | 694 | if (ireg && i > 0) { |
715 | default_server = ireg[0]; | 695 | default_server = ireg[0]; |
716 | /* take last element */ | 696 | /* take last element */ |
717 | default_distrib_server = ireg[i-1]; | 697 | default_distrib_server = ireg[i-1]; |
718 | } | 698 | } |
719 | ireg = (u32 *)get_property(np, | 699 | ireg = get_property(np, |
720 | "ibm,interrupt-server#-size", NULL); | 700 | "ibm,interrupt-server#-size", NULL); |
721 | if (ireg) | 701 | if (ireg) |
722 | interrupt_server_size = *ireg; | 702 | interrupt_server_size = *ireg; |