diff options
Diffstat (limited to 'arch/powerpc')
-rw-r--r-- | arch/powerpc/kernel/rtas.c | 21 | ||||
-rw-r--r-- | arch/powerpc/platforms/pseries/setup.c | 2 | ||||
-rw-r--r-- | arch/powerpc/platforms/pseries/xics.c | 6 |
3 files changed, 24 insertions, 5 deletions
diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c index 14353b8789dd..bfd66d3a035c 100644 --- a/arch/powerpc/kernel/rtas.c +++ b/arch/powerpc/kernel/rtas.c | |||
@@ -571,6 +571,27 @@ int rtas_set_indicator(int indicator, int index, int new_value) | |||
571 | } | 571 | } |
572 | EXPORT_SYMBOL(rtas_set_indicator); | 572 | EXPORT_SYMBOL(rtas_set_indicator); |
573 | 573 | ||
574 | /* | ||
575 | * Ignoring RTAS extended delay | ||
576 | */ | ||
577 | int rtas_set_indicator_fast(int indicator, int index, int new_value) | ||
578 | { | ||
579 | int rc; | ||
580 | int token = rtas_token("set-indicator"); | ||
581 | |||
582 | if (token == RTAS_UNKNOWN_SERVICE) | ||
583 | return -ENOENT; | ||
584 | |||
585 | rc = rtas_call(token, 3, 1, NULL, indicator, index, new_value); | ||
586 | |||
587 | WARN_ON(rc == -2 || (rc >= 9900 && rc <= 9905)); | ||
588 | |||
589 | if (rc < 0) | ||
590 | return rtas_error_rc(rc); | ||
591 | |||
592 | return rc; | ||
593 | } | ||
594 | |||
574 | void rtas_restart(char *cmd) | 595 | void rtas_restart(char *cmd) |
575 | { | 596 | { |
576 | if (rtas_flash_term_hook) | 597 | if (rtas_flash_term_hook) |
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index 6ebeecfd6bcb..1587efc51057 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c | |||
@@ -213,8 +213,6 @@ static void pseries_lpar_enable_pmcs(void) | |||
213 | { | 213 | { |
214 | unsigned long set, reset; | 214 | unsigned long set, reset; |
215 | 215 | ||
216 | power4_enable_pmcs(); | ||
217 | |||
218 | set = 1UL << 63; | 216 | set = 1UL << 63; |
219 | reset = 0; | 217 | reset = 0; |
220 | plpar_hcall_norets(H_PERFMON, set, reset); | 218 | plpar_hcall_norets(H_PERFMON, set, reset); |
diff --git a/arch/powerpc/platforms/pseries/xics.c b/arch/powerpc/platforms/pseries/xics.c index c88ec63129f3..253972e5479f 100644 --- a/arch/powerpc/platforms/pseries/xics.c +++ b/arch/powerpc/platforms/pseries/xics.c | |||
@@ -447,7 +447,7 @@ void xics_setup_cpu(void) | |||
447 | * | 447 | * |
448 | * XXX: undo of teardown on kexec needs this too, as may hotplug | 448 | * XXX: undo of teardown on kexec needs this too, as may hotplug |
449 | */ | 449 | */ |
450 | rtas_set_indicator(GLOBAL_INTERRUPT_QUEUE, | 450 | rtas_set_indicator_fast(GLOBAL_INTERRUPT_QUEUE, |
451 | (1UL << interrupt_server_size) - 1 - default_distrib_server, 1); | 451 | (1UL << interrupt_server_size) - 1 - default_distrib_server, 1); |
452 | } | 452 | } |
453 | 453 | ||
@@ -776,7 +776,7 @@ void xics_teardown_cpu(int secondary) | |||
776 | * so leave the master cpu in the group. | 776 | * so leave the master cpu in the group. |
777 | */ | 777 | */ |
778 | if (secondary) | 778 | if (secondary) |
779 | rtas_set_indicator(GLOBAL_INTERRUPT_QUEUE, | 779 | rtas_set_indicator_fast(GLOBAL_INTERRUPT_QUEUE, |
780 | (1UL << interrupt_server_size) - 1 - | 780 | (1UL << interrupt_server_size) - 1 - |
781 | default_distrib_server, 0); | 781 | default_distrib_server, 0); |
782 | } | 782 | } |
@@ -793,7 +793,7 @@ void xics_migrate_irqs_away(void) | |||
793 | xics_set_cpu_priority(cpu, 0); | 793 | xics_set_cpu_priority(cpu, 0); |
794 | 794 | ||
795 | /* remove ourselves from the global interrupt queue */ | 795 | /* remove ourselves from the global interrupt queue */ |
796 | status = rtas_set_indicator(GLOBAL_INTERRUPT_QUEUE, | 796 | status = rtas_set_indicator_fast(GLOBAL_INTERRUPT_QUEUE, |
797 | (1UL << interrupt_server_size) - 1 - default_distrib_server, 0); | 797 | (1UL << interrupt_server_size) - 1 - default_distrib_server, 0); |
798 | WARN_ON(status < 0); | 798 | WARN_ON(status < 0); |
799 | 799 | ||