summaryrefslogtreecommitdiffstats
path: root/include/asm-arm/cpu-multi32.h
blob: 500e473ca0179350e7f7dc0d862516f9168bedfd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#ifndef __ASSEMBLY__

#include <asm/page.h>

/* forward-declare task_struct */
struct task_struct;

/*
 * Don't change this structure - ASM code
 * relies on it.
 */
extern struct processor {
	/* MISC
	 * get data abort address/flags
	 */
	void (*_data_abort)(unsigned long pc);
	/*
	 * check for any bugs
	 */
	void (*_check_bugs)(void);
	/*
	 * Set up any processor specifics
	 */
	void (*_proc_init)(void);
	/*
	 * Disable any processor specifics
	 */
	void (*_proc_fin)(void);
	/*
	 * Processor architecture specific
	 */
	/* CACHE
	 *
	 * flush all caches
	 */
	void (*_flush_cache_all)(void);
	/*
	 * flush a specific page or pages
	 */
	void (*_flush_cache_area)(unsigned long address, unsigned long end, int flags);
	/*
	 * flush cache entry for an address
	 */
	void (*_flush_cache_entry)(unsigned long address);
	/*
	 * clean a virtual address range from the
	 * D-cache without flushing the cache.
	 */
	void (*_clean_cache_area)(unsigned long start, unsigned long size);
	/*
	 * flush a page to RAM
	 */
	void (*_flush_ram_page)(unsigned long page);
	/* TLB
	 *
	 * flush all TLBs
	 */
	void (*_flush_tlb_all)(void);
	/*
	 * flush a specific TLB
	 */
	void (*_flush_tlb_area)(unsigned long address, unsigned long end, int flags);
	/*
	 * Set the page table
	 */
	void (*_set_pgd)(unsigned long pgd_phys);
	/*
	 * Set a PMD (handling IMP bit 4)
	 */
	void (*_set_pmd)(pmd_t *pmdp, pmd_t pmd);
	/*
	 * Set a PTE
	 */
	void (*_set_pte)(pte_t *ptep, pte_t pte);
	/*
	 * Special stuff for a reset
	 */
	unsigned long (*reset)(void);
	/*
	 * flush an icached page
	 */
	void (*_flush_icache_area)(unsigned long start, unsigned long size);
	/*
	 * write back dirty cached data
	 */
	void (*_cache_wback_area)(unsigned long start, unsigned long end);
	/*
	 * purge cached data without (necessarily) writing it back
	 */
	void (*_cache_purge_area)(unsigned long start, unsigned long end);
	/*
	 * flush a specific TLB
	 */
	void (*_flush_tlb_page)(unsigned long address, int flags);
	/*
	 * Idle the processor
	 */
	int (*_do_idle)(void);
	/*
	 * flush I cache for a page
	 */
	void (*_flush_icache_page)(unsigned long address);
} processor;

extern const struct processor arm6_processor_functions;
extern const struct processor arm7_processor_functions;
extern const struct processor sa110_processor_functions;

#define cpu_data_abort(pc)			processor._data_abort(pc)
#define cpu_check_bugs()			processor._check_bugs()
#define cpu_proc_init()				processor._proc_init()
#define cpu_proc_fin()				processor._proc_fin()
#define cpu_do_idle()				processor._do_idle()

#define cpu_flush_cache_all()			processor._flush_cache_all()
#define cpu_flush_cache_area(start,end,flags)	processor._flush_cache_area(start,end,flags)
#define cpu_flush_cache_entry(addr)		processor._flush_cache_entry(addr)
#define cpu_clean_cache_area(start,size)	processor._clean_cache_area(start,size)
#define cpu_flush_ram_page(page)		processor._flush_ram_page(page)
#define cpu_flush_tlb_all()			processor._flush_tlb_all()
#define cpu_flush_tlb_area(start,end,flags)	processor._flush_tlb_area(start,end,flags)
#define cpu_flush_tlb_page(addr,flags)		processor._flush_tlb_page(addr,flags)
#define cpu_set_pgd(pgd)			processor._set_pgd(pgd)
#define cpu_set_pmd(pmdp, pmd)			processor._set_pmd(pmdp, pmd)
#define cpu_set_pte(ptep, pte)			processor._set_pte(ptep, pte)
#define cpu_reset()				processor.reset()
#define cpu_flush_icache_area(start,end)	processor._flush_icache_area(start,end)
#define cpu_cache_wback_area(start,end)		processor._cache_wback_area(start,end)
#define cpu_cache_purge_area(start,end)		processor._cache_purge_area(start,end)
#define cpu_flush_icache_page(virt)		processor._flush_icache_page(virt)

#define cpu_switch_mm(pgd,tsk)			cpu_set_pgd(__virt_to_phys((unsigned long)(pgd)))

#endif