[LEDE-DEV] [PATCH 7/7] firmware-tools/ptgen: allow individual partition alignment

Michael Heimpold mhei at heimpold.de
Thu Dec 21 14:59:34 PST 2017


At the moment, the alignment parameter can only be given once and affects
all partitions the same way. For example, it's not possible to align the
first partition to 1 MiB start offet, while aligning the next ones to
a 4 MiB boundary.

This can be useful for example when defining a small bootloader partition
within the first erase block on an eMMC, but then aligning the rootfs to
next start of erase block.

This change splits the global alignment parameter to individual ones
which thus allows individual partition alignment.

Signed-off-by: Michael Heimpold <mhei at heimpold.de>
---
 tools/firmware-utils/src/ptgen.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/tools/firmware-utils/src/ptgen.c b/tools/firmware-utils/src/ptgen.c
index d549faf..547b83a 100644
--- a/tools/firmware-utils/src/ptgen.c
+++ b/tools/firmware-utils/src/ptgen.c
@@ -53,17 +53,16 @@ struct pte {
 struct partinfo {
 	unsigned long size;
 	int type;
+	int kb_align;
 };
 
 int verbose = 0;
 int active = 1;
 int heads = -1;
 int sectors = -1;
-int kb_align = 0;
 struct partinfo parts[4];
 char *filename = NULL;
 
-
 /*
  * parse the size argument, which is either
  * a simple number (K assumed) or
@@ -127,7 +126,8 @@ static inline unsigned long round_to_cyl(long sect)
 }
 
 /* round the sector number up to the kb_align boundary */
-static inline unsigned long round_to_kb(long sect) {
+static inline unsigned long round_to_kb(long sect, int kb_align)
+{
         return ((sect - 1) / kb_align + 1) * kb_align;
 }
 
@@ -150,12 +150,12 @@ static int gen_ptable(uint32_t signature, int nr)
 		pte[i].type = parts[i].type;
 
 		start = sect + ((i == 0) ? sectors : 0);
-		if (kb_align != 0)
-			start = round_to_kb(start);
+		if (parts[i].kb_align != 0)
+			start = round_to_kb(start, parts[i].kb_align);
 		pte[i].start = cpu_to_le32(start);
 
 		sect = start + parts[i].size * 2;
-		if (kb_align == 0)
+		if (parts[i].kb_align == 0)
 			sect = round_to_cyl(sect);
 		pte[i].length = cpu_to_le32(len = sect - start);
 
@@ -198,15 +198,17 @@ fail:
 
 static void usage(char *prog)
 {
-	fprintf(stderr, "Usage: %s [-v] -h <heads> -s <sectors> -o <outputfile> [-a 0..4] [-l <align kB>] [[-t <type>] -p <size>...] \n", prog);
+	fprintf(stderr, "Usage: %s [-v] -h <heads> -s <sectors> -o <outputfile> [-a 0..4] [[-l <align kB>] [-t <type>] -p <size>...] \n", prog);
 	exit(EXIT_FAILURE);
 }
 
 int main (int argc, char **argv)
 {
+	int kb_align = 0;
 	char type = 0x83;
 	int ch;
 	int part = 0;
+
 	uint32_t signature = 0x5452574F; /* 'OWRT' */
 
 	while ((ch = getopt(argc, argv, "h:s:p:a:t:o:vl:S:")) != -1) {
@@ -229,6 +231,7 @@ int main (int argc, char **argv)
 				exit(EXIT_FAILURE);
 			}
 			parts[part].size = to_kbytes(optarg);
+			parts[part].kb_align = kb_align;
 			parts[part++].type = type;
 			break;
 		case 't':
-- 
2.7.4




More information about the Lede-dev mailing list