root/usr/src/uts/common/io/bnxe/577xx/drivers/common/include/cyclic_oper.h
/*******************************************************************************
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 *
 * Copyright 2014 QLogic Corporation
 * The contents of this file are subject to the terms of the
 * QLogic End User License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the License at
 * http://www.qlogic.com/Resources/Documents/DriverDownloadHelp/
 * QLogic_End_User_Software_License.txt
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 *
 * Module Description:
 *  This file should include pure ANSI C defines
 *
 * History:
 *    25/04/10 Shay Haroush        Inception.
 ******************************************************************************/
#ifndef CYCLIC_OPERATIONS
#define CYCLIC_OPERATIONS

/********       Cyclic Operators Macros ********/

#define _ABS_DIFF(x, y) ((x) > (y) ? (x) - (y) : (y) - (x))

static __inline u8_t _cyclic_lt(u32_t x, u32_t y, u32_t d)
{
        u32_t diff = _ABS_DIFF(x,y);
        return (diff < d) ? x < y : x > y;
}

static __inline u8_t _cyclic_le(u32_t x, u32_t y, u32_t d)
{
        u32_t diff = _ABS_DIFF(x,y);
        return (diff < d) ? x <= y : x >= y;
}

#define CYCLIC_LT_8(x, y)  (_cyclic_lt(x, y, 128))
#define CYCLIC_LT_16(x, y) (_cyclic_lt(x, y, 32768))
#define CYCLIC_LT_24(x, y) (_cyclic_lt(x, y, 8388608))
#define CYCLIC_LT_32(x, y) (_cyclic_lt(x, y, 2147483648))

#define CYCLIC_LE_8(x, y)  (_cyclic_le(x, y, 128))
#define CYCLIC_LE_16(x, y) (_cyclic_le(x, y, 32768))
#define CYCLIC_LE_24(x, y) (_cyclic_le(x, y, 8388608))
#define CYCLIC_LE_32(x, y) (_cyclic_le(x, y, 2147483648))

#define CYCLIC_GT_8(x, y)  (!(CYCLIC_LE_8(x, y)))
#define CYCLIC_GT_16(x, y) (!(CYCLIC_LE_16(x, y)))
#define CYCLIC_GT_24(x, y) (!(CYCLIC_LE_24(x, y)))
#define CYCLIC_GT_32(x, y) (!(CYCLIC_LE_32(x, y)))

#define CYCLIC_GE_8(x, y)  (!(CYCLIC_LT_8(x, y)))
#define CYCLIC_GE_16(x, y) (!(CYCLIC_LT_16(x, y)))
#define CYCLIC_GE_24(x, y) (!(CYCLIC_LT_24(x, y)))
#define CYCLIC_GE_32(x, y) (!(CYCLIC_LT_32(x, y)))

// bits = number of bits in x, y (i.e., sizeof_x)
#define CYCLIC_LT_BITS(x, y, bits)      _cyclic_lt(x, y, 1 << ((bits)-1))
#define CYCLIC_LE_BITS(x, y, bits)      _cyclic_le(x, y, 1 << ((bits)-1))
#define CYCLIC_GT_BITS(x, y, bits)      (!(CYCLIC_LE_BITS(x, y, bits)))
#define CYCLIC_GE_BITS(x, y, bits)      (!(CYCLIC_LT_BITS(x, y, bits)))

/********       End     Cyclic Operators Macros ********/

#endif // CYCLIC_OPERATIONS