2005-04-17 02:20:36 +04:00
/*
* Written by : Patricia Gaughen < gone @ us . ibm . com > , IBM Corporation
* August 2002 : added remote node KVA remap - Martin J . Bligh
*
* Copyright ( C ) 2002 , IBM Corp .
*
* All rights reserved .
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* 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 , GOOD TITLE or
* NON INFRINGEMENT . See the GNU General Public License for more
* details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
# include <linux/bootmem.h>
2010-08-26 00:39:17 +04:00
# include <linux/memblock.h>
2005-06-23 11:08:33 +04:00
# include <linux/module.h>
2005-06-23 11:07:57 +04:00
2011-05-02 19:24:48 +04:00
# include "numa_internal.h"
2005-04-17 02:20:36 +04:00
2005-06-23 11:07:57 +04:00
# ifdef CONFIG_DISCONTIGMEM
2005-04-17 02:20:36 +04:00
/*
2005-06-23 11:07:57 +04:00
* 4 ) physnode_map - the mapping between a pfn and owning node
2005-04-17 02:20:36 +04:00
* physnode_map keeps track of the physical memory layout of a generic
2008-06-01 09:51:51 +04:00
* numa node on a 64 Mb break ( each element of the array will
* represent 64 Mb of memory and will be marked by the node id . so ,
2005-04-17 02:20:36 +04:00
* if the first gig is on node 0 , and the second gig is on node 1
* physnode_map will contain :
*
2008-06-01 09:51:51 +04:00
* physnode_map [ 0 - 15 ] = 0 ;
* physnode_map [ 16 - 31 ] = 1 ;
* physnode_map [ 32 - ] = - 1 ;
2005-04-17 02:20:36 +04:00
*/
2011-07-12 11:44:22 +04:00
s8 physnode_map [ MAX_SECTIONS ] __read_mostly = { [ 0 . . . ( MAX_SECTIONS - 1 ) ] = - 1 } ;
2005-06-23 11:08:33 +04:00
EXPORT_SYMBOL ( physnode_map ) ;
2005-04-17 02:20:36 +04:00
void memory_present ( int nid , unsigned long start , unsigned long end )
{
unsigned long pfn ;
2008-06-24 03:41:30 +04:00
printk ( KERN_INFO " Node: %d, start_pfn: %lx, end_pfn: %lx \n " ,
2005-04-17 02:20:36 +04:00
nid , start , end ) ;
printk ( KERN_DEBUG " Setting physnode_map array to node %d for pfns: \n " , nid ) ;
printk ( KERN_DEBUG " " ) ;
2014-02-01 16:30:19 +04:00
start = round_down ( start , PAGES_PER_SECTION ) ;
end = round_up ( end , PAGES_PER_SECTION ) ;
2011-07-12 11:44:22 +04:00
for ( pfn = start ; pfn < end ; pfn + = PAGES_PER_SECTION ) {
physnode_map [ pfn / PAGES_PER_SECTION ] = nid ;
2008-06-24 03:41:30 +04:00
printk ( KERN_CONT " %lx " , pfn ) ;
2005-04-17 02:20:36 +04:00
}
2008-06-01 09:51:51 +04:00
printk ( KERN_CONT " \n " ) ;
2005-04-17 02:20:36 +04:00
}
unsigned long node_memmap_size_bytes ( int nid , unsigned long start_pfn ,
unsigned long end_pfn )
{
unsigned long nr_pages = end_pfn - start_pfn ;
if ( ! nr_pages )
return 0 ;
return ( nr_pages + 1 ) * sizeof ( struct page ) ;
}
2005-06-23 11:07:57 +04:00
# endif
2005-04-17 02:20:36 +04:00
extern unsigned long highend_pfn , highstart_pfn ;
2011-02-16 14:13:06 +03:00
void __init initmem_init ( void )
2005-04-17 02:20:36 +04:00
{
2011-05-02 19:24:48 +04:00
x86_numa_init ( ) ;
2011-04-05 02:23:55 +04:00
2005-04-17 02:20:36 +04:00
# ifdef CONFIG_HIGHMEM
highstart_pfn = highend_pfn = max_pfn ;
2008-06-23 14:05:30 +04:00
if ( max_pfn > max_low_pfn )
highstart_pfn = max_low_pfn ;
2005-04-17 02:20:36 +04:00
printk ( KERN_NOTICE " %ldMB HIGHMEM available. \n " ,
pages_to_mb ( highend_pfn - highstart_pfn ) ) ;
2006-09-26 12:52:31 +04:00
high_memory = ( void * ) __va ( highstart_pfn * PAGE_SIZE - 1 ) + 1 ;
# else
2008-06-23 14:05:30 +04:00
high_memory = ( void * ) __va ( max_low_pfn * PAGE_SIZE - 1 ) + 1 ;
2005-04-17 02:20:36 +04:00
# endif
printk ( KERN_NOTICE " %ldMB LOWMEM available. \n " ,
2008-06-23 14:05:30 +04:00
pages_to_mb ( max_low_pfn ) ) ;
2008-06-24 03:41:30 +04:00
printk ( KERN_DEBUG " max_low_pfn = %lx, highstart_pfn = %lx \n " ,
max_low_pfn , highstart_pfn ) ;
2005-04-17 02:20:36 +04:00
2008-06-24 03:41:30 +04:00
printk ( KERN_DEBUG " Low memory ends at vaddr %08lx \n " ,
2005-04-17 02:20:36 +04:00
( ulong ) pfn_to_kaddr ( max_low_pfn ) ) ;
2008-06-24 23:19:41 +04:00
2008-06-24 03:41:30 +04:00
printk ( KERN_DEBUG " High memory starts at vaddr %08lx \n " ,
2005-04-17 02:20:36 +04:00
( ulong ) pfn_to_kaddr ( highstart_pfn ) ) ;
2008-06-24 23:19:41 +04:00
2005-04-17 02:20:36 +04:00
setup_bootmem_allocator ( ) ;
}