diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-22 10:38:37 -0500 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-22 10:38:37 -0500 |
commit | fcc9d2e5a6c89d22b8b773a64fb4ad21ac318446 (patch) | |
tree | a57612d1888735a2ec7972891b68c1ac5ec8faea /arch/sparc/include | |
parent | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (diff) |
Diffstat (limited to 'arch/sparc/include')
48 files changed, 3728 insertions, 0 deletions
diff --git a/arch/sparc/include/asm/apc.h b/arch/sparc/include/asm/apc.h new file mode 100644 index 00000000000..24e9a7d4d97 --- /dev/null +++ b/arch/sparc/include/asm/apc.h | |||
@@ -0,0 +1,64 @@ | |||
1 | /* apc - Driver definitions for power management functions | ||
2 | * of Aurora Personality Chip (APC) on SPARCstation-4/5 and | ||
3 | * derivatives | ||
4 | * | ||
5 | * Copyright (c) 2001 Eric Brower (ebrower@usa.net) | ||
6 | * | ||
7 | */ | ||
8 | |||
9 | #ifndef _SPARC_APC_H | ||
10 | #define _SPARC_APC_H | ||
11 | |||
12 | #include <linux/ioctl.h> | ||
13 | |||
14 | #define APC_IOC 'A' | ||
15 | |||
16 | #define APCIOCGFANCTL _IOR(APC_IOC, 0x00, int) /* Get fan speed */ | ||
17 | #define APCIOCSFANCTL _IOW(APC_IOC, 0x01, int) /* Set fan speed */ | ||
18 | |||
19 | #define APCIOCGCPWR _IOR(APC_IOC, 0x02, int) /* Get CPOWER state */ | ||
20 | #define APCIOCSCPWR _IOW(APC_IOC, 0x03, int) /* Set CPOWER state */ | ||
21 | |||
22 | #define APCIOCGBPORT _IOR(APC_IOC, 0x04, int) /* Get BPORT state */ | ||
23 | #define APCIOCSBPORT _IOW(APC_IOC, 0x05, int) /* Set BPORT state */ | ||
24 | |||
25 | /* | ||
26 | * Register offsets | ||
27 | */ | ||
28 | #define APC_IDLE_REG 0x00 | ||
29 | #define APC_FANCTL_REG 0x20 | ||
30 | #define APC_CPOWER_REG 0x24 | ||
31 | #define APC_BPORT_REG 0x30 | ||
32 | |||
33 | #define APC_REGMASK 0x01 | ||
34 | #define APC_BPMASK 0x03 | ||
35 | |||
36 | /* | ||
37 | * IDLE - CPU standby values (set to initiate standby) | ||
38 | */ | ||
39 | #define APC_IDLE_ON 0x01 | ||
40 | |||
41 | /* | ||
42 | * FANCTL - Fan speed control state values | ||
43 | */ | ||
44 | #define APC_FANCTL_HI 0x00 /* Fan speed high */ | ||
45 | #define APC_FANCTL_LO 0x01 /* Fan speed low */ | ||
46 | |||
47 | /* | ||
48 | * CPWR - Convenience power outlet state values | ||
49 | */ | ||
50 | #define APC_CPOWER_ON 0x00 /* Conv power on */ | ||
51 | #define APC_CPOWER_OFF 0x01 /* Conv power off */ | ||
52 | |||
53 | /* | ||
54 | * BPA/BPB - Read-Write "Bit Ports" state values (reset to 0 at power-on) | ||
55 | * | ||
56 | * WARNING: Internal usage of bit ports is platform dependent-- | ||
57 | * don't modify BPORT settings unless you know what you are doing. | ||
58 | * | ||
59 | * On SS5 BPA seems to toggle onboard ethernet loopback... -E | ||
60 | */ | ||
61 | #define APC_BPORT_A 0x01 /* Bit Port A */ | ||
62 | #define APC_BPORT_B 0x02 /* Bit Port B */ | ||
63 | |||
64 | #endif /* !(_SPARC_APC_H) */ | ||
diff --git a/arch/sparc/include/asm/asi.h b/arch/sparc/include/asm/asi.h new file mode 100644 index 00000000000..b2e3db63a64 --- /dev/null +++ b/arch/sparc/include/asm/asi.h | |||
@@ -0,0 +1,266 @@ | |||
1 | #ifndef _SPARC_ASI_H | ||
2 | #define _SPARC_ASI_H | ||
3 | |||
4 | /* asi.h: Address Space Identifier values for the sparc. | ||
5 | * | ||
6 | * Copyright (C) 1995,1996 David S. Miller (davem@caip.rutgers.edu) | ||
7 | * | ||
8 | * Pioneer work for sun4m: Paul Hatchman (paul@sfe.com.au) | ||
9 | * Joint edition for sun4c+sun4m: Pete A. Zaitcev <zaitcev@ipmce.su> | ||
10 | */ | ||
11 | |||
12 | /* The first batch are for the sun4c. */ | ||
13 | |||
14 | #define ASI_NULL1 0x00 | ||
15 | #define ASI_NULL2 0x01 | ||
16 | |||
17 | /* sun4c and sun4 control registers and mmu/vac ops */ | ||
18 | #define ASI_CONTROL 0x02 | ||
19 | #define ASI_SEGMAP 0x03 | ||
20 | #define ASI_PTE 0x04 | ||
21 | #define ASI_HWFLUSHSEG 0x05 | ||
22 | #define ASI_HWFLUSHPAGE 0x06 | ||
23 | #define ASI_REGMAP 0x06 | ||
24 | #define ASI_HWFLUSHCONTEXT 0x07 | ||
25 | |||
26 | #define ASI_USERTXT 0x08 | ||
27 | #define ASI_KERNELTXT 0x09 | ||
28 | #define ASI_USERDATA 0x0a | ||
29 | #define ASI_KERNELDATA 0x0b | ||
30 | |||
31 | /* VAC Cache flushing on sun4c and sun4 */ | ||
32 | #define ASI_FLUSHSEG 0x0c | ||
33 | #define ASI_FLUSHPG 0x0d | ||
34 | #define ASI_FLUSHCTX 0x0e | ||
35 | |||
36 | /* SPARCstation-5: only 6 bits are decoded. */ | ||
37 | /* wo = Write Only, rw = Read Write; */ | ||
38 | /* ss = Single Size, as = All Sizes; */ | ||
39 | #define ASI_M_RES00 0x00 /* Don't touch... */ | ||
40 | #define ASI_M_UNA01 0x01 /* Same here... */ | ||
41 | #define ASI_M_MXCC 0x02 /* Access to TI VIKING MXCC registers */ | ||
42 | #define ASI_M_FLUSH_PROBE 0x03 /* Reference MMU Flush/Probe; rw, ss */ | ||
43 | #ifndef CONFIG_SPARC_LEON | ||
44 | #define ASI_M_MMUREGS 0x04 /* MMU Registers; rw, ss */ | ||
45 | #else | ||
46 | #define ASI_M_MMUREGS 0x19 | ||
47 | #endif /* CONFIG_SPARC_LEON */ | ||
48 | #define ASI_M_TLBDIAG 0x05 /* MMU TLB only Diagnostics */ | ||
49 | #define ASI_M_DIAGS 0x06 /* Reference MMU Diagnostics */ | ||
50 | #define ASI_M_IODIAG 0x07 /* MMU I/O TLB only Diagnostics */ | ||
51 | #define ASI_M_USERTXT 0x08 /* Same as ASI_USERTXT; rw, as */ | ||
52 | #define ASI_M_KERNELTXT 0x09 /* Same as ASI_KERNELTXT; rw, as */ | ||
53 | #define ASI_M_USERDATA 0x0A /* Same as ASI_USERDATA; rw, as */ | ||
54 | #define ASI_M_KERNELDATA 0x0B /* Same as ASI_KERNELDATA; rw, as */ | ||
55 | #define ASI_M_TXTC_TAG 0x0C /* Instruction Cache Tag; rw, ss */ | ||
56 | #define ASI_M_TXTC_DATA 0x0D /* Instruction Cache Data; rw, ss */ | ||
57 | #define ASI_M_DATAC_TAG 0x0E /* Data Cache Tag; rw, ss */ | ||
58 | #define ASI_M_DATAC_DATA 0x0F /* Data Cache Data; rw, ss */ | ||
59 | |||
60 | /* The following cache flushing ASIs work only with the 'sta' | ||
61 | * instruction. Results are unpredictable for 'swap' and 'ldstuba', | ||
62 | * so don't do it. | ||
63 | */ | ||
64 | |||
65 | /* These ASI flushes affect external caches too. */ | ||
66 | #define ASI_M_FLUSH_PAGE 0x10 /* Flush I&D Cache Line (page); wo, ss */ | ||
67 | #define ASI_M_FLUSH_SEG 0x11 /* Flush I&D Cache Line (seg); wo, ss */ | ||
68 | #define ASI_M_FLUSH_REGION 0x12 /* Flush I&D Cache Line (region); wo, ss */ | ||
69 | #define ASI_M_FLUSH_CTX 0x13 /* Flush I&D Cache Line (context); wo, ss */ | ||
70 | #define ASI_M_FLUSH_USER 0x14 /* Flush I&D Cache Line (user); wo, ss */ | ||
71 | |||
72 | /* Block-copy operations are available only on certain V8 cpus. */ | ||
73 | #define ASI_M_BCOPY 0x17 /* Block copy */ | ||
74 | |||
75 | /* These affect only the ICACHE and are Ross HyperSparc and TurboSparc specific. */ | ||
76 | #define ASI_M_IFLUSH_PAGE 0x18 /* Flush I Cache Line (page); wo, ss */ | ||
77 | #define ASI_M_IFLUSH_SEG 0x19 /* Flush I Cache Line (seg); wo, ss */ | ||
78 | #define ASI_M_IFLUSH_REGION 0x1A /* Flush I Cache Line (region); wo, ss */ | ||
79 | #define ASI_M_IFLUSH_CTX 0x1B /* Flush I Cache Line (context); wo, ss */ | ||
80 | #define ASI_M_IFLUSH_USER 0x1C /* Flush I Cache Line (user); wo, ss */ | ||
81 | |||
82 | /* Block-fill operations are available on certain V8 cpus */ | ||
83 | #define ASI_M_BFILL 0x1F | ||
84 | |||
85 | /* This allows direct access to main memory, actually 0x20 to 0x2f are | ||
86 | * the available ASI's for physical ram pass-through, but I don't have | ||
87 | * any idea what the other ones do.... | ||
88 | */ | ||
89 | |||
90 | #define ASI_M_BYPASS 0x20 /* Reference MMU bypass; rw, as */ | ||
91 | #define ASI_M_FBMEM 0x29 /* Graphics card frame buffer access */ | ||
92 | #define ASI_M_VMEUS 0x2A /* VME user 16-bit access */ | ||
93 | #define ASI_M_VMEPS 0x2B /* VME priv 16-bit access */ | ||
94 | #define ASI_M_VMEUT 0x2C /* VME user 32-bit access */ | ||
95 | #define ASI_M_VMEPT 0x2D /* VME priv 32-bit access */ | ||
96 | #define ASI_M_SBUS 0x2E /* Direct SBus access */ | ||
97 | #define ASI_M_CTL 0x2F /* Control Space (ECC and MXCC are here) */ | ||
98 | |||
99 | |||
100 | /* This is ROSS HyperSparc only. */ | ||
101 | #define ASI_M_FLUSH_IWHOLE 0x31 /* Flush entire ICACHE; wo, ss */ | ||
102 | |||
103 | /* Tsunami/Viking/TurboSparc i/d cache flash clear. */ | ||
104 | #define ASI_M_IC_FLCLEAR 0x36 | ||
105 | #define ASI_M_DC_FLCLEAR 0x37 | ||
106 | |||
107 | #define ASI_M_DCDR 0x39 /* Data Cache Diagnostics Register rw, ss */ | ||
108 | |||
109 | #define ASI_M_VIKING_TMP1 0x40 /* Emulation temporary 1 on Viking */ | ||
110 | /* only available on SuperSparc I */ | ||
111 | /* #define ASI_M_VIKING_TMP2 0x41 */ /* Emulation temporary 2 on Viking */ | ||
112 | |||
113 | #define ASI_M_ACTION 0x4c /* Breakpoint Action Register (GNU/Viking) */ | ||
114 | |||
115 | /* V9 Architecture mandary ASIs. */ | ||
116 | #define ASI_N 0x04 /* Nucleus */ | ||
117 | #define ASI_NL 0x0c /* Nucleus, little endian */ | ||
118 | #define ASI_AIUP 0x10 /* Primary, user */ | ||
119 | #define ASI_AIUS 0x11 /* Secondary, user */ | ||
120 | #define ASI_AIUPL 0x18 /* Primary, user, little endian */ | ||
121 | #define ASI_AIUSL 0x19 /* Secondary, user, little endian */ | ||
122 | #define ASI_P 0x80 /* Primary, implicit */ | ||
123 | #define ASI_S 0x81 /* Secondary, implicit */ | ||
124 | #define ASI_PNF 0x82 /* Primary, no fault */ | ||
125 | #define ASI_SNF 0x83 /* Secondary, no fault */ | ||
126 | #define ASI_PL 0x88 /* Primary, implicit, l-endian */ | ||
127 | #define ASI_SL 0x89 /* Secondary, implicit, l-endian */ | ||
128 | #define ASI_PNFL 0x8a /* Primary, no fault, l-endian */ | ||
129 | #define ASI_SNFL 0x8b /* Secondary, no fault, l-endian */ | ||
130 | |||
131 | /* SpitFire and later extended ASIs. The "(III)" marker designates | ||
132 | * UltraSparc-III and later specific ASIs. The "(CMT)" marker designates | ||
133 | * Chip Multi Threading specific ASIs. "(NG)" designates Niagara specific | ||
134 | * ASIs, "(4V)" designates SUN4V specific ASIs. | ||
135 | */ | ||
136 | #define ASI_PHYS_USE_EC 0x14 /* PADDR, E-cachable */ | ||
137 | #define ASI_PHYS_BYPASS_EC_E 0x15 /* PADDR, E-bit */ | ||
138 | #define ASI_BLK_AIUP_4V 0x16 /* (4V) Prim, user, block ld/st */ | ||
139 | #define ASI_BLK_AIUS_4V 0x17 /* (4V) Sec, user, block ld/st */ | ||
140 | #define ASI_PHYS_USE_EC_L 0x1c /* PADDR, E-cachable, little endian*/ | ||
141 | #define ASI_PHYS_BYPASS_EC_E_L 0x1d /* PADDR, E-bit, little endian */ | ||
142 | #define ASI_BLK_AIUP_L_4V 0x1e /* (4V) Prim, user, block, l-endian*/ | ||
143 | #define ASI_BLK_AIUS_L_4V 0x1f /* (4V) Sec, user, block, l-endian */ | ||
144 | #define ASI_SCRATCHPAD 0x20 /* (4V) Scratch Pad Registers */ | ||
145 | #define ASI_MMU 0x21 /* (4V) MMU Context Registers */ | ||
146 | #define ASI_BLK_INIT_QUAD_LDD_AIUS 0x23 /* (NG) init-store, twin load, | ||
147 | * secondary, user | ||
148 | */ | ||
149 | #define ASI_NUCLEUS_QUAD_LDD 0x24 /* Cachable, qword load */ | ||
150 | #define ASI_QUEUE 0x25 /* (4V) Interrupt Queue Registers */ | ||
151 | #define ASI_QUAD_LDD_PHYS_4V 0x26 /* (4V) Physical, qword load */ | ||
152 | #define ASI_NUCLEUS_QUAD_LDD_L 0x2c /* Cachable, qword load, l-endian */ | ||
153 | #define ASI_QUAD_LDD_PHYS_L_4V 0x2e /* (4V) Phys, qword load, l-endian */ | ||
154 | #define ASI_PCACHE_DATA_STATUS 0x30 /* (III) PCache data stat RAM diag */ | ||
155 | #define ASI_PCACHE_DATA 0x31 /* (III) PCache data RAM diag */ | ||
156 | #define ASI_PCACHE_TAG 0x32 /* (III) PCache tag RAM diag */ | ||
157 | #define ASI_PCACHE_SNOOP_TAG 0x33 /* (III) PCache snoop tag RAM diag */ | ||
158 | #define ASI_QUAD_LDD_PHYS 0x34 /* (III+) PADDR, qword load */ | ||
159 | #define ASI_WCACHE_VALID_BITS 0x38 /* (III) WCache Valid Bits diag */ | ||
160 | #define ASI_WCACHE_DATA 0x39 /* (III) WCache data RAM diag */ | ||
161 | #define ASI_WCACHE_TAG 0x3a /* (III) WCache tag RAM diag */ | ||
162 | #define ASI_WCACHE_SNOOP_TAG 0x3b /* (III) WCache snoop tag RAM diag */ | ||
163 | #define ASI_QUAD_LDD_PHYS_L 0x3c /* (III+) PADDR, qw-load, l-endian */ | ||
164 | #define ASI_SRAM_FAST_INIT 0x40 /* (III+) Fast SRAM init */ | ||
165 | #define ASI_CORE_AVAILABLE 0x41 /* (CMT) LP Available */ | ||
166 | #define ASI_CORE_ENABLE_STAT 0x41 /* (CMT) LP Enable Status */ | ||
167 | #define ASI_CORE_ENABLE 0x41 /* (CMT) LP Enable RW */ | ||
168 | #define ASI_XIR_STEERING 0x41 /* (CMT) XIR Steering RW */ | ||
169 | #define ASI_CORE_RUNNING_RW 0x41 /* (CMT) LP Running RW */ | ||
170 | #define ASI_CORE_RUNNING_W1S 0x41 /* (CMT) LP Running Write-One Set */ | ||
171 | #define ASI_CORE_RUNNING_W1C 0x41 /* (CMT) LP Running Write-One Clr */ | ||
172 | #define ASI_CORE_RUNNING_STAT 0x41 /* (CMT) LP Running Status */ | ||
173 | #define ASI_CMT_ERROR_STEERING 0x41 /* (CMT) Error Steering RW */ | ||
174 | #define ASI_DCACHE_INVALIDATE 0x42 /* (III) DCache Invalidate diag */ | ||
175 | #define ASI_DCACHE_UTAG 0x43 /* (III) DCache uTag diag */ | ||
176 | #define ASI_DCACHE_SNOOP_TAG 0x44 /* (III) DCache snoop tag RAM diag */ | ||
177 | #define ASI_LSU_CONTROL 0x45 /* Load-store control unit */ | ||
178 | #define ASI_DCU_CONTROL_REG 0x45 /* (III) DCache Unit Control reg */ | ||
179 | #define ASI_DCACHE_DATA 0x46 /* DCache data-ram diag access */ | ||
180 | #define ASI_DCACHE_TAG 0x47 /* Dcache tag/valid ram diag access*/ | ||
181 | #define ASI_INTR_DISPATCH_STAT 0x48 /* IRQ vector dispatch status */ | ||
182 | #define ASI_INTR_RECEIVE 0x49 /* IRQ vector receive status */ | ||
183 | #define ASI_UPA_CONFIG 0x4a /* UPA config space */ | ||
184 | #define ASI_JBUS_CONFIG 0x4a /* (IIIi) JBUS Config Register */ | ||
185 | #define ASI_SAFARI_CONFIG 0x4a /* (III) Safari Config Register */ | ||
186 | #define ASI_SAFARI_ADDRESS 0x4a /* (III) Safari Address Register */ | ||
187 | #define ASI_ESTATE_ERROR_EN 0x4b /* E-cache error enable space */ | ||
188 | #define ASI_AFSR 0x4c /* Async fault status register */ | ||
189 | #define ASI_AFAR 0x4d /* Async fault address register */ | ||
190 | #define ASI_EC_TAG_DATA 0x4e /* E-cache tag/valid ram diag acc */ | ||
191 | #define ASI_IMMU 0x50 /* Insn-MMU main register space */ | ||
192 | #define ASI_IMMU_TSB_8KB_PTR 0x51 /* Insn-MMU 8KB TSB pointer reg */ | ||
193 | #define ASI_IMMU_TSB_64KB_PTR 0x52 /* Insn-MMU 64KB TSB pointer reg */ | ||
194 | #define ASI_ITLB_DATA_IN 0x54 /* Insn-MMU TLB data in reg */ | ||
195 | #define ASI_ITLB_DATA_ACCESS 0x55 /* Insn-MMU TLB data access reg */ | ||
196 | #define ASI_ITLB_TAG_READ 0x56 /* Insn-MMU TLB tag read reg */ | ||
197 | #define ASI_IMMU_DEMAP 0x57 /* Insn-MMU TLB demap */ | ||
198 | #define ASI_DMMU 0x58 /* Data-MMU main register space */ | ||
199 | #define ASI_DMMU_TSB_8KB_PTR 0x59 /* Data-MMU 8KB TSB pointer reg */ | ||
200 | #define ASI_DMMU_TSB_64KB_PTR 0x5a /* Data-MMU 16KB TSB pointer reg */ | ||
201 | #define ASI_DMMU_TSB_DIRECT_PTR 0x5b /* Data-MMU TSB direct pointer reg */ | ||
202 | #define ASI_DTLB_DATA_IN 0x5c /* Data-MMU TLB data in reg */ | ||
203 | #define ASI_DTLB_DATA_ACCESS 0x5d /* Data-MMU TLB data access reg */ | ||
204 | #define ASI_DTLB_TAG_READ 0x5e /* Data-MMU TLB tag read reg */ | ||
205 | #define ASI_DMMU_DEMAP 0x5f /* Data-MMU TLB demap */ | ||
206 | #define ASI_IIU_INST_TRAP 0x60 /* (III) Instruction Breakpoint */ | ||
207 | #define ASI_INTR_ID 0x63 /* (CMT) Interrupt ID register */ | ||
208 | #define ASI_CORE_ID 0x63 /* (CMT) LP ID register */ | ||
209 | #define ASI_CESR_ID 0x63 /* (CMT) CESR ID register */ | ||
210 | #define ASI_IC_INSTR 0x66 /* Insn cache instrucion ram diag */ | ||
211 | #define ASI_IC_TAG 0x67 /* Insn cache tag/valid ram diag */ | ||
212 | #define ASI_IC_STAG 0x68 /* (III) Insn cache snoop tag ram */ | ||
213 | #define ASI_IC_PRE_DECODE 0x6e /* Insn cache pre-decode ram diag */ | ||
214 | #define ASI_IC_NEXT_FIELD 0x6f /* Insn cache next-field ram diag */ | ||
215 | #define ASI_BRPRED_ARRAY 0x6f /* (III) Branch Prediction RAM diag*/ | ||
216 | #define ASI_BLK_AIUP 0x70 /* Primary, user, block load/store */ | ||
217 | #define ASI_BLK_AIUS 0x71 /* Secondary, user, block ld/st */ | ||
218 | #define ASI_MCU_CTRL_REG 0x72 /* (III) Memory controller regs */ | ||
219 | #define ASI_EC_DATA 0x74 /* (III) E-cache data staging reg */ | ||
220 | #define ASI_EC_CTRL 0x75 /* (III) E-cache control reg */ | ||
221 | #define ASI_EC_W 0x76 /* E-cache diag write access */ | ||
222 | #define ASI_UDB_ERROR_W 0x77 /* External UDB error regs W */ | ||
223 | #define ASI_UDB_CONTROL_W 0x77 /* External UDB control regs W */ | ||
224 | #define ASI_INTR_W 0x77 /* IRQ vector dispatch write */ | ||
225 | #define ASI_INTR_DATAN_W 0x77 /* (III) Out irq vector data reg N */ | ||
226 | #define ASI_INTR_DISPATCH_W 0x77 /* (III) Interrupt vector dispatch */ | ||
227 | #define ASI_BLK_AIUPL 0x78 /* Primary, user, little, blk ld/st*/ | ||
228 | #define ASI_BLK_AIUSL 0x79 /* Secondary, user, little, blk ld/st*/ | ||
229 | #define ASI_EC_R 0x7e /* E-cache diag read access */ | ||
230 | #define ASI_UDBH_ERROR_R 0x7f /* External UDB error regs rd hi */ | ||
231 | #define ASI_UDBL_ERROR_R 0x7f /* External UDB error regs rd low */ | ||
232 | #define ASI_UDBH_CONTROL_R 0x7f /* External UDB control regs rd hi */ | ||
233 | #define ASI_UDBL_CONTROL_R 0x7f /* External UDB control regs rd low*/ | ||
234 | #define ASI_INTR_R 0x7f /* IRQ vector dispatch read */ | ||
235 | #define ASI_INTR_DATAN_R 0x7f /* (III) In irq vector data reg N */ | ||
236 | #define ASI_PST8_P 0xc0 /* Primary, 8 8-bit, partial */ | ||
237 | #define ASI_PST8_S 0xc1 /* Secondary, 8 8-bit, partial */ | ||
238 | #define ASI_PST16_P 0xc2 /* Primary, 4 16-bit, partial */ | ||
239 | #define ASI_PST16_S 0xc3 /* Secondary, 4 16-bit, partial */ | ||
240 | #define ASI_PST32_P 0xc4 /* Primary, 2 32-bit, partial */ | ||
241 | #define ASI_PST32_S 0xc5 /* Secondary, 2 32-bit, partial */ | ||
242 | #define ASI_PST8_PL 0xc8 /* Primary, 8 8-bit, partial, L */ | ||
243 | #define ASI_PST8_SL 0xc9 /* Secondary, 8 8-bit, partial, L */ | ||
244 | #define ASI_PST16_PL 0xca /* Primary, 4 16-bit, partial, L */ | ||
245 | #define ASI_PST16_SL 0xcb /* Secondary, 4 16-bit, partial, L */ | ||
246 | #define ASI_PST32_PL 0xcc /* Primary, 2 32-bit, partial, L */ | ||
247 | #define ASI_PST32_SL 0xcd /* Secondary, 2 32-bit, partial, L */ | ||
248 | #define ASI_FL8_P 0xd0 /* Primary, 1 8-bit, fpu ld/st */ | ||
249 | #define ASI_FL8_S 0xd1 /* Secondary, 1 8-bit, fpu ld/st */ | ||
250 | #define ASI_FL16_P 0xd2 /* Primary, 1 16-bit, fpu ld/st */ | ||
251 | #define ASI_FL16_S 0xd3 /* Secondary, 1 16-bit, fpu ld/st */ | ||
252 | #define ASI_FL8_PL 0xd8 /* Primary, 1 8-bit, fpu ld/st, L */ | ||
253 | #define ASI_FL8_SL 0xd9 /* Secondary, 1 8-bit, fpu ld/st, L*/ | ||
254 | #define ASI_FL16_PL 0xda /* Primary, 1 16-bit, fpu ld/st, L */ | ||
255 | #define ASI_FL16_SL 0xdb /* Secondary, 1 16-bit, fpu ld/st,L*/ | ||
256 | #define ASI_BLK_COMMIT_P 0xe0 /* Primary, blk store commit */ | ||
257 | #define ASI_BLK_COMMIT_S 0xe1 /* Secondary, blk store commit */ | ||
258 | #define ASI_BLK_INIT_QUAD_LDD_P 0xe2 /* (NG) init-store, twin load, | ||
259 | * primary, implicit | ||
260 | */ | ||
261 | #define ASI_BLK_P 0xf0 /* Primary, blk ld/st */ | ||
262 | #define ASI_BLK_S 0xf1 /* Secondary, blk ld/st */ | ||
263 | #define ASI_BLK_PL 0xf8 /* Primary, blk ld/st, little */ | ||
264 | #define ASI_BLK_SL 0xf9 /* Secondary, blk ld/st, little */ | ||
265 | |||
266 | #endif /* _SPARC_ASI_H */ | ||
diff --git a/arch/sparc/include/asm/auxvec.h b/arch/sparc/include/asm/auxvec.h new file mode 100644 index 00000000000..ad6f360261f --- /dev/null +++ b/arch/sparc/include/asm/auxvec.h | |||
@@ -0,0 +1,4 @@ | |||
1 | #ifndef __ASMSPARC_AUXVEC_H | ||
2 | #define __ASMSPARC_AUXVEC_H | ||
3 | |||
4 | #endif /* !(__ASMSPARC_AUXVEC_H) */ | ||
diff --git a/arch/sparc/include/asm/bitsperlong.h b/arch/sparc/include/asm/bitsperlong.h new file mode 100644 index 00000000000..40dcaa3aaa5 --- /dev/null +++ b/arch/sparc/include/asm/bitsperlong.h | |||
@@ -0,0 +1,13 @@ | |||
1 | #ifndef __ASM_ALPHA_BITSPERLONG_H | ||
2 | #define __ASM_ALPHA_BITSPERLONG_H | ||
3 | |||
4 | #if defined(__sparc__) && defined(__arch64__) | ||
5 | #define __BITS_PER_LONG 64 | ||
6 | #else | ||
7 | #define __BITS_PER_LONG 32 | ||
8 | #endif | ||
9 | |||
10 | #include <asm-generic/bitsperlong.h> | ||
11 | |||
12 | #endif /* __ASM_ALPHA_BITSPERLONG_H */ | ||
13 | |||
diff --git a/arch/sparc/include/asm/btfixup.h b/arch/sparc/include/asm/btfixup.h new file mode 100644 index 00000000000..797722cf69f --- /dev/null +++ b/arch/sparc/include/asm/btfixup.h | |||
@@ -0,0 +1,208 @@ | |||
1 | /* | ||
2 | * asm/btfixup.h: Macros for boot time linking. | ||
3 | * | ||
4 | * Copyright (C) 1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) | ||
5 | */ | ||
6 | |||
7 | #ifndef _SPARC_BTFIXUP_H | ||
8 | #define _SPARC_BTFIXUP_H | ||
9 | |||
10 | #include <linux/init.h> | ||
11 | |||
12 | #ifndef __ASSEMBLY__ | ||
13 | |||
14 | #ifdef MODULE | ||
15 | extern unsigned int ___illegal_use_of_BTFIXUP_SIMM13_in_module(void); | ||
16 | extern unsigned int ___illegal_use_of_BTFIXUP_SETHI_in_module(void); | ||
17 | extern unsigned int ___illegal_use_of_BTFIXUP_HALF_in_module(void); | ||
18 | extern unsigned int ___illegal_use_of_BTFIXUP_INT_in_module(void); | ||
19 | |||
20 | #define BTFIXUP_SIMM13(__name) ___illegal_use_of_BTFIXUP_SIMM13_in_module() | ||
21 | #define BTFIXUP_HALF(__name) ___illegal_use_of_BTFIXUP_HALF_in_module() | ||
22 | #define BTFIXUP_SETHI(__name) ___illegal_use_of_BTFIXUP_SETHI_in_module() | ||
23 | #define BTFIXUP_INT(__name) ___illegal_use_of_BTFIXUP_INT_in_module() | ||
24 | #define BTFIXUP_BLACKBOX(__name) ___illegal_use_of_BTFIXUP_BLACKBOX_in_module | ||
25 | |||
26 | #else | ||
27 | |||
28 | #define BTFIXUP_SIMM13(__name) ___sf_##__name() | ||
29 | #define BTFIXUP_HALF(__name) ___af_##__name() | ||
30 | #define BTFIXUP_SETHI(__name) ___hf_##__name() | ||
31 | #define BTFIXUP_INT(__name) ((unsigned int)&___i_##__name) | ||
32 | /* This must be written in assembly and present in a sethi */ | ||
33 | #define BTFIXUP_BLACKBOX(__name) ___b_##__name | ||
34 | #endif /* MODULE */ | ||
35 | |||
36 | /* Fixup call xx */ | ||
37 | |||
38 | #define BTFIXUPDEF_CALL(__type, __name, __args...) \ | ||
39 | extern __type ___f_##__name(__args); \ | ||
40 | extern unsigned ___fs_##__name[3]; | ||
41 | #define BTFIXUPDEF_CALL_CONST(__type, __name, __args...) \ | ||
42 | extern __type ___f_##__name(__args) __attribute_const__; \ | ||
43 | extern unsigned ___fs_##__name[3]; | ||
44 | #define BTFIXUP_CALL(__name) ___f_##__name | ||
45 | |||
46 | #define BTFIXUPDEF_BLACKBOX(__name) \ | ||
47 | extern unsigned ___bs_##__name[2]; | ||
48 | |||
49 | /* Put bottom 13bits into some register variable */ | ||
50 | |||
51 | #define BTFIXUPDEF_SIMM13(__name) \ | ||
52 | static inline unsigned int ___sf_##__name(void) __attribute_const__; \ | ||
53 | extern unsigned ___ss_##__name[2]; \ | ||
54 | static inline unsigned int ___sf_##__name(void) { \ | ||
55 | unsigned int ret; \ | ||
56 | __asm__ ("or %%g0, ___s_" #__name ", %0" : "=r"(ret)); \ | ||
57 | return ret; \ | ||
58 | } | ||
59 | #define BTFIXUPDEF_SIMM13_INIT(__name,__val) \ | ||
60 | static inline unsigned int ___sf_##__name(void) __attribute_const__; \ | ||
61 | extern unsigned ___ss_##__name[2]; \ | ||
62 | static inline unsigned int ___sf_##__name(void) { \ | ||
63 | unsigned int ret; \ | ||
64 | __asm__ ("or %%g0, ___s_" #__name "__btset_" #__val ", %0" : "=r"(ret));\ | ||
65 | return ret; \ | ||
66 | } | ||
67 | |||
68 | /* Put either bottom 13 bits, or upper 22 bits into some register variable | ||
69 | * (depending on the value, this will lead into sethi FIX, reg; or | ||
70 | * mov FIX, reg; ) | ||
71 | */ | ||
72 | |||
73 | #define BTFIXUPDEF_HALF(__name) \ | ||
74 | static inline unsigned int ___af_##__name(void) __attribute_const__; \ | ||
75 | extern unsigned ___as_##__name[2]; \ | ||
76 | static inline unsigned int ___af_##__name(void) { \ | ||
77 | unsigned int ret; \ | ||
78 | __asm__ ("or %%g0, ___a_" #__name ", %0" : "=r"(ret)); \ | ||
79 | return ret; \ | ||
80 | } | ||
81 | #define BTFIXUPDEF_HALF_INIT(__name,__val) \ | ||
82 | static inline unsigned int ___af_##__name(void) __attribute_const__; \ | ||
83 | extern unsigned ___as_##__name[2]; \ | ||
84 | static inline unsigned int ___af_##__name(void) { \ | ||
85 | unsigned int ret; \ | ||
86 | __asm__ ("or %%g0, ___a_" #__name "__btset_" #__val ", %0" : "=r"(ret));\ | ||
87 | return ret; \ | ||
88 | } | ||
89 | |||
90 | /* Put upper 22 bits into some register variable */ | ||
91 | |||
92 | #define BTFIXUPDEF_SETHI(__name) \ | ||
93 | static inline unsigned int ___hf_##__name(void) __attribute_const__; \ | ||
94 | extern unsigned ___hs_##__name[2]; \ | ||
95 | static inline unsigned int ___hf_##__name(void) { \ | ||
96 | unsigned int ret; \ | ||
97 | __asm__ ("sethi %%hi(___h_" #__name "), %0" : "=r"(ret)); \ | ||
98 | return ret; \ | ||
99 | } | ||
100 | #define BTFIXUPDEF_SETHI_INIT(__name,__val) \ | ||
101 | static inline unsigned int ___hf_##__name(void) __attribute_const__; \ | ||
102 | extern unsigned ___hs_##__name[2]; \ | ||
103 | static inline unsigned int ___hf_##__name(void) { \ | ||
104 | unsigned int ret; \ | ||
105 | __asm__ ("sethi %%hi(___h_" #__name "__btset_" #__val "), %0" : \ | ||
106 | "=r"(ret)); \ | ||
107 | return ret; \ | ||
108 | } | ||
109 | |||
110 | /* Put a full 32bit integer into some register variable */ | ||
111 | |||
112 | #define BTFIXUPDEF_INT(__name) \ | ||
113 | extern unsigned char ___i_##__name; \ | ||
114 | extern unsigned ___is_##__name[2]; | ||
115 | |||
116 | #define BTFIXUPCALL_NORM 0x00000000 /* Always call */ | ||
117 | #define BTFIXUPCALL_NOP 0x01000000 /* Possibly optimize to nop */ | ||
118 | #define BTFIXUPCALL_RETINT(i) (0x90102000|((i) & 0x1fff)) /* Possibly optimize to mov i, %o0 */ | ||
119 | #define BTFIXUPCALL_ORINT(i) (0x90122000|((i) & 0x1fff)) /* Possibly optimize to or %o0, i, %o0 */ | ||
120 | #define BTFIXUPCALL_RETO0 0x01000000 /* Return first parameter, actually a nop */ | ||
121 | #define BTFIXUPCALL_ANDNINT(i) (0x902a2000|((i) & 0x1fff)) /* Possibly optimize to andn %o0, i, %o0 */ | ||
122 | #define BTFIXUPCALL_SWAPO0O1 0xd27a0000 /* Possibly optimize to swap [%o0],%o1 */ | ||
123 | #define BTFIXUPCALL_SWAPO0G0 0xc07a0000 /* Possibly optimize to swap [%o0],%g0 */ | ||
124 | #define BTFIXUPCALL_SWAPG1G2 0xc4784000 /* Possibly optimize to swap [%g1],%g2 */ | ||
125 | #define BTFIXUPCALL_STG0O0 0xc0220000 /* Possibly optimize to st %g0,[%o0] */ | ||
126 | #define BTFIXUPCALL_STO1O0 0xd2220000 /* Possibly optimize to st %o1,[%o0] */ | ||
127 | |||
128 | #define BTFIXUPSET_CALL(__name, __addr, __insn) \ | ||
129 | do { \ | ||
130 | ___fs_##__name[0] |= 1; \ | ||
131 | ___fs_##__name[1] = (unsigned long)__addr; \ | ||
132 | ___fs_##__name[2] = __insn; \ | ||
133 | } while (0) | ||
134 | |||
135 | #define BTFIXUPSET_BLACKBOX(__name, __func) \ | ||
136 | do { \ | ||
137 | ___bs_##__name[0] |= 1; \ | ||
138 | ___bs_##__name[1] = (unsigned long)__func; \ | ||
139 | } while (0) | ||
140 | |||
141 | #define BTFIXUPCOPY_CALL(__name, __from) \ | ||
142 | do { \ | ||
143 | ___fs_##__name[0] |= 1; \ | ||
144 | ___fs_##__name[1] = ___fs_##__from[1]; \ | ||
145 | ___fs_##__name[2] = ___fs_##__from[2]; \ | ||
146 | } while (0) | ||
147 | |||
148 | #define BTFIXUPSET_SIMM13(__name, __val) \ | ||
149 | do { \ | ||
150 | ___ss_##__name[0] |= 1; \ | ||
151 | ___ss_##__name[1] = (unsigned)__val; \ | ||
152 | } while (0) | ||
153 | |||
154 | #define BTFIXUPCOPY_SIMM13(__name, __from) \ | ||
155 | do { \ | ||
156 | ___ss_##__name[0] |= 1; \ | ||
157 | ___ss_##__name[1] = ___ss_##__from[1]; \ | ||
158 | } while (0) | ||
159 | |||
160 | #define BTFIXUPSET_HALF(__name, __val) \ | ||
161 | do { \ | ||
162 | ___as_##__name[0] |= 1; \ | ||
163 | ___as_##__name[1] = (unsigned)__val; \ | ||
164 | } while (0) | ||
165 | |||
166 | #define BTFIXUPCOPY_HALF(__name, __from) \ | ||
167 | do { \ | ||
168 | ___as_##__name[0] |= 1; \ | ||
169 | ___as_##__name[1] = ___as_##__from[1]; \ | ||
170 | } while (0) | ||
171 | |||
172 | #define BTFIXUPSET_SETHI(__name, __val) \ | ||
173 | do { \ | ||
174 | ___hs_##__name[0] |= 1; \ | ||
175 | ___hs_##__name[1] = (unsigned)__val; \ | ||
176 | } while (0) | ||
177 | |||
178 | #define BTFIXUPCOPY_SETHI(__name, __from) \ | ||
179 | do { \ | ||
180 | ___hs_##__name[0] |= 1; \ | ||
181 | ___hs_##__name[1] = ___hs_##__from[1]; \ | ||
182 | } while (0) | ||
183 | |||
184 | #define BTFIXUPSET_INT(__name, __val) \ | ||
185 | do { \ | ||
186 | ___is_##__name[0] |= 1; \ | ||
187 | ___is_##__name[1] = (unsigned)__val; \ | ||
188 | } while (0) | ||
189 | |||
190 | #define BTFIXUPCOPY_INT(__name, __from) \ | ||
191 | do { \ | ||
192 | ___is_##__name[0] |= 1; \ | ||
193 | ___is_##__name[1] = ___is_##__from[1]; \ | ||
194 | } while (0) | ||
195 | |||
196 | #define BTFIXUPVAL_CALL(__name) \ | ||
197 | ((unsigned long)___fs_##__name[1]) | ||
198 | |||
199 | extern void btfixup(void); | ||
200 | |||
201 | #else /* __ASSEMBLY__ */ | ||
202 | |||
203 | #define BTFIXUP_SETHI(__name) %hi(___h_ ## __name) | ||
204 | #define BTFIXUP_SETHI_INIT(__name,__val) %hi(___h_ ## __name ## __btset_ ## __val) | ||
205 | |||
206 | #endif /* __ASSEMBLY__ */ | ||
207 | |||
208 | #endif /* !(_SPARC_BTFIXUP_H) */ | ||
diff --git a/arch/sparc/include/asm/byteorder.h b/arch/sparc/include/asm/byteorder.h new file mode 100644 index 00000000000..ccc1b6b7de6 --- /dev/null +++ b/arch/sparc/include/asm/byteorder.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef _SPARC_BYTEORDER_H | ||
2 | #define _SPARC_BYTEORDER_H | ||
3 | |||
4 | #include <linux/byteorder/big_endian.h> | ||
5 | |||
6 | #endif /* _SPARC_BYTEORDER_H */ | ||
diff --git a/arch/sparc/include/asm/cmt.h b/arch/sparc/include/asm/cmt.h new file mode 100644 index 00000000000..870db592857 --- /dev/null +++ b/arch/sparc/include/asm/cmt.h | |||
@@ -0,0 +1,59 @@ | |||
1 | #ifndef _SPARC64_CMT_H | ||
2 | #define _SPARC64_CMT_H | ||
3 | |||
4 | /* cmt.h: Chip Multi-Threading register definitions | ||
5 | * | ||
6 | * Copyright (C) 2004 David S. Miller (davem@redhat.com) | ||
7 | */ | ||
8 | |||
9 | /* ASI_CORE_ID - private */ | ||
10 | #define LP_ID 0x0000000000000010UL | ||
11 | #define LP_ID_MAX 0x00000000003f0000UL | ||
12 | #define LP_ID_ID 0x000000000000003fUL | ||
13 | |||
14 | /* ASI_INTR_ID - private */ | ||
15 | #define LP_INTR_ID 0x0000000000000000UL | ||
16 | #define LP_INTR_ID_ID 0x00000000000003ffUL | ||
17 | |||
18 | /* ASI_CESR_ID - private */ | ||
19 | #define CESR_ID 0x0000000000000040UL | ||
20 | #define CESR_ID_ID 0x00000000000000ffUL | ||
21 | |||
22 | /* ASI_CORE_AVAILABLE - shared */ | ||
23 | #define LP_AVAIL 0x0000000000000000UL | ||
24 | #define LP_AVAIL_1 0x0000000000000002UL | ||
25 | #define LP_AVAIL_0 0x0000000000000001UL | ||
26 | |||
27 | /* ASI_CORE_ENABLE_STATUS - shared */ | ||
28 | #define LP_ENAB_STAT 0x0000000000000010UL | ||
29 | #define LP_ENAB_STAT_1 0x0000000000000002UL | ||
30 | #define LP_ENAB_STAT_0 0x0000000000000001UL | ||
31 | |||
32 | /* ASI_CORE_ENABLE - shared */ | ||
33 | #define LP_ENAB 0x0000000000000020UL | ||
34 | #define LP_ENAB_1 0x0000000000000002UL | ||
35 | #define LP_ENAB_0 0x0000000000000001UL | ||
36 | |||
37 | /* ASI_CORE_RUNNING - shared */ | ||
38 | #define LP_RUNNING_RW 0x0000000000000050UL | ||
39 | #define LP_RUNNING_W1S 0x0000000000000060UL | ||
40 | #define LP_RUNNING_W1C 0x0000000000000068UL | ||
41 | #define LP_RUNNING_1 0x0000000000000002UL | ||
42 | #define LP_RUNNING_0 0x0000000000000001UL | ||
43 | |||
44 | /* ASI_CORE_RUNNING_STAT - shared */ | ||
45 | #define LP_RUN_STAT 0x0000000000000058UL | ||
46 | #define LP_RUN_STAT_1 0x0000000000000002UL | ||
47 | #define LP_RUN_STAT_0 0x0000000000000001UL | ||
48 | |||
49 | /* ASI_XIR_STEERING - shared */ | ||
50 | #define LP_XIR_STEER 0x0000000000000030UL | ||
51 | #define LP_XIR_STEER_1 0x0000000000000002UL | ||
52 | #define LP_XIR_STEER_0 0x0000000000000001UL | ||
53 | |||
54 | /* ASI_CMT_ERROR_STEERING - shared */ | ||
55 | #define CMT_ER_STEER 0x0000000000000040UL | ||
56 | #define CMT_ER_STEER_1 0x0000000000000002UL | ||
57 | #define CMT_ER_STEER_0 0x0000000000000001UL | ||
58 | |||
59 | #endif /* _SPARC64_CMT_H */ | ||
diff --git a/arch/sparc/include/asm/cypress.h b/arch/sparc/include/asm/cypress.h new file mode 100644 index 00000000000..95e9772ea39 --- /dev/null +++ b/arch/sparc/include/asm/cypress.h | |||
@@ -0,0 +1,79 @@ | |||
1 | /* | ||
2 | * cypress.h: Cypress module specific definitions and defines. | ||
3 | * | ||
4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | ||
5 | */ | ||
6 | |||
7 | #ifndef _SPARC_CYPRESS_H | ||
8 | #define _SPARC_CYPRESS_H | ||
9 | |||
10 | /* Cypress chips have %psr 'impl' of '0001' and 'vers' of '0001'. */ | ||
11 | |||
12 | /* The MMU control register fields on the Sparc Cypress 604/605 MMU's. | ||
13 | * | ||
14 | * --------------------------------------------------------------- | ||
15 | * |implvers| MCA | MCM |MV| MID |BM| C|RSV|MR|CM|CL|CE|RSV|NF|ME| | ||
16 | * --------------------------------------------------------------- | ||
17 | * 31 24 23-22 21-20 19 18-15 14 13 12 11 10 9 8 7-2 1 0 | ||
18 | * | ||
19 | * MCA: MultiChip Access -- Used for configuration of multiple | ||
20 | * CY7C604/605 cache units. | ||
21 | * MCM: MultiChip Mask -- Again, for multiple cache unit config. | ||
22 | * MV: MultiChip Valid -- Indicates MCM and MCA have valid settings. | ||
23 | * MID: ModuleID -- Unique processor ID for MBus transactions. (605 only) | ||
24 | * BM: Boot Mode -- 0 = not in boot mode, 1 = in boot mode | ||
25 | * C: Cacheable -- Indicates whether accesses are cacheable while | ||
26 | * the MMU is off. 0=no 1=yes | ||
27 | * MR: MemoryReflection -- Indicates whether the bus attached to the | ||
28 | * MBus supports memory reflection. 0=no 1=yes (605 only) | ||
29 | * CM: CacheMode -- Indicates whether the cache is operating in write | ||
30 | * through or copy-back mode. 0=write-through 1=copy-back | ||
31 | * CL: CacheLock -- Indicates if the entire cache is locked or not. | ||
32 | * 0=not-locked 1=locked (604 only) | ||
33 | * CE: CacheEnable -- Is the virtual cache on? 0=no 1=yes | ||
34 | * NF: NoFault -- Do faults generate traps? 0=yes 1=no | ||
35 | * ME: MmuEnable -- Is the MMU doing translations? 0=no 1=yes | ||
36 | */ | ||
37 | |||
38 | #define CYPRESS_MCA 0x00c00000 | ||
39 | #define CYPRESS_MCM 0x00300000 | ||
40 | #define CYPRESS_MVALID 0x00080000 | ||
41 | #define CYPRESS_MIDMASK 0x00078000 /* Only on 605 */ | ||
42 | #define CYPRESS_BMODE 0x00004000 | ||
43 | #define CYPRESS_ACENABLE 0x00002000 | ||
44 | #define CYPRESS_MRFLCT 0x00000800 /* Only on 605 */ | ||
45 | #define CYPRESS_CMODE 0x00000400 | ||
46 | #define CYPRESS_CLOCK 0x00000200 /* Only on 604 */ | ||
47 | #define CYPRESS_CENABLE 0x00000100 | ||
48 | #define CYPRESS_NFAULT 0x00000002 | ||
49 | #define CYPRESS_MENABLE 0x00000001 | ||
50 | |||
51 | static inline void cypress_flush_page(unsigned long page) | ||
52 | { | ||
53 | __asm__ __volatile__("sta %%g0, [%0] %1\n\t" : : | ||
54 | "r" (page), "i" (ASI_M_FLUSH_PAGE)); | ||
55 | } | ||
56 | |||
57 | static inline void cypress_flush_segment(unsigned long addr) | ||
58 | { | ||
59 | __asm__ __volatile__("sta %%g0, [%0] %1\n\t" : : | ||
60 | "r" (addr), "i" (ASI_M_FLUSH_SEG)); | ||
61 | } | ||
62 | |||
63 | static inline void cypress_flush_region(unsigned long addr) | ||
64 | { | ||
65 | __asm__ __volatile__("sta %%g0, [%0] %1\n\t" : : | ||
66 | "r" (addr), "i" (ASI_M_FLUSH_REGION)); | ||
67 | } | ||
68 | |||
69 | static inline void cypress_flush_context(void) | ||
70 | { | ||
71 | __asm__ __volatile__("sta %%g0, [%%g0] %0\n\t" : : | ||
72 | "i" (ASI_M_FLUSH_CTX)); | ||
73 | } | ||
74 | |||
75 | /* XXX Displacement flushes for buggy chips and initial testing | ||
76 | * XXX go here. | ||
77 | */ | ||
78 | |||
79 | #endif /* !(_SPARC_CYPRESS_H) */ | ||
diff --git a/arch/sparc/include/asm/display7seg.h b/arch/sparc/include/asm/display7seg.h new file mode 100644 index 00000000000..86d4a901df2 --- /dev/null +++ b/arch/sparc/include/asm/display7seg.h | |||
@@ -0,0 +1,79 @@ | |||
1 | /* | ||
2 | * | ||
3 | * display7seg - Driver interface for the 7-segment display | ||
4 | * present on Sun Microsystems CP1400 and CP1500 | ||
5 | * | ||
6 | * Copyright (c) 2000 Eric Brower <ebrower@usa.net> | ||
7 | * | ||
8 | */ | ||
9 | |||
10 | #ifndef __display7seg_h__ | ||
11 | #define __display7seg_h__ | ||
12 | |||
13 | #define D7S_IOC 'p' | ||
14 | |||
15 | #define D7SIOCRD _IOR(D7S_IOC, 0x45, int) /* Read device state */ | ||
16 | #define D7SIOCWR _IOW(D7S_IOC, 0x46, int) /* Write device state */ | ||
17 | #define D7SIOCTM _IO (D7S_IOC, 0x47) /* Translate mode (FLIP)*/ | ||
18 | |||
19 | /* | ||
20 | * ioctl flag definitions | ||
21 | * | ||
22 | * POINT - Toggle decimal point (0=absent 1=present) | ||
23 | * ALARM - Toggle alarm LED (0=green 1=red) | ||
24 | * FLIP - Toggle inverted mode (0=normal 1=flipped) | ||
25 | * bits 0-4 - Character displayed (see definitions below) | ||
26 | * | ||
27 | * Display segments are defined as follows, | ||
28 | * subject to D7S_FLIP register state: | ||
29 | * | ||
30 | * a | ||
31 | * --- | ||
32 | * f| |b | ||
33 | * -g- | ||
34 | * e| |c | ||
35 | * --- | ||
36 | * d | ||
37 | */ | ||
38 | |||
39 | #define D7S_POINT (1 << 7) /* Decimal point*/ | ||
40 | #define D7S_ALARM (1 << 6) /* Alarm LED */ | ||
41 | #define D7S_FLIP (1 << 5) /* Flip display */ | ||
42 | |||
43 | #define D7S_0 0x00 /* Numerals 0-9 */ | ||
44 | #define D7S_1 0x01 | ||
45 | #define D7S_2 0x02 | ||
46 | #define D7S_3 0x03 | ||
47 | #define D7S_4 0x04 | ||
48 | #define D7S_5 0x05 | ||
49 | #define D7S_6 0x06 | ||
50 | #define D7S_7 0x07 | ||
51 | #define D7S_8 0x08 | ||
52 | #define D7S_9 0x09 | ||
53 | #define D7S_A 0x0A /* Letters A-F, H, L, P */ | ||
54 | #define D7S_B 0x0B | ||
55 | #define D7S_C 0x0C | ||
56 | #define D7S_D 0x0D | ||
57 | #define D7S_E 0x0E | ||
58 | #define D7S_F 0x0F | ||
59 | #define D7S_H 0x10 | ||
60 | #define D7S_E2 0x11 | ||
61 | #define D7S_L 0x12 | ||
62 | #define D7S_P 0x13 | ||
63 | #define D7S_SEGA 0x14 /* Individual segments */ | ||
64 | #define D7S_SEGB 0x15 | ||
65 | #define D7S_SEGC 0x16 | ||
66 | #define D7S_SEGD 0x17 | ||
67 | #define D7S_SEGE 0x18 | ||
68 | #define D7S_SEGF 0x19 | ||
69 | #define D7S_SEGG 0x1A | ||
70 | #define D7S_SEGABFG 0x1B /* Segment groupings */ | ||
71 | #define D7S_SEGCDEG 0x1C | ||
72 | #define D7S_SEGBCEF 0x1D | ||
73 | #define D7S_SEGADG 0x1E | ||
74 | #define D7S_BLANK 0x1F /* Clear all segments */ | ||
75 | |||
76 | #define D7S_MIN_VAL 0x0 | ||
77 | #define D7S_MAX_VAL 0x1F | ||
78 | |||
79 | #endif /* ifndef __display7seg_h__ */ | ||
diff --git a/arch/sparc/include/asm/envctrl.h b/arch/sparc/include/asm/envctrl.h new file mode 100644 index 00000000000..624fa7e2da8 --- /dev/null +++ b/arch/sparc/include/asm/envctrl.h | |||
@@ -0,0 +1,103 @@ | |||
1 | /* | ||
2 | * | ||
3 | * envctrl.h: Definitions for access to the i2c environment | ||
4 | * monitoring on Ultrasparc systems. | ||
5 | * | ||
6 | * Copyright (C) 1998 Eddie C. Dost (ecd@skynet.be) | ||
7 | * Copyright (C) 2000 Vinh Truong (vinh.truong@eng.sun.com) | ||
8 | * VT - Add all ioctl commands and environment status definitions | ||
9 | * VT - Add application note | ||
10 | */ | ||
11 | #ifndef _SPARC64_ENVCTRL_H | ||
12 | #define _SPARC64_ENVCTRL_H 1 | ||
13 | |||
14 | #include <linux/ioctl.h> | ||
15 | |||
16 | /* Application note: | ||
17 | * | ||
18 | * The driver supports 4 operations: open(), close(), ioctl(), read() | ||
19 | * The device name is /dev/envctrl. | ||
20 | * Below is sample usage: | ||
21 | * | ||
22 | * fd = open("/dev/envtrl", O_RDONLY); | ||
23 | * if (ioctl(fd, ENVCTRL_READ_SHUTDOWN_TEMPERATURE, 0) < 0) | ||
24 | * printf("error\n"); | ||
25 | * ret = read(fd, buf, 10); | ||
26 | * close(fd); | ||
27 | * | ||
28 | * Notice in the case of cpu voltage and temperature, the default is | ||
29 | * cpu0. If we need to know the info of cpu1, cpu2, cpu3, we need to | ||
30 | * pass in cpu number in ioctl() last parameter. For example, to | ||
31 | * get the voltage of cpu2: | ||
32 | * | ||
33 | * ioctlbuf[0] = 2; | ||
34 | * if (ioctl(fd, ENVCTRL_READ_CPU_VOLTAGE, ioctlbuf) < 0) | ||
35 | * printf("error\n"); | ||
36 | * ret = read(fd, buf, 10); | ||
37 | * | ||
38 | * All the return values are in ascii. So check read return value | ||
39 | * and do appropriate conversions in your application. | ||
40 | */ | ||
41 | |||
42 | /* IOCTL commands */ | ||
43 | |||
44 | /* Note: these commands reflect possible monitor features. | ||
45 | * Some boards choose to support some of the features only. | ||
46 | */ | ||
47 | #define ENVCTRL_RD_CPU_TEMPERATURE _IOR('p', 0x40, int) | ||
48 | #define ENVCTRL_RD_CPU_VOLTAGE _IOR('p', 0x41, int) | ||
49 | #define ENVCTRL_RD_FAN_STATUS _IOR('p', 0x42, int) | ||
50 | #define ENVCTRL_RD_WARNING_TEMPERATURE _IOR('p', 0x43, int) | ||
51 | #define ENVCTRL_RD_SHUTDOWN_TEMPERATURE _IOR('p', 0x44, int) | ||
52 | #define ENVCTRL_RD_VOLTAGE_STATUS _IOR('p', 0x45, int) | ||
53 | #define ENVCTRL_RD_SCSI_TEMPERATURE _IOR('p', 0x46, int) | ||
54 | #define ENVCTRL_RD_ETHERNET_TEMPERATURE _IOR('p', 0x47, int) | ||
55 | #define ENVCTRL_RD_MTHRBD_TEMPERATURE _IOR('p', 0x48, int) | ||
56 | |||
57 | #define ENVCTRL_RD_GLOBALADDRESS _IOR('p', 0x49, int) | ||
58 | |||
59 | /* Read return values for a voltage status request. */ | ||
60 | #define ENVCTRL_VOLTAGE_POWERSUPPLY_GOOD 0x01 | ||
61 | #define ENVCTRL_VOLTAGE_BAD 0x02 | ||
62 | #define ENVCTRL_POWERSUPPLY_BAD 0x03 | ||
63 | #define ENVCTRL_VOLTAGE_POWERSUPPLY_BAD 0x04 | ||
64 | |||
65 | /* Read return values for a fan status request. | ||
66 | * A failure match means either the fan fails or | ||
67 | * the fan is not connected. Some boards have optional | ||
68 | * connectors to connect extra fans. | ||
69 | * | ||
70 | * There are maximum 8 monitor fans. Some are cpu fans | ||
71 | * some are system fans. The mask below only indicates | ||
72 | * fan by order number. | ||
73 | * Below is a sample application: | ||
74 | * | ||
75 | * if (ioctl(fd, ENVCTRL_READ_FAN_STATUS, 0) < 0) { | ||
76 | * printf("ioctl fan failed\n"); | ||
77 | * } | ||
78 | * if (read(fd, rslt, 1) <= 0) { | ||
79 | * printf("error or fan not monitored\n"); | ||
80 | * } else { | ||
81 | * if (rslt[0] == ENVCTRL_ALL_FANS_GOOD) { | ||
82 | * printf("all fans good\n"); | ||
83 | * } else if (rslt[0] == ENVCTRL_ALL_FANS_BAD) { | ||
84 | * printf("all fans bad\n"); | ||
85 | * } else { | ||
86 | * if (rslt[0] & ENVCTRL_FAN0_FAILURE_MASK) { | ||
87 | * printf("fan 0 failed or not connected\n"); | ||
88 | * } | ||
89 | * ...... | ||
90 | */ | ||
91 | |||
92 | #define ENVCTRL_ALL_FANS_GOOD 0x00 | ||
93 | #define ENVCTRL_FAN0_FAILURE_MASK 0x01 | ||
94 | #define ENVCTRL_FAN1_FAILURE_MASK 0x02 | ||
95 | #define ENVCTRL_FAN2_FAILURE_MASK 0x04 | ||
96 | #define ENVCTRL_FAN3_FAILURE_MASK 0x08 | ||
97 | #define ENVCTRL_FAN4_FAILURE_MASK 0x10 | ||
98 | #define ENVCTRL_FAN5_FAILURE_MASK 0x20 | ||
99 | #define ENVCTRL_FAN6_FAILURE_MASK 0x40 | ||
100 | #define ENVCTRL_FAN7_FAILURE_MASK 0x80 | ||
101 | #define ENVCTRL_ALL_FANS_BAD 0xFF | ||
102 | |||
103 | #endif /* !(_SPARC64_ENVCTRL_H) */ | ||
diff --git a/arch/sparc/include/asm/errno.h b/arch/sparc/include/asm/errno.h new file mode 100644 index 00000000000..c351aba997b --- /dev/null +++ b/arch/sparc/include/asm/errno.h | |||
@@ -0,0 +1,117 @@ | |||
1 | #ifndef _SPARC_ERRNO_H | ||
2 | #define _SPARC_ERRNO_H | ||
3 | |||
4 | /* These match the SunOS error numbering scheme. */ | ||
5 | |||
6 | #include <asm-generic/errno-base.h> | ||
7 | |||
8 | #define EWOULDBLOCK EAGAIN /* Operation would block */ | ||
9 | #define EINPROGRESS 36 /* Operation now in progress */ | ||
10 | #define EALREADY 37 /* Operation already in progress */ | ||
11 | #define ENOTSOCK 38 /* Socket operation on non-socket */ | ||
12 | #define EDESTADDRREQ 39 /* Destination address required */ | ||
13 | #define EMSGSIZE 40 /* Message too long */ | ||
14 | #define EPROTOTYPE 41 /* Protocol wrong type for socket */ | ||
15 | #define ENOPROTOOPT 42 /* Protocol not available */ | ||
16 | #define EPROTONOSUPPORT 43 /* Protocol not supported */ | ||
17 | #define ESOCKTNOSUPPORT 44 /* Socket type not supported */ | ||
18 | #define EOPNOTSUPP 45 /* Op not supported on transport endpoint */ | ||
19 | #define EPFNOSUPPORT 46 /* Protocol family not supported */ | ||
20 | #define EAFNOSUPPORT 47 /* Address family not supported by protocol */ | ||
21 | #define EADDRINUSE 48 /* Address already in use */ | ||
22 | #define EADDRNOTAVAIL 49 /* Cannot assign requested address */ | ||
23 | #define ENETDOWN 50 /* Network is down */ | ||
24 | #define ENETUNREACH 51 /* Network is unreachable */ | ||
25 | #define ENETRESET 52 /* Net dropped connection because of reset */ | ||
26 | #define ECONNABORTED 53 /* Software caused connection abort */ | ||
27 | #define ECONNRESET 54 /* Connection reset by peer */ | ||
28 | #define ENOBUFS 55 /* No buffer space available */ | ||
29 | #define EISCONN 56 /* Transport endpoint is already connected */ | ||
30 | #define ENOTCONN 57 /* Transport endpoint is not connected */ | ||
31 | #define ESHUTDOWN 58 /* No send after transport endpoint shutdown */ | ||
32 | #define ETOOMANYREFS 59 /* Too many references: cannot splice */ | ||
33 | #define ETIMEDOUT 60 /* Connection timed out */ | ||
34 | #define ECONNREFUSED 61 /* Connection refused */ | ||
35 | #define ELOOP 62 /* Too many symbolic links encountered */ | ||
36 | #define ENAMETOOLONG 63 /* File name too long */ | ||
37 | #define EHOSTDOWN 64 /* Host is down */ | ||
38 | #define EHOSTUNREACH 65 /* No route to host */ | ||
39 | #define ENOTEMPTY 66 /* Directory not empty */ | ||
40 | #define EPROCLIM 67 /* SUNOS: Too many processes */ | ||
41 | #define EUSERS 68 /* Too many users */ | ||
42 | #define EDQUOT 69 /* Quota exceeded */ | ||
43 | #define ESTALE 70 /* Stale NFS file handle */ | ||
44 | #define EREMOTE 71 /* Object is remote */ | ||
45 | #define ENOSTR 72 /* Device not a stream */ | ||
46 | #define ETIME 73 /* Timer expired */ | ||
47 | #define ENOSR 74 /* Out of streams resources */ | ||
48 | #define ENOMSG 75 /* No message of desired type */ | ||
49 | #define EBADMSG 76 /* Not a data message */ | ||
50 | #define EIDRM 77 /* Identifier removed */ | ||
51 | #define EDEADLK 78 /* Resource deadlock would occur */ | ||
52 | #define ENOLCK 79 /* No record locks available */ | ||
53 | #define ENONET 80 /* Machine is not on the network */ | ||
54 | #define ERREMOTE 81 /* SunOS: Too many lvls of remote in path */ | ||
55 | #define ENOLINK 82 /* Link has been severed */ | ||
56 | #define EADV 83 /* Advertise error */ | ||
57 | #define ESRMNT 84 /* Srmount error */ | ||
58 | #define ECOMM 85 /* Communication error on send */ | ||
59 | #define EPROTO 86 /* Protocol error */ | ||
60 | #define EMULTIHOP 87 /* Multihop attempted */ | ||
61 | #define EDOTDOT 88 /* RFS specific error */ | ||
62 | #define EREMCHG 89 /* Remote address changed */ | ||
63 | #define ENOSYS 90 /* Function not implemented */ | ||
64 | |||
65 | /* The rest have no SunOS equivalent. */ | ||
66 | #define ESTRPIPE 91 /* Streams pipe error */ | ||
67 | #define EOVERFLOW 92 /* Value too large for defined data type */ | ||
68 | #define EBADFD 93 /* File descriptor in bad state */ | ||
69 | #define ECHRNG 94 /* Channel number out of range */ | ||
70 | #define EL2NSYNC 95 /* Level 2 not synchronized */ | ||
71 | #define EL3HLT 96 /* Level 3 halted */ | ||
72 | #define EL3RST 97 /* Level 3 reset */ | ||
73 | #define ELNRNG 98 /* Link number out of range */ | ||
74 | #define EUNATCH 99 /* Protocol driver not attached */ | ||
75 | #define ENOCSI 100 /* No CSI structure available */ | ||
76 | #define EL2HLT 101 /* Level 2 halted */ | ||
77 | #define EBADE 102 /* Invalid exchange */ | ||
78 | #define EBADR 103 /* Invalid request descriptor */ | ||
79 | #define EXFULL 104 /* Exchange full */ | ||
80 | #define ENOANO 105 /* No anode */ | ||
81 | #define EBADRQC 106 /* Invalid request code */ | ||
82 | #define EBADSLT 107 /* Invalid slot */ | ||
83 | #define EDEADLOCK 108 /* File locking deadlock error */ | ||
84 | #define EBFONT 109 /* Bad font file format */ | ||
85 | #define ELIBEXEC 110 /* Cannot exec a shared library directly */ | ||
86 | #define ENODATA 111 /* No data available */ | ||
87 | #define ELIBBAD 112 /* Accessing a corrupted shared library */ | ||
88 | #define ENOPKG 113 /* Package not installed */ | ||
89 | #define ELIBACC 114 /* Can not access a needed shared library */ | ||
90 | #define ENOTUNIQ 115 /* Name not unique on network */ | ||
91 | #define ERESTART 116 /* Interrupted syscall should be restarted */ | ||
92 | #define EUCLEAN 117 /* Structure needs cleaning */ | ||
93 | #define ENOTNAM 118 /* Not a XENIX named type file */ | ||
94 | #define ENAVAIL 119 /* No XENIX semaphores available */ | ||
95 | #define EISNAM 120 /* Is a named type file */ | ||
96 | #define EREMOTEIO 121 /* Remote I/O error */ | ||
97 | #define EILSEQ 122 /* Illegal byte sequence */ | ||
98 | #define ELIBMAX 123 /* Atmpt to link in too many shared libs */ | ||
99 | #define ELIBSCN 124 /* .lib section in a.out corrupted */ | ||
100 | |||
101 | #define ENOMEDIUM 125 /* No medium found */ | ||
102 | #define EMEDIUMTYPE 126 /* Wrong medium type */ | ||
103 | #define ECANCELED 127 /* Operation Cancelled */ | ||
104 | #define ENOKEY 128 /* Required key not available */ | ||
105 | #define EKEYEXPIRED 129 /* Key has expired */ | ||
106 | #define EKEYREVOKED 130 /* Key has been revoked */ | ||
107 | #define EKEYREJECTED 131 /* Key was rejected by service */ | ||
108 | |||
109 | /* for robust mutexes */ | ||
110 | #define EOWNERDEAD 132 /* Owner died */ | ||
111 | #define ENOTRECOVERABLE 133 /* State not recoverable */ | ||
112 | |||
113 | #define ERFKILL 134 /* Operation not possible due to RF-kill */ | ||
114 | |||
115 | #define EHWPOISON 135 /* Memory page has hardware error */ | ||
116 | |||
117 | #endif | ||
diff --git a/arch/sparc/include/asm/fcntl.h b/arch/sparc/include/asm/fcntl.h new file mode 100644 index 00000000000..d0b83f66f35 --- /dev/null +++ b/arch/sparc/include/asm/fcntl.h | |||
@@ -0,0 +1,55 @@ | |||
1 | #ifndef _SPARC_FCNTL_H | ||
2 | #define _SPARC_FCNTL_H | ||
3 | |||
4 | #define O_APPEND 0x0008 | ||
5 | #define FASYNC 0x0040 /* fcntl, for BSD compatibility */ | ||
6 | #define O_CREAT 0x0200 /* not fcntl */ | ||
7 | #define O_TRUNC 0x0400 /* not fcntl */ | ||
8 | #define O_EXCL 0x0800 /* not fcntl */ | ||
9 | #define O_DSYNC 0x2000 /* used to be O_SYNC, see below */ | ||
10 | #define O_NONBLOCK 0x4000 | ||
11 | #if defined(__sparc__) && defined(__arch64__) | ||
12 | #define O_NDELAY 0x0004 | ||
13 | #else | ||
14 | #define O_NDELAY (0x0004 | O_NONBLOCK) | ||
15 | #endif | ||
16 | #define O_NOCTTY 0x8000 /* not fcntl */ | ||
17 | #define O_LARGEFILE 0x40000 | ||
18 | #define O_DIRECT 0x100000 /* direct disk access hint */ | ||
19 | #define O_NOATIME 0x200000 | ||
20 | #define O_CLOEXEC 0x400000 | ||
21 | /* | ||
22 | * Before Linux 2.6.33 only O_DSYNC semantics were implemented, but using | ||
23 | * the O_SYNC flag. We continue to use the existing numerical value | ||
24 | * for O_DSYNC semantics now, but using the correct symbolic name for it. | ||
25 | * This new value is used to request true Posix O_SYNC semantics. It is | ||
26 | * defined in this strange way to make sure applications compiled against | ||
27 | * new headers get at least O_DSYNC semantics on older kernels. | ||
28 | * | ||
29 | * This has the nice side-effect that we can simply test for O_DSYNC | ||
30 | * wherever we do not care if O_DSYNC or O_SYNC is used. | ||
31 | * | ||
32 | * Note: __O_SYNC must never be used directly. | ||
33 | */ | ||
34 | #define __O_SYNC 0x800000 | ||
35 | #define O_SYNC (__O_SYNC|O_DSYNC) | ||
36 | |||
37 | #define O_PATH 0x1000000 | ||
38 | |||
39 | #define F_GETOWN 5 /* for sockets. */ | ||
40 | #define F_SETOWN 6 /* for sockets. */ | ||
41 | #define F_GETLK 7 | ||
42 | #define F_SETLK 8 | ||
43 | #define F_SETLKW 9 | ||
44 | |||
45 | /* for posix fcntl() and lockf() */ | ||
46 | #define F_RDLCK 1 | ||
47 | #define F_WRLCK 2 | ||
48 | #define F_UNLCK 3 | ||
49 | |||
50 | #define __ARCH_FLOCK_PAD short __unused; | ||
51 | #define __ARCH_FLOCK64_PAD short __unused; | ||
52 | |||
53 | #include <asm-generic/fcntl.h> | ||
54 | |||
55 | #endif | ||
diff --git a/arch/sparc/include/asm/fixmap.h b/arch/sparc/include/asm/fixmap.h new file mode 100644 index 00000000000..f18fc0755ad --- /dev/null +++ b/arch/sparc/include/asm/fixmap.h | |||
@@ -0,0 +1,110 @@ | |||
1 | /* | ||
2 | * fixmap.h: compile-time virtual memory allocation | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 1998 Ingo Molnar | ||
9 | * | ||
10 | * Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999 | ||
11 | */ | ||
12 | |||
13 | #ifndef _ASM_FIXMAP_H | ||
14 | #define _ASM_FIXMAP_H | ||
15 | |||
16 | #include <linux/kernel.h> | ||
17 | #include <asm/page.h> | ||
18 | #ifdef CONFIG_HIGHMEM | ||
19 | #include <linux/threads.h> | ||
20 | #include <asm/kmap_types.h> | ||
21 | #endif | ||
22 | |||
23 | /* | ||
24 | * Here we define all the compile-time 'special' virtual | ||
25 | * addresses. The point is to have a constant address at | ||
26 | * compile time, but to set the physical address only | ||
27 | * in the boot process. We allocate these special addresses | ||
28 | * from the top of unused virtual memory (0xfd000000 - 1 page) backwards. | ||
29 | * Also this lets us do fail-safe vmalloc(), we | ||
30 | * can guarantee that these special addresses and | ||
31 | * vmalloc()-ed addresses never overlap. | ||
32 | * | ||
33 | * these 'compile-time allocated' memory buffers are | ||
34 | * fixed-size 4k pages. (or larger if used with an increment | ||
35 | * highger than 1) use fixmap_set(idx,phys) to associate | ||
36 | * physical memory with fixmap indices. | ||
37 | * | ||
38 | * TLB entries of such buffers will not be flushed across | ||
39 | * task switches. | ||
40 | */ | ||
41 | |||
42 | /* | ||
43 | * on UP currently we will have no trace of the fixmap mechanism, | ||
44 | * no page table allocations, etc. This might change in the | ||
45 | * future, say framebuffers for the console driver(s) could be | ||
46 | * fix-mapped? | ||
47 | */ | ||
48 | enum fixed_addresses { | ||
49 | FIX_HOLE, | ||
50 | #ifdef CONFIG_HIGHMEM | ||
51 | FIX_KMAP_BEGIN, | ||
52 | FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1, | ||
53 | #endif | ||
54 | __end_of_fixed_addresses | ||
55 | }; | ||
56 | |||
57 | extern void __set_fixmap (enum fixed_addresses idx, | ||
58 | unsigned long phys, pgprot_t flags); | ||
59 | |||
60 | #define set_fixmap(idx, phys) \ | ||
61 | __set_fixmap(idx, phys, PAGE_KERNEL) | ||
62 | /* | ||
63 | * Some hardware wants to get fixmapped without caching. | ||
64 | */ | ||
65 | #define set_fixmap_nocache(idx, phys) \ | ||
66 | __set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE) | ||
67 | /* | ||
68 | * used by vmalloc.c. | ||
69 | * | ||
70 | * Leave one empty page between IO pages at 0xfd000000 and | ||
71 | * the start of the fixmap. | ||
72 | */ | ||
73 | #define FIXADDR_TOP (0xfcfff000UL) | ||
74 | #define FIXADDR_SIZE ((__end_of_fixed_addresses) << PAGE_SHIFT) | ||
75 | #define FIXADDR_START (FIXADDR_TOP - FIXADDR_SIZE) | ||
76 | |||
77 | #define __fix_to_virt(x) (FIXADDR_TOP - ((x) << PAGE_SHIFT)) | ||
78 | #define __virt_to_fix(x) ((FIXADDR_TOP - ((x)&PAGE_MASK)) >> PAGE_SHIFT) | ||
79 | |||
80 | extern void __this_fixmap_does_not_exist(void); | ||
81 | |||
82 | /* | ||
83 | * 'index to address' translation. If anyone tries to use the idx | ||
84 | * directly without tranlation, we catch the bug with a NULL-deference | ||
85 | * kernel oops. Illegal ranges of incoming indices are caught too. | ||
86 | */ | ||
87 | static inline unsigned long fix_to_virt(const unsigned int idx) | ||
88 | { | ||
89 | /* | ||
90 | * this branch gets completely eliminated after inlining, | ||
91 | * except when someone tries to use fixaddr indices in an | ||
92 | * illegal way. (such as mixing up address types or using | ||
93 | * out-of-range indices). | ||
94 | * | ||
95 | * If it doesn't get removed, the linker will complain | ||
96 | * loudly with a reasonably clear error message.. | ||
97 | */ | ||
98 | if (idx >= __end_of_fixed_addresses) | ||
99 | __this_fixmap_does_not_exist(); | ||
100 | |||
101 | return __fix_to_virt(idx); | ||
102 | } | ||
103 | |||
104 | static inline unsigned long virt_to_fix(const unsigned long vaddr) | ||
105 | { | ||
106 | BUG_ON(vaddr >= FIXADDR_TOP || vaddr < FIXADDR_START); | ||
107 | return __virt_to_fix(vaddr); | ||
108 | } | ||
109 | |||
110 | #endif | ||
diff --git a/arch/sparc/include/asm/ioctl.h b/arch/sparc/include/asm/ioctl.h new file mode 100644 index 00000000000..7d6bd51321b --- /dev/null +++ b/arch/sparc/include/asm/ioctl.h | |||
@@ -0,0 +1,67 @@ | |||
1 | #ifndef _SPARC_IOCTL_H | ||
2 | #define _SPARC_IOCTL_H | ||
3 | |||
4 | /* | ||
5 | * Our DIR and SIZE overlap in order to simulteneously provide | ||
6 | * a non-zero _IOC_NONE (for binary compatibility) and | ||
7 | * 14 bits of size as on i386. Here's the layout: | ||
8 | * | ||
9 | * 0xE0000000 DIR | ||
10 | * 0x80000000 DIR = WRITE | ||
11 | * 0x40000000 DIR = READ | ||
12 | * 0x20000000 DIR = NONE | ||
13 | * 0x3FFF0000 SIZE (overlaps NONE bit) | ||
14 | * 0x0000FF00 TYPE | ||
15 | * 0x000000FF NR (CMD) | ||
16 | */ | ||
17 | |||
18 | #define _IOC_NRBITS 8 | ||
19 | #define _IOC_TYPEBITS 8 | ||
20 | #define _IOC_SIZEBITS 13 /* Actually 14, see below. */ | ||
21 | #define _IOC_DIRBITS 3 | ||
22 | |||
23 | #define _IOC_NRMASK ((1 << _IOC_NRBITS)-1) | ||
24 | #define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1) | ||
25 | #define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1) | ||
26 | #define _IOC_XSIZEMASK ((1 << (_IOC_SIZEBITS+1))-1) | ||
27 | #define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1) | ||
28 | |||
29 | #define _IOC_NRSHIFT 0 | ||
30 | #define _IOC_TYPESHIFT (_IOC_NRSHIFT + _IOC_NRBITS) | ||
31 | #define _IOC_SIZESHIFT (_IOC_TYPESHIFT + _IOC_TYPEBITS) | ||
32 | #define _IOC_DIRSHIFT (_IOC_SIZESHIFT + _IOC_SIZEBITS) | ||
33 | |||
34 | #define _IOC_NONE 1U | ||
35 | #define _IOC_READ 2U | ||
36 | #define _IOC_WRITE 4U | ||
37 | |||
38 | #define _IOC(dir,type,nr,size) \ | ||
39 | (((dir) << _IOC_DIRSHIFT) | \ | ||
40 | ((type) << _IOC_TYPESHIFT) | \ | ||
41 | ((nr) << _IOC_NRSHIFT) | \ | ||
42 | ((size) << _IOC_SIZESHIFT)) | ||
43 | |||
44 | #define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0) | ||
45 | #define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size)) | ||
46 | #define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size)) | ||
47 | #define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size)) | ||
48 | |||
49 | /* Used to decode ioctl numbers in drivers despite the leading underscore... */ | ||
50 | #define _IOC_DIR(nr) \ | ||
51 | ( (((((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK) & (_IOC_WRITE|_IOC_READ)) != 0)? \ | ||
52 | (((nr) >> _IOC_DIRSHIFT) & (_IOC_WRITE|_IOC_READ)): \ | ||
53 | (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK) ) | ||
54 | #define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK) | ||
55 | #define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK) | ||
56 | #define _IOC_SIZE(nr) \ | ||
57 | ((((((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK) & (_IOC_WRITE|_IOC_READ)) == 0)? \ | ||
58 | 0: (((nr) >> _IOC_SIZESHIFT) & _IOC_XSIZEMASK)) | ||
59 | |||
60 | /* ...and for the PCMCIA and sound. */ | ||
61 | #define IOC_IN (_IOC_WRITE << _IOC_DIRSHIFT) | ||
62 | #define IOC_OUT (_IOC_READ << _IOC_DIRSHIFT) | ||
63 | #define IOC_INOUT ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT) | ||
64 | #define IOCSIZE_MASK (_IOC_XSIZEMASK << _IOC_SIZESHIFT) | ||
65 | #define IOCSIZE_SHIFT (_IOC_SIZESHIFT) | ||
66 | |||
67 | #endif /* !(_SPARC_IOCTL_H) */ | ||
diff --git a/arch/sparc/include/asm/ipcbuf.h b/arch/sparc/include/asm/ipcbuf.h new file mode 100644 index 00000000000..66013b4fe10 --- /dev/null +++ b/arch/sparc/include/asm/ipcbuf.h | |||
@@ -0,0 +1,32 @@ | |||
1 | #ifndef __SPARC_IPCBUF_H | ||
2 | #define __SPARC_IPCBUF_H | ||
3 | |||
4 | /* | ||
5 | * The ipc64_perm structure for sparc/sparc64 architecture. | ||
6 | * Note extra padding because this structure is passed back and forth | ||
7 | * between kernel and user space. | ||
8 | * | ||
9 | * Pad space is left for: | ||
10 | * - 32-bit seq | ||
11 | * - on sparc for 32 bit mode (it is 32 bit on sparc64) | ||
12 | * - 2 miscellaneous 64-bit values | ||
13 | */ | ||
14 | |||
15 | struct ipc64_perm | ||
16 | { | ||
17 | __kernel_key_t key; | ||
18 | __kernel_uid_t uid; | ||
19 | __kernel_gid_t gid; | ||
20 | __kernel_uid_t cuid; | ||
21 | __kernel_gid_t cgid; | ||
22 | #ifndef __arch64__ | ||
23 | unsigned short __pad0; | ||
24 | #endif | ||
25 | __kernel_mode_t mode; | ||
26 | unsigned short __pad1; | ||
27 | unsigned short seq; | ||
28 | unsigned long long __unused1; | ||
29 | unsigned long long __unused2; | ||
30 | }; | ||
31 | |||
32 | #endif /* __SPARC_IPCBUF_H */ | ||
diff --git a/arch/sparc/include/asm/jsflash.h b/arch/sparc/include/asm/jsflash.h new file mode 100644 index 00000000000..0717d9e39d2 --- /dev/null +++ b/arch/sparc/include/asm/jsflash.h | |||
@@ -0,0 +1,39 @@ | |||
1 | /* | ||
2 | * jsflash.h: OS Flash SIMM support for JavaStations. | ||
3 | * | ||
4 | * Copyright (C) 1999 Pete Zaitcev | ||
5 | */ | ||
6 | |||
7 | #ifndef _SPARC_JSFLASH_H | ||
8 | #define _SPARC_JSFLASH_H | ||
9 | |||
10 | #ifndef _SPARC_TYPES_H | ||
11 | #include <linux/types.h> | ||
12 | #endif | ||
13 | |||
14 | /* | ||
15 | * Semantics of the offset is a full address. | ||
16 | * Hardcode it or get it from probe ioctl. | ||
17 | * | ||
18 | * We use full bus address, so that we would be | ||
19 | * automatically compatible with possible future systems. | ||
20 | */ | ||
21 | |||
22 | #define JSFLASH_IDENT (('F'<<8)|54) | ||
23 | struct jsflash_ident_arg { | ||
24 | __u64 off; /* 0x20000000 is included */ | ||
25 | __u32 size; | ||
26 | char name[32]; /* With trailing zero */ | ||
27 | }; | ||
28 | |||
29 | #define JSFLASH_ERASE (('F'<<8)|55) | ||
30 | /* Put 0 as argument, may be flags or sector number... */ | ||
31 | |||
32 | #define JSFLASH_PROGRAM (('F'<<8)|56) | ||
33 | struct jsflash_program_arg { | ||
34 | __u64 data; /* char* for sparc and sparc64 */ | ||
35 | __u64 off; | ||
36 | __u32 size; | ||
37 | }; | ||
38 | |||
39 | #endif /* _SPARC_JSFLASH_H */ | ||
diff --git a/arch/sparc/include/asm/memblock.h b/arch/sparc/include/asm/memblock.h new file mode 100644 index 00000000000..c67b047ef85 --- /dev/null +++ b/arch/sparc/include/asm/memblock.h | |||
@@ -0,0 +1,8 @@ | |||
1 | #ifndef _SPARC64_MEMBLOCK_H | ||
2 | #define _SPARC64_MEMBLOCK_H | ||
3 | |||
4 | #include <asm/oplib.h> | ||
5 | |||
6 | #define MEMBLOCK_DBG(fmt...) prom_printf(fmt) | ||
7 | |||
8 | #endif /* !(_SPARC64_MEMBLOCK_H) */ | ||
diff --git a/arch/sparc/include/asm/memreg.h b/arch/sparc/include/asm/memreg.h new file mode 100644 index 00000000000..845ad2b3918 --- /dev/null +++ b/arch/sparc/include/asm/memreg.h | |||
@@ -0,0 +1,51 @@ | |||
1 | #ifndef _SPARC_MEMREG_H | ||
2 | #define _SPARC_MEMREG_H | ||
3 | /* memreg.h: Definitions of the values found in the synchronous | ||
4 | * and asynchronous memory error registers when a fault | ||
5 | * occurs on the sun4c. | ||
6 | * | ||
7 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | ||
8 | */ | ||
9 | |||
10 | /* First the synchronous error codes, these are usually just | ||
11 | * normal page faults. | ||
12 | */ | ||
13 | |||
14 | #define SUN4C_SYNC_WDRESET 0x0001 /* watchdog reset */ | ||
15 | #define SUN4C_SYNC_SIZE 0x0002 /* bad access size? whuz this? */ | ||
16 | #define SUN4C_SYNC_PARITY 0x0008 /* bad ram chips caused a parity error */ | ||
17 | #define SUN4C_SYNC_SBUS 0x0010 /* the SBUS had some problems... */ | ||
18 | #define SUN4C_SYNC_NOMEM 0x0020 /* translation to non-existent ram */ | ||
19 | #define SUN4C_SYNC_PROT 0x0040 /* access violated pte protections */ | ||
20 | #define SUN4C_SYNC_NPRESENT 0x0080 /* pte said that page was not present */ | ||
21 | #define SUN4C_SYNC_BADWRITE 0x8000 /* while writing something went bogus */ | ||
22 | |||
23 | #define SUN4C_SYNC_BOLIXED \ | ||
24 | (SUN4C_SYNC_WDRESET | SUN4C_SYNC_SIZE | SUN4C_SYNC_SBUS | \ | ||
25 | SUN4C_SYNC_NOMEM | SUN4C_SYNC_PARITY) | ||
26 | |||
27 | /* Now the asynchronous error codes, these are almost always produced | ||
28 | * by the cache writing things back to memory and getting a bad translation. | ||
29 | * Bad DVMA transactions can cause these faults too. | ||
30 | */ | ||
31 | |||
32 | #define SUN4C_ASYNC_BADDVMA 0x0010 /* error during DVMA access */ | ||
33 | #define SUN4C_ASYNC_NOMEM 0x0020 /* write back pointed to bad phys addr */ | ||
34 | #define SUN4C_ASYNC_BADWB 0x0080 /* write back points to non-present page */ | ||
35 | |||
36 | /* Memory parity error register with associated bit constants. */ | ||
37 | #ifndef __ASSEMBLY__ | ||
38 | extern __volatile__ unsigned long __iomem *sun4c_memerr_reg; | ||
39 | #endif | ||
40 | |||
41 | #define SUN4C_MPE_ERROR 0x80 /* Parity error detected. (ro) */ | ||
42 | #define SUN4C_MPE_MULTI 0x40 /* Multiple parity errors detected. (ro) */ | ||
43 | #define SUN4C_MPE_TEST 0x20 /* Write inverse parity. (rw) */ | ||
44 | #define SUN4C_MPE_CHECK 0x10 /* Enable parity checking. (rw) */ | ||
45 | #define SUN4C_MPE_ERR00 0x08 /* Parity error in bits 0-7. (ro) */ | ||
46 | #define SUN4C_MPE_ERR08 0x04 /* Parity error in bits 8-15. (ro) */ | ||
47 | #define SUN4C_MPE_ERR16 0x02 /* Parity error in bits 16-23. (ro) */ | ||
48 | #define SUN4C_MPE_ERR24 0x01 /* Parity error in bits 24-31. (ro) */ | ||
49 | #define SUN4C_MPE_ERRS 0x0F /* Bit mask for the error bits. (ro) */ | ||
50 | |||
51 | #endif /* !(_SPARC_MEMREG_H) */ | ||
diff --git a/arch/sparc/include/asm/module.h b/arch/sparc/include/asm/module.h new file mode 100644 index 00000000000..ff8e02d8033 --- /dev/null +++ b/arch/sparc/include/asm/module.h | |||
@@ -0,0 +1,24 @@ | |||
1 | #ifndef __SPARC_MODULE_H | ||
2 | #define __SPARC_MODULE_H | ||
3 | struct mod_arch_specific { }; | ||
4 | |||
5 | /* | ||
6 | * Use some preprocessor magic to define the correct symbol | ||
7 | * for sparc32 and sparc64. | ||
8 | * Elf_Addr becomes Elf32_Addr for sparc32 and Elf64_Addr for sparc64 | ||
9 | */ | ||
10 | #define ___ELF(a, b, c) a##b##c | ||
11 | #define __ELF(a, b, c) ___ELF(a, b, c) | ||
12 | #define _Elf(t) __ELF(Elf, CONFIG_BITS, t) | ||
13 | #define _ELF(t) __ELF(ELF, CONFIG_BITS, t) | ||
14 | |||
15 | #define Elf_Shdr _Elf(_Shdr) | ||
16 | #define Elf_Sym _Elf(_Sym) | ||
17 | #define Elf_Ehdr _Elf(_Ehdr) | ||
18 | #define Elf_Rela _Elf(_Rela) | ||
19 | #define Elf_Addr _Elf(_Addr) | ||
20 | |||
21 | #define ELF_R_SYM _ELF(_R_SYM) | ||
22 | #define ELF_R_TYPE _ELF(_R_TYPE) | ||
23 | |||
24 | #endif /* __SPARC_MODULE_H */ | ||
diff --git a/arch/sparc/include/asm/mpmbox.h b/arch/sparc/include/asm/mpmbox.h new file mode 100644 index 00000000000..f8423039b24 --- /dev/null +++ b/arch/sparc/include/asm/mpmbox.h | |||
@@ -0,0 +1,67 @@ | |||
1 | /* | ||
2 | * mpmbox.h: Interface and defines for the OpenProm mailbox | ||
3 | * facilities for MP machines under Linux. | ||
4 | * | ||
5 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | ||
6 | */ | ||
7 | |||
8 | #ifndef _SPARC_MPMBOX_H | ||
9 | #define _SPARC_MPMBOX_H | ||
10 | |||
11 | /* The prom allocates, for each CPU on the machine an unsigned | ||
12 | * byte in physical ram. You probe the device tree prom nodes | ||
13 | * for these values. The purpose of this byte is to be able to | ||
14 | * pass messages from one cpu to another. | ||
15 | */ | ||
16 | |||
17 | /* These are the main message types we have to look for in our | ||
18 | * Cpu mailboxes, based upon these values we decide what course | ||
19 | * of action to take. | ||
20 | */ | ||
21 | |||
22 | /* The CPU is executing code in the kernel. */ | ||
23 | #define MAILBOX_ISRUNNING 0xf0 | ||
24 | |||
25 | /* Another CPU called romvec->pv_exit(), you should call | ||
26 | * prom_stopcpu() when you see this in your mailbox. | ||
27 | */ | ||
28 | #define MAILBOX_EXIT 0xfb | ||
29 | |||
30 | /* Another CPU called romvec->pv_enter(), you should call | ||
31 | * prom_cpuidle() when this is seen. | ||
32 | */ | ||
33 | #define MAILBOX_GOSPIN 0xfc | ||
34 | |||
35 | /* Another CPU has hit a breakpoint either into kadb or the prom | ||
36 | * itself. Just like MAILBOX_GOSPIN, you should call prom_cpuidle() | ||
37 | * at this point. | ||
38 | */ | ||
39 | #define MAILBOX_BPT_SPIN 0xfd | ||
40 | |||
41 | /* Oh geese, some other nitwit got a damn watchdog reset. The party's | ||
42 | * over so go call prom_stopcpu(). | ||
43 | */ | ||
44 | #define MAILBOX_WDOG_STOP 0xfe | ||
45 | |||
46 | #ifndef __ASSEMBLY__ | ||
47 | |||
48 | /* Handy macro's to determine a cpu's state. */ | ||
49 | |||
50 | /* Is the cpu still in Power On Self Test? */ | ||
51 | #define MBOX_POST_P(letter) ((letter) >= 0x00 && (letter) <= 0x7f) | ||
52 | |||
53 | /* Is the cpu at the 'ok' prompt of the PROM? */ | ||
54 | #define MBOX_PROMPROMPT_P(letter) ((letter) >= 0x80 && (letter) <= 0x8f) | ||
55 | |||
56 | /* Is the cpu spinning in the PROM? */ | ||
57 | #define MBOX_PROMSPIN_P(letter) ((letter) >= 0x90 && (letter) <= 0xef) | ||
58 | |||
59 | /* Sanity check... This is junk mail, throw it out. */ | ||
60 | #define MBOX_BOGON_P(letter) ((letter) >= 0xf1 && (letter) <= 0xfa) | ||
61 | |||
62 | /* Is the cpu actively running an application/kernel-code? */ | ||
63 | #define MBOX_RUNNING_P(letter) ((letter) == MAILBOX_ISRUNNING) | ||
64 | |||
65 | #endif /* !(__ASSEMBLY__) */ | ||
66 | |||
67 | #endif /* !(_SPARC_MPMBOX_H) */ | ||
diff --git a/arch/sparc/include/asm/msgbuf.h b/arch/sparc/include/asm/msgbuf.h new file mode 100644 index 00000000000..efc7cbe9788 --- /dev/null +++ b/arch/sparc/include/asm/msgbuf.h | |||
@@ -0,0 +1,38 @@ | |||
1 | #ifndef _SPARC_MSGBUF_H | ||
2 | #define _SPARC_MSGBUF_H | ||
3 | |||
4 | /* | ||
5 | * The msqid64_ds structure for sparc64 architecture. | ||
6 | * Note extra padding because this structure is passed back and forth | ||
7 | * between kernel and user space. | ||
8 | * | ||
9 | * Pad space is left for: | ||
10 | * - 64-bit time_t to solve y2038 problem | ||
11 | * - 2 miscellaneous 32-bit values | ||
12 | */ | ||
13 | |||
14 | #if defined(__sparc__) && defined(__arch64__) | ||
15 | # define PADDING(x) | ||
16 | #else | ||
17 | # define PADDING(x) unsigned int x; | ||
18 | #endif | ||
19 | |||
20 | |||
21 | struct msqid64_ds { | ||
22 | struct ipc64_perm msg_perm; | ||
23 | PADDING(__pad1) | ||
24 | __kernel_time_t msg_stime; /* last msgsnd time */ | ||
25 | PADDING(__pad2) | ||
26 | __kernel_time_t msg_rtime; /* last msgrcv time */ | ||
27 | PADDING(__pad3) | ||
28 | __kernel_time_t msg_ctime; /* last change time */ | ||
29 | unsigned long msg_cbytes; /* current number of bytes on queue */ | ||
30 | unsigned long msg_qnum; /* number of messages in queue */ | ||
31 | unsigned long msg_qbytes; /* max number of bytes on queue */ | ||
32 | __kernel_pid_t msg_lspid; /* pid of last msgsnd */ | ||
33 | __kernel_pid_t msg_lrpid; /* last receive pid */ | ||
34 | unsigned long __unused1; | ||
35 | unsigned long __unused2; | ||
36 | }; | ||
37 | #undef PADDING | ||
38 | #endif /* _SPARC_MSGBUF_H */ | ||
diff --git a/arch/sparc/include/asm/openpromio.h b/arch/sparc/include/asm/openpromio.h new file mode 100644 index 00000000000..917fb8e9c63 --- /dev/null +++ b/arch/sparc/include/asm/openpromio.h | |||
@@ -0,0 +1,69 @@ | |||
1 | #ifndef _SPARC_OPENPROMIO_H | ||
2 | #define _SPARC_OPENPROMIO_H | ||
3 | |||
4 | #include <linux/compiler.h> | ||
5 | #include <linux/ioctl.h> | ||
6 | #include <linux/types.h> | ||
7 | |||
8 | /* | ||
9 | * SunOS and Solaris /dev/openprom definitions. The ioctl values | ||
10 | * were chosen to be exactly equal to the SunOS equivalents. | ||
11 | */ | ||
12 | |||
13 | struct openpromio | ||
14 | { | ||
15 | u_int oprom_size; /* Actual size of the oprom_array. */ | ||
16 | char oprom_array[1]; /* Holds property names and values. */ | ||
17 | }; | ||
18 | |||
19 | #define OPROMMAXPARAM 4096 /* Maximum size of oprom_array. */ | ||
20 | |||
21 | #define OPROMGETOPT 0x20004F01 | ||
22 | #define OPROMSETOPT 0x20004F02 | ||
23 | #define OPROMNXTOPT 0x20004F03 | ||
24 | #define OPROMSETOPT2 0x20004F04 | ||
25 | #define OPROMNEXT 0x20004F05 | ||
26 | #define OPROMCHILD 0x20004F06 | ||
27 | #define OPROMGETPROP 0x20004F07 | ||
28 | #define OPROMNXTPROP 0x20004F08 | ||
29 | #define OPROMU2P 0x20004F09 | ||
30 | #define OPROMGETCONS 0x20004F0A | ||
31 | #define OPROMGETFBNAME 0x20004F0B | ||
32 | #define OPROMGETBOOTARGS 0x20004F0C | ||
33 | /* Linux extensions */ /* Arguments in oprom_array: */ | ||
34 | #define OPROMSETCUR 0x20004FF0 /* int node - Sets current node */ | ||
35 | #define OPROMPCI2NODE 0x20004FF1 /* int pci_bus, pci_devfn - Sets current node to PCI device's node */ | ||
36 | #define OPROMPATH2NODE 0x20004FF2 /* char path[] - Set current node from fully qualified PROM path */ | ||
37 | |||
38 | /* | ||
39 | * Return values from OPROMGETCONS: | ||
40 | */ | ||
41 | |||
42 | #define OPROMCONS_NOT_WSCONS 0 | ||
43 | #define OPROMCONS_STDIN_IS_KBD 0x1 /* stdin device is kbd */ | ||
44 | #define OPROMCONS_STDOUT_IS_FB 0x2 /* stdout is a framebuffer */ | ||
45 | #define OPROMCONS_OPENPROM 0x4 /* supports openboot */ | ||
46 | |||
47 | |||
48 | /* | ||
49 | * NetBSD/OpenBSD /dev/openprom definitions. | ||
50 | */ | ||
51 | |||
52 | struct opiocdesc | ||
53 | { | ||
54 | int op_nodeid; /* PROM Node ID (value-result) */ | ||
55 | int op_namelen; /* Length of op_name. */ | ||
56 | char __user *op_name; /* Pointer to the property name. */ | ||
57 | int op_buflen; /* Length of op_buf (value-result) */ | ||
58 | char __user *op_buf; /* Pointer to buffer. */ | ||
59 | }; | ||
60 | |||
61 | #define OPIOCGET _IOWR('O', 1, struct opiocdesc) | ||
62 | #define OPIOCSET _IOW('O', 2, struct opiocdesc) | ||
63 | #define OPIOCNEXTPROP _IOWR('O', 3, struct opiocdesc) | ||
64 | #define OPIOCGETOPTNODE _IOR('O', 4, int) | ||
65 | #define OPIOCGETNEXT _IOWR('O', 5, int) | ||
66 | #define OPIOCGETCHILD _IOWR('O', 6, int) | ||
67 | |||
68 | #endif /* _SPARC_OPENPROMIO_H */ | ||
69 | |||
diff --git a/arch/sparc/include/asm/param.h b/arch/sparc/include/asm/param.h new file mode 100644 index 00000000000..0bc356bf8c5 --- /dev/null +++ b/arch/sparc/include/asm/param.h | |||
@@ -0,0 +1,7 @@ | |||
1 | #ifndef _ASMSPARC_PARAM_H | ||
2 | #define _ASMSPARC_PARAM_H | ||
3 | |||
4 | #define EXEC_PAGESIZE 8192 /* Thanks for sun4's we carry baggage... */ | ||
5 | #include <asm-generic/param.h> | ||
6 | |||
7 | #endif /* _ASMSPARC_PARAM_H */ | ||
diff --git a/arch/sparc/include/asm/perfctr.h b/arch/sparc/include/asm/perfctr.h new file mode 100644 index 00000000000..8d8720a8770 --- /dev/null +++ b/arch/sparc/include/asm/perfctr.h | |||
@@ -0,0 +1,173 @@ | |||
1 | /*---------------------------------------- | ||
2 | PERFORMANCE INSTRUMENTATION | ||
3 | Guillaume Thouvenin 08/10/98 | ||
4 | David S. Miller 10/06/98 | ||
5 | ---------------------------------------*/ | ||
6 | #ifndef PERF_COUNTER_API | ||
7 | #define PERF_COUNTER_API | ||
8 | |||
9 | /* sys_perfctr() interface. First arg is operation code | ||
10 | * from enumeration below. The meaning of further arguments | ||
11 | * are determined by the operation code. | ||
12 | * | ||
13 | * NOTE: This system call is no longer provided, use the perf_events | ||
14 | * infrastructure. | ||
15 | * | ||
16 | * Pointers which are passed by the user are pointers to 64-bit | ||
17 | * integers. | ||
18 | * | ||
19 | * Once enabled, performance counter state is retained until the | ||
20 | * process either exits or performs an exec. That is, performance | ||
21 | * counters remain enabled for fork/clone children. | ||
22 | */ | ||
23 | enum perfctr_opcode { | ||
24 | /* Enable UltraSparc performance counters, ARG0 is pointer | ||
25 | * to 64-bit accumulator for D0 counter in PIC, ARG1 is pointer | ||
26 | * to 64-bit accumulator for D1 counter. ARG2 is a pointer to | ||
27 | * the initial PCR register value to use. | ||
28 | */ | ||
29 | PERFCTR_ON, | ||
30 | |||
31 | /* Disable UltraSparc performance counters. The PCR is written | ||
32 | * with zero and the user counter accumulator pointers and | ||
33 | * working PCR register value are forgotten. | ||
34 | */ | ||
35 | PERFCTR_OFF, | ||
36 | |||
37 | /* Add current D0 and D1 PIC values into user pointers given | ||
38 | * in PERFCTR_ON operation. The PIC is cleared before returning. | ||
39 | */ | ||
40 | PERFCTR_READ, | ||
41 | |||
42 | /* Clear the PIC register. */ | ||
43 | PERFCTR_CLRPIC, | ||
44 | |||
45 | /* Begin using a new PCR value, the pointer to which is passed | ||
46 | * in ARG0. The PIC is also cleared after the new PCR value is | ||
47 | * written. | ||
48 | */ | ||
49 | PERFCTR_SETPCR, | ||
50 | |||
51 | /* Store in pointer given in ARG0 the current PCR register value | ||
52 | * being used. | ||
53 | */ | ||
54 | PERFCTR_GETPCR | ||
55 | }; | ||
56 | |||
57 | /* I don't want the kernel's namespace to be polluted with this | ||
58 | * stuff when this file is included. --DaveM | ||
59 | */ | ||
60 | #ifndef __KERNEL__ | ||
61 | |||
62 | #define PRIV 0x00000001 | ||
63 | #define SYS 0x00000002 | ||
64 | #define USR 0x00000004 | ||
65 | |||
66 | /* Pic.S0 Selection Bit Field Encoding, Ultra-I/II */ | ||
67 | #define CYCLE_CNT 0x00000000 | ||
68 | #define INSTR_CNT 0x00000010 | ||
69 | #define DISPATCH0_IC_MISS 0x00000020 | ||
70 | #define DISPATCH0_STOREBUF 0x00000030 | ||
71 | #define IC_REF 0x00000080 | ||
72 | #define DC_RD 0x00000090 | ||
73 | #define DC_WR 0x000000A0 | ||
74 | #define LOAD_USE 0x000000B0 | ||
75 | #define EC_REF 0x000000C0 | ||
76 | #define EC_WRITE_HIT_RDO 0x000000D0 | ||
77 | #define EC_SNOOP_INV 0x000000E0 | ||
78 | #define EC_RD_HIT 0x000000F0 | ||
79 | |||
80 | /* Pic.S0 Selection Bit Field Encoding, Ultra-III */ | ||
81 | #define US3_CYCLE_CNT 0x00000000 | ||
82 | #define US3_INSTR_CNT 0x00000010 | ||
83 | #define US3_DISPATCH0_IC_MISS 0x00000020 | ||
84 | #define US3_DISPATCH0_BR_TGT 0x00000030 | ||
85 | #define US3_DISPATCH0_2ND_BR 0x00000040 | ||
86 | #define US3_RSTALL_STOREQ 0x00000050 | ||
87 | #define US3_RSTALL_IU_USE 0x00000060 | ||
88 | #define US3_IC_REF 0x00000080 | ||
89 | #define US3_DC_RD 0x00000090 | ||
90 | #define US3_DC_WR 0x000000a0 | ||
91 | #define US3_EC_REF 0x000000c0 | ||
92 | #define US3_EC_WR_HIT_RTO 0x000000d0 | ||
93 | #define US3_EC_SNOOP_INV 0x000000e0 | ||
94 | #define US3_EC_RD_MISS 0x000000f0 | ||
95 | #define US3_PC_PORT0_RD 0x00000100 | ||
96 | #define US3_SI_SNOOP 0x00000110 | ||
97 | #define US3_SI_CIQ_FLOW 0x00000120 | ||
98 | #define US3_SI_OWNED 0x00000130 | ||
99 | #define US3_SW_COUNT_0 0x00000140 | ||
100 | #define US3_IU_BR_MISS_TAKEN 0x00000150 | ||
101 | #define US3_IU_BR_COUNT_TAKEN 0x00000160 | ||
102 | #define US3_DISP_RS_MISPRED 0x00000170 | ||
103 | #define US3_FA_PIPE_COMPL 0x00000180 | ||
104 | #define US3_MC_READS_0 0x00000200 | ||
105 | #define US3_MC_READS_1 0x00000210 | ||
106 | #define US3_MC_READS_2 0x00000220 | ||
107 | #define US3_MC_READS_3 0x00000230 | ||
108 | #define US3_MC_STALLS_0 0x00000240 | ||
109 | #define US3_MC_STALLS_2 0x00000250 | ||
110 | |||
111 | /* Pic.S1 Selection Bit Field Encoding, Ultra-I/II */ | ||
112 | #define CYCLE_CNT_D1 0x00000000 | ||
113 | #define INSTR_CNT_D1 0x00000800 | ||
114 | #define DISPATCH0_IC_MISPRED 0x00001000 | ||
115 | #define DISPATCH0_FP_USE 0x00001800 | ||
116 | #define IC_HIT 0x00004000 | ||
117 | #define DC_RD_HIT 0x00004800 | ||
118 | #define DC_WR_HIT 0x00005000 | ||
119 | #define LOAD_USE_RAW 0x00005800 | ||
120 | #define EC_HIT 0x00006000 | ||
121 | #define EC_WB 0x00006800 | ||
122 | #define EC_SNOOP_CB 0x00007000 | ||
123 | #define EC_IT_HIT 0x00007800 | ||
124 | |||
125 | /* Pic.S1 Selection Bit Field Encoding, Ultra-III */ | ||
126 | #define US3_CYCLE_CNT_D1 0x00000000 | ||
127 | #define US3_INSTR_CNT_D1 0x00000800 | ||
128 | #define US3_DISPATCH0_MISPRED 0x00001000 | ||
129 | #define US3_IC_MISS_CANCELLED 0x00001800 | ||
130 | #define US3_RE_ENDIAN_MISS 0x00002000 | ||
131 | #define US3_RE_FPU_BYPASS 0x00002800 | ||
132 | #define US3_RE_DC_MISS 0x00003000 | ||
133 | #define US3_RE_EC_MISS 0x00003800 | ||
134 | #define US3_IC_MISS 0x00004000 | ||
135 | #define US3_DC_RD_MISS 0x00004800 | ||
136 | #define US3_DC_WR_MISS 0x00005000 | ||
137 | #define US3_RSTALL_FP_USE 0x00005800 | ||
138 | #define US3_EC_MISSES 0x00006000 | ||
139 | #define US3_EC_WB 0x00006800 | ||
140 | #define US3_EC_SNOOP_CB 0x00007000 | ||
141 | #define US3_EC_IC_MISS 0x00007800 | ||
142 | #define US3_RE_PC_MISS 0x00008000 | ||
143 | #define US3_ITLB_MISS 0x00008800 | ||
144 | #define US3_DTLB_MISS 0x00009000 | ||
145 | #define US3_WC_MISS 0x00009800 | ||
146 | #define US3_WC_SNOOP_CB 0x0000a000 | ||
147 | #define US3_WC_SCRUBBED 0x0000a800 | ||
148 | #define US3_WC_WB_WO_READ 0x0000b000 | ||
149 | #define US3_PC_SOFT_HIT 0x0000c000 | ||
150 | #define US3_PC_SNOOP_INV 0x0000c800 | ||
151 | #define US3_PC_HARD_HIT 0x0000d000 | ||
152 | #define US3_PC_PORT1_RD 0x0000d800 | ||
153 | #define US3_SW_COUNT_1 0x0000e000 | ||
154 | #define US3_IU_STAT_BR_MIS_UNTAKEN 0x0000e800 | ||
155 | #define US3_IU_STAT_BR_COUNT_UNTAKEN 0x0000f000 | ||
156 | #define US3_PC_MS_MISSES 0x0000f800 | ||
157 | #define US3_MC_WRITES_0 0x00010800 | ||
158 | #define US3_MC_WRITES_1 0x00011000 | ||
159 | #define US3_MC_WRITES_2 0x00011800 | ||
160 | #define US3_MC_WRITES_3 0x00012000 | ||
161 | #define US3_MC_STALLS_1 0x00012800 | ||
162 | #define US3_MC_STALLS_3 0x00013000 | ||
163 | #define US3_RE_RAW_MISS 0x00013800 | ||
164 | #define US3_FM_PIPE_COMPLETION 0x00014000 | ||
165 | |||
166 | struct vcounter_struct { | ||
167 | unsigned long long vcnt0; | ||
168 | unsigned long long vcnt1; | ||
169 | }; | ||
170 | |||
171 | #endif /* !(__KERNEL__) */ | ||
172 | |||
173 | #endif /* !(PERF_COUNTER_API) */ | ||
diff --git a/arch/sparc/include/asm/pgtsun4.h b/arch/sparc/include/asm/pgtsun4.h new file mode 100644 index 00000000000..5a0d661fb82 --- /dev/null +++ b/arch/sparc/include/asm/pgtsun4.h | |||
@@ -0,0 +1,171 @@ | |||
1 | /* | ||
2 | * pgtsun4.h: Sun4 specific pgtable.h defines and code. | ||
3 | * | ||
4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | ||
5 | * Copyright (C) 1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) | ||
6 | */ | ||
7 | #ifndef _SPARC_PGTSUN4C_H | ||
8 | #define _SPARC_PGTSUN4C_H | ||
9 | |||
10 | #include <asm/contregs.h> | ||
11 | |||
12 | /* PMD_SHIFT determines the size of the area a second-level page table can map */ | ||
13 | #define SUN4C_PMD_SHIFT 23 | ||
14 | |||
15 | /* PGDIR_SHIFT determines what a third-level page table entry can map */ | ||
16 | #define SUN4C_PGDIR_SHIFT 23 | ||
17 | #define SUN4C_PGDIR_SIZE (1UL << SUN4C_PGDIR_SHIFT) | ||
18 | #define SUN4C_PGDIR_MASK (~(SUN4C_PGDIR_SIZE-1)) | ||
19 | #define SUN4C_PGDIR_ALIGN(addr) (((addr)+SUN4C_PGDIR_SIZE-1)&SUN4C_PGDIR_MASK) | ||
20 | |||
21 | /* To represent how the sun4c mmu really lays things out. */ | ||
22 | #define SUN4C_REAL_PGDIR_SHIFT 18 | ||
23 | #define SUN4C_REAL_PGDIR_SIZE (1UL << SUN4C_REAL_PGDIR_SHIFT) | ||
24 | #define SUN4C_REAL_PGDIR_MASK (~(SUN4C_REAL_PGDIR_SIZE-1)) | ||
25 | #define SUN4C_REAL_PGDIR_ALIGN(addr) (((addr)+SUN4C_REAL_PGDIR_SIZE-1)&SUN4C_REAL_PGDIR_MASK) | ||
26 | |||
27 | /* 19 bit PFN on sun4 */ | ||
28 | #define SUN4C_PFN_MASK 0x7ffff | ||
29 | |||
30 | /* Don't increase these unless the structures in sun4c.c are fixed */ | ||
31 | #define SUN4C_MAX_SEGMAPS 256 | ||
32 | #define SUN4C_MAX_CONTEXTS 16 | ||
33 | |||
34 | /* | ||
35 | * To be efficient, and not have to worry about allocating such | ||
36 | * a huge pgd, we make the kernel sun4c tables each hold 1024 | ||
37 | * entries and the pgd similarly just like the i386 tables. | ||
38 | */ | ||
39 | #define SUN4C_PTRS_PER_PTE 1024 | ||
40 | #define SUN4C_PTRS_PER_PMD 1 | ||
41 | #define SUN4C_PTRS_PER_PGD 1024 | ||
42 | |||
43 | /* | ||
44 | * Sparc SUN4C pte fields. | ||
45 | */ | ||
46 | #define _SUN4C_PAGE_VALID 0x80000000 | ||
47 | #define _SUN4C_PAGE_SILENT_READ 0x80000000 /* synonym */ | ||
48 | #define _SUN4C_PAGE_DIRTY 0x40000000 | ||
49 | #define _SUN4C_PAGE_SILENT_WRITE 0x40000000 /* synonym */ | ||
50 | #define _SUN4C_PAGE_PRIV 0x20000000 /* privileged page */ | ||
51 | #define _SUN4C_PAGE_NOCACHE 0x10000000 /* non-cacheable page */ | ||
52 | #define _SUN4C_PAGE_PRESENT 0x08000000 /* implemented in software */ | ||
53 | #define _SUN4C_PAGE_IO 0x04000000 /* I/O page */ | ||
54 | #define _SUN4C_PAGE_FILE 0x02000000 /* implemented in software */ | ||
55 | #define _SUN4C_PAGE_READ 0x00800000 /* implemented in software */ | ||
56 | #define _SUN4C_PAGE_WRITE 0x00400000 /* implemented in software */ | ||
57 | #define _SUN4C_PAGE_ACCESSED 0x00200000 /* implemented in software */ | ||
58 | #define _SUN4C_PAGE_MODIFIED 0x00100000 /* implemented in software */ | ||
59 | |||
60 | #define _SUN4C_READABLE (_SUN4C_PAGE_READ|_SUN4C_PAGE_SILENT_READ|\ | ||
61 | _SUN4C_PAGE_ACCESSED) | ||
62 | #define _SUN4C_WRITEABLE (_SUN4C_PAGE_WRITE|_SUN4C_PAGE_SILENT_WRITE|\ | ||
63 | _SUN4C_PAGE_MODIFIED) | ||
64 | |||
65 | #define _SUN4C_PAGE_CHG_MASK (0xffff|_SUN4C_PAGE_ACCESSED|_SUN4C_PAGE_MODIFIED) | ||
66 | |||
67 | #define SUN4C_PAGE_NONE __pgprot(_SUN4C_PAGE_PRESENT) | ||
68 | #define SUN4C_PAGE_SHARED __pgprot(_SUN4C_PAGE_PRESENT|_SUN4C_READABLE|\ | ||
69 | _SUN4C_PAGE_WRITE) | ||
70 | #define SUN4C_PAGE_COPY __pgprot(_SUN4C_PAGE_PRESENT|_SUN4C_READABLE) | ||
71 | #define SUN4C_PAGE_READONLY __pgprot(_SUN4C_PAGE_PRESENT|_SUN4C_READABLE) | ||
72 | #define SUN4C_PAGE_KERNEL __pgprot(_SUN4C_READABLE|_SUN4C_WRITEABLE|\ | ||
73 | _SUN4C_PAGE_DIRTY|_SUN4C_PAGE_PRIV) | ||
74 | |||
75 | /* SUN4C swap entry encoding | ||
76 | * | ||
77 | * We use 5 bits for the type and 19 for the offset. This gives us | ||
78 | * 32 swapfiles of 4GB each. Encoding looks like: | ||
79 | * | ||
80 | * RRRRRRRRooooooooooooooooooottttt | ||
81 | * fedcba9876543210fedcba9876543210 | ||
82 | * | ||
83 | * The top 8 bits are reserved for protection and status bits, especially | ||
84 | * FILE and PRESENT. | ||
85 | */ | ||
86 | #define SUN4C_SWP_TYPE_MASK 0x1f | ||
87 | #define SUN4C_SWP_OFF_MASK 0x7ffff | ||
88 | #define SUN4C_SWP_OFF_SHIFT 5 | ||
89 | |||
90 | #ifndef __ASSEMBLY__ | ||
91 | |||
92 | static inline unsigned long sun4c_get_synchronous_error(void) | ||
93 | { | ||
94 | unsigned long sync_err; | ||
95 | |||
96 | __asm__ __volatile__("lda [%1] %2, %0\n\t" : | ||
97 | "=r" (sync_err) : | ||
98 | "r" (AC_SYNC_ERR), "i" (ASI_CONTROL)); | ||
99 | return sync_err; | ||
100 | } | ||
101 | |||
102 | static inline unsigned long sun4c_get_synchronous_address(void) | ||
103 | { | ||
104 | unsigned long sync_addr; | ||
105 | |||
106 | __asm__ __volatile__("lda [%1] %2, %0\n\t" : | ||
107 | "=r" (sync_addr) : | ||
108 | "r" (AC_SYNC_VA), "i" (ASI_CONTROL)); | ||
109 | return sync_addr; | ||
110 | } | ||
111 | |||
112 | /* SUN4 pte, segmap, and context manipulation */ | ||
113 | static inline unsigned long sun4c_get_segmap(unsigned long addr) | ||
114 | { | ||
115 | register unsigned long entry; | ||
116 | |||
117 | __asm__ __volatile__("\n\tlduha [%1] %2, %0\n\t" : | ||
118 | "=r" (entry) : | ||
119 | "r" (addr), "i" (ASI_SEGMAP)); | ||
120 | return entry; | ||
121 | } | ||
122 | |||
123 | static inline void sun4c_put_segmap(unsigned long addr, unsigned long entry) | ||
124 | { | ||
125 | __asm__ __volatile__("\n\tstha %1, [%0] %2; nop; nop; nop;\n\t" : : | ||
126 | "r" (addr), "r" (entry), | ||
127 | "i" (ASI_SEGMAP) | ||
128 | : "memory"); | ||
129 | } | ||
130 | |||
131 | static inline unsigned long sun4c_get_pte(unsigned long addr) | ||
132 | { | ||
133 | register unsigned long entry; | ||
134 | |||
135 | __asm__ __volatile__("\n\tlda [%1] %2, %0\n\t" : | ||
136 | "=r" (entry) : | ||
137 | "r" (addr), "i" (ASI_PTE)); | ||
138 | return entry; | ||
139 | } | ||
140 | |||
141 | static inline void sun4c_put_pte(unsigned long addr, unsigned long entry) | ||
142 | { | ||
143 | __asm__ __volatile__("\n\tsta %1, [%0] %2; nop; nop; nop;\n\t" : : | ||
144 | "r" (addr), | ||
145 | "r" ((entry & ~(_SUN4C_PAGE_PRESENT))), "i" (ASI_PTE) | ||
146 | : "memory"); | ||
147 | } | ||
148 | |||
149 | static inline int sun4c_get_context(void) | ||
150 | { | ||
151 | register int ctx; | ||
152 | |||
153 | __asm__ __volatile__("\n\tlduba [%1] %2, %0\n\t" : | ||
154 | "=r" (ctx) : | ||
155 | "r" (AC_CONTEXT), "i" (ASI_CONTROL)); | ||
156 | |||
157 | return ctx; | ||
158 | } | ||
159 | |||
160 | static inline int sun4c_set_context(int ctx) | ||
161 | { | ||
162 | __asm__ __volatile__("\n\tstba %0, [%1] %2; nop; nop; nop;\n\t" : : | ||
163 | "r" (ctx), "r" (AC_CONTEXT), "i" (ASI_CONTROL) | ||
164 | : "memory"); | ||
165 | |||
166 | return ctx; | ||
167 | } | ||
168 | |||
169 | #endif /* !(__ASSEMBLY__) */ | ||
170 | |||
171 | #endif /* !(_SPARC_PGTSUN4_H) */ | ||
diff --git a/arch/sparc/include/asm/pgtsun4c.h b/arch/sparc/include/asm/pgtsun4c.h new file mode 100644 index 00000000000..aeb25e91217 --- /dev/null +++ b/arch/sparc/include/asm/pgtsun4c.h | |||
@@ -0,0 +1,172 @@ | |||
1 | /* | ||
2 | * pgtsun4c.h: Sun4c specific pgtable.h defines and code. | ||
3 | * | ||
4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | ||
5 | */ | ||
6 | #ifndef _SPARC_PGTSUN4C_H | ||
7 | #define _SPARC_PGTSUN4C_H | ||
8 | |||
9 | #include <asm/contregs.h> | ||
10 | |||
11 | /* PMD_SHIFT determines the size of the area a second-level page table can map */ | ||
12 | #define SUN4C_PMD_SHIFT 22 | ||
13 | |||
14 | /* PGDIR_SHIFT determines what a third-level page table entry can map */ | ||
15 | #define SUN4C_PGDIR_SHIFT 22 | ||
16 | #define SUN4C_PGDIR_SIZE (1UL << SUN4C_PGDIR_SHIFT) | ||
17 | #define SUN4C_PGDIR_MASK (~(SUN4C_PGDIR_SIZE-1)) | ||
18 | #define SUN4C_PGDIR_ALIGN(addr) (((addr)+SUN4C_PGDIR_SIZE-1)&SUN4C_PGDIR_MASK) | ||
19 | |||
20 | /* To represent how the sun4c mmu really lays things out. */ | ||
21 | #define SUN4C_REAL_PGDIR_SHIFT 18 | ||
22 | #define SUN4C_REAL_PGDIR_SIZE (1UL << SUN4C_REAL_PGDIR_SHIFT) | ||
23 | #define SUN4C_REAL_PGDIR_MASK (~(SUN4C_REAL_PGDIR_SIZE-1)) | ||
24 | #define SUN4C_REAL_PGDIR_ALIGN(addr) (((addr)+SUN4C_REAL_PGDIR_SIZE-1)&SUN4C_REAL_PGDIR_MASK) | ||
25 | |||
26 | /* 16 bit PFN on sun4c */ | ||
27 | #define SUN4C_PFN_MASK 0xffff | ||
28 | |||
29 | /* Don't increase these unless the structures in sun4c.c are fixed */ | ||
30 | #define SUN4C_MAX_SEGMAPS 256 | ||
31 | #define SUN4C_MAX_CONTEXTS 16 | ||
32 | |||
33 | /* | ||
34 | * To be efficient, and not have to worry about allocating such | ||
35 | * a huge pgd, we make the kernel sun4c tables each hold 1024 | ||
36 | * entries and the pgd similarly just like the i386 tables. | ||
37 | */ | ||
38 | #define SUN4C_PTRS_PER_PTE 1024 | ||
39 | #define SUN4C_PTRS_PER_PMD 1 | ||
40 | #define SUN4C_PTRS_PER_PGD 1024 | ||
41 | |||
42 | /* | ||
43 | * Sparc SUN4C pte fields. | ||
44 | */ | ||
45 | #define _SUN4C_PAGE_VALID 0x80000000 | ||
46 | #define _SUN4C_PAGE_SILENT_READ 0x80000000 /* synonym */ | ||
47 | #define _SUN4C_PAGE_DIRTY 0x40000000 | ||
48 | #define _SUN4C_PAGE_SILENT_WRITE 0x40000000 /* synonym */ | ||
49 | #define _SUN4C_PAGE_PRIV 0x20000000 /* privileged page */ | ||
50 | #define _SUN4C_PAGE_NOCACHE 0x10000000 /* non-cacheable page */ | ||
51 | #define _SUN4C_PAGE_PRESENT 0x08000000 /* implemented in software */ | ||
52 | #define _SUN4C_PAGE_IO 0x04000000 /* I/O page */ | ||
53 | #define _SUN4C_PAGE_FILE 0x02000000 /* implemented in software */ | ||
54 | #define _SUN4C_PAGE_READ 0x00800000 /* implemented in software */ | ||
55 | #define _SUN4C_PAGE_WRITE 0x00400000 /* implemented in software */ | ||
56 | #define _SUN4C_PAGE_ACCESSED 0x00200000 /* implemented in software */ | ||
57 | #define _SUN4C_PAGE_MODIFIED 0x00100000 /* implemented in software */ | ||
58 | |||
59 | #define _SUN4C_READABLE (_SUN4C_PAGE_READ|_SUN4C_PAGE_SILENT_READ|\ | ||
60 | _SUN4C_PAGE_ACCESSED) | ||
61 | #define _SUN4C_WRITEABLE (_SUN4C_PAGE_WRITE|_SUN4C_PAGE_SILENT_WRITE|\ | ||
62 | _SUN4C_PAGE_MODIFIED) | ||
63 | |||
64 | #define _SUN4C_PAGE_CHG_MASK (0xffff|_SUN4C_PAGE_ACCESSED|_SUN4C_PAGE_MODIFIED) | ||
65 | |||
66 | #define SUN4C_PAGE_NONE __pgprot(_SUN4C_PAGE_PRESENT) | ||
67 | #define SUN4C_PAGE_SHARED __pgprot(_SUN4C_PAGE_PRESENT|_SUN4C_READABLE|\ | ||
68 | _SUN4C_PAGE_WRITE) | ||
69 | #define SUN4C_PAGE_COPY __pgprot(_SUN4C_PAGE_PRESENT|_SUN4C_READABLE) | ||
70 | #define SUN4C_PAGE_READONLY __pgprot(_SUN4C_PAGE_PRESENT|_SUN4C_READABLE) | ||
71 | #define SUN4C_PAGE_KERNEL __pgprot(_SUN4C_READABLE|_SUN4C_WRITEABLE|\ | ||
72 | _SUN4C_PAGE_DIRTY|_SUN4C_PAGE_PRIV) | ||
73 | |||
74 | /* SUN4C swap entry encoding | ||
75 | * | ||
76 | * We use 5 bits for the type and 19 for the offset. This gives us | ||
77 | * 32 swapfiles of 4GB each. Encoding looks like: | ||
78 | * | ||
79 | * RRRRRRRRooooooooooooooooooottttt | ||
80 | * fedcba9876543210fedcba9876543210 | ||
81 | * | ||
82 | * The top 8 bits are reserved for protection and status bits, especially | ||
83 | * FILE and PRESENT. | ||
84 | */ | ||
85 | #define SUN4C_SWP_TYPE_MASK 0x1f | ||
86 | #define SUN4C_SWP_OFF_MASK 0x7ffff | ||
87 | #define SUN4C_SWP_OFF_SHIFT 5 | ||
88 | |||
89 | #ifndef __ASSEMBLY__ | ||
90 | |||
91 | static inline unsigned long sun4c_get_synchronous_error(void) | ||
92 | { | ||
93 | unsigned long sync_err; | ||
94 | |||
95 | __asm__ __volatile__("lda [%1] %2, %0\n\t" : | ||
96 | "=r" (sync_err) : | ||
97 | "r" (AC_SYNC_ERR), "i" (ASI_CONTROL)); | ||
98 | return sync_err; | ||
99 | } | ||
100 | |||
101 | static inline unsigned long sun4c_get_synchronous_address(void) | ||
102 | { | ||
103 | unsigned long sync_addr; | ||
104 | |||
105 | __asm__ __volatile__("lda [%1] %2, %0\n\t" : | ||
106 | "=r" (sync_addr) : | ||
107 | "r" (AC_SYNC_VA), "i" (ASI_CONTROL)); | ||
108 | return sync_addr; | ||
109 | } | ||
110 | |||
111 | /* SUN4C pte, segmap, and context manipulation */ | ||
112 | static inline unsigned long sun4c_get_segmap(unsigned long addr) | ||
113 | { | ||
114 | register unsigned long entry; | ||
115 | |||
116 | __asm__ __volatile__("\n\tlduba [%1] %2, %0\n\t" : | ||
117 | "=r" (entry) : | ||
118 | "r" (addr), "i" (ASI_SEGMAP)); | ||
119 | |||
120 | return entry; | ||
121 | } | ||
122 | |||
123 | static inline void sun4c_put_segmap(unsigned long addr, unsigned long entry) | ||
124 | { | ||
125 | |||
126 | __asm__ __volatile__("\n\tstba %1, [%0] %2; nop; nop; nop;\n\t" : : | ||
127 | "r" (addr), "r" (entry), | ||
128 | "i" (ASI_SEGMAP) | ||
129 | : "memory"); | ||
130 | } | ||
131 | |||
132 | static inline unsigned long sun4c_get_pte(unsigned long addr) | ||
133 | { | ||
134 | register unsigned long entry; | ||
135 | |||
136 | __asm__ __volatile__("\n\tlda [%1] %2, %0\n\t" : | ||
137 | "=r" (entry) : | ||
138 | "r" (addr), "i" (ASI_PTE)); | ||
139 | return entry; | ||
140 | } | ||
141 | |||
142 | static inline void sun4c_put_pte(unsigned long addr, unsigned long entry) | ||
143 | { | ||
144 | __asm__ __volatile__("\n\tsta %1, [%0] %2; nop; nop; nop;\n\t" : : | ||
145 | "r" (addr), | ||
146 | "r" ((entry & ~(_SUN4C_PAGE_PRESENT))), "i" (ASI_PTE) | ||
147 | : "memory"); | ||
148 | } | ||
149 | |||
150 | static inline int sun4c_get_context(void) | ||
151 | { | ||
152 | register int ctx; | ||
153 | |||
154 | __asm__ __volatile__("\n\tlduba [%1] %2, %0\n\t" : | ||
155 | "=r" (ctx) : | ||
156 | "r" (AC_CONTEXT), "i" (ASI_CONTROL)); | ||
157 | |||
158 | return ctx; | ||
159 | } | ||
160 | |||
161 | static inline int sun4c_set_context(int ctx) | ||
162 | { | ||
163 | __asm__ __volatile__("\n\tstba %0, [%1] %2; nop; nop; nop;\n\t" : : | ||
164 | "r" (ctx), "r" (AC_CONTEXT), "i" (ASI_CONTROL) | ||
165 | : "memory"); | ||
166 | |||
167 | return ctx; | ||
168 | } | ||
169 | |||
170 | #endif /* !(__ASSEMBLY__) */ | ||
171 | |||
172 | #endif /* !(_SPARC_PGTSUN4C_H) */ | ||
diff --git a/arch/sparc/include/asm/poll.h b/arch/sparc/include/asm/poll.h new file mode 100644 index 00000000000..091d3ad2e83 --- /dev/null +++ b/arch/sparc/include/asm/poll.h | |||
@@ -0,0 +1,12 @@ | |||
1 | #ifndef __SPARC_POLL_H | ||
2 | #define __SPARC_POLL_H | ||
3 | |||
4 | #define POLLWRNORM POLLOUT | ||
5 | #define POLLWRBAND 256 | ||
6 | #define POLLMSG 512 | ||
7 | #define POLLREMOVE 1024 | ||
8 | #define POLLRDHUP 2048 | ||
9 | |||
10 | #include <asm-generic/poll.h> | ||
11 | |||
12 | #endif | ||
diff --git a/arch/sparc/include/asm/posix_types.h b/arch/sparc/include/asm/posix_types.h new file mode 100644 index 00000000000..98d6ebb922f --- /dev/null +++ b/arch/sparc/include/asm/posix_types.h | |||
@@ -0,0 +1,155 @@ | |||
1 | /* | ||
2 | * This file is generally used by user-level software, so you need to | ||
3 | * be a little careful about namespace pollution etc. Also, we cannot | ||
4 | * assume GCC is being used. | ||
5 | */ | ||
6 | |||
7 | #ifndef __SPARC_POSIX_TYPES_H | ||
8 | #define __SPARC_POSIX_TYPES_H | ||
9 | |||
10 | #if defined(__sparc__) && defined(__arch64__) | ||
11 | /* sparc 64 bit */ | ||
12 | typedef unsigned long __kernel_size_t; | ||
13 | typedef long __kernel_ssize_t; | ||
14 | typedef long __kernel_ptrdiff_t; | ||
15 | typedef long __kernel_time_t; | ||
16 | typedef long __kernel_clock_t; | ||
17 | typedef int __kernel_pid_t; | ||
18 | typedef int __kernel_ipc_pid_t; | ||
19 | typedef unsigned int __kernel_uid_t; | ||
20 | typedef unsigned int __kernel_gid_t; | ||
21 | typedef unsigned long __kernel_ino_t; | ||
22 | typedef unsigned int __kernel_mode_t; | ||
23 | typedef unsigned short __kernel_umode_t; | ||
24 | typedef unsigned int __kernel_nlink_t; | ||
25 | typedef int __kernel_daddr_t; | ||
26 | typedef long __kernel_off_t; | ||
27 | typedef char * __kernel_caddr_t; | ||
28 | typedef unsigned short __kernel_uid16_t; | ||
29 | typedef unsigned short __kernel_gid16_t; | ||
30 | typedef int __kernel_clockid_t; | ||
31 | typedef int __kernel_timer_t; | ||
32 | |||
33 | typedef unsigned short __kernel_old_uid_t; | ||
34 | typedef unsigned short __kernel_old_gid_t; | ||
35 | typedef __kernel_uid_t __kernel_uid32_t; | ||
36 | typedef __kernel_gid_t __kernel_gid32_t; | ||
37 | |||
38 | typedef unsigned int __kernel_old_dev_t; | ||
39 | |||
40 | /* Note this piece of asymmetry from the v9 ABI. */ | ||
41 | typedef int __kernel_suseconds_t; | ||
42 | |||
43 | #else | ||
44 | /* sparc 32 bit */ | ||
45 | |||
46 | typedef unsigned int __kernel_size_t; | ||
47 | typedef int __kernel_ssize_t; | ||
48 | typedef long int __kernel_ptrdiff_t; | ||
49 | typedef long __kernel_time_t; | ||
50 | typedef long __kernel_suseconds_t; | ||
51 | typedef long __kernel_clock_t; | ||
52 | typedef int __kernel_pid_t; | ||
53 | typedef unsigned short __kernel_ipc_pid_t; | ||
54 | typedef unsigned short __kernel_uid_t; | ||
55 | typedef unsigned short __kernel_gid_t; | ||
56 | typedef unsigned long __kernel_ino_t; | ||
57 | typedef unsigned short __kernel_mode_t; | ||
58 | typedef unsigned short __kernel_umode_t; | ||
59 | typedef short __kernel_nlink_t; | ||
60 | typedef long __kernel_daddr_t; | ||
61 | typedef long __kernel_off_t; | ||
62 | typedef char * __kernel_caddr_t; | ||
63 | typedef unsigned short __kernel_uid16_t; | ||
64 | typedef unsigned short __kernel_gid16_t; | ||
65 | typedef unsigned int __kernel_uid32_t; | ||
66 | typedef unsigned int __kernel_gid32_t; | ||
67 | typedef unsigned short __kernel_old_uid_t; | ||
68 | typedef unsigned short __kernel_old_gid_t; | ||
69 | typedef unsigned short __kernel_old_dev_t; | ||
70 | typedef int __kernel_clockid_t; | ||
71 | typedef int __kernel_timer_t; | ||
72 | |||
73 | #endif /* defined(__sparc__) && defined(__arch64__) */ | ||
74 | |||
75 | #ifdef __GNUC__ | ||
76 | typedef long long __kernel_loff_t; | ||
77 | #endif | ||
78 | |||
79 | typedef struct { | ||
80 | int val[2]; | ||
81 | } __kernel_fsid_t; | ||
82 | |||
83 | #ifdef __KERNEL__ | ||
84 | |||
85 | #undef __FD_SET | ||
86 | static inline void __FD_SET(unsigned long fd, __kernel_fd_set *fdsetp) | ||
87 | { | ||
88 | unsigned long _tmp = fd / __NFDBITS; | ||
89 | unsigned long _rem = fd % __NFDBITS; | ||
90 | fdsetp->fds_bits[_tmp] |= (1UL<<_rem); | ||
91 | } | ||
92 | |||
93 | #undef __FD_CLR | ||
94 | static inline void __FD_CLR(unsigned long fd, __kernel_fd_set *fdsetp) | ||
95 | { | ||
96 | unsigned long _tmp = fd / __NFDBITS; | ||
97 | unsigned long _rem = fd % __NFDBITS; | ||
98 | fdsetp->fds_bits[_tmp] &= ~(1UL<<_rem); | ||
99 | } | ||
100 | |||
101 | #undef __FD_ISSET | ||
102 | static inline int __FD_ISSET(unsigned long fd, __const__ __kernel_fd_set *p) | ||
103 | { | ||
104 | unsigned long _tmp = fd / __NFDBITS; | ||
105 | unsigned long _rem = fd % __NFDBITS; | ||
106 | return (p->fds_bits[_tmp] & (1UL<<_rem)) != 0; | ||
107 | } | ||
108 | |||
109 | /* | ||
110 | * This will unroll the loop for the normal constant cases (8 or 32 longs, | ||
111 | * for 256 and 1024-bit fd_sets respectively) | ||
112 | */ | ||
113 | #undef __FD_ZERO | ||
114 | static inline void __FD_ZERO(__kernel_fd_set *p) | ||
115 | { | ||
116 | unsigned long *tmp = p->fds_bits; | ||
117 | int i; | ||
118 | |||
119 | if (__builtin_constant_p(__FDSET_LONGS)) { | ||
120 | switch (__FDSET_LONGS) { | ||
121 | case 32: | ||
122 | tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; | ||
123 | tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; | ||
124 | tmp[ 8] = 0; tmp[ 9] = 0; tmp[10] = 0; tmp[11] = 0; | ||
125 | tmp[12] = 0; tmp[13] = 0; tmp[14] = 0; tmp[15] = 0; | ||
126 | tmp[16] = 0; tmp[17] = 0; tmp[18] = 0; tmp[19] = 0; | ||
127 | tmp[20] = 0; tmp[21] = 0; tmp[22] = 0; tmp[23] = 0; | ||
128 | tmp[24] = 0; tmp[25] = 0; tmp[26] = 0; tmp[27] = 0; | ||
129 | tmp[28] = 0; tmp[29] = 0; tmp[30] = 0; tmp[31] = 0; | ||
130 | return; | ||
131 | case 16: | ||
132 | tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; | ||
133 | tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; | ||
134 | tmp[ 8] = 0; tmp[ 9] = 0; tmp[10] = 0; tmp[11] = 0; | ||
135 | tmp[12] = 0; tmp[13] = 0; tmp[14] = 0; tmp[15] = 0; | ||
136 | return; | ||
137 | case 8: | ||
138 | tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; | ||
139 | tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; | ||
140 | return; | ||
141 | case 4: | ||
142 | tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; | ||
143 | return; | ||
144 | } | ||
145 | } | ||
146 | i = __FDSET_LONGS; | ||
147 | while (i) { | ||
148 | i--; | ||
149 | *tmp = 0; | ||
150 | tmp++; | ||
151 | } | ||
152 | } | ||
153 | |||
154 | #endif /* __KERNEL__ */ | ||
155 | #endif /* __SPARC_POSIX_TYPES_H */ | ||
diff --git a/arch/sparc/include/asm/psrcompat.h b/arch/sparc/include/asm/psrcompat.h new file mode 100644 index 00000000000..44b6327dbbf --- /dev/null +++ b/arch/sparc/include/asm/psrcompat.h | |||
@@ -0,0 +1,45 @@ | |||
1 | #ifndef _SPARC64_PSRCOMPAT_H | ||
2 | #define _SPARC64_PSRCOMPAT_H | ||
3 | |||
4 | #include <asm/pstate.h> | ||
5 | |||
6 | /* Old 32-bit PSR fields for the compatibility conversion code. */ | ||
7 | #define PSR_CWP 0x0000001f /* current window pointer */ | ||
8 | #define PSR_ET 0x00000020 /* enable traps field */ | ||
9 | #define PSR_PS 0x00000040 /* previous privilege level */ | ||
10 | #define PSR_S 0x00000080 /* current privilege level */ | ||
11 | #define PSR_PIL 0x00000f00 /* processor interrupt level */ | ||
12 | #define PSR_EF 0x00001000 /* enable floating point */ | ||
13 | #define PSR_EC 0x00002000 /* enable co-processor */ | ||
14 | #define PSR_SYSCALL 0x00004000 /* inside of a syscall */ | ||
15 | #define PSR_LE 0x00008000 /* SuperSparcII little-endian */ | ||
16 | #define PSR_ICC 0x00f00000 /* integer condition codes */ | ||
17 | #define PSR_C 0x00100000 /* carry bit */ | ||
18 | #define PSR_V 0x00200000 /* overflow bit */ | ||
19 | #define PSR_Z 0x00400000 /* zero bit */ | ||
20 | #define PSR_N 0x00800000 /* negative bit */ | ||
21 | #define PSR_VERS 0x0f000000 /* cpu-version field */ | ||
22 | #define PSR_IMPL 0xf0000000 /* cpu-implementation field */ | ||
23 | |||
24 | #define PSR_V8PLUS 0xff000000 /* fake impl/ver, meaning a 64bit CPU is present */ | ||
25 | #define PSR_XCC 0x000f0000 /* if PSR_V8PLUS, this is %xcc */ | ||
26 | |||
27 | static inline unsigned int tstate_to_psr(unsigned long tstate) | ||
28 | { | ||
29 | return ((tstate & TSTATE_CWP) | | ||
30 | PSR_S | | ||
31 | ((tstate & TSTATE_ICC) >> 12) | | ||
32 | ((tstate & TSTATE_XCC) >> 20) | | ||
33 | ((tstate & TSTATE_SYSCALL) ? PSR_SYSCALL : 0) | | ||
34 | PSR_V8PLUS); | ||
35 | } | ||
36 | |||
37 | static inline unsigned long psr_to_tstate_icc(unsigned int psr) | ||
38 | { | ||
39 | unsigned long tstate = ((unsigned long)(psr & PSR_ICC)) << 12; | ||
40 | if ((psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS) | ||
41 | tstate |= ((unsigned long)(psr & PSR_XCC)) << 20; | ||
42 | return tstate; | ||
43 | } | ||
44 | |||
45 | #endif /* !(_SPARC64_PSRCOMPAT_H) */ | ||
diff --git a/arch/sparc/include/asm/pstate.h b/arch/sparc/include/asm/pstate.h new file mode 100644 index 00000000000..a26a53777bb --- /dev/null +++ b/arch/sparc/include/asm/pstate.h | |||
@@ -0,0 +1,91 @@ | |||
1 | #ifndef _SPARC64_PSTATE_H | ||
2 | #define _SPARC64_PSTATE_H | ||
3 | |||
4 | #include <linux/const.h> | ||
5 | |||
6 | /* The V9 PSTATE Register (with SpitFire extensions). | ||
7 | * | ||
8 | * ----------------------------------------------------------------------- | ||
9 | * | Resv | IG | MG | CLE | TLE | MM | RED | PEF | AM | PRIV | IE | AG | | ||
10 | * ----------------------------------------------------------------------- | ||
11 | * 63 12 11 10 9 8 7 6 5 4 3 2 1 0 | ||
12 | */ | ||
13 | #define PSTATE_IG _AC(0x0000000000000800,UL) /* Interrupt Globals. */ | ||
14 | #define PSTATE_MG _AC(0x0000000000000400,UL) /* MMU Globals. */ | ||
15 | #define PSTATE_CLE _AC(0x0000000000000200,UL) /* Current Little Endian.*/ | ||
16 | #define PSTATE_TLE _AC(0x0000000000000100,UL) /* Trap Little Endian. */ | ||
17 | #define PSTATE_MM _AC(0x00000000000000c0,UL) /* Memory Model. */ | ||
18 | #define PSTATE_TSO _AC(0x0000000000000000,UL) /* MM: TotalStoreOrder */ | ||
19 | #define PSTATE_PSO _AC(0x0000000000000040,UL) /* MM: PartialStoreOrder */ | ||
20 | #define PSTATE_RMO _AC(0x0000000000000080,UL) /* MM: RelaxedMemoryOrder*/ | ||
21 | #define PSTATE_RED _AC(0x0000000000000020,UL) /* Reset Error Debug. */ | ||
22 | #define PSTATE_PEF _AC(0x0000000000000010,UL) /* Floating Point Enable.*/ | ||
23 | #define PSTATE_AM _AC(0x0000000000000008,UL) /* Address Mask. */ | ||
24 | #define PSTATE_PRIV _AC(0x0000000000000004,UL) /* Privilege. */ | ||
25 | #define PSTATE_IE _AC(0x0000000000000002,UL) /* Interrupt Enable. */ | ||
26 | #define PSTATE_AG _AC(0x0000000000000001,UL) /* Alternate Globals. */ | ||
27 | |||
28 | /* The V9 TSTATE Register (with SpitFire and Linux extensions). | ||
29 | * | ||
30 | * --------------------------------------------------------------------- | ||
31 | * | Resv | GL | CCR | ASI | %pil | PSTATE | Resv | CWP | | ||
32 | * --------------------------------------------------------------------- | ||
33 | * 63 43 42 40 39 32 31 24 23 20 19 8 7 5 4 0 | ||
34 | */ | ||
35 | #define TSTATE_GL _AC(0x0000070000000000,UL) /* Global reg level */ | ||
36 | #define TSTATE_CCR _AC(0x000000ff00000000,UL) /* Condition Codes. */ | ||
37 | #define TSTATE_XCC _AC(0x000000f000000000,UL) /* Condition Codes. */ | ||
38 | #define TSTATE_XNEG _AC(0x0000008000000000,UL) /* %xcc Negative. */ | ||
39 | #define TSTATE_XZERO _AC(0x0000004000000000,UL) /* %xcc Zero. */ | ||
40 | #define TSTATE_XOVFL _AC(0x0000002000000000,UL) /* %xcc Overflow. */ | ||
41 | #define TSTATE_XCARRY _AC(0x0000001000000000,UL) /* %xcc Carry. */ | ||
42 | #define TSTATE_ICC _AC(0x0000000f00000000,UL) /* Condition Codes. */ | ||
43 | #define TSTATE_INEG _AC(0x0000000800000000,UL) /* %icc Negative. */ | ||
44 | #define TSTATE_IZERO _AC(0x0000000400000000,UL) /* %icc Zero. */ | ||
45 | #define TSTATE_IOVFL _AC(0x0000000200000000,UL) /* %icc Overflow. */ | ||
46 | #define TSTATE_ICARRY _AC(0x0000000100000000,UL) /* %icc Carry. */ | ||
47 | #define TSTATE_ASI _AC(0x00000000ff000000,UL) /* AddrSpace ID. */ | ||
48 | #define TSTATE_PIL _AC(0x0000000000f00000,UL) /* %pil (Linux traps)*/ | ||
49 | #define TSTATE_PSTATE _AC(0x00000000000fff00,UL) /* PSTATE. */ | ||
50 | #define TSTATE_IG _AC(0x0000000000080000,UL) /* Interrupt Globals.*/ | ||
51 | #define TSTATE_MG _AC(0x0000000000040000,UL) /* MMU Globals. */ | ||
52 | #define TSTATE_CLE _AC(0x0000000000020000,UL) /* CurrLittleEndian. */ | ||
53 | #define TSTATE_TLE _AC(0x0000000000010000,UL) /* TrapLittleEndian. */ | ||
54 | #define TSTATE_MM _AC(0x000000000000c000,UL) /* Memory Model. */ | ||
55 | #define TSTATE_TSO _AC(0x0000000000000000,UL) /* MM: TSO */ | ||
56 | #define TSTATE_PSO _AC(0x0000000000004000,UL) /* MM: PSO */ | ||
57 | #define TSTATE_RMO _AC(0x0000000000008000,UL) /* MM: RMO */ | ||
58 | #define TSTATE_RED _AC(0x0000000000002000,UL) /* Reset Error Debug.*/ | ||
59 | #define TSTATE_PEF _AC(0x0000000000001000,UL) /* FPU Enable. */ | ||
60 | #define TSTATE_AM _AC(0x0000000000000800,UL) /* Address Mask. */ | ||
61 | #define TSTATE_PRIV _AC(0x0000000000000400,UL) /* Privilege. */ | ||
62 | #define TSTATE_IE _AC(0x0000000000000200,UL) /* Interrupt Enable. */ | ||
63 | #define TSTATE_AG _AC(0x0000000000000100,UL) /* Alternate Globals.*/ | ||
64 | #define TSTATE_SYSCALL _AC(0x0000000000000020,UL) /* in syscall trap */ | ||
65 | #define TSTATE_CWP _AC(0x000000000000001f,UL) /* Curr Win-Pointer. */ | ||
66 | |||
67 | /* Floating-Point Registers State Register. | ||
68 | * | ||
69 | * -------------------------------- | ||
70 | * | Resv | FEF | DU | DL | | ||
71 | * -------------------------------- | ||
72 | * 63 3 2 1 0 | ||
73 | */ | ||
74 | #define FPRS_FEF _AC(0x0000000000000004,UL) /* FPU Enable. */ | ||
75 | #define FPRS_DU _AC(0x0000000000000002,UL) /* Dirty Upper. */ | ||
76 | #define FPRS_DL _AC(0x0000000000000001,UL) /* Dirty Lower. */ | ||
77 | |||
78 | /* Version Register. | ||
79 | * | ||
80 | * ------------------------------------------------------ | ||
81 | * | MANUF | IMPL | MASK | Resv | MAXTL | Resv | MAXWIN | | ||
82 | * ------------------------------------------------------ | ||
83 | * 63 48 47 32 31 24 23 16 15 8 7 5 4 0 | ||
84 | */ | ||
85 | #define VERS_MANUF _AC(0xffff000000000000,UL) /* Manufacturer. */ | ||
86 | #define VERS_IMPL _AC(0x0000ffff00000000,UL) /* Implementation. */ | ||
87 | #define VERS_MASK _AC(0x00000000ff000000,UL) /* Mask Set Revision.*/ | ||
88 | #define VERS_MAXTL _AC(0x000000000000ff00,UL) /* Max Trap Level. */ | ||
89 | #define VERS_MAXWIN _AC(0x000000000000001f,UL) /* Max RegWindow Idx.*/ | ||
90 | |||
91 | #endif /* !(_SPARC64_PSTATE_H) */ | ||
diff --git a/arch/sparc/include/asm/resource.h b/arch/sparc/include/asm/resource.h new file mode 100644 index 00000000000..fe163cafb4c --- /dev/null +++ b/arch/sparc/include/asm/resource.h | |||
@@ -0,0 +1,30 @@ | |||
1 | /* | ||
2 | * resource.h: Resource definitions. | ||
3 | * | ||
4 | * Copyright (C) 1995,1996 David S. Miller (davem@caip.rutgers.edu) | ||
5 | */ | ||
6 | |||
7 | #ifndef _SPARC_RESOURCE_H | ||
8 | #define _SPARC_RESOURCE_H | ||
9 | |||
10 | /* | ||
11 | * These two resource limit IDs have a Sparc/Linux-specific ordering, | ||
12 | * the rest comes from the generic header: | ||
13 | */ | ||
14 | #define RLIMIT_NOFILE 6 /* max number of open files */ | ||
15 | #define RLIMIT_NPROC 7 /* max number of processes */ | ||
16 | |||
17 | #if defined(__sparc__) && defined(__arch64__) | ||
18 | /* Use generic version */ | ||
19 | #else | ||
20 | /* | ||
21 | * SuS says limits have to be unsigned. | ||
22 | * We make this unsigned, but keep the | ||
23 | * old value for compatibility: | ||
24 | */ | ||
25 | #define RLIM_INFINITY 0x7fffffff | ||
26 | #endif | ||
27 | |||
28 | #include <asm-generic/resource.h> | ||
29 | |||
30 | #endif /* !(_SPARC_RESOURCE_H) */ | ||
diff --git a/arch/sparc/include/asm/sembuf.h b/arch/sparc/include/asm/sembuf.h new file mode 100644 index 00000000000..faee1be08d6 --- /dev/null +++ b/arch/sparc/include/asm/sembuf.h | |||
@@ -0,0 +1,31 @@ | |||
1 | #ifndef _SPARC_SEMBUF_H | ||
2 | #define _SPARC_SEMBUF_H | ||
3 | |||
4 | /* | ||
5 | * The semid64_ds structure for sparc architecture. | ||
6 | * Note extra padding because this structure is passed back and forth | ||
7 | * between kernel and user space. | ||
8 | * | ||
9 | * Pad space is left for: | ||
10 | * - 64-bit time_t to solve y2038 problem | ||
11 | * - 2 miscellaneous 32-bit values | ||
12 | */ | ||
13 | #if defined(__sparc__) && defined(__arch64__) | ||
14 | # define PADDING(x) | ||
15 | #else | ||
16 | # define PADDING(x) unsigned int x; | ||
17 | #endif | ||
18 | |||
19 | struct semid64_ds { | ||
20 | struct ipc64_perm sem_perm; /* permissions .. see ipc.h */ | ||
21 | PADDING(__pad1) | ||
22 | __kernel_time_t sem_otime; /* last semop time */ | ||
23 | PADDING(__pad2) | ||
24 | __kernel_time_t sem_ctime; /* last change time */ | ||
25 | unsigned long sem_nsems; /* no. of semaphores in array */ | ||
26 | unsigned long __unused1; | ||
27 | unsigned long __unused2; | ||
28 | }; | ||
29 | #undef PADDING | ||
30 | |||
31 | #endif /* _SPARC64_SEMBUF_H */ | ||
diff --git a/arch/sparc/include/asm/shmbuf.h b/arch/sparc/include/asm/shmbuf.h new file mode 100644 index 00000000000..83a16055363 --- /dev/null +++ b/arch/sparc/include/asm/shmbuf.h | |||
@@ -0,0 +1,50 @@ | |||
1 | #ifndef _SPARC_SHMBUF_H | ||
2 | #define _SPARC_SHMBUF_H | ||
3 | |||
4 | /* | ||
5 | * The shmid64_ds structure for sparc architecture. | ||
6 | * Note extra padding because this structure is passed back and forth | ||
7 | * between kernel and user space. | ||
8 | * | ||
9 | * Pad space is left for: | ||
10 | * - 64-bit time_t to solve y2038 problem | ||
11 | * - 2 miscellaneous 32-bit values | ||
12 | */ | ||
13 | |||
14 | #if defined(__sparc__) && defined(__arch64__) | ||
15 | # define PADDING(x) | ||
16 | #else | ||
17 | # define PADDING(x) unsigned int x; | ||
18 | #endif | ||
19 | |||
20 | struct shmid64_ds { | ||
21 | struct ipc64_perm shm_perm; /* operation perms */ | ||
22 | PADDING(__pad1) | ||
23 | __kernel_time_t shm_atime; /* last attach time */ | ||
24 | PADDING(__pad2) | ||
25 | __kernel_time_t shm_dtime; /* last detach time */ | ||
26 | PADDING(__pad3) | ||
27 | __kernel_time_t shm_ctime; /* last change time */ | ||
28 | size_t shm_segsz; /* size of segment (bytes) */ | ||
29 | __kernel_pid_t shm_cpid; /* pid of creator */ | ||
30 | __kernel_pid_t shm_lpid; /* pid of last operator */ | ||
31 | unsigned long shm_nattch; /* no. of current attaches */ | ||
32 | unsigned long __unused1; | ||
33 | unsigned long __unused2; | ||
34 | }; | ||
35 | |||
36 | struct shminfo64 { | ||
37 | unsigned long shmmax; | ||
38 | unsigned long shmmin; | ||
39 | unsigned long shmmni; | ||
40 | unsigned long shmseg; | ||
41 | unsigned long shmall; | ||
42 | unsigned long __unused1; | ||
43 | unsigned long __unused2; | ||
44 | unsigned long __unused3; | ||
45 | unsigned long __unused4; | ||
46 | }; | ||
47 | |||
48 | #undef PADDING | ||
49 | |||
50 | #endif /* _SPARC_SHMBUF_H */ | ||
diff --git a/arch/sparc/include/asm/smpprim.h b/arch/sparc/include/asm/smpprim.h new file mode 100644 index 00000000000..eb849d862c6 --- /dev/null +++ b/arch/sparc/include/asm/smpprim.h | |||
@@ -0,0 +1,54 @@ | |||
1 | /* | ||
2 | * smpprim.h: SMP locking primitives on the Sparc | ||
3 | * | ||
4 | * God knows we won't be actually using this code for some time | ||
5 | * but I thought I'd write it since I knew how. | ||
6 | * | ||
7 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | ||
8 | */ | ||
9 | |||
10 | #ifndef __SPARC_SMPPRIM_H | ||
11 | #define __SPARC_SMPPRIM_H | ||
12 | |||
13 | /* Test and set the unsigned byte at ADDR to 1. Returns the previous | ||
14 | * value. On the Sparc we use the ldstub instruction since it is | ||
15 | * atomic. | ||
16 | */ | ||
17 | |||
18 | static inline __volatile__ char test_and_set(void *addr) | ||
19 | { | ||
20 | char state = 0; | ||
21 | |||
22 | __asm__ __volatile__("ldstub [%0], %1 ! test_and_set\n\t" | ||
23 | "=r" (addr), "=r" (state) : | ||
24 | "0" (addr), "1" (state) : "memory"); | ||
25 | |||
26 | return state; | ||
27 | } | ||
28 | |||
29 | /* Initialize a spin-lock. */ | ||
30 | static inline __volatile__ smp_initlock(void *spinlock) | ||
31 | { | ||
32 | /* Unset the lock. */ | ||
33 | *((unsigned char *) spinlock) = 0; | ||
34 | |||
35 | return; | ||
36 | } | ||
37 | |||
38 | /* This routine spins until it acquires the lock at ADDR. */ | ||
39 | static inline __volatile__ smp_lock(void *addr) | ||
40 | { | ||
41 | while(test_and_set(addr) == 0xff) | ||
42 | ; | ||
43 | |||
44 | /* We now have the lock */ | ||
45 | return; | ||
46 | } | ||
47 | |||
48 | /* This routine releases the lock at ADDR. */ | ||
49 | static inline __volatile__ smp_unlock(void *addr) | ||
50 | { | ||
51 | *((unsigned char *) addr) = 0; | ||
52 | } | ||
53 | |||
54 | #endif /* !(__SPARC_SMPPRIM_H) */ | ||
diff --git a/arch/sparc/include/asm/socket.h b/arch/sparc/include/asm/socket.h new file mode 100644 index 00000000000..9d3fefcff2f --- /dev/null +++ b/arch/sparc/include/asm/socket.h | |||
@@ -0,0 +1,66 @@ | |||
1 | #ifndef _ASM_SOCKET_H | ||
2 | #define _ASM_SOCKET_H | ||
3 | |||
4 | #include <asm/sockios.h> | ||
5 | |||
6 | /* For setsockopt(2) */ | ||
7 | #define SOL_SOCKET 0xffff | ||
8 | |||
9 | #define SO_DEBUG 0x0001 | ||
10 | #define SO_PASSCRED 0x0002 | ||
11 | #define SO_REUSEADDR 0x0004 | ||
12 | #define SO_KEEPALIVE 0x0008 | ||
13 | #define SO_DONTROUTE 0x0010 | ||
14 | #define SO_BROADCAST 0x0020 | ||
15 | #define SO_PEERCRED 0x0040 | ||
16 | #define SO_LINGER 0x0080 | ||
17 | #define SO_OOBINLINE 0x0100 | ||
18 | /* To add :#define SO_REUSEPORT 0x0200 */ | ||
19 | #define SO_BSDCOMPAT 0x0400 | ||
20 | #define SO_RCVLOWAT 0x0800 | ||
21 | #define SO_SNDLOWAT 0x1000 | ||
22 | #define SO_RCVTIMEO 0x2000 | ||
23 | #define SO_SNDTIMEO 0x4000 | ||
24 | #define SO_ACCEPTCONN 0x8000 | ||
25 | |||
26 | #define SO_SNDBUF 0x1001 | ||
27 | #define SO_RCVBUF 0x1002 | ||
28 | #define SO_SNDBUFFORCE 0x100a | ||
29 | #define SO_RCVBUFFORCE 0x100b | ||
30 | #define SO_ERROR 0x1007 | ||
31 | #define SO_TYPE 0x1008 | ||
32 | #define SO_PROTOCOL 0x1028 | ||
33 | #define SO_DOMAIN 0x1029 | ||
34 | |||
35 | |||
36 | /* Linux specific, keep the same. */ | ||
37 | #define SO_NO_CHECK 0x000b | ||
38 | #define SO_PRIORITY 0x000c | ||
39 | |||
40 | #define SO_BINDTODEVICE 0x000d | ||
41 | |||
42 | #define SO_ATTACH_FILTER 0x001a | ||
43 | #define SO_DETACH_FILTER 0x001b | ||
44 | |||
45 | #define SO_PEERNAME 0x001c | ||
46 | #define SO_TIMESTAMP 0x001d | ||
47 | #define SCM_TIMESTAMP SO_TIMESTAMP | ||
48 | |||
49 | #define SO_PEERSEC 0x001e | ||
50 | #define SO_PASSSEC 0x001f | ||
51 | #define SO_TIMESTAMPNS 0x0021 | ||
52 | #define SCM_TIMESTAMPNS SO_TIMESTAMPNS | ||
53 | |||
54 | #define SO_MARK 0x0022 | ||
55 | |||
56 | #define SO_TIMESTAMPING 0x0023 | ||
57 | #define SCM_TIMESTAMPING SO_TIMESTAMPING | ||
58 | |||
59 | #define SO_RXQ_OVFL 0x0024 | ||
60 | |||
61 | /* Security levels - as per NRL IPv6 - don't actually do anything */ | ||
62 | #define SO_SECURITY_AUTHENTICATION 0x5001 | ||
63 | #define SO_SECURITY_ENCRYPTION_TRANSPORT 0x5002 | ||
64 | #define SO_SECURITY_ENCRYPTION_NETWORK 0x5004 | ||
65 | |||
66 | #endif /* _ASM_SOCKET_H */ | ||
diff --git a/arch/sparc/include/asm/sockios.h b/arch/sparc/include/asm/sockios.h new file mode 100644 index 00000000000..990ea746486 --- /dev/null +++ b/arch/sparc/include/asm/sockios.h | |||
@@ -0,0 +1,14 @@ | |||
1 | #ifndef _ASM_SPARC_SOCKIOS_H | ||
2 | #define _ASM_SPARC_SOCKIOS_H | ||
3 | |||
4 | /* Socket-level I/O control calls. */ | ||
5 | #define FIOSETOWN 0x8901 | ||
6 | #define SIOCSPGRP 0x8902 | ||
7 | #define FIOGETOWN 0x8903 | ||
8 | #define SIOCGPGRP 0x8904 | ||
9 | #define SIOCATMARK 0x8905 | ||
10 | #define SIOCGSTAMP 0x8906 /* Get stamp (timeval) */ | ||
11 | #define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ | ||
12 | |||
13 | #endif /* !(_ASM_SPARC_SOCKIOS_H) */ | ||
14 | |||
diff --git a/arch/sparc/include/asm/stat.h b/arch/sparc/include/asm/stat.h new file mode 100644 index 00000000000..a232e9e1f4e --- /dev/null +++ b/arch/sparc/include/asm/stat.h | |||
@@ -0,0 +1,107 @@ | |||
1 | #ifndef __SPARC_STAT_H | ||
2 | #define __SPARC_STAT_H | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | |||
6 | #if defined(__sparc__) && defined(__arch64__) | ||
7 | /* 64 bit sparc */ | ||
8 | struct stat { | ||
9 | unsigned st_dev; | ||
10 | ino_t st_ino; | ||
11 | mode_t st_mode; | ||
12 | short st_nlink; | ||
13 | uid_t st_uid; | ||
14 | gid_t st_gid; | ||
15 | unsigned st_rdev; | ||
16 | off_t st_size; | ||
17 | time_t st_atime; | ||
18 | time_t st_mtime; | ||
19 | time_t st_ctime; | ||
20 | off_t st_blksize; | ||
21 | off_t st_blocks; | ||
22 | unsigned long __unused4[2]; | ||
23 | }; | ||
24 | |||
25 | struct stat64 { | ||
26 | unsigned long st_dev; | ||
27 | unsigned long st_ino; | ||
28 | unsigned long st_nlink; | ||
29 | |||
30 | unsigned int st_mode; | ||
31 | unsigned int st_uid; | ||
32 | unsigned int st_gid; | ||
33 | unsigned int __pad0; | ||
34 | |||
35 | unsigned long st_rdev; | ||
36 | long st_size; | ||
37 | long st_blksize; | ||
38 | long st_blocks; | ||
39 | |||
40 | unsigned long st_atime; | ||
41 | unsigned long st_atime_nsec; | ||
42 | unsigned long st_mtime; | ||
43 | unsigned long st_mtime_nsec; | ||
44 | unsigned long st_ctime; | ||
45 | unsigned long st_ctime_nsec; | ||
46 | long __unused[3]; | ||
47 | }; | ||
48 | |||
49 | #else | ||
50 | /* 32 bit sparc */ | ||
51 | struct stat { | ||
52 | unsigned short st_dev; | ||
53 | ino_t st_ino; | ||
54 | mode_t st_mode; | ||
55 | short st_nlink; | ||
56 | unsigned short st_uid; | ||
57 | unsigned short st_gid; | ||
58 | unsigned short st_rdev; | ||
59 | off_t st_size; | ||
60 | time_t st_atime; | ||
61 | unsigned long st_atime_nsec; | ||
62 | time_t st_mtime; | ||
63 | unsigned long st_mtime_nsec; | ||
64 | time_t st_ctime; | ||
65 | unsigned long st_ctime_nsec; | ||
66 | off_t st_blksize; | ||
67 | off_t st_blocks; | ||
68 | unsigned long __unused4[2]; | ||
69 | }; | ||
70 | |||
71 | #define STAT_HAVE_NSEC 1 | ||
72 | |||
73 | struct stat64 { | ||
74 | unsigned long long st_dev; | ||
75 | |||
76 | unsigned long long st_ino; | ||
77 | |||
78 | unsigned int st_mode; | ||
79 | unsigned int st_nlink; | ||
80 | |||
81 | unsigned int st_uid; | ||
82 | unsigned int st_gid; | ||
83 | |||
84 | unsigned long long st_rdev; | ||
85 | |||
86 | unsigned char __pad3[8]; | ||
87 | |||
88 | long long st_size; | ||
89 | unsigned int st_blksize; | ||
90 | |||
91 | unsigned char __pad4[8]; | ||
92 | unsigned int st_blocks; | ||
93 | |||
94 | unsigned int st_atime; | ||
95 | unsigned int st_atime_nsec; | ||
96 | |||
97 | unsigned int st_mtime; | ||
98 | unsigned int st_mtime_nsec; | ||
99 | |||
100 | unsigned int st_ctime; | ||
101 | unsigned int st_ctime_nsec; | ||
102 | |||
103 | unsigned int __unused4; | ||
104 | unsigned int __unused5; | ||
105 | }; | ||
106 | #endif /* defined(__sparc__) && defined(__arch64__) */ | ||
107 | #endif /* __SPARC_STAT_H */ | ||
diff --git a/arch/sparc/include/asm/statfs.h b/arch/sparc/include/asm/statfs.h new file mode 100644 index 00000000000..55e607ad461 --- /dev/null +++ b/arch/sparc/include/asm/statfs.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef ___ASM_SPARC_STATFS_H | ||
2 | #define ___ASM_SPARC_STATFS_H | ||
3 | |||
4 | #include <asm-generic/statfs.h> | ||
5 | |||
6 | #endif | ||
diff --git a/arch/sparc/include/asm/swab.h b/arch/sparc/include/asm/swab.h new file mode 100644 index 00000000000..a34ad079487 --- /dev/null +++ b/arch/sparc/include/asm/swab.h | |||
@@ -0,0 +1,45 @@ | |||
1 | #ifndef _SPARC_SWAB_H | ||
2 | #define _SPARC_SWAB_H | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | #include <asm/asi.h> | ||
6 | |||
7 | #if defined(__sparc__) && defined(__arch64__) | ||
8 | static inline __u16 __arch_swab16p(const __u16 *addr) | ||
9 | { | ||
10 | __u16 ret; | ||
11 | |||
12 | __asm__ __volatile__ ("lduha [%1] %2, %0" | ||
13 | : "=r" (ret) | ||
14 | : "r" (addr), "i" (ASI_PL)); | ||
15 | return ret; | ||
16 | } | ||
17 | #define __arch_swab16p __arch_swab16p | ||
18 | |||
19 | static inline __u32 __arch_swab32p(const __u32 *addr) | ||
20 | { | ||
21 | __u32 ret; | ||
22 | |||
23 | __asm__ __volatile__ ("lduwa [%1] %2, %0" | ||
24 | : "=r" (ret) | ||
25 | : "r" (addr), "i" (ASI_PL)); | ||
26 | return ret; | ||
27 | } | ||
28 | #define __arch_swab32p __arch_swab32p | ||
29 | |||
30 | static inline __u64 __arch_swab64p(const __u64 *addr) | ||
31 | { | ||
32 | __u64 ret; | ||
33 | |||
34 | __asm__ __volatile__ ("ldxa [%1] %2, %0" | ||
35 | : "=r" (ret) | ||
36 | : "r" (addr), "i" (ASI_PL)); | ||
37 | return ret; | ||
38 | } | ||
39 | #define __arch_swab64p __arch_swab64p | ||
40 | |||
41 | #else | ||
42 | #define __SWAB_64_THRU_32__ | ||
43 | #endif /* defined(__sparc__) && defined(__arch64__) */ | ||
44 | |||
45 | #endif /* _SPARC_SWAB_H */ | ||
diff --git a/arch/sparc/include/asm/sysen.h b/arch/sparc/include/asm/sysen.h new file mode 100644 index 00000000000..6af34abde6e --- /dev/null +++ b/arch/sparc/include/asm/sysen.h | |||
@@ -0,0 +1,15 @@ | |||
1 | /* | ||
2 | * sysen.h: Bit fields within the "System Enable" register accessed via | ||
3 | * the ASI_CONTROL address space at address AC_SYSENABLE. | ||
4 | * | ||
5 | * Copyright (C) 1994 David S. Miller (davem@caip.rutgers.edu) | ||
6 | */ | ||
7 | |||
8 | #ifndef _SPARC_SYSEN_H | ||
9 | #define _SPARC_SYSEN_H | ||
10 | |||
11 | #define SENABLE_DVMA 0x20 /* enable dvma transfers */ | ||
12 | #define SENABLE_CACHE 0x10 /* enable VAC cache */ | ||
13 | #define SENABLE_RESET 0x04 /* reset whole machine, danger Will Robinson */ | ||
14 | |||
15 | #endif /* _SPARC_SYSEN_H */ | ||
diff --git a/arch/sparc/include/asm/system.h b/arch/sparc/include/asm/system.h new file mode 100644 index 00000000000..7944a7cfc99 --- /dev/null +++ b/arch/sparc/include/asm/system.h | |||
@@ -0,0 +1,8 @@ | |||
1 | #ifndef ___ASM_SPARC_SYSTEM_H | ||
2 | #define ___ASM_SPARC_SYSTEM_H | ||
3 | #if defined(__sparc__) && defined(__arch64__) | ||
4 | #include <asm/system_64.h> | ||
5 | #else | ||
6 | #include <asm/system_32.h> | ||
7 | #endif | ||
8 | #endif | ||
diff --git a/arch/sparc/include/asm/system_32.h b/arch/sparc/include/asm/system_32.h new file mode 100644 index 00000000000..aba16092a81 --- /dev/null +++ b/arch/sparc/include/asm/system_32.h | |||
@@ -0,0 +1,284 @@ | |||
1 | #ifndef __SPARC_SYSTEM_H | ||
2 | #define __SPARC_SYSTEM_H | ||
3 | |||
4 | #include <linux/kernel.h> | ||
5 | #include <linux/threads.h> /* NR_CPUS */ | ||
6 | #include <linux/thread_info.h> | ||
7 | |||
8 | #include <asm/page.h> | ||
9 | #include <asm/psr.h> | ||
10 | #include <asm/ptrace.h> | ||
11 | #include <asm/btfixup.h> | ||
12 | #include <asm/smp.h> | ||
13 | |||
14 | #ifndef __ASSEMBLY__ | ||
15 | |||
16 | #include <linux/irqflags.h> | ||
17 | |||
18 | /* | ||
19 | * Sparc (general) CPU types | ||
20 | */ | ||
21 | enum sparc_cpu { | ||
22 | sun4 = 0x00, | ||
23 | sun4c = 0x01, | ||
24 | sun4m = 0x02, | ||
25 | sun4d = 0x03, | ||
26 | sun4e = 0x04, | ||
27 | sun4u = 0x05, /* V8 ploos ploos */ | ||
28 | sun_unknown = 0x06, | ||
29 | ap1000 = 0x07, /* almost a sun4m */ | ||
30 | sparc_leon = 0x08, /* Leon SoC */ | ||
31 | }; | ||
32 | |||
33 | /* Really, userland should not be looking at any of this... */ | ||
34 | #ifdef __KERNEL__ | ||
35 | |||
36 | extern enum sparc_cpu sparc_cpu_model; | ||
37 | |||
38 | #define ARCH_SUN4C (sparc_cpu_model==sun4c) | ||
39 | |||
40 | #define SUN4M_NCPUS 4 /* Architectural limit of sun4m. */ | ||
41 | |||
42 | extern char reboot_command[]; | ||
43 | |||
44 | extern struct thread_info *current_set[NR_CPUS]; | ||
45 | |||
46 | extern unsigned long empty_bad_page; | ||
47 | extern unsigned long empty_bad_page_table; | ||
48 | extern unsigned long empty_zero_page; | ||
49 | |||
50 | extern void sun_do_break(void); | ||
51 | extern int serial_console; | ||
52 | extern int stop_a_enabled; | ||
53 | extern int scons_pwroff; | ||
54 | |||
55 | static inline int con_is_present(void) | ||
56 | { | ||
57 | return serial_console ? 0 : 1; | ||
58 | } | ||
59 | |||
60 | /* When a context switch happens we must flush all user windows so that | ||
61 | * the windows of the current process are flushed onto its stack. This | ||
62 | * way the windows are all clean for the next process and the stack | ||
63 | * frames are up to date. | ||
64 | */ | ||
65 | extern void flush_user_windows(void); | ||
66 | extern void kill_user_windows(void); | ||
67 | extern void synchronize_user_stack(void); | ||
68 | extern void fpsave(unsigned long *fpregs, unsigned long *fsr, | ||
69 | void *fpqueue, unsigned long *fpqdepth); | ||
70 | |||
71 | #ifdef CONFIG_SMP | ||
72 | #define SWITCH_ENTER(prv) \ | ||
73 | do { \ | ||
74 | if (test_tsk_thread_flag(prv, TIF_USEDFPU)) { \ | ||
75 | put_psr(get_psr() | PSR_EF); \ | ||
76 | fpsave(&(prv)->thread.float_regs[0], &(prv)->thread.fsr, \ | ||
77 | &(prv)->thread.fpqueue[0], &(prv)->thread.fpqdepth); \ | ||
78 | clear_tsk_thread_flag(prv, TIF_USEDFPU); \ | ||
79 | (prv)->thread.kregs->psr &= ~PSR_EF; \ | ||
80 | } \ | ||
81 | } while(0) | ||
82 | |||
83 | #define SWITCH_DO_LAZY_FPU(next) /* */ | ||
84 | #else | ||
85 | #define SWITCH_ENTER(prv) /* */ | ||
86 | #define SWITCH_DO_LAZY_FPU(nxt) \ | ||
87 | do { \ | ||
88 | if (last_task_used_math != (nxt)) \ | ||
89 | (nxt)->thread.kregs->psr&=~PSR_EF; \ | ||
90 | } while(0) | ||
91 | #endif | ||
92 | |||
93 | extern void flushw_all(void); | ||
94 | |||
95 | /* | ||
96 | * Flush windows so that the VM switch which follows | ||
97 | * would not pull the stack from under us. | ||
98 | * | ||
99 | * SWITCH_ENTER and SWITH_DO_LAZY_FPU do not work yet (e.g. SMP does not work) | ||
100 | * XXX WTF is the above comment? Found in late teen 2.4.x. | ||
101 | */ | ||
102 | #define prepare_arch_switch(next) do { \ | ||
103 | __asm__ __volatile__( \ | ||
104 | ".globl\tflush_patch_switch\nflush_patch_switch:\n\t" \ | ||
105 | "save %sp, -0x40, %sp; save %sp, -0x40, %sp; save %sp, -0x40, %sp\n\t" \ | ||
106 | "save %sp, -0x40, %sp; save %sp, -0x40, %sp; save %sp, -0x40, %sp\n\t" \ | ||
107 | "save %sp, -0x40, %sp\n\t" \ | ||
108 | "restore; restore; restore; restore; restore; restore; restore"); \ | ||
109 | } while(0) | ||
110 | |||
111 | /* Much care has gone into this code, do not touch it. | ||
112 | * | ||
113 | * We need to loadup regs l0/l1 for the newly forked child | ||
114 | * case because the trap return path relies on those registers | ||
115 | * holding certain values, gcc is told that they are clobbered. | ||
116 | * Gcc needs registers for 3 values in and 1 value out, so we | ||
117 | * clobber every non-fixed-usage register besides l2/l3/o4/o5. -DaveM | ||
118 | * | ||
119 | * Hey Dave, that do not touch sign is too much of an incentive | ||
120 | * - Anton & Pete | ||
121 | */ | ||
122 | #define switch_to(prev, next, last) do { \ | ||
123 | SWITCH_ENTER(prev); \ | ||
124 | SWITCH_DO_LAZY_FPU(next); \ | ||
125 | cpumask_set_cpu(smp_processor_id(), mm_cpumask(next->active_mm)); \ | ||
126 | __asm__ __volatile__( \ | ||
127 | "sethi %%hi(here - 0x8), %%o7\n\t" \ | ||
128 | "mov %%g6, %%g3\n\t" \ | ||
129 | "or %%o7, %%lo(here - 0x8), %%o7\n\t" \ | ||
130 | "rd %%psr, %%g4\n\t" \ | ||
131 | "std %%sp, [%%g6 + %4]\n\t" \ | ||
132 | "rd %%wim, %%g5\n\t" \ | ||
133 | "wr %%g4, 0x20, %%psr\n\t" \ | ||
134 | "nop\n\t" \ | ||
135 | "std %%g4, [%%g6 + %3]\n\t" \ | ||
136 | "ldd [%2 + %3], %%g4\n\t" \ | ||
137 | "mov %2, %%g6\n\t" \ | ||
138 | ".globl patchme_store_new_current\n" \ | ||
139 | "patchme_store_new_current:\n\t" \ | ||
140 | "st %2, [%1]\n\t" \ | ||
141 | "wr %%g4, 0x20, %%psr\n\t" \ | ||
142 | "nop\n\t" \ | ||
143 | "nop\n\t" \ | ||
144 | "nop\n\t" /* LEON needs all 3 nops: load to %sp depends on CWP. */ \ | ||
145 | "ldd [%%g6 + %4], %%sp\n\t" \ | ||
146 | "wr %%g5, 0x0, %%wim\n\t" \ | ||
147 | "ldd [%%sp + 0x00], %%l0\n\t" \ | ||
148 | "ldd [%%sp + 0x38], %%i6\n\t" \ | ||
149 | "wr %%g4, 0x0, %%psr\n\t" \ | ||
150 | "nop\n\t" \ | ||
151 | "nop\n\t" \ | ||
152 | "jmpl %%o7 + 0x8, %%g0\n\t" \ | ||
153 | " ld [%%g3 + %5], %0\n\t" \ | ||
154 | "here:\n" \ | ||
155 | : "=&r" (last) \ | ||
156 | : "r" (&(current_set[hard_smp_processor_id()])), \ | ||
157 | "r" (task_thread_info(next)), \ | ||
158 | "i" (TI_KPSR), \ | ||
159 | "i" (TI_KSP), \ | ||
160 | "i" (TI_TASK) \ | ||
161 | : "g1", "g2", "g3", "g4", "g5", "g7", \ | ||
162 | "l0", "l1", "l3", "l4", "l5", "l6", "l7", \ | ||
163 | "i0", "i1", "i2", "i3", "i4", "i5", \ | ||
164 | "o0", "o1", "o2", "o3", "o7"); \ | ||
165 | } while(0) | ||
166 | |||
167 | /* XXX Change this if we ever use a PSO mode kernel. */ | ||
168 | #define mb() __asm__ __volatile__ ("" : : : "memory") | ||
169 | #define rmb() mb() | ||
170 | #define wmb() mb() | ||
171 | #define read_barrier_depends() do { } while(0) | ||
172 | #define set_mb(__var, __value) do { __var = __value; mb(); } while(0) | ||
173 | #define smp_mb() __asm__ __volatile__("":::"memory") | ||
174 | #define smp_rmb() __asm__ __volatile__("":::"memory") | ||
175 | #define smp_wmb() __asm__ __volatile__("":::"memory") | ||
176 | #define smp_read_barrier_depends() do { } while(0) | ||
177 | |||
178 | #define nop() __asm__ __volatile__ ("nop") | ||
179 | |||
180 | /* This has special calling conventions */ | ||
181 | #ifndef CONFIG_SMP | ||
182 | BTFIXUPDEF_CALL(void, ___xchg32, void) | ||
183 | #endif | ||
184 | |||
185 | static inline unsigned long xchg_u32(__volatile__ unsigned long *m, unsigned long val) | ||
186 | { | ||
187 | #ifdef CONFIG_SMP | ||
188 | __asm__ __volatile__("swap [%2], %0" | ||
189 | : "=&r" (val) | ||
190 | : "0" (val), "r" (m) | ||
191 | : "memory"); | ||
192 | return val; | ||
193 | #else | ||
194 | register unsigned long *ptr asm("g1"); | ||
195 | register unsigned long ret asm("g2"); | ||
196 | |||
197 | ptr = (unsigned long *) m; | ||
198 | ret = val; | ||
199 | |||
200 | /* Note: this is magic and the nop there is | ||
201 | really needed. */ | ||
202 | __asm__ __volatile__( | ||
203 | "mov %%o7, %%g4\n\t" | ||
204 | "call ___f____xchg32\n\t" | ||
205 | " nop\n\t" | ||
206 | : "=&r" (ret) | ||
207 | : "0" (ret), "r" (ptr) | ||
208 | : "g3", "g4", "g7", "memory", "cc"); | ||
209 | |||
210 | return ret; | ||
211 | #endif | ||
212 | } | ||
213 | |||
214 | #define xchg(ptr,x) ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr)))) | ||
215 | |||
216 | extern void __xchg_called_with_bad_pointer(void); | ||
217 | |||
218 | static inline unsigned long __xchg(unsigned long x, __volatile__ void * ptr, int size) | ||
219 | { | ||
220 | switch (size) { | ||
221 | case 4: | ||
222 | return xchg_u32(ptr, x); | ||
223 | } | ||
224 | __xchg_called_with_bad_pointer(); | ||
225 | return x; | ||
226 | } | ||
227 | |||
228 | /* Emulate cmpxchg() the same way we emulate atomics, | ||
229 | * by hashing the object address and indexing into an array | ||
230 | * of spinlocks to get a bit of performance... | ||
231 | * | ||
232 | * See arch/sparc/lib/atomic32.c for implementation. | ||
233 | * | ||
234 | * Cribbed from <asm-parisc/atomic.h> | ||
235 | */ | ||
236 | #define __HAVE_ARCH_CMPXCHG 1 | ||
237 | |||
238 | /* bug catcher for when unsupported size is used - won't link */ | ||
239 | extern void __cmpxchg_called_with_bad_pointer(void); | ||
240 | /* we only need to support cmpxchg of a u32 on sparc */ | ||
241 | extern unsigned long __cmpxchg_u32(volatile u32 *m, u32 old, u32 new_); | ||
242 | |||
243 | /* don't worry...optimizer will get rid of most of this */ | ||
244 | static inline unsigned long | ||
245 | __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new_, int size) | ||
246 | { | ||
247 | switch (size) { | ||
248 | case 4: | ||
249 | return __cmpxchg_u32((u32 *)ptr, (u32)old, (u32)new_); | ||
250 | default: | ||
251 | __cmpxchg_called_with_bad_pointer(); | ||
252 | break; | ||
253 | } | ||
254 | return old; | ||
255 | } | ||
256 | |||
257 | #define cmpxchg(ptr, o, n) \ | ||
258 | ({ \ | ||
259 | __typeof__(*(ptr)) _o_ = (o); \ | ||
260 | __typeof__(*(ptr)) _n_ = (n); \ | ||
261 | (__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_, \ | ||
262 | (unsigned long)_n_, sizeof(*(ptr))); \ | ||
263 | }) | ||
264 | |||
265 | #include <asm-generic/cmpxchg-local.h> | ||
266 | |||
267 | /* | ||
268 | * cmpxchg_local and cmpxchg64_local are atomic wrt current CPU. Always make | ||
269 | * them available. | ||
270 | */ | ||
271 | #define cmpxchg_local(ptr, o, n) \ | ||
272 | ((__typeof__(*(ptr)))__cmpxchg_local_generic((ptr), (unsigned long)(o),\ | ||
273 | (unsigned long)(n), sizeof(*(ptr)))) | ||
274 | #define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n)) | ||
275 | |||
276 | extern void die_if_kernel(char *str, struct pt_regs *regs) __attribute__ ((noreturn)); | ||
277 | |||
278 | #endif /* __KERNEL__ */ | ||
279 | |||
280 | #endif /* __ASSEMBLY__ */ | ||
281 | |||
282 | #define arch_align_stack(x) (x) | ||
283 | |||
284 | #endif /* !(__SPARC_SYSTEM_H) */ | ||
diff --git a/arch/sparc/include/asm/system_64.h b/arch/sparc/include/asm/system_64.h new file mode 100644 index 00000000000..10bcabce97b --- /dev/null +++ b/arch/sparc/include/asm/system_64.h | |||
@@ -0,0 +1,331 @@ | |||
1 | #ifndef __SPARC64_SYSTEM_H | ||
2 | #define __SPARC64_SYSTEM_H | ||
3 | |||
4 | #include <asm/ptrace.h> | ||
5 | #include <asm/processor.h> | ||
6 | #include <asm/visasm.h> | ||
7 | |||
8 | #ifndef __ASSEMBLY__ | ||
9 | |||
10 | #include <linux/irqflags.h> | ||
11 | #include <asm-generic/cmpxchg-local.h> | ||
12 | |||
13 | /* | ||
14 | * Sparc (general) CPU types | ||
15 | */ | ||
16 | enum sparc_cpu { | ||
17 | sun4 = 0x00, | ||
18 | sun4c = 0x01, | ||
19 | sun4m = 0x02, | ||
20 | sun4d = 0x03, | ||
21 | sun4e = 0x04, | ||
22 | sun4u = 0x05, /* V8 ploos ploos */ | ||
23 | sun_unknown = 0x06, | ||
24 | ap1000 = 0x07, /* almost a sun4m */ | ||
25 | }; | ||
26 | |||
27 | #define sparc_cpu_model sun4u | ||
28 | |||
29 | /* This cannot ever be a sun4c :) That's just history. */ | ||
30 | #define ARCH_SUN4C 0 | ||
31 | |||
32 | extern char reboot_command[]; | ||
33 | |||
34 | /* These are here in an effort to more fully work around Spitfire Errata | ||
35 | * #51. Essentially, if a memory barrier occurs soon after a mispredicted | ||
36 | * branch, the chip can stop executing instructions until a trap occurs. | ||
37 | * Therefore, if interrupts are disabled, the chip can hang forever. | ||
38 | * | ||
39 | * It used to be believed that the memory barrier had to be right in the | ||
40 | * delay slot, but a case has been traced recently wherein the memory barrier | ||
41 | * was one instruction after the branch delay slot and the chip still hung. | ||
42 | * The offending sequence was the following in sym_wakeup_done() of the | ||
43 | * sym53c8xx_2 driver: | ||
44 | * | ||
45 | * call sym_ccb_from_dsa, 0 | ||
46 | * movge %icc, 0, %l0 | ||
47 | * brz,pn %o0, .LL1303 | ||
48 | * mov %o0, %l2 | ||
49 | * membar #LoadLoad | ||
50 | * | ||
51 | * The branch has to be mispredicted for the bug to occur. Therefore, we put | ||
52 | * the memory barrier explicitly into a "branch always, predicted taken" | ||
53 | * delay slot to avoid the problem case. | ||
54 | */ | ||
55 | #define membar_safe(type) \ | ||
56 | do { __asm__ __volatile__("ba,pt %%xcc, 1f\n\t" \ | ||
57 | " membar " type "\n" \ | ||
58 | "1:\n" \ | ||
59 | : : : "memory"); \ | ||
60 | } while (0) | ||
61 | |||
62 | /* The kernel always executes in TSO memory model these days, | ||
63 | * and furthermore most sparc64 chips implement more stringent | ||
64 | * memory ordering than required by the specifications. | ||
65 | */ | ||
66 | #define mb() membar_safe("#StoreLoad") | ||
67 | #define rmb() __asm__ __volatile__("":::"memory") | ||
68 | #define wmb() __asm__ __volatile__("":::"memory") | ||
69 | |||
70 | #endif | ||
71 | |||
72 | #define nop() __asm__ __volatile__ ("nop") | ||
73 | |||
74 | #define read_barrier_depends() do { } while(0) | ||
75 | #define set_mb(__var, __value) \ | ||
76 | do { __var = __value; membar_safe("#StoreLoad"); } while(0) | ||
77 | |||
78 | #ifdef CONFIG_SMP | ||
79 | #define smp_mb() mb() | ||
80 | #define smp_rmb() rmb() | ||
81 | #define smp_wmb() wmb() | ||
82 | #else | ||
83 | #define smp_mb() __asm__ __volatile__("":::"memory") | ||
84 | #define smp_rmb() __asm__ __volatile__("":::"memory") | ||
85 | #define smp_wmb() __asm__ __volatile__("":::"memory") | ||
86 | #endif | ||
87 | |||
88 | #define smp_read_barrier_depends() do { } while(0) | ||
89 | |||
90 | #define flushi(addr) __asm__ __volatile__ ("flush %0" : : "r" (addr) : "memory") | ||
91 | |||
92 | #define flushw_all() __asm__ __volatile__("flushw") | ||
93 | |||
94 | /* Performance counter register access. */ | ||
95 | #define read_pcr(__p) __asm__ __volatile__("rd %%pcr, %0" : "=r" (__p)) | ||
96 | #define write_pcr(__p) __asm__ __volatile__("wr %0, 0x0, %%pcr" : : "r" (__p)) | ||
97 | #define read_pic(__p) __asm__ __volatile__("rd %%pic, %0" : "=r" (__p)) | ||
98 | |||
99 | /* Blackbird errata workaround. See commentary in | ||
100 | * arch/sparc64/kernel/smp.c:smp_percpu_timer_interrupt() | ||
101 | * for more information. | ||
102 | */ | ||
103 | #define write_pic(__p) \ | ||
104 | __asm__ __volatile__("ba,pt %%xcc, 99f\n\t" \ | ||
105 | " nop\n\t" \ | ||
106 | ".align 64\n" \ | ||
107 | "99:wr %0, 0x0, %%pic\n\t" \ | ||
108 | "rd %%pic, %%g0" : : "r" (__p)) | ||
109 | #define reset_pic() write_pic(0) | ||
110 | |||
111 | #ifndef __ASSEMBLY__ | ||
112 | |||
113 | extern void sun_do_break(void); | ||
114 | extern int stop_a_enabled; | ||
115 | extern int scons_pwroff; | ||
116 | |||
117 | extern void fault_in_user_windows(void); | ||
118 | extern void synchronize_user_stack(void); | ||
119 | |||
120 | extern void __flushw_user(void); | ||
121 | #define flushw_user() __flushw_user() | ||
122 | |||
123 | #define flush_user_windows flushw_user | ||
124 | #define flush_register_windows flushw_all | ||
125 | |||
126 | /* Don't hold the runqueue lock over context switch */ | ||
127 | #define __ARCH_WANT_UNLOCKED_CTXSW | ||
128 | #define prepare_arch_switch(next) \ | ||
129 | do { \ | ||
130 | flushw_all(); \ | ||
131 | } while (0) | ||
132 | |||
133 | /* See what happens when you design the chip correctly? | ||
134 | * | ||
135 | * We tell gcc we clobber all non-fixed-usage registers except | ||
136 | * for l0/l1. It will use one for 'next' and the other to hold | ||
137 | * the output value of 'last'. 'next' is not referenced again | ||
138 | * past the invocation of switch_to in the scheduler, so we need | ||
139 | * not preserve it's value. Hairy, but it lets us remove 2 loads | ||
140 | * and 2 stores in this critical code path. -DaveM | ||
141 | */ | ||
142 | #define switch_to(prev, next, last) \ | ||
143 | do { flush_tlb_pending(); \ | ||
144 | save_and_clear_fpu(); \ | ||
145 | /* If you are tempted to conditionalize the following */ \ | ||
146 | /* so that ASI is only written if it changes, think again. */ \ | ||
147 | __asm__ __volatile__("wr %%g0, %0, %%asi" \ | ||
148 | : : "r" (__thread_flag_byte_ptr(task_thread_info(next))[TI_FLAG_BYTE_CURRENT_DS]));\ | ||
149 | trap_block[current_thread_info()->cpu].thread = \ | ||
150 | task_thread_info(next); \ | ||
151 | __asm__ __volatile__( \ | ||
152 | "mov %%g4, %%g7\n\t" \ | ||
153 | "stx %%i6, [%%sp + 2047 + 0x70]\n\t" \ | ||
154 | "stx %%i7, [%%sp + 2047 + 0x78]\n\t" \ | ||
155 | "rdpr %%wstate, %%o5\n\t" \ | ||
156 | "stx %%o6, [%%g6 + %6]\n\t" \ | ||
157 | "stb %%o5, [%%g6 + %5]\n\t" \ | ||
158 | "rdpr %%cwp, %%o5\n\t" \ | ||
159 | "stb %%o5, [%%g6 + %8]\n\t" \ | ||
160 | "wrpr %%g0, 15, %%pil\n\t" \ | ||
161 | "mov %4, %%g6\n\t" \ | ||
162 | "ldub [%4 + %8], %%g1\n\t" \ | ||
163 | "wrpr %%g1, %%cwp\n\t" \ | ||
164 | "ldx [%%g6 + %6], %%o6\n\t" \ | ||
165 | "ldub [%%g6 + %5], %%o5\n\t" \ | ||
166 | "ldub [%%g6 + %7], %%o7\n\t" \ | ||
167 | "wrpr %%o5, 0x0, %%wstate\n\t" \ | ||
168 | "ldx [%%sp + 2047 + 0x70], %%i6\n\t" \ | ||
169 | "ldx [%%sp + 2047 + 0x78], %%i7\n\t" \ | ||
170 | "ldx [%%g6 + %9], %%g4\n\t" \ | ||
171 | "wrpr %%g0, 14, %%pil\n\t" \ | ||
172 | "brz,pt %%o7, switch_to_pc\n\t" \ | ||
173 | " mov %%g7, %0\n\t" \ | ||
174 | "sethi %%hi(ret_from_syscall), %%g1\n\t" \ | ||
175 | "jmpl %%g1 + %%lo(ret_from_syscall), %%g0\n\t" \ | ||
176 | " nop\n\t" \ | ||
177 | ".globl switch_to_pc\n\t" \ | ||
178 | "switch_to_pc:\n\t" \ | ||
179 | : "=&r" (last), "=r" (current), "=r" (current_thread_info_reg), \ | ||
180 | "=r" (__local_per_cpu_offset) \ | ||
181 | : "0" (task_thread_info(next)), \ | ||
182 | "i" (TI_WSTATE), "i" (TI_KSP), "i" (TI_NEW_CHILD), \ | ||
183 | "i" (TI_CWP), "i" (TI_TASK) \ | ||
184 | : "cc", \ | ||
185 | "g1", "g2", "g3", "g7", \ | ||
186 | "l1", "l2", "l3", "l4", "l5", "l6", "l7", \ | ||
187 | "i0", "i1", "i2", "i3", "i4", "i5", \ | ||
188 | "o0", "o1", "o2", "o3", "o4", "o5", "o7"); \ | ||
189 | } while(0) | ||
190 | |||
191 | static inline unsigned long xchg32(__volatile__ unsigned int *m, unsigned int val) | ||
192 | { | ||
193 | unsigned long tmp1, tmp2; | ||
194 | |||
195 | __asm__ __volatile__( | ||
196 | " mov %0, %1\n" | ||
197 | "1: lduw [%4], %2\n" | ||
198 | " cas [%4], %2, %0\n" | ||
199 | " cmp %2, %0\n" | ||
200 | " bne,a,pn %%icc, 1b\n" | ||
201 | " mov %1, %0\n" | ||
202 | : "=&r" (val), "=&r" (tmp1), "=&r" (tmp2) | ||
203 | : "0" (val), "r" (m) | ||
204 | : "cc", "memory"); | ||
205 | return val; | ||
206 | } | ||
207 | |||
208 | static inline unsigned long xchg64(__volatile__ unsigned long *m, unsigned long val) | ||
209 | { | ||
210 | unsigned long tmp1, tmp2; | ||
211 | |||
212 | __asm__ __volatile__( | ||
213 | " mov %0, %1\n" | ||
214 | "1: ldx [%4], %2\n" | ||
215 | " casx [%4], %2, %0\n" | ||
216 | " cmp %2, %0\n" | ||
217 | " bne,a,pn %%xcc, 1b\n" | ||
218 | " mov %1, %0\n" | ||
219 | : "=&r" (val), "=&r" (tmp1), "=&r" (tmp2) | ||
220 | : "0" (val), "r" (m) | ||
221 | : "cc", "memory"); | ||
222 | return val; | ||
223 | } | ||
224 | |||
225 | #define xchg(ptr,x) ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr)))) | ||
226 | |||
227 | extern void __xchg_called_with_bad_pointer(void); | ||
228 | |||
229 | static inline unsigned long __xchg(unsigned long x, __volatile__ void * ptr, | ||
230 | int size) | ||
231 | { | ||
232 | switch (size) { | ||
233 | case 4: | ||
234 | return xchg32(ptr, x); | ||
235 | case 8: | ||
236 | return xchg64(ptr, x); | ||
237 | } | ||
238 | __xchg_called_with_bad_pointer(); | ||
239 | return x; | ||
240 | } | ||
241 | |||
242 | extern void die_if_kernel(char *str, struct pt_regs *regs) __attribute__ ((noreturn)); | ||
243 | |||
244 | /* | ||
245 | * Atomic compare and exchange. Compare OLD with MEM, if identical, | ||
246 | * store NEW in MEM. Return the initial value in MEM. Success is | ||
247 | * indicated by comparing RETURN with OLD. | ||
248 | */ | ||
249 | |||
250 | #define __HAVE_ARCH_CMPXCHG 1 | ||
251 | |||
252 | static inline unsigned long | ||
253 | __cmpxchg_u32(volatile int *m, int old, int new) | ||
254 | { | ||
255 | __asm__ __volatile__("cas [%2], %3, %0" | ||
256 | : "=&r" (new) | ||
257 | : "0" (new), "r" (m), "r" (old) | ||
258 | : "memory"); | ||
259 | |||
260 | return new; | ||
261 | } | ||
262 | |||
263 | static inline unsigned long | ||
264 | __cmpxchg_u64(volatile long *m, unsigned long old, unsigned long new) | ||
265 | { | ||
266 | __asm__ __volatile__("casx [%2], %3, %0" | ||
267 | : "=&r" (new) | ||
268 | : "0" (new), "r" (m), "r" (old) | ||
269 | : "memory"); | ||
270 | |||
271 | return new; | ||
272 | } | ||
273 | |||
274 | /* This function doesn't exist, so you'll get a linker error | ||
275 | if something tries to do an invalid cmpxchg(). */ | ||
276 | extern void __cmpxchg_called_with_bad_pointer(void); | ||
277 | |||
278 | static inline unsigned long | ||
279 | __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size) | ||
280 | { | ||
281 | switch (size) { | ||
282 | case 4: | ||
283 | return __cmpxchg_u32(ptr, old, new); | ||
284 | case 8: | ||
285 | return __cmpxchg_u64(ptr, old, new); | ||
286 | } | ||
287 | __cmpxchg_called_with_bad_pointer(); | ||
288 | return old; | ||
289 | } | ||
290 | |||
291 | #define cmpxchg(ptr,o,n) \ | ||
292 | ({ \ | ||
293 | __typeof__(*(ptr)) _o_ = (o); \ | ||
294 | __typeof__(*(ptr)) _n_ = (n); \ | ||
295 | (__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_, \ | ||
296 | (unsigned long)_n_, sizeof(*(ptr))); \ | ||
297 | }) | ||
298 | |||
299 | /* | ||
300 | * cmpxchg_local and cmpxchg64_local are atomic wrt current CPU. Always make | ||
301 | * them available. | ||
302 | */ | ||
303 | |||
304 | static inline unsigned long __cmpxchg_local(volatile void *ptr, | ||
305 | unsigned long old, | ||
306 | unsigned long new, int size) | ||
307 | { | ||
308 | switch (size) { | ||
309 | case 4: | ||
310 | case 8: return __cmpxchg(ptr, old, new, size); | ||
311 | default: | ||
312 | return __cmpxchg_local_generic(ptr, old, new, size); | ||
313 | } | ||
314 | |||
315 | return old; | ||
316 | } | ||
317 | |||
318 | #define cmpxchg_local(ptr, o, n) \ | ||
319 | ((__typeof__(*(ptr)))__cmpxchg_local((ptr), (unsigned long)(o), \ | ||
320 | (unsigned long)(n), sizeof(*(ptr)))) | ||
321 | #define cmpxchg64_local(ptr, o, n) \ | ||
322 | ({ \ | ||
323 | BUILD_BUG_ON(sizeof(*(ptr)) != 8); \ | ||
324 | cmpxchg_local((ptr), (o), (n)); \ | ||
325 | }) | ||
326 | |||
327 | #endif /* !(__ASSEMBLY__) */ | ||
328 | |||
329 | #define arch_align_stack(x) (x) | ||
330 | |||
331 | #endif /* !(__SPARC64_SYSTEM_H) */ | ||
diff --git a/arch/sparc/include/asm/types.h b/arch/sparc/include/asm/types.h new file mode 100644 index 00000000000..91e5a034f98 --- /dev/null +++ b/arch/sparc/include/asm/types.h | |||
@@ -0,0 +1,23 @@ | |||
1 | #ifndef _SPARC_TYPES_H | ||
2 | #define _SPARC_TYPES_H | ||
3 | /* | ||
4 | * This file is never included by application software unless | ||
5 | * explicitly requested (e.g., via linux/types.h) in which case the | ||
6 | * application is Linux specific so (user-) name space pollution is | ||
7 | * not a major issue. However, for interoperability, libraries still | ||
8 | * need to be careful to avoid a name clashes. | ||
9 | */ | ||
10 | |||
11 | #if defined(__sparc__) | ||
12 | |||
13 | #include <asm-generic/int-ll64.h> | ||
14 | |||
15 | #ifndef __ASSEMBLY__ | ||
16 | |||
17 | typedef unsigned short umode_t; | ||
18 | |||
19 | #endif /* __ASSEMBLY__ */ | ||
20 | |||
21 | #endif /* defined(__sparc__) */ | ||
22 | |||
23 | #endif /* defined(_SPARC_TYPES_H) */ | ||
diff --git a/arch/sparc/include/asm/uctx.h b/arch/sparc/include/asm/uctx.h new file mode 100644 index 00000000000..dc937c75ffd --- /dev/null +++ b/arch/sparc/include/asm/uctx.h | |||
@@ -0,0 +1,71 @@ | |||
1 | /* | ||
2 | * uctx.h: Sparc64 {set,get}context() register state layouts. | ||
3 | * | ||
4 | * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) | ||
5 | */ | ||
6 | |||
7 | #ifndef __SPARC64_UCTX_H | ||
8 | #define __SPARC64_UCTX_H | ||
9 | |||
10 | #define MC_TSTATE 0 | ||
11 | #define MC_PC 1 | ||
12 | #define MC_NPC 2 | ||
13 | #define MC_Y 3 | ||
14 | #define MC_G1 4 | ||
15 | #define MC_G2 5 | ||
16 | #define MC_G3 6 | ||
17 | #define MC_G4 7 | ||
18 | #define MC_G5 8 | ||
19 | #define MC_G6 9 | ||
20 | #define MC_G7 10 | ||
21 | #define MC_O0 11 | ||
22 | #define MC_O1 12 | ||
23 | #define MC_O2 13 | ||
24 | #define MC_O3 14 | ||
25 | #define MC_O4 15 | ||
26 | #define MC_O5 16 | ||
27 | #define MC_O6 17 | ||
28 | #define MC_O7 18 | ||
29 | #define MC_NGREG 19 | ||
30 | |||
31 | typedef unsigned long mc_greg_t; | ||
32 | typedef mc_greg_t mc_gregset_t[MC_NGREG]; | ||
33 | |||
34 | #define MC_MAXFPQ 16 | ||
35 | struct mc_fq { | ||
36 | unsigned long *mcfq_addr; | ||
37 | unsigned int mcfq_insn; | ||
38 | }; | ||
39 | |||
40 | struct mc_fpu { | ||
41 | union { | ||
42 | unsigned int sregs[32]; | ||
43 | unsigned long dregs[32]; | ||
44 | long double qregs[16]; | ||
45 | } mcfpu_fregs; | ||
46 | unsigned long mcfpu_fsr; | ||
47 | unsigned long mcfpu_fprs; | ||
48 | unsigned long mcfpu_gsr; | ||
49 | struct mc_fq *mcfpu_fq; | ||
50 | unsigned char mcfpu_qcnt; | ||
51 | unsigned char mcfpu_qentsz; | ||
52 | unsigned char mcfpu_enab; | ||
53 | }; | ||
54 | typedef struct mc_fpu mc_fpu_t; | ||
55 | |||
56 | typedef struct { | ||
57 | mc_gregset_t mc_gregs; | ||
58 | mc_greg_t mc_fp; | ||
59 | mc_greg_t mc_i7; | ||
60 | mc_fpu_t mc_fpregs; | ||
61 | } mcontext_t; | ||
62 | |||
63 | struct ucontext { | ||
64 | struct ucontext *uc_link; | ||
65 | unsigned long uc_flags; | ||
66 | sigset_t uc_sigmask; | ||
67 | mcontext_t uc_mcontext; | ||
68 | }; | ||
69 | typedef struct ucontext ucontext_t; | ||
70 | |||
71 | #endif /* __SPARC64_UCTX_H */ | ||
diff --git a/arch/sparc/include/asm/utrap.h b/arch/sparc/include/asm/utrap.h new file mode 100644 index 00000000000..b10e527c22d --- /dev/null +++ b/arch/sparc/include/asm/utrap.h | |||
@@ -0,0 +1,51 @@ | |||
1 | /* | ||
2 | * include/asm/utrap.h | ||
3 | * | ||
4 | * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) | ||
5 | */ | ||
6 | |||
7 | #ifndef __ASM_SPARC64_UTRAP_H | ||
8 | #define __ASM_SPARC64_UTRAP_H | ||
9 | |||
10 | #define UT_INSTRUCTION_EXCEPTION 1 | ||
11 | #define UT_INSTRUCTION_ERROR 2 | ||
12 | #define UT_INSTRUCTION_PROTECTION 3 | ||
13 | #define UT_ILLTRAP_INSTRUCTION 4 | ||
14 | #define UT_ILLEGAL_INSTRUCTION 5 | ||
15 | #define UT_PRIVILEGED_OPCODE 6 | ||
16 | #define UT_FP_DISABLED 7 | ||
17 | #define UT_FP_EXCEPTION_IEEE_754 8 | ||
18 | #define UT_FP_EXCEPTION_OTHER 9 | ||
19 | #define UT_TAG_OVERVIEW 10 | ||
20 | #define UT_DIVISION_BY_ZERO 11 | ||
21 | #define UT_DATA_EXCEPTION 12 | ||
22 | #define UT_DATA_ERROR 13 | ||
23 | #define UT_DATA_PROTECTION 14 | ||
24 | #define UT_MEM_ADDRESS_NOT_ALIGNED 15 | ||
25 | #define UT_PRIVILEGED_ACTION 16 | ||
26 | #define UT_ASYNC_DATA_ERROR 17 | ||
27 | #define UT_TRAP_INSTRUCTION_16 18 | ||
28 | #define UT_TRAP_INSTRUCTION_17 19 | ||
29 | #define UT_TRAP_INSTRUCTION_18 20 | ||
30 | #define UT_TRAP_INSTRUCTION_19 21 | ||
31 | #define UT_TRAP_INSTRUCTION_20 22 | ||
32 | #define UT_TRAP_INSTRUCTION_21 23 | ||
33 | #define UT_TRAP_INSTRUCTION_22 24 | ||
34 | #define UT_TRAP_INSTRUCTION_23 25 | ||
35 | #define UT_TRAP_INSTRUCTION_24 26 | ||
36 | #define UT_TRAP_INSTRUCTION_25 27 | ||
37 | #define UT_TRAP_INSTRUCTION_26 28 | ||
38 | #define UT_TRAP_INSTRUCTION_27 29 | ||
39 | #define UT_TRAP_INSTRUCTION_28 30 | ||
40 | #define UT_TRAP_INSTRUCTION_29 31 | ||
41 | #define UT_TRAP_INSTRUCTION_30 32 | ||
42 | #define UT_TRAP_INSTRUCTION_31 33 | ||
43 | |||
44 | #define UTH_NOCHANGE (-1) | ||
45 | |||
46 | #ifndef __ASSEMBLY__ | ||
47 | typedef int utrap_entry_t; | ||
48 | typedef void *utrap_handler_t; | ||
49 | #endif /* __ASSEMBLY__ */ | ||
50 | |||
51 | #endif /* !(__ASM_SPARC64_PROCESSOR_H) */ | ||
diff --git a/arch/sparc/include/asm/vac-ops.h b/arch/sparc/include/asm/vac-ops.h new file mode 100644 index 00000000000..a63e88ef042 --- /dev/null +++ b/arch/sparc/include/asm/vac-ops.h | |||
@@ -0,0 +1,127 @@ | |||
1 | #ifndef _SPARC_VAC_OPS_H | ||
2 | #define _SPARC_VAC_OPS_H | ||
3 | |||
4 | /* vac-ops.h: Inline assembly routines to do operations on the Sparc | ||
5 | * VAC (virtual address cache) for the sun4c. | ||
6 | * | ||
7 | * Copyright (C) 1994, David S. Miller (davem@caip.rutgers.edu) | ||
8 | */ | ||
9 | |||
10 | #include <asm/sysen.h> | ||
11 | #include <asm/contregs.h> | ||
12 | #include <asm/asi.h> | ||
13 | |||
14 | /* The SUN4C models have a virtually addressed write-through | ||
15 | * cache. | ||
16 | * | ||
17 | * The cache tags are directly accessible through an ASI and | ||
18 | * each have the form: | ||
19 | * | ||
20 | * ------------------------------------------------------------ | ||
21 | * | MBZ | CONTEXT | WRITE | PRIV | VALID | MBZ | TagID | MBZ | | ||
22 | * ------------------------------------------------------------ | ||
23 | * 31 25 24 22 21 20 19 18 16 15 2 1 0 | ||
24 | * | ||
25 | * MBZ: These bits are either unused and/or reserved and should | ||
26 | * be written as zeroes. | ||
27 | * | ||
28 | * CONTEXT: Records the context to which this cache line belongs. | ||
29 | * | ||
30 | * WRITE: A copy of the writable bit from the mmu pte access bits. | ||
31 | * | ||
32 | * PRIV: A copy of the privileged bit from the pte access bits. | ||
33 | * | ||
34 | * VALID: If set, this line is valid, else invalid. | ||
35 | * | ||
36 | * TagID: Fourteen bits of tag ID. | ||
37 | * | ||
38 | * Every virtual address is seen by the cache like this: | ||
39 | * | ||
40 | * ---------------------------------------- | ||
41 | * | RESV | TagID | LINE | BYTE-in-LINE | | ||
42 | * ---------------------------------------- | ||
43 | * 31 30 29 16 15 4 3 0 | ||
44 | * | ||
45 | * RESV: Unused/reserved. | ||
46 | * | ||
47 | * TagID: Used to match the Tag-ID in that vac tags. | ||
48 | * | ||
49 | * LINE: Which line within the cache | ||
50 | * | ||
51 | * BYTE-in-LINE: Which byte within the cache line. | ||
52 | */ | ||
53 | |||
54 | /* Sun4c VAC Tags */ | ||
55 | #define S4CVACTAG_CID 0x01c00000 | ||
56 | #define S4CVACTAG_W 0x00200000 | ||
57 | #define S4CVACTAG_P 0x00100000 | ||
58 | #define S4CVACTAG_V 0x00080000 | ||
59 | #define S4CVACTAG_TID 0x0000fffc | ||
60 | |||
61 | /* Sun4c VAC Virtual Address */ | ||
62 | /* These aren't used, why bother? (Anton) */ | ||
63 | #if 0 | ||
64 | #define S4CVACVA_TID 0x3fff0000 | ||
65 | #define S4CVACVA_LINE 0x0000fff0 | ||
66 | #define S4CVACVA_BIL 0x0000000f | ||
67 | #endif | ||
68 | |||
69 | /* The indexing of cache lines creates a problem. Because the line | ||
70 | * field of a virtual address extends past the page offset within | ||
71 | * the virtual address it is possible to have what are called | ||
72 | * 'bad aliases' which will create inconsistencies. So we must make | ||
73 | * sure that within a context that if a physical page is mapped | ||
74 | * more than once, that 'extra' line bits are the same. If this is | ||
75 | * not the case, and thus is a 'bad alias' we must turn off the | ||
76 | * cacheable bit in the pte's of all such pages. | ||
77 | */ | ||
78 | |||
79 | #define S4CVAC_BADBITS 0x0000f000 | ||
80 | |||
81 | /* The following is true if vaddr1 and vaddr2 would cause | ||
82 | * a 'bad alias'. | ||
83 | */ | ||
84 | #define S4CVAC_BADALIAS(vaddr1, vaddr2) \ | ||
85 | ((((unsigned long) (vaddr1)) ^ ((unsigned long) (vaddr2))) & \ | ||
86 | (S4CVAC_BADBITS)) | ||
87 | |||
88 | /* The following structure describes the characteristics of a sun4c | ||
89 | * VAC as probed from the prom during boot time. | ||
90 | */ | ||
91 | struct sun4c_vac_props { | ||
92 | unsigned int num_bytes; /* Size of the cache */ | ||
93 | unsigned int do_hwflushes; /* Hardware flushing available? */ | ||
94 | unsigned int linesize; /* Size of each line in bytes */ | ||
95 | unsigned int log2lsize; /* log2(linesize) */ | ||
96 | unsigned int on; /* VAC is enabled */ | ||
97 | }; | ||
98 | |||
99 | extern struct sun4c_vac_props sun4c_vacinfo; | ||
100 | |||
101 | /* sun4c_enable_vac() enables the sun4c virtual address cache. */ | ||
102 | static inline void sun4c_enable_vac(void) | ||
103 | { | ||
104 | __asm__ __volatile__("lduba [%0] %1, %%g1\n\t" | ||
105 | "or %%g1, %2, %%g1\n\t" | ||
106 | "stba %%g1, [%0] %1\n\t" | ||
107 | : /* no outputs */ | ||
108 | : "r" ((unsigned int) AC_SENABLE), | ||
109 | "i" (ASI_CONTROL), "i" (SENABLE_CACHE) | ||
110 | : "g1", "memory"); | ||
111 | sun4c_vacinfo.on = 1; | ||
112 | } | ||
113 | |||
114 | /* sun4c_disable_vac() disables the virtual address cache. */ | ||
115 | static inline void sun4c_disable_vac(void) | ||
116 | { | ||
117 | __asm__ __volatile__("lduba [%0] %1, %%g1\n\t" | ||
118 | "andn %%g1, %2, %%g1\n\t" | ||
119 | "stba %%g1, [%0] %1\n\t" | ||
120 | : /* no outputs */ | ||
121 | : "r" ((unsigned int) AC_SENABLE), | ||
122 | "i" (ASI_CONTROL), "i" (SENABLE_CACHE) | ||
123 | : "g1", "memory"); | ||
124 | sun4c_vacinfo.on = 0; | ||
125 | } | ||
126 | |||
127 | #endif /* !(_SPARC_VAC_OPS_H) */ | ||
diff --git a/arch/sparc/include/asm/watchdog.h b/arch/sparc/include/asm/watchdog.h new file mode 100644 index 00000000000..5baf2d3919c --- /dev/null +++ b/arch/sparc/include/asm/watchdog.h | |||
@@ -0,0 +1,31 @@ | |||
1 | /* | ||
2 | * | ||
3 | * watchdog - Driver interface for the hardware watchdog timers | ||
4 | * present on Sun Microsystems boardsets | ||
5 | * | ||
6 | * Copyright (c) 2000 Eric Brower <ebrower@usa.net> | ||
7 | * | ||
8 | */ | ||
9 | |||
10 | #ifndef _SPARC64_WATCHDOG_H | ||
11 | #define _SPARC64_WATCHDOG_H | ||
12 | |||
13 | #include <linux/watchdog.h> | ||
14 | |||
15 | /* Solaris compatibility ioctls-- | ||
16 | * Ref. <linux/watchdog.h> for standard linux watchdog ioctls | ||
17 | */ | ||
18 | #define WIOCSTART _IO (WATCHDOG_IOCTL_BASE, 10) /* Start Timer */ | ||
19 | #define WIOCSTOP _IO (WATCHDOG_IOCTL_BASE, 11) /* Stop Timer */ | ||
20 | #define WIOCGSTAT _IOR(WATCHDOG_IOCTL_BASE, 12, int)/* Get Timer Status */ | ||
21 | |||
22 | /* Status flags from WIOCGSTAT ioctl | ||
23 | */ | ||
24 | #define WD_FREERUN 0x01 /* timer is running, interrupts disabled */ | ||
25 | #define WD_EXPIRED 0x02 /* timer has expired */ | ||
26 | #define WD_RUNNING 0x04 /* timer is running, interrupts enabled */ | ||
27 | #define WD_STOPPED 0x08 /* timer has not been started */ | ||
28 | #define WD_SERVICED 0x10 /* timer interrupt was serviced */ | ||
29 | |||
30 | #endif /* ifndef _SPARC64_WATCHDOG_H */ | ||
31 | |||