Rev 6082 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5270 | serge | 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);\ |
||
39 | }) |
||
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 | |||
6082 | serge | 72 | /* |
73 | * Convert a physical address to a Page Frame Number and back |
||
74 | */ |
||
75 | #define __phys_to_pfn(paddr) ((unsigned long)((paddr) >> PAGE_SHIFT)) |
||
76 | #define __pfn_to_phys(pfn) PFN_PHYS(pfn) |
||
77 | |||
5270 | serge | 78 | #define page_to_pfn __page_to_pfn |
79 | #define pfn_to_page __pfn_to_page |
||
80 | |||
81 | #endif /* __ASSEMBLY__ */ |
||
82 | |||
83 | #endif |