aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firmware/efi
diff options
context:
space:
mode:
authorArd Biesheuvel <ard.biesheuvel@linaro.org>2014-06-26 06:09:05 -0400
committerMatt Fleming <matt.fleming@intel.com>2014-07-07 15:12:53 -0400
commit022ee6c558fc933679e151f00f84332974147fa2 (patch)
tree1c9023d5cceddf7dd6c75508e4405f6bb316e93f /drivers/firmware/efi
parentf49182ec8c685f4e89a50ba85ffe43b7f1e7b3e1 (diff)
efi/x86: Move UEFI Runtime Services wrappers to generic code
In order for other archs (such as arm64) to be able to reuse the virtual mode function call wrappers, move them to drivers/firmware/efi/runtime-wrappers.c. Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Matt Fleming <matt.fleming@intel.com>
Diffstat (limited to 'drivers/firmware/efi')
-rw-r--r--drivers/firmware/efi/Kconfig3
-rw-r--r--drivers/firmware/efi/Makefile1
-rw-r--r--drivers/firmware/efi/runtime-wrappers.c161
3 files changed, 165 insertions, 0 deletions
diff --git a/drivers/firmware/efi/Kconfig b/drivers/firmware/efi/Kconfig
index d420ae2d3413..588dc47e7075 100644
--- a/drivers/firmware/efi/Kconfig
+++ b/drivers/firmware/efi/Kconfig
@@ -54,6 +54,9 @@ config EFI_PARAMS_FROM_FDT
54 the EFI runtime support gets system table address, memory 54 the EFI runtime support gets system table address, memory
55 map address, and other parameters from the device tree. 55 map address, and other parameters from the device tree.
56 56
57config EFI_RUNTIME_WRAPPERS
58 bool
59
57endmenu 60endmenu
58 61
59config UEFI_CPER 62config UEFI_CPER
diff --git a/drivers/firmware/efi/Makefile b/drivers/firmware/efi/Makefile
index 9553496b0f43..e1096539eedb 100644
--- a/drivers/firmware/efi/Makefile
+++ b/drivers/firmware/efi/Makefile
@@ -6,3 +6,4 @@ obj-$(CONFIG_EFI_VARS) += efivars.o
6obj-$(CONFIG_EFI_VARS_PSTORE) += efi-pstore.o 6obj-$(CONFIG_EFI_VARS_PSTORE) += efi-pstore.o
7obj-$(CONFIG_UEFI_CPER) += cper.o 7obj-$(CONFIG_UEFI_CPER) += cper.o
8obj-$(CONFIG_EFI_RUNTIME_MAP) += runtime-map.o 8obj-$(CONFIG_EFI_RUNTIME_MAP) += runtime-map.o
9obj-$(CONFIG_EFI_RUNTIME_WRAPPERS) += runtime-wrappers.o
diff --git a/drivers/firmware/efi/runtime-wrappers.c b/drivers/firmware/efi/runtime-wrappers.c
new file mode 100644
index 000000000000..10daa4bbb258
--- /dev/null
+++ b/drivers/firmware/efi/runtime-wrappers.c
@@ -0,0 +1,161 @@
1/*
2 * runtime-wrappers.c - Runtime Services function call wrappers
3 *
4 * Copyright (C) 2014 Linaro Ltd. <ard.biesheuvel@linaro.org>
5 *
6 * Split off from arch/x86/platform/efi/efi.c
7 *
8 * Copyright (C) 1999 VA Linux Systems
9 * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
10 * Copyright (C) 1999-2002 Hewlett-Packard Co.
11 * Copyright (C) 2005-2008 Intel Co.
12 * Copyright (C) 2013 SuSE Labs
13 *
14 * This file is released under the GPLv2.
15 */
16
17#include <linux/efi.h>
18#include <linux/spinlock.h> /* spinlock_t */
19#include <asm/efi.h>
20
21/*
22 * As per commit ef68c8f87ed1 ("x86: Serialize EFI time accesses on rtc_lock"),
23 * the EFI specification requires that callers of the time related runtime
24 * functions serialize with other CMOS accesses in the kernel, as the EFI time
25 * functions may choose to also use the legacy CMOS RTC.
26 */
27__weak DEFINE_SPINLOCK(rtc_lock);
28
29static efi_status_t virt_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc)
30{
31 unsigned long flags;
32 efi_status_t status;
33
34 spin_lock_irqsave(&rtc_lock, flags);
35 status = efi_call_virt(get_time, tm, tc);
36 spin_unlock_irqrestore(&rtc_lock, flags);
37 return status;
38}
39
40static efi_status_t virt_efi_set_time(efi_time_t *tm)
41{
42 unsigned long flags;
43 efi_status_t status;
44
45 spin_lock_irqsave(&rtc_lock, flags);
46 status = efi_call_virt(set_time, tm);
47 spin_unlock_irqrestore(&rtc_lock, flags);
48 return status;
49}
50
51static efi_status_t virt_efi_get_wakeup_time(efi_bool_t *enabled,
52 efi_bool_t *pending,
53 efi_time_t *tm)
54{
55 unsigned long flags;
56 efi_status_t status;
57
58 spin_lock_irqsave(&rtc_lock, flags);
59 status = efi_call_virt(get_wakeup_time, enabled, pending, tm);
60 spin_unlock_irqrestore(&rtc_lock, flags);
61 return status;
62}
63
64static efi_status_t virt_efi_set_wakeup_time(efi_bool_t enabled, efi_time_t *tm)
65{
66 unsigned long flags;
67 efi_status_t status;
68
69 spin_lock_irqsave(&rtc_lock, flags);
70 status = efi_call_virt(set_wakeup_time, enabled, tm);
71 spin_unlock_irqrestore(&rtc_lock, flags);
72 return status;
73}
74
75static efi_status_t virt_efi_get_variable(efi_char16_t *name,
76 efi_guid_t *vendor,
77 u32 *attr,
78 unsigned long *data_size,
79 void *data)
80{
81 return efi_call_virt(get_variable, name, vendor, attr, data_size, data);
82}
83
84static efi_status_t virt_efi_get_next_variable(unsigned long *name_size,
85 efi_char16_t *name,
86 efi_guid_t *vendor)
87{
88 return efi_call_virt(get_next_variable, name_size, name, vendor);
89}
90
91static efi_status_t virt_efi_set_variable(efi_char16_t *name,
92 efi_guid_t *vendor,
93 u32 attr,
94 unsigned long data_size,
95 void *data)
96{
97 return efi_call_virt(set_variable, name, vendor, attr, data_size, data);
98}
99
100static efi_status_t virt_efi_query_variable_info(u32 attr,
101 u64 *storage_space,
102 u64 *remaining_space,
103 u64 *max_variable_size)
104{
105 if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION)
106 return EFI_UNSUPPORTED;
107
108 return efi_call_virt(query_variable_info, attr, storage_space,
109 remaining_space, max_variable_size);
110}
111
112static efi_status_t virt_efi_get_next_high_mono_count(u32 *count)
113{
114 return efi_call_virt(get_next_high_mono_count, count);
115}
116
117static void virt_efi_reset_system(int reset_type,
118 efi_status_t status,
119 unsigned long data_size,
120 efi_char16_t *data)
121{
122 __efi_call_virt(reset_system, reset_type, status, data_size, data);
123}
124
125static efi_status_t virt_efi_update_capsule(efi_capsule_header_t **capsules,
126 unsigned long count,
127 unsigned long sg_list)
128{
129 if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION)
130 return EFI_UNSUPPORTED;
131
132 return efi_call_virt(update_capsule, capsules, count, sg_list);
133}
134
135static efi_status_t virt_efi_query_capsule_caps(efi_capsule_header_t **capsules,
136 unsigned long count,
137 u64 *max_size,
138 int *reset_type)
139{
140 if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION)
141 return EFI_UNSUPPORTED;
142
143 return efi_call_virt(query_capsule_caps, capsules, count, max_size,
144 reset_type);
145}
146
147void efi_native_runtime_setup(void)
148{
149 efi.get_time = virt_efi_get_time;
150 efi.set_time = virt_efi_set_time;
151 efi.get_wakeup_time = virt_efi_get_wakeup_time;
152 efi.set_wakeup_time = virt_efi_set_wakeup_time;
153 efi.get_variable = virt_efi_get_variable;
154 efi.get_next_variable = virt_efi_get_next_variable;
155 efi.set_variable = virt_efi_set_variable;
156 efi.get_next_high_mono_count = virt_efi_get_next_high_mono_count;
157 efi.reset_system = virt_efi_reset_system;
158 efi.query_variable_info = virt_efi_query_variable_info;
159 efi.update_capsule = virt_efi_update_capsule;
160 efi.query_capsule_caps = virt_efi_query_capsule_caps;
161}