Re: [PATCH] x86: efi vendor_reserved memory type

From: Huang Ying
Date: Mon Sep 22 2008 - 02:16:18 EST


Hi, Cliff,

Why do you need this? Why not just set the memory area as ordinary
RESERVED? And use other method for these special devices to find out
these memory area (such as struct setup_data)?

Best Regards,
Huang Ying
On Fri, 2008-09-19 at 20:55 +0800, Cliff Wickman wrote:
> From: Cliff Wickman <cpw@xxxxxxx>
>
> Add an EFI_VENDOR_RESERVED memory type.
> This supports memory available only to special devices. Such memory
> will
> not be used as general RAM by the OS.
>
> And add a method for a device driver to locate that memory. The walk()
> function scans the EFI memory map and does a callback to a specified
> function for each memory area of a specified type.
> efi_memmap_walk_vr() is made available for a module to scan for
> type EFI_VENDOR_RESERVED.
>
> A UV driver will be posted later that will use these routines.
>
> Diffed against 2.6.27-rc1-mm1-dirty
>
> Signed-off-by: Cliff Wickman <cpw@xxxxxxx>
> ---
> arch/x86/kernel/efi.c | 36 ++++++++++++++++++++++++++++++++++++
> include/linux/efi.h | 3 ++-
> 2 files changed, 38 insertions(+), 1 deletion(-)
>
> Index: linux/arch/x86/kernel/efi.c
> ===================================================================
> --- linux.orig/arch/x86/kernel/efi.c
> +++ linux/arch/x86/kernel/efi.c
> @@ -568,3 +568,39 @@ u64 efi_mem_attributes(unsigned long phy
> }
> return 0;
> }
> +
> +static void
> +walk(efi_freemem_callback_t callback, void *arg, int type)
> +{
> + efi_memory_desc_t *md;
> + void *p;
> + int size;
> +
> + /*
> + * memmap.map is zeroed in efi_enter_virtual_mode()
> + * but we can use the physical address (phys_map)
> + */
> + size = memmap.nr_map*memmap.desc_size;
> + for (p = memmap.phys_map; p < memmap.phys_map+size;
> + p += memmap.desc_size)
> {
> + md = (efi_memory_desc_t *)__va(p);
> + if (md->type != type)
> + continue;
> + if ((*callback)(md->phys_addr,
> + md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT)
> - 1,
> + arg) < 0)
> + return;
> + }
> +}
> +
> +/*
> + * Walk the EFI memory map and call "callback" once for each EFI
> memory
> + * descriptor of type VENDOR_RESERVED.
> + */
> +void
> +efi_memmap_walk_vr(efi_freemem_callback_t callback, void *arg)
> +{
> + walk(callback, arg, EFI_VENDOR_RESERVED);
> +}
> +
> +EXPORT_SYMBOL_GPL(efi_memmap_walk_vr);
> Index: linux/include/linux/efi.h
> ===================================================================
> --- linux.orig/include/linux/efi.h
> +++ linux/include/linux/efi.h
> @@ -77,7 +77,8 @@ typedef struct {
> #define EFI_MEMORY_MAPPED_IO 11
> #define EFI_MEMORY_MAPPED_IO_PORT_SPACE 12
> #define EFI_PAL_CODE 13
> -#define EFI_MAX_MEMORY_TYPE 14
> +#define EFI_VENDOR_RESERVED 14
> +#define EFI_MAX_MEMORY_TYPE 15
>
> /* Attribute values: */
> #define EFI_MEMORY_UC ((u64)0x0000000000000001ULL) /*
> uncached */
>
>

Attachment: signature.asc
Description: This is a digitally signed message part