Root/target/linux/coldfire/files-2.6.31/arch/m68k/include/asm/cf_page.h

1/*
2 * linux/include/asm-m68k/cf_page.h
3 *
4 * Copyright 2007-2009 Freescale Semiconductor, Inc. All Rights Reserved.
5 * Based on linux/include/asm-m68k/page.h
6 *
7 * 10/09/08 JKM: split Coldfire pieces into separate file
8 */
9#ifndef __CF_PAGE__
10#define __CF_PAGE__
11
12#include <linux/const.h>
13#include <asm/setup.h>
14#include <asm/page_offset.h>
15
16/* Virtual base page location */
17#define PAGE_OFFSET (PAGE_OFFSET_RAW)
18
19/* PAGE_SHIFT determines the page size */
20#define PAGE_SHIFT (13) /* 8K pages */
21#define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT)
22#define PAGE_MASK (~(PAGE_SIZE-1))
23
24#define THREAD_SIZE PAGE_SIZE
25
26#ifndef __ASSEMBLY__
27#include <linux/compiler.h>
28#include <asm/module.h>
29
30#define get_user_page(vaddr) __get_free_page(GFP_KERNEL)
31#define free_user_page(page, addr) free_page(addr)
32
33#define clear_page(page) memset((page), 0, PAGE_SIZE)
34#define copy_page(to,from) memcpy((to), (from), PAGE_SIZE)
35
36#define clear_user_page(addr, vaddr, page) \
37    do { clear_page(addr); \
38        flush_dcache_page(page); \
39    } while (0)
40
41#define copy_user_page(to, from, vaddr, page) \
42    do { copy_page(to, from); \
43        flush_dcache_page(page); \
44    } while (0)
45
46/*
47 * These are used to make use of C type-checking..
48 */
49typedef struct { unsigned long pte; } pte_t;
50typedef struct { unsigned long pmd[16]; } pmd_t;
51typedef struct { unsigned long pgd; } pgd_t;
52typedef struct { unsigned long pgprot; } pgprot_t;
53typedef struct page *pgtable_t;
54
55#define pte_val(x) ((x).pte)
56#define pmd_val(x) ((&x)->pmd[0])
57#define pgd_val(x) ((x).pgd)
58#define pgprot_val(x) ((x).pgprot)
59
60#define __pte(x) ((pte_t) { (x) } )
61#define __pmd(x) ((pmd_t) { (x) } )
62#define __pgd(x) ((pgd_t) { (x) } )
63#define __pgprot(x) ((pgprot_t) { (x) } )
64
65/* to align the pointer to the (next) page boundary */
66/*Defined in linux/mm.h*/
67/*#define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK)*/
68
69extern unsigned long m68k_memoffset;
70
71#define WANT_PAGE_VIRTUAL
72
73extern unsigned long cf_dma_base;
74extern unsigned long cf_dma_end;
75
76/*
77 * Convert a virt to a phys
78 */
79static inline unsigned long ___pa(void *vaddr)
80{
81#if CONFIG_SDRAM_BASE != PAGE_OFFSET
82    return (((unsigned long)vaddr & 0x0fffffff) + CONFIG_SDRAM_BASE);
83#else
84    if ((unsigned long)vaddr >= CONFIG_DMA_BASE &&
85        (unsigned long)vaddr < (CONFIG_DMA_BASE + CONFIG_DMA_SIZE)) {
86        /* address is in carved out DMA range */
87        return ((unsigned long)vaddr - CONFIG_DMA_BASE) + CONFIG_SDRAM_BASE;
88    }
89    else if ((unsigned long)vaddr >= PAGE_OFFSET &&
90         (unsigned long)vaddr < (PAGE_OFFSET + CONFIG_SDRAM_SIZE)) {
91        /* normal mapping */
92        return ((unsigned long)vaddr - PAGE_OFFSET) + CONFIG_SDRAM_BASE;
93    }
94
95    return (unsigned long)vaddr;
96#endif
97}
98#define __pa(vaddr) ___pa((void *)(vaddr))
99
100/*
101 * Convert a phys to a virt
102 */
103static inline void *__va(unsigned long paddr)
104{
105#if CONFIG_SDRAM_BASE != PAGE_OFFSET
106    return (void *)((paddr & 0x0fffffff) + PAGE_OFFSET);
107#else
108    if (paddr >= cf_dma_base && paddr <= cf_dma_end) {
109        /* mapped address for DMA */
110        return (void *)((paddr - CONFIG_SDRAM_BASE) + CONFIG_DMA_BASE);
111    }
112    else if (paddr >= cf_dma_end &&
113         paddr < (CONFIG_SDRAM_BASE + CONFIG_SDRAM_SIZE)) {
114        /* normal mapping */
115        return (void *)((paddr - CONFIG_SDRAM_BASE) + PAGE_OFFSET);
116    }
117    return (void *)paddr;
118#endif
119}
120
121/*
122 * NOTE: virtual isn't really correct, actually it should be the offset into the
123 * memory node, but we have no highmem, so that works for now.
124 *
125 * TODO: implement (fast) pfn<->pgdat_idx conversion functions, this makes lots
126 * of the shifts unnecessary.
127 *
128 * PFNs are used to map physical pages. So PFN[0] maps to the base phys addr.
129 */
130#define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT)
131#define pfn_to_virt(pfn) __va((pfn) << PAGE_SHIFT)
132
133extern int m68k_virt_to_node_shift;
134
135#ifdef CONFIG_SINGLE_MEMORY_CHUNK
136#define __virt_to_node(addr) (&pg_data_map[0])
137#else
138extern struct pglist_data *pg_data_table[];
139
140static inline __attribute_const__ int __virt_to_node_shift(void)
141{
142    return m68k_virt_to_node_shift;
143}
144
145#define __virt_to_node(addr) (pg_data_table[(unsigned long)(addr) >> __virt_to_node_shift()])
146#endif /* !CONFIG_SINGLE_MEMORY_CHUNK */
147
148#define virt_to_page(addr) ({ \
149    pfn_to_page(virt_to_pfn(addr)); \
150})
151#define page_to_virt(page) ({ \
152    pfn_to_virt(page_to_pfn(page)); \
153})
154
155#define pfn_to_page(pfn) ({ \
156    unsigned long __pfn = (pfn); \
157    struct pglist_data *pgdat; \
158    pgdat = __virt_to_node((unsigned long)pfn_to_virt(__pfn)); \
159    pgdat->node_mem_map + (__pfn - pgdat->node_start_pfn); \
160})
161#define page_to_pfn(_page) ({ \
162    struct page *__p = (_page); \
163    struct pglist_data *pgdat; \
164    pgdat = &pg_data_map[page_to_nid(__p)]; \
165    ((__p) - pgdat->node_mem_map) + pgdat->node_start_pfn; \
166})
167
168#define virt_addr_valid(kaddr) ( ((void *)(kaddr) >= (void *)PAGE_OFFSET && \
169                (void *)(kaddr) < high_memory) || \
170                ((void *)(kaddr) >= (void*)CONFIG_DMA_BASE && \
171                (void *)(kaddr) < (void*)(CONFIG_DMA_BASE+CONFIG_DMA_SIZE)))
172
173#define pfn_valid(pfn) virt_addr_valid(pfn_to_virt(pfn))
174
175#endif /* __ASSEMBLY__ */
176
177#define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \
178                 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
179
180#include <asm-generic/getorder.h>
181
182#ifdef CONFIG_VDSO
183#define __HAVE_ARCH_GATE_AREA
184#endif
185
186#endif /* __CF_PAGE__ */
187

Archive Download this file



interactive