diff mbox series

[02/21] efi_loader: expose symbols to be used by the EFI network stack

Message ID 20250122170858.961359-3-adriano.cordova@canonical.com
State Changes Requested, archived
Delegated to: Heinrich Schuchardt
Headers show
Series EFI driver to support multiple network interfaces | expand

Commit Message

Adriano Cordova Jan. 22, 2025, 5:08 p.m. UTC
The following symbols are exposed:
	- efi_reinstall_protocol_interface
		This is done so that the device path protocol interface
		of the network device can be changed internally by u-boot
		when a new bootfile gets downloaded.
	- eth_set_dev
		To support multiple network udevices
	- efi_close_event
		This comes in preparation to support unregistering
		an EFI network device from the EFI network stack when
		the underlying U-boot device gets removed
	- efi_[dis]connect_controller
		The EFI network driver uses ConnectController to add a
		NIC to the EFI network stack.
	- efi_uninstall_protocol_interface
		connect_controler for the efi network driver can install
		protocols, which need to be uninstalled in disconnect_controller
	- EFI_SIMPLE_NETWORK_PROTOCOL_GUID

Signed-off-by: Adriano Cordova <adriano.cordova@canonical.com>
---
 include/efi_loader.h                | 22 ++++++++++++++++++++++
 include/net-common.h                |  1 +
 lib/efi_loader/efi_boottime.c       | 23 +++++++++++------------
 lib/efi_loader/efi_net.c            |  2 +-
 lib/efi_selftest/efi_selftest_snp.c |  1 -
 5 files changed, 35 insertions(+), 14 deletions(-)

Comments

Ilias Apalodimas Feb. 4, 2025, 9:33 a.m. UTC | #1
On Wed, 22 Jan 2025 at 19:09, Adriano Cordova <adrianox@gmail.com> wrote:
>
> The following symbols are exposed:
>         - efi_reinstall_protocol_interface
>                 This is done so that the device path protocol interface
>                 of the network device can be changed internally by u-boot
>                 when a new bootfile gets downloaded.
>         - eth_set_dev
>                 To support multiple network udevices
>         - efi_close_event
>                 This comes in preparation to support unregistering
>                 an EFI network device from the EFI network stack when
>                 the underlying U-boot device gets removed
>         - efi_[dis]connect_controller
>                 The EFI network driver uses ConnectController to add a
>                 NIC to the EFI network stack.
>         - efi_uninstall_protocol_interface
>                 connect_controler for the efi network driver can install
>                 protocols, which need to be uninstalled in disconnect_controller
>         - EFI_SIMPLE_NETWORK_PROTOCOL_GUID

All of these function are intended to be called from an EFI
application. Because this make it cumbersome to use in U-Boot internal
we usually split the function to
efi_reinstall_protocol_interface_ext -> called in EFI context and is a
wrapper that adds EFI_ENTRY/EXIT
efi_reinstall_protocol_interface -> the actual implementation, that we
can use internally

Heinrich, I assume we want to keep this similar ?

/Ilias
>
> Signed-off-by: Adriano Cordova <adriano.cordova@canonical.com>
> ---
>  include/efi_loader.h                | 22 ++++++++++++++++++++++
>  include/net-common.h                |  1 +
>  lib/efi_loader/efi_boottime.c       | 23 +++++++++++------------
>  lib/efi_loader/efi_net.c            |  2 +-
>  lib/efi_selftest/efi_selftest_snp.c |  1 -
>  5 files changed, 35 insertions(+), 14 deletions(-)
>
> diff --git a/include/efi_loader.h b/include/efi_loader.h
> index 9afbec35eb..626d2bbb1a 100644
> --- a/include/efi_loader.h
> +++ b/include/efi_loader.h
> @@ -308,6 +308,8 @@ extern const efi_guid_t efi_guid_host_dev;
>  #endif
>  /* GUID of the EFI_BLOCK_IO_PROTOCOL */
>  extern const efi_guid_t efi_block_io_guid;
> +/* GUID of the EFI_SIMPLE_NETWORK_PROTOCOL */
> +extern const efi_guid_t efi_net_guid;
>  extern const efi_guid_t efi_global_variable_guid;
>  extern const efi_guid_t efi_guid_console_control;
>  extern const efi_guid_t efi_guid_device_path;
> @@ -711,6 +713,15 @@ efi_status_t efi_search_protocol(const efi_handle_t handle,
>  efi_status_t efi_add_protocol(const efi_handle_t handle,
>                               const efi_guid_t *protocol,
>                               void *protocol_interface);
> +/* Uninstall new protocol on a handle */
> +efi_status_t efi_uninstall_protocol
> +               (efi_handle_t handle, const efi_guid_t *protocol,
> +                void *protocol_interface, bool preserve);
> +/* Reinstall a protocol on a handle */
> +efi_status_t EFIAPI efi_reinstall_protocol_interface(
> +                       efi_handle_t handle,
> +                       const efi_guid_t *protocol,
> +                       void *old_interface, void *new_interface);
>  /* Open protocol */
>  efi_status_t efi_protocol_open(struct efi_handler *handler,
>                                void **protocol_interface, void *agent_handle,
> @@ -721,6 +732,15 @@ efi_status_t EFIAPI
>  efi_install_multiple_protocol_interfaces(efi_handle_t *handle, ...);
>  efi_status_t EFIAPI
>  efi_uninstall_multiple_protocol_interfaces(efi_handle_t handle, ...);
> +/* Connect and disconnect controller */
> +efi_status_t EFIAPI efi_connect_controller(efi_handle_t controller_handle,
> +                                          efi_handle_t *driver_image_handle,
> +                                          struct efi_device_path *remain_device_path,
> +                                          bool recursive);
> +efi_status_t EFIAPI efi_disconnect_controller(
> +                                       efi_handle_t controller_handle,
> +                                       efi_handle_t driver_image_handle,
> +                                       efi_handle_t child_handle);
>  /* Get handles that support a given protocol */
>  efi_status_t EFIAPI efi_locate_handle_buffer(
>                         enum efi_locate_search_type search_type,
> @@ -741,6 +761,8 @@ efi_status_t efi_create_event(uint32_t type, efi_uintn_t notify_tpl,
>                                         void *context),
>                               void *notify_context, const efi_guid_t *group,
>                               struct efi_event **event);
> +/* Call this to close an event */
> +efi_status_t EFIAPI efi_close_event(struct efi_event *event);
>  /* Call this to set a timer */
>  efi_status_t efi_set_timer(struct efi_event *event, enum efi_timer_delay type,
>                            uint64_t trigger_time);
> diff --git a/include/net-common.h b/include/net-common.h
> index 29d31f3726..1d507b13b0 100644
> --- a/include/net-common.h
> +++ b/include/net-common.h
> @@ -291,6 +291,7 @@ struct eth_ops {
>  #define eth_get_ops(dev) ((struct eth_ops *)(dev)->driver->ops)
>
>  struct udevice *eth_get_dev(void); /* get the current device */
> +void eth_set_dev(struct udevice *dev); /* set a device */
>  unsigned char *eth_get_ethaddr(void); /* get the current device MAC */
>  int eth_rx(void);                      /* Check for received packets */
>  void eth_halt(void);                   /* stop SCC */
> diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
> index 080e7f78ae..79ebe94889 100644
> --- a/lib/efi_loader/efi_boottime.c
> +++ b/lib/efi_loader/efi_boottime.c
> @@ -58,9 +58,9 @@ static efi_handle_t current_image;
>  static volatile gd_t *efi_gd, *app_gd;
>  #endif
>
> -static efi_status_t efi_uninstall_protocol
> -                       (efi_handle_t handle, const efi_guid_t *protocol,
> -                        void *protocol_interface, bool preserve);
> +efi_status_t efi_uninstall_protocol
> +               (efi_handle_t handle, const efi_guid_t *protocol,
> +                void *protocol_interface, bool preserve);
>
>  /* 1 if inside U-Boot code, 0 if inside EFI payload code */
>  static int entry_count = 1;
> @@ -98,12 +98,11 @@ const efi_guid_t efi_guid_load_file2_protocol = EFI_LOAD_FILE2_PROTOCOL_GUID;
>  /* GUID of the SMBIOS table */
>  const efi_guid_t smbios_guid = SMBIOS_TABLE_GUID;
>
> -static efi_status_t EFIAPI efi_disconnect_controller(
> +efi_status_t EFIAPI efi_disconnect_controller(
>                                         efi_handle_t controller_handle,
>                                         efi_handle_t driver_image_handle,
>                                         efi_handle_t child_handle);
>
> -static
>  efi_status_t EFIAPI efi_connect_controller(efi_handle_t controller_handle,
>                                            efi_handle_t *driver_image_handle,
>                                            struct efi_device_path *remain_device_path,
> @@ -1037,7 +1036,7 @@ static efi_status_t EFIAPI efi_signal_event_ext(struct efi_event *event)
>   *
>   * Return: status code
>   */
> -static efi_status_t EFIAPI efi_close_event(struct efi_event *event)
> +efi_status_t EFIAPI efi_close_event(struct efi_event *event)
>  {
>         struct efi_register_notify_event *item, *next;
>
> @@ -1378,9 +1377,9 @@ static efi_status_t efi_disconnect_all_drivers
>   *
>   * Return: status code
>   */
> -static efi_status_t efi_uninstall_protocol
> -                       (efi_handle_t handle, const efi_guid_t *protocol,
> -                        void *protocol_interface, bool preserve)
> +efi_status_t efi_uninstall_protocol
> +               (efi_handle_t handle, const efi_guid_t *protocol,
> +                       void *protocol_interface, bool preserve)
>  {
>         struct efi_handler *handler;
>         struct efi_open_protocol_info_item *item;
> @@ -3665,7 +3664,7 @@ static efi_status_t efi_connect_single_controller(
>   *
>   * Return: status code
>   */
> -static efi_status_t EFIAPI efi_connect_controller(
> +efi_status_t EFIAPI efi_connect_controller(
>                         efi_handle_t controller_handle,
>                         efi_handle_t *driver_image_handle,
>                         struct efi_device_path *remain_device_path,
> @@ -3733,7 +3732,7 @@ out:
>   *
>   * Return: status code
>   */
> -static efi_status_t EFIAPI efi_reinstall_protocol_interface(
> +efi_status_t EFIAPI efi_reinstall_protocol_interface(
>                         efi_handle_t handle, const efi_guid_t *protocol,
>                         void *old_interface, void *new_interface)
>  {
> @@ -3844,7 +3843,7 @@ static efi_status_t efi_get_child_controllers(
>   *
>   * Return: status code
>   */
> -static efi_status_t EFIAPI efi_disconnect_controller(
> +efi_status_t EFIAPI efi_disconnect_controller(
>                                 efi_handle_t controller_handle,
>                                 efi_handle_t driver_image_handle,
>                                 efi_handle_t child_handle)
> diff --git a/lib/efi_loader/efi_net.c b/lib/efi_loader/efi_net.c
> index 67593ef50c..918d43c70f 100644
> --- a/lib/efi_loader/efi_net.c
> +++ b/lib/efi_loader/efi_net.c
> @@ -22,7 +22,7 @@
>  #include <vsprintf.h>
>  #include <net.h>
>
> -static const efi_guid_t efi_net_guid = EFI_SIMPLE_NETWORK_PROTOCOL_GUID;
> +const efi_guid_t efi_net_guid = EFI_SIMPLE_NETWORK_PROTOCOL_GUID;
>  static const efi_guid_t efi_pxe_base_code_protocol_guid =
>                                         EFI_PXE_BASE_CODE_PROTOCOL_GUID;
>  static struct efi_pxe_packet *dhcp_ack;
> diff --git a/lib/efi_selftest/efi_selftest_snp.c b/lib/efi_selftest/efi_selftest_snp.c
> index 15af8d3e18..b00c76c2f1 100644
> --- a/lib/efi_selftest/efi_selftest_snp.c
> +++ b/lib/efi_selftest/efi_selftest_snp.c
> @@ -67,7 +67,6 @@ struct dhcp {
>  static struct efi_boot_services *boottime;
>  static struct efi_simple_network *net;
>  static struct efi_event *timer;
> -static const efi_guid_t efi_net_guid = EFI_SIMPLE_NETWORK_PROTOCOL_GUID;
>  /* IP packet ID */
>  static unsigned int net_ip_id;
>
> --
> 2.43.0
>
diff mbox series

Patch

diff --git a/include/efi_loader.h b/include/efi_loader.h
index 9afbec35eb..626d2bbb1a 100644
--- a/include/efi_loader.h
+++ b/include/efi_loader.h
@@ -308,6 +308,8 @@  extern const efi_guid_t efi_guid_host_dev;
 #endif
 /* GUID of the EFI_BLOCK_IO_PROTOCOL */
 extern const efi_guid_t efi_block_io_guid;
+/* GUID of the EFI_SIMPLE_NETWORK_PROTOCOL */
+extern const efi_guid_t efi_net_guid;
 extern const efi_guid_t efi_global_variable_guid;
 extern const efi_guid_t efi_guid_console_control;
 extern const efi_guid_t efi_guid_device_path;
@@ -711,6 +713,15 @@  efi_status_t efi_search_protocol(const efi_handle_t handle,
 efi_status_t efi_add_protocol(const efi_handle_t handle,
 			      const efi_guid_t *protocol,
 			      void *protocol_interface);
+/* Uninstall new protocol on a handle */
+efi_status_t efi_uninstall_protocol
+		(efi_handle_t handle, const efi_guid_t *protocol,
+		 void *protocol_interface, bool preserve);
+/* Reinstall a protocol on a handle */
+efi_status_t EFIAPI efi_reinstall_protocol_interface(
+			efi_handle_t handle,
+			const efi_guid_t *protocol,
+			void *old_interface, void *new_interface);
 /* Open protocol */
 efi_status_t efi_protocol_open(struct efi_handler *handler,
 			       void **protocol_interface, void *agent_handle,
@@ -721,6 +732,15 @@  efi_status_t EFIAPI
 efi_install_multiple_protocol_interfaces(efi_handle_t *handle, ...);
 efi_status_t EFIAPI
 efi_uninstall_multiple_protocol_interfaces(efi_handle_t handle, ...);
+/* Connect and disconnect controller */
+efi_status_t EFIAPI efi_connect_controller(efi_handle_t controller_handle,
+					   efi_handle_t *driver_image_handle,
+					   struct efi_device_path *remain_device_path,
+					   bool recursive);
+efi_status_t EFIAPI efi_disconnect_controller(
+					efi_handle_t controller_handle,
+					efi_handle_t driver_image_handle,
+					efi_handle_t child_handle);
 /* Get handles that support a given protocol */
 efi_status_t EFIAPI efi_locate_handle_buffer(
 			enum efi_locate_search_type search_type,
@@ -741,6 +761,8 @@  efi_status_t efi_create_event(uint32_t type, efi_uintn_t notify_tpl,
 					void *context),
 			      void *notify_context, const efi_guid_t *group,
 			      struct efi_event **event);
+/* Call this to close an event */
+efi_status_t EFIAPI efi_close_event(struct efi_event *event);
 /* Call this to set a timer */
 efi_status_t efi_set_timer(struct efi_event *event, enum efi_timer_delay type,
 			   uint64_t trigger_time);
diff --git a/include/net-common.h b/include/net-common.h
index 29d31f3726..1d507b13b0 100644
--- a/include/net-common.h
+++ b/include/net-common.h
@@ -291,6 +291,7 @@  struct eth_ops {
 #define eth_get_ops(dev) ((struct eth_ops *)(dev)->driver->ops)
 
 struct udevice *eth_get_dev(void); /* get the current device */
+void eth_set_dev(struct udevice *dev); /* set a device */
 unsigned char *eth_get_ethaddr(void); /* get the current device MAC */
 int eth_rx(void);                      /* Check for received packets */
 void eth_halt(void);			/* stop SCC */
diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
index 080e7f78ae..79ebe94889 100644
--- a/lib/efi_loader/efi_boottime.c
+++ b/lib/efi_loader/efi_boottime.c
@@ -58,9 +58,9 @@  static efi_handle_t current_image;
 static volatile gd_t *efi_gd, *app_gd;
 #endif
 
-static efi_status_t efi_uninstall_protocol
-			(efi_handle_t handle, const efi_guid_t *protocol,
-			 void *protocol_interface, bool preserve);
+efi_status_t efi_uninstall_protocol
+		(efi_handle_t handle, const efi_guid_t *protocol,
+		 void *protocol_interface, bool preserve);
 
 /* 1 if inside U-Boot code, 0 if inside EFI payload code */
 static int entry_count = 1;
@@ -98,12 +98,11 @@  const efi_guid_t efi_guid_load_file2_protocol = EFI_LOAD_FILE2_PROTOCOL_GUID;
 /* GUID of the SMBIOS table */
 const efi_guid_t smbios_guid = SMBIOS_TABLE_GUID;
 
-static efi_status_t EFIAPI efi_disconnect_controller(
+efi_status_t EFIAPI efi_disconnect_controller(
 					efi_handle_t controller_handle,
 					efi_handle_t driver_image_handle,
 					efi_handle_t child_handle);
 
-static
 efi_status_t EFIAPI efi_connect_controller(efi_handle_t controller_handle,
 					   efi_handle_t *driver_image_handle,
 					   struct efi_device_path *remain_device_path,
@@ -1037,7 +1036,7 @@  static efi_status_t EFIAPI efi_signal_event_ext(struct efi_event *event)
  *
  * Return: status code
  */
-static efi_status_t EFIAPI efi_close_event(struct efi_event *event)
+efi_status_t EFIAPI efi_close_event(struct efi_event *event)
 {
 	struct efi_register_notify_event *item, *next;
 
@@ -1378,9 +1377,9 @@  static efi_status_t efi_disconnect_all_drivers
  *
  * Return: status code
  */
-static efi_status_t efi_uninstall_protocol
-			(efi_handle_t handle, const efi_guid_t *protocol,
-			 void *protocol_interface, bool preserve)
+efi_status_t efi_uninstall_protocol
+		(efi_handle_t handle, const efi_guid_t *protocol,
+			void *protocol_interface, bool preserve)
 {
 	struct efi_handler *handler;
 	struct efi_open_protocol_info_item *item;
@@ -3665,7 +3664,7 @@  static efi_status_t efi_connect_single_controller(
  *
  * Return: status code
  */
-static efi_status_t EFIAPI efi_connect_controller(
+efi_status_t EFIAPI efi_connect_controller(
 			efi_handle_t controller_handle,
 			efi_handle_t *driver_image_handle,
 			struct efi_device_path *remain_device_path,
@@ -3733,7 +3732,7 @@  out:
  *
  * Return: status code
  */
-static efi_status_t EFIAPI efi_reinstall_protocol_interface(
+efi_status_t EFIAPI efi_reinstall_protocol_interface(
 			efi_handle_t handle, const efi_guid_t *protocol,
 			void *old_interface, void *new_interface)
 {
@@ -3844,7 +3843,7 @@  static efi_status_t efi_get_child_controllers(
  *
  * Return: status code
  */
-static efi_status_t EFIAPI efi_disconnect_controller(
+efi_status_t EFIAPI efi_disconnect_controller(
 				efi_handle_t controller_handle,
 				efi_handle_t driver_image_handle,
 				efi_handle_t child_handle)
diff --git a/lib/efi_loader/efi_net.c b/lib/efi_loader/efi_net.c
index 67593ef50c..918d43c70f 100644
--- a/lib/efi_loader/efi_net.c
+++ b/lib/efi_loader/efi_net.c
@@ -22,7 +22,7 @@ 
 #include <vsprintf.h>
 #include <net.h>
 
-static const efi_guid_t efi_net_guid = EFI_SIMPLE_NETWORK_PROTOCOL_GUID;
+const efi_guid_t efi_net_guid = EFI_SIMPLE_NETWORK_PROTOCOL_GUID;
 static const efi_guid_t efi_pxe_base_code_protocol_guid =
 					EFI_PXE_BASE_CODE_PROTOCOL_GUID;
 static struct efi_pxe_packet *dhcp_ack;
diff --git a/lib/efi_selftest/efi_selftest_snp.c b/lib/efi_selftest/efi_selftest_snp.c
index 15af8d3e18..b00c76c2f1 100644
--- a/lib/efi_selftest/efi_selftest_snp.c
+++ b/lib/efi_selftest/efi_selftest_snp.c
@@ -67,7 +67,6 @@  struct dhcp {
 static struct efi_boot_services *boottime;
 static struct efi_simple_network *net;
 static struct efi_event *timer;
-static const efi_guid_t efi_net_guid = EFI_SIMPLE_NETWORK_PROTOCOL_GUID;
 /* IP packet ID */
 static unsigned int net_ip_id;