[U-Boot] Cannot boot mx6qsabred with 2019.07-rc2

Schrempf Frieder frieder.schrempf at kontron.de
Thu May 23 17:26:00 UTC 2019


On 23.05.19 19:07, Jagan Teki wrote:
> On Thu, May 23, 2019 at 10:18 PM Fabio Estevam <festevam at gmail.com> wrote:
>>
>> On Thu, May 23, 2019 at 1:11 PM Jagan Teki <jagan at amarulasolutions.com> wrote:
>>
>>> Don't know whether this is SPL size issue or not? can you try
>>> SPL_OF_PLATDATA and TINY* I can see the size reduced with 64512 bytes
>>> (one build issue on fdtdec_get_int undefined)
>>
>> Yes, it does not build with CONFIG_SPL_OF_PLATDATA:
>>
>> lib/built-in.o: In function `fdtdec_parse_phandle_with_args':
>> /home/fabio/u-boot/lib/fdtdec.c:788: undefined reference to `fdtdec_get_int'
> 
> Couldn't dig much here, would be happy someone can find this?
> 
>> drivers/built-in.o: In function `fsl_esdhc_probe':
>> /home/fabio/u-boot/drivers/mmc/fsl_esdhc.c:1480: undefined reference
>> to `fdtdec_get_int'
>> /home/fabio/u-boot/drivers/mmc/fsl_esdhc.c:1482: undefined reference
>> to `fdtdec_get_int'
>> /home/fabio/u-boot/drivers/mmc/fsl_esdhc.c:1485: undefined reference
> 
> These we can fix, by supporting platdata support into driver.
> 
>> to `fdtdec_get_int'
>> scripts/Makefile.spl:404: recipe for target 'spl/u-boot-spl' failed
>> make[1]: *** [spl/u-boot-spl] Error 1
>>
>> Thanks for the suggestions, but at this point I prefer to go with the
>> removal of CONFIG_SPL_DM.
> 
> We have 45 days to release, I think we can make these fixes quite
> normally what do you think? fsl_esdhc.c build I can mark a patch in
> few days if required.
> 
>>
>> For 2019.07 it would be really nice if we could fix these two issues:
>>
>> 1. Allow to load a FIT image via Serial Download Protocol
>>
>> 2. Detect the SPL size overflow in build-time
> 
> 1) We are working on this, 2) can be done.

As luck would have it, I needed to load a FIT via SDP today, so I came 
up with a quick patch (see below). There are probably better ways to do 
this, but it works.

#############################

commit 408b9d26eea48e6f85dd087750629f7a4095c73d
Author: Frieder Schrempf <frieder.schrempf at kontron.de>
Date:   Thu May 23 14:52:47 2019 +0200

     Allow SPL to load and boot FIT via SDP

diff --git a/common/spl/spl_sdp.c b/common/spl/spl_sdp.c
index 807256e908..8f990a83a3 100644
--- a/common/spl/spl_sdp.c
+++ b/common/spl/spl_sdp.c
@@ -25,10 +25,13 @@ static int spl_sdp_load_image(struct spl_image_info 
*spl_image,
  		return -ENODEV;
  	}

-	/* This command typically does not return but jumps to an image */
-	sdp_handle(controller_index);
-	pr_err("SDP ended\n");
+	/*
+	 * This command either loads a legacy image, jumps and never returns,
+	 * or it loads a FIT image and returns it to be handled by the SPL code.
+	 */
+	ret = sdp_handle(controller_index, spl_image);
+	debug("SDP ended\n");

-	return -EINVAL;
+	return ret;
  }
  SPL_LOAD_IMAGE_METHOD("USB SDP", 0, BOOT_DEVICE_BOARD, 
spl_sdp_load_image);
diff --git a/drivers/usb/gadget/f_sdp.c b/drivers/usb/gadget/f_sdp.c
index ae97ab2b49..5690060a2f 100644
--- a/drivers/usb/gadget/f_sdp.c
+++ b/drivers/usb/gadget/f_sdp.c
@@ -638,7 +638,18 @@ static u32 sdp_jump_imxheader(void *address)
  	return 0;
  }

-static void sdp_handle_in_ep(void)
+#ifdef CONFIG_SPL_LOAD_FIT
+static ulong sdp_fit_read(struct spl_load_info *load, ulong sector,
+			  ulong count, void *buf)
+{
+	debug("%s: sector %lx, count %lx, buf %lx\n",
+	      __func__, sector, count, (ulong)buf);
+	memcpy(buf, (void *)(load->dev + sector), count);
+	return count;
+}
+#endif
+
+static void sdp_handle_in_ep(struct spl_image_info *spl_image)
  {
  	u8 *data = sdp_func->in_req->buf;
  	u32 status;
@@ -689,11 +700,25 @@ static void sdp_handle_in_ep(void)

  		/* If imx header fails, try some U-Boot specific headers */
  		if (status) {
+			image_header_t *header =
+				(void *)(u64)sdp_func->jmp_address;
  #ifdef CONFIG_SPL_BUILD
+#ifdef CONFIG_SPL_LOAD_FIT
+			if (image_get_magic(header) == FDT_MAGIC) {
+				struct spl_load_info load;
+
+				printf("Found FIT\n");
+				load.dev = (void *)(u64)sdp_func->jmp_address;
+				load.bl_len = 1;
+				load.read = sdp_fit_read;
+				spl_load_simple_fit(spl_image, &load, 0,
+						    header);
+				return;
+			}
+#endif
  			/* In SPL, allow jumps to U-Boot images */
  			struct spl_image_info spl_image = {};
-			spl_parse_image_header(&spl_image,
-				(struct image_header *)sdp_func->jmp_address);
+			spl_parse_image_header(&spl_image, header);
  			jump_to_image_no_args(&spl_image);
  #else
  			/* In U-Boot, allow jumps to scripts */
@@ -715,19 +740,23 @@ static void sdp_handle_in_ep(void)
  	};
  }

-void sdp_handle(int controller_index)
+int sdp_handle(int controller_index, struct spl_image_info *spl_image)
  {
  	printf("SDP: handle requests...\n");
  	while (1) {
  		if (ctrlc()) {
  			puts("\rCTRL+C - Operation aborted.\n");
-			return;
+			return -EINVAL;
+		}
+
+		if (spl_image->flags & SPL_FIT_FOUND) {
+			return 0;
  		}

  		WATCHDOG_RESET();
  		usb_gadget_handle_interrupts(controller_index);

-		sdp_handle_in_ep();
+		sdp_handle_in_ep(spl_image);
  	}
  }

diff --git a/include/sdp.h b/include/sdp.h
index f6252d027f..f30e2bca19 100644
--- a/include/sdp.h
+++ b/include/sdp.h
@@ -9,7 +9,9 @@
  #ifndef __SDP_H_
  #define __SDP_H_

+#include <spl.h>
+
  int sdp_init(int controller_index);
-void sdp_handle(int controller_index);
+int sdp_handle(int controller_index, struct spl_image_info *spl_image);

  #endif /* __SDP_H_ */


More information about the U-Boot mailing list