From: Rob Clark <robdclark@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v0 08/20] efi_loader: add back optional efi_handler::open()
Date: Fri, 4 Aug 2017 15:31:50 -0400 [thread overview]
Message-ID: <20170804193205.24669-9-robdclark@gmail.com> (raw)
In-Reply-To: <20170804193205.24669-1-robdclark@gmail.com>
In some cases it is useful to defer creation of the protocol interface
object. So add back an optional ->open() hook that is used if
protcol_interface is NULL.
I've slightly simplified the fxn ptr signature to remove unneeded args,
and so compiler will complain if patches that used the "old way" are,
and which do not need this extra complexity, are rebased.
Signed-off-by: Rob Clark <robdclark@gmail.com>
---
include/efi_loader.h | 12 +++++++++++-
lib/efi_loader/efi_boottime.c | 30 ++++++++++++++++++++++++------
2 files changed, 35 insertions(+), 7 deletions(-)
diff --git a/include/efi_loader.h b/include/efi_loader.h
index 037cc7c543..03c4ed5e1c 100644
--- a/include/efi_loader.h
+++ b/include/efi_loader.h
@@ -70,10 +70,17 @@ extern unsigned int __efi_runtime_rel_start, __efi_runtime_rel_stop;
/*
* When the UEFI payload wants to open a protocol on an object to get its
* interface (usually a struct with callback functions), this struct maps the
- * protocol GUID to the respective protocol interface */
+ * protocol GUID to the respective protocol interface.
+ *
+ * The optional ->open() fxn can be used for cases where the protocol
+ * interface is constructed on-demand, and is called if protocol_interface
+ * is NULL.
+ */
struct efi_handler {
const efi_guid_t *guid;
void *protocol_interface;
+ efi_status_t (EFIAPI *open)(void *handle, const efi_guid_t *protocol,
+ void **protocol_interface);
};
/*
@@ -191,6 +198,9 @@ uint64_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type,
int efi_memory_init(void);
/* Adds new or overrides configuration table entry to the system table */
efi_status_t efi_install_configuration_table(const efi_guid_t *guid, void *table);
+efi_status_t efi_get_protocol(struct efi_object *efiobj,
+ struct efi_handler *handler,
+ void **protocol_interface);
#ifdef CONFIG_EFI_LOADER_BOUNCE_BUFFER
extern void *efi_bounce_buffer;
diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
index 59479eddb9..4b78f6d556 100644
--- a/lib/efi_loader/efi_boottime.c
+++ b/lib/efi_loader/efi_boottime.c
@@ -1004,6 +1004,23 @@ out:
return EFI_EXIT(r);
}
+efi_status_t efi_get_protocol(struct efi_object *efiobj,
+ struct efi_handler *handler,
+ void **protocol_interface)
+{
+ efi_status_t ret = EFI_SUCCESS;
+
+ if (!handler->protocol_interface) {
+ ret = handler->open(efiobj->handle,
+ handler->guid,
+ &handler->protocol_interface);
+ }
+ *protocol_interface =
+ handler->protocol_interface;
+
+ return ret;
+}
+
static efi_status_t EFIAPI efi_locate_protocol(efi_guid_t *protocol,
void *registration,
void **protocol_interface)
@@ -1026,9 +1043,10 @@ static efi_status_t EFIAPI efi_locate_protocol(efi_guid_t *protocol,
if (!handler->guid)
continue;
if (!guidcmp(handler->guid, protocol)) {
- *protocol_interface =
- handler->protocol_interface;
- return EFI_EXIT(EFI_SUCCESS);
+ efi_status_t ret;
+ ret = efi_get_protocol(efiobj, handler,
+ protocol_interface);
+ return EFI_EXIT(ret);
}
}
}
@@ -1162,12 +1180,12 @@ static efi_status_t EFIAPI efi_open_protocol(
if (!hprotocol)
continue;
if (!guidcmp(hprotocol, protocol)) {
+ r = EFI_SUCCESS;
if (attributes !=
EFI_OPEN_PROTOCOL_TEST_PROTOCOL) {
- *protocol_interface =
- handler->protocol_interface;
+ r = efi_get_protocol(efiobj, handler,
+ protocol_interface);
}
- r = EFI_SUCCESS;
goto out;
}
}
--
2.13.0
next prev parent reply other threads:[~2017-08-04 19:31 UTC|newest]
Thread overview: 116+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-04 19:31 [U-Boot] [PATCH v0 00/20] enough UEFI for standard distro boot Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 01/20] fs: add fs_readdir() Rob Clark
2017-08-07 18:19 ` Brüns, Stefan
2017-08-07 19:11 ` Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 02/20] fs/fat: implement readdir Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 03/20] short-wchar Rob Clark
2017-08-04 20:28 ` Heinrich Schuchardt
2017-08-04 20:36 ` Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 04/20] part: extract MBR signature from partitions Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 05/20] efi: add some more device path structures Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 06/20] common: add some utf16 handling helpers Rob Clark
2017-08-06 5:17 ` Simon Glass
2017-08-08 22:50 ` [U-Boot] [U-Boot, v0, " Heinrich Schuchardt
2017-08-08 23:21 ` Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 07/20] vsprintf.c: add wide string (%ls) support Rob Clark
2017-08-08 22:03 ` [U-Boot] [U-Boot, v0, " Heinrich Schuchardt
2017-08-08 22:44 ` Rob Clark
2017-08-08 23:08 ` Heinrich Schuchardt
2017-08-08 23:20 ` Alexander Graf
2017-08-08 23:39 ` Rob Clark
2017-08-08 23:55 ` Alexander Graf
2017-08-09 0:14 ` Rob Clark
2017-08-09 1:14 ` Rob Clark
2017-08-09 11:27 ` Tom Rini
2017-08-10 2:16 ` rick at andestech.com
2017-08-09 8:50 ` Peter Robinson
2017-08-08 22:52 ` Rob Clark
2017-08-09 13:38 ` Rob Clark
2017-08-09 13:48 ` Alexander Graf
2017-08-09 14:35 ` Rob Clark
2017-08-04 19:31 ` Rob Clark [this message]
2017-08-04 19:31 ` [U-Boot] [PATCH v0 09/20] efi_loader: add device-path utils Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 10/20] efi_loader: drop redundant efi_device_path_protocol Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 11/20] efi_loader: add guidstr helper Rob Clark
2017-08-05 19:33 ` Heinrich Schuchardt
2017-08-05 19:56 ` Rob Clark
2017-08-05 20:18 ` Heinrich Schuchardt
2017-08-04 19:31 ` [U-Boot] [PATCH v0 12/20] efi_loader: flesh out device-path to text Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 13/20] efi_loader: use proper device-paths for partitions Rob Clark
2017-08-04 20:41 ` Mark Kettenis
2017-08-04 20:57 ` Rob Clark
2017-08-05 14:01 ` Mark Kettenis
2017-08-05 14:19 ` Rob Clark
2017-08-05 14:28 ` Mark Kettenis
2017-08-05 14:35 ` Rob Clark
2017-08-05 15:08 ` Mark Kettenis
2017-08-05 15:22 ` Rob Clark
2017-08-05 16:02 ` Heinrich Schuchardt
2017-08-05 16:13 ` Rob Clark
2017-08-05 15:10 ` Heinrich Schuchardt
2017-08-05 15:24 ` Rob Clark
2017-08-05 15:36 ` Rob Clark
2017-08-06 13:16 ` Mark Kettenis
2017-08-06 14:17 ` Rob Clark
2017-08-06 14:26 ` Rob Clark
2017-08-06 14:28 ` Mark Kettenis
2017-08-06 14:45 ` Rob Clark
2017-08-06 15:34 ` Rob Clark
2017-08-06 16:00 ` Heinrich Schuchardt
2017-08-06 16:14 ` Jonathan Gray
2017-08-06 17:28 ` Mark Kettenis
2017-08-06 17:49 ` Rob Clark
2017-08-06 18:13 ` Peter Robinson
2017-08-06 18:21 ` Mark Kettenis
2017-08-06 18:37 ` Mark Kettenis
2017-08-06 18:47 ` Rob Clark
2017-08-06 18:53 ` Rob Clark
2017-08-06 18:41 ` Rob Clark
2017-08-07 15:47 ` Jonathan Gray
2017-08-07 16:16 ` Rob Clark
2017-08-08 1:36 ` Jonathan Gray
2017-08-05 14:28 ` Rob Clark
2017-08-06 12:53 ` Mark Kettenis
2017-08-07 17:32 ` Peter Jones
2017-08-04 19:31 ` [U-Boot] [PATCH v0 14/20] efi_loader: use proper device-paths for net Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 15/20] efi_loader: refactor boot device and loaded_image handling Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 16/20] efi_loader: add file/filesys support Rob Clark
2017-08-04 19:31 ` [U-Boot] [PATCH v0 17/20] efi_loader: support load_image() from a file-path Rob Clark
2017-08-04 19:32 ` [U-Boot] [PATCH v0 18/20] efi_loader: make pool allocations cacheline aligned Rob Clark
2017-08-04 19:32 ` [U-Boot] [PATCH v0 19/20] efi_loader: efi variable support Rob Clark
2017-08-06 5:17 ` Simon Glass
2017-08-04 19:32 ` [U-Boot] [PATCH v0 20/20] efi_loader: add bootmgr Rob Clark
2017-08-04 20:06 ` Heinrich Schuchardt
2017-08-04 20:28 ` Rob Clark
2017-08-04 20:29 ` Rob Clark
2017-08-04 22:46 ` Peter Jones
2017-08-05 15:58 ` [U-Boot] [PATCH v0 21/20] efi_loader: hack for archs that cannot do unaligned accesses Rob Clark
2017-08-05 16:12 ` Heinrich Schuchardt
2017-08-05 16:16 ` Rob Clark
2017-08-05 16:19 ` Rob Clark
2017-08-05 16:26 ` Heinrich Schuchardt
2017-08-05 16:46 ` Rob Clark
2017-08-05 16:52 ` Heinrich Schuchardt
2017-08-05 17:06 ` Rob Clark
2017-08-05 18:43 ` Rob Clark
2017-08-05 20:05 ` Heinrich Schuchardt
2017-08-05 20:31 ` Rob Clark
2017-08-07 20:19 ` Alexander Graf
2017-08-07 21:14 ` Mark Kettenis
2017-08-07 22:18 ` Rob Clark
2017-08-08 6:52 ` Alexander Graf
2017-08-08 8:11 ` Ard Biesheuvel
2017-08-08 11:32 ` Leif Lindholm
2017-08-08 12:01 ` Rob Clark
2017-08-08 12:39 ` Leif Lindholm
2017-08-08 9:27 ` Rob Clark
2017-08-08 12:26 ` Mark Kettenis
2017-08-08 12:54 ` Rob Clark
2017-08-08 13:33 ` Mark Kettenis
2017-08-08 14:03 ` Rob Clark
2017-08-08 14:10 ` Rob Clark
2017-08-08 18:20 ` Rob Clark
2017-08-07 16:56 ` Rob Clark
2017-08-07 17:15 ` Peter Jones
2017-08-10 1:32 ` [U-Boot] [PATCH v0 00/20] enough UEFI for standard distro boot Tom Rini
2017-08-10 10:41 ` Rob Clark
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170804193205.24669-9-robdclark@gmail.com \
--to=robdclark@gmail.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox