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 |
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 --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;
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(-)