diff options
Diffstat (limited to 'arch/powerpc/kernel/setup_64.c')
| -rw-r--r-- | arch/powerpc/kernel/setup_64.c | 63 |
1 files changed, 36 insertions, 27 deletions
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index 1bee4b68fa45..e72690ec9b87 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c | |||
| @@ -95,7 +95,7 @@ int ucache_bsize; | |||
| 95 | 95 | ||
| 96 | #ifdef CONFIG_SMP | 96 | #ifdef CONFIG_SMP |
| 97 | 97 | ||
| 98 | static int smt_enabled_cmdline; | 98 | static char *smt_enabled_cmdline; |
| 99 | 99 | ||
| 100 | /* Look for ibm,smt-enabled OF option */ | 100 | /* Look for ibm,smt-enabled OF option */ |
| 101 | static void check_smt_enabled(void) | 101 | static void check_smt_enabled(void) |
| @@ -103,37 +103,46 @@ static void check_smt_enabled(void) | |||
| 103 | struct device_node *dn; | 103 | struct device_node *dn; |
| 104 | const char *smt_option; | 104 | const char *smt_option; |
| 105 | 105 | ||
| 106 | /* Allow the command line to overrule the OF option */ | 106 | /* Default to enabling all threads */ |
| 107 | if (smt_enabled_cmdline) | 107 | smt_enabled_at_boot = threads_per_core; |
| 108 | return; | ||
| 109 | |||
| 110 | dn = of_find_node_by_path("/options"); | ||
| 111 | |||
| 112 | if (dn) { | ||
| 113 | smt_option = of_get_property(dn, "ibm,smt-enabled", NULL); | ||
| 114 | 108 | ||
| 115 | if (smt_option) { | 109 | /* Allow the command line to overrule the OF option */ |
| 116 | if (!strcmp(smt_option, "on")) | 110 | if (smt_enabled_cmdline) { |
| 117 | smt_enabled_at_boot = 1; | 111 | if (!strcmp(smt_enabled_cmdline, "on")) |
| 118 | else if (!strcmp(smt_option, "off")) | 112 | smt_enabled_at_boot = threads_per_core; |
| 119 | smt_enabled_at_boot = 0; | 113 | else if (!strcmp(smt_enabled_cmdline, "off")) |
| 120 | } | 114 | smt_enabled_at_boot = 0; |
| 121 | } | 115 | else { |
| 116 | long smt; | ||
| 117 | int rc; | ||
| 118 | |||
| 119 | rc = strict_strtol(smt_enabled_cmdline, 10, &smt); | ||
| 120 | if (!rc) | ||
| 121 | smt_enabled_at_boot = | ||
| 122 | min(threads_per_core, (int)smt); | ||
| 123 | } | ||
| 124 | } else { | ||
| 125 | dn = of_find_node_by_path("/options"); | ||
| 126 | if (dn) { | ||
| 127 | smt_option = of_get_property(dn, "ibm,smt-enabled", | ||
| 128 | NULL); | ||
| 129 | |||
| 130 | if (smt_option) { | ||
| 131 | if (!strcmp(smt_option, "on")) | ||
| 132 | smt_enabled_at_boot = threads_per_core; | ||
| 133 | else if (!strcmp(smt_option, "off")) | ||
| 134 | smt_enabled_at_boot = 0; | ||
| 135 | } | ||
| 136 | |||
| 137 | of_node_put(dn); | ||
| 138 | } | ||
| 139 | } | ||
| 122 | } | 140 | } |
| 123 | 141 | ||
| 124 | /* Look for smt-enabled= cmdline option */ | 142 | /* Look for smt-enabled= cmdline option */ |
| 125 | static int __init early_smt_enabled(char *p) | 143 | static int __init early_smt_enabled(char *p) |
| 126 | { | 144 | { |
| 127 | smt_enabled_cmdline = 1; | 145 | smt_enabled_cmdline = p; |
| 128 | |||
| 129 | if (!p) | ||
| 130 | return 0; | ||
| 131 | |||
| 132 | if (!strcmp(p, "on") || !strcmp(p, "1")) | ||
| 133 | smt_enabled_at_boot = 1; | ||
| 134 | else if (!strcmp(p, "off") || !strcmp(p, "0")) | ||
| 135 | smt_enabled_at_boot = 0; | ||
| 136 | |||
| 137 | return 0; | 146 | return 0; |
| 138 | } | 147 | } |
| 139 | early_param("smt-enabled", early_smt_enabled); | 148 | early_param("smt-enabled", early_smt_enabled); |
| @@ -380,8 +389,8 @@ void __init setup_system(void) | |||
| 380 | */ | 389 | */ |
| 381 | xmon_setup(); | 390 | xmon_setup(); |
| 382 | 391 | ||
| 383 | check_smt_enabled(); | ||
| 384 | smp_setup_cpu_maps(); | 392 | smp_setup_cpu_maps(); |
| 393 | check_smt_enabled(); | ||
| 385 | 394 | ||
| 386 | #ifdef CONFIG_SMP | 395 | #ifdef CONFIG_SMP |
| 387 | /* Release secondary cpus out of their spinloops at 0x60 now that | 396 | /* Release secondary cpus out of their spinloops at 0x60 now that |
