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

AKASHI Takahiro
2018-11-15T04:58:10Z

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@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