
On 23.05.19 19:07, Jagan Teki wrote:
On Thu, May 23, 2019 at 10:18 PM Fabio Estevam festevam@gmail.com wrote:
On Thu, May 23, 2019 at 1:11 PM Jagan Teki jagan@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:
Allow to load a FIT image via Serial Download Protocol
Detect the SPL size overflow in build-time
- 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@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_ */