@@ -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':
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@heimpold.de> --- tools/firmware-utils/src/ptgen.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-)