Re: [PATCH v2 3/3] efi: Avoid using dm_scan_other()

2023-12-26 Thread Simon Glass
Hi Heinrich,

On Mon, Dec 18, 2023 at 3:02 PM Simon Glass  wrote:
>
> Hi Heinrich,
>
> On Sat, 16 Dec 2023 at 14:02, Heinrich Schuchardt  wrote:
> >
> > On 12/16/23 21:46, Simon Glass wrote:
> > > Hi,
> > >
> > > On Tue, 21 Nov 2023 at 06:21, Tom Rini  wrote:
> > >>
> > >> On Tue, Nov 21, 2023 at 01:18:09PM +0100, Heinrich Schuchardt wrote:
> > >>> On 11/12/23 21:55, Simon Glass wrote:
> >  This function is defined by bootstd so using it precludes using that
> >  feature. Use the board_early_init_r() feature instead.
> > 
> >  This requires moving quite a lot of code into the board directory, butt
> >  this is the normal place for code called by board_early_init_r()
> > 
> >  Signed-off-by: Simon Glass 
> >  ---
> > 
> >  Changes in v2:
> >  - Drop duplicate acpi_xsdt patch
> >  - Put the board_early_init_r code into board/
> > 
> > board/efi/efi-x86_app/Makefile  |   5 +
> > board/efi/efi-x86_app/efi_app.c | 205 
> >  
> > >>>
> > >>> Our target should be to enable building the EFI app on all 
> > >>> architectures.
> > >>>
> > >>> Only x86 specific code should be added to 
> > >>> board/efi/efi-x86_app/efi_app.c.
> > >>
> > >> A later enhancement to make U-Boot as an EFI app more generic would be
> > >> good, but outside the scope of this patch which is moving generic code
> > >> out from "lib" and in to "board".
> >
> > I cannot see that this patch is moving any code our of lib/.
> >
> > But why should we move generic code into board?
>
> It isn't really generic
>
> >
> > >
> > > This patch was marked as old /archived in patchwork so has been
> > > forgotten. I have marked it new and non-archived in the hope that it
> > > can be applied to -master soon.
> >
> > There is nothing x86 specific about the code. Generic code should be in
> > lib/. Please, provide a new version of the patch.
> >
> > >
> > > I believe that having the EFI app support bootstd could be a useful 
> > > addition.
> >
> > That was not disputed.

OK, I see now that your objection was putting it into board/ so I sent
a new patch for that.

It is very strange to have board_early_init_r() calling code in lib
though. We should think of a better way.

Regards,
SImon


Re: [PATCH v2 3/3] efi: Avoid using dm_scan_other()

2023-12-18 Thread Simon Glass
Hi Heinrich,

On Sat, 16 Dec 2023 at 14:02, Heinrich Schuchardt  wrote:
>
> On 12/16/23 21:46, Simon Glass wrote:
> > Hi,
> >
> > On Tue, 21 Nov 2023 at 06:21, Tom Rini  wrote:
> >>
> >> On Tue, Nov 21, 2023 at 01:18:09PM +0100, Heinrich Schuchardt wrote:
> >>> On 11/12/23 21:55, Simon Glass wrote:
>  This function is defined by bootstd so using it precludes using that
>  feature. Use the board_early_init_r() feature instead.
> 
>  This requires moving quite a lot of code into the board directory, butt
>  this is the normal place for code called by board_early_init_r()
> 
>  Signed-off-by: Simon Glass 
>  ---
> 
>  Changes in v2:
>  - Drop duplicate acpi_xsdt patch
>  - Put the board_early_init_r code into board/
> 
> board/efi/efi-x86_app/Makefile  |   5 +
> board/efi/efi-x86_app/efi_app.c | 205 
> >>>
> >>> Our target should be to enable building the EFI app on all architectures.
> >>>
> >>> Only x86 specific code should be added to board/efi/efi-x86_app/efi_app.c.
> >>
> >> A later enhancement to make U-Boot as an EFI app more generic would be
> >> good, but outside the scope of this patch which is moving generic code
> >> out from "lib" and in to "board".
>
> I cannot see that this patch is moving any code our of lib/.
>
> But why should we move generic code into board?

It isn't really generic

>
> >
> > This patch was marked as old /archived in patchwork so has been
> > forgotten. I have marked it new and non-archived in the hope that it
> > can be applied to -master soon.
>
> There is nothing x86 specific about the code. Generic code should be in
> lib/. Please, provide a new version of the patch.
>
> >
> > I believe that having the EFI app support bootstd could be a useful 
> > addition.
>
> That was not disputed.
>
> Best regards
>
> Heinrich


Re: [PATCH v2 3/3] efi: Avoid using dm_scan_other()

2023-12-16 Thread Heinrich Schuchardt



Am 16. Dezember 2023 23:14:20 MEZ schrieb Tom Rini :
>On Sat, Dec 16, 2023 at 09:57:41PM +0100, Heinrich Schuchardt wrote:
>> On 12/16/23 21:46, Simon Glass wrote:
>> > Hi,
>> > 
>> > On Tue, 21 Nov 2023 at 06:21, Tom Rini  wrote:
>> > > 
>> > > On Tue, Nov 21, 2023 at 01:18:09PM +0100, Heinrich Schuchardt wrote:
>> > > > On 11/12/23 21:55, Simon Glass wrote:
>> > > > > This function is defined by bootstd so using it precludes using that
>> > > > > feature. Use the board_early_init_r() feature instead.
>> > > > > 
>> > > > > This requires moving quite a lot of code into the board directory, 
>> > > > > butt
>> > > > > this is the normal place for code called by board_early_init_r()
>> > > > > 
>> > > > > Signed-off-by: Simon Glass 
>> > > > > ---
>> > > > > 
>> > > > > Changes in v2:
>> > > > > - Drop duplicate acpi_xsdt patch
>> > > > > - Put the board_early_init_r code into board/
>> > > > > 
>> > > > >board/efi/efi-x86_app/Makefile  |   5 +
>> > > > >board/efi/efi-x86_app/efi_app.c | 205 
>> > > > > 
>> > > > 
>> > > > Our target should be to enable building the EFI app on all 
>> > > > architectures.
>> > > > 
>> > > > Only x86 specific code should be added to 
>> > > > board/efi/efi-x86_app/efi_app.c.
>> > > 
>> > > A later enhancement to make U-Boot as an EFI app more generic would be
>> > > good, but outside the scope of this patch which is moving generic code
>> > > out from "lib" and in to "board".
>> 
>> I cannot see that this patch is moving any code our of lib/.
>> 
>> But why should we move generic code into board?
>> 
>> > 
>> > This patch was marked as old /archived in patchwork so has been
>> > forgotten. I have marked it new and non-archived in the hope that it
>> > can be applied to -master soon.
>> 
>> There is nothing x86 specific about the code. Generic code should be in
>> lib/. Please, provide a new version of the patch.
>
>It's not generic EFI code, it's generic "U-Boot as EFI application" code
>and so the whole "board" needs a bit of a clean and re-work as we all
>agree that there shouldn't be anything architecture specific about it,
>only building the binary for the correct architecture. However, we just
>aren't well structured to support that right now. Where on the list of
>priorities does that have to fall rather than just allowing for
>functionality to be tested / used? There's not yet IIRC efi-arm64_app
>but what we have today (and would have had with Simon's patch) should
>have just built and worked.
>

We have /lib/efi/ for that code.

Regards

Heinrich


Re: [PATCH v2 3/3] efi: Avoid using dm_scan_other()

2023-12-16 Thread Tom Rini
On Sat, Dec 16, 2023 at 09:57:41PM +0100, Heinrich Schuchardt wrote:
> On 12/16/23 21:46, Simon Glass wrote:
> > Hi,
> > 
> > On Tue, 21 Nov 2023 at 06:21, Tom Rini  wrote:
> > > 
> > > On Tue, Nov 21, 2023 at 01:18:09PM +0100, Heinrich Schuchardt wrote:
> > > > On 11/12/23 21:55, Simon Glass wrote:
> > > > > This function is defined by bootstd so using it precludes using that
> > > > > feature. Use the board_early_init_r() feature instead.
> > > > > 
> > > > > This requires moving quite a lot of code into the board directory, 
> > > > > butt
> > > > > this is the normal place for code called by board_early_init_r()
> > > > > 
> > > > > Signed-off-by: Simon Glass 
> > > > > ---
> > > > > 
> > > > > Changes in v2:
> > > > > - Drop duplicate acpi_xsdt patch
> > > > > - Put the board_early_init_r code into board/
> > > > > 
> > > > >board/efi/efi-x86_app/Makefile  |   5 +
> > > > >board/efi/efi-x86_app/efi_app.c | 205 
> > > > > 
> > > > 
> > > > Our target should be to enable building the EFI app on all 
> > > > architectures.
> > > > 
> > > > Only x86 specific code should be added to 
> > > > board/efi/efi-x86_app/efi_app.c.
> > > 
> > > A later enhancement to make U-Boot as an EFI app more generic would be
> > > good, but outside the scope of this patch which is moving generic code
> > > out from "lib" and in to "board".
> 
> I cannot see that this patch is moving any code our of lib/.
> 
> But why should we move generic code into board?
> 
> > 
> > This patch was marked as old /archived in patchwork so has been
> > forgotten. I have marked it new and non-archived in the hope that it
> > can be applied to -master soon.
> 
> There is nothing x86 specific about the code. Generic code should be in
> lib/. Please, provide a new version of the patch.

It's not generic EFI code, it's generic "U-Boot as EFI application" code
and so the whole "board" needs a bit of a clean and re-work as we all
agree that there shouldn't be anything architecture specific about it,
only building the binary for the correct architecture. However, we just
aren't well structured to support that right now. Where on the list of
priorities does that have to fall rather than just allowing for
functionality to be tested / used? There's not yet IIRC efi-arm64_app
but what we have today (and would have had with Simon's patch) should
have just built and worked.

-- 
Tom


signature.asc
Description: PGP signature


Re: [PATCH v2 3/3] efi: Avoid using dm_scan_other()

2023-12-16 Thread Heinrich Schuchardt

On 12/16/23 21:46, Simon Glass wrote:

Hi,

On Tue, 21 Nov 2023 at 06:21, Tom Rini  wrote:


On Tue, Nov 21, 2023 at 01:18:09PM +0100, Heinrich Schuchardt wrote:

On 11/12/23 21:55, Simon Glass wrote:

This function is defined by bootstd so using it precludes using that
feature. Use the board_early_init_r() feature instead.

This requires moving quite a lot of code into the board directory, butt
this is the normal place for code called by board_early_init_r()

Signed-off-by: Simon Glass 
---

Changes in v2:
- Drop duplicate acpi_xsdt patch
- Put the board_early_init_r code into board/

   board/efi/efi-x86_app/Makefile  |   5 +
   board/efi/efi-x86_app/efi_app.c | 205 


Our target should be to enable building the EFI app on all architectures.

Only x86 specific code should be added to board/efi/efi-x86_app/efi_app.c.


A later enhancement to make U-Boot as an EFI app more generic would be
good, but outside the scope of this patch which is moving generic code
out from "lib" and in to "board".


I cannot see that this patch is moving any code our of lib/.

But why should we move generic code into board?



This patch was marked as old /archived in patchwork so has been
forgotten. I have marked it new and non-archived in the hope that it
can be applied to -master soon.


There is nothing x86 specific about the code. Generic code should be in
lib/. Please, provide a new version of the patch.



I believe that having the EFI app support bootstd could be a useful addition.


That was not disputed.

Best regards

Heinrich


Re: [PATCH v2 3/3] efi: Avoid using dm_scan_other()

2023-12-16 Thread Simon Glass
Hi,

On Tue, 21 Nov 2023 at 06:21, Tom Rini  wrote:
>
> On Tue, Nov 21, 2023 at 01:18:09PM +0100, Heinrich Schuchardt wrote:
> > On 11/12/23 21:55, Simon Glass wrote:
> > > This function is defined by bootstd so using it precludes using that
> > > feature. Use the board_early_init_r() feature instead.
> > >
> > > This requires moving quite a lot of code into the board directory, butt
> > > this is the normal place for code called by board_early_init_r()
> > >
> > > Signed-off-by: Simon Glass 
> > > ---
> > >
> > > Changes in v2:
> > > - Drop duplicate acpi_xsdt patch
> > > - Put the board_early_init_r code into board/
> > >
> > >   board/efi/efi-x86_app/Makefile  |   5 +
> > >   board/efi/efi-x86_app/efi_app.c | 205 
> >
> > Our target should be to enable building the EFI app on all architectures.
> >
> > Only x86 specific code should be added to board/efi/efi-x86_app/efi_app.c.
>
> A later enhancement to make U-Boot as an EFI app more generic would be
> good, but outside the scope of this patch which is moving generic code
> out from "lib" and in to "board".

This patch was marked as old /archived in patchwork so has been
forgotten. I have marked it new and non-archived in the hope that it
can be applied to -master soon.

I believe that having the EFI app support bootstd could be a useful addition.

Regards,
Simon


Re: [PATCH v2 3/3] efi: Avoid using dm_scan_other()

2023-11-21 Thread Tom Rini
On Tue, Nov 21, 2023 at 01:18:09PM +0100, Heinrich Schuchardt wrote:
> On 11/12/23 21:55, Simon Glass wrote:
> > This function is defined by bootstd so using it precludes using that
> > feature. Use the board_early_init_r() feature instead.
> > 
> > This requires moving quite a lot of code into the board directory, butt
> > this is the normal place for code called by board_early_init_r()
> > 
> > Signed-off-by: Simon Glass 
> > ---
> > 
> > Changes in v2:
> > - Drop duplicate acpi_xsdt patch
> > - Put the board_early_init_r code into board/
> > 
> >   board/efi/efi-x86_app/Makefile  |   5 +
> >   board/efi/efi-x86_app/efi_app.c | 205 
> 
> Our target should be to enable building the EFI app on all architectures.
> 
> Only x86 specific code should be added to board/efi/efi-x86_app/efi_app.c.

A later enhancement to make U-Boot as an EFI app more generic would be
good, but outside the scope of this patch which is moving generic code
out from "lib" and in to "board".

-- 
Tom


signature.asc
Description: PGP signature


Re: [PATCH v2 3/3] efi: Avoid using dm_scan_other()

2023-11-21 Thread Heinrich Schuchardt

On 11/12/23 21:55, Simon Glass wrote:

This function is defined by bootstd so using it precludes using that
feature. Use the board_early_init_r() feature instead.

This requires moving quite a lot of code into the board directory, butt
this is the normal place for code called by board_early_init_r()

Signed-off-by: Simon Glass 
---

Changes in v2:
- Drop duplicate acpi_xsdt patch
- Put the board_early_init_r code into board/

  board/efi/efi-x86_app/Makefile  |   5 +
  board/efi/efi-x86_app/efi_app.c | 205 


Our target should be to enable building the EFI app on all architectures.

Only x86 specific code should be added to board/efi/efi-x86_app/efi_app.c.

Best regards

Heinrich


  configs/efi-x86_app64_defconfig |   1 +
  lib/efi/efi_app.c   | 187 -
  4 files changed, 211 insertions(+), 187 deletions(-)
  create mode 100644 board/efi/efi-x86_app/Makefile
  create mode 100644 board/efi/efi-x86_app/efi_app.c

diff --git a/board/efi/efi-x86_app/Makefile b/board/efi/efi-x86_app/Makefile
new file mode 100644
index ..682f8754b44d
--- /dev/null
+++ b/board/efi/efi-x86_app/Makefile
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Copyright 2023 Google LLC
+
+obj-y  += efi_app.o
diff --git a/board/efi/efi-x86_app/efi_app.c b/board/efi/efi-x86_app/efi_app.c
new file mode 100644
index ..c5e4192fe06c
--- /dev/null
+++ b/board/efi/efi-x86_app/efi_app.c
@@ -0,0 +1,205 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * EFI-app board implementation
+ *
+ * Copyright 2023 Google LLC
+ * Written by Simon Glass 
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/**
+ * efi_bind_block() - bind a new block device to an EFI device
+ *
+ * Binds a new top-level EFI_MEDIA device as well as a child block device so
+ * that the block device can be accessed in U-Boot.
+ *
+ * The device can then be accessed using 'part list efi 0', 'fat ls efi 0:1',
+ * for example, just like any other interface type.
+ *
+ * @handle: handle of the controller on which this driver is installed
+ * @blkio: block io protocol proxied by this driver
+ * @device_path: EFI device path structure for this
+ * @len: Length of @device_path in bytes
+ * @devp: Returns the bound device
+ * Return: 0 if OK, -ve on error
+ */
+int efi_bind_block(efi_handle_t handle, struct efi_block_io *blkio,
+  struct efi_device_path *device_path, int len,
+  struct udevice **devp)
+{
+   struct efi_media_plat plat;
+   struct udevice *dev;
+   char name[18];
+   int ret;
+
+   plat.handle = handle;
+   plat.blkio = blkio;
+   plat.device_path = malloc(device_path->length);
+   if (!plat.device_path)
+   return log_msg_ret("path", -ENOMEM);
+   memcpy(plat.device_path, device_path, device_path->length);
+   ret = device_bind(dm_root(), DM_DRIVER_GET(efi_media), "efi_media",
+ &plat, ofnode_null(), &dev);
+   if (ret)
+   return log_msg_ret("bind", ret);
+
+   snprintf(name, sizeof(name), "efi_media_%x", dev_seq(dev));
+   device_set_name(dev, name);
+   *devp = dev;
+
+   return 0;
+}
+
+/**
+ * devpath_is_partition() - Figure out if a device path is a partition
+ *
+ * Checks if a device path refers to a partition on some media device. This
+ * works by checking for a valid partition number in a hard-driver media device
+ * as the final component of the device path.
+ *
+ * @path:  device path
+ * Return: true if a partition, false if not
+ * (e.g. it might be media which contains partitions)
+ */
+static bool devpath_is_partition(const struct efi_device_path *path)
+{
+   const struct efi_device_path *p;
+   bool was_part = false;
+
+   for (p = path; p->type != DEVICE_PATH_TYPE_END;
+p = (void *)p + p->length) {
+   was_part = false;
+   if (p->type == DEVICE_PATH_TYPE_MEDIA_DEVICE &&
+   p->sub_type == DEVICE_PATH_SUB_TYPE_HARD_DRIVE_PATH) {
+   struct efi_device_path_hard_drive_path *hd =
+   (void *)path;
+
+   if (hd->partition_number)
+   was_part = true;
+   }
+   }
+
+   return was_part;
+}
+
+/**
+ * setup_block() - Find all block devices and setup EFI devices for them
+ *
+ * Partitions are ignored, since U-Boot has partition handling. Errors with
+ * particular devices produce a warning but execution continues to try to
+ * find others.
+ *
+ * Return: 0 if found, -ENOSYS if there is no boot-services table, -ENOTSUPP
+ * if a required protocol is not supported
+ */
+static int setup_block(void)
+{
+   efi_guid_t efi_blkio_guid = EFI_BLOCK_IO_PROTOCOL_GUID;
+   efi_guid_t efi_devpath_guid = EFI_DEVICE_PATH_PROTOCOL_GUID;
+   e

[PATCH v2 3/3] efi: Avoid using dm_scan_other()

2023-11-12 Thread Simon Glass
This function is defined by bootstd so using it precludes using that
feature. Use the board_early_init_r() feature instead.

This requires moving quite a lot of code into the board directory, butt
this is the normal place for code called by board_early_init_r()

Signed-off-by: Simon Glass 
---

Changes in v2:
- Drop duplicate acpi_xsdt patch
- Put the board_early_init_r code into board/

 board/efi/efi-x86_app/Makefile  |   5 +
 board/efi/efi-x86_app/efi_app.c | 205 
 configs/efi-x86_app64_defconfig |   1 +
 lib/efi/efi_app.c   | 187 -
 4 files changed, 211 insertions(+), 187 deletions(-)
 create mode 100644 board/efi/efi-x86_app/Makefile
 create mode 100644 board/efi/efi-x86_app/efi_app.c

diff --git a/board/efi/efi-x86_app/Makefile b/board/efi/efi-x86_app/Makefile
new file mode 100644
index ..682f8754b44d
--- /dev/null
+++ b/board/efi/efi-x86_app/Makefile
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Copyright 2023 Google LLC
+
+obj-y  += efi_app.o
diff --git a/board/efi/efi-x86_app/efi_app.c b/board/efi/efi-x86_app/efi_app.c
new file mode 100644
index ..c5e4192fe06c
--- /dev/null
+++ b/board/efi/efi-x86_app/efi_app.c
@@ -0,0 +1,205 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * EFI-app board implementation
+ *
+ * Copyright 2023 Google LLC
+ * Written by Simon Glass 
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/**
+ * efi_bind_block() - bind a new block device to an EFI device
+ *
+ * Binds a new top-level EFI_MEDIA device as well as a child block device so
+ * that the block device can be accessed in U-Boot.
+ *
+ * The device can then be accessed using 'part list efi 0', 'fat ls efi 0:1',
+ * for example, just like any other interface type.
+ *
+ * @handle: handle of the controller on which this driver is installed
+ * @blkio: block io protocol proxied by this driver
+ * @device_path: EFI device path structure for this
+ * @len: Length of @device_path in bytes
+ * @devp: Returns the bound device
+ * Return: 0 if OK, -ve on error
+ */
+int efi_bind_block(efi_handle_t handle, struct efi_block_io *blkio,
+  struct efi_device_path *device_path, int len,
+  struct udevice **devp)
+{
+   struct efi_media_plat plat;
+   struct udevice *dev;
+   char name[18];
+   int ret;
+
+   plat.handle = handle;
+   plat.blkio = blkio;
+   plat.device_path = malloc(device_path->length);
+   if (!plat.device_path)
+   return log_msg_ret("path", -ENOMEM);
+   memcpy(plat.device_path, device_path, device_path->length);
+   ret = device_bind(dm_root(), DM_DRIVER_GET(efi_media), "efi_media",
+ &plat, ofnode_null(), &dev);
+   if (ret)
+   return log_msg_ret("bind", ret);
+
+   snprintf(name, sizeof(name), "efi_media_%x", dev_seq(dev));
+   device_set_name(dev, name);
+   *devp = dev;
+
+   return 0;
+}
+
+/**
+ * devpath_is_partition() - Figure out if a device path is a partition
+ *
+ * Checks if a device path refers to a partition on some media device. This
+ * works by checking for a valid partition number in a hard-driver media device
+ * as the final component of the device path.
+ *
+ * @path:  device path
+ * Return: true if a partition, false if not
+ * (e.g. it might be media which contains partitions)
+ */
+static bool devpath_is_partition(const struct efi_device_path *path)
+{
+   const struct efi_device_path *p;
+   bool was_part = false;
+
+   for (p = path; p->type != DEVICE_PATH_TYPE_END;
+p = (void *)p + p->length) {
+   was_part = false;
+   if (p->type == DEVICE_PATH_TYPE_MEDIA_DEVICE &&
+   p->sub_type == DEVICE_PATH_SUB_TYPE_HARD_DRIVE_PATH) {
+   struct efi_device_path_hard_drive_path *hd =
+   (void *)path;
+
+   if (hd->partition_number)
+   was_part = true;
+   }
+   }
+
+   return was_part;
+}
+
+/**
+ * setup_block() - Find all block devices and setup EFI devices for them
+ *
+ * Partitions are ignored, since U-Boot has partition handling. Errors with
+ * particular devices produce a warning but execution continues to try to
+ * find others.
+ *
+ * Return: 0 if found, -ENOSYS if there is no boot-services table, -ENOTSUPP
+ * if a required protocol is not supported
+ */
+static int setup_block(void)
+{
+   efi_guid_t efi_blkio_guid = EFI_BLOCK_IO_PROTOCOL_GUID;
+   efi_guid_t efi_devpath_guid = EFI_DEVICE_PATH_PROTOCOL_GUID;
+   efi_guid_t efi_pathutil_guid = EFI_DEVICE_PATH_UTILITIES_PROTOCOL_GUID;
+   efi_guid_t efi_pathtext_guid = EFI_DEVICE_PATH_TO_TEXT_PROTOCOL_GUID;
+   struct efi_boot_services *boot = efi_get_boot();
+   struct efi_