cpufunc.h revision 114208
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 114208 2003-04-29 09:50:03Z marcel $
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>
3696912Smarcel#include <machine/vmparam.h>
3766458Sdfr
3893264Sdillonstruct thread;
3988088Sjhb
4066458Sdfr#ifdef __GNUC__
4166458Sdfr
4266458Sdfrstatic __inline void
4366458Sdfrbreakpoint(void)
4466458Sdfr{
4566458Sdfr	__asm __volatile("break 0x80100"); /* XXX use linux value */
4666458Sdfr}
4766458Sdfr
4866458Sdfr#endif
4966458Sdfr
50114208Smarcelextern uint64_t ia64_port_base;
51114208Smarcel#define	__MEMIO_ADDR(x)		(__volatile void*)(IA64_PHYS_TO_RR6(x))
52114208Smarcel#define	__PIO_ADDR(x)		(__volatile void*)(ia64_port_base |	\
53114208Smarcel	(((x) & 0xFFFC) << 10) | ((x) & 0xFFF))
5483511Sdfr
55114208Smarcel/*
56114208Smarcel * I/O port reads with ia32 semantics.
57114208Smarcel */
58114208Smarcelstatic __inline uint8_t
59114208Smarcelinb(unsigned int port)
6083511Sdfr{
61114208Smarcel	__volatile uint8_t *p;
62114208Smarcel	uint8_t v;
63114208Smarcel	p = __PIO_ADDR(port);
6483511Sdfr	ia64_mf();
65114208Smarcel	v = *p;
66114208Smarcel	ia64_mf_a();
67114208Smarcel	ia64_mf();
68114208Smarcel	return (v);
6966458Sdfr}
7066458Sdfr
71114208Smarcelstatic __inline uint16_t
72114208Smarcelinw(unsigned int port)
7366458Sdfr{
74114208Smarcel	__volatile uint16_t *p;
75114208Smarcel	uint16_t v;
76114208Smarcel	p = __PIO_ADDR(port);
7783511Sdfr	ia64_mf();
78114208Smarcel	v = *p;
79114208Smarcel	ia64_mf_a();
80114208Smarcel	ia64_mf();
81114208Smarcel	return (v);
8266458Sdfr}
8366458Sdfr
84114208Smarcelstatic __inline uint32_t
85114208Smarcelinl(unsigned int port)
8666458Sdfr{
87114208Smarcel	volatile uint32_t *p;
88114208Smarcel	uint32_t v;
89114208Smarcel	p = __PIO_ADDR(port);
9083511Sdfr	ia64_mf();
91114208Smarcel	v = *p;
92114208Smarcel	ia64_mf_a();
93114208Smarcel	ia64_mf();
94114208Smarcel	return (v);
9566458Sdfr}
9666458Sdfr
9766458Sdfrstatic __inline void
98114208Smarcelinsb(unsigned int port, void *addr, size_t count)
9966458Sdfr{
100114208Smarcel	uint8_t *buf = addr;
10166458Sdfr	while (count--)
102114208Smarcel		*buf++ = inb(port);
10366458Sdfr}
10466458Sdfr
10566458Sdfrstatic __inline void
106114208Smarcelinsw(unsigned int port, void *addr, size_t count)
10766458Sdfr{
108114208Smarcel	uint16_t *buf = addr;
10966458Sdfr	while (count--)
110114208Smarcel		*buf++ = inw(port);
11166458Sdfr}
11266458Sdfr
11366458Sdfrstatic __inline void
114114208Smarcelinsl(unsigned int port, void *addr, size_t count)
11566458Sdfr{
116114208Smarcel	uint32_t *buf = addr;
11766458Sdfr	while (count--)
118114208Smarcel		*buf++ = inl(port);
11966458Sdfr}
12066458Sdfr
12166458Sdfrstatic __inline void
122114208Smarceloutb(unsigned int port, uint8_t data)
12366458Sdfr{
124114208Smarcel	volatile uint8_t *p;
125114208Smarcel	p = __PIO_ADDR(port);
12683511Sdfr	ia64_mf();
12783511Sdfr	*p = data;
128114208Smarcel	ia64_mf_a();
12983511Sdfr	ia64_mf();
13066458Sdfr}
13166458Sdfr
13266458Sdfrstatic __inline void
133114208Smarceloutw(unsigned int port, uint16_t data)
13466458Sdfr{
135114208Smarcel	volatile uint16_t *p;
136114208Smarcel	p = __PIO_ADDR(port);
13783511Sdfr	ia64_mf();
13883836Sdfr	*p = data;
139114208Smarcel	ia64_mf_a();
14083836Sdfr	ia64_mf();
14166458Sdfr}
14266458Sdfr
14366458Sdfrstatic __inline void
144114208Smarceloutl(unsigned int port, uint32_t data)
14566458Sdfr{
146114208Smarcel	volatile uint32_t *p;
147114208Smarcel	p = __PIO_ADDR(port);
14883836Sdfr	ia64_mf();
14983836Sdfr	*p = data;
150114208Smarcel	ia64_mf_a();
15183836Sdfr	ia64_mf();
15266458Sdfr}
15366458Sdfr
15466458Sdfrstatic __inline void
155114208Smarceloutsb(unsigned int port, const void *addr, size_t count)
15684581Smarcel{
157114208Smarcel	const uint8_t *buf = addr;
15884581Smarcel	while (count--)
159114208Smarcel		outb(port, *buf++);
16084581Smarcel}
16184581Smarcel
16284581Smarcelstatic __inline void
163114208Smarceloutsw(unsigned int port, const void *addr, size_t count)
16484581Smarcel{
165114208Smarcel	const uint16_t *buf = addr;
16684581Smarcel	while (count--)
167114208Smarcel		outw(port, *buf++);
16884581Smarcel}
16984581Smarcel
17084581Smarcelstatic __inline void
171114208Smarceloutsl(unsigned int port, const void *addr, size_t count)
17284581Smarcel{
173114208Smarcel	const uint32_t *buf = addr;
17484581Smarcel	while (count--)
175114208Smarcel		outl(port, *buf++);
17684581Smarcel}
17784581Smarcel
17884581Smarcelstatic __inline void
17966458Sdfrdisable_intr(void)
18066458Sdfr{
181114208Smarcel	__asm __volatile ("rsm psr.i");
18266458Sdfr}
18366458Sdfr
18466458Sdfrstatic __inline void
18566458Sdfrenable_intr(void)
18666458Sdfr{
187114208Smarcel	__asm __volatile ("ssm psr.i;; srlz.d");
18866458Sdfr}
18966458Sdfr
19092870Sdfrstatic __inline register_t
19192781Sdfrintr_disable(void)
19266458Sdfr{
19392870Sdfr	register_t psr;
194114208Smarcel	__asm __volatile ("mov %0=psr;;" : "=r"(psr));
19574897Sjhb	disable_intr();
19674897Sjhb	return (psr);
19766458Sdfr}
19866458Sdfr
19966458Sdfrstatic __inline void
20092805Sdfrintr_restore(critical_t psr)
20166458Sdfr{
202114208Smarcel	__asm __volatile ("mov psr.l=%0;; srlz.d" :: "r"(psr));
20366458Sdfr}
20466458Sdfr
20566458Sdfr#endif /* _KERNEL */
20666458Sdfr
20766458Sdfr#endif /* !_MACHINE_CPUFUNC_H_ */
208