mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH v2 1/4] partitions: efi: add support to specify gpt-location
@ 2025-04-23 14:09 Marco Felsch
  2025-04-23 14:09 ` [PATCH v2 2/4] parted: add support for gpt-location Marco Felsch
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Marco Felsch @ 2025-04-23 14:09 UTC (permalink / raw)
  To: barebox

The actual GPT partition entries array can be placed everywhere, only
the GPT header needs to be placed at LBA1. Add support for this feature
to allow platform like i.MX3/5/6 to create a GPT partition table without
overriding the actual barebox image.

Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
---
v2:
- new

 commands/parted.c       |  3 ++-
 common/partitions.c     |  5 +++--
 common/partitions/dos.c |  3 ++-
 common/partitions/efi.c | 15 +++++++++++----
 include/partitions.h    |  5 +++--
 5 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/commands/parted.c b/commands/parted.c
index 68b056a0758a..90cee1ede10e 100644
--- a/commands/parted.c
+++ b/commands/parted.c
@@ -217,13 +217,14 @@ static int do_rmpart(struct block_device *blk, int argc, char *argv[])
 static int do_mklabel(struct block_device *blk, int argc, char *argv[])
 {
 	struct partition_desc *pdesc;
+	uint64_t gpt_location = 2;
 
 	if (argc < 2) {
 		printf("Error: Expecting a disk label type.\n");
 		return -EINVAL;
 	}
 
-	pdesc = partition_table_new(blk, argv[1]);
+	pdesc = partition_table_new(blk, argv[1], gpt_location);
 	if (IS_ERR(pdesc)) {
 		printf("Error: Cannot create partition table: %pe\n", pdesc);
 		return PTR_ERR(pdesc);
diff --git a/common/partitions.c b/common/partitions.c
index bc90f51f6112..ec50368c3e98 100644
--- a/common/partitions.c
+++ b/common/partitions.c
@@ -101,7 +101,8 @@ static struct partition_parser *partition_parser_get_by_filetype(uint8_t *buf)
 	return NULL;
 }
 
-struct partition_desc *partition_table_new(struct block_device *blk, const char *type)
+struct partition_desc *
+partition_table_new(struct block_device *blk, const char *type, sector_t gpt_location)
 {
 	struct partition_desc *pdesc;
 	struct partition_parser *parser;
@@ -116,7 +117,7 @@ struct partition_desc *partition_table_new(struct block_device *blk, const char
 	return ERR_PTR(-ENOSYS);
 
 found:
-	pdesc = parser->create(blk);
+	pdesc = parser->create(blk, gpt_location);
 	if (IS_ERR(pdesc))
 		return ERR_CAST(pdesc);
 
diff --git a/common/partitions/dos.c b/common/partitions/dos.c
index 6204fdabc81f..fcd43bf6aaa8 100644
--- a/common/partitions/dos.c
+++ b/common/partitions/dos.c
@@ -316,7 +316,8 @@ static void dos_partition_free(struct partition_desc *pd)
 	free(pd);
 }
 
-static __maybe_unused struct partition_desc *dos_partition_create_table(struct block_device *blk)
+static __maybe_unused struct partition_desc *
+dos_partition_create_table(struct block_device *blk, sector_t gpt_location)
 {
 	struct dos_partition_desc *dpd = xzalloc(512);
 
diff --git a/common/partitions/efi.c b/common/partitions/efi.c
index 840d6a83b795..8f9f9665c75b 100644
--- a/common/partitions/efi.c
+++ b/common/partitions/efi.c
@@ -579,11 +579,18 @@ static void efi_partition_free(struct partition_desc *pd)
 	free(epd);
 }
 
-static __maybe_unused struct partition_desc *efi_partition_create_table(struct block_device *blk)
+static __maybe_unused struct partition_desc *
+efi_partition_create_table(struct block_device *blk, sector_t gpt_location)
 {
 	struct efi_partition_desc *epd = xzalloc(sizeof(*epd));
 	gpt_header *gpt;
 
+	if (gpt_location < 2) {
+		pr_err("Invalid starting LBA (%llu) of array of partition entries\n",
+		       gpt_location);
+		return ERR_PTR(-EINVAL);
+	}
+
 	partition_desc_init(&epd->pd, blk);
 
 	epd->gpt = xzalloc(512);
@@ -594,10 +601,10 @@ static __maybe_unused struct partition_desc *efi_partition_create_table(struct b
 	gpt->header_size = cpu_to_le32(sizeof(*gpt));
 	gpt->my_lba = cpu_to_le64(1);
 	gpt->alternate_lba = cpu_to_le64(last_lba(blk));
-	gpt->first_usable_lba = cpu_to_le64(34);
+	gpt->first_usable_lba = cpu_to_le64(gpt_location + 32);
 	gpt->last_usable_lba = cpu_to_le64(last_lba(blk) - 34);;
 	generate_random_guid((unsigned char *)&gpt->disk_guid);
-	gpt->partition_entry_lba = cpu_to_le64(2);
+	gpt->partition_entry_lba = cpu_to_le64(gpt_location);
 	gpt->num_partition_entries = cpu_to_le32(128);
 	gpt->sizeof_partition_entry = cpu_to_le32(sizeof(gpt_entry));
 
@@ -710,7 +717,7 @@ static int efi_protective_mbr(struct block_device *blk)
 	struct partition_desc *pdesc;
 	int ret;
 
-	pdesc = partition_table_new(blk, "msdos");
+	pdesc = partition_table_new(blk, "msdos", 0);
 	if (IS_ERR(pdesc)) {
 		printf("Error: Cannot create partition table: %pe\n", pdesc);
 		return PTR_ERR(pdesc);
diff --git a/include/partitions.h b/include/partitions.h
index 785fb77ab167..f893f94b259f 100644
--- a/include/partitions.h
+++ b/include/partitions.h
@@ -41,7 +41,7 @@ struct partition_desc {
 struct partition_parser {
 	struct partition_desc *(*parse)(void *buf, struct block_device *blk);
 	void (*partition_free)(struct partition_desc *pd);
-	struct partition_desc *(*create)(struct block_device *blk);
+	struct partition_desc *(*create)(struct block_device *blk, sector_t gpt_location);
 	int (*mkpart)(struct partition_desc *pd, const char *name, const char *fs_type,
 		      uint64_t start, uint64_t end);
 	int (*rmpart)(struct partition_desc *pd, struct partition *part);
@@ -58,7 +58,8 @@ struct partition_parser {
 void partition_desc_init(struct partition_desc *pd, struct block_device *blk);
 int partition_parser_register(struct partition_parser *p);
 struct partition_desc *partition_table_read(struct block_device *blk);
-struct partition_desc *partition_table_new(struct block_device *blk, const char *type);
+struct partition_desc *
+partition_table_new(struct block_device *blk, const char *type, sector_t gpt_location);
 int partition_table_write(struct partition_desc *pdesc);
 int partition_create(struct partition_desc *pdesc, const char *name,
 		     const char *fs_type, uint64_t lba_start, uint64_t lba_end);
-- 
2.39.5




^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2025-04-23 17:41 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-04-23 14:09 [PATCH v2 1/4] partitions: efi: add support to specify gpt-location Marco Felsch
2025-04-23 14:09 ` [PATCH v2 2/4] parted: add support for gpt-location Marco Felsch
2025-04-23 14:09 ` [PATCH v2 3/4] defaultenv-2: add support to automatically create an initial GPT table Marco Felsch
2025-04-23 14:09 ` [PATCH v2 4/4] ARM: riotboard: drop static barebox-environment handling Marco Felsch

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox