]> git.sur5r.net Git - u-boot/blobdiff - lib/efi_selftest/efi_selftest_events.c
Merge branch 'master' of git://git.denx.de/u-boot-video
[u-boot] / lib / efi_selftest / efi_selftest_events.c
index c4f66952b9f8bc28929fa7bcff7fbc787d74ca6f..47f9f99318db32f6cb77f30e2351c28fd12ce937 100644 (file)
@@ -1,10 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * efi_selftest_events
  *
  * Copyright (c) 2017 Heinrich Schuchardt <xypron.glpk@gmx.de>
  *
- * SPDX-License-Identifier:     GPL-2.0+
- *
  * This unit test uses timer events to check the implementation
  * of the following boottime services:
  * CreateEvent, CloseEvent, WaitForEvent, CheckEvent, SetTimer.
 
 static struct efi_event *event_notify;
 static struct efi_event *event_wait;
-static unsigned int counter;
+static unsigned int timer_ticks;
 static struct efi_boot_services *boottime;
 
 /*
- * Notification function, increments a counter.
+ * Notification function, increments the notfication count if parameter
+ * context is provided.
  *
  * @event      notified event
- * @context    pointer to the counter
+ * @context    pointer to the notification count
  */
 static void EFIAPI notify(struct efi_event *event, void *context)
 {
-       if (!context)
-               return;
-       ++*(unsigned int *)context;
+       unsigned int *count = context;
+
+       if (count)
+               ++*count;
 }
 
 /*
@@ -38,6 +39,7 @@ static void EFIAPI notify(struct efi_event *event, void *context)
  *
  * @handle:    handle of the loaded image
  * @systable:  system table
+ * @return:    EFI_ST_SUCCESS for success
  */
 static int setup(const efi_handle_t handle,
                 const struct efi_system_table *systable)
@@ -47,25 +49,27 @@ static int setup(const efi_handle_t handle,
        boottime = systable->boottime;
 
        ret = boottime->create_event(EVT_TIMER | EVT_NOTIFY_SIGNAL,
-                                    TPL_CALLBACK, notify, (void *)&counter,
+                                    TPL_CALLBACK, notify, (void *)&timer_ticks,
                                     &event_notify);
        if (ret != EFI_SUCCESS) {
                efi_st_error("could not create event\n");
-               return 1;
+               return EFI_ST_FAILURE;
        }
        ret = boottime->create_event(EVT_TIMER | EVT_NOTIFY_WAIT,
                                     TPL_CALLBACK, notify, NULL, &event_wait);
        if (ret != EFI_SUCCESS) {
                efi_st_error("could not create event\n");
-               return 1;
+               return EFI_ST_FAILURE;
        }
-       return 0;
+       return EFI_ST_SUCCESS;
 }
 
 /*
  * Tear down unit test.
  *
  * Close the events created in setup.
+ *
+ * @return:    EFI_ST_SUCCESS for success
  */
 static int teardown(void)
 {
@@ -76,7 +80,7 @@ static int teardown(void)
                event_notify = NULL;
                if (ret != EFI_SUCCESS) {
                        efi_st_error("could not close event\n");
-                       return 1;
+                       return EFI_ST_FAILURE;
                }
        }
        if (event_wait) {
@@ -84,10 +88,10 @@ static int teardown(void)
                event_wait = NULL;
                if (ret != EFI_SUCCESS) {
                        efi_st_error("could not close event\n");
-                       return 1;
+                       return EFI_ST_FAILURE;
                }
        }
-       return 0;
+       return EFI_ST_SUCCESS;
 }
 
 /*
@@ -98,92 +102,97 @@ static int teardown(void)
  *
  * Run a 100 ms single shot timer and check that it is called once
  * while waiting for 100 ms periodic timer for two periods.
+ *
+ * @return:    EFI_ST_SUCCESS for success
  */
 static int execute(void)
 {
-       unsigned long index;
+       efi_uintn_t index;
        efi_status_t ret;
 
        /* Set 10 ms timer */
-       counter = 0;
+       timer_ticks = 0;
        ret = boottime->set_timer(event_notify, EFI_TIMER_PERIODIC, 100000);
        if (ret != EFI_SUCCESS) {
                efi_st_error("Could not set timer\n");
-               return 1;
+               return EFI_ST_FAILURE;
        }
        /* Set 100 ms timer */
        ret = boottime->set_timer(event_wait, EFI_TIMER_RELATIVE, 1000000);
        if (ret != EFI_SUCCESS) {
                efi_st_error("Could not set timer\n");
-               return 1;
+               return EFI_ST_FAILURE;
        }
 
+       /* Set some arbitrary non-zero value to make change detectable. */
        index = 5;
        ret = boottime->wait_for_event(1, &event_wait, &index);
        if (ret != EFI_SUCCESS) {
                efi_st_error("Could not wait for event\n");
-               return 1;
+               return EFI_ST_FAILURE;
        }
        ret = boottime->check_event(event_wait);
        if (ret != EFI_NOT_READY) {
                efi_st_error("Signaled state was not cleared.\n");
                efi_st_printf("ret = %u\n", (unsigned int)ret);
-               return 1;
+               return EFI_ST_FAILURE;
        }
        if (index != 0) {
                efi_st_error("WaitForEvent returned wrong index\n");
-               return 1;
+               return EFI_ST_FAILURE;
        }
-       efi_st_printf("Counter periodic: %u\n", counter);
-       if (counter < 8 || counter > 12) {
+       if (timer_ticks < 8 || timer_ticks > 12) {
+               efi_st_printf("Notification count periodic: %u\n", timer_ticks);
                efi_st_error("Incorrect timing of events\n");
-               return 1;
+               return EFI_ST_FAILURE;
        }
        ret = boottime->set_timer(event_notify, EFI_TIMER_STOP, 0);
        if (index != 0) {
                efi_st_error("Could not cancel timer\n");
-               return 1;
+               return EFI_ST_FAILURE;
        }
        /* Set 10 ms timer */
-       counter = 0;
+       timer_ticks = 0;
        ret = boottime->set_timer(event_notify, EFI_TIMER_RELATIVE, 100000);
        if (index != 0) {
                efi_st_error("Could not set timer\n");
-               return 1;
+               return EFI_ST_FAILURE;
        }
        /* Set 100 ms timer */
        ret = boottime->set_timer(event_wait, EFI_TIMER_PERIODIC, 1000000);
        if (index != 0) {
                efi_st_error("Could not set timer\n");
-               return 1;
+               return EFI_ST_FAILURE;
        }
        ret = boottime->wait_for_event(1, &event_wait, &index);
        if (ret != EFI_SUCCESS) {
                efi_st_error("Could not wait for event\n");
-               return 1;
+               return EFI_ST_FAILURE;
        }
-       efi_st_printf("Counter single shot: %u\n", counter);
-       if (counter != 1) {
+       if (timer_ticks != 1) {
+               efi_st_printf("Notification count single shot: %u\n",
+                             timer_ticks);
                efi_st_error("Single shot timer failed\n");
-               return 1;
+               return EFI_ST_FAILURE;
        }
        ret = boottime->wait_for_event(1, &event_wait, &index);
        if (ret != EFI_SUCCESS) {
                efi_st_error("Could not wait for event\n");
-               return 1;
+               return EFI_ST_FAILURE;
        }
-       efi_st_printf("Stopped counter: %u\n", counter);
-       if (counter != 1) {
+       if (timer_ticks != 1) {
+               efi_st_printf("Notification count stopped timer: %u\n",
+                             timer_ticks);
                efi_st_error("Stopped timer fired\n");
-               return 1;
+               return EFI_ST_FAILURE;
        }
        ret = boottime->set_timer(event_wait, EFI_TIMER_STOP, 0);
-       if (index != 0) {
+       if (ret != EFI_SUCCESS) {
                efi_st_error("Could not cancel timer\n");
-               return 1;
+               return EFI_ST_FAILURE;
        }
 
-       return 0;
+       return EFI_ST_SUCCESS;
 }
 
 EFI_UNIT_TEST(events) = {