mirror of
https://github.com/openwrt/openwrt.git
synced 2025-01-29 15:44:04 +00:00
firmware-utils/ptgen: allow explicit placement of partitions
For Banana Pi R2 we need to place the U-Boot partition at precisely 0x50000. Signed-off-by: David Woodhouse <dwmw2@infradead.org>
This commit is contained in:
parent
c07d0d7f3e
commit
dca867c5a3
@ -106,6 +106,7 @@ struct pte {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct partinfo {
|
struct partinfo {
|
||||||
|
unsigned long start;
|
||||||
unsigned long size;
|
unsigned long size;
|
||||||
int type;
|
int type;
|
||||||
};
|
};
|
||||||
@ -290,8 +291,16 @@ static int gen_ptable(uint32_t signature, int nr)
|
|||||||
pte[i].type = parts[i].type;
|
pte[i].type = parts[i].type;
|
||||||
|
|
||||||
start = sect + sectors;
|
start = sect + sectors;
|
||||||
if (kb_align != 0)
|
if (parts[i].start != 0) {
|
||||||
|
if (parts[i].start * 2 < start) {
|
||||||
|
fprintf(stderr, "Invalid start %ld for partition %d!\n",
|
||||||
|
parts[i].start, i);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
start = parts[i].start * 2;
|
||||||
|
} else if (kb_align != 0) {
|
||||||
start = round_to_kb(start);
|
start = round_to_kb(start);
|
||||||
|
}
|
||||||
pte[i].start = cpu_to_le32(start);
|
pte[i].start = cpu_to_le32(start);
|
||||||
|
|
||||||
sect = start + parts[i].size * 2;
|
sect = start + parts[i].size * 2;
|
||||||
@ -369,8 +378,16 @@ static int gen_gptable(uint32_t signature, guid_t guid, unsigned nr)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
start = sect + sectors;
|
start = sect + sectors;
|
||||||
if (kb_align != 0)
|
if (parts[i].start != 0) {
|
||||||
|
if (parts[i].start * 2 < start) {
|
||||||
|
fprintf(stderr, "Invalid start %ld for partition %d!\n",
|
||||||
|
parts[i].start, i);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
start = parts[i].start * 2;
|
||||||
|
} else if (kb_align != 0) {
|
||||||
start = round_to_kb(start);
|
start = round_to_kb(start);
|
||||||
|
}
|
||||||
gpte[i].start = cpu_to_le64(start);
|
gpte[i].start = cpu_to_le64(start);
|
||||||
|
|
||||||
sect = start + parts[i].size * 2;
|
sect = start + parts[i].size * 2;
|
||||||
@ -481,13 +498,14 @@ fail:
|
|||||||
|
|
||||||
static void usage(char *prog)
|
static void usage(char *prog)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Usage: %s [-v] [-n] [-g] -h <heads> -s <sectors> -o <outputfile> [-a 0..4] [-l <align kB>] [-G <guid>] [[-t <type>] -p <size>...] \n", prog);
|
fprintf(stderr, "Usage: %s [-v] [-n] [-g] -h <heads> -s <sectors> -o <outputfile> [-a 0..4] [-l <align kB>] [-G <guid>] [[-t <type>] -p <size>[@<start>]...] \n", prog);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main (int argc, char **argv)
|
int main (int argc, char **argv)
|
||||||
{
|
{
|
||||||
unsigned char type = 0x83;
|
unsigned char type = 0x83;
|
||||||
|
char *p;
|
||||||
int ch;
|
int ch;
|
||||||
int part = 0;
|
int part = 0;
|
||||||
uint32_t signature = 0x5452574F; /* 'OWRT' */
|
uint32_t signature = 0x5452574F; /* 'OWRT' */
|
||||||
@ -519,7 +537,13 @@ int main (int argc, char **argv)
|
|||||||
fputs("Too many partitions\n", stderr);
|
fputs("Too many partitions\n", stderr);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
p = strchr(optarg, '@');
|
||||||
|
if (p) {
|
||||||
|
*(p++) = 0;
|
||||||
|
parts[part].start = to_kbytes(p);
|
||||||
|
}
|
||||||
parts[part].size = to_kbytes(optarg);
|
parts[part].size = to_kbytes(optarg);
|
||||||
|
fprintf(stderr, "part %ld %ld\n", parts[part].start, parts[part].size);
|
||||||
parts[part++].type = type;
|
parts[part++].type = type;
|
||||||
break;
|
break;
|
||||||
case 't':
|
case 't':
|
||||||
|
Loading…
x
Reference in New Issue
Block a user