On 23.05.19 19:07, Jagan Teki wrote: > On Thu, May 23, 2019 at 10:18 PM Fabio Estevam <feste...@gmail.com> wrote: >> >> On Thu, May 23, 2019 at 1:11 PM Jagan Teki <ja...@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.schre...@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_ */ _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot