usb: gadget: f_sdp: Allow SPL to load and boot FIT via SDP

Add support for loading u-boot FIT images over the USB SDP protocol in
the SPL

Signed-off-by: Frieder Schrempf <frieder.schrempf@kontron.de>
[Various build fixes]
Signed-off-by: Sjoerd Simons <sjoerd.simons@collabora.co.uk>
Tested-by: Fabio Estevam <festevam@gmail.com>
Tested-by: Lukasz Majewski <lukma@denx.de>
This commit is contained in:
Frieder Schrempf 2019-06-04 21:56:29 +02:00 committed by Stefano Babic
parent 77f6e2dd05
commit 2c72ead738
3 changed files with 63 additions and 11 deletions

View File

@ -25,10 +25,14 @@ static int spl_sdp_load_image(struct spl_image_info *spl_image,
return -ENODEV; return -ENODEV;
} }
/* This command typically does not return but jumps to an image */ /*
sdp_handle(controller_index); * This command either loads a legacy image, jumps and never returns,
pr_err("SDP ended\n"); * or it loads a FIT image and returns it to be handled by the SPL
* code.
*/
ret = spl_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); SPL_LOAD_IMAGE_METHOD("USB SDP", 0, BOOT_DEVICE_BOARD, spl_sdp_load_image);

View File

@ -638,7 +638,20 @@ static u32 sdp_jump_imxheader(void *address)
return 0; return 0;
} }
static void sdp_handle_in_ep(void) #ifdef CONFIG_SPL_BUILD
#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
#endif
static void sdp_handle_in_ep(struct spl_image_info *spl_image)
{ {
u8 *data = sdp_func->in_req->buf; u8 *data = sdp_func->in_req->buf;
u32 status; u32 status;
@ -690,10 +703,25 @@ static void sdp_handle_in_ep(void)
/* If imx header fails, try some U-Boot specific headers */ /* If imx header fails, try some U-Boot specific headers */
if (status) { if (status) {
#ifdef CONFIG_SPL_BUILD #ifdef CONFIG_SPL_BUILD
image_header_t *header =
sdp_ptr(sdp_func->jmp_address);
#ifdef CONFIG_SPL_LOAD_FIT
if (image_get_magic(header) == FDT_MAGIC) {
struct spl_load_info load;
debug("Found FIT\n");
load.dev = header;
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 */ /* In SPL, allow jumps to U-Boot images */
struct spl_image_info spl_image = {}; struct spl_image_info spl_image = {};
spl_parse_image_header(&spl_image, spl_parse_image_header(&spl_image, header);
(struct image_header *)sdp_func->jmp_address);
jump_to_image_no_args(&spl_image); jump_to_image_no_args(&spl_image);
#else #else
/* In U-Boot, allow jumps to scripts */ /* In U-Boot, allow jumps to scripts */
@ -715,19 +743,32 @@ static void sdp_handle_in_ep(void)
}; };
} }
void sdp_handle(int controller_index) #ifndef CONFIG_SPL_BUILD
int sdp_handle(int controller_index)
#else
int spl_sdp_handle(int controller_index, struct spl_image_info *spl_image)
#endif
{ {
printf("SDP: handle requests...\n"); printf("SDP: handle requests...\n");
while (1) { while (1) {
if (ctrlc()) { if (ctrlc()) {
puts("\rCTRL+C - Operation aborted.\n"); puts("\rCTRL+C - Operation aborted.\n");
return; return -EINVAL;
} }
#ifdef CONFIG_SPL_BUILD
if (spl_image->flags & SPL_FIT_FOUND)
return 0;
#endif
WATCHDOG_RESET(); WATCHDOG_RESET();
usb_gadget_handle_interrupts(controller_index); usb_gadget_handle_interrupts(controller_index);
sdp_handle_in_ep(); #ifdef CONFIG_SPL_BUILD
sdp_handle_in_ep(spl_image);
#else
sdp_handle_in_ep(NULL);
#endif
} }
} }

View File

@ -10,6 +10,13 @@
#define __SDP_H_ #define __SDP_H_
int sdp_init(int controller_index); int sdp_init(int controller_index);
void sdp_handle(int controller_index);
#ifdef CONFIG_SPL_BUILD
#include <spl.h>
int spl_sdp_handle(int controller_index, struct spl_image_info *spl_image);
#else
int sdp_handle(int controller_index);
#endif
#endif /* __SDP_H_ */ #endif /* __SDP_H_ */