From: Lokesh Vutla <lokeshvutla@ti.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [RFC PATCH 1/2] spl: Add an option to load a FIT containing U-Boot from FS
Date: Thu, 14 Apr 2016 10:47:12 +0530 [thread overview]
Message-ID: <570F27D8.5030106@ti.com> (raw)
In-Reply-To: <CAPnjgZ1TuZDRqbQ-CgThqJaOiqZ2NPYF=yG_uioZG1wfvQtmyA@mail.gmail.com>
Hi Simon,
On Sunday 10 April 2016 12:05 AM, Simon Glass wrote:
> Hi Lokesh,
>
> On 4 April 2016 at 22:30, Lokesh Vutla <lokeshvutla@ti.com> wrote:
>> This provides a way to load a FIT containing U-Boot and a selection of device
>> tree files from a File system.
>>
>> Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
>> ---
>> common/spl/spl_fit.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>> include/spl.h | 5 +++
>> 2 files changed, 101 insertions(+)
>>
>> diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
>> index 1a5c027..4c9fe7b 100644
>> --- a/common/spl/spl_fit.c
>> +++ b/common/spl/spl_fit.c
>> @@ -192,3 +192,99 @@ int spl_load_simple_fit(struct spl_load_info *info, ulong sector, void *fit)
>>
>> return 0;
>> }
>> +
>> +int spl_fs_load_simple_fit(struct spl_load_info *info, const char *filename, void *fit)
>> +{
>> + ulong size, load;
>> + unsigned long count;
>> + int node, images;
>> + void *load_ptr;
>> + int fdt_offset, fdt_len;
>> + int data_offset, data_size, file_offset;
>> + int base_offset = 0, align_len;
>> + void *dst;
>> +
>> + /*
>> + * Figure out where the external images start. This is the base for the
>> + * data-offset properties in each image.
>> + */
>> + size = fdt_totalsize(fit);
>> + size = (size + 3) & ~3;
>> + base_offset = (size + 3) & ~3;
>
> Can you please refactor this to share code with spl_load_simple_fit()
> where possible?
Sure.
>
>> +
>> + /*
>> + * Read the entire FIT header, placing it so it finishes before
>> + * where we will load the image. Also the load address is aligned
>> + * ARCH_DMA_MINALIGN.
>> + */
>> + align_len = ARCH_DMA_MINALIGN - 1;
>> + fit = (void *)((CONFIG_SYS_TEXT_BASE - size - align_len) & ~align_len);
>> + debug("FIT header read: destination = 0x%p, size = %lx \n", fit, size);
>> + count = info->fs_read(info, filename, fit, 0, size);
>> + if (count <= 0)
>> + return -EIO;
>> +
>> + /* find the firmware image to load */
>> + images = fdt_path_offset(fit, FIT_IMAGES_PATH);
>> + if (images < 0) {
>> + printf("%s: Cannot find /images node: %d\n", __func__, images);
>> + return -1;
>> + }
>> + node = fdt_first_subnode(fit, images);
>> + if (node < 0) {
>> + printf("%s: Cannot find first image node: %d\n", __func__, node);
>> + return -1;
>> + }
>> +
>> + /* Get its information and set up the spl_image structure */
>> + data_offset = fdt_getprop_u32(fit, node, "data-offset");
>> + data_size = fdt_getprop_u32(fit, node, "data-size");
>> + load = fdt_getprop_u32(fit, node, "load");
>> + debug("data_offset=%x, data_size=%x\n", data_offset, data_size);
>> + spl_image.load_addr = load;
>> + spl_image.entry_point = load;
>> + spl_image.os = IH_OS_U_BOOT;
>> +
>> + /*
>> + * Work out where to place the image. Assuming load addr of u-boot.bin
>> + * is always aligned to ARCH_DMA_MINALIGN. It is possible that file
>> + * offset is not aligned. In order to make sure that the file read is
>> + * dma aligned, align the file offset to dma with extra bytes in the
>> + * beginning. Then do a memcpy of image to dst.
>> + */
>> + data_offset += base_offset;
>> + file_offset = data_offset & ~align_len;
>> + load_ptr = (void *)load;
>> + dst = load_ptr;
>> +
>> + /* Read the image */
>> + debug("Temp u-boot.bin read from fit: dst = 0x%p, file offset = 0x%x, size = 0x%x\n",
>> + dst, file_offset, data_size);
>> + count = info->fs_read(info, filename, dst, file_offset, data_size);
>> + if (count <= 0)
>> + return -EIO;
>> + debug("u-boot.bin load: dst = 0x%p, size = 0x%x\n", dst, data_size);
>> + memcpy(dst, dst + (data_offset & align_len), data_size);
>> +
>> + /* Figure out which device tree the board wants to use */
>> + fdt_len = spl_fit_select_fdt(fit, images, &fdt_offset);
>> + if (fdt_len < 0)
>> + return fdt_len;
>> +
>> + /*
>> + * Read the device tree and place it after the image. Making sure that
>> + * load addr and file offset are aligned to dma.
>> + */
>> + dst = (void *)((load + data_size + align_len) & ~align_len);
>> + fdt_offset += base_offset;
>> + file_offset = fdt_offset & ~align_len;
>> + debug("Temp fdt read from fit: dst = 0x%p, file offset = 0x%x, size = %d\n",
>> + dst, file_offset, data_size);
>> + count = info->fs_read(info, filename, dst, file_offset, data_size);
>> + if (count <= 0)
>> + return -EIO;
>> + debug("fdt load: dst = 0x%p, size = 0x%x\n", load_ptr + data_size, data_size);
>> + memcpy(load_ptr + data_size, dst + (fdt_offset & align_len), data_size);
>> +
>> + return 1;
>> +}
>> diff --git a/include/spl.h b/include/spl.h
>> index de4f70a..276ca12 100644
>> --- a/include/spl.h
>> +++ b/include/spl.h
>> @@ -36,6 +36,7 @@ struct spl_image_info {
>> * @priv: Private data for the device
>> * @bl_len: Block length for reading in bytes
>> * @read: Function to call to read from the device
>> + * @fd_read: Function to call to read from the a fs
>> */
>> struct spl_load_info {
>> void *dev;
>> @@ -43,9 +44,13 @@ struct spl_load_info {
>> int bl_len;
>> ulong (*read)(struct spl_load_info *load, ulong sector, ulong count,
>> void *buf);
>> + int (*fs_read)(struct spl_load_info *load, const char *filename,
>> + void *buf, ulong file_offset, ulong size);
>> };
>>
>> int spl_load_simple_fit(struct spl_load_info *info, ulong sector, void *fdt);
>> +int spl_fs_load_simple_fit(struct spl_load_info *info, const char *filename,
>> + void *fit);
>
> Please add a function comment (which apparently I missed also :-)
Will add it in next version.
Just posted an updated series :)
Thanks and regards,
Lokesh
>
>>
>> #define SPL_COPY_PAYLOAD_ONLY 1
>>
>> --
>> 2.1.4
>>
> Regards,
> Simon
>
next prev parent reply other threads:[~2016-04-14 5:17 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-05 4:30 [U-Boot] [RFC PATCH 0/2] spl: Add support to load FIT from Filesystem Lokesh Vutla
2016-04-05 4:30 ` [U-Boot] [RFC PATCH 1/2] spl: Add an option to load a FIT containing U-Boot from FS Lokesh Vutla
2016-04-08 19:45 ` Tom Rini
2016-04-09 18:35 ` Simon Glass
2016-04-14 5:17 ` Lokesh Vutla [this message]
2016-04-05 4:30 ` [U-Boot] [RFC PATCH 2/2] spl: Support loading a FIT from FAT FS Lokesh Vutla
2016-04-08 19:45 ` Tom Rini
2016-04-09 18:35 ` Simon Glass
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=570F27D8.5030106@ti.com \
--to=lokeshvutla@ti.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.