Commit 5fcafb7a authored by Daniel Hellstrom's avatar Daniel Hellstrom Committed by David S. Miller

sparc32: always define boot_cpu_id

Define boot_cpu_id in single-processor kernels as well. This is
to support architectures which can boot on other than CPU0.

Sam Ravnborg has written the cleanup parts by extracting
boot_cpu_id from smp_32.c into setup_32.c and cleaned up
sun4d_irq.c.

boot_cpu_id was initialized before BSS was cleared in
sun4c_continue_boot, instead boot_cpu_id is set to 0xff to
avoid BSS. If boot_cpu_id is untouched (0xff) by bootup code
it will be overwritten to 0. boot_cpu_id4 is automatically
calculated in common code.
Signed-off-by: default avatarDaniel Hellstrom <daniel@gaisler.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 18272370
...@@ -11,4 +11,16 @@ ...@@ -11,4 +11,16 @@
# define COMMAND_LINE_SIZE 256 # define COMMAND_LINE_SIZE 256
#endif #endif
#ifdef __KERNEL__
#ifdef CONFIG_SPARC32
/* The CPU that was used for booting
* Only sun4d + leon may have boot_cpu_id != 0
*/
extern unsigned char boot_cpu_id;
extern unsigned char boot_cpu_id4;
#endif
#endif /* __KERNEL__ */
#endif /* _SPARC_SETUP_H */ #endif /* _SPARC_SETUP_H */
...@@ -816,10 +816,7 @@ got_prop: ...@@ -816,10 +816,7 @@ got_prop:
.global leon_smp_init .global leon_smp_init
leon_smp_init: leon_smp_init:
sethi %hi(boot_cpu_id), %g1 ! master always 0 /* let boot_cpu_id default to 0 (master always 0) */
stb %g0, [%g1 + %lo(boot_cpu_id)]
sethi %hi(boot_cpu_id4), %g1 ! master always 0
stb %g0, [%g1 + %lo(boot_cpu_id4)]
rd %asr17,%g1 rd %asr17,%g1
srl %g1,28,%g1 srl %g1,28,%g1
...@@ -893,9 +890,6 @@ sun4d_init: ...@@ -893,9 +890,6 @@ sun4d_init:
sta %g4, [%g0] ASI_M_VIKING_TMP1 sta %g4, [%g0] ASI_M_VIKING_TMP1
sethi %hi(boot_cpu_id), %g5 sethi %hi(boot_cpu_id), %g5
stb %g4, [%g5 + %lo(boot_cpu_id)] stb %g4, [%g5 + %lo(boot_cpu_id)]
sll %g4, 2, %g4
sethi %hi(boot_cpu_id4), %g5
stb %g4, [%g5 + %lo(boot_cpu_id4)]
#endif #endif
/* Fall through to sun4m_init */ /* Fall through to sun4m_init */
...@@ -1024,14 +1018,28 @@ sun4c_continue_boot: ...@@ -1024,14 +1018,28 @@ sun4c_continue_boot:
bl 1b bl 1b
add %o0, 0x1, %o0 add %o0, 0x1, %o0
/* If boot_cpu_id has not been setup by machine specific
* init-code above we default it to zero.
*/
sethi %hi(boot_cpu_id), %g2
ldub [%g2 + %lo(boot_cpu_id)], %g3
cmp %g3, 0xff
bne 1f
nop
mov %g0, %g3
stub %g3, [%g2 + %lo(boot_cpu_id)]
1: /* boot_cpu_id set. calculate boot_cpu_id4 = boot_cpu_id*4 */
sll %g3, 2, %g3
sethi %hi(boot_cpu_id4), %g2
stub %g3, [%g2 + %lo(boot_cpu_id4)]
/* Initialize the uwinmask value for init task just in case. /* Initialize the uwinmask value for init task just in case.
* But first make current_set[boot_cpu_id] point to something useful. * But first make current_set[boot_cpu_id] point to something useful.
*/ */
set init_thread_union, %g6 set init_thread_union, %g6
set current_set, %g2 set current_set, %g2
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
sethi %hi(boot_cpu_id4), %g3
ldub [%g3 + %lo(boot_cpu_id4)], %g3
st %g6, [%g2] st %g6, [%g2]
add %g2, %g3, %g2 add %g2, %g3, %g2
#endif #endif
......
...@@ -103,6 +103,10 @@ static unsigned int boot_flags __initdata = 0; ...@@ -103,6 +103,10 @@ static unsigned int boot_flags __initdata = 0;
/* Exported for mm/init.c:paging_init. */ /* Exported for mm/init.c:paging_init. */
unsigned long cmdline_memory_size __initdata = 0; unsigned long cmdline_memory_size __initdata = 0;
/* which CPU booted us (0xff = not set) */
unsigned char boot_cpu_id = 0xff; /* 0xff will make it into DATA section... */
unsigned char boot_cpu_id4; /* boot_cpu_id << 2 */
static void static void
prom_console_write(struct console *con, const char *s, unsigned n) prom_console_write(struct console *con, const char *s, unsigned n)
{ {
......
...@@ -37,8 +37,6 @@ ...@@ -37,8 +37,6 @@
#include "irq.h" #include "irq.h"
volatile unsigned long cpu_callin_map[NR_CPUS] __cpuinitdata = {0,}; volatile unsigned long cpu_callin_map[NR_CPUS] __cpuinitdata = {0,};
unsigned char boot_cpu_id = 0;
unsigned char boot_cpu_id4 = 0; /* boot_cpu_id << 2 */
cpumask_t smp_commenced_mask = CPU_MASK_NONE; cpumask_t smp_commenced_mask = CPU_MASK_NONE;
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <asm/io.h> #include <asm/io.h>
#include <asm/sbi.h> #include <asm/sbi.h>
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
#include <asm/setup.h>
#include "kernel.h" #include "kernel.h"
#include "irq.h" #include "irq.h"
...@@ -438,11 +439,9 @@ static void __init sun4d_init_timers(irq_handler_t counter_fn) ...@@ -438,11 +439,9 @@ static void __init sun4d_init_timers(irq_handler_t counter_fn)
void __init sun4d_init_sbi_irq(void) void __init sun4d_init_sbi_irq(void)
{ {
struct device_node *dp; struct device_node *dp;
int target_cpu = 0; int target_cpu;
#ifdef CONFIG_SMP
target_cpu = boot_cpu_id; target_cpu = boot_cpu_id;
#endif
for_each_node_by_name(dp, "sbi") { for_each_node_by_name(dp, "sbi") {
int devid = of_getintprop_default(dp, "device-id", 0); int devid = of_getintprop_default(dp, "device-id", 0);
int board = of_getintprop_default(dp, "board#", 0); int board = of_getintprop_default(dp, "board#", 0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment