/*
<:copyright-BRCM:2016:proprietary:standard

   Broadcom Proprietary and Confidential.(c) 2016 Broadcom
   All Rights Reserved

This program is the proprietary software of Broadcom Corporation and/or its
licensors, and may only be used, duplicated, modified or distributed pursuant
to the terms and conditions of a separate, written license agreement executed
between you and Broadcom (an "Authorized License").  Except as set forth in
an Authorized License, Broadcom grants no license (express or implied), right
to use, or waiver of any kind with respect to the Software, and Broadcom
expressly reserves all rights in and to the Software and all intellectual
property rights therein.  IF YOU HAVE NO AUTHORIZED LICENSE, THEN YOU HAVE
NO RIGHT TO USE THIS SOFTWARE IN ANY WAY, AND SHOULD IMMEDIATELY NOTIFY
BROADCOM AND DISCONTINUE ALL USE OF THE SOFTWARE.

Except as expressly set forth in the Authorized License,

1. This program, including its structure, sequence and organization,
    constitutes the valuable trade secrets of Broadcom, and you shall use
    all reasonable efforts to protect the confidentiality thereof, and to
    use this information only in connection with your use of Broadcom
    integrated circuit products.

2. TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS"
    AND WITH ALL FAULTS AND BROADCOM MAKES NO PROMISES, REPRESENTATIONS OR
    WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH
    RESPECT TO THE SOFTWARE.  BROADCOM SPECIFICALLY DISCLAIMS ANY AND
    ALL IMPLIED WARRANTIES OF TITLE, MERCHANTABILITY, NONINFRINGEMENT,
    FITNESS FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, ACCURACY OR
    COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR CORRESPONDENCE
    TO DESCRIPTION. YOU ASSUME THE ENTIRE RISK ARISING OUT OF USE OR
    PERFORMANCE OF THE SOFTWARE.

3. TO THE MAXIMUM EXTENT PERMITTED BY LAW, IN NO EVENT SHALL BROADCOM OR
    ITS LICENSORS BE LIABLE FOR (i) CONSEQUENTIAL, INCIDENTAL, SPECIAL,
    INDIRECT, OR EXEMPLARY DAMAGES WHATSOEVER ARISING OUT OF OR IN ANY
    WAY RELATING TO YOUR USE OF OR INABILITY TO USE THE SOFTWARE EVEN
    IF BROADCOM HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES;
    OR (ii) ANY AMOUNT IN EXCESS OF THE AMOUNT ACTUALLY PAID FOR THE
    SOFTWARE ITSELF OR U.S. $1, WHICHEVER IS GREATER. THESE LIMITATIONS
    SHALL APPLY NOTWITHSTANDING ANY FAILURE OF ESSENTIAL PURPOSE OF ANY
    LIMITED REMEDY.
:>
*/
#ifndef BCMOS_SYSTEM_H_
#define BCMOS_SYSTEM_H_

#include <limits.h>

#include "lib_types.h"
#include "lib_string.h"

#include "../bcmos_errno.h"
#include "../bcmos_types.h"
#include "../bcmos_endian.h"
#include "cfe_timer.h"
#include "lib_printf.h"

#define bcmos_printf printf

#define bcmos_usleep(x)                              \
                        do {                         \
                        cfe_usleep (x);              \
                        }                            \
                        while(0) 
/* Define bcmos_bool - the boolean type for bcmos - based on C99 standard boolean type */
#ifndef BCMOS_BOOLEAN
typedef _Bool bcmos_bool;
#define BCMOS_FALSE 0
#define BCMOS_TRUE 1
#endif

#define PERIPH_GENINT_REVID              0xffe00000
#define CHIP_REV_MASK                    0xFF
static inline unsigned int get_chip_revision(void)
{
    return *(volatile unsigned int*)PERIPH_GENINT_REVID & CHIP_REV_MASK;
} 

#define CHIP_REVISION_A0 0xA0
#define CHIP_REVISION_B0 0xB0

#ifdef SIMULATION_BUILD
#define GET_CHIP_REVISION CHIP_REVISION_A0
#else
extern uint32_t chip_revision;
#define GET_CHIP_REVISION (chip_revision != 0 ? chip_revision : (chip_revision = get_chip_revision()))
#endif


typedef uint16_t bcmos_fastlock;
#define BCMOS_FASTLOCK_INITIALIZER 0
#define bcmos_fastlock_lock(fastlock) (long)fastlock
#define bcmos_fastlock_unlock(fastlock, flags)  (void)flags

typedef uint16_t bcmos_mutex;
#define bcmos_mutex_create(mutex, flags, name)  
#define bcmos_mutex_lock(mutex)
#define bcmos_mutex_unlock(mutex)


#define BCM_SIZEOFARRAY(arr) (sizeof(arr)/sizeof(*arr))
#define BCM_SIZEOFFIELD(s, f) (sizeof(((s*)NULL)->f))
#define BCM_MEMZERO_STRUCT(ptr) memset(ptr, 0, sizeof(*(ptr)))
#define BCM_MEMCPY_ARRAY(dst, src) memcpy(dst, src, sizeof(dst))


#define BUG_ON_PRINT(condition, fmt, args...) \
    do \
    { \
        if (condition) \
        { \
            printf(fmt, ##args); \
            /* On one hand, don't let this task continue - it is likely to crash/create a system exception.
             * On the other hand, it mustn't do a busy loop - otherwise it can cause lower priority tasks to stop responding. */ \
            while (1) \
                bcmos_usleep(10000000); \
        } \
    } while (0)

#define BUG_ON(condition)      BUG_ON_PRINT((condition), "BUG in %s %d!\n", __FUNCTION__, __LINE__)
#define BUG()                  BUG_ON(1)
#define BUG_UNLESS(condition)  BUG_ON(!(condition))


#define BCMOS_TRACE_ERR(fmt, args...) \
    do \
    { \
        printf( fmt, ## args); \
   } while (0)


#define bcmos_vprintf printf
#define bcmos_calloc(s) KMALLOC((s), 0)

#endif
