mirror of
				https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
				synced 2025-10-31 20:42:39 +00:00 
			
		
		
		
	 69ac9cd629
			
		
	
	
		69ac9cd629
		
	
	
	
	
		
			
			This patch adds /sys/firmware/memmap interface that represents the BIOS
(or Firmware) provided memory map. The tree looks like:
    /sys/firmware/memmap/0/start   (hex number)
                           end     (hex number)
                           type    (string)
    ...                 /1/start
                           end
                           type
With the following shell snippet one can print the memory map in the same form
the kernel prints itself when booting on x86 (the E820 map).
  --------- 8< --------------------------
    #!/bin/sh
    cd /sys/firmware/memmap
    for dir in * ; do
        start=$(cat $dir/start)
        end=$(cat $dir/end)
        type=$(cat $dir/type)
        printf "%016x-%016x (%s)\n" $start $[ $end +1] "$type"
    done
  --------- >8 --------------------------
That patch only provides the needed interface:
 1. The sysfs interface.
 2. The structure and enumeration definition.
 3. The function firmware_map_add() and firmware_map_add_early()
    that should be called from architecture code (E820/EFI, for
    example) to add the contents to the interface.
If the kernel is compiled without CONFIG_FIRMWARE_MEMMAP, the interface does
nothing without cluttering the architecture-specific code with #ifdef's.
The purpose of the new interface is kexec: While /proc/iomem represents
the *used* memory map (e.g. modified via kernel parameters like 'memmap'
and 'mem'), the /sys/firmware/memmap tree represents the unmodified memory
map provided via the firmware. So kexec can:
 - use the original memory map for rebooting,
 - use the /proc/iomem for setting up the ELF core headers for kdump
   case that should only represent the memory of the system.
The patch has been tested on i386 and x86_64.
Signed-off-by: Bernhard Walle <bwalle@suse.de>
Acked-by: Greg KH <gregkh@suse.de>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
Cc: kexec@lists.infradead.org
Cc: yhlu.kernel@gmail.com
Signed-off-by: Ingo Molnar <mingo@elte.hu>
		
	
			
		
			
				
	
	
		
			75 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * include/linux/firmware-map.h:
 | |
|  *  Copyright (C) 2008 SUSE LINUX Products GmbH
 | |
|  *  by Bernhard Walle <bwalle@suse.de>
 | |
|  *
 | |
|  * This program is free software; you can redistribute it and/or modify
 | |
|  * it under the terms of the GNU General Public License v2.0 as published by
 | |
|  * the Free Software Foundation
 | |
|  *
 | |
|  * This program is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|  * GNU General Public License for more details.
 | |
|  *
 | |
|  */
 | |
| #ifndef _LINUX_FIRMWARE_MAP_H
 | |
| #define _LINUX_FIRMWARE_MAP_H
 | |
| 
 | |
| #include <linux/list.h>
 | |
| #include <linux/kobject.h>
 | |
| 
 | |
| /*
 | |
|  * provide a dummy interface if CONFIG_FIRMWARE_MEMMAP is disabled
 | |
|  */
 | |
| #ifdef CONFIG_FIRMWARE_MEMMAP
 | |
| 
 | |
| /**
 | |
|  * Adds a firmware mapping entry. This function uses kmalloc() for memory
 | |
|  * allocation. Use firmware_map_add_early() if you want to use the bootmem
 | |
|  * allocator.
 | |
|  *
 | |
|  * That function must be called before late_initcall.
 | |
|  *
 | |
|  * @start: Start of the memory range.
 | |
|  * @end:   End of the memory range (inclusive).
 | |
|  * @type:  Type of the memory range.
 | |
|  *
 | |
|  * Returns 0 on success, or -ENOMEM if no memory could be allocated.
 | |
|  */
 | |
| int firmware_map_add(resource_size_t start, resource_size_t end,
 | |
| 		     const char *type);
 | |
| 
 | |
| /**
 | |
|  * Adds a firmware mapping entry. This function uses the bootmem allocator
 | |
|  * for memory allocation. Use firmware_map_add() if you want to use kmalloc().
 | |
|  *
 | |
|  * That function must be called before late_initcall.
 | |
|  *
 | |
|  * @start: Start of the memory range.
 | |
|  * @end:   End of the memory range (inclusive).
 | |
|  * @type:  Type of the memory range.
 | |
|  *
 | |
|  * Returns 0 on success, or -ENOMEM if no memory could be allocated.
 | |
|  */
 | |
| int firmware_map_add_early(resource_size_t start, resource_size_t end,
 | |
| 			   const char *type);
 | |
| 
 | |
| #else /* CONFIG_FIRMWARE_MEMMAP */
 | |
| 
 | |
| static inline int firmware_map_add(resource_size_t start, resource_size_t end,
 | |
| 				   const char *type)
 | |
| {
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| static inline int firmware_map_add_early(resource_size_t start,
 | |
| 					 resource_size_t end, const char *type)
 | |
| {
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| #endif /* CONFIG_FIRMWARE_MEMMAP */
 | |
| 
 | |
| #endif /* _LINUX_FIRMWARE_MAP_H */
 |