/*-
* Copyright (c) 2011 Robert N. M. Watson
* All rights reserved.
*
* This software was developed by SRI International and the University of
* Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
* ("CTSRD"), as part of the DARPA CRASH research programme.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
#ifndef _MIPS_H_
#define _MIPS_H_
/*
* 64-bit MIPS types.
*/
#if 0
typedef unsigned long register_t; /* 64-bit MIPS register */
#endif
typedef unsigned long paddr_t; /* Physical address */
typedef unsigned long vaddr_t; /* Virtual address */
#if 0
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long uint64_t;
#endif
/*
* MIPS address space layout.
*/
#define MIPS_XKPHYS_UNCACHED_BASE 0x9000000000000000
#define MIPS_XKPHYS_CACHED_NC_BASE 0x9800000000000000
static inline vaddr_t
mips_phys_to_cached(paddr_t phys)
{
return (phys | MIPS_XKPHYS_CACHED_NC_BASE);
}
static inline vaddr_t
mips_phys_to_uncached(paddr_t phys)
{
return (phys | MIPS_XKPHYS_UNCACHED_BASE);
}
/*
* Endian conversion routines for use in I/O -- most Altera devices are little
* endian, but our processor is big endian.
*/
static inline uint16_t
byteswap16(uint16_t v)
{
return ((v & 0xff00) >> 8 | (v & 0xff) << 8);
}
static inline uint32_t
byteswap32(uint32_t v)
{
return ((v & 0xff000000) >> 24 | (v & 0x00ff0000) >> 8 |
(v & 0x0000ff00) << 8 | (v & 0x000000ff) << 24);
}
/*
* MIPS simple I/O routines -- arguments are virtual addresses so that the
* caller can determine required caching properties.
*/
static inline uint8_t
mips_ioread_uint8(vaddr_t vaddr)
{
uint8_t v;
__asm__ __volatile__ ("lb %0, 0(%1)" : "=r" (v) : "r" (vaddr));
return (v);
}
static inline void
mips_iowrite_uint8(vaddr_t vaddr, uint8_t v)
{
__asm__ __volatile__ ("sb %0, 0(%1)" : : "r" (v), "r" (vaddr));
}
static inline uint32_t
mips_ioread_uint32(vaddr_t vaddr)
{
uint32_t v;
__asm__ __volatile__ ("lw %0, 0(%1)" : "=r" (v) : "r" (vaddr));
return (v);
}
static inline void
mips_iowrite_uint32(vaddr_t vaddr, uint32_t v)
{
__asm__ __volatile__ ("sw %0, 0(%1)" : : "r" (v), "r" (vaddr));
}
/*
* Little-endian versions of 32-bit I/O routines.
*/
static inline uint32_t
mips_ioread_uint32le(vaddr_t vaddr)
{
return (byteswap32(mips_ioread_uint32(vaddr)));
}
static inline void
mips_iowrite_uint32le(vaddr_t vaddr, uint32_t v)
{
mips_iowrite_uint32(vaddr, byteswap32(v));
}
/*
* Coprocessor 0 interfaces.
*/
static inline register_t
cp0_count_get(void)
{
register_t count;
__asm__ __volatile__ ("dmfc0 %0, $9" : "=r" (count));
return (count);
}
#endif