summaryrefslogtreecommitdiff
path: root/meta-ampere/meta-common/recipes-devtools/mtd/mtd-utils/0001-flashcp-support-offset-option.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-ampere/meta-common/recipes-devtools/mtd/mtd-utils/0001-flashcp-support-offset-option.patch')
-rw-r--r--meta-ampere/meta-common/recipes-devtools/mtd/mtd-utils/0001-flashcp-support-offset-option.patch143
1 files changed, 143 insertions, 0 deletions
diff --git a/meta-ampere/meta-common/recipes-devtools/mtd/mtd-utils/0001-flashcp-support-offset-option.patch b/meta-ampere/meta-common/recipes-devtools/mtd/mtd-utils/0001-flashcp-support-offset-option.patch
new file mode 100644
index 000000000..174a1cd6d
--- /dev/null
+++ b/meta-ampere/meta-common/recipes-devtools/mtd/mtd-utils/0001-flashcp-support-offset-option.patch
@@ -0,0 +1,143 @@
+From e29268bb252b4eec5830816912817a2650b04ee9 Mon Sep 17 00:00:00 2001
+From: Tung Nguyen <tung.nguyen@amperecomputing.com>
+Date: Tue, 20 Jul 2021 15:32:32 +0700
+Subject: [PATCH] flashcp support offset option
+
+The flashcp command from mtd-utils just support to flash from offset 0.
+Add offset option to specify the start offset so that firmware can be
+flashed correctly
+
+Signed-off-by: Tung Nguyen <tung.nguyen@amperecomputing.com>
+
+%% original patch: 0001-support-flash-offset.patch
+---
+ misc-utils/flashcp.c | 50 +++++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 47 insertions(+), 3 deletions(-)
+
+diff --git a/misc-utils/flashcp.c b/misc-utils/flashcp.c
+index d7b0a59..d1ef79c 100644
+--- a/misc-utils/flashcp.c
++++ b/misc-utils/flashcp.c
+@@ -90,7 +90,7 @@ static NORETURN void showusage(bool error)
+ "\n"
+ "Flash Copy - Written by Abraham van der Merwe <abraham@2d3d.co.za>\n"
+ "\n"
+- "usage: %1$s [ -v | --verbose | -A | --erase-all ] <filename> <device>\n"
++ "usage: %1$s [ -v | --verbose | -A | --erase-all ] <filename> <device> <offset>\n"
+ " %1$s -h | --help\n"
+ " %1$s -V | --version\n"
+ "\n"
+@@ -100,6 +100,7 @@ static NORETURN void showusage(bool error)
+ " -V | --version Show version information and exit\n"
+ " <filename> File which you want to copy to flash\n"
+ " <device> Flash device to write to (e.g. /dev/mtd0, /dev/mtd1, etc.)\n"
++ " <offset> The start offset. Optional, default: 0\n"
+ "\n",
+ PROGRAM_NAME);
+
+@@ -154,6 +155,16 @@ static void safe_rewind (int fd,const char *filename)
+ }
+ }
+
++static int safe_rewind_offset(int fd, const char *filename, off_t offset)
++{
++ if (lseek(fd, offset, SEEK_SET) < 0) {
++ log_printf(LOG_ERROR, "While seeking to start of %s: %m\n", filename);
++ return EXIT_FAILURE;
++ }
++
++ return EXIT_SUCCESS;
++}
++
+ /******************************************************************************/
+
+ static int dev_fd = -1,fil_fd = -1;
+@@ -167,6 +178,8 @@ static void cleanup (void)
+ int main (int argc,char *argv[])
+ {
+ const char *filename = NULL,*device = NULL;
++ off_t offset;
++
+ int i,flags = FLAG_NONE;
+ ssize_t result;
+ size_t size,written;
+@@ -218,6 +231,20 @@ int main (int argc,char *argv[])
+ showusage(true);
+ }
+ }
++
++ if (optind + 3 == argc) {
++ flags |= FLAG_FILENAME;
++ filename = argv[optind];
++ DEBUG("Got filename: %s\n", filename);
++
++ flags |= FLAG_DEVICE;
++ device = argv[optind + 1];
++ DEBUG("Got device: %s\n", device);
++
++ offset = strtoul(argv[optind + 2], NULL, 16);
++ DEBUG("Got offset: 0x%x\n", offset);
++ }
++
+ if (optind+2 == argc) {
+ flags |= FLAG_FILENAME;
+ filename = argv[optind];
+@@ -226,6 +253,8 @@ int main (int argc,char *argv[])
+ flags |= FLAG_DEVICE;
+ device = argv[optind+1];
+ DEBUG("Got device: %s\n",device);
++
++ offset = 0;
+ }
+
+ if (flags & FLAG_HELP || device == NULL)
+@@ -257,6 +286,12 @@ int main (int argc,char *argv[])
+ exit (EXIT_FAILURE);
+ }
+
++ /* does offset is out of the mtd */
++ if (offset > mtd.size) {
++ log_printf(LOG_ERROR, "%s offset won't fit into %s!\n", offset, device);
++ exit(EXIT_FAILURE);
++ }
++
+ /*****************************************************
+ * erase enough blocks so that we can write the file *
+ *****************************************************/
+@@ -271,6 +306,8 @@ int main (int argc,char *argv[])
+ }
+ else
+ {
++ /* Erase from the offset */
++ erase.start = offset;
+ erase.length = (filestat.st_size + mtd.erasesize - 1) / mtd.erasesize;
+ erase.length *= mtd.erasesize;
+ }
+@@ -317,6 +354,12 @@ int main (int argc,char *argv[])
+ size = filestat.st_size;
+ i = BUFSIZE;
+ written = 0;
++
++ /* if offset is greater than 0 */
++ if (offset)
++ if (safe_rewind_offset(dev_fd, device, offset) != EXIT_SUCCESS)
++ return EXIT_FAILURE;
++
+ while (size)
+ {
+ if (size < BUFSIZE) i = size;
+@@ -361,8 +404,9 @@ int main (int argc,char *argv[])
+ * verify that flash == file data *
+ **********************************/
+
+- safe_rewind (fil_fd,filename);
+- safe_rewind (dev_fd,device);
++ safe_rewind(fil_fd, filename);
++ safe_rewind_offset(dev_fd, device, offset);
++
+ size = filestat.st_size;
+ i = BUFSIZE;
+ written = 0;
+--
+2.17.1
+