blob: 60887266dba21eef0a5ab334e5f6a352187dc004 [file] [log] [blame]
/*******************************************************************************
* Copyright (C) Marvell International Ltd. and its affiliates
*
* This software file (the "File") is owned and distributed by Marvell
* International Ltd. and/or its affiliates ("Marvell") under the following
* alternative licensing terms. Once you have made an election to distribute the
* File under one of the following license alternatives, please (i) delete this
* introductory statement regarding license alternatives, (ii) delete the two
* license alternatives that you have not elected to use and (iii) preserve the
* Marvell copyright notice above.
*
*******************************************************************************
* Marvell Commercial License Option
*
* If you received this File from Marvell and you have entered into a commercial
* license agreement (a "Commercial License") with Marvell, the File is licensed
* to you under the terms of the applicable Commercial License.
*
********************************************************************************
* Marvell GPL License Option
*
* If you received this File from Marvell, you may opt to use, redistribute and/or
* modify this File in accordance with the terms and conditions of the General
* Public License Version 2, June 1991 (the "GPL License"), a copy of which is
* available along with the File in the license.txt file or by writing to the Free
* Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
* on the worldwide web at http://www.gnu.org/licenses/gpl.txt.
*
* THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
* WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
* DISCLAIMED. The GPL License provides additional details about this warranty
* disclaimer.
********************************************************************************
* Marvell BSD License Option
*
* If you received this File from Marvell, you may opt to use, redistribute and/or
* modify this File under the following licensing terms.
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 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.
*
* Neither the name of Marvell nor the names of its contributors may be
* used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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.
*
*******************************************************************************/
#ifndef __GALOIS_COMMON_H__
#define __GALOIS_COMMON_H__
#include "galois_cfg.h"
#include "galois_type.h"
/*!
* Bit field definitions
*/
#define NO_BIT 0x00000000
#define BIT0 0x00000001
#define BIT1 0x00000002
#define BIT2 0x00000004
#define BIT3 0x00000008
#define BIT4 0x00000010
#define BIT5 0x00000020
#define BIT6 0x00000040
#define BIT7 0x00000080
#define BIT8 0x00000100
#define BIT9 0x00000200
#define BIT10 0x00000400
#define BIT11 0x00000800
#define BIT12 0x00001000
#define BIT13 0x00002000
#define BIT14 0x00004000
#define BIT15 0x00008000
#define BIT16 0x00010000
#define BIT17 0x00020000
#define BIT18 0x00040000
#define BIT19 0x00080000
#define BIT20 0x00100000
#define BIT21 0x00200000
#define BIT22 0x00400000
#define BIT23 0x00800000
#define BIT24 0x01000000
#define BIT25 0x02000000
#define BIT26 0x04000000
#define BIT27 0x08000000
#define BIT28 0x10000000
#define BIT29 0x20000000
#define BIT30 0x40000000
#define BIT31 0x80000000
/*!
* Handy sizes
*/
#define _1K 0x00000400
#define _2K 0x00000800
#define _4K 0x00001000
#define _8K 0x00002000
#define _16K 0x00004000
#define _32K 0x00008000
#define _64K 0x00010000
#define _128K 0x00020000
#define _256K 0x00040000
#define _512K 0x00080000
#define _1M 0x00100000
#define _2M 0x00200000
#define _4M 0x00400000
#define _8M 0x00800000
#define _16M 0x01000000
#define _32M 0x02000000
#define _64M 0x04000000
#define _128M 0x08000000
#define _256M 0x10000000
#define _512M 0x20000000
#define _1G 0x40000000
#define _2G 0x80000000
/*!
* CPU cache information
*/
#define CPU_I_CACHE_LINE_SIZE 32 /* 2do: replace 32 with linux core macro */
#define CPU_D_CACHE_LINE_SIZE 32 /* 2do: replace 32 with linux core macro */
/*!
* Data cache flush one line
*/
#if (defined(__LINUX_ARM))
# define mvOsCacheLineFlushInv(addr) \
do { \
__asm__ __volatile__ ("mcr p15, 0, %0, c7, c14, 1" : : "r" (addr)); \
} while (0)
# define mvOsCacheLineInv(addr) \
do { \
__asm__ __volatile__ ("mcr p15, 0, %0, c7, c6, 1" : : "r" (addr)); \
} while (0)
# define mvArmNop \
do { \
__asm__ __volatile__("nop"); \
} while (0)
#elif (defined(__VxWORKS_ARM))
# define mvOsCacheLineFlushInv(addr) \
do { \
_WRS_ASM("mcr p15, 0, %0, c7, c14, 1" : : "r" (addr)); \
} while (0)
# define mvOsCacheLineInv(addr) \
do { \
_WRS_ASM("mcr p15, 0, %0, c7, c6, 1" : : "r" (addr)); \
} while (0)
# define mvArmNop \
do { \
__WRS_ASM("nop"); \
} while (0)
#else /* __LINUX_ARM || __VxWORKS_ARM */
# define mvOsCacheLineFlushInv(addr) do ; while (0)
# define mvOsCacheLineInv(addr) do ; while (0)
# define mvArmNop do ; while (0)
#endif /* __LINUX_ARM || __VxWORKS_ARM */
/*!
* Swap tool
*/
/*!
* 16bit nibble swap. For example 0x1234 -> 0x2143
*/
#define MV_NIBBLE_SWAP_16BIT(X) (((X & 0xf) << 4) | ((X & 0xf0) >> 4) | ((X & 0xf00) << 4) | ((X & 0xf000) >> 4))
/*!
* 32bit nibble swap. For example 0x12345678 -> 0x21436587
*/
#define MV_NIBBLE_SWAP_32BIT(X) (((X & 0xf) << 4) | ((X & 0xf0) >> 4) | ((X & 0xf00) << 4) | ((X & 0xf000) >> 4) | \
((X & 0xf0000) << 4) | ((X & 0xf00000) >> 4) | ((X & 0xf000000) << 4) | ((X & 0xf0000000) >> 4))
/*!
* 16bit byte swap. For example 0x1122 -> 0x2211
*/
#define MV_BYTE_SWAP_16BIT(X) ((((X) & 0xff) << 8) | (((X) & 0xff00) >> 8))
/*!
* 32bit byte swap. For example 0x11223344 -> 0x44332211
*/
#define MV_BYTE_SWAP_32BIT(X) ((((X) & 0xff) << 24) | (((X) & 0xff00) << 8) | (((X) & 0xff0000) >> 8) | (((X) & 0xff000000) >> 24))
/*!
* 64bit byte swap. For example 0x11223344.55667788 -> 0x88776655.44332211
*/
#define MV_BYTE_SWAP_64BIT(X) ((MV_U64) ((((X) & 0xffULL) << 56) | (((X) & 0xff00ULL) << 40) | \
(((X) & 0xff0000ULL) << 24) | (((X) & 0xff000000ULL) << 8) | \
(((X) & 0xff00000000ULL) >> 8) | (((X) & 0xff0000000000ULL) >> 24) | \
(((X) & 0xff000000000000ULL) >> 40) | (((X) & 0xff00000000000000ULL) >> 56)))
/*!
* Endianess macros.
*/
#if (defined(__BIG_ENDIAN))
# define MV_16BIT_LE(X) MV_BYTE_SWAP_16BIT(X)
# define MV_32BIT_LE(X) MV_BYTE_SWAP_32BIT(X)
# define MV_64BIT_LE(X) MV_BYTE_SWAP_64BIT(X)
# define MV_16BIT_BE(X) (X)
# define MV_32BIT_BE(X) (X)
# define MV_64BIT_BE(X) (X)
#elif (defined(__LITTLE_ENDIAN))
# define MV_16BIT_LE(X) (X)
# define MV_32BIT_LE(X) (X)
# define MV_64BIT_LE(X) (X)
# define MV_16BIT_BE(X) MV_BYTE_SWAP_16BIT(X)
# define MV_32BIT_BE(X) MV_BYTE_SWAP_32BIT(X)
# define MV_64BIT_BE(X) MV_BYTE_SWAP_64BIT(X)
#else /* __BIG_ENDIAN || __LITTLE_ENDIAN */
# error "Endianess type not selected"
#endif /* __BIG_ENDIAN || __LITTLE_ENDIAN */
#endif /* __GALOIS_COMMON_H__ */