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

Commit 026a2078 authored by Michal Simek's avatar Michal Simek
Browse files

microblaze: Fix DTB passing from bootloader



Little endian system needs to check OF_DT_HEADER
but it is swapped because it is in big-endian.
Microblaze LE provides lwr instruction which loads
magic number in BIG endian format which can be compared.

There is used the fact that if you write 0x1 as word
and load it as byte then you get for big-endian zero
and 1 for little-endian.

Signed-off-by: default avatarMichal Simek <monstr@monstr.eu>
parent 1f0324ca
Loading
Loading
Loading
Loading
+12 −2
Original line number Diff line number Diff line
@@ -77,8 +77,18 @@ real_start:
   We ensure r7 points to a valid FDT, just in case the bootloader
   is broken or non-existent */
	beqi	r7, no_fdt_arg			/* NULL pointer?  don't copy */
	lw	r11, r0, r7			/* Does r7 point to a */
	rsubi	r11, r11, OF_DT_HEADER		/* valid FDT? */
/* Does r7 point to a valid FDT? Load HEADER magic number */
	/* Run time Big/Little endian platform */
	/* Save 1 as word and load byte - 0 - BIG, 1 - LITTLE */
	addik	r11, r0, 0x1 /* BIG/LITTLE checking value */
	/* __bss_start will be zeroed later - it is just temp location */
	swi	r11, r0, TOPHYS(__bss_start)
	lbui	r11, r0, TOPHYS(__bss_start)
	beqid	r11, big_endian /* DO NOT break delay stop dependency */
	lw	r11, r0, r7 /* Big endian load in delay slot */
	lwr	r11, r0, r7 /* Little endian load */
big_endian:
	rsubi	r11, r11, OF_DT_HEADER	/* Check FDT header */
	beqi	r11, _prepare_copy_fdt
	or	r7, r0, r0		/* clear R7 when not valid DTB */
	bnei	r11, no_fdt_arg			/* No - get out of here */