diff options
author | Artiom Myaskouvskey <artiom.myaskouvskey@intel.com> | 2006-12-06 20:14:11 -0500 |
---|---|---|
committer | Andi Kleen <andi@basil.nowhere.org> | 2006-12-06 20:14:11 -0500 |
commit | e1cccf48b182dd743c3c83a4fdf8dc570a43b393 (patch) | |
tree | 3315022e72488e2dbc3d38a721f9959f42b7cd06 | |
parent | b0d0a4ba45760b10ecee9035ed45b442c1a6cc84 (diff) |
[PATCH] i386: call efi_get_time during suspend
Function efi_get_time called not only during init kernel phase but also
during suspend (from get_cmos_time).
When it is called from get_cmos_time the corresponding runtime service
should be called in virtual and not in physical mode.
Signed-off-by: Artiom Myaskouvskey <artiom.myaskouvskey@intel.com>
Signed-off-by: Andi Kleen <ak@suse.de>
Cc: "Narayanan, Chandramouli" <chandramouli.narayanan@intel.com>
Cc: "Jiossy, Rami" <rami.jiossy@intel.com>
Cc: "Satt, Shai" <shai.satt@intel.com>
Cc: Andi Kleen <ak@suse.de>
Cc: Matt Domsch <Matt_Domsch@dell.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
-rw-r--r-- | arch/i386/kernel/efi.c | 17 | ||||
-rw-r--r-- | include/linux/efi.h | 2 |
2 files changed, 13 insertions, 6 deletions
diff --git a/arch/i386/kernel/efi.c b/arch/i386/kernel/efi.c index 8b40648d0ef0..b92c7f0a358a 100644 --- a/arch/i386/kernel/efi.c +++ b/arch/i386/kernel/efi.c | |||
@@ -194,17 +194,24 @@ inline int efi_set_rtc_mmss(unsigned long nowtime) | |||
194 | return 0; | 194 | return 0; |
195 | } | 195 | } |
196 | /* | 196 | /* |
197 | * This should only be used during kernel init and before runtime | 197 | * This is used during kernel init before runtime |
198 | * services have been remapped, therefore, we'll need to call in physical | 198 | * services have been remapped and also during suspend, therefore, |
199 | * mode. Note, this call isn't used later, so mark it __init. | 199 | * we'll need to call both in physical and virtual modes. |
200 | */ | 200 | */ |
201 | inline unsigned long __init efi_get_time(void) | 201 | inline unsigned long efi_get_time(void) |
202 | { | 202 | { |
203 | efi_status_t status; | 203 | efi_status_t status; |
204 | efi_time_t eft; | 204 | efi_time_t eft; |
205 | efi_time_cap_t cap; | 205 | efi_time_cap_t cap; |
206 | 206 | ||
207 | status = phys_efi_get_time(&eft, &cap); | 207 | if (efi.get_time) { |
208 | /* if we are in virtual mode use remapped function */ | ||
209 | status = efi.get_time(&eft, &cap); | ||
210 | } else { | ||
211 | /* we are in physical mode */ | ||
212 | status = phys_efi_get_time(&eft, &cap); | ||
213 | } | ||
214 | |||
208 | if (status != EFI_SUCCESS) | 215 | if (status != EFI_SUCCESS) |
209 | printk("Oops: efitime: can't read time status: 0x%lx\n",status); | 216 | printk("Oops: efitime: can't read time status: 0x%lx\n",status); |
210 | 217 | ||
diff --git a/include/linux/efi.h b/include/linux/efi.h index 66d621dbcb6c..91ecf49fbf21 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h | |||
@@ -300,7 +300,7 @@ extern int efi_mem_attribute_range (unsigned long phys_addr, unsigned long size, | |||
300 | extern int __init efi_uart_console_only (void); | 300 | extern int __init efi_uart_console_only (void); |
301 | extern void efi_initialize_iomem_resources(struct resource *code_resource, | 301 | extern void efi_initialize_iomem_resources(struct resource *code_resource, |
302 | struct resource *data_resource); | 302 | struct resource *data_resource); |
303 | extern unsigned long __init efi_get_time(void); | 303 | extern unsigned long efi_get_time(void); |
304 | extern int __init efi_set_rtc_mmss(unsigned long nowtime); | 304 | extern int __init efi_set_rtc_mmss(unsigned long nowtime); |
305 | extern struct efi_memory_map memmap; | 305 | extern struct efi_memory_map memmap; |
306 | 306 | ||