On Fri, 4 Sep 2015 00:30:57 +0200 Bernhard Nortmann <[email protected]> wrote:
> This patch makes use of a new sunxi SPL header format, where > fields for passing data to U-Boot are reserved. This allows the > "fel" utility to provide specific pieces of information by > setting these fields (which will be evaluated by U-Boot then). > For now, we may specify a memory region by address and size. > > Currently the typical use case is to provide the memory location > of the boot script file (boot.scr). A suitably modified U-Boot > can adjust the boot process accordingly and will auto-execute > the script. > > Signed-off-by: Bernhard Nortmann <[email protected]> > --- > fel.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 53 insertions(+) > > diff --git a/fel.c b/fel.c > index c27ebe3..7befd15 100644 > --- a/fel.c > +++ b/fel.c > @@ -259,6 +259,10 @@ void aw_fel_read(libusb_device_handle *usb, uint32_t > offset, void *buf, size_t l > aw_read_fel_status(usb); > } > > +/* forward declaration to keep the compiler happy */ > +void pass_fel_information(libusb_device_handle *usb, > + uint32_t data_addr, size_t data_size); > + > void aw_fel_write(libusb_device_handle *usb, void *buf, uint32_t offset, > size_t len) > { > /* safeguard against overwriting an already loaded U-Boot binary */ > @@ -272,6 +276,15 @@ void aw_fel_write(libusb_device_handle *usb, void *buf, > uint32_t offset, size_t > aw_send_fel_request(usb, AW_FEL_1_WRITE, offset, len); > aw_usb_write(usb, buf, len); > aw_read_fel_status(usb); > + > + /* > + * If we have transferred a script, try to inform U-Boot about it. > + * An IH_TYPE_SCRIPT has a well-defined header (including length), > + * so we pass only the address and keep the size value at zero. > + * (Reserving size > 0 for different data / future extensions.) > + */ > + if (len > HEADER_SIZE && get_image_type(buf, 0) == IH_TYPE_SCRIPT) > + pass_fel_information(usb, offset, 0); I'm not sure if it is a good idea to add all these checks into the 'aw_fel_write()' function. This function is a low level primitive operation and overloading it with extra functionality is not great. On the other hand, we also support "write" command as a command line argument passed to the tool. This is a higher level layer and probably a better place to implement these checks. > } > > void aw_fel_execute(libusb_device_handle *usb, uint32_t offset) > @@ -280,6 +293,46 @@ void aw_fel_execute(libusb_device_handle *usb, uint32_t > offset) > aw_read_fel_status(usb); > } > > +/* > + * Test the SPL header for our "sunxi" variant. We want to make sure that > + * we can safely use specific header fields to pass information to U-Boot. > + * In case of a missing signature (e.g. Allwinner boot0) or header version > + * mismatch, this function will return "false". If all seems fine, > + * the result is "true". > + */ > +#define SPL_SIGNATURE "SPL" /* marks "sunxi" header */ > +#define SPL_EXPECTED_VERSION 1 > +int have_sunxi_spl(libusb_device_handle *usb) > +{ > + const uint8_t expected[] = SPL_SIGNATURE; > + uint8_t spl_signature[4]; > + > + aw_fel_read(usb, 0x14, &spl_signature, sizeof(spl_signature)); With the A80 support patches sent earlier and now pushed to the sunxi-tools repository, this would need to become become "sram_info->spl_addr + 0x14". Could you please rebase your patch? Sorry for the inconvenience. > + return (memcmp(spl_signature, expected, 3) == 0 > + && spl_signature[3] == SPL_EXPECTED_VERSION); > +} > + > +/* > + * Pass information to U-Boot via specialized fields in the SPL header > + * (see "boot_file_head" in ${U-BOOT}/tools/mksunxiboot.c), providing > + * information about some data address and size. > + * Typically this will be the DRAM location of a boot script (boot.scr). > + */ > +void pass_fel_information(libusb_device_handle *usb, > + uint32_t data_addr, size_t data_size) > +{ > + /* write something _only_ if we have a suitable SPL header */ > + if (have_sunxi_spl(usb)) { > + struct { > + uint32_t fel_data_address; > + uint32_t fel_data_size; > + } transfer = {data_addr, data_size}; > + pr_info("Passing boot info via sunxi SPL: data addr 0x%08X, > size 0x%X\n", > + transfer.fel_data_address, transfer.fel_data_size); > + aw_fel_write(usb, &transfer, 0x18, sizeof(transfer)); > + } > +} > + > void hexdump(void *data, uint32_t offset, size_t size) > { > size_t j; -- Best regards, Siarhei Siamashka -- You received this message because you are subscribed to the Google Groups "linux-sunxi" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
