2007-10-22 04:56:19 +04:00
# ifndef __ASM_E820_H
# define __ASM_E820_H
# define E820MAP 0x2d0 /* our map */
# define E820MAX 128 /* number of entries in E820MAP */
2008-05-14 19:15:40 +04:00
/*
* Legacy E820 BIOS limits us to 128 ( E820MAX ) nodes due to the
* constrained space in the zeropage . If we have more nodes than
* that , and if we ' ve booted off EFI firmware , then the EFI tables
* passed us from the EFI firmware can list more nodes . Size our
* internal memory map tables to have room for these additional
* nodes , based on up to three entries per node for which the
* kernel was built : MAX_NUMNODES = = ( 1 < < CONFIG_NODES_SHIFT ) ,
* plus E820MAX , allowing space for the possible duplicate E820
* entries that might need room in the same arrays , prior to the
* call to sanitize_e820_map ( ) to remove duplicates . The allowance
* of three memory map entries per node is " enough " entries for
* the initial hardware platform motivating this mechanism to make
* use of additional EFI map entries . Future platforms may want
* to allow more than three entries per node or otherwise refine
* this size .
*/
/*
* Odd : ' make headers_check ' complains about numa . h if I try
* to collapse the next two # ifdef lines to a single line :
* # if defined ( __KERNEL__ ) & & defined ( CONFIG_EFI )
*/
# ifdef __KERNEL__
# ifdef CONFIG_EFI
# include <linux/numa.h>
# define E820_X_MAX (E820MAX + 3 * MAX_NUMNODES)
# else /* ! CONFIG_EFI */
# define E820_X_MAX E820MAX
# endif
# else /* ! __KERNEL__ */
# define E820_X_MAX E820MAX
# endif
2007-10-22 04:56:19 +04:00
# define E820NR 0x1e8 /* # entries in E820MAP */
# define E820_RAM 1
# define E820_RESERVED 2
# define E820_ACPI 3
# define E820_NVS 4
2008-07-01 03:20:54 +04:00
/* reserved RAM used by kernel itself */
# define E820_RESERVED_KERN 128
2007-10-22 04:56:19 +04:00
# ifndef __ASSEMBLY__
struct e820entry {
__u64 addr ; /* start of memory segment */
__u64 size ; /* size of memory segment */
__u32 type ; /* type of memory segment */
} __attribute__ ( ( packed ) ) ;
struct e820map {
__u32 nr_map ;
2008-05-14 19:15:40 +04:00
struct e820entry map [ E820_X_MAX ] ;
2007-10-22 04:56:19 +04:00
} ;
2008-05-11 11:30:15 +04:00
2008-07-15 09:02:27 +04:00
# ifdef __KERNEL__
2008-06-27 15:12:55 +04:00
/* see comment in arch/x86/kernel/e820.c */
2008-05-11 11:30:15 +04:00
extern struct e820map e820 ;
2008-06-27 15:12:55 +04:00
extern struct e820map e820_saved ;
2008-05-11 11:30:15 +04:00
extern int e820_any_mapped ( u64 start , u64 end , unsigned type ) ;
extern int e820_all_mapped ( u64 start , u64 end , unsigned type ) ;
2008-06-16 05:58:51 +04:00
extern void e820_add_region ( u64 start , u64 size , int type ) ;
2008-05-11 11:30:15 +04:00
extern void e820_print_map ( char * who ) ;
2008-05-14 19:15:34 +04:00
extern int
2008-05-14 19:15:46 +04:00
sanitize_e820_map ( struct e820entry * biosmap , int max_nr_map , int * pnr_map ) ;
2008-06-16 05:58:51 +04:00
extern u64 e820_update_range ( u64 start , u64 size , unsigned old_type ,
2008-05-11 11:30:15 +04:00
unsigned new_type ) ;
2008-06-22 01:48:05 +04:00
extern u64 e820_remove_range ( u64 start , u64 size , unsigned old_type ,
int checktype ) ;
2008-05-11 11:30:15 +04:00
extern void update_e820 ( void ) ;
extern void e820_setup_gap ( void ) ;
2008-06-24 22:48:30 +04:00
extern int e820_search_gap ( unsigned long * gapstart , unsigned long * gapsize ,
2008-06-25 22:02:42 +04:00
unsigned long start_addr , unsigned long long end_addr ) ;
2008-06-11 07:33:39 +04:00
struct setup_data ;
extern void parse_e820_ext ( struct setup_data * data , unsigned long pa_data ) ;
2008-05-11 11:30:15 +04:00
2008-05-21 07:10:58 +04:00
# if defined(CONFIG_X86_64) || \
( defined ( CONFIG_X86_32 ) & & defined ( CONFIG_HIBERNATION ) )
extern void e820_mark_nosave_regions ( unsigned long limit_pfn ) ;
# else
static inline void e820_mark_nosave_regions ( unsigned long limit_pfn )
{
}
# endif
2008-07-15 11:02:28 +04:00
# ifdef CONFIG_MEMTEST
extern void early_memtest ( unsigned long start , unsigned long end ) ;
# else
static inline void early_memtest ( unsigned long start , unsigned long end )
{
}
# endif
2008-06-04 06:34:00 +04:00
extern unsigned long end_user_pfn ;
2008-05-18 12:18:57 +04:00
extern u64 find_e820_area ( u64 start , u64 end , u64 size , u64 align ) ;
extern u64 find_e820_area_size ( u64 start , u64 * sizep , u64 align ) ;
extern void reserve_early ( u64 start , u64 end , char * name ) ;
2008-06-22 18:22:07 +04:00
extern void reserve_early_overlap_ok ( u64 start , u64 end , char * name ) ;
2008-05-18 12:18:57 +04:00
extern void free_early ( u64 start , u64 end ) ;
extern void early_res_to_bootmem ( u64 start , u64 end ) ;
2008-06-02 00:17:38 +04:00
extern u64 early_reserve_e820 ( u64 startt , u64 sizet , u64 align ) ;
2008-05-18 12:18:57 +04:00
2008-07-11 07:38:26 +04:00
extern unsigned long e820_end_of_ram_pfn ( void ) ;
extern unsigned long e820_end_of_low_ram_pfn ( void ) ;
2008-06-04 06:34:00 +04:00
extern int e820_find_active_region ( const struct e820entry * ei ,
unsigned long start_pfn ,
unsigned long last_pfn ,
unsigned long * ei_startpfn ,
unsigned long * ei_endpfn ) ;
extern void e820_register_active_regions ( int nid , unsigned long start_pfn ,
unsigned long end_pfn ) ;
extern u64 e820_hole_size ( u64 start , u64 end ) ;
2008-06-10 23:55:54 +04:00
extern void finish_e820_parsing ( void ) ;
2008-06-17 00:03:31 +04:00
extern void e820_reserve_resources ( void ) ;
2008-06-17 06:58:28 +04:00
extern void setup_memory_map ( void ) ;
2008-06-19 04:27:08 +04:00
extern char * default_machine_specific_memory_setup ( void ) ;
2008-06-17 06:58:28 +04:00
extern char * machine_specific_memory_setup ( void ) ;
extern char * memory_setup ( void ) ;
2008-07-15 09:02:27 +04:00
# endif /* __KERNEL__ */
2007-10-22 04:56:19 +04:00
# endif /* __ASSEMBLY__ */
2008-01-30 15:33:08 +03:00
# define ISA_START_ADDRESS 0xa0000
# define ISA_END_ADDRESS 0x100000
2008-06-20 23:58:46 +04:00
# define is_ISA_range(s, e) ((s) >= ISA_START_ADDRESS && (e) < ISA_END_ADDRESS)
2008-01-30 15:33:08 +03:00
2008-01-30 15:34:06 +03:00
# define BIOS_BEGIN 0x000a0000
# define BIOS_END 0x00100000
2007-10-22 04:56:19 +04:00
# ifdef __KERNEL__
2008-06-17 06:58:28 +04:00
# include <linux/ioport.h>
# define HIGH_MEMORY (1024*1024)
2007-10-22 04:56:19 +04:00
# endif /* __KERNEL__ */
# endif /* __ASM_E820_H */