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 };
96