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:
		
				
					committed by
					
						
						Petr Štetiar
					
				
			
			
				
	
			
			
			
						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':
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user