#define HEADER_OFFSET 0x40
#define VALIDATION_WORD 0x31305341
+#define IMAGE_ALIGN 16
/* Minimum and default entry point offset */
#define ENTRY_POINT_OFFSET 0x14
return 0;
}
-static unsigned int sfp_pad_size(uint8_t ver)
+static unsigned int sfp_max_size(uint8_t ver)
{
if (ver == 0)
return sizeof(buffer_v0);
return 0;
}
+static unsigned int sfp_aligned_len(uint32_t size)
+{
+ /* Add 4 bytes for CRC and align to 16 bytes */
+ return ALIGN(size + sizeof(uint32_t), IMAGE_ALIGN);
+}
+
/*
* The header checksum is just a very simple checksum over
* the header area.
struct image_tool_params *params)
{
uint32_t calc_crc;
+ uint32_t crc_off;
/* Align the length up */
- len = ALIGN(len, 4);
+ len = sfp_aligned_len(len);
- /* Build header, adding 4 bytes to length to hold the CRC32. */
- sfp_build_header(buf + HEADER_OFFSET, ver, flags, len + 4, params);
+ /* Build header */
+ sfp_build_header(buf + HEADER_OFFSET, ver, flags, len, params);
/* Calculate and apply the CRC */
- calc_crc = ~pbl_crc32(0, (char *)buf, len);
+ crc_off = len - sizeof(uint32_t); /* at last 4 bytes of image */
+ calc_crc = ~pbl_crc32(0, (char *)buf, crc_off);
- *((uint32_t *)(buf + len)) = cpu_to_le32(calc_crc);
+ *((uint32_t *)(buf + crc_off)) = cpu_to_le32(calc_crc);
if (!pad_64k)
return len + 4;
- return sfp_pad_size(ver);
+ return sfp_max_size(ver);
}
/* Verify that the buffer looks sane */
return -1;
}
- if (len < HEADER_OFFSET || len > sfp_pad_size(ver)) {
+ if (len < HEADER_OFFSET || len > sfp_max_size(ver)) {
debug("Invalid header length (%i)\n", len);
return -1;
}
* To work in with the mkimage framework, we do some ugly stuff...
*
* First, socfpgaimage_vrec_header() is called.
- * We prepend a fake header big enough to make the file sfp_pad_size().
+ * We prepend a fake header big enough to include crc32 and align image to 16
+ * bytes.
* This gives us enough space to do what we want later.
*
* Next, socfpgaimage_set_header() is called.
* We fix up the buffer by moving the image to the start of the buffer.
- * We now have some room to do what we need (add CRC and padding).
+ * We now have some room to do what we need (add CRC).
*/
static int data_size;
static int sfp_fake_header_size(unsigned int size, uint8_t ver)
{
- return sfp_pad_size(ver) - size;
+ unsigned int align_size;
+
+ align_size = sfp_aligned_len(size);
+
+ /* extra bytes needed */
+ return align_size - size;
}
static int sfp_vrec_header(struct image_tool_params *params,
if (params->datafile &&
stat(params->datafile, &sbuf) == 0 &&
- sbuf.st_size <= (sfp_pad_size(ver) - sizeof(uint32_t))) {
+ sbuf.st_size <= (sfp_max_size(ver) - sizeof(uint32_t))) {
data_size = sbuf.st_size;
tparams->header_size = sfp_fake_header_size(data_size, ver);
}
/*
* This function is called after vrec_header() has been called.
* At this stage we have the sfp_fake_header_size() dummy bytes
- * followed by data_size image bytes. Total = sfp_pad_size().
+ * followed by data_size image bytes.
* We need to fix the buffer by moving the image bytes back to
* the beginning of the buffer, then actually do the signing stuff...
*/