Commit | Line | Data |
---|---|---|
1da177e4 | 1 | /* |
4baa9922 | 2 | * arch/arm/include/asm/proc-fns.h |
1da177e4 LT |
3 | * |
4 | * Copyright (C) 1997-1999 Russell King | |
5 | * Copyright (C) 2000 Deep Blue Solutions Ltd | |
6 | * | |
7 | * This program is free software; you can redistribute it and/or modify | |
8 | * it under the terms of the GNU General Public License version 2 as | |
9 | * published by the Free Software Foundation. | |
10 | */ | |
11 | #ifndef __ASM_PROCFNS_H | |
12 | #define __ASM_PROCFNS_H | |
13 | ||
14 | #ifdef __KERNEL__ | |
15 | ||
753790e7 RK |
16 | #include <asm/glue-proc.h> |
17 | #include <asm/page.h> | |
1da177e4 | 18 | |
753790e7 RK |
19 | #ifndef __ASSEMBLY__ |
20 | ||
21 | struct mm_struct; | |
1da177e4 LT |
22 | |
23 | /* | |
753790e7 | 24 | * Don't change this structure - ASM code relies on it. |
1da177e4 | 25 | */ |
753790e7 RK |
26 | extern struct processor { |
27 | /* MISC | |
28 | * get data abort address/flags | |
29 | */ | |
30 | void (*_data_abort)(unsigned long pc); | |
31 | /* | |
32 | * Retrieve prefetch fault address | |
33 | */ | |
34 | unsigned long (*_prefetch_abort)(unsigned long lr); | |
35 | /* | |
36 | * Set up any processor specifics | |
37 | */ | |
38 | void (*_proc_init)(void); | |
39 | /* | |
40 | * Disable any processor specifics | |
41 | */ | |
42 | void (*_proc_fin)(void); | |
43 | /* | |
44 | * Special stuff for a reset | |
45 | */ | |
46 | void (*reset)(unsigned long addr) __attribute__((noreturn)); | |
47 | /* | |
48 | * Idle the processor | |
49 | */ | |
50 | int (*_do_idle)(void); | |
51 | /* | |
52 | * Processor architecture specific | |
53 | */ | |
54 | /* | |
55 | * clean a virtual address range from the | |
56 | * D-cache without flushing the cache. | |
57 | */ | |
58 | void (*dcache_clean_area)(void *addr, int size); | |
59 | ||
60 | /* | |
61 | * Set the page table | |
62 | */ | |
63 | void (*switch_mm)(unsigned long pgd_phys, struct mm_struct *mm); | |
64 | /* | |
65 | * Set a possibly extended PTE. Non-extended PTEs should | |
66 | * ignore 'ext'. | |
67 | */ | |
da028779 CM |
68 | #ifdef CONFIG_ARM_LPAE |
69 | void (*set_pte_ext)(pte_t *ptep, pte_t pte); | |
70 | #else | |
753790e7 | 71 | void (*set_pte_ext)(pte_t *ptep, pte_t pte, unsigned int ext); |
da028779 | 72 | #endif |
f6b0fa02 RK |
73 | |
74 | /* Suspend/resume */ | |
75 | unsigned int suspend_size; | |
76 | void (*do_suspend)(void *); | |
77 | void (*do_resume)(void *); | |
753790e7 | 78 | } processor; |
1da177e4 LT |
79 | |
80 | #ifndef MULTI_CPU | |
753790e7 RK |
81 | extern void cpu_proc_init(void); |
82 | extern void cpu_proc_fin(void); | |
83 | extern int cpu_do_idle(void); | |
84 | extern void cpu_dcache_clean_area(void *, int); | |
85 | extern void cpu_do_switch_mm(unsigned long pgd_phys, struct mm_struct *mm); | |
da028779 CM |
86 | #ifdef CONFIG_ARM_LPAE |
87 | extern void cpu_set_pte_ext(pte_t *ptep, pte_t pte); | |
88 | #else | |
753790e7 | 89 | extern void cpu_set_pte_ext(pte_t *ptep, pte_t pte, unsigned int ext); |
da028779 | 90 | #endif |
753790e7 | 91 | extern void cpu_reset(unsigned long addr) __attribute__((noreturn)); |
abda1bd5 RK |
92 | |
93 | /* These three are private to arch/arm/kernel/suspend.c */ | |
94 | extern void cpu_do_suspend(void *); | |
95 | extern void cpu_do_resume(void *); | |
1da177e4 | 96 | #else |
eca5dc2a WD |
97 | #define cpu_proc_init processor._proc_init |
98 | #define cpu_proc_fin processor._proc_fin | |
99 | #define cpu_reset processor.reset | |
100 | #define cpu_do_idle processor._do_idle | |
101 | #define cpu_dcache_clean_area processor.dcache_clean_area | |
102 | #define cpu_set_pte_ext processor.set_pte_ext | |
103 | #define cpu_do_switch_mm processor.switch_mm | |
abda1bd5 RK |
104 | |
105 | /* These three are private to arch/arm/kernel/suspend.c */ | |
106 | #define cpu_do_suspend processor.do_suspend | |
107 | #define cpu_do_resume processor.do_resume | |
1da177e4 LT |
108 | #endif |
109 | ||
f6b0fa02 RK |
110 | extern void cpu_resume(void); |
111 | ||
1da177e4 LT |
112 | #include <asm/memory.h> |
113 | ||
002547b4 RK |
114 | #ifdef CONFIG_MMU |
115 | ||
1da177e4 LT |
116 | #define cpu_switch_mm(pgd,mm) cpu_do_switch_mm(virt_to_phys(pgd),mm) |
117 | ||
da028779 CM |
118 | #ifdef CONFIG_ARM_LPAE |
119 | #define cpu_get_pgd() \ | |
120 | ({ \ | |
121 | unsigned long pg, pg2; \ | |
122 | __asm__("mrrc p15, 0, %0, %1, c2" \ | |
123 | : "=r" (pg), "=r" (pg2) \ | |
124 | : \ | |
125 | : "cc"); \ | |
126 | pg &= ~(PTRS_PER_PGD*sizeof(pgd_t)-1); \ | |
127 | (pgd_t *)phys_to_virt(pg); \ | |
128 | }) | |
129 | #else | |
1da177e4 LT |
130 | #define cpu_get_pgd() \ |
131 | ({ \ | |
132 | unsigned long pg; \ | |
133 | __asm__("mrc p15, 0, %0, c2, c0, 0" \ | |
134 | : "=r" (pg) : : "cc"); \ | |
135 | pg &= ~0x3fff; \ | |
136 | (pgd_t *)phys_to_virt(pg); \ | |
137 | }) | |
da028779 | 138 | #endif |
1da177e4 | 139 | |
002547b4 RK |
140 | #endif |
141 | ||
1da177e4 LT |
142 | #endif /* __ASSEMBLY__ */ |
143 | #endif /* __KERNEL__ */ | |
144 | #endif /* __ASM_PROCFNS_H */ |