blob: 729938c3292c36ac5694db30ea91030b5cd36006 [file] [log] [blame]
/*
* Copyright (c) 2012, The Linux Foundation. All rights reserved.
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
* above copyright notice and this permission notice appear in all copies.
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef _SHARED_FUNC_H
#define _SHARED_FUNC_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#define SW_RTN_ON_ERROR(rtn) \
do { if (rtn != SW_OK) return(rtn); } while(0);
#define SW_OUT_ON_ERROR(rtn) \
do { \
if (rtn != SW_OK) { \
rv = rtn; \
goto out;\
} \
} while(0);
#define SW_CNTU_ON_ERROR_AND_COND1_OR_GOTO_OUT(rtn, cond1) \
{ \
if ((rtn != SW_OK)) { \
if (rtn == cond1) \
continue; \
else \
goto out; \
} \
}
#define SW_RTN_ON_ERROR_EXCEPT_COND1(rtn, cond1) \
do { \
if ((rtn != SW_OK) && (rtn != cond1)) \
return rtn; \
}while(0);
#define SW_RTN_ON_NULL(op) \
do { \
if ((op) == NULL) \
return SW_NOT_INITIALIZED;\
}while(0);
/* register functions */
#define SW_BIT_MASK_U32(nr) (~(0xFFFFFFFF << (nr)))
#define SW_FIELD_MASK_U32(offset, len) \
((SW_BIT_MASK_U32(len) << (offset)))
#define SW_FIELD_MASK_NOT_U32(offset,len) \
(~(SW_BIT_MASK_U32(len) << (offset)))
#define SW_FIELD_2_REG(field_val, bit_offset) \
(field_val << (bit_offset) )
#define SW_REG_2_FIELD(reg_val, bit_offset, field_len) \
(((reg_val) >> (bit_offset)) & ((1 << (field_len)) - 1))
#define SW_REG_SET_BY_FIELD_U32(reg_value, field_value, bit_offset, field_len)\
do { \
(reg_value) = \
(((reg_value) & SW_FIELD_MASK_NOT_U32((bit_offset),(field_len))) \
| (((field_value) & SW_BIT_MASK_U32(field_len)) << (bit_offset)));\
} while (0)
#define SW_FIELD_GET_BY_REG_U32(reg_value, field_value, bit_offset, field_len)\
do { \
(field_value) = \
(((reg_value) >> (bit_offset)) & SW_BIT_MASK_U32(field_len)); \
} while (0)
#define SW_SWAP_BITS_U8(x) \
((((x)&0x80)>>7) | (((x)&0x40)>>5) | (((x)&0x20)>>3) | (((x)&0x10)>>1) \
|(((x)&0x1)<<7) | (((x)&0x2)<<5) | (((x)&0x4)<<3) |(((x)&0x8)<<1) )
#define SW_OFFSET_U8_2_U16(byte_offset) ((byte_offset) >> 1)
#define SW_OFFSET_U16_2_U8(word16_offset) ((word16_offset) << 1)
#define SW_OFFSET_BIT_2_U8_ALIGN16(bit_offset) (((bit_offset) / 16) * 2)
#define SW_SET_REG_BY_FIELD(reg, field, field_value, reg_value) \
SW_REG_SET_BY_FIELD_U32(reg_value, field_value, reg##_##field##_BOFFSET, \
reg##_##field##_BLEN)
#define SW_GET_FIELD_BY_REG(reg, field, field_value, reg_value) \
SW_FIELD_GET_BY_REG_U32(reg_value, field_value, reg##_##field##_BOFFSET, \
reg##_##field##_BLEN)
/* port bitmap functions */
#define SW_IS_PBMP_MEMBER(pbm, port) ((pbm & (1 << port)) ? A_TRUE: A_FALSE)
#define SW_IS_PBMP_EQ(pbm0, pbm1) ((pbm0 == pbm1) ? A_TRUE: A_FALSE)
#define SW_PBMP_AND(pbm0, pbm1) ((pbm0) &= (pbm1))
#define SW_PBMP_OR(pbm0, pbm1) ((pbm0) |= (pbm1))
#define SW_IS_PBMP_INCLUDE(pbm0, pbm1) \
((pbm1 == SW_PBMP_AND(pbm0, pbm1)) ? A_TRUE: A_FALSE)
#define SW_PBMP_CLEAR(pbm) ((pbm) = 0)
#define SW_PBMP_ADD_PORT(pbm, port) ((pbm) |= (1U << (port)))
#define SW_PBMP_DEL_PORT(pbm,port) ((pbm) &= ~(1U << (port)))
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _SHARED_FUNC_H */