2008-10-22 22:26:29 -07:00
# ifndef _ASM_X86_E820_H
# define _ASM_X86_E820_H
2007-10-22 10:56:19 +10:00
# define E820MAP 0x2d0 /* our map */
# define E820MAX 128 /* number of entries in E820MAP */
2008-05-14 08:15:40 -07: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 10:56:19 +10:00
# define E820NR 0x1e8 /* # entries in E820MAP */
# define E820_RAM 1
# define E820_RESERVED 2
# define E820_ACPI 3
# define E820_NVS 4
2008-08-20 16:43:07 -07:00
# define E820_UNUSABLE 5
2007-10-22 10:56:19 +10:00
2010-03-10 14:36:10 +08:00
/*
* reserved RAM used by kernel itself
* if CONFIG_INTEL_TXT is enabled , memory of this type will be
* included in the S3 integrity calculation and so should not include
* any memory that BIOS might alter over the S3 transition
*/
2008-06-30 16:20:54 -07:00
# define E820_RESERVED_KERN 128
2007-10-22 10:56:19 +10:00
# ifndef __ASSEMBLY__
2009-01-30 22:44:58 +05:30
# include <linux/types.h>
2007-10-22 10:56:19 +10:00
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 08:15:40 -07:00
struct e820entry map [ E820_X_MAX ] ;
2007-10-22 10:56:19 +10:00
} ;
2008-05-11 00:30:15 -07:00
2009-11-23 14:44:39 -08:00
# define ISA_START_ADDRESS 0xa0000
# define ISA_END_ADDRESS 0x100000
# define BIOS_BEGIN 0x000a0000
# define BIOS_END 0x00100000
2010-12-16 10:39:02 -07:00
# define BIOS_ROM_BASE 0xffe00000
# define BIOS_ROM_END 0xffffffff
2008-07-15 15:02:27 +10:00
# ifdef __KERNEL__
2008-06-27 13:12:55 +02:00
/* see comment in arch/x86/kernel/e820.c */
2008-05-11 00:30:15 -07:00
extern struct e820map e820 ;
2008-06-27 13:12:55 +02:00
extern struct e820map e820_saved ;
2008-05-11 00:30:15 -07:00
2008-07-21 22:19:29 +05:30
extern unsigned long pci_mem_start ;
2008-05-11 00:30:15 -07: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-15 18:58:51 -07:00
extern void e820_add_region ( u64 start , u64 size , int type ) ;
2008-05-11 00:30:15 -07:00
extern void e820_print_map ( char * who ) ;
2008-05-14 08:15:34 -07:00
extern int
2009-03-23 02:13:01 +05:30
sanitize_e820_map ( struct e820entry * biosmap , int max_nr_map , u32 * pnr_map ) ;
2008-06-15 18:58:51 -07:00
extern u64 e820_update_range ( u64 start , u64 size , unsigned old_type ,
2008-05-11 00:30:15 -07:00
unsigned new_type ) ;
2008-06-21 14:48:05 -07:00
extern u64 e820_remove_range ( u64 start , u64 size , unsigned old_type ,
int checktype ) ;
2008-05-11 00:30:15 -07:00
extern void update_e820 ( void ) ;
extern void e820_setup_gap ( void ) ;
2008-06-24 11:48:30 -07:00
extern int e820_search_gap ( unsigned long * gapstart , unsigned long * gapsize ,
2008-06-25 11:02:42 -07:00
unsigned long start_addr , unsigned long long end_addr ) ;
2008-06-11 11:33:39 +08:00
struct setup_data ;
2011-02-22 21:07:36 +01:00
extern void parse_e820_ext ( struct setup_data * data ) ;
2008-05-11 00:30:15 -07:00
2008-05-20 20:10:58 -07: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 00:02:28 -07: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-07-10 20:38:26 -07:00
extern unsigned long e820_end_of_ram_pfn ( void ) ;
extern unsigned long e820_end_of_low_ram_pfn ( void ) ;
2010-08-25 13:39:17 -07:00
extern u64 early_reserve_e820 ( u64 startt , u64 sizet , u64 align ) ;
void memblock_x86_fill ( void ) ;
2010-08-25 13:39:18 -07:00
void memblock_find_dma_reserve ( void ) ;
2008-06-10 12:55:54 -07:00
extern void finish_e820_parsing ( void ) ;
2008-06-16 13:03:31 -07:00
extern void e820_reserve_resources ( void ) ;
2008-08-28 13:52:25 -07:00
extern void e820_reserve_resources_late ( void ) ;
2008-06-16 19:58:28 -07:00
extern void setup_memory_map ( void ) ;
2008-06-18 17:27:08 -07:00
extern char * default_machine_specific_memory_setup ( void ) ;
2007-10-22 10:56:19 +10:00
2009-11-30 21:33:51 -08:00
/*
* Returns true iff the specified range [ s , e ) is completely contained inside
* the ISA region .
*/
2009-11-23 14:44:39 -08:00
static inline bool is_ISA_range ( u64 s , u64 e )
{
2009-11-30 21:33:51 -08:00
return s > = ISA_START_ADDRESS & & e < = ISA_END_ADDRESS ;
2009-11-23 14:44:39 -08:00
}
2008-01-30 13:33:08 +01:00
2009-11-23 14:44:39 -08:00
# endif /* __KERNEL__ */
# endif /* __ASSEMBLY__ */
2008-01-30 13:34:06 +01:00
2007-10-22 10:56:19 +10:00
# ifdef __KERNEL__
2008-06-16 19:58:28 -07:00
# include <linux/ioport.h>
# define HIGH_MEMORY (1024*1024)
2007-10-22 10:56:19 +10:00
# endif /* __KERNEL__ */
2008-10-22 22:26:29 -07:00
# endif /* _ASM_X86_E820_H */