1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * efi_selftest_rtc 4 * 5 * Copyright (c) 2018 Heinrich Schuchardt <xypron.glpk@gmx.de> 6 * 7 * Test the real time clock runtime services. 8 */ 9 10 #include <efi_selftest.h> 11 12 #define EFI_ST_NO_RTC "Could not read real time clock\n" 13 14 static struct efi_runtime_services *runtime; 15 16 /* 17 * Setup unit test. 18 * 19 * @handle: handle of the loaded image 20 * @systable: system table 21 * @return: EFI_ST_SUCCESS for success 22 */ 23 static int setup(const efi_handle_t handle, 24 const struct efi_system_table *systable) 25 { 26 runtime = systable->runtime; 27 return EFI_ST_SUCCESS; 28 } 29 30 /* 31 * Execute unit test. 32 * 33 * Display current time. 34 * 35 * @return: EFI_ST_SUCCESS for success 36 */ 37 static int execute(void) 38 { 39 efi_status_t ret; 40 struct efi_time tm; 41 42 /* Display current time */ 43 ret = runtime->get_time(&tm, NULL); 44 if (ret != EFI_SUCCESS) { 45 #ifdef CONFIG_CMD_DATE 46 efi_st_error(EFI_ST_NO_RTC); 47 return EFI_ST_FAILURE; 48 #else 49 efi_st_todo(EFI_ST_NO_RTC); 50 return EFI_ST_SUCCESS; 51 #endif 52 } else { 53 efi_st_printf("Time according to real time clock: " 54 "%.4u-%.2u-%.2u %.2u:%.2u:%.2u\n", 55 tm.year, tm.month, tm.day, 56 tm.hour, tm.minute, tm.second); 57 } 58 59 return EFI_ST_SUCCESS; 60 } 61 62 EFI_UNIT_TEST(rtc) = { 63 .name = "real time clock", 64 .phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT, 65 .setup = setup, 66 .execute = execute, 67 }; 68