cpufunc.h revision 83836
166458Sdfr/*-
266458Sdfr * Copyright (c) 1998 Doug Rabson
366458Sdfr * All rights reserved.
466458Sdfr *
566458Sdfr * Redistribution and use in source and binary forms, with or without
666458Sdfr * modification, are permitted provided that the following conditions
766458Sdfr * are met:
866458Sdfr * 1. Redistributions of source code must retain the above copyright
966458Sdfr *    notice, this list of conditions and the following disclaimer.
1066458Sdfr * 2. Redistributions in binary form must reproduce the above copyright
1166458Sdfr *    notice, this list of conditions and the following disclaimer in the
1266458Sdfr *    documentation and/or other materials provided with the distribution.
1366458Sdfr *
1466458Sdfr * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1566458Sdfr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1666458Sdfr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1766458Sdfr * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1866458Sdfr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1966458Sdfr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2066458Sdfr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2166458Sdfr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2266458Sdfr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2366458Sdfr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2466458Sdfr * SUCH DAMAGE.
2566458Sdfr *
2666458Sdfr * $FreeBSD: head/sys/ia64/include/cpufunc.h 83836 2001-09-22 19:51:18Z dfr $
2766458Sdfr */
2866458Sdfr
2966458Sdfr#ifndef _MACHINE_CPUFUNC_H_
3066458Sdfr#define _MACHINE_CPUFUNC_H_
3166458Sdfr
3266458Sdfr#ifdef _KERNEL
3366458Sdfr
3466458Sdfr#include <sys/types.h>
3583511Sdfr#include <machine/ia64_cpu.h>
3666458Sdfr
3766458Sdfr#ifdef __GNUC__
3866458Sdfr
3966458Sdfrstatic __inline void
4066458Sdfrbreakpoint(void)
4166458Sdfr{
4266458Sdfr	__asm __volatile("break 0x80100"); /* XXX use linux value */
4366458Sdfr}
4466458Sdfr
4566458Sdfr#endif
4666458Sdfr
4783511Sdfrextern u_int64_t	ia64_port_base;
4883511Sdfr
4983511Sdfrstatic __inline volatile void *
5083511Sdfria64_port_address(u_int port)
5183511Sdfr{
5283511Sdfr    return (volatile void *)(ia64_port_base
5383511Sdfr			     | ((port >> 2) << 12)
5483511Sdfr			     | (port & ((1 << 12) - 1)));
5583511Sdfr}
5683511Sdfr
5783836Sdfrstatic __inline volatile void *
5883836Sdfria64_memory_address(u_int addr)
5983836Sdfr{
6083836Sdfr    return (volatile void *) IA64_PHYS_TO_RR6(addr);;
6183836Sdfr}
6283836Sdfr
6366458Sdfrstatic __inline u_int8_t
6466458Sdfrinb(u_int port)
6566458Sdfr{
6683511Sdfr	volatile u_int8_t *p = ia64_port_address(port);
6783511Sdfr	u_int8_t v = *p;
6883511Sdfr	ia64_mf_a();
6983511Sdfr	ia64_mf();
7083511Sdfr	return v;
7166458Sdfr}
7266458Sdfr
7366458Sdfrstatic __inline u_int16_t
7466458Sdfrinw(u_int port)
7566458Sdfr{
7683511Sdfr	volatile u_int16_t *p = ia64_port_address(port);
7783511Sdfr	u_int16_t v = *p;
7883511Sdfr	ia64_mf_a();
7983511Sdfr	ia64_mf();
8083511Sdfr	return v;
8166458Sdfr}
8266458Sdfr
8366458Sdfrstatic __inline u_int32_t
8466458Sdfrinl(u_int port)
8566458Sdfr{
8683511Sdfr	volatile u_int32_t *p = ia64_port_address(port);
8783511Sdfr	u_int32_t v = *p;
8883511Sdfr	ia64_mf_a();
8983511Sdfr	ia64_mf();
9083511Sdfr	return v;
9166458Sdfr}
9266458Sdfr
9366458Sdfrstatic __inline void
9466458Sdfrinsb(u_int port, void *addr, size_t count)
9566458Sdfr{
9666458Sdfr	u_int8_t *p = addr;
9766458Sdfr	while (count--)
9866458Sdfr		*p++ = inb(port);
9966458Sdfr}
10066458Sdfr
10166458Sdfrstatic __inline void
10266458Sdfrinsw(u_int port, void *addr, size_t count)
10366458Sdfr{
10466458Sdfr	u_int16_t *p = addr;
10566458Sdfr	while (count--)
10666458Sdfr		*p++ = inw(port);
10766458Sdfr}
10866458Sdfr
10966458Sdfrstatic __inline void
11066458Sdfrinsl(u_int port, void *addr, size_t count)
11166458Sdfr{
11266458Sdfr	u_int32_t *p = addr;
11366458Sdfr	while (count--)
11466458Sdfr		*p++ = inl(port);
11566458Sdfr}
11666458Sdfr
11766458Sdfrstatic __inline void
11866458Sdfroutb(u_int port, u_int8_t data)
11966458Sdfr{
12083511Sdfr	volatile u_int8_t *p = ia64_port_address(port);
12183511Sdfr	*p = data;
12283511Sdfr	ia64_mf_a();
12383511Sdfr	ia64_mf();
12466458Sdfr}
12566458Sdfr
12666458Sdfrstatic __inline void
12766458Sdfroutw(u_int port, u_int16_t data)
12866458Sdfr{
12983511Sdfr	volatile u_int16_t *p = ia64_port_address(port);
13083511Sdfr	*p = data;
13183511Sdfr	ia64_mf_a();
13283511Sdfr	ia64_mf();
13366458Sdfr}
13466458Sdfr
13566458Sdfrstatic __inline void
13666458Sdfroutl(u_int port, u_int32_t data)
13766458Sdfr{
13883511Sdfr	volatile u_int32_t *p = ia64_port_address(port);
13983511Sdfr	*p = data;
14083511Sdfr	ia64_mf_a();
14183511Sdfr	ia64_mf();
14266458Sdfr}
14366458Sdfr
14466458Sdfrstatic __inline void
14566458Sdfroutsb(u_int port, const void *addr, size_t count)
14666458Sdfr{
14766458Sdfr	const u_int8_t *p = addr;
14866458Sdfr	while (count--)
14966458Sdfr		outb(port, *p++);
15066458Sdfr}
15166458Sdfr
15266458Sdfrstatic __inline void
15366458Sdfroutsw(u_int port, const void *addr, size_t count)
15466458Sdfr{
15566458Sdfr	const u_int16_t *p = addr;
15666458Sdfr	while (count--)
15766458Sdfr		outw(port, *p++);
15866458Sdfr}
15966458Sdfr
16066458Sdfrstatic __inline void
16166458Sdfroutsl(u_int port, const void *addr, size_t count)
16266458Sdfr{
16366458Sdfr	const u_int32_t *p = addr;
16466458Sdfr	while (count--)
16566458Sdfr		outl(port, *p++);
16666458Sdfr}
16766458Sdfr
16866458Sdfrstatic __inline u_int8_t
16966458Sdfrreadb(u_int addr)
17066458Sdfr{
17183836Sdfr	volatile u_int8_t *p = ia64_memory_address(addr);
17283836Sdfr	u_int8_t v = *p;
17383836Sdfr	ia64_mf_a();
17483836Sdfr	ia64_mf();
17583836Sdfr	return v;
17666458Sdfr}
17766458Sdfr
17866458Sdfrstatic __inline u_int16_t
17966458Sdfrreadw(u_int addr)
18066458Sdfr{
18183836Sdfr	volatile u_int16_t *p = ia64_memory_address(addr);
18283836Sdfr	u_int16_t v = *p;
18383836Sdfr	ia64_mf_a();
18483836Sdfr	ia64_mf();
18583836Sdfr	return v;
18666458Sdfr}
18766458Sdfr
18866458Sdfrstatic __inline u_int32_t
18966458Sdfrreadl(u_int addr)
19066458Sdfr{
19183836Sdfr	volatile u_int32_t *p = ia64_memory_address(addr);
19283836Sdfr	u_int32_t v = *p;
19383836Sdfr	ia64_mf_a();
19483836Sdfr	ia64_mf();
19583836Sdfr	return v;
19666458Sdfr}
19766458Sdfr
19866458Sdfrstatic __inline void
19966458Sdfrwriteb(u_int addr, u_int8_t data)
20066458Sdfr{
20183836Sdfr	volatile u_int8_t *p = ia64_memory_address(addr);
20283836Sdfr	*p = data;
20383836Sdfr	ia64_mf_a();
20483836Sdfr	ia64_mf();
20566458Sdfr}
20666458Sdfr
20766458Sdfrstatic __inline void
20866458Sdfrwritew(u_int addr, u_int16_t data)
20966458Sdfr{
21083836Sdfr	volatile u_int16_t *p = ia64_memory_address(addr);
21183836Sdfr	*p = data;
21283836Sdfr	ia64_mf_a();
21383836Sdfr	ia64_mf();
21466458Sdfr}
21566458Sdfr
21666458Sdfrstatic __inline void
21766458Sdfrwritel(u_int addr, u_int32_t data)
21866458Sdfr{
21983836Sdfr	volatile u_int32_t *p = ia64_memory_address(addr);
22083836Sdfr	*p = data;
22183836Sdfr	ia64_mf_a();
22283836Sdfr	ia64_mf();
22366458Sdfr}
22466458Sdfr
22566458Sdfrstatic __inline void
22666458Sdfrdisable_intr(void)
22766458Sdfr{
22866458Sdfr	__asm __volatile ("rsm psr.i;;");
22966458Sdfr}
23066458Sdfr
23166458Sdfrstatic __inline void
23266458Sdfrenable_intr(void)
23366458Sdfr{
23466458Sdfr	__asm __volatile (";; ssm psr.i;; srlz.d");
23566458Sdfr}
23666458Sdfr
23774897Sjhbstatic __inline critical_t
23874897Sjhbcritical_enter(void)
23966458Sdfr{
24074897Sjhb	critical_t psr;
24174897Sjhb
24266458Sdfr	__asm __volatile ("mov %0=psr;;" : "=r" (psr));
24374897Sjhb	disable_intr();
24474897Sjhb	return (psr);
24566458Sdfr}
24666458Sdfr
24766458Sdfrstatic __inline void
24874897Sjhbcritical_exit(critical_t psr)
24966458Sdfr{
25066458Sdfr	__asm __volatile ("mov psr.l=%0;; srlz.d" :: "r" (psr));
25166458Sdfr}
25266458Sdfr
25366458Sdfr#endif /* _KERNEL */
25466458Sdfr
25566458Sdfr#endif /* !_MACHINE_CPUFUNC_H_ */
256