Commit e1cccf48 authored by Artiom Myaskouvskey's avatar Artiom Myaskouvskey Committed by Andi Kleen

[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: default avatarArtiom Myaskouvskey <artiom.myaskouvskey@intel.com>
Signed-off-by: default avatarAndi 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: default avatarAndrew Morton <akpm@osdl.org>
parent b0d0a4ba
...@@ -194,17 +194,24 @@ inline int efi_set_rtc_mmss(unsigned long nowtime) ...@@ -194,17 +194,24 @@ inline int efi_set_rtc_mmss(unsigned long nowtime)
return 0; return 0;
} }
/* /*
* This should only be used during kernel init and before runtime * This is used during kernel init before runtime
* services have been remapped, therefore, we'll need to call in physical * services have been remapped and also during suspend, therefore,
* mode. Note, this call isn't used later, so mark it __init. * we'll need to call both in physical and virtual modes.
*/ */
inline unsigned long __init efi_get_time(void) inline unsigned long efi_get_time(void)
{ {
efi_status_t status; efi_status_t status;
efi_time_t eft; efi_time_t eft;
efi_time_cap_t cap; efi_time_cap_t cap;
status = phys_efi_get_time(&eft, &cap); if (efi.get_time) {
/* if we are in virtual mode use remapped function */
status = efi.get_time(&eft, &cap);
} else {
/* we are in physical mode */
status = phys_efi_get_time(&eft, &cap);
}
if (status != EFI_SUCCESS) if (status != EFI_SUCCESS)
printk("Oops: efitime: can't read time status: 0x%lx\n",status); printk("Oops: efitime: can't read time status: 0x%lx\n",status);
......
...@@ -300,7 +300,7 @@ extern int efi_mem_attribute_range (unsigned long phys_addr, unsigned long size, ...@@ -300,7 +300,7 @@ extern int efi_mem_attribute_range (unsigned long phys_addr, unsigned long size,
extern int __init efi_uart_console_only (void); extern int __init efi_uart_console_only (void);
extern void efi_initialize_iomem_resources(struct resource *code_resource, extern void efi_initialize_iomem_resources(struct resource *code_resource,
struct resource *data_resource); struct resource *data_resource);
extern unsigned long __init efi_get_time(void); extern unsigned long efi_get_time(void);
extern int __init efi_set_rtc_mmss(unsigned long nowtime); extern int __init efi_set_rtc_mmss(unsigned long nowtime);
extern struct efi_memory_map memmap; extern struct efi_memory_map memmap;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment