blob: 12cbe5caa9b017ca8755b4c81b7835ebf991b174 [file] [log] [blame]
Heinrich Schuchardtd828a052017-09-15 10:06:12 +02001# SPDX-License-Identifier: GPL-2.0
Tom Rini10e47792018-05-06 17:58:06 -04002# Copyright (c) 2017, Heinrich Schuchardt <xypron.glpk@gmx.de>
Heinrich Schuchardtd828a052017-09-15 10:06:12 +02003
Heinrich Schuchardt8bf7ffd2022-05-08 10:40:49 +02004""" Test UEFI API implementation
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +01005"""
Heinrich Schuchardtd828a052017-09-15 10:06:12 +02006
7import pytest
Heinrich Schuchardtd828a052017-09-15 10:06:12 +02008
9@pytest.mark.buildconfigspec('cmd_bootefi_selftest')
Simon Glassddba5202025-02-09 09:07:14 -070010def test_efi_selftest_base(ubman):
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +010011 """Run UEFI unit tests
Heinrich Schuchardtd828a052017-09-15 10:06:12 +020012
Simon Glassddba5202025-02-09 09:07:14 -070013 ubman -- U-Boot console
Heinrich Schuchardt48161e12018-11-18 17:58:54 +010014
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +010015 This function executes all selftests that are not marked as on request.
16 """
Simon Glassddba5202025-02-09 09:07:14 -070017 ubman.run_command(cmd='setenv efi_selftest')
18 ubman.run_command(cmd='bootefi selftest', wait_for_prompt=False)
19 if ubman.p.expect(['Summary: 0 failures', 'Press any key']):
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +010020 raise Exception('Failures occurred during the EFI selftest')
Simon Glassddba5202025-02-09 09:07:14 -070021 ubman.restart_uboot()
Heinrich Schuchardt1dc0a1b2017-10-18 18:13:17 +020022
23@pytest.mark.buildconfigspec('cmd_bootefi_selftest')
Heinrich Schuchardt604c8e72020-08-07 23:11:35 +020024@pytest.mark.buildconfigspec('hush_parser')
Heinrich Schuchardt43d27992018-03-03 15:29:04 +010025@pytest.mark.buildconfigspec('of_control')
Heinrich Schuchardt1c111f92019-04-20 13:33:55 +020026@pytest.mark.notbuildconfigspec('generate_acpi_table')
Simon Glassddba5202025-02-09 09:07:14 -070027def test_efi_selftest_device_tree(ubman):
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +010028 """Test the device tree support in the UEFI sub-system
29
Simon Glassddba5202025-02-09 09:07:14 -070030 ubman -- U-Boot console
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +010031
32 This test executes the UEFI unit test by calling 'bootefi selftest'.
33 """
Simon Glassddba5202025-02-09 09:07:14 -070034 ubman.run_command(cmd='setenv efi_selftest list')
35 output = ubman.run_command('bootefi selftest')
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +010036 assert '\'device tree\'' in output
Simon Glassddba5202025-02-09 09:07:14 -070037 ubman.run_command(cmd='setenv efi_selftest device tree')
Heinrich Schuchardt604c8e72020-08-07 23:11:35 +020038 # Set serial# if it is not already set.
Simon Glassddba5202025-02-09 09:07:14 -070039 ubman.run_command(cmd='setenv efi_test "${serial#}x"')
40 ubman.run_command(cmd='test "${efi_test}" = x && setenv serial# 0')
41 ubman.run_command(cmd='bootefi selftest ${fdtcontroladdr}', wait_for_prompt=False)
42 if ubman.p.expect(['serial-number:', 'U-Boot']):
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +010043 raise Exception('serial-number missing in device tree')
Simon Glassddba5202025-02-09 09:07:14 -070044 ubman.restart_uboot()
Heinrich Schuchardt43d27992018-03-03 15:29:04 +010045
46@pytest.mark.buildconfigspec('cmd_bootefi_selftest')
Simon Glassddba5202025-02-09 09:07:14 -070047def test_efi_selftest_watchdog_reboot(ubman):
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +010048 """Test the watchdog timer
49
Simon Glassddba5202025-02-09 09:07:14 -070050 ubman -- U-Boot console
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +010051
52 This function executes the 'watchdog reboot' unit test.
53 """
Simon Glassddba5202025-02-09 09:07:14 -070054 ubman.run_command(cmd='setenv efi_selftest list')
55 output = ubman.run_command('bootefi selftest')
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +010056 assert '\'watchdog reboot\'' in output
Simon Glassddba5202025-02-09 09:07:14 -070057 ubman.run_command(cmd='setenv efi_selftest watchdog reboot')
58 ubman.run_command(cmd='bootefi selftest', wait_for_prompt=False)
59 if ubman.p.expect(['resetting', 'U-Boot']):
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +010060 raise Exception('Reset failed in \'watchdog reboot\' test')
Simon Glassddba5202025-02-09 09:07:14 -070061 ubman.run_command(cmd='', send_nl=False, wait_for_reboot=True)
Heinrich Schuchardt5e450d42018-09-06 20:19:31 +020062
63@pytest.mark.buildconfigspec('cmd_bootefi_selftest')
Simon Glassddba5202025-02-09 09:07:14 -070064def test_efi_selftest_text_input(ubman):
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +010065 """Test the EFI_SIMPLE_TEXT_INPUT_PROTOCOL
Heinrich Schuchardt5e450d42018-09-06 20:19:31 +020066
Simon Glassddba5202025-02-09 09:07:14 -070067 ubman -- U-Boot console
Heinrich Schuchardt5e450d42018-09-06 20:19:31 +020068
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +010069 This function calls the text input EFI selftest.
70 """
Simon Glassddba5202025-02-09 09:07:14 -070071 ubman.run_command(cmd='setenv efi_selftest text input')
72 ubman.run_command(cmd='bootefi selftest', wait_for_prompt=False)
73 if ubman.p.expect([r'To terminate type \'x\'']):
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +010074 raise Exception('No prompt for \'text input\' test')
Simon Glassddba5202025-02-09 09:07:14 -070075 ubman.drain_console()
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +010076 # EOT
Simon Glassddba5202025-02-09 09:07:14 -070077 ubman.run_command(cmd=chr(4), wait_for_echo=False,
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +010078 send_nl=False, wait_for_prompt=False)
Simon Glassddba5202025-02-09 09:07:14 -070079 if ubman.p.expect([r'Unicode char 4 \(unknown\), scan code 0 \(Null\)']):
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +010080 raise Exception('EOT failed in \'text input\' test')
Simon Glassddba5202025-02-09 09:07:14 -070081 ubman.drain_console()
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +010082 # BS
Simon Glassddba5202025-02-09 09:07:14 -070083 ubman.run_command(cmd=chr(8), wait_for_echo=False,
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +010084 send_nl=False, wait_for_prompt=False)
Simon Glassddba5202025-02-09 09:07:14 -070085 if ubman.p.expect([r'Unicode char 8 \(BS\), scan code 0 \(Null\)']):
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +010086 raise Exception('BS failed in \'text input\' test')
Simon Glassddba5202025-02-09 09:07:14 -070087 ubman.drain_console()
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +010088 # TAB
Simon Glassddba5202025-02-09 09:07:14 -070089 ubman.run_command(cmd=chr(9), wait_for_echo=False,
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +010090 send_nl=False, wait_for_prompt=False)
Simon Glassddba5202025-02-09 09:07:14 -070091 if ubman.p.expect([r'Unicode char 9 \(TAB\), scan code 0 \(Null\)']):
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +010092 raise Exception('BS failed in \'text input\' test')
Simon Glassddba5202025-02-09 09:07:14 -070093 ubman.drain_console()
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +010094 # a
Simon Glassddba5202025-02-09 09:07:14 -070095 ubman.run_command(cmd='a', wait_for_echo=False, send_nl=False,
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +010096 wait_for_prompt=False)
Simon Glassddba5202025-02-09 09:07:14 -070097 if ubman.p.expect([r'Unicode char 97 \(\'a\'\), scan code 0 \(Null\)']):
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +010098 raise Exception('\'a\' failed in \'text input\' test')
Simon Glassddba5202025-02-09 09:07:14 -070099 ubman.drain_console()
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100100 # UP escape sequence
Simon Glassddba5202025-02-09 09:07:14 -0700101 ubman.run_command(cmd=chr(27) + '[A', wait_for_echo=False,
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100102 send_nl=False, wait_for_prompt=False)
Simon Glassddba5202025-02-09 09:07:14 -0700103 if ubman.p.expect([r'Unicode char 0 \(Null\), scan code 1 \(Up\)']):
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100104 raise Exception('UP failed in \'text input\' test')
Simon Glassddba5202025-02-09 09:07:14 -0700105 ubman.drain_console()
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100106 # Euro sign
Simon Glassddba5202025-02-09 09:07:14 -0700107 ubman.run_command(cmd=b'\xe2\x82\xac'.decode(), wait_for_echo=False,
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100108 send_nl=False, wait_for_prompt=False)
Simon Glassddba5202025-02-09 09:07:14 -0700109 if ubman.p.expect([r'Unicode char 8364 \(\'']):
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100110 raise Exception('Euro sign failed in \'text input\' test')
Simon Glassddba5202025-02-09 09:07:14 -0700111 ubman.drain_console()
112 ubman.run_command(cmd='x', wait_for_echo=False, send_nl=False,
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100113 wait_for_prompt=False)
Simon Glassddba5202025-02-09 09:07:14 -0700114 if ubman.p.expect(['Summary: 0 failures', 'Press any key']):
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100115 raise Exception('Failures occurred during the EFI selftest')
Simon Glassddba5202025-02-09 09:07:14 -0700116 ubman.restart_uboot()
Heinrich Schuchardt7ecaf972018-09-11 22:38:11 +0200117
118@pytest.mark.buildconfigspec('cmd_bootefi_selftest')
Simon Glassddba5202025-02-09 09:07:14 -0700119def test_efi_selftest_text_input_ex(ubman):
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100120 """Test the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL
Heinrich Schuchardt7ecaf972018-09-11 22:38:11 +0200121
Simon Glassddba5202025-02-09 09:07:14 -0700122 ubman -- U-Boot console
Heinrich Schuchardt7ecaf972018-09-11 22:38:11 +0200123
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100124 This function calls the extended text input EFI selftest.
125 """
Simon Glassddba5202025-02-09 09:07:14 -0700126 ubman.run_command(cmd='setenv efi_selftest extended text input')
127 ubman.run_command(cmd='bootefi selftest', wait_for_prompt=False)
128 if ubman.p.expect([r'To terminate type \'CTRL\+x\'']):
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100129 raise Exception('No prompt for \'text input\' test')
Simon Glassddba5202025-02-09 09:07:14 -0700130 ubman.drain_console()
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100131 # EOT
Simon Glassddba5202025-02-09 09:07:14 -0700132 ubman.run_command(cmd=chr(4), wait_for_echo=False,
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100133 send_nl=False, wait_for_prompt=False)
Simon Glassddba5202025-02-09 09:07:14 -0700134 if ubman.p.expect([r'Unicode char 100 \(\'d\'\), scan code 0 \(CTRL\+Null\)']):
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100135 raise Exception('EOT failed in \'text input\' test')
Simon Glassddba5202025-02-09 09:07:14 -0700136 ubman.drain_console()
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100137 # BS
Simon Glassddba5202025-02-09 09:07:14 -0700138 ubman.run_command(cmd=chr(8), wait_for_echo=False,
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100139 send_nl=False, wait_for_prompt=False)
Simon Glassddba5202025-02-09 09:07:14 -0700140 if ubman.p.expect([r'Unicode char 8 \(BS\), scan code 0 \(\+Null\)']):
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100141 raise Exception('BS failed in \'text input\' test')
Simon Glassddba5202025-02-09 09:07:14 -0700142 ubman.drain_console()
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100143 # TAB
Simon Glassddba5202025-02-09 09:07:14 -0700144 ubman.run_command(cmd=chr(9), wait_for_echo=False,
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100145 send_nl=False, wait_for_prompt=False)
Simon Glassddba5202025-02-09 09:07:14 -0700146 if ubman.p.expect([r'Unicode char 9 \(TAB\), scan code 0 \(\+Null\)']):
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100147 raise Exception('TAB failed in \'text input\' test')
Simon Glassddba5202025-02-09 09:07:14 -0700148 ubman.drain_console()
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100149 # a
Simon Glassddba5202025-02-09 09:07:14 -0700150 ubman.run_command(cmd='a', wait_for_echo=False, send_nl=False,
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100151 wait_for_prompt=False)
Simon Glassddba5202025-02-09 09:07:14 -0700152 if ubman.p.expect([r'Unicode char 97 \(\'a\'\), scan code 0 \(Null\)']):
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100153 raise Exception('\'a\' failed in \'text input\' test')
Simon Glassddba5202025-02-09 09:07:14 -0700154 ubman.drain_console()
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100155 # UP escape sequence
Simon Glassddba5202025-02-09 09:07:14 -0700156 ubman.run_command(cmd=chr(27) + '[A', wait_for_echo=False,
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100157 send_nl=False, wait_for_prompt=False)
Simon Glassddba5202025-02-09 09:07:14 -0700158 if ubman.p.expect([r'Unicode char 0 \(Null\), scan code 1 \(\+Up\)']):
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100159 raise Exception('UP failed in \'text input\' test')
Simon Glassddba5202025-02-09 09:07:14 -0700160 ubman.drain_console()
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100161 # Euro sign
Simon Glassddba5202025-02-09 09:07:14 -0700162 ubman.run_command(cmd=b'\xe2\x82\xac'.decode(), wait_for_echo=False,
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100163 send_nl=False, wait_for_prompt=False)
Simon Glassddba5202025-02-09 09:07:14 -0700164 if ubman.p.expect([r'Unicode char 8364 \(\'']):
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100165 raise Exception('Euro sign failed in \'text input\' test')
Simon Glassddba5202025-02-09 09:07:14 -0700166 ubman.drain_console()
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100167 # SHIFT+ALT+FN 5
Simon Glassddba5202025-02-09 09:07:14 -0700168 ubman.run_command(cmd=b'\x1b\x5b\x31\x35\x3b\x34\x7e'.decode(),
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100169 wait_for_echo=False, send_nl=False,
170 wait_for_prompt=False)
Simon Glassddba5202025-02-09 09:07:14 -0700171 if ubman.p.expect([r'Unicode char 0 \(Null\), scan code 15 \(SHIFT\+ALT\+FN 5\)']):
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100172 raise Exception('SHIFT+ALT+FN 5 failed in \'text input\' test')
Simon Glassddba5202025-02-09 09:07:14 -0700173 ubman.drain_console()
174 ubman.run_command(cmd=chr(24), wait_for_echo=False, send_nl=False,
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100175 wait_for_prompt=False)
Simon Glassddba5202025-02-09 09:07:14 -0700176 if ubman.p.expect(['Summary: 0 failures', 'Press any key']):
Heinrich Schuchardtba41e3e2020-01-25 21:58:56 +0100177 raise Exception('Failures occurred during the EFI selftest')
Simon Glassddba5202025-02-09 09:07:14 -0700178 ubman.restart_uboot()
Heinrich Schuchardt8226df32021-11-15 18:26:50 +0100179
180@pytest.mark.buildconfigspec('cmd_bootefi_selftest')
181@pytest.mark.buildconfigspec('efi_tcg2_protocol')
Simon Glassddba5202025-02-09 09:07:14 -0700182def test_efi_selftest_tcg2(ubman):
Heinrich Schuchardt8226df32021-11-15 18:26:50 +0100183 """Test the EFI_TCG2 PROTOCOL
184
Simon Glassddba5202025-02-09 09:07:14 -0700185 ubman -- U-Boot console
Heinrich Schuchardt8226df32021-11-15 18:26:50 +0100186
187 This function executes the 'tcg2' unit test.
188 """
Simon Glassddba5202025-02-09 09:07:14 -0700189 ubman.restart_uboot()
190 ubman.run_command(cmd='setenv efi_selftest list')
191 output = ubman.run_command('bootefi selftest')
Heinrich Schuchardt8226df32021-11-15 18:26:50 +0100192 assert '\'tcg2\'' in output
Simon Glassddba5202025-02-09 09:07:14 -0700193 ubman.run_command(cmd='setenv efi_selftest tcg2')
194 ubman.run_command(cmd='bootefi selftest', wait_for_prompt=False)
195 if ubman.p.expect(['Summary: 0 failures', 'Press any key']):
Heinrich Schuchardt8226df32021-11-15 18:26:50 +0100196 raise Exception('Failures occurred during the EFI selftest')
Simon Glassddba5202025-02-09 09:07:14 -0700197 ubman.restart_uboot()