All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH V4 1/8] tools: imximage: add plugin support
@ 2016-10-11  6:29 Peng Fan
  2016-10-11  6:29 ` [U-Boot] [PATCH V4 2/8] imx: mx6: Add " Peng Fan
                   ` (8 more replies)
  0 siblings, 9 replies; 12+ messages in thread
From: Peng Fan @ 2016-10-11  6:29 UTC (permalink / raw)
  To: u-boot

Add plugin support for imximage.

Define CONFIG_USE_IMXIMG_PLUGIN in defconfig to enable using plugin.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
Cc: Stefano Babic <sbabic@denx.de>
Cc: Eric Nelson <eric@nelint.com>
Cc: Ye Li <ye.li@nxp.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
---

V4:
 Max 64KB for plugin code.
 
V3:
 Fix compile error.

 V2:
  Drop the CONFIG_USE_PLUGIN, make plugin always support in imximage.

 tools/imximage.c | 283 +++++++++++++++++++++++++++++++++++++++++++------------
 tools/imximage.h |   7 +-
 2 files changed, 230 insertions(+), 60 deletions(-)

diff --git a/tools/imximage.c b/tools/imximage.c
index 092d550..615a64e 100644
--- a/tools/imximage.c
+++ b/tools/imximage.c
@@ -27,6 +27,7 @@ static table_entry_t imximage_cmds[] = {
 	{CMD_CHECK_BITS_CLR,    "CHECK_BITS_CLR",   "Reg Check bits clr", },
 	{CMD_CSF,               "CSF",           "Command Sequence File", },
 	{CMD_IMAGE_VERSION,     "IMAGE_VERSION",        "image version",  },
+	{CMD_PLUGIN,            "PLUGIN",               "file plugin_addr",  },
 	{-1,                    "",                     "",	          },
 };
 
@@ -80,6 +81,9 @@ static uint32_t imximage_ivt_offset = UNDEFINED;
 static uint32_t imximage_csf_size = UNDEFINED;
 /* Initial Load Region Size */
 static uint32_t imximage_init_loadsize;
+static uint32_t imximage_iram_free_start;
+static uint32_t imximage_plugin_size;
+static uint32_t plugin_image;
 
 static set_dcd_val_t set_dcd_val;
 static set_dcd_param_t set_dcd_param;
@@ -118,7 +122,11 @@ static uint32_t detect_imximage_version(struct imx_header *imx_hdr)
 
 	/* Try to detect V2 */
 	if ((fhdr_v2->header.tag == IVT_HEADER_TAG) &&
-		(hdr_v2->dcd_table.header.tag == DCD_HEADER_TAG))
+		(hdr_v2->data.dcd_table.header.tag == DCD_HEADER_TAG))
+		return IMXIMAGE_V2;
+
+	if ((fhdr_v2->header.tag == IVT_HEADER_TAG) &&
+	    hdr_v2->boot_data.plugin)
 		return IMXIMAGE_V2;
 
 	return IMXIMAGE_VER_INVALID;
@@ -165,7 +173,7 @@ static struct dcd_v2_cmd *gd_last_cmd;
 static void set_dcd_param_v2(struct imx_header *imxhdr, uint32_t dcd_len,
 		int32_t cmd)
 {
-	dcd_v2_t *dcd_v2 = &imxhdr->header.hdr_v2.dcd_table;
+	dcd_v2_t *dcd_v2 = &imxhdr->header.hdr_v2.data.dcd_table;
 	struct dcd_v2_cmd *d = gd_last_cmd;
 	struct dcd_v2_cmd *d2;
 	int len;
@@ -261,21 +269,23 @@ static void set_dcd_rst_v1(struct imx_header *imxhdr, uint32_t dcd_len,
 static void set_dcd_rst_v2(struct imx_header *imxhdr, uint32_t dcd_len,
 						char *name, int lineno)
 {
-	dcd_v2_t *dcd_v2 = &imxhdr->header.hdr_v2.dcd_table;
-	struct dcd_v2_cmd *d = gd_last_cmd;
-	int len;
-
-	if (!d)
-		d = &dcd_v2->dcd_cmd;
-	len = be16_to_cpu(d->write_dcd_command.length);
-	if (len > 4)
-		d = (struct dcd_v2_cmd *)(((char *)d) + len);
-
-	len = (char *)d - (char *)&dcd_v2->header;
-
-	dcd_v2->header.tag = DCD_HEADER_TAG;
-	dcd_v2->header.length = cpu_to_be16(len);
-	dcd_v2->header.version = DCD_VERSION;
+	if (!imxhdr->header.hdr_v2.boot_data.plugin) {
+		dcd_v2_t *dcd_v2 = &imxhdr->header.hdr_v2.data.dcd_table;
+		struct dcd_v2_cmd *d = gd_last_cmd;
+		int len;
+
+		if (!d)
+			d = &dcd_v2->dcd_cmd;
+		len = be16_to_cpu(d->write_dcd_command.length);
+		if (len > 4)
+			d = (struct dcd_v2_cmd *)(((char *)d) + len);
+
+		len = (char *)d - (char *)&dcd_v2->header;
+
+		dcd_v2->header.tag = DCD_HEADER_TAG;
+		dcd_v2->header.length = cpu_to_be16(len);
+		dcd_v2->header.version = DCD_VERSION;
+	}
 }
 
 static void set_imx_hdr_v1(struct imx_header *imxhdr, uint32_t dcd_len,
@@ -317,24 +327,94 @@ static void set_imx_hdr_v2(struct imx_header *imxhdr, uint32_t dcd_len,
 	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;
-	hdr_base = entry_point - imximage_init_loadsize +
-		flash_offset;
-	fhdr_v2->self = hdr_base;
-	if (dcd_len > 0)
-		fhdr_v2->dcd_ptr = hdr_base
-			+ offsetof(imx_header_v2_t, dcd_table);
-	else
+	if (!hdr_v2->boot_data.plugin) {
+		fhdr_v2->entry = entry_point;
+		fhdr_v2->reserved1 = 0;
+		fhdr_v2->reserved1 = 0;
+		hdr_base = entry_point - imximage_init_loadsize +
+			flash_offset;
+		fhdr_v2->self = hdr_base;
+		if (dcd_len > 0)
+			fhdr_v2->dcd_ptr = hdr_base +
+				offsetof(imx_header_v2_t, data);
+		else
+			fhdr_v2->dcd_ptr = 0;
+		fhdr_v2->boot_data_ptr = hdr_base
+				+ offsetof(imx_header_v2_t, boot_data);
+		hdr_v2->boot_data.start = entry_point - imximage_init_loadsize;
+
+		fhdr_v2->csf = 0;
+
+		header_size_ptr = &hdr_v2->boot_data.size;
+		csf_ptr = &fhdr_v2->csf;
+	} else {
+		imx_header_v2_t *next_hdr_v2;
+		flash_header_v2_t *next_fhdr_v2;
+
+		if (imximage_csf_size != 0) {
+			fprintf(stderr, "Error: Header v2: SECURE_BOOT is only supported in DCD mode!");
+			exit(EXIT_FAILURE);
+		}
+
+		fhdr_v2->entry = imximage_iram_free_start +
+			flash_offset + sizeof(flash_header_v2_t) +
+			sizeof(boot_data_t);
+
+		fhdr_v2->reserved1 = 0;
+		fhdr_v2->reserved2 = 0;
+		fhdr_v2->self = imximage_iram_free_start + flash_offset;
+
 		fhdr_v2->dcd_ptr = 0;
-	fhdr_v2->boot_data_ptr = hdr_base
-			+ offsetof(imx_header_v2_t, boot_data);
-	hdr_v2->boot_data.start = entry_point - imximage_init_loadsize;
 
-	fhdr_v2->csf = 0;
+		fhdr_v2->boot_data_ptr = fhdr_v2->self +
+				offsetof(imx_header_v2_t, boot_data);
+
+		hdr_v2->boot_data.start = imximage_iram_free_start;
+		/*
+		 * The actural size of plugin image is "imximage_plugin_size +
+		 * sizeof(flash_header_v2_t) + sizeof(boot_data_t)", plus the
+		 * flash_offset space.The ROM code only need to copy this size
+		 * to run the plugin code. However, later when copy the whole
+		 * U-Boot image to DDR, the ROM code use memcpy to copy the
+		 * first part of the image, and use the storage read function
+		 * to get the remaining part. This requires the dividing point
+		 * must be multiple of storage sector size. Here we set the
+		 * first section to be MAX_PLUGIN_CODE_SIZE(64KB) for this
+		 * purpose.
+		 */
+		hdr_v2->boot_data.size = MAX_PLUGIN_CODE_SIZE;
+
+		/* Security feature are not supported */
+		fhdr_v2->csf = 0;
+
+		next_hdr_v2 = (imx_header_v2_t *)((char *)hdr_v2 +
+			       imximage_plugin_size);
+
+		next_fhdr_v2 = &next_hdr_v2->fhdr;
+
+		next_fhdr_v2->header.tag = IVT_HEADER_TAG; /* 0xD1 */
+		next_fhdr_v2->header.length =
+			cpu_to_be16(sizeof(flash_header_v2_t));
+		next_fhdr_v2->header.version = IVT_VERSION; /* 0x40 */
+
+		next_fhdr_v2->entry = entry_point;
+		hdr_base = entry_point - sizeof(struct imx_header);
+		next_fhdr_v2->reserved1 = 0;
+		next_fhdr_v2->reserved2 = 0;
+		next_fhdr_v2->self = hdr_base + imximage_plugin_size;
+
+		next_fhdr_v2->dcd_ptr = 0;
+		next_fhdr_v2->boot_data_ptr = next_fhdr_v2->self +
+				offsetof(imx_header_v2_t, boot_data);
+
+		next_hdr_v2->boot_data.start = hdr_base - flash_offset;
+
+		header_size_ptr = &next_hdr_v2->boot_data.size;
 
-	header_size_ptr = &hdr_v2->boot_data.size;
-	csf_ptr = &fhdr_v2->csf;
+		next_hdr_v2->boot_data.plugin = 0;
+
+		next_fhdr_v2->csf = 0;
+	}
 }
 
 static void set_hdr_func(void)
@@ -393,16 +473,19 @@ static void print_hdr_v2(struct imx_header *imx_hdr)
 {
 	imx_header_v2_t *hdr_v2 = &imx_hdr->header.hdr_v2;
 	flash_header_v2_t *fhdr_v2 = &hdr_v2->fhdr;
-	dcd_v2_t *dcd_v2 = &hdr_v2->dcd_table;
-	uint32_t size, version;
+	dcd_v2_t *dcd_v2 = &hdr_v2->data.dcd_table;
+	uint32_t size, version, plugin;
 
-	size = be16_to_cpu(dcd_v2->header.length);
-	if (size > (MAX_HW_CFG_SIZE_V2 * sizeof(dcd_addr_data_t)) + 8) {
-		fprintf(stderr,
-			"Error: Image corrupt DCD size %d exceed maximum %d\n",
-			(uint32_t)(size / sizeof(dcd_addr_data_t)),
-			MAX_HW_CFG_SIZE_V2);
-		exit(EXIT_FAILURE);
+	plugin = hdr_v2->boot_data.plugin;
+	if (!plugin) {
+		size = be16_to_cpu(dcd_v2->header.length);
+		if (size > (MAX_HW_CFG_SIZE_V2 * sizeof(dcd_addr_data_t))) {
+			fprintf(stderr,
+				"Error: Image corrupt DCD size %d exceed maximum %d\n",
+				(uint32_t)(size / sizeof(dcd_addr_data_t)),
+				MAX_HW_CFG_SIZE_V2);
+			exit(EXIT_FAILURE);
+		}
 	}
 
 	version = detect_imximage_version(imx_hdr);
@@ -410,19 +493,81 @@ static void print_hdr_v2(struct imx_header *imx_hdr)
 	printf("Image Type:   Freescale IMX Boot Image\n");
 	printf("Image Ver:    %x", version);
 	printf("%s\n", get_table_entry_name(imximage_versions, NULL, version));
-	printf("Data Size:    ");
-	genimg_print_size(hdr_v2->boot_data.size);
-	printf("Load Address: %08x\n", (uint32_t)fhdr_v2->boot_data_ptr);
-	printf("Entry Point:  %08x\n", (uint32_t)fhdr_v2->entry);
-	if (fhdr_v2->csf && (imximage_ivt_offset != UNDEFINED) &&
-	    (imximage_csf_size != UNDEFINED)) {
-		printf("HAB Blocks:   %08x %08x %08x\n",
-		       (uint32_t)fhdr_v2->self, 0,
-		       hdr_v2->boot_data.size - imximage_ivt_offset -
-		       imximage_csf_size);
+	printf("Mode:         %s\n", plugin ? "PLUGIN" : "DCD");
+	if (!plugin) {
+		printf("Data Size:    ");
+		genimg_print_size(hdr_v2->boot_data.size);
+		printf("Load Address: %08x\n", (uint32_t)fhdr_v2->boot_data_ptr);
+		printf("Entry Point:  %08x\n", (uint32_t)fhdr_v2->entry);
+		if (fhdr_v2->csf && (imximage_ivt_offset != UNDEFINED) &&
+		    (imximage_csf_size != UNDEFINED)) {
+			printf("HAB Blocks:   %08x %08x %08x\n",
+			       (uint32_t)fhdr_v2->self, 0,
+			       hdr_v2->boot_data.size - imximage_ivt_offset -
+			       imximage_csf_size);
+		}
+	} else {
+		imx_header_v2_t *next_hdr_v2;
+		flash_header_v2_t *next_fhdr_v2;
+
+		/*First Header*/
+		printf("Plugin Data Size:     ");
+		genimg_print_size(hdr_v2->boot_data.size);
+		printf("Plugin Code Size:     ");
+		genimg_print_size(imximage_plugin_size);
+		printf("Plugin Load Address:  %08x\n", hdr_v2->boot_data.start);
+		printf("Plugin Entry Point:   %08x\n", (uint32_t)fhdr_v2->entry);
+
+		/*Second Header*/
+		next_hdr_v2 = (imx_header_v2_t *)((char *)hdr_v2 +
+				imximage_plugin_size);
+		next_fhdr_v2 = &next_hdr_v2->fhdr;
+		printf("U-Boot Data Size:     ");
+		genimg_print_size(next_hdr_v2->boot_data.size);
+		printf("U-Boot Load Address:  %08x\n",
+		       next_hdr_v2->boot_data.start);
+		printf("U-Boot Entry Point:   %08x\n",
+		       (uint32_t)next_fhdr_v2->entry);
 	}
 }
 
+static void copy_plugin_code(struct imx_header *imxhdr, char *plugin_file)
+{
+	int ifd = -1;
+	struct stat sbuf;
+	char *plugin_buf = imxhdr->header.hdr_v2.data.plugin_code;
+	char *ptr;
+
+	ifd = open(plugin_file, O_RDONLY|O_BINARY);
+	if (fstat(ifd, &sbuf) < 0) {
+		fprintf(stderr, "Can't stat %s: %s\n",
+			plugin_file,
+			strerror(errno));
+		exit(EXIT_FAILURE);
+	}
+
+	ptr = mmap(0, sbuf.st_size, PROT_READ, MAP_SHARED, ifd, 0);
+	if (ptr == MAP_FAILED) {
+		fprintf(stderr, "Can't read %s: %s\n",
+			plugin_file,
+			strerror(errno));
+		exit(EXIT_FAILURE);
+	}
+
+	if (sbuf.st_size > MAX_PLUGIN_CODE_SIZE) {
+		printf("plugin binary size too large\n");
+		exit(EXIT_FAILURE);
+	}
+
+	memcpy(plugin_buf, ptr, sbuf.st_size);
+	imximage_plugin_size = sbuf.st_size;
+
+	(void) munmap((void *)ptr, sbuf.st_size);
+	(void) close(ifd);
+
+	imxhdr->header.hdr_v2.boot_data.plugin = 1;
+}
+
 static void parse_cfg_cmd(struct imx_header *imxhdr, int32_t cmd, char *token,
 				char *name, int lineno, int fld, int dcd_len)
 {
@@ -497,6 +642,10 @@ static void parse_cfg_cmd(struct imx_header *imxhdr, int32_t cmd, char *token,
 		if (unlikely(cmd_ver_first != 1))
 			cmd_ver_first = 0;
 		break;
+	case CMD_PLUGIN:
+		plugin_image = 1;
+		copy_plugin_code(imxhdr, token);
+		break;
 	}
 }
 
@@ -542,6 +691,10 @@ static void parse_cfg_fld(struct imx_header *imxhdr, int32_t *cmd,
 				}
 			}
 			break;
+		case CMD_PLUGIN:
+			value = get_cfg_value(token, name, lineno);
+			imximage_iram_free_start = value;
+			break;
 		default:
 			break;
 		}
@@ -649,6 +802,7 @@ static void imximage_set_header(void *ptr, struct stat *sbuf, int ifd,
 {
 	struct imx_header *imxhdr = (struct imx_header *)ptr;
 	uint32_t dcd_len;
+	uint32_t header_size;
 
 	/*
 	 * In order to not change the old imx cfg file
@@ -665,10 +819,15 @@ static void imximage_set_header(void *ptr, struct stat *sbuf, int ifd,
 	dcd_len = parse_cfg_file(imxhdr, params->imagename);
 
 	if (imximage_version == IMXIMAGE_V2) {
-		if (imximage_init_loadsize < imximage_ivt_offset +
-			sizeof(imx_header_v2_t))
+		header_size = sizeof(flash_header_v2_t) + sizeof(boot_data_t);
+		if (!plugin_image)
+			header_size += sizeof(dcd_v2_t);
+		else
+			header_size += MAX_PLUGIN_CODE_SIZE;
+
+		if (imximage_init_loadsize < imximage_ivt_offset + header_size)
 				imximage_init_loadsize = imximage_ivt_offset +
-					sizeof(imx_header_v2_t);
+					header_size;
 	}
 
 	/* Set the imx header */
@@ -721,7 +880,7 @@ static int imximage_generate(struct image_tool_params *params,
 	size_t alloc_len;
 	struct stat sbuf;
 	char *datafile = params->datafile;
-	uint32_t pad_len;
+	uint32_t pad_len, header_size;
 
 	memset(&imximage_header, 0, sizeof(imximage_header));
 
@@ -742,15 +901,21 @@ static int imximage_generate(struct image_tool_params *params,
 	/* TODO: check i.MX image V1 handling, for now use 'old' style */
 	if (imximage_version == IMXIMAGE_V1) {
 		alloc_len = 4096;
+		header_size = 4096;
 	} else {
-		if (imximage_init_loadsize < imximage_ivt_offset +
-			sizeof(imx_header_v2_t))
+		header_size = sizeof(flash_header_v2_t) + sizeof(boot_data_t);
+		if (!plugin_image)
+			header_size += sizeof(dcd_v2_t);
+		else
+			header_size += MAX_PLUGIN_CODE_SIZE;
+
+		if (imximage_init_loadsize < imximage_ivt_offset + header_size)
 				imximage_init_loadsize = imximage_ivt_offset +
-					sizeof(imx_header_v2_t);
+					header_size;
 		alloc_len = imximage_init_loadsize - imximage_ivt_offset;
 	}
 
-	if (alloc_len < sizeof(struct imx_header)) {
+	if (alloc_len < header_size) {
 		fprintf(stderr, "%s: header error\n",
 			params->cmdname);
 		exit(EXIT_FAILURE);
diff --git a/tools/imximage.h b/tools/imximage.h
index c7b9b5c..db8b9a3 100644
--- a/tools/imximage.h
+++ b/tools/imximage.h
@@ -9,6 +9,7 @@
 #define _IMXIMAGE_H_
 
 #define MAX_HW_CFG_SIZE_V2 220 /* Max number of registers imx can set for v2 */
+#define MAX_PLUGIN_CODE_SIZE (64 * 1024)
 #define MAX_HW_CFG_SIZE_V1 60  /* Max number of registers imx can set for v1 */
 #define APP_CODE_BARKER	0xB1
 #define DCD_BARKER	0xB17219E9
@@ -64,6 +65,7 @@ enum imximage_cmd {
 	CMD_CHECK_BITS_SET,
 	CMD_CHECK_BITS_CLR,
 	CMD_CSF,
+	CMD_PLUGIN,
 };
 
 enum imximage_fld_types {
@@ -164,7 +166,10 @@ typedef struct {
 typedef struct {
 	flash_header_v2_t fhdr;
 	boot_data_t boot_data;
-	dcd_v2_t dcd_table;
+	union {
+		dcd_v2_t dcd_table;
+		char plugin_code[MAX_PLUGIN_CODE_SIZE];
+	} data;
 } imx_header_v2_t;
 
 /* The header must be aligned to 4k on MX53 for NAND boot */
-- 
2.6.2

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH V4 2/8] imx: mx6: Add plugin support
  2016-10-11  6:29 [U-Boot] [PATCH V4 1/8] tools: imximage: add plugin support Peng Fan
@ 2016-10-11  6:29 ` Peng Fan
  2016-10-11  6:29 ` [U-Boot] [PATCH V4 3/8] imx: mx7: " Peng Fan
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Peng Fan @ 2016-10-11  6:29 UTC (permalink / raw)
  To: u-boot

Add mx6_plugin.S which calls boot rom setup function, generate the second ivt,
and jump back to boot rom.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
Signed-off-by: Ye Li <ye.li@nxp.com>
Signed-off-by: Utkarsh Gupta <utkarsh.gupta@nxp.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
Acked-by: Utkarsh Gupta <utkarsh.gupta@nxp.com>
---

V3:
 None

V2:
 None

 arch/arm/include/asm/arch-mx6/mx6_plugin.S | 159 +++++++++++++++++++++++++++++
 1 file changed, 159 insertions(+)
 create mode 100644 arch/arm/include/asm/arch-mx6/mx6_plugin.S

diff --git a/arch/arm/include/asm/arch-mx6/mx6_plugin.S b/arch/arm/include/asm/arch-mx6/mx6_plugin.S
new file mode 100644
index 0000000..b7d1b20
--- /dev/null
+++ b/arch/arm/include/asm/arch-mx6/mx6_plugin.S
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2016 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <config.h>
+
+#ifdef CONFIG_ROM_UNIFIED_SECTIONS
+#define ROM_API_TABLE_BASE_ADDR_LEGACY		0x180
+#define ROM_VERSION_OFFSET               	0x80
+#else
+#define ROM_API_TABLE_BASE_ADDR_LEGACY		0xC0
+#define ROM_VERSION_OFFSET               	0x48
+#endif
+#define ROM_API_TABLE_BASE_ADDR_MX6DQ_TO15	0xC4
+#define ROM_API_TABLE_BASE_ADDR_MX6DL_TO12	0xC4
+#define ROM_API_HWCNFG_SETUP_OFFSET		0x08
+#define ROM_VERSION_TO10			0x10
+#define ROM_VERSION_TO12			0x12
+#define ROM_VERSION_TO15			0x15
+
+plugin_start:
+
+	push    {r0-r4, lr}
+
+	imx6_ddr_setting
+	imx6_clock_gating
+	imx6_qos_setting
+
+/*
+ * The following is to fill in those arguments for this ROM function
+ * pu_irom_hwcnfg_setup(void **start, size_t *bytes, const void *boot_data)
+ * This function is used to copy data from the storage media into DDR.
+ * start - Initial (possibly partial) image load address on entry.
+ *         Final image load address on exit.
+ * bytes - Initial (possibly partial) image size on entry.
+ *         Final image size on exit.
+ * boot_data - Initial @ref ivt Boot Data load address.
+ */
+	adr r0, boot_data2
+	adr r1, image_len2
+	adr r2, boot_data2
+
+#ifdef CONFIG_NOR_BOOT
+#ifdef CONFIG_MX6SX
+	ldr r3, =ROM_VERSION_OFFSET
+	ldr r4, [r3]
+	cmp r4, #ROM_VERSION_TO10
+	bgt before_calling_rom___pu_irom_hwcnfg_setup
+	ldr r3, =0x00900b00
+	ldr r4, =0x50000000
+	str r4, [r3, #0x5c]
+#else
+	ldr r3, =0x00900800
+	ldr r4, =0x08000000
+	str r4, [r3, #0xc0]
+#endif
+#endif
+
+/*
+ * check the _pu_irom_api_table for the address
+ */
+before_calling_rom___pu_irom_hwcnfg_setup:
+	ldr r3, =ROM_VERSION_OFFSET
+	ldr r4, [r3]
+#if defined(CONFIG_MX6SOLO) || defined(CONFIG_MX6DL)
+	ldr r3, =ROM_VERSION_TO12
+	cmp r4, r3
+	ldrge r3, =ROM_API_TABLE_BASE_ADDR_MX6DL_TO12
+	ldrlt r3, =ROM_API_TABLE_BASE_ADDR_LEGACY
+#elif defined(CONFIG_MX6Q)
+	ldr r3, =ROM_VERSION_TO15
+	cmp r4, r3
+	ldrge r3, =ROM_API_TABLE_BASE_ADDR_MX6DQ_TO15
+	ldrlt r3, =ROM_API_TABLE_BASE_ADDR_LEGACY
+#else
+	ldr r3, =ROM_API_TABLE_BASE_ADDR_LEGACY
+#endif
+	ldr r4, [r3, #ROM_API_HWCNFG_SETUP_OFFSET]
+	blx r4
+after_calling_rom___pu_irom_hwcnfg_setup:
+
+/*
+ * ROM_API_HWCNFG_SETUP function enables MMU & Caches.
+ * Thus disable MMU & Caches.
+ */
+
+	mrc     p15, 0, r0, c1, c0, 0   /* read CP15 register 1 into r0*/
+	ands    r0, r0, #0x1            /* check if MMU is enabled */
+	beq     mmu_disable_notreq      /* exit if MMU is already disabled */
+
+	/* Disable caches, MMU */
+	mrc     p15, 0, r0, c1, c0, 0	/* read CP15 register 1 into r0 */
+	bic     r0, r0, #(1 << 2)	/* disable D Cache */
+	bic     r0, r0, #0x1		/* clear bit 0 ; MMU off */
+
+	bic     r0, r0, #(0x1 << 11)	/* disable Z, branch prediction */
+	bic     r0, r0, #(0x1 << 1)	/* disable A, Strict alignment */
+					/* check enabled. */
+	mcr     p15, 0, r0, c1, c0, 0	/* write CP15 register 1 */
+	mov     r0, r0
+	mov     r0, r0
+	mov     r0, r0
+	mov     r0, r0
+
+mmu_disable_notreq:
+    NOP
+
+/* To return to ROM from plugin, we need to fill in these argument.
+ * Here is what need to do:
+ * Need to construct the paramters for this function before return to ROM:
+ * plugin_download(void **start, size_t *bytes, UINT32 *ivt_offset)
+ */
+	pop {r0-r4, lr}
+	push {r5}
+	ldr r5, boot_data2
+	str r5, [r0]
+	ldr r5, image_len2
+	str r5, [r1]
+	ldr r5, second_ivt_offset
+	str r5, [r2]
+	mov r0, #1
+	pop {r5}
+
+	/* return back to ROM code */
+	bx lr
+
+/* make the following data right in the end of the output*/
+.ltorg
+
+#if (defined(CONFIG_NOR_BOOT) || defined(CONFIG_QSPI_BOOT))
+#define FLASH_OFFSET 0x1000
+#else
+#define FLASH_OFFSET 0x400
+#endif
+
+/*
+ * second_ivt_offset is the offset from the "second_ivt_header" to
+ * "image_copy_start", which involves FLASH_OFFSET, plus the first
+ * ivt_header, the plugin code size itself recorded by "ivt2_header"
+ */
+
+second_ivt_offset:      .long (ivt2_header + 0x2C + FLASH_OFFSET)
+
+/*
+ * The following is the second IVT header plus the second boot data
+ */
+ivt2_header:            .long 0x0
+app2_code_jump_v:       .long 0x0
+reserv3:                .long 0x0
+dcd2_ptr:               .long 0x0
+boot_data2_ptr:         .long 0x0
+self_ptr2:              .long 0x0
+app_code_csf2:          .long 0x0
+reserv4:                .long 0x0
+boot_data2:             .long 0x0
+image_len2:             .long 0x0
+plugin2:                .long 0x0
-- 
2.6.2

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH V4 3/8] imx: mx7: Add plugin support
  2016-10-11  6:29 [U-Boot] [PATCH V4 1/8] tools: imximage: add plugin support Peng Fan
  2016-10-11  6:29 ` [U-Boot] [PATCH V4 2/8] imx: mx6: Add " Peng Fan
@ 2016-10-11  6:29 ` Peng Fan
  2016-10-11  6:29 ` [U-Boot] [PATCH V4 4/8] imx-common: introduce USE_IMXIMG_PLUGIN Kconfig Peng Fan
                   ` (6 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Peng Fan @ 2016-10-11  6:29 UTC (permalink / raw)
  To: u-boot

Add mx7_plugin.S which calls boot rom setup function, generate the second ivt,
and jump back to boot rom.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
Signed-off-by: Ye Li <ye.li@nxp.com>
Cc: Stefano Babic <sbabic@denx.de>
Reviewed-by: Tom Rini <trini@konsulko.com>
---

V3:
 None

V2:
 None

 arch/arm/include/asm/arch-mx7/mx7_plugin.S | 111 +++++++++++++++++++++++++++++
 1 file changed, 111 insertions(+)
 create mode 100644 arch/arm/include/asm/arch-mx7/mx7_plugin.S

diff --git a/arch/arm/include/asm/arch-mx7/mx7_plugin.S b/arch/arm/include/asm/arch-mx7/mx7_plugin.S
new file mode 100644
index 0000000..41336b4
--- /dev/null
+++ b/arch/arm/include/asm/arch-mx7/mx7_plugin.S
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2016 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <config.h>
+
+#define ROM_API_TABLE_BASE_ADDR_LEGACY		0x180
+#define ROM_VERSION_OFFSET               	0x80
+#define ROM_API_HWCNFG_SETUP_OFFSET		0x08
+
+plugin_start:
+
+	push    {r0-r4, lr}
+
+	imx7_ddr_setting
+	imx7_clock_gating
+	imx7_qos_setting
+
+/*
+ * Check if we are in USB serial download mode and immediately return to ROM
+ * Need to check USB CTRL clock firstly, then check the USBx_nASYNCLISTADDR
+ */
+	ldr r0, =0x30384680
+	ldr r1, [r0]
+	cmp r1, #0
+	beq normal_boot
+
+	ldr r0, =0x30B10158
+	ldr r1, [r0]
+	cmp r1, #0
+	beq normal_boot
+
+	pop {r0-r4, lr}
+	bx lr
+
+normal_boot:
+
+/*
+ * The following is to fill in those arguments for this ROM function
+ * pu_irom_hwcnfg_setup(void **start, size_t *bytes, const void *boot_data)
+ * This function is used to copy data from the storage media into DDR.
+ * start - Initial (possibly partial) image load address on entry.
+ *         Final image load address on exit.
+ * bytes - Initial (possibly partial) image size on entry.
+ *         Final image size on exit.
+ * boot_data - Initial @ref ivt Boot Data load address.
+ */
+	adr r0, boot_data2
+	adr r1, image_len2
+	adr r2, boot_data2
+
+/*
+ * check the _pu_irom_api_table for the address
+ */
+before_calling_rom___pu_irom_hwcnfg_setup:
+	ldr r3, =ROM_VERSION_OFFSET
+	ldr r4, [r3]
+	ldr r3, =ROM_API_TABLE_BASE_ADDR_LEGACY
+	ldr r4, [r3, #ROM_API_HWCNFG_SETUP_OFFSET]
+	blx r4
+after_calling_rom___pu_irom_hwcnfg_setup:
+
+
+/* To return to ROM from plugin, we need to fill in these argument.
+ * Here is what need to do:
+ * Need to construct the paramters for this function before return to ROM:
+ * plugin_download(void **start, size_t *bytes, UINT32 *ivt_offset)
+ */
+	pop {r0-r4, lr}
+	push {r5}
+	ldr r5, boot_data2
+	str r5, [r0]
+	ldr r5, image_len2
+	str r5, [r1]
+	ldr r5, second_ivt_offset
+	str r5, [r2]
+	mov r0, #1
+	pop {r5}
+
+	/* return back to ROM code */
+	bx lr
+
+/* make the following data right in the end of the output*/
+.ltorg
+
+#define FLASH_OFFSET 0x400
+
+/*
+ * second_ivt_offset is the offset from the "second_ivt_header" to
+ * "image_copy_start", which involves FLASH_OFFSET, plus the first
+ * ivt_header, the plugin code size itself recorded by "ivt2_header"
+ */
+
+second_ivt_offset:      .long (ivt2_header + 0x2C + FLASH_OFFSET)
+
+/*
+ * The following is the second IVT header plus the second boot data
+ */
+ivt2_header:            .long 0x0
+app2_code_jump_v:       .long 0x0
+reserv3:                .long 0x0
+dcd2_ptr:               .long 0x0
+boot_data2_ptr:         .long 0x0
+self_ptr2:              .long 0x0
+app_code_csf2:          .long 0x0
+reserv4:                .long 0x0
+boot_data2:             .long 0x0
+image_len2:             .long 0x0
+plugin2:                .long 0x0
-- 
2.6.2

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH V4 4/8] imx-common: introduce USE_IMXIMG_PLUGIN Kconfig
  2016-10-11  6:29 [U-Boot] [PATCH V4 1/8] tools: imximage: add plugin support Peng Fan
  2016-10-11  6:29 ` [U-Boot] [PATCH V4 2/8] imx: mx6: Add " Peng Fan
  2016-10-11  6:29 ` [U-Boot] [PATCH V4 3/8] imx: mx7: " Peng Fan
@ 2016-10-11  6:29 ` Peng Fan
  2016-10-11  6:29 ` Peng Fan
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Peng Fan @ 2016-10-11  6:29 UTC (permalink / raw)
  To: u-boot

Introduce USE_IMXIMG_PLUGIN Kconfig

Signed-off-by: Peng Fan <peng.fan@nxp.com>
Cc: Stefano Babic <sbabic@denx.de>
Reviewed-by: Tom Rini <trini@konsulko.com>
---

V4:
 Typo fix.

V3:
 None

V2:
 New

 arch/arm/imx-common/Kconfig | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/arch/arm/imx-common/Kconfig b/arch/arm/imx-common/Kconfig
index 1b7da5a..85eac57 100644
--- a/arch/arm/imx-common/Kconfig
+++ b/arch/arm/imx-common/Kconfig
@@ -17,3 +17,10 @@ config IMX_BOOTAUX
 	depends on ARCH_MX7 || ARCH_MX6
 	help
 	  bootaux [addr] to boot auxiliary core.
+
+config USE_IMXIMG_PLUGIN
+	bool "Use imximage plugin code"
+	depends on ARCH_MX7 || ARCH_MX6
+	help
+	  i.MX6/7 supports DCD and Plugin. Enable this configuration
+	  to use Plugin, otherwise DCD will be used.
-- 
2.6.2

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH V4 4/8] imx-common: introduce USE_IMXIMG_PLUGIN Kconfig
  2016-10-11  6:29 [U-Boot] [PATCH V4 1/8] tools: imximage: add plugin support Peng Fan
                   ` (2 preceding siblings ...)
  2016-10-11  6:29 ` [U-Boot] [PATCH V4 4/8] imx-common: introduce USE_IMXIMG_PLUGIN Kconfig Peng Fan
@ 2016-10-11  6:29 ` Peng Fan
  2016-10-11  6:29 ` [U-Boot] [PATCH V4 5/8] imx-common: compile plugin code Peng Fan
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Peng Fan @ 2016-10-11  6:29 UTC (permalink / raw)
  To: u-boot

Introduce USE_IMXIMG_PLUGIN Kconfig

Signed-off-by: Peng Fan <peng.fan@nxp.com>
Cc: Stefano Babic <sbabic@denx.de>
Reviewed-by: Tom Rini <trini@konsulko.com>
---
 arch/arm/imx-common/Kconfig | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/arch/arm/imx-common/Kconfig b/arch/arm/imx-common/Kconfig
index 1b7da5a..fb93981 100644
--- a/arch/arm/imx-common/Kconfig
+++ b/arch/arm/imx-common/Kconfig
@@ -17,3 +17,10 @@ config IMX_BOOTAUX
 	depends on ARCH_MX7 || ARCH_MX6
 	help
 	  bootaux [addr] to boot auxiliary core.
+
+config USE_IMXIMG_PLUGIN
+	bool "Use imximage plugin code"
+	depends on ARCH_MX7 || ARCH_MX6
+	help
+	  i.MX6/7 supports DCD and Plugin. Enable this configuration
+	  to use Plugin, otherwise DCD will be used.
-- 
2.6.2

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH V4 5/8] imx-common: compile plugin code
  2016-10-11  6:29 [U-Boot] [PATCH V4 1/8] tools: imximage: add plugin support Peng Fan
                   ` (3 preceding siblings ...)
  2016-10-11  6:29 ` Peng Fan
@ 2016-10-11  6:29 ` Peng Fan
  2016-10-11  6:29 ` [U-Boot] [PATCH V4 6/8] imx: mx6ullevk: support plugin Peng Fan
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Peng Fan @ 2016-10-11  6:29 UTC (permalink / raw)
  To: u-boot

If CONFIG_USE_IMXIMG_PLUGIN is selected, plugin.bin will be
generated under board/$(BOARDDIR)/.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
Cc: Stefano Babic <sbabic@denx.de>
Reviewed-by: Tom Rini <trini@konsulko.com>
---

V4:
 None

V3:
 None

V2:
  New. Make this common to all i.MX6/7, but not duplicated in board makefile.

 arch/arm/imx-common/Makefile | 29 +++++++++++++++++++++++------
 1 file changed, 23 insertions(+), 6 deletions(-)

diff --git a/arch/arm/imx-common/Makefile b/arch/arm/imx-common/Makefile
index d34a784..1873185 100644
--- a/arch/arm/imx-common/Makefile
+++ b/arch/arm/imx-common/Makefile
@@ -38,6 +38,23 @@ obj-$(CONFIG_CMD_BMODE) += cmd_bmode.o
 obj-$(CONFIG_CMD_HDMIDETECT) += cmd_hdmidet.o
 obj-$(CONFIG_CMD_DEKBLOB) += cmd_dek.o
 
+PLUGIN = board/$(BOARDDIR)/plugin
+
+ifeq ($(CONFIG_USE_IMXIMG_PLUGIN),y)
+
+$(PLUGIN).o: $(PLUGIN).S FORCE
+	$(Q)mkdir -p $(dir $@)
+	$(call if_changed_dep,as_o_S)
+
+$(PLUGIN).bin: $(PLUGIN).o FORCE
+	$(Q)mkdir -p $(dir $@)
+	$(OBJCOPY) -O binary --gap-fill 0xff $< $@
+else
+
+$(PLUGIN).bin:
+
+endif
+
 quiet_cmd_cpp_cfg = CFGS    $@
       cmd_cpp_cfg = $(CPP) $(cpp_flags) -x c -o $@ $<
 
@@ -47,24 +64,24 @@ $(IMX_CONFIG): %.cfgtmp: % FORCE
 	$(Q)mkdir -p $(dir $@)
 	$(call if_changed_dep,cpp_cfg)
 
-MKIMAGEFLAGS_u-boot.imx = -n $(filter-out $< $(PHONY),$^) -T imximage \
+MKIMAGEFLAGS_u-boot.imx = -n $(filter-out $(PLUGIN).bin $< $(PHONY),$^) -T imximage \
 	-e $(CONFIG_SYS_TEXT_BASE)
 
-u-boot.imx: u-boot.bin $(IMX_CONFIG) FORCE
+u-boot.imx: u-boot.bin $(IMX_CONFIG) $(PLUGIN).bin FORCE
 	$(call if_changed,mkimage)
 
 ifeq ($(CONFIG_OF_SEPARATE),y)
-MKIMAGEFLAGS_u-boot-dtb.imx = -n $(filter-out $< $(PHONY),$^) -T imximage \
+MKIMAGEFLAGS_u-boot-dtb.imx = -n $(filter-out $(PLUGIN).bin $< $(PHONY),$^) -T imximage \
 	-e $(CONFIG_SYS_TEXT_BASE)
 
-u-boot-dtb.imx: u-boot-dtb.bin $(IMX_CONFIG) FORCE
+u-boot-dtb.imx: u-boot-dtb.bin $(IMX_CONFIG) $(PLUGIN).bin FORCE
 	$(call if_changed,mkimage)
 endif
 
-MKIMAGEFLAGS_SPL = -n $(filter-out $< $(PHONY),$^) -T imximage \
+MKIMAGEFLAGS_SPL = -n $(filter-out $(PLUGIN).bin $< $(PHONY),$^) -T imximage \
 	-e $(CONFIG_SPL_TEXT_BASE)
 
-SPL: spl/u-boot-spl.bin $(IMX_CONFIG) FORCE
+SPL: spl/u-boot-spl.bin $(IMX_CONFIG) $(PLUGIN).bin FORCE
 	$(call if_changed,mkimage)
 
 MKIMAGEFLAGS_u-boot.uim = -A arm -O U-Boot -a $(CONFIG_SYS_TEXT_BASE) \
-- 
2.6.2

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH V4 6/8] imx: mx6ullevk: support plugin
  2016-10-11  6:29 [U-Boot] [PATCH V4 1/8] tools: imximage: add plugin support Peng Fan
                   ` (4 preceding siblings ...)
  2016-10-11  6:29 ` [U-Boot] [PATCH V4 5/8] imx-common: compile plugin code Peng Fan
@ 2016-10-11  6:29 ` Peng Fan
  2016-10-11  6:29 ` [U-Boot] [PATCH V4 7/8] imx: mx6ullevk: correct boot device macro Peng Fan
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Peng Fan @ 2016-10-11  6:29 UTC (permalink / raw)
  To: u-boot

Add plugin code for mx6ullevk.
Define CONFIG_USE_IMXIMG_PLUGIN in defconfig file to use plugin code.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
Cc: Stefano Babic <sbabic@denx.de>
---

V3:
 Update commit log

V2:
 None

 board/freescale/mx6ullevk/imximage.cfg |   2 +-
 board/freescale/mx6ullevk/plugin.S     | 139 +++++++++++++++++++++++++++++++++
 2 files changed, 140 insertions(+), 1 deletion(-)
 create mode 100644 board/freescale/mx6ullevk/plugin.S

diff --git a/board/freescale/mx6ullevk/imximage.cfg b/board/freescale/mx6ullevk/imximage.cfg
index 4604b62..1a21b49 100644
--- a/board/freescale/mx6ullevk/imximage.cfg
+++ b/board/freescale/mx6ullevk/imximage.cfg
@@ -29,7 +29,7 @@ BOOT_FROM	nor
 BOOT_FROM	sd
 #endif
 
-#ifdef CONFIG_USE_PLUGIN
+#ifdef CONFIG_USE_IMXIMG_PLUGIN
 /*PLUGIN    plugin-binary-file    IRAM_FREE_START_ADDR*/
 PLUGIN	board/freescale/mx6ullevk/plugin.bin 0x00907000
 #else
diff --git a/board/freescale/mx6ullevk/plugin.S b/board/freescale/mx6ullevk/plugin.S
new file mode 100644
index 0000000..65a3c45
--- /dev/null
+++ b/board/freescale/mx6ullevk/plugin.S
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2016 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <config.h>
+
+/* DDR script */
+.macro imx6ull_ddr3_evk_setting
+	ldr r0, =IOMUXC_BASE_ADDR
+	ldr r1, =0x000C0000
+	str r1, [r0, #0x4B4]
+	ldr r1, =0x00000000
+	str r1, [r0, #0x4AC]
+	ldr r1, =0x00000030
+	str r1, [r0, #0x27C]
+	ldr r1, =0x00000030
+	str r1, [r0, #0x250]
+	str r1, [r0, #0x24C]
+	str r1, [r0, #0x490]
+	ldr r1, =0x000C0030
+	str r1, [r0, #0x288]
+
+	ldr r1, =0x00000000
+	str r1, [r0, #0x270]
+
+	ldr r1, =0x00000030
+	str r1, [r0, #0x260]
+	str r1, [r0, #0x264]
+	str r1, [r0, #0x4A0]
+
+	ldr r1, =0x00020000
+	str r1, [r0, #0x494]
+
+	ldr r1, =0x00000030
+	str r1, [r0, #0x280]
+	ldr r1, =0x00000030
+	str r1, [r0, #0x284]
+
+	ldr r1, =0x00020000
+	str r1, [r0, #0x4B0]
+
+	ldr r1, =0x00000030
+	str r1, [r0, #0x498]
+	str r1, [r0, #0x4A4]
+	str r1, [r0, #0x244]
+	str r1, [r0, #0x248]
+
+	ldr r0, =MMDC_P0_BASE_ADDR
+	ldr r1, =0x00008000
+	str r1, [r0, #0x1C]
+	ldr r1, =0xA1390003
+	str r1, [r0, #0x800]
+	ldr r1, =0x00000004
+	str r1, [r0, #0x80C]
+	ldr r1, =0x41640158
+	str r1, [r0, #0x83C]
+	ldr r1, =0x40403237
+	str r1, [r0, #0x848]
+	ldr r1, =0x40403C33
+	str r1, [r0, #0x850]
+	ldr r1, =0x33333333
+	str r1, [r0, #0x81C]
+	str r1, [r0, #0x820]
+	ldr r1, =0xF3333333
+	str r1, [r0, #0x82C]
+	str r1, [r0, #0x830]
+	ldr r1, =0x00944009
+	str r1, [r0, #0x8C0]
+	ldr r1, =0x00000800
+	str r1, [r0, #0x8B8]
+	ldr r1, =0x0002002D
+	str r1, [r0, #0x004]
+	ldr r1, =0x1B333030
+	str r1, [r0, #0x008]
+	ldr r1, =0x676B52F3
+	str r1, [r0, #0x00C]
+	ldr r1, =0xB66D0B63
+	str r1, [r0, #0x010]
+	ldr r1, =0x01FF00DB
+	str r1, [r0, #0x014]
+	ldr r1, =0x00201740
+	str r1, [r0, #0x018]
+	ldr r1, =0x00008000
+	str r1, [r0, #0x01C]
+	ldr r1, =0x000026D2
+	str r1, [r0, #0x02C]
+	ldr r1, =0x006B1023
+	str r1, [r0, #0x030]
+	ldr r1, =0x0000004F
+	str r1, [r0, #0x040]
+	ldr r1, =0x84180000
+	str r1, [r0, #0x000]
+	ldr r1, =0x00400000
+	str r1, [r0, #0x890]
+	ldr r1, =0x02008032
+	str r1, [r0, #0x01C]
+	ldr r1, =0x00008033
+	str r1, [r0, #0x01C]
+	ldr r1, =0x00048031
+	str r1, [r0, #0x01C]
+	ldr r1, =0x15208030
+	str r1, [r0, #0x01C]
+	ldr r1, =0x04008040
+	str r1, [r0, #0x01C]
+	ldr r1, =0x00000800
+	str r1, [r0, #0x020]
+	ldr r1, =0x00000227
+	str r1, [r0, #0x818]
+	ldr r1, =0x0002552D
+	str r1, [r0, #0x004]
+	ldr r1, =0x00011006
+	str r1, [r0, #0x404]
+	ldr r1, =0x00000000
+	str r1, [r0, #0x01C]
+.endm
+
+.macro imx6_clock_gating
+	ldr r0, =CCM_BASE_ADDR
+	ldr r1, =0xFFFFFFFF
+	str r1, [r0, #0x68]
+	str r1, [r0, #0x6C]
+	str r1, [r0, #0x70]
+	str r1, [r0, #0x74]
+	str r1, [r0, #0x78]
+	str r1, [r0, #0x7C]
+	str r1, [r0, #0x80]
+.endm
+
+.macro imx6_qos_setting
+.endm
+
+.macro imx6_ddr_setting
+	imx6ull_ddr3_evk_setting
+.endm
+
+/* include the common plugin code here */
+#include <asm/arch/mx6_plugin.S>
-- 
2.6.2

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH V4 7/8] imx: mx6ullevk: correct boot device macro
  2016-10-11  6:29 [U-Boot] [PATCH V4 1/8] tools: imximage: add plugin support Peng Fan
                   ` (5 preceding siblings ...)
  2016-10-11  6:29 ` [U-Boot] [PATCH V4 6/8] imx: mx6ullevk: support plugin Peng Fan
@ 2016-10-11  6:29 ` Peng Fan
  2016-10-11  6:29 ` [U-Boot] [PATCH V4 8/8] imx: mx6ull_14x14_evk: add plugin defconfig Peng Fan
  2016-10-24 14:05 ` [U-Boot] [PATCH V4 1/8] tools: imximage: add plugin support Stefano Babic
  8 siblings, 0 replies; 12+ messages in thread
From: Peng Fan @ 2016-10-11  6:29 UTC (permalink / raw)
  To: u-boot

Correct boot device macro according to kconfig entry
in common/Kconfig

Signed-off-by: Peng Fan <peng.fan@nxp.com>
Cc: Stefano Babic <sbabic@denx.de>
---

V3:
 None

V2:
 None

 board/freescale/mx6ullevk/imximage.cfg | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/board/freescale/mx6ullevk/imximage.cfg b/board/freescale/mx6ullevk/imximage.cfg
index 1a21b49..3c219fa 100644
--- a/board/freescale/mx6ullevk/imximage.cfg
+++ b/board/freescale/mx6ullevk/imximage.cfg
@@ -21,9 +21,9 @@ IMAGE_VERSION 2
  * spi/sd/nand/onenand, qspi/nor
  */
 
-#ifdef CONFIG_SYS_BOOT_QSPI
+#ifdef CONFIG_QSPI_BOOT
 BOOT_FROM	qspi
-#elif defined(CONFIG_SYS_BOOT_EIMNOR)
+#elif defined(CONFIG_NOR_BOOT)
 BOOT_FROM	nor
 #else
 BOOT_FROM	sd
-- 
2.6.2

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH V4 8/8] imx: mx6ull_14x14_evk: add plugin defconfig
  2016-10-11  6:29 [U-Boot] [PATCH V4 1/8] tools: imximage: add plugin support Peng Fan
                   ` (6 preceding siblings ...)
  2016-10-11  6:29 ` [U-Boot] [PATCH V4 7/8] imx: mx6ullevk: correct boot device macro Peng Fan
@ 2016-10-11  6:29 ` Peng Fan
  2016-10-24 14:05 ` [U-Boot] [PATCH V4 1/8] tools: imximage: add plugin support Stefano Babic
  8 siblings, 0 replies; 12+ messages in thread
From: Peng Fan @ 2016-10-11  6:29 UTC (permalink / raw)
  To: u-boot

Add defconfig file to use plugin code.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
Cc: Stefano Babic <sbabic@denx.de>
---

V4:
 None

V3:
 None

V2:
 New

 configs/mx6ull_14x14_evk_plugin_defconfig | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)
 create mode 100644 configs/mx6ull_14x14_evk_plugin_defconfig

diff --git a/configs/mx6ull_14x14_evk_plugin_defconfig b/configs/mx6ull_14x14_evk_plugin_defconfig
new file mode 100644
index 0000000..ff15c8e
--- /dev/null
+++ b/configs/mx6ull_14x14_evk_plugin_defconfig
@@ -0,0 +1,31 @@
+CONFIG_ARM=y
+CONFIG_ARCH_MX6=y
+CONFIG_TARGET_MX6ULL_14X14_EVK=y
+CONFIG_USE_IMXIMG_PLUGIN=y
+CONFIG_DEFAULT_DEVICE_TREE="imx6ull-14x14-evk"
+CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ullevk/imximage.cfg"
+CONFIG_BOOTDELAY=3
+CONFIG_HUSH_PARSER=y
+CONFIG_CMD_BOOTZ=y
+# CONFIG_CMD_IMLS is not set
+CONFIG_CMD_MEMTEST=y
+CONFIG_CMD_MMC=y
+CONFIG_CMD_I2C=y
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_DHCP=y
+CONFIG_CMD_PING=y
+CONFIG_CMD_CACHE=y
+CONFIG_CMD_EXT2=y
+CONFIG_CMD_EXT4=y
+CONFIG_CMD_EXT4_WRITE=y
+CONFIG_CMD_FAT=y
+CONFIG_CMD_FS_GENERIC=y
+CONFIG_OF_CONTROL=y
+CONFIG_DM_GPIO=y
+CONFIG_DM_74X164=y
+CONFIG_DM_I2C=y
+CONFIG_DM_MMC=y
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_IMX6=y
+CONFIG_DM_REGULATOR=y
+CONFIG_DM_SPI=y
-- 
2.6.2

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH V4 1/8] tools: imximage: add plugin support
  2016-10-11  6:29 [U-Boot] [PATCH V4 1/8] tools: imximage: add plugin support Peng Fan
                   ` (7 preceding siblings ...)
  2016-10-11  6:29 ` [U-Boot] [PATCH V4 8/8] imx: mx6ull_14x14_evk: add plugin defconfig Peng Fan
@ 2016-10-24 14:05 ` Stefano Babic
  2016-10-25  0:09   ` Peng Fan
  8 siblings, 1 reply; 12+ messages in thread
From: Stefano Babic @ 2016-10-24 14:05 UTC (permalink / raw)
  To: u-boot

Hi Peng,

On 11/10/2016 08:29, Peng Fan wrote:
> Add plugin support for imximage.
> 
> Define CONFIG_USE_IMXIMG_PLUGIN in defconfig to enable using plugin.
> 
> Signed-off-by: Peng Fan <peng.fan@nxp.com>
> Cc: Stefano Babic <sbabic@denx.de>
> Cc: Eric Nelson <eric@nelint.com>
> Cc: Ye Li <ye.li@nxp.com>
> Reviewed-by: Tom Rini <trini@konsulko.com>
> ---
> 

I have just the same issue as with Jagan's patches. Due to recent
changes, we need to unset a couple of defines in defconfig (ull without
plugin is already fixed).

This means:

diff --git a/configs/mx6ull_14x14_evk_plugin_defconfig
b/configs/mx6ull_14x14_evk_plugin_defconfig
index ff15c8e..095e48d 100644
--- a/configs/mx6ull_14x14_evk_plugin_defconfig
+++ b/configs/mx6ull_14x14_evk_plugin_defconfig
@@ -25,6 +25,8 @@ CONFIG_DM_GPIO=y
 CONFIG_DM_74X164=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
+# CONFIG_BLK is not set
+# CONFIG_DM_MMC_OPS is not set
 CONFIG_PINCTRL=y
 CONFIG_PINCTRL_IMX6=y
 CONFIG_DM_REGULATOR=y


If you agree, I will make the change by applying it.

Best regards,
Stefano


> V4:
>  Max 64KB for plugin code.
>  
> V3:
>  Fix compile error.
> 
>  V2:
>   Drop the CONFIG_USE_PLUGIN, make plugin always support in imximage.
> 
>  tools/imximage.c | 283 +++++++++++++++++++++++++++++++++++++++++++------------
>  tools/imximage.h |   7 +-
>  2 files changed, 230 insertions(+), 60 deletions(-)
> 
> diff --git a/tools/imximage.c b/tools/imximage.c
> index 092d550..615a64e 100644
> --- a/tools/imximage.c
> +++ b/tools/imximage.c
> @@ -27,6 +27,7 @@ static table_entry_t imximage_cmds[] = {
>  	{CMD_CHECK_BITS_CLR,    "CHECK_BITS_CLR",   "Reg Check bits clr", },
>  	{CMD_CSF,               "CSF",           "Command Sequence File", },
>  	{CMD_IMAGE_VERSION,     "IMAGE_VERSION",        "image version",  },
> +	{CMD_PLUGIN,            "PLUGIN",               "file plugin_addr",  },
>  	{-1,                    "",                     "",	          },
>  };
>  
> @@ -80,6 +81,9 @@ static uint32_t imximage_ivt_offset = UNDEFINED;
>  static uint32_t imximage_csf_size = UNDEFINED;
>  /* Initial Load Region Size */
>  static uint32_t imximage_init_loadsize;
> +static uint32_t imximage_iram_free_start;
> +static uint32_t imximage_plugin_size;
> +static uint32_t plugin_image;
>  
>  static set_dcd_val_t set_dcd_val;
>  static set_dcd_param_t set_dcd_param;
> @@ -118,7 +122,11 @@ static uint32_t detect_imximage_version(struct imx_header *imx_hdr)
>  
>  	/* Try to detect V2 */
>  	if ((fhdr_v2->header.tag == IVT_HEADER_TAG) &&
> -		(hdr_v2->dcd_table.header.tag == DCD_HEADER_TAG))
> +		(hdr_v2->data.dcd_table.header.tag == DCD_HEADER_TAG))
> +		return IMXIMAGE_V2;
> +
> +	if ((fhdr_v2->header.tag == IVT_HEADER_TAG) &&
> +	    hdr_v2->boot_data.plugin)
>  		return IMXIMAGE_V2;
>  
>  	return IMXIMAGE_VER_INVALID;
> @@ -165,7 +173,7 @@ static struct dcd_v2_cmd *gd_last_cmd;
>  static void set_dcd_param_v2(struct imx_header *imxhdr, uint32_t dcd_len,
>  		int32_t cmd)
>  {
> -	dcd_v2_t *dcd_v2 = &imxhdr->header.hdr_v2.dcd_table;
> +	dcd_v2_t *dcd_v2 = &imxhdr->header.hdr_v2.data.dcd_table;
>  	struct dcd_v2_cmd *d = gd_last_cmd;
>  	struct dcd_v2_cmd *d2;
>  	int len;
> @@ -261,21 +269,23 @@ static void set_dcd_rst_v1(struct imx_header *imxhdr, uint32_t dcd_len,
>  static void set_dcd_rst_v2(struct imx_header *imxhdr, uint32_t dcd_len,
>  						char *name, int lineno)
>  {
> -	dcd_v2_t *dcd_v2 = &imxhdr->header.hdr_v2.dcd_table;
> -	struct dcd_v2_cmd *d = gd_last_cmd;
> -	int len;
> -
> -	if (!d)
> -		d = &dcd_v2->dcd_cmd;
> -	len = be16_to_cpu(d->write_dcd_command.length);
> -	if (len > 4)
> -		d = (struct dcd_v2_cmd *)(((char *)d) + len);
> -
> -	len = (char *)d - (char *)&dcd_v2->header;
> -
> -	dcd_v2->header.tag = DCD_HEADER_TAG;
> -	dcd_v2->header.length = cpu_to_be16(len);
> -	dcd_v2->header.version = DCD_VERSION;
> +	if (!imxhdr->header.hdr_v2.boot_data.plugin) {
> +		dcd_v2_t *dcd_v2 = &imxhdr->header.hdr_v2.data.dcd_table;
> +		struct dcd_v2_cmd *d = gd_last_cmd;
> +		int len;
> +
> +		if (!d)
> +			d = &dcd_v2->dcd_cmd;
> +		len = be16_to_cpu(d->write_dcd_command.length);
> +		if (len > 4)
> +			d = (struct dcd_v2_cmd *)(((char *)d) + len);
> +
> +		len = (char *)d - (char *)&dcd_v2->header;
> +
> +		dcd_v2->header.tag = DCD_HEADER_TAG;
> +		dcd_v2->header.length = cpu_to_be16(len);
> +		dcd_v2->header.version = DCD_VERSION;
> +	}
>  }
>  
>  static void set_imx_hdr_v1(struct imx_header *imxhdr, uint32_t dcd_len,
> @@ -317,24 +327,94 @@ static void set_imx_hdr_v2(struct imx_header *imxhdr, uint32_t dcd_len,
>  	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;
> -	hdr_base = entry_point - imximage_init_loadsize +
> -		flash_offset;
> -	fhdr_v2->self = hdr_base;
> -	if (dcd_len > 0)
> -		fhdr_v2->dcd_ptr = hdr_base
> -			+ offsetof(imx_header_v2_t, dcd_table);
> -	else
> +	if (!hdr_v2->boot_data.plugin) {
> +		fhdr_v2->entry = entry_point;
> +		fhdr_v2->reserved1 = 0;
> +		fhdr_v2->reserved1 = 0;
> +		hdr_base = entry_point - imximage_init_loadsize +
> +			flash_offset;
> +		fhdr_v2->self = hdr_base;
> +		if (dcd_len > 0)
> +			fhdr_v2->dcd_ptr = hdr_base +
> +				offsetof(imx_header_v2_t, data);
> +		else
> +			fhdr_v2->dcd_ptr = 0;
> +		fhdr_v2->boot_data_ptr = hdr_base
> +				+ offsetof(imx_header_v2_t, boot_data);
> +		hdr_v2->boot_data.start = entry_point - imximage_init_loadsize;
> +
> +		fhdr_v2->csf = 0;
> +
> +		header_size_ptr = &hdr_v2->boot_data.size;
> +		csf_ptr = &fhdr_v2->csf;
> +	} else {
> +		imx_header_v2_t *next_hdr_v2;
> +		flash_header_v2_t *next_fhdr_v2;
> +
> +		if (imximage_csf_size != 0) {
> +			fprintf(stderr, "Error: Header v2: SECURE_BOOT is only supported in DCD mode!");
> +			exit(EXIT_FAILURE);
> +		}
> +
> +		fhdr_v2->entry = imximage_iram_free_start +
> +			flash_offset + sizeof(flash_header_v2_t) +
> +			sizeof(boot_data_t);
> +
> +		fhdr_v2->reserved1 = 0;
> +		fhdr_v2->reserved2 = 0;
> +		fhdr_v2->self = imximage_iram_free_start + flash_offset;
> +
>  		fhdr_v2->dcd_ptr = 0;
> -	fhdr_v2->boot_data_ptr = hdr_base
> -			+ offsetof(imx_header_v2_t, boot_data);
> -	hdr_v2->boot_data.start = entry_point - imximage_init_loadsize;
>  
> -	fhdr_v2->csf = 0;
> +		fhdr_v2->boot_data_ptr = fhdr_v2->self +
> +				offsetof(imx_header_v2_t, boot_data);
> +
> +		hdr_v2->boot_data.start = imximage_iram_free_start;
> +		/*
> +		 * The actural size of plugin image is "imximage_plugin_size +
> +		 * sizeof(flash_header_v2_t) + sizeof(boot_data_t)", plus the
> +		 * flash_offset space.The ROM code only need to copy this size
> +		 * to run the plugin code. However, later when copy the whole
> +		 * U-Boot image to DDR, the ROM code use memcpy to copy the
> +		 * first part of the image, and use the storage read function
> +		 * to get the remaining part. This requires the dividing point
> +		 * must be multiple of storage sector size. Here we set the
> +		 * first section to be MAX_PLUGIN_CODE_SIZE(64KB) for this
> +		 * purpose.
> +		 */
> +		hdr_v2->boot_data.size = MAX_PLUGIN_CODE_SIZE;
> +
> +		/* Security feature are not supported */
> +		fhdr_v2->csf = 0;
> +
> +		next_hdr_v2 = (imx_header_v2_t *)((char *)hdr_v2 +
> +			       imximage_plugin_size);
> +
> +		next_fhdr_v2 = &next_hdr_v2->fhdr;
> +
> +		next_fhdr_v2->header.tag = IVT_HEADER_TAG; /* 0xD1 */
> +		next_fhdr_v2->header.length =
> +			cpu_to_be16(sizeof(flash_header_v2_t));
> +		next_fhdr_v2->header.version = IVT_VERSION; /* 0x40 */
> +
> +		next_fhdr_v2->entry = entry_point;
> +		hdr_base = entry_point - sizeof(struct imx_header);
> +		next_fhdr_v2->reserved1 = 0;
> +		next_fhdr_v2->reserved2 = 0;
> +		next_fhdr_v2->self = hdr_base + imximage_plugin_size;
> +
> +		next_fhdr_v2->dcd_ptr = 0;
> +		next_fhdr_v2->boot_data_ptr = next_fhdr_v2->self +
> +				offsetof(imx_header_v2_t, boot_data);
> +
> +		next_hdr_v2->boot_data.start = hdr_base - flash_offset;
> +
> +		header_size_ptr = &next_hdr_v2->boot_data.size;
>  
> -	header_size_ptr = &hdr_v2->boot_data.size;
> -	csf_ptr = &fhdr_v2->csf;
> +		next_hdr_v2->boot_data.plugin = 0;
> +
> +		next_fhdr_v2->csf = 0;
> +	}
>  }
>  
>  static void set_hdr_func(void)
> @@ -393,16 +473,19 @@ static void print_hdr_v2(struct imx_header *imx_hdr)
>  {
>  	imx_header_v2_t *hdr_v2 = &imx_hdr->header.hdr_v2;
>  	flash_header_v2_t *fhdr_v2 = &hdr_v2->fhdr;
> -	dcd_v2_t *dcd_v2 = &hdr_v2->dcd_table;
> -	uint32_t size, version;
> +	dcd_v2_t *dcd_v2 = &hdr_v2->data.dcd_table;
> +	uint32_t size, version, plugin;
>  
> -	size = be16_to_cpu(dcd_v2->header.length);
> -	if (size > (MAX_HW_CFG_SIZE_V2 * sizeof(dcd_addr_data_t)) + 8) {
> -		fprintf(stderr,
> -			"Error: Image corrupt DCD size %d exceed maximum %d\n",
> -			(uint32_t)(size / sizeof(dcd_addr_data_t)),
> -			MAX_HW_CFG_SIZE_V2);
> -		exit(EXIT_FAILURE);
> +	plugin = hdr_v2->boot_data.plugin;
> +	if (!plugin) {
> +		size = be16_to_cpu(dcd_v2->header.length);
> +		if (size > (MAX_HW_CFG_SIZE_V2 * sizeof(dcd_addr_data_t))) {
> +			fprintf(stderr,
> +				"Error: Image corrupt DCD size %d exceed maximum %d\n",
> +				(uint32_t)(size / sizeof(dcd_addr_data_t)),
> +				MAX_HW_CFG_SIZE_V2);
> +			exit(EXIT_FAILURE);
> +		}
>  	}
>  
>  	version = detect_imximage_version(imx_hdr);
> @@ -410,19 +493,81 @@ static void print_hdr_v2(struct imx_header *imx_hdr)
>  	printf("Image Type:   Freescale IMX Boot Image\n");
>  	printf("Image Ver:    %x", version);
>  	printf("%s\n", get_table_entry_name(imximage_versions, NULL, version));
> -	printf("Data Size:    ");
> -	genimg_print_size(hdr_v2->boot_data.size);
> -	printf("Load Address: %08x\n", (uint32_t)fhdr_v2->boot_data_ptr);
> -	printf("Entry Point:  %08x\n", (uint32_t)fhdr_v2->entry);
> -	if (fhdr_v2->csf && (imximage_ivt_offset != UNDEFINED) &&
> -	    (imximage_csf_size != UNDEFINED)) {
> -		printf("HAB Blocks:   %08x %08x %08x\n",
> -		       (uint32_t)fhdr_v2->self, 0,
> -		       hdr_v2->boot_data.size - imximage_ivt_offset -
> -		       imximage_csf_size);
> +	printf("Mode:         %s\n", plugin ? "PLUGIN" : "DCD");
> +	if (!plugin) {
> +		printf("Data Size:    ");
> +		genimg_print_size(hdr_v2->boot_data.size);
> +		printf("Load Address: %08x\n", (uint32_t)fhdr_v2->boot_data_ptr);
> +		printf("Entry Point:  %08x\n", (uint32_t)fhdr_v2->entry);
> +		if (fhdr_v2->csf && (imximage_ivt_offset != UNDEFINED) &&
> +		    (imximage_csf_size != UNDEFINED)) {
> +			printf("HAB Blocks:   %08x %08x %08x\n",
> +			       (uint32_t)fhdr_v2->self, 0,
> +			       hdr_v2->boot_data.size - imximage_ivt_offset -
> +			       imximage_csf_size);
> +		}
> +	} else {
> +		imx_header_v2_t *next_hdr_v2;
> +		flash_header_v2_t *next_fhdr_v2;
> +
> +		/*First Header*/
> +		printf("Plugin Data Size:     ");
> +		genimg_print_size(hdr_v2->boot_data.size);
> +		printf("Plugin Code Size:     ");
> +		genimg_print_size(imximage_plugin_size);
> +		printf("Plugin Load Address:  %08x\n", hdr_v2->boot_data.start);
> +		printf("Plugin Entry Point:   %08x\n", (uint32_t)fhdr_v2->entry);
> +
> +		/*Second Header*/
> +		next_hdr_v2 = (imx_header_v2_t *)((char *)hdr_v2 +
> +				imximage_plugin_size);
> +		next_fhdr_v2 = &next_hdr_v2->fhdr;
> +		printf("U-Boot Data Size:     ");
> +		genimg_print_size(next_hdr_v2->boot_data.size);
> +		printf("U-Boot Load Address:  %08x\n",
> +		       next_hdr_v2->boot_data.start);
> +		printf("U-Boot Entry Point:   %08x\n",
> +		       (uint32_t)next_fhdr_v2->entry);
>  	}
>  }
>  
> +static void copy_plugin_code(struct imx_header *imxhdr, char *plugin_file)
> +{
> +	int ifd = -1;
> +	struct stat sbuf;
> +	char *plugin_buf = imxhdr->header.hdr_v2.data.plugin_code;
> +	char *ptr;
> +
> +	ifd = open(plugin_file, O_RDONLY|O_BINARY);
> +	if (fstat(ifd, &sbuf) < 0) {
> +		fprintf(stderr, "Can't stat %s: %s\n",
> +			plugin_file,
> +			strerror(errno));
> +		exit(EXIT_FAILURE);
> +	}
> +
> +	ptr = mmap(0, sbuf.st_size, PROT_READ, MAP_SHARED, ifd, 0);
> +	if (ptr == MAP_FAILED) {
> +		fprintf(stderr, "Can't read %s: %s\n",
> +			plugin_file,
> +			strerror(errno));
> +		exit(EXIT_FAILURE);
> +	}
> +
> +	if (sbuf.st_size > MAX_PLUGIN_CODE_SIZE) {
> +		printf("plugin binary size too large\n");
> +		exit(EXIT_FAILURE);
> +	}
> +
> +	memcpy(plugin_buf, ptr, sbuf.st_size);
> +	imximage_plugin_size = sbuf.st_size;
> +
> +	(void) munmap((void *)ptr, sbuf.st_size);
> +	(void) close(ifd);
> +
> +	imxhdr->header.hdr_v2.boot_data.plugin = 1;
> +}
> +
>  static void parse_cfg_cmd(struct imx_header *imxhdr, int32_t cmd, char *token,
>  				char *name, int lineno, int fld, int dcd_len)
>  {
> @@ -497,6 +642,10 @@ static void parse_cfg_cmd(struct imx_header *imxhdr, int32_t cmd, char *token,
>  		if (unlikely(cmd_ver_first != 1))
>  			cmd_ver_first = 0;
>  		break;
> +	case CMD_PLUGIN:
> +		plugin_image = 1;
> +		copy_plugin_code(imxhdr, token);
> +		break;
>  	}
>  }
>  
> @@ -542,6 +691,10 @@ static void parse_cfg_fld(struct imx_header *imxhdr, int32_t *cmd,
>  				}
>  			}
>  			break;
> +		case CMD_PLUGIN:
> +			value = get_cfg_value(token, name, lineno);
> +			imximage_iram_free_start = value;
> +			break;
>  		default:
>  			break;
>  		}
> @@ -649,6 +802,7 @@ static void imximage_set_header(void *ptr, struct stat *sbuf, int ifd,
>  {
>  	struct imx_header *imxhdr = (struct imx_header *)ptr;
>  	uint32_t dcd_len;
> +	uint32_t header_size;
>  
>  	/*
>  	 * In order to not change the old imx cfg file
> @@ -665,10 +819,15 @@ static void imximage_set_header(void *ptr, struct stat *sbuf, int ifd,
>  	dcd_len = parse_cfg_file(imxhdr, params->imagename);
>  
>  	if (imximage_version == IMXIMAGE_V2) {
> -		if (imximage_init_loadsize < imximage_ivt_offset +
> -			sizeof(imx_header_v2_t))
> +		header_size = sizeof(flash_header_v2_t) + sizeof(boot_data_t);
> +		if (!plugin_image)
> +			header_size += sizeof(dcd_v2_t);
> +		else
> +			header_size += MAX_PLUGIN_CODE_SIZE;
> +
> +		if (imximage_init_loadsize < imximage_ivt_offset + header_size)
>  				imximage_init_loadsize = imximage_ivt_offset +
> -					sizeof(imx_header_v2_t);
> +					header_size;
>  	}
>  
>  	/* Set the imx header */
> @@ -721,7 +880,7 @@ static int imximage_generate(struct image_tool_params *params,
>  	size_t alloc_len;
>  	struct stat sbuf;
>  	char *datafile = params->datafile;
> -	uint32_t pad_len;
> +	uint32_t pad_len, header_size;
>  
>  	memset(&imximage_header, 0, sizeof(imximage_header));
>  
> @@ -742,15 +901,21 @@ static int imximage_generate(struct image_tool_params *params,
>  	/* TODO: check i.MX image V1 handling, for now use 'old' style */
>  	if (imximage_version == IMXIMAGE_V1) {
>  		alloc_len = 4096;
> +		header_size = 4096;
>  	} else {
> -		if (imximage_init_loadsize < imximage_ivt_offset +
> -			sizeof(imx_header_v2_t))
> +		header_size = sizeof(flash_header_v2_t) + sizeof(boot_data_t);
> +		if (!plugin_image)
> +			header_size += sizeof(dcd_v2_t);
> +		else
> +			header_size += MAX_PLUGIN_CODE_SIZE;
> +
> +		if (imximage_init_loadsize < imximage_ivt_offset + header_size)
>  				imximage_init_loadsize = imximage_ivt_offset +
> -					sizeof(imx_header_v2_t);
> +					header_size;
>  		alloc_len = imximage_init_loadsize - imximage_ivt_offset;
>  	}
>  
> -	if (alloc_len < sizeof(struct imx_header)) {
> +	if (alloc_len < header_size) {
>  		fprintf(stderr, "%s: header error\n",
>  			params->cmdname);
>  		exit(EXIT_FAILURE);
> diff --git a/tools/imximage.h b/tools/imximage.h
> index c7b9b5c..db8b9a3 100644
> --- a/tools/imximage.h
> +++ b/tools/imximage.h
> @@ -9,6 +9,7 @@
>  #define _IMXIMAGE_H_
>  
>  #define MAX_HW_CFG_SIZE_V2 220 /* Max number of registers imx can set for v2 */
> +#define MAX_PLUGIN_CODE_SIZE (64 * 1024)
>  #define MAX_HW_CFG_SIZE_V1 60  /* Max number of registers imx can set for v1 */
>  #define APP_CODE_BARKER	0xB1
>  #define DCD_BARKER	0xB17219E9
> @@ -64,6 +65,7 @@ enum imximage_cmd {
>  	CMD_CHECK_BITS_SET,
>  	CMD_CHECK_BITS_CLR,
>  	CMD_CSF,
> +	CMD_PLUGIN,
>  };
>  
>  enum imximage_fld_types {
> @@ -164,7 +166,10 @@ typedef struct {
>  typedef struct {
>  	flash_header_v2_t fhdr;
>  	boot_data_t boot_data;
> -	dcd_v2_t dcd_table;
> +	union {
> +		dcd_v2_t dcd_table;
> +		char plugin_code[MAX_PLUGIN_CODE_SIZE];
> +	} data;
>  } imx_header_v2_t;
>  
>  /* The header must be aligned to 4k on MX53 for NAND boot */
> 


-- 
=====================================================================
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH V4 1/8] tools: imximage: add plugin support
  2016-10-24 14:05 ` [U-Boot] [PATCH V4 1/8] tools: imximage: add plugin support Stefano Babic
@ 2016-10-25  0:09   ` Peng Fan
  2016-10-26 14:47     ` Stefano Babic
  0 siblings, 1 reply; 12+ messages in thread
From: Peng Fan @ 2016-10-25  0:09 UTC (permalink / raw)
  To: u-boot

Hi Stefano,
On Mon, Oct 24, 2016 at 04:05:53PM +0200, Stefano Babic wrote:
>Hi Peng,
>
>On 11/10/2016 08:29, Peng Fan wrote:
>> Add plugin support for imximage.
>> 
>> Define CONFIG_USE_IMXIMG_PLUGIN in defconfig to enable using plugin.
>> 
>> Signed-off-by: Peng Fan <peng.fan@nxp.com>
>> Cc: Stefano Babic <sbabic@denx.de>
>> Cc: Eric Nelson <eric@nelint.com>
>> Cc: Ye Li <ye.li@nxp.com>
>> Reviewed-by: Tom Rini <trini@konsulko.com>
>> ---
>> 
>
>I have just the same issue as with Jagan's patches. Due to recent
>changes, we need to unset a couple of defines in defconfig (ull without
>plugin is already fixed).
>
>This means:
>
>diff --git a/configs/mx6ull_14x14_evk_plugin_defconfig
>b/configs/mx6ull_14x14_evk_plugin_defconfig
>index ff15c8e..095e48d 100644
>--- a/configs/mx6ull_14x14_evk_plugin_defconfig
>+++ b/configs/mx6ull_14x14_evk_plugin_defconfig
>@@ -25,6 +25,8 @@ CONFIG_DM_GPIO=y
> CONFIG_DM_74X164=y
> CONFIG_DM_I2C=y
> CONFIG_DM_MMC=y
>+# CONFIG_BLK is not set
>+# CONFIG_DM_MMC_OPS is not set
> CONFIG_PINCTRL=y
> CONFIG_PINCTRL_IMX6=y
> CONFIG_DM_REGULATOR=y
>
>
>If you agree, I will make the change by applying it.

Yeah. Please help do this.

Thanks,
Peng.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH V4 1/8] tools: imximage: add plugin support
  2016-10-25  0:09   ` Peng Fan
@ 2016-10-26 14:47     ` Stefano Babic
  0 siblings, 0 replies; 12+ messages in thread
From: Stefano Babic @ 2016-10-26 14:47 UTC (permalink / raw)
  To: u-boot

On 25/10/2016 02:09, Peng Fan wrote:
> Hi Stefano,
> On Mon, Oct 24, 2016 at 04:05:53PM +0200, Stefano Babic wrote:
>> Hi Peng,
>>
>> On 11/10/2016 08:29, Peng Fan wrote:
>>> Add plugin support for imximage.
>>>
>>> Define CONFIG_USE_IMXIMG_PLUGIN in defconfig to enable using plugin.
>>>
>>> Signed-off-by: Peng Fan <peng.fan@nxp.com>
>>> Cc: Stefano Babic <sbabic@denx.de>
>>> Cc: Eric Nelson <eric@nelint.com>
>>> Cc: Ye Li <ye.li@nxp.com>
>>> Reviewed-by: Tom Rini <trini@konsulko.com>
>>> ---
>>>
>>
>> I have just the same issue as with Jagan's patches. Due to recent
>> changes, we need to unset a couple of defines in defconfig (ull without
>> plugin is already fixed).
>>
>> This means:
>>
>> diff --git a/configs/mx6ull_14x14_evk_plugin_defconfig
>> b/configs/mx6ull_14x14_evk_plugin_defconfig
>> index ff15c8e..095e48d 100644
>> --- a/configs/mx6ull_14x14_evk_plugin_defconfig
>> +++ b/configs/mx6ull_14x14_evk_plugin_defconfig
>> @@ -25,6 +25,8 @@ CONFIG_DM_GPIO=y
>> CONFIG_DM_74X164=y
>> CONFIG_DM_I2C=y
>> CONFIG_DM_MMC=y
>> +# CONFIG_BLK is not set
>> +# CONFIG_DM_MMC_OPS is not set
>> CONFIG_PINCTRL=y
>> CONFIG_PINCTRL_IMX6=y
>> CONFIG_DM_REGULATOR=y
>>
>>
>> If you agree, I will make the change by applying it.
> 
> Yeah. Please help do this.

ok, thanks - applied to master.

Best regards,
Stefano Babic

-- 
=====================================================================
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2016-10-26 14:47 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-10-11  6:29 [U-Boot] [PATCH V4 1/8] tools: imximage: add plugin support Peng Fan
2016-10-11  6:29 ` [U-Boot] [PATCH V4 2/8] imx: mx6: Add " Peng Fan
2016-10-11  6:29 ` [U-Boot] [PATCH V4 3/8] imx: mx7: " Peng Fan
2016-10-11  6:29 ` [U-Boot] [PATCH V4 4/8] imx-common: introduce USE_IMXIMG_PLUGIN Kconfig Peng Fan
2016-10-11  6:29 ` Peng Fan
2016-10-11  6:29 ` [U-Boot] [PATCH V4 5/8] imx-common: compile plugin code Peng Fan
2016-10-11  6:29 ` [U-Boot] [PATCH V4 6/8] imx: mx6ullevk: support plugin Peng Fan
2016-10-11  6:29 ` [U-Boot] [PATCH V4 7/8] imx: mx6ullevk: correct boot device macro Peng Fan
2016-10-11  6:29 ` [U-Boot] [PATCH V4 8/8] imx: mx6ull_14x14_evk: add plugin defconfig Peng Fan
2016-10-24 14:05 ` [U-Boot] [PATCH V4 1/8] tools: imximage: add plugin support Stefano Babic
2016-10-25  0:09   ` Peng Fan
2016-10-26 14:47     ` Stefano Babic

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.