Rev 5270 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5270 | Rev 6082 | ||
---|---|---|---|
1 | #ifndef __ASM_MEMORY_MODEL_H |
1 | #ifndef __ASM_MEMORY_MODEL_H |
2 | #define __ASM_MEMORY_MODEL_H |
2 | #define __ASM_MEMORY_MODEL_H |
3 | 3 | ||
4 | #ifndef __ASSEMBLY__ |
4 | #ifndef __ASSEMBLY__ |
5 | 5 | ||
6 | #if defined(CONFIG_FLATMEM) |
6 | #if defined(CONFIG_FLATMEM) |
7 | 7 | ||
8 | #ifndef ARCH_PFN_OFFSET |
8 | #ifndef ARCH_PFN_OFFSET |
9 | #define ARCH_PFN_OFFSET (0UL) |
9 | #define ARCH_PFN_OFFSET (0UL) |
10 | #endif |
10 | #endif |
11 | 11 | ||
12 | #elif defined(CONFIG_DISCONTIGMEM) |
12 | #elif defined(CONFIG_DISCONTIGMEM) |
13 | 13 | ||
14 | #ifndef arch_pfn_to_nid |
14 | #ifndef arch_pfn_to_nid |
15 | #define arch_pfn_to_nid(pfn) pfn_to_nid(pfn) |
15 | #define arch_pfn_to_nid(pfn) pfn_to_nid(pfn) |
16 | #endif |
16 | #endif |
17 | 17 | ||
18 | #ifndef arch_local_page_offset |
18 | #ifndef arch_local_page_offset |
19 | #define arch_local_page_offset(pfn, nid) \ |
19 | #define arch_local_page_offset(pfn, nid) \ |
20 | ((pfn) - NODE_DATA(nid)->node_start_pfn) |
20 | ((pfn) - NODE_DATA(nid)->node_start_pfn) |
21 | #endif |
21 | #endif |
22 | 22 | ||
23 | #endif /* CONFIG_DISCONTIGMEM */ |
23 | #endif /* CONFIG_DISCONTIGMEM */ |
24 | 24 | ||
25 | /* |
25 | /* |
26 | * supports 3 memory models. |
26 | * supports 3 memory models. |
27 | */ |
27 | */ |
28 | #if defined(CONFIG_FLATMEM) |
28 | #if defined(CONFIG_FLATMEM) |
29 | 29 | ||
30 | #define __pfn_to_page(pfn) (mem_map + ((pfn) - ARCH_PFN_OFFSET)) |
30 | #define __pfn_to_page(pfn) (mem_map + ((pfn) - ARCH_PFN_OFFSET)) |
31 | #define __page_to_pfn(page) ((unsigned long)((page) - mem_map) + \ |
31 | #define __page_to_pfn(page) ((unsigned long)((page) - mem_map) + \ |
32 | ARCH_PFN_OFFSET) |
32 | ARCH_PFN_OFFSET) |
33 | #elif defined(CONFIG_DISCONTIGMEM) |
33 | #elif defined(CONFIG_DISCONTIGMEM) |
34 | 34 | ||
35 | #define __pfn_to_page(pfn) \ |
35 | #define __pfn_to_page(pfn) \ |
36 | ({ unsigned long __pfn = (pfn); \ |
36 | ({ unsigned long __pfn = (pfn); \ |
37 | unsigned long __nid = arch_pfn_to_nid(__pfn); \ |
37 | unsigned long __nid = arch_pfn_to_nid(__pfn); \ |
38 | NODE_DATA(__nid)->node_mem_map + arch_local_page_offset(__pfn, __nid);\ |
38 | NODE_DATA(__nid)->node_mem_map + arch_local_page_offset(__pfn, __nid);\ |
39 | }) |
39 | }) |
40 | 40 | ||
41 | #define __page_to_pfn(pg) \ |
41 | #define __page_to_pfn(pg) \ |
42 | ({ const struct page *__pg = (pg); \ |
42 | ({ const struct page *__pg = (pg); \ |
43 | struct pglist_data *__pgdat = NODE_DATA(page_to_nid(__pg)); \ |
43 | struct pglist_data *__pgdat = NODE_DATA(page_to_nid(__pg)); \ |
44 | (unsigned long)(__pg - __pgdat->node_mem_map) + \ |
44 | (unsigned long)(__pg - __pgdat->node_mem_map) + \ |
45 | __pgdat->node_start_pfn; \ |
45 | __pgdat->node_start_pfn; \ |
46 | }) |
46 | }) |
47 | 47 | ||
48 | #elif defined(CONFIG_SPARSEMEM_VMEMMAP) |
48 | #elif defined(CONFIG_SPARSEMEM_VMEMMAP) |
49 | 49 | ||
50 | /* memmap is virtually contiguous. */ |
50 | /* memmap is virtually contiguous. */ |
51 | #define __pfn_to_page(pfn) (vmemmap + (pfn)) |
51 | #define __pfn_to_page(pfn) (vmemmap + (pfn)) |
52 | #define __page_to_pfn(page) (unsigned long)((page) - vmemmap) |
52 | #define __page_to_pfn(page) (unsigned long)((page) - vmemmap) |
53 | 53 | ||
54 | #elif defined(CONFIG_SPARSEMEM) |
54 | #elif defined(CONFIG_SPARSEMEM) |
55 | /* |
55 | /* |
56 | * Note: section's mem_map is encoded to reflect its start_pfn. |
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; |
57 | * section[i].section_mem_map == mem_map's address - start_pfn; |
58 | */ |
58 | */ |
59 | #define __page_to_pfn(pg) \ |
59 | #define __page_to_pfn(pg) \ |
60 | ({ const struct page *__pg = (pg); \ |
60 | ({ const struct page *__pg = (pg); \ |
61 | int __sec = page_to_section(__pg); \ |
61 | int __sec = page_to_section(__pg); \ |
62 | (unsigned long)(__pg - __section_mem_map_addr(__nr_to_section(__sec))); \ |
62 | (unsigned long)(__pg - __section_mem_map_addr(__nr_to_section(__sec))); \ |
63 | }) |
63 | }) |
64 | 64 | ||
65 | #define __pfn_to_page(pfn) \ |
65 | #define __pfn_to_page(pfn) \ |
66 | ({ unsigned long __pfn = (pfn); \ |
66 | ({ unsigned long __pfn = (pfn); \ |
67 | struct mem_section *__sec = __pfn_to_section(__pfn); \ |
67 | struct mem_section *__sec = __pfn_to_section(__pfn); \ |
68 | __section_mem_map_addr(__sec) + __pfn; \ |
68 | __section_mem_map_addr(__sec) + __pfn; \ |
69 | }) |
69 | }) |
70 | #endif /* CONFIG_FLATMEM/DISCONTIGMEM/SPARSEMEM */ |
70 | #endif /* CONFIG_FLATMEM/DISCONTIGMEM/SPARSEMEM */ |
- | 71 | ||
- | 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) |
|
71 | 77 | ||
72 | #define page_to_pfn __page_to_pfn |
78 | #define page_to_pfn __page_to_pfn |
73 | #define pfn_to_page __pfn_to_page |
79 | #define pfn_to_page __pfn_to_page |
74 | 80 | ||
75 | #endif /* __ASSEMBLY__ */ |
81 | #endif /* __ASSEMBLY__ */ |
76 | 82 | ||
77 | #endif |
83 | #endif |