From: Artiom Myaskouvskey <[email protected]>
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 <[email protected]>
---
diff -uprN linux-2.6.19-rc5-git2.orig/include/linux/efi.h
linux-2.6.19-rc5-git2/include/linux/efi.h
--- linux-2.6.19-rc5-git2.orig/include/linux/efi.h 2006-11-13
11:15:19.000000000 +0200
+++ linux-2.6.19-rc5-git2/include/linux/efi.h 2006-11-13
11:15:38.000000000 +0200
@@ -300,7 +300,7 @@ extern int efi_mem_attribute_range (unsi
extern int __init efi_uart_console_only (void);
extern void efi_initialize_iomem_resources(struct resource
*code_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 struct efi_memory_map memmap;
diff -uprN linux-2.6.19-rc5-git2.orig/arch/i386/kernel/efi.c
linux-2.6.19-rc5-git2/arch/i386/kernel/efi.c
--- linux-2.6.19-rc5-git2.orig/arch/i386/kernel/efi.c 2006-11-13
11:15:17.000000000 +0200
+++ linux-2.6.19-rc5-git2/arch/i386/kernel/efi.c 2006-11-13
11:15:38.000000000 +0200
@@ -194,17 +194,25 @@ inline int efi_set_rtc_mmss(unsigned lon
return 0;
}
/*
- * This should only be used during kernel init and before runtime
- * services have been remapped, therefore, we'll need to call in
physical
- * mode. Note, this call isn't used later, so mark it __init.
+ * This is used during kernel init before runtime
+ * services have been remapped and also during suspend, therefore,
+ * 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_time_t eft;
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)
printk("Oops: efitime: can't read time status:
0x%lx\n",status);
On Mon, 2006-11-13 at 11:43 +0200, Myaskouvskey, Artiom wrote:
> From: Artiom Myaskouvskey <[email protected]>
Hi,
> - * This should only be used during kernel init and before runtime
> - * services have been remapped, therefore, we'll need to call in
> physical
> - * mode. Note, this call isn't used later, so mark it __init.
unfortunately your patch is word wrapped; please try using an email
program that does not wrap emails (or worst case, try using attachments
instead, but those are horrible in terms of patch review)
Greetings,
Arjan van de Ven
On Mon, 13 Nov 2006 11:43:45 +0200 Myaskouvskey, Artiom wrote:
> From: Artiom Myaskouvskey <[email protected]>
>
> 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 <[email protected]>
> ---
>
> diff -uprN linux-2.6.19-rc5-git2.orig/include/linux/efi.h
> linux-2.6.19-rc5-git2/include/linux/efi.h
> --- linux-2.6.19-rc5-git2.orig/include/linux/efi.h 2006-11-13
> 11:15:19.000000000 +0200
> +++ linux-2.6.19-rc5-git2/include/linux/efi.h 2006-11-13
> 11:15:38.000000000 +0200
> @@ -300,7 +300,7 @@ extern int efi_mem_attribute_range (unsi
> extern int __init efi_uart_console_only (void);
> extern void efi_initialize_iomem_resources(struct resource
> *code_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);
Hi--
Shouldn't the /__init/ on efi_set_rtc_mmss() also be dropped?
> extern struct efi_memory_map memmap;
>
> diff -uprN linux-2.6.19-rc5-git2.orig/arch/i386/kernel/efi.c
> linux-2.6.19-rc5-git2/arch/i386/kernel/efi.c
> --- linux-2.6.19-rc5-git2.orig/arch/i386/kernel/efi.c 2006-11-13
> 11:15:17.000000000 +0200
> +++ linux-2.6.19-rc5-git2/arch/i386/kernel/efi.c 2006-11-13
> 11:15:38.000000000 +0200
> @@ -194,17 +194,25 @@ inline int efi_set_rtc_mmss(unsigned lon
> return 0;
> }
> /*
> - * This should only be used during kernel init and before runtime
> - * services have been remapped, therefore, we'll need to call in
> physical
> - * mode. Note, this call isn't used later, so mark it __init.
> + * This is used during kernel init before runtime
> + * services have been remapped and also during suspend, therefore,
> + * 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_time_t eft;
> 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)
> printk("Oops: efitime: can't read time status:
> 0x%lx\n",status);
---
~Randy