aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/asm-ppc64/lmb.h22
-rw-r--r--include/linux/mmzone.h30
2 files changed, 50 insertions, 2 deletions
diff --git a/include/asm-ppc64/lmb.h b/include/asm-ppc64/lmb.h
index cb368bf0f264..de91e034bd98 100644
--- a/include/asm-ppc64/lmb.h
+++ b/include/asm-ppc64/lmb.h
@@ -56,4 +56,26 @@ extern void lmb_dump_all(void);
56 56
57extern unsigned long io_hole_start; 57extern unsigned long io_hole_start;
58 58
59static inline unsigned long
60lmb_size_bytes(struct lmb_region *type, unsigned long region_nr)
61{
62 return type->region[region_nr].size;
63}
64static inline unsigned long
65lmb_size_pages(struct lmb_region *type, unsigned long region_nr)
66{
67 return lmb_size_bytes(type, region_nr) >> PAGE_SHIFT;
68}
69static inline unsigned long
70lmb_start_pfn(struct lmb_region *type, unsigned long region_nr)
71{
72 return type->region[region_nr].base >> PAGE_SHIFT;
73}
74static inline unsigned long
75lmb_end_pfn(struct lmb_region *type, unsigned long region_nr)
76{
77 return lmb_start_pfn(type, region_nr) +
78 lmb_size_pages(type, region_nr);
79}
80
59#endif /* _PPC64_LMB_H */ 81#endif /* _PPC64_LMB_H */
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index 6c90461ed99f..b97054bbc394 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -487,6 +487,28 @@ struct mem_section {
487 unsigned long section_mem_map; 487 unsigned long section_mem_map;
488}; 488};
489 489
490#ifdef CONFIG_ARCH_SPARSEMEM_EXTREME
491/*
492 * Should we ever require GCC 4 or later then the flat array scheme
493 * can be eliminated and a uniform solution for EXTREME and !EXTREME can
494 * be arrived at.
495 */
496#define SECTION_ROOT_SHIFT (PAGE_SHIFT-3)
497#define SECTION_ROOT_MASK ((1UL<<SECTION_ROOT_SHIFT) - 1)
498#define SECTION_TO_ROOT(_sec) ((_sec) >> SECTION_ROOT_SHIFT)
499#define NR_SECTION_ROOTS (NR_MEM_SECTIONS >> SECTION_ROOT_SHIFT)
500
501extern struct mem_section *mem_section[NR_SECTION_ROOTS];
502
503static inline struct mem_section *__nr_to_section(unsigned long nr)
504{
505 if (!mem_section[SECTION_TO_ROOT(nr)])
506 return NULL;
507 return &mem_section[SECTION_TO_ROOT(nr)][nr & SECTION_ROOT_MASK];
508}
509
510#else
511
490extern struct mem_section mem_section[NR_MEM_SECTIONS]; 512extern struct mem_section mem_section[NR_MEM_SECTIONS];
491 513
492static inline struct mem_section *__nr_to_section(unsigned long nr) 514static inline struct mem_section *__nr_to_section(unsigned long nr)
@@ -494,6 +516,10 @@ static inline struct mem_section *__nr_to_section(unsigned long nr)
494 return &mem_section[nr]; 516 return &mem_section[nr];
495} 517}
496 518
519#define sparse_index_init(_sec, _nid) do {} while (0)
520
521#endif
522
497/* 523/*
498 * We use the lower bits of the mem_map pointer to store 524 * We use the lower bits of the mem_map pointer to store
499 * a little bit of information. There should be at least 525 * a little bit of information. There should be at least
@@ -513,12 +539,12 @@ static inline struct page *__section_mem_map_addr(struct mem_section *section)
513 539
514static inline int valid_section(struct mem_section *section) 540static inline int valid_section(struct mem_section *section)
515{ 541{
516 return (section->section_mem_map & SECTION_MARKED_PRESENT); 542 return (section && (section->section_mem_map & SECTION_MARKED_PRESENT));
517} 543}
518 544
519static inline int section_has_mem_map(struct mem_section *section) 545static inline int section_has_mem_map(struct mem_section *section)
520{ 546{
521 return (section->section_mem_map & SECTION_HAS_MEM_MAP); 547 return (section && (section->section_mem_map & SECTION_HAS_MEM_MAP));
522} 548}
523 549
524static inline int valid_section_nr(unsigned long nr) 550static inline int valid_section_nr(unsigned long nr)