source: mainline/kernel/arch/sparc64/include/asm.h@ 7d60cf5

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 7d60cf5 was 7d60cf5, checked in by Jakub Jermar <jakub@…>, 16 years ago

Introduce ioport8_t, ioport16_t and ioport32_t. These types are to be used with
pio_read_n() and pio_write_n() functions. This breaks everything.

  • Property mode set to 100644
File size: 9.1 KB
RevLine 
[2a99fa8]1/*
[df4ed85]2 * Copyright (c) 2005 Jakub Jermar
[2a99fa8]3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
[0ffa3ef5]29/** @addtogroup sparc64
[b45c443]30 * @{
31 */
32/** @file
33 */
34
[0ffa3ef5]35#ifndef KERN_sparc64_ASM_H_
36#define KERN_sparc64_ASM_H_
[2a99fa8]37
[b3f8fb7]38#include <arch/arch.h>
[2a99fa8]39#include <arch/types.h>
[f4c2b6a]40#include <typedefs.h>
[b3f8fb7]41#include <align.h>
[75e1db0]42#include <arch/register.h>
[2a99fa8]43#include <config.h>
[b254b3b]44#include <arch/stack.h>
[ff3b7da7]45#include <arch/barrier.h>
[2a99fa8]46
[7d60cf5]47static inline void pio_write_8(ioport8_t *port, uint8_t v)
[a2a5529]48{
[7d60cf5]49 *port = v;
[ff3b7da7]50 memory_barrier();
[a2a5529]51}
52
[7d60cf5]53static inline void pio_write_16(ioport16_t *port, uint16_t v)
[a2a5529]54{
[7d60cf5]55 *port = v;
[ff3b7da7]56 memory_barrier();
[a2a5529]57}
58
[7d60cf5]59static inline void pio_write_32(ioport32_t *port, uint32_t v)
[a2a5529]60{
[7d60cf5]61 *port = v;
[ff3b7da7]62 memory_barrier();
[a2a5529]63}
64
[7d60cf5]65static inline uint8_t pio_read_8(ioport8_t *port)
[a2a5529]66{
[ff3b7da7]67 uint8_t rv;
68
[7d60cf5]69 rv = *port;
[ff3b7da7]70 memory_barrier();
71
72 return rv;
[a2a5529]73}
74
[7d60cf5]75static inline uint16_t pio_read_16(ioport16_t *port)
[a2a5529]76{
[ff3b7da7]77 uint16_t rv;
78
[7d60cf5]79 rv = *port;
[ff3b7da7]80 memory_barrier();
81
82 return rv;
[a2a5529]83}
84
[7d60cf5]85static inline uint32_t pio_read_32(ioport32_t *port)
[a2a5529]86{
[ff3b7da7]87 uint32_t rv;
[a2a5529]88
[7d60cf5]89 rv = *port;
[ff3b7da7]90 memory_barrier();
[a2a5529]91
[ff3b7da7]92 return rv;
93}
[a2a5529]94
[75e1db0]95/** Read Processor State register.
96 *
97 * @return Value of PSTATE register.
98 */
[7f1c620]99static inline uint64_t pstate_read(void)
[75e1db0]100{
[7f1c620]101 uint64_t v;
[75e1db0]102
[e7b7be3f]103 asm volatile ("rdpr %%pstate, %0\n" : "=r" (v));
[75e1db0]104
105 return v;
106}
107
108/** Write Processor State register.
109 *
[abbc16e]110 * @param v New value of PSTATE register.
[75e1db0]111 */
[7f1c620]112static inline void pstate_write(uint64_t v)
[75e1db0]113{
[e7b7be3f]114 asm volatile ("wrpr %0, %1, %%pstate\n" : : "r" (v), "i" (0));
[75e1db0]115}
116
[096d11e5]117/** Read TICK_compare Register.
118 *
119 * @return Value of TICK_comapre register.
120 */
[7f1c620]121static inline uint64_t tick_compare_read(void)
[096d11e5]122{
[7f1c620]123 uint64_t v;
[096d11e5]124
[e7b7be3f]125 asm volatile ("rd %%tick_cmpr, %0\n" : "=r" (v));
[096d11e5]126
127 return v;
128}
129
130/** Write TICK_compare Register.
131 *
[abbc16e]132 * @param v New value of TICK_comapre register.
[096d11e5]133 */
[7f1c620]134static inline void tick_compare_write(uint64_t v)
[096d11e5]135{
[e7b7be3f]136 asm volatile ("wr %0, %1, %%tick_cmpr\n" : : "r" (v), "i" (0));
[096d11e5]137}
138
[965dc18]139/** Read STICK_compare Register.
140 *
141 * @return Value of STICK_compare register.
142 */
143static inline uint64_t stick_compare_read(void)
144{
145 uint64_t v;
146
147 asm volatile ("rd %%asr25, %0\n" : "=r" (v));
148
149 return v;
150}
151
152/** Write STICK_compare Register.
153 *
154 * @param v New value of STICK_comapre register.
155 */
156static inline void stick_compare_write(uint64_t v)
157{
158 asm volatile ("wr %0, %1, %%asr25\n" : : "r" (v), "i" (0));
159}
160
[096d11e5]161/** Read TICK Register.
162 *
163 * @return Value of TICK register.
164 */
[7f1c620]165static inline uint64_t tick_read(void)
[096d11e5]166{
[7f1c620]167 uint64_t v;
[096d11e5]168
[e7b7be3f]169 asm volatile ("rdpr %%tick, %0\n" : "=r" (v));
[096d11e5]170
171 return v;
172}
173
174/** Write TICK Register.
175 *
[abbc16e]176 * @param v New value of TICK register.
[096d11e5]177 */
[7f1c620]178static inline void tick_write(uint64_t v)
[096d11e5]179{
[e7b7be3f]180 asm volatile ("wrpr %0, %1, %%tick\n" : : "r" (v), "i" (0));
[096d11e5]181}
182
[6eabb6e6]183/** Read FPRS Register.
184 *
185 * @return Value of FPRS register.
186 */
187static inline uint64_t fprs_read(void)
188{
189 uint64_t v;
190
[e7b7be3f]191 asm volatile ("rd %%fprs, %0\n" : "=r" (v));
[6eabb6e6]192
193 return v;
194}
195
196/** Write FPRS Register.
197 *
198 * @param v New value of FPRS register.
199 */
200static inline void fprs_write(uint64_t v)
201{
[e7b7be3f]202 asm volatile ("wr %0, %1, %%fprs\n" : : "r" (v), "i" (0));
[6eabb6e6]203}
204
[39494010]205/** Read SOFTINT Register.
206 *
207 * @return Value of SOFTINT register.
208 */
[7f1c620]209static inline uint64_t softint_read(void)
[39494010]210{
[7f1c620]211 uint64_t v;
[39494010]212
[e7b7be3f]213 asm volatile ("rd %%softint, %0\n" : "=r" (v));
[39494010]214
215 return v;
216}
217
218/** Write SOFTINT Register.
219 *
[abbc16e]220 * @param v New value of SOFTINT register.
[39494010]221 */
[7f1c620]222static inline void softint_write(uint64_t v)
[39494010]223{
[e7b7be3f]224 asm volatile ("wr %0, %1, %%softint\n" : : "r" (v), "i" (0));
[39494010]225}
[75e1db0]226
[1120276]227/** Write CLEAR_SOFTINT Register.
228 *
229 * Bits set in CLEAR_SOFTINT register will be cleared in SOFTINT register.
230 *
[abbc16e]231 * @param v New value of CLEAR_SOFTINT register.
[1120276]232 */
[7f1c620]233static inline void clear_softint_write(uint64_t v)
[1120276]234{
[e7b7be3f]235 asm volatile ("wr %0, %1, %%clear_softint\n" : : "r" (v), "i" (0));
[1120276]236}
237
[f9a56c0]238/** Write SET_SOFTINT Register.
239 *
240 * Bits set in SET_SOFTINT register will be set in SOFTINT register.
241 *
242 * @param v New value of SET_SOFTINT register.
243 */
244static inline void set_softint_write(uint64_t v)
245{
[e7b7be3f]246 asm volatile ("wr %0, %1, %%set_softint\n" : : "r" (v), "i" (0));
[f9a56c0]247}
248
[2a99fa8]249/** Enable interrupts.
250 *
251 * Enable interrupts and return previous
252 * value of IPL.
253 *
254 * @return Old interrupt priority level.
255 */
256static inline ipl_t interrupts_enable(void) {
[75e1db0]257 pstate_reg_t pstate;
[7f1c620]258 uint64_t value;
[75e1db0]259
260 value = pstate_read();
261 pstate.value = value;
262 pstate.ie = true;
263 pstate_write(pstate.value);
264
265 return (ipl_t) value;
[2a99fa8]266}
267
268/** Disable interrupts.
269 *
270 * Disable interrupts and return previous
271 * value of IPL.
272 *
273 * @return Old interrupt priority level.
274 */
275static inline ipl_t interrupts_disable(void) {
[75e1db0]276 pstate_reg_t pstate;
[7f1c620]277 uint64_t value;
[75e1db0]278
279 value = pstate_read();
280 pstate.value = value;
281 pstate.ie = false;
282 pstate_write(pstate.value);
283
284 return (ipl_t) value;
[2a99fa8]285}
286
287/** Restore interrupt priority level.
288 *
289 * Restore IPL.
290 *
291 * @param ipl Saved interrupt priority level.
292 */
293static inline void interrupts_restore(ipl_t ipl) {
[75e1db0]294 pstate_reg_t pstate;
295
296 pstate.value = pstate_read();
297 pstate.ie = ((pstate_reg_t) ipl).ie;
298 pstate_write(pstate.value);
[2a99fa8]299}
300
301/** Return interrupt priority level.
302 *
303 * Return IPL.
304 *
305 * @return Current interrupt priority level.
306 */
307static inline ipl_t interrupts_read(void) {
[75e1db0]308 return (ipl_t) pstate_read();
[2a99fa8]309}
310
311/** Return base address of current stack.
312 *
313 * Return the base address of the current stack.
314 * The stack is assumed to be STACK_SIZE bytes long.
315 * The stack must start on page boundary.
316 */
[7f1c620]317static inline uintptr_t get_stack_base(void)
[2a99fa8]318{
[b254b3b]319 uintptr_t unbiased_sp;
[437ee6a4]320
[e7b7be3f]321 asm volatile ("add %%sp, %1, %0\n" : "=r" (unbiased_sp) : "i" (STACK_BIAS));
[437ee6a4]322
[b254b3b]323 return ALIGN_DOWN(unbiased_sp, STACK_SIZE);
[2a99fa8]324}
325
[2cf87e50]326/** Read Version Register.
327 *
328 * @return Value of VER register.
329 */
[7f1c620]330static inline uint64_t ver_read(void)
[2cf87e50]331{
[7f1c620]332 uint64_t v;
[2cf87e50]333
[e7b7be3f]334 asm volatile ("rdpr %%ver, %0\n" : "=r" (v));
[2cf87e50]335
336 return v;
337}
338
[d78d603]339/** Read Trap Program Counter register.
[8ac5fe7]340 *
[d78d603]341 * @return Current value in TPC.
[8ac5fe7]342 */
[d78d603]343static inline uint64_t tpc_read(void)
[8ac5fe7]344{
[7f1c620]345 uint64_t v;
[8ac5fe7]346
[e7b7be3f]347 asm volatile ("rdpr %%tpc, %0\n" : "=r" (v));
[8ac5fe7]348
349 return v;
350}
351
[d78d603]352/** Read Trap Level register.
[b6fba84]353 *
[d78d603]354 * @return Current value in TL.
[b6fba84]355 */
[d78d603]356static inline uint64_t tl_read(void)
[b6fba84]357{
[7f1c620]358 uint64_t v;
[b6fba84]359
[e7b7be3f]360 asm volatile ("rdpr %%tl, %0\n" : "=r" (v));
[b6fba84]361
362 return v;
363}
364
[d78d603]365/** Read Trap Base Address register.
[7cb53f62]366 *
[d78d603]367 * @return Current value in TBA.
[7cb53f62]368 */
[d78d603]369static inline uint64_t tba_read(void)
[7cb53f62]370{
[7f1c620]371 uint64_t v;
[7cb53f62]372
[e7b7be3f]373 asm volatile ("rdpr %%tba, %0\n" : "=r" (v));
[7cb53f62]374
375 return v;
376}
[b6fba84]377
[8ac5fe7]378/** Write Trap Base Address register.
379 *
[abbc16e]380 * @param v New value of TBA.
[8ac5fe7]381 */
[7f1c620]382static inline void tba_write(uint64_t v)
[8ac5fe7]383{
[e7b7be3f]384 asm volatile ("wrpr %0, %1, %%tba\n" : : "r" (v), "i" (0));
[8ac5fe7]385}
386
[7f1c620]387/** Load uint64_t from alternate space.
[b00fdde]388 *
389 * @param asi ASI determining the alternate space.
390 * @param va Virtual address within the ASI.
391 *
392 * @return Value read from the virtual address in the specified address space.
393 */
[7f1c620]394static inline uint64_t asi_u64_read(asi_t asi, uintptr_t va)
[b00fdde]395{
[7f1c620]396 uint64_t v;
[b00fdde]397
[e7b7be3f]398 asm volatile ("ldxa [%1] %2, %0\n" : "=r" (v) : "r" (va), "i" ((unsigned) asi));
[b00fdde]399
400 return v;
401}
402
[7f1c620]403/** Store uint64_t to alternate space.
[b00fdde]404 *
405 * @param asi ASI determining the alternate space.
406 * @param va Virtual address within the ASI.
407 * @param v Value to be written.
408 */
[7f1c620]409static inline void asi_u64_write(asi_t asi, uintptr_t va, uint64_t v)
[b00fdde]410{
[e7b7be3f]411 asm volatile ("stxa %0, [%1] %2\n" : : "r" (v), "r" (va), "i" ((unsigned) asi) : "memory");
[b00fdde]412}
413
[0fa6044]414/** Flush all valid register windows to memory. */
415static inline void flushw(void)
416{
[e7b7be3f]417 asm volatile ("flushw\n");
[0fa6044]418}
419
[fd85ae5]420/** Switch to nucleus by setting TL to 1. */
421static inline void nucleus_enter(void)
422{
[e7b7be3f]423 asm volatile ("wrpr %g0, 1, %tl\n");
[fd85ae5]424}
425
426/** Switch from nucleus by setting TL to 0. */
427static inline void nucleus_leave(void)
428{
[e7b7be3f]429 asm volatile ("wrpr %g0, %g0, %tl\n");
[fd85ae5]430}
431
[e11ae91]432extern void cpu_halt(void);
433extern void cpu_sleep(void);
[9a5b556]434extern void asm_delay_loop(const uint32_t usec);
[e11ae91]435
436extern uint64_t read_from_ag_g7(void);
437extern void write_to_ag_g6(uint64_t val);
438extern void write_to_ag_g7(uint64_t val);
439extern void write_to_ig_g6(uint64_t val);
[2a99fa8]440
[cfa70add]441extern void switch_to_userspace(uint64_t pc, uint64_t sp, uint64_t uarg);
[ed166f7]442
[2a99fa8]443#endif
[b45c443]444
[0ffa3ef5]445/** @}
[b45c443]446 */
Note: See TracBrowser for help on using the repository browser.