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