Re: [PATCH 2.6.19-rc5-git2] EFI: calling efi_get_time duringsuspend

From: Randy Dunlap
Date: Sun Dec 10 2006 - 23:25:00 EST


On Mon, 13 Nov 2006 11:43:45 +0200 Myaskouvskey, Artiom wrote:

> From: Artiom Myaskouvskey <artiom.myaskouvskey@xxxxxxxxx>
>
> 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@xxxxxxxxx>
> ---
>
> 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
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/