efi_selftest: test for graphics output protocol
[oweals/u-boot.git] / lib / efi_selftest / efi_selftest_gop.c
1 /*
2  * efi_selftest_gop
3  *
4  * Copyright (c) 2017 Heinrich Schuchardt <xypron.glpk@gmx.de>
5  *
6  * SPDX-License-Identifier:     GPL-2.0+
7  *
8  * Test the graphical output protocol.
9  */
10
11 #include <efi_selftest.h>
12
13 static struct efi_boot_services *boottime;
14 static efi_guid_t efi_gop_guid = EFI_GOP_GUID;
15 static struct efi_gop *gop;
16
17 /*
18  * Setup unit test.
19  *
20  * @handle:     handle of the loaded image
21  * @systable:   system table
22  * @return:     EFI_ST_SUCCESS for success
23  */
24 static int setup(const efi_handle_t handle,
25                  const struct efi_system_table *systable)
26 {
27         efi_status_t ret;
28
29         boottime = systable->boottime;
30
31         ret = boottime->locate_protocol(&efi_gop_guid, NULL, (void **)&gop);
32         if (ret != EFI_SUCCESS) {
33                 gop = NULL;
34                 efi_st_printf("Graphical output protocol is not available.\n");
35         }
36
37         return EFI_ST_SUCCESS;
38 }
39
40 /*
41  * Tear down unit test.
42  *
43  * @return:     EFI_ST_SUCCESS for success
44  */
45 static int teardown(void)
46 {
47         return EFI_ST_SUCCESS;
48 }
49
50 /*
51  * Execute unit test.
52  *
53  * @return:     EFI_ST_SUCCESS for success
54  */
55 static int execute(void)
56 {
57         efi_status_t ret;
58         u32 i, max_mode;
59         efi_uintn_t size;
60         struct efi_gop_mode_info *info;
61
62         if (!gop)
63                 return EFI_ST_SUCCESS;
64
65         if (!gop->mode) {
66                 efi_st_error("EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE missing\n");
67                 return EFI_ST_FAILURE;
68         }
69         max_mode = gop->mode->max_mode;
70         if (!max_mode) {
71                 efi_st_error("No graphical mode available\n");
72                 return EFI_ST_FAILURE;
73         }
74         efi_st_printf("Number of available modes: %u\n", max_mode);
75
76         for (i = 0; i < max_mode; ++i) {
77                 ret = gop->query_mode(gop, i, &size, &info);
78                 if (ret != EFI_SUCCESS) {
79                         efi_st_printf("Could not query mode %u\n", i);
80                         return EFI_ST_FAILURE;
81                 }
82                 efi_st_printf("Mode %u: %u x %u\n",
83                               i, info->width, info->height);
84         }
85
86         return EFI_ST_SUCCESS;
87 }
88
89 EFI_UNIT_TEST(gop) = {
90         .name = "graphical output",
91         .phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
92         .setup = setup,
93         .execute = execute,
94         .teardown = teardown,
95 };