]> git.sur5r.net Git - u-boot/blobdiff - lib/efi_selftest/efi_selftest_controllers.c
efi_selftest: test ReinstallProtocolInterface
[u-boot] / lib / efi_selftest / efi_selftest_controllers.c
index e30c11b1e458e2e9bf70c165635450323665c6ca..ceefa03444fc18787343e810d825981d42bac84f 100644 (file)
@@ -6,7 +6,7 @@
  *
  * This unit test checks the following protocol services:
  * ConnectController, DisconnectController,
- * InstallProtocol, UninstallProtocol,
+ * InstallProtocol, ReinstallProtocol, UninstallProtocol,
  * OpenProtocol, CloseProtcol, OpenProtocolInformation
  */
 
@@ -14,6 +14,8 @@
 
 #define NUMBER_OF_CHILD_CONTROLLERS 4
 
+static int interface1 = 1;
+static int interface2 = 2;
 static struct efi_boot_services *boottime;
 const efi_guid_t guid_driver_binding_protocol =
                        EFI_DRIVER_BINDING_PROTOCOL_GUID;
@@ -271,7 +273,7 @@ static int setup(const efi_handle_t img_handle,
        /* Create controller handle */
        ret = boottime->install_protocol_interface(
                        &handle_controller, &guid_controller,
-                       EFI_NATIVE_INTERFACE, NULL);
+                       EFI_NATIVE_INTERFACE, &interface1);
        if (ret != EFI_SUCCESS) {
                efi_st_error("InstallProtocolInterface failed\n");
                return EFI_ST_FAILURE;
@@ -299,6 +301,7 @@ static int setup(const efi_handle_t img_handle,
  * Disconnect and destroy the remaining child controllers.
  *
  * Connect a controller to a driver.
+ * Reinstall the driver protocol on the controller.
  * Uninstall the driver protocol from the controller.
  */
 static int execute(void)
@@ -361,9 +364,35 @@ static int execute(void)
                efi_st_error("Number of children %u != %u\n",
                             (unsigned int)count, NUMBER_OF_CHILD_CONTROLLERS);
        }
+       /* Try to uninstall controller protocol using the wrong interface */
+       ret = boottime->uninstall_protocol_interface(handle_controller,
+                                                    &guid_controller,
+                                                    &interface2);
+       if (ret == EFI_SUCCESS) {
+               efi_st_error(
+                       "Interface not checked when uninstalling protocol\n");
+               return EFI_ST_FAILURE;
+       }
+       /* Reinstall controller protocol */
+       ret = boottime->reinstall_protocol_interface(handle_controller,
+                                                    &guid_controller,
+                                                    &interface1,
+                                                    &interface2);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Failed to reinstall protocols\n");
+               return EFI_ST_FAILURE;
+       }
+       /* Check number of child controllers */
+       ret = count_child_controllers(handle_controller, &guid_controller,
+                                     &count);
+       if (ret != EFI_SUCCESS || count != NUMBER_OF_CHILD_CONTROLLERS) {
+               efi_st_error("Number of children %u != %u\n",
+                            (unsigned int)count, NUMBER_OF_CHILD_CONTROLLERS);
+       }
        /* Uninstall controller protocol */
        ret = boottime->uninstall_protocol_interface(handle_controller,
-                                                    &guid_controller, NULL);
+                                                    &guid_controller,
+                                                    &interface2);
        if (ret != EFI_SUCCESS) {
                efi_st_error("Failed to uninstall protocols\n");
                return EFI_ST_FAILURE;