The ReinstallProtocolInterface boot time service is implemented.

Signed-off-by: Heinrich Schuchardt <xypron.g...@gmx.de>
---
 lib/efi_loader/efi_boottime.c | 66 +++++++++++++++++++++++------------
 1 file changed, 43 insertions(+), 23 deletions(-)

diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
index bfaef29d3e6..8abbdfcec4c 100644
--- a/lib/efi_loader/efi_boottime.c
+++ b/lib/efi_loader/efi_boottime.c
@@ -1022,29 +1022,6 @@ out:
        return EFI_EXIT(r);
 }
 
-/*
- * Reinstall protocol interface.
- *
- * This function implements the ReinstallProtocolInterface service.
- * See the Unified Extensible Firmware Interface (UEFI) specification
- * for details.
- *
- * @handle                     handle on which the protocol shall be
- *                             reinstalled
- * @protocol                   GUID of the protocol to be installed
- * @old_interface              interface to be removed
- * @new_interface              interface to be installed
- * @return                     status code
- */
-static efi_status_t EFIAPI efi_reinstall_protocol_interface(
-                       efi_handle_t handle, const efi_guid_t *protocol,
-                       void *old_interface, void *new_interface)
-{
-       EFI_ENTRY("%p, %pUl, %p, %p", handle, protocol, old_interface,
-                 new_interface);
-       return EFI_EXIT(EFI_ACCESS_DENIED);
-}
-
 /*
  * Get all drivers associated to a controller.
  * The allocated buffer has to be freed with free().
@@ -2775,6 +2752,49 @@ out:
        return EFI_EXIT(ret);
 }
 
+/*
+ * Reinstall protocol interface.
+ *
+ * This function implements the ReinstallProtocolInterface service.
+ * See the Unified Extensible Firmware Interface (UEFI) specification
+ * for details.
+ *
+ * The old interface is uninstalled. The new interface is installed.
+ * Drivers are connected.
+ *
+ * @handle                     handle on which the protocol shall be
+ *                             reinstalled
+ * @protocol                   GUID of the protocol to be installed
+ * @old_interface              interface to be removed
+ * @new_interface              interface to be installed
+ * @return                     status code
+ */
+static efi_status_t EFIAPI efi_reinstall_protocol_interface(
+                       efi_handle_t handle, const efi_guid_t *protocol,
+                       void *old_interface, void *new_interface)
+{
+       efi_status_t ret;
+
+       EFI_ENTRY("%p, %pUl, %p, %p", handle, protocol, old_interface,
+                 new_interface);
+       ret = EFI_CALL(efi_uninstall_protocol_interface(handle, protocol,
+                                                       old_interface));
+       if (ret != EFI_SUCCESS)
+               goto out;
+       ret = EFI_CALL(efi_install_protocol_interface(&handle, protocol,
+                                                     EFI_NATIVE_INTERFACE,
+                                                     new_interface));
+       if (ret != EFI_SUCCESS)
+               goto out;
+       /*
+        * The returned status code has to be ignored.
+        * Do not create an error if no suitable driver for the handle exists.
+        */
+       EFI_CALL(efi_connect_controller(handle, NULL, NULL, true));
+out:
+       return EFI_EXIT(ret);
+}
+
 /*
  * Get all child controllers associated to a driver.
  * The allocated buffer has to be freed with free().
-- 
2.17.0

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to