Green shading in the line number column means the source is part of the translation unit, red means it is conditionally excluded. Highlighted line numbers link to the translation unit page. Highlighted macros link to the macro page.
1: #ifndef __ASM_MEMORY_MODEL_H 2: #define __ASM_MEMORY_MODEL_H 3: 4: #ifndef __ASSEMBLY__ 5: 6: #if defined(CONFIG_FLATMEM) 7: 8: #ifndef ARCH_PFN_OFFSET 9: #define ARCH_PFN_OFFSET (0UL) 10: #endif 11: 12: #elif defined(CONFIG_DISCONTIGMEM) 13: 14: #ifndef arch_pfn_to_nid 15: #define arch_pfn_to_nid(pfn) pfn_to_nid(pfn) 16: #endif 17: 18: #ifndef arch_local_page_offset 19: #define arch_local_page_offset(pfn, nid) \ 20: ((pfn) - NODE_DATA(nid)->node_start_pfn) 21: #endif 22: 23: #endif /* CONFIG_DISCONTIGMEM */ 24: 25: /* 26: * supports 3 memory models. 27: */ 28: #if defined(CONFIG_FLATMEM) 29: 30: #define __pfn_to_page(pfn) (mem_map + ((pfn) - ARCH_PFN_OFFSET)) 31: #define __page_to_pfn(page) ((unsigned long)((page) - mem_map) + \ 32: ARCH_PFN_OFFSET) 33: #elif defined(CONFIG_DISCONTIGMEM) 34: 35: #define __pfn_to_page(pfn) \ 36: ({ unsigned long __pfn = (pfn); \ 37: unsigned long __nid = arch_pfn_to_nid(__pfn); \ 38: NODE_DATA(__nid)->node_mem_map + arch_local_page_offset(__pfn, __nid);\ }) 40: 41: #define __page_to_pfn(pg) \ 42: ({ const struct page *__pg = (pg); \ 43: struct pglist_data *__pgdat = NODE_DATA(page_to_nid(__pg)); \ 44: (unsigned long)(__pg - __pgdat->node_mem_map) + \ 45: __pgdat->node_start_pfn; \ 46: }) 47: 48: #elif defined(CONFIG_SPARSEMEM_VMEMMAP) 49: 50: /* memmap is virtually contiguous. */ 51: #define __pfn_to_page(pfn) (vmemmap + (pfn)) 52: #define __page_to_pfn(page) (unsigned long)((page) - vmemmap) 53: 54: #elif defined(CONFIG_SPARSEMEM) 55: /* 56: * Note: section's mem_map is encoded to reflect its start_pfn. 57: * section[i].section_mem_map == mem_map's address - start_pfn; 58: */ 59: #define __page_to_pfn(pg) \ 60: ({ const struct page *__pg = (pg); \ 61: int __sec = page_to_section(__pg); \ 62: (unsigned long)(__pg - __section_mem_map_addr(__nr_to_section(__sec))); \ 63: }) 64: 65: #define __pfn_to_page(pfn) \ 66: ({ unsigned long __pfn = (pfn); \ 67: struct mem_section *__sec = __pfn_to_section(__pfn); \ 68: __section_mem_map_addr(__sec) + __pfn; \ 69: }) 70: #endif /* CONFIG_FLATMEM/DISCONTIGMEM/SPARSEMEM */ 71: 72: #define page_to_pfn __page_to_pfn 73: #define pfn_to_page __pfn_to_page 74: 75: #endif /* __ASSEMBLY__ */ 76: 77: #endif 78: