[PATCH 06/11] ARM: i.MX: xload-esdhc: Allow patching first word of the image

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Depending on how SD card/eMMC was programmed first byte of the image
ther may or may not have appropriate branch instruction. Extend
esdhc_start_image() to allow passing a custom callback that would
patch the first instruction in memory to correctly redirect the CPU to
the resto of the code.

Signed-off-by: Andrey Smirnov <andrew.smirnov@xxxxxxxxx>
---
 arch/arm/mach-imx/xload-esdhc.c | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/arch/arm/mach-imx/xload-esdhc.c b/arch/arm/mach-imx/xload-esdhc.c
index 98ebdfcf7..c017a8b10 100644
--- a/arch/arm/mach-imx/xload-esdhc.c
+++ b/arch/arm/mach-imx/xload-esdhc.c
@@ -219,7 +219,8 @@ static int esdhc_read_blocks(struct esdhc *esdhc, void *dst, size_t len)
 }
 
 static int
-esdhc_start_image(struct esdhc *esdhc, ptrdiff_t address, u32 offset)
+esdhc_start_image(struct esdhc *esdhc, ptrdiff_t address, u32 offset,
+		  u32 (*opcode_b)(u32))
 {
 	void *buf = (void *)address;
 	u32 *ivt = buf + offset + SZ_1K;
@@ -254,6 +255,9 @@ esdhc_start_image(struct esdhc *esdhc, ptrdiff_t address, u32 offset)
 
 	bb = buf + ofs;
 
+	if (opcode_b)
+		*(u32 *)buf = opcode_b(ofs);
+
 	bb();
 }
 
@@ -292,7 +296,12 @@ int imx6_esdhc_start_image(int instance)
 
 	esdhc.is_mx6 = 1;
 
-	return esdhc_start_image(&esdhc, 0x10000000, 0);
+	return esdhc_start_image(&esdhc, 0x10000000, 0, NULL);
+}
+
+static u32 aarch64_opcode_b(u32 to)
+{
+	return 0x14000000 | (to / 4);
 }
 
 /**
@@ -324,5 +333,8 @@ int imx8_esdhc_start_image(int instance)
 
 	esdhc.is_mx6 = 1;
 
-	return esdhc_start_image(&esdhc, MX8MQ_ATF_BL33_BASE_ADDR, SZ_32K);
+	return esdhc_start_image(&esdhc,
+				 MX8MQ_ATF_BL33_BASE_ADDR,
+				 SZ_32K,
+				 aarch64_opcode_b);
 }
\ No newline at end of file
-- 
2.17.1


_______________________________________________
barebox mailing list
barebox@xxxxxxxxxxxxxxxxxxx
http://lists.infradead.org/mailman/listinfo/barebox



[Index of Archives]     [Linux Embedded]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux