[U-Boot] [PATCH v2 3/3] efi_loader: remove block device details from efi file

AKASHI Takahiro takahiro.akashi at linaro.org
Thu Nov 15 04:58:10 UTC 2018


Logically, details on u-boot block device used to implement efi file
protocol are mostly unnecessary, as well as being duplicated, in
efi_file structure.
Moreover, a newly introduced flag, _EFI_DISK_FLAG_INVALID, should be
honored in any file operations via efi file protocol.
These observation suggests that those internal details be set behind
efi_disk object.

So rework in this patch addresses all those issues above although
there is little change in its functionality.

Signed-off-by: AKASHI Takahiro <takahiro.akashi at linaro.org>
---
 include/efi_loader.h      |  6 +++++-
 lib/efi_loader/efi_disk.c | 38 ++++++++++++++++++++++++++++++++++++--
 lib/efi_loader/efi_file.c | 21 ++++++++-------------
 3 files changed, 49 insertions(+), 16 deletions(-)

diff --git a/include/efi_loader.h b/include/efi_loader.h
index 3bae1844befb..108ef3fe52ee 100644
--- a/include/efi_loader.h
+++ b/include/efi_loader.h
@@ -264,6 +264,10 @@ efi_status_t efi_disk_register(void);
 bool efi_disk_is_valid(efi_handle_t handle);
 /* Called by bootefi to find and update disk storage information */
 efi_status_t efi_disk_update(void);
+/* Called by file protocol to set internal block io device */
+int efi_disk_set_blk_dev(efi_handle_t disk);
+/* Called by file protocol to get disk/partition information */
+int efi_disk_get_info(efi_handle_t disk, disk_partition_t *part);
 /* Create handles and protocols for the partitions of a block device */
 int efi_disk_create_partitions(efi_handle_t parent, struct blk_desc *desc,
 			       const char *if_typename, int diskid,
@@ -355,7 +359,7 @@ void efi_signal_event(struct efi_event *event, bool check_tpl);
 
 /* open file system: */
 struct efi_simple_file_system_protocol *efi_simple_file_system(
-		struct blk_desc *desc, int part, struct efi_device_path *dp);
+		efi_handle_t disk);
 
 /* open file from device-path: */
 struct efi_file_handle *efi_file_from_path(struct efi_device_path *fp);
diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c
index 0c4d79ee3fc9..180e8e10bb28 100644
--- a/lib/efi_loader/efi_disk.c
+++ b/lib/efi_loader/efi_disk.c
@@ -9,6 +9,7 @@
 #include <blk.h>
 #include <dm.h>
 #include <efi_loader.h>
+#include <fs.h>
 #include <part.h>
 #include <malloc.h>
 
@@ -254,6 +255,40 @@ efi_fs_from_path(struct efi_device_path *full_path)
 	return handler->protocol_interface;
 }
 
+/*
+ * Set block device for later block io's from file system protocol
+ *
+ * @disk	handle to uefi disk device
+ * @return	0 for success, -1 for failure
+ */
+int efi_disk_set_blk_dev(efi_handle_t disk)
+{
+	struct efi_disk_obj *diskobj;
+
+	diskobj = container_of(disk, struct efi_disk_obj, header);
+
+	return fs_set_blk_dev_with_part(diskobj->desc, diskobj->part);
+}
+
+/*
+ * Get disk/partition information
+ *
+ * @disk	handle to uefi disk device
+ * @part	pointer to disk/partition information to be returned
+ * @return	0 for success, -1 for failure
+ */
+int efi_disk_get_info(efi_handle_t disk, disk_partition_t *part)
+{
+	struct efi_disk_obj *diskobj;
+
+	diskobj = container_of(disk, struct efi_disk_obj, header);
+
+	if (diskobj->part >= 1)
+		return part_get_info(diskobj->desc, diskobj->part, part);
+	else
+		return part_get_info_whole_disk(diskobj->desc, part);
+}
+
 /*
  * Create a handle for a partition or disk
  *
@@ -308,8 +343,7 @@ static efi_status_t efi_disk_add_dev(
 	if (ret != EFI_SUCCESS)
 		return ret;
 	if (part >= 1) {
-		diskobj->volume = efi_simple_file_system(desc, part,
-							 diskobj->dp);
+		diskobj->volume = efi_simple_file_system(&diskobj->header);
 		ret = efi_add_protocol(&diskobj->header,
 				       &efi_simple_file_system_protocol_guid,
 				       diskobj->volume);
diff --git a/lib/efi_loader/efi_file.c b/lib/efi_loader/efi_file.c
index beb4fba917d8..944383224f30 100644
--- a/lib/efi_loader/efi_file.c
+++ b/lib/efi_loader/efi_file.c
@@ -17,9 +17,7 @@ const efi_guid_t efi_file_system_info_guid = EFI_FILE_SYSTEM_INFO_GUID;
 
 struct file_system {
 	struct efi_simple_file_system_protocol base;
-	struct efi_device_path *dp;
-	struct blk_desc *desc;
-	int part;
+	efi_handle_t disk;
 };
 #define to_fs(x) container_of(x, struct file_system, base)
 
@@ -49,7 +47,10 @@ static char *basename(struct file_handle *fh)
 
 static int set_blk_dev(struct file_handle *fh)
 {
-	return fs_set_blk_dev_with_part(fh->fs->desc, fh->fs->part);
+	if (!efi_disk_is_valid(fh->fs->disk))
+		return -1;
+
+	return efi_disk_set_blk_dev(fh->fs->disk);
 }
 
 /**
@@ -570,10 +571,7 @@ static efi_status_t EFIAPI efi_file_getinfo(struct efi_file_handle *file,
 		efi_uintn_t required_size;
 		int r;
 
-		if (fh->fs->part >= 1)
-			r = part_get_info(fh->fs->desc, fh->fs->part, &part);
-		else
-			r = part_get_info_whole_disk(fh->fs->desc, &part);
+		r = efi_disk_get_info(fh->fs->disk, &part);
 		if (r < 0) {
 			ret = EFI_DEVICE_ERROR;
 			goto error;
@@ -694,17 +692,14 @@ efi_open_volume(struct efi_simple_file_system_protocol *this,
 }
 
 struct efi_simple_file_system_protocol *
-efi_simple_file_system(struct blk_desc *desc, int part,
-		       struct efi_device_path *dp)
+efi_simple_file_system(efi_handle_t disk)
 {
 	struct file_system *fs;
 
 	fs = calloc(1, sizeof(*fs));
 	fs->base.rev = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION;
 	fs->base.open_volume = efi_open_volume;
-	fs->desc = desc;
-	fs->part = part;
-	fs->dp = dp;
+	fs->disk = disk;
 
 	return &fs->base;
 }
-- 
2.19.0



More information about the U-Boot mailing list