|
@@ -63,6 +63,7 @@ static table_entry_t imximage_bootops[] = {
|
|
|
static table_entry_t imximage_versions[] = {
|
|
|
{IMXIMAGE_V1, "", " (i.MX25/35/51 compatible)", },
|
|
|
{IMXIMAGE_V2, "", " (i.MX53/6 compatible)", },
|
|
|
+ {IMXIMAGE_V3, "", " (Vybrid no DCD compatible)",},
|
|
|
{-1, "", " (Invalid)", },
|
|
|
};
|
|
|
|
|
@@ -237,7 +238,6 @@ static void set_imx_hdr_v2(struct imx_header *imxhdr, uint32_t dcd_len,
|
|
|
fhdr_v2->entry = entry_point;
|
|
|
fhdr_v2->reserved1 = fhdr_v2->reserved2 = 0;
|
|
|
fhdr_v2->self = hdr_base = entry_point - sizeof(struct imx_header);
|
|
|
-
|
|
|
fhdr_v2->dcd_ptr = hdr_base + offsetof(imx_header_v2_t, dcd_table);
|
|
|
fhdr_v2->boot_data_ptr = hdr_base
|
|
|
+ offsetof(imx_header_v2_t, boot_data);
|
|
@@ -247,6 +247,30 @@ static void set_imx_hdr_v2(struct imx_header *imxhdr, uint32_t dcd_len,
|
|
|
fhdr_v2->csf = 0;
|
|
|
header_size_ptr = &hdr_v2->boot_data.size;
|
|
|
}
|
|
|
+static void set_imx_hdr_v3(struct imx_header *imxhdr, uint32_t dcd_len,
|
|
|
+ uint32_t entry_point, uint32_t flash_offset)
|
|
|
+{
|
|
|
+ imx_header_v2_t *hdr_v2 = &imxhdr->header.hdr_v2;
|
|
|
+ flash_header_v2_t *fhdr_v2 = &hdr_v2->fhdr;
|
|
|
+ uint32_t hdr_base;
|
|
|
+
|
|
|
+ /* Set magic number */
|
|
|
+ fhdr_v2->header.tag = IVT_HEADER_TAG; /* 0xD1 */
|
|
|
+ fhdr_v2->header.length = cpu_to_be16(sizeof(flash_header_v2_t));
|
|
|
+ fhdr_v2->header.version = IVT_VERSION; /* 0x40 */
|
|
|
+
|
|
|
+ fhdr_v2->entry = entry_point;
|
|
|
+ fhdr_v2->reserved1 = fhdr_v2->reserved2 = 0;
|
|
|
+ fhdr_v2->self = hdr_base = entry_point - sizeof(struct imx_header);
|
|
|
+ fhdr_v2->dcd_ptr = 0x00000000;
|
|
|
+ fhdr_v2->boot_data_ptr = hdr_base
|
|
|
+ + offsetof(imx_header_v2_t, boot_data);
|
|
|
+ hdr_v2->boot_data.start = hdr_base - flash_offset;
|
|
|
+
|
|
|
+ /* Security feature are not supported */
|
|
|
+ fhdr_v2->csf = 0;
|
|
|
+ header_size_ptr = &hdr_v2->boot_data.size;
|
|
|
+}
|
|
|
|
|
|
static void set_hdr_func(struct imx_header *imxhdr)
|
|
|
{
|
|
@@ -263,6 +287,12 @@ static void set_hdr_func(struct imx_header *imxhdr)
|
|
|
set_imx_hdr = set_imx_hdr_v2;
|
|
|
max_dcd_entries = MAX_HW_CFG_SIZE_V2;
|
|
|
break;
|
|
|
+ case IMXIMAGE_V3:
|
|
|
+ set_dcd_val = set_dcd_val_v2;
|
|
|
+ set_dcd_rst = set_dcd_rst_v2;
|
|
|
+ set_imx_hdr = set_imx_hdr_v3;
|
|
|
+ max_dcd_entries = MAX_HW_CFG_SIZE_V2;
|
|
|
+ break;
|
|
|
default:
|
|
|
err_imximage_version(imximage_version);
|
|
|
break;
|
|
@@ -492,6 +522,7 @@ static void imximage_print_header(const void *ptr)
|
|
|
print_hdr_v1(imx_hdr);
|
|
|
break;
|
|
|
case IMXIMAGE_V2:
|
|
|
+ case IMXIMAGE_V3:
|
|
|
print_hdr_v2(imx_hdr);
|
|
|
break;
|
|
|
default:
|