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