xref: /openbsd-src/sys/arch/hppa/include/cpufunc.h (revision 2df76cc2a0aee2cb2166e3799b7bb5c3f883f83d)
1*2df76cc2Sguenther /*	$OpenBSD: cpufunc.h,v 1.29 2014/03/29 18:09:29 guenther Exp $	*/
2e55ab885Smickey 
3e55ab885Smickey /*
4fef2e65fSmickey  * Copyright (c) 1998-2004 Michael Shalayeff
5b97403ffSmickey  * All rights reserved.
6b97403ffSmickey  *
7b97403ffSmickey  * Redistribution and use in source and binary forms, with or without
8b97403ffSmickey  * modification, are permitted provided that the following conditions
9b97403ffSmickey  * are met:
10b97403ffSmickey  * 1. Redistributions of source code must retain the above copyright
11b97403ffSmickey  *    notice, this list of conditions and the following disclaimer.
12b97403ffSmickey  * 2. Redistributions in binary form must reproduce the above copyright
13b97403ffSmickey  *    notice, this list of conditions and the following disclaimer in the
14b97403ffSmickey  *    documentation and/or other materials provided with the distribution.
15b97403ffSmickey  *
16b97403ffSmickey  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17b97403ffSmickey  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18b97403ffSmickey  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19fef2e65fSmickey  * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
20fef2e65fSmickey  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21fef2e65fSmickey  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22fef2e65fSmickey  * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23fef2e65fSmickey  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
24fef2e65fSmickey  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
25fef2e65fSmickey  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
26fef2e65fSmickey  * THE POSSIBILITY OF SUCH DAMAGE.
27b97403ffSmickey  */
28b97403ffSmickey /*
29e55ab885Smickey  *  (c) Copyright 1988 HEWLETT-PACKARD COMPANY
30e55ab885Smickey  *
31e55ab885Smickey  *  To anyone who acknowledges that this file is provided "AS IS"
32e55ab885Smickey  *  without any express or implied warranty:
33e55ab885Smickey  *      permission to use, copy, modify, and distribute this file
34e55ab885Smickey  *  for any purpose is hereby granted without fee, provided that
35e55ab885Smickey  *  the above copyright notice and this notice appears in all
36e55ab885Smickey  *  copies, and that the name of Hewlett-Packard Company not be
37e55ab885Smickey  *  used in advertising or publicity pertaining to distribution
38e55ab885Smickey  *  of the software without specific, written prior permission.
39e55ab885Smickey  *  Hewlett-Packard Company makes no representations about the
40e55ab885Smickey  *  suitability of this software for any purpose.
41e55ab885Smickey  */
42e55ab885Smickey /*
43e55ab885Smickey  * Copyright (c) 1990,1994 The University of Utah and
44e55ab885Smickey  * the Computer Systems Laboratory (CSL).  All rights reserved.
45e55ab885Smickey  *
46e55ab885Smickey  * THE UNIVERSITY OF UTAH AND CSL PROVIDE THIS SOFTWARE IN ITS "AS IS"
47e55ab885Smickey  * CONDITION, AND DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES
48e55ab885Smickey  * WHATSOEVER RESULTING FROM ITS USE.
49e55ab885Smickey  *
50e55ab885Smickey  * CSL requests users of this software to return to csl-dist@cs.utah.edu any
51e55ab885Smickey  * improvements that they make and grant CSL redistribution rights.
52e55ab885Smickey  *
53e55ab885Smickey  * 	Utah $Hdr: c_support.s 1.8 94/12/14$
54e55ab885Smickey  *	Author: Bob Wheeler, University of Utah CSL
55e55ab885Smickey  */
56e55ab885Smickey 
57b97403ffSmickey #ifndef _MACHINE_CPUFUNC_H_
58b97403ffSmickey #define _MACHINE_CPUFUNC_H_
59792ea309Smickey 
60792ea309Smickey #include <machine/psl.h>
61792ea309Smickey #include <machine/pte.h>
62792ea309Smickey 
630543ead7Sderaadt #define tlbbtop(b) ((b) >> (PAGE_SHIFT - 5))
640543ead7Sderaadt #define tlbptob(p) ((p) << (PAGE_SHIFT - 5))
65e55ab885Smickey 
66b97403ffSmickey #define hptbtop(b) ((b) >> 17)
67e55ab885Smickey 
68792ea309Smickey /* Get space register for an address */
ldsid(vaddr_t p)69dfde01c8Smickey static __inline register_t ldsid(vaddr_t p) {
70dfde01c8Smickey 	register_t ret;
71*2df76cc2Sguenther 	__asm volatile("ldsid (%1),%0" : "=r" (ret) : "r" (p));
72e55ab885Smickey 	return ret;
73e55ab885Smickey }
74e55ab885Smickey 
75*2df76cc2Sguenther #define mtctl(v,r) __asm volatile("mtctl %0,%1":: "r" (v), "i" (r))
76*2df76cc2Sguenther #define mfctl(r,v) __asm volatile("mfctl %1,%0": "=r" (v): "i" (r))
77e55ab885Smickey 
78608b22caSmickey #define	mfcpu(r,v)	/* XXX for the lack of the mnemonics */		\
79*2df76cc2Sguenther 	__asm volatile(".word	%1\n\t"					\
80608b22caSmickey 			 "copy	%%r22, %0"				\
81812c66ffSmickey 	    : "=r" (v) : "i" ((0x14001400 | ((r) << 21) | (22)))	\
82608b22caSmickey 	    : "r22")
83608b22caSmickey 
84*2df76cc2Sguenther #define mtsp(v,r) __asm volatile("mtsp %0,%1":: "r" (v), "i" (r))
85*2df76cc2Sguenther #define mfsp(r,v) __asm volatile("mfsp %1,%0": "=r" (v): "i" (r))
86e55ab885Smickey 
87*2df76cc2Sguenther #define ssm(v,r) __asm volatile("ssm %1,%0": "=r" (r): "i" (v))
88*2df76cc2Sguenther #define rsm(v,r) __asm volatile("rsm %1,%0": "=r" (r): "i" (v))
89e55ab885Smickey 
90792ea309Smickey /* Move to system mask. Old value of system mask is returned. */
91608b22caSmickey static __inline register_t
mtsm(register_t mask)92608b22caSmickey mtsm(register_t mask) {
93dfde01c8Smickey 	register_t ret;
94*2df76cc2Sguenther 	__asm volatile("ssm 0,%0\n\t"
952d1ff911Smickey 			 "mtsm %1": "=&r" (ret) : "r" (mask));
96792ea309Smickey 	return ret;
97792ea309Smickey }
98e55ab885Smickey 
99*2df76cc2Sguenther #define	fdce(sp,off) __asm volatile("fdce 0(%0,%1)":: "i" (sp), "r" (off))
100*2df76cc2Sguenther #define	fice(sp,off) __asm volatile("fice 0(%0,%1)":: "i" (sp), "r" (off))
101*2df76cc2Sguenther #define sync_caches() __asm volatile(\
10226143924Smickey     "sync\n\tnop\n\tnop\n\tnop\n\tnop\n\tnop\n\tnop\n\tnop":::"memory")
103e55ab885Smickey 
104e55ab885Smickey static __inline void
iitlba(u_int pg,pa_space_t sp,vaddr_t va)1054eadd93aSmickey iitlba(u_int pg, pa_space_t sp, vaddr_t va)
106792ea309Smickey {
107792ea309Smickey 	mtsp(sp, 1);
108f2cea1ceSmickey 	__asm volatile("iitlba %0,(%%sr1, %1)":: "r" (pg), "r" (va));
109792ea309Smickey }
110792ea309Smickey 
111792ea309Smickey static __inline void
idtlba(u_int pg,pa_space_t sp,vaddr_t va)1124eadd93aSmickey idtlba(u_int pg, pa_space_t sp, vaddr_t va)
113792ea309Smickey {
114792ea309Smickey 	mtsp(sp, 1);
115f2cea1ceSmickey 	__asm volatile("idtlba %0,(%%sr1, %1)":: "r" (pg), "r" (va));
116792ea309Smickey }
117792ea309Smickey 
118792ea309Smickey static __inline void
iitlbp(u_int prot,pa_space_t sp,vaddr_t va)1194eadd93aSmickey iitlbp(u_int prot, pa_space_t sp, vaddr_t va)
120792ea309Smickey {
121792ea309Smickey 	mtsp(sp, 1);
122f2cea1ceSmickey 	__asm volatile("iitlbp %0,(%%sr1, %1)":: "r" (prot), "r" (va));
123792ea309Smickey }
124792ea309Smickey 
125792ea309Smickey static __inline void
idtlbp(u_int prot,pa_space_t sp,vaddr_t va)1264eadd93aSmickey idtlbp(u_int prot, pa_space_t sp, vaddr_t va)
127e55ab885Smickey {
128792ea309Smickey 	mtsp(sp, 1);
129f2cea1ceSmickey 	__asm volatile("idtlbp %0,(%%sr1, %1)":: "r" (prot), "r" (va));
130e55ab885Smickey }
131e55ab885Smickey 
132e55ab885Smickey static __inline void
pitlb(pa_space_t sp,vaddr_t va)1334eadd93aSmickey pitlb(pa_space_t sp, vaddr_t va)
134e55ab885Smickey {
135792ea309Smickey 	mtsp(sp, 1);
136f2cea1ceSmickey 	__asm volatile("pitlb %%r0(%%sr1, %0)":: "r" (va));
137792ea309Smickey }
138792ea309Smickey 
139792ea309Smickey static __inline void
pdtlb(pa_space_t sp,vaddr_t va)1404eadd93aSmickey pdtlb(pa_space_t sp, vaddr_t va)
141792ea309Smickey {
142792ea309Smickey 	mtsp(sp, 1);
143f2cea1ceSmickey 	__asm volatile("pdtlb %%r0(%%sr1, %0)":: "r" (va));
144792ea309Smickey }
145792ea309Smickey 
146792ea309Smickey static __inline void
pitlbe(pa_space_t sp,vaddr_t va)1474eadd93aSmickey pitlbe(pa_space_t sp, vaddr_t va)
148792ea309Smickey {
149792ea309Smickey 	mtsp(sp, 1);
150f2cea1ceSmickey 	__asm volatile("pitlbe %%r0(%%sr1, %0)":: "r" (va));
151f2cea1ceSmickey }
152f2cea1ceSmickey 
153f2cea1ceSmickey static __inline void
pdtlbe(pa_space_t sp,vaddr_t va)1544eadd93aSmickey pdtlbe(pa_space_t sp, vaddr_t va)
155f2cea1ceSmickey {
156f2cea1ceSmickey 	mtsp(sp, 1);
157f2cea1ceSmickey 	__asm volatile("pdtlbe %%r0(%%sr1, %0)":: "r" (va));
158792ea309Smickey }
159792ea309Smickey 
1603a2eb88cSmickey #ifdef USELEDS
1617d1fe213Smickey #define	PALED_NETSND	0x01
1627d1fe213Smickey #define	PALED_NETRCV	0x02
1633a2eb88cSmickey #define	PALED_DISK	0x04
1643a2eb88cSmickey #define	PALED_HEARTBEAT	0x08
1653a2eb88cSmickey #define	PALED_LOADMASK	0xf0
1663a2eb88cSmickey 
1673a2eb88cSmickey #define	PALED_DATA	0x01
1683a2eb88cSmickey #define	PALED_STROBE	0x02
1693a2eb88cSmickey 
1703a2eb88cSmickey extern volatile u_int8_t *machine_ledaddr;
1713a2eb88cSmickey extern int machine_ledword, machine_leds;
1723a2eb88cSmickey 
1733a2eb88cSmickey static __inline void
ledctl(int on,int off,int toggle)1743a2eb88cSmickey ledctl(int on, int off, int toggle)
1753a2eb88cSmickey {
1763a2eb88cSmickey 	if (machine_ledaddr) {
1773a2eb88cSmickey 		int r;
1783a2eb88cSmickey 
1793a2eb88cSmickey 		if (on)
1803a2eb88cSmickey 			machine_leds |= on;
1813a2eb88cSmickey 		if (off)
1823a2eb88cSmickey 			machine_leds &= ~off;
1833a2eb88cSmickey 		if (toggle)
1843a2eb88cSmickey 			machine_leds ^= toggle;
1853a2eb88cSmickey 
1863a2eb88cSmickey 		r = ~machine_leds;	/* it seems they should be reversed */
1873a2eb88cSmickey 
1883a2eb88cSmickey 		if (machine_ledword)
1893a2eb88cSmickey 			*machine_ledaddr = r;
1903a2eb88cSmickey 		else {
1913a2eb88cSmickey 			register int b;
1923a2eb88cSmickey 			for (b = 0x80; b; b >>= 1) {
1933a2eb88cSmickey 				*machine_ledaddr = (r & b)? PALED_DATA : 0;
1943a2eb88cSmickey 				DELAY(1);
1953a2eb88cSmickey 				*machine_ledaddr = ((r & b)? PALED_DATA : 0) |
1963a2eb88cSmickey 				    PALED_STROBE;
1973a2eb88cSmickey 			}
1983a2eb88cSmickey 		}
1993a2eb88cSmickey 	}
2003a2eb88cSmickey }
2013a2eb88cSmickey #endif
2023a2eb88cSmickey 
203792ea309Smickey #ifdef _KERNEL
204a228f8d2Smickey extern int (*cpu_hpt_init)(vaddr_t hpt, vsize_t hptsize);
205a228f8d2Smickey 
20633785181Smickey void fpu_save(vaddr_t va);
207ebbb1986Smickey void fpu_exit(void);
208c4071fd1Smillert void ficache(pa_space_t sp, vaddr_t va, vsize_t size);
209c4071fd1Smillert void fdcache(pa_space_t sp, vaddr_t va, vsize_t size);
210c4071fd1Smillert void pdcache(pa_space_t sp, vaddr_t va, vsize_t size);
2115a887d14Smickey void ficacheall(void);
2125a887d14Smickey void fdcacheall(void);
213c4071fd1Smillert void ptlball(void);
214a228f8d2Smickey int btlb_insert(pa_space_t space, vaddr_t va, paddr_t pa, vsize_t *lenp, u_int prot);
215c4071fd1Smillert hppa_hpa_t cpu_gethpa(int n);
216b6ddd7ddSmickey void eaio_l2(int i);
217792ea309Smickey #endif
218792ea309Smickey 
219b97403ffSmickey #endif /* _MACHINE_CPUFUNC_H_ */
220