Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1ddb22e1 authored by Sam Ravnborg's avatar Sam Ravnborg Committed by David S. Miller
Browse files

sparc32,leon: fix leon bootup



head_32.S failed to set cputypval for leon, causing boot to fail.
The boot failed because we failed to recognize this was a LEON
cpu so we did not preoperly run-time patch the the kernel.
This resulted in an early crash.

Reported-by: default avatarDaniel Hellstrom <daniel@gaisler.com>
Tested-by: default avatarDaniel Hellstrom <daniel@gaisler.com>
Signed-off-by: default avatarSam Ravnborg <sam@ravnborg.org>
Cc: Konrad Eisele <konrad@gaisler.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d4511e69
Loading
Loading
Loading
Loading
+41 −32
Original line number Diff line number Diff line
@@ -372,36 +372,9 @@ execute_in_high_mem:
		sethi	%hi(linux_dbvec), %g1
		st	%o1, [%g1 + %lo(linux_dbvec)]

		/* Check if this is a LEON CPU.
		 * Skip getprops call if it is
		/* Get the machine type via the romvec
		 * getprops node operation
		 */
		srl	%g3, PSR_IMPL_SHIFT, %g3
		and	%g3, PSR_IMPL_SHIFTED_MASK, %g3
		cmp	%g3, PSR_IMPL_LEON
		 bne	get_cputype


		/* LEON CPU - set boot_cpu_id */
		sethi	%hi(boot_cpu_id), %g2	! boot-cpu index

#ifdef CONFIG_SMP
		ldub	[%g2 + %lo(boot_cpu_id)], %g1
		cmp	%g1, 0xff		! unset means first CPU
		bne	leon_smp_cpu_startup	! continue only with master
		 nop
#endif
		/* Get CPU-ID from most significant 4-bit of ASR17 */
		rd     %asr17, %g1
		srl    %g1, 28, %g1

		/* Update boot_cpu_id only on boot cpu */
		stub	%g1, [%g2 + %lo(boot_cpu_id)]

		ba continue_boot
		 nop

/* Get the machine type via the mysterious romvec node operations. */
get_cputype:
		add	%g7, 0x1c, %l1
		ld	[%l1], %l0
		ld	[%l0], %l0
@@ -420,10 +393,26 @@ get_cputype:
						! to a buf where above string
						! will get stored by the prom.

/* Check to cputype. We may be booted on a sun4u (64 bit box),
 * and sun4d needs special treatment.

		/* Check value of "compatible" property.
		 * "value" => "model"
		 * leon => sparc_leon
		 * sun4m => sun4m
		 * sun4s => sun4m
		 * sun4d => sun4d
		 * sun4e => "no_sun4e_here"
		 * '*'   => "no_sun4u_here"
		 * Check single letters only
		 */

		set	cputypval, %o2
		/* If cputypval[0] == 'l' (lower case letter L) this is leon */
		ldub	[%o2], %l1
		cmp	%l1, 'l'
		be	leon_init
		 nop

		/* Check cputypval[4] to find the sun model */
		ldub	[%o2 + 0x4], %l1

		cmp	%l1, 'm'
@@ -438,6 +427,26 @@ get_cputype:
		b	no_sun4u_here		! AIEEE, a V9 sun4u... Get our BIG BROTHER kernel :))
		 nop

leon_init:
		/* LEON CPU - set boot_cpu_id */
		sethi	%hi(boot_cpu_id), %g2	! boot-cpu index

#ifdef CONFIG_SMP
		ldub	[%g2 + %lo(boot_cpu_id)], %g1
		cmp	%g1, 0xff		! unset means first CPU
		bne	leon_smp_cpu_startup	! continue only with master
		 nop
#endif
		/* Get CPU-ID from most significant 4-bit of ASR17 */
		rd     %asr17, %g1
		srl    %g1, 28, %g1

		/* Update boot_cpu_id only on boot cpu */
		stub	%g1, [%g2 + %lo(boot_cpu_id)]

		ba continue_boot
		 nop

/* CPUID in bootbus can be found at PA 0xff0140000 */
#define SUN4D_BOOTBUS_CPUID     0xf0140000