/* SPDX-License-Identifier: LGPL-2.1-only OR BSD-3-Clause */
/******************************************************************************
 *
 * This file is provided under a dual license.  When you use or
 * distribute this software, you may choose to be licensed under
 * version 2.1 of the GNU Lesser General Public License
 * ("LGPLv2.1 License") or BSD License.
 *
 * LGPLv2.1 License
 *
 * Copyright(C) 2019 MediaTek Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of version 2.1 of the GNU Lesser General Public
 * License as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html for more
 * details.
 *
 * BSD LICENSE
 *
 * Copyright(C) 2019 MediaTek Inc.
 * All rights reserved.
 *
 * 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 the copyright holder 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
 * HOLDER 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.
 *
 *****************************************************************************/

/*-----------------------------------------------------------------------------
 * $RCSfile: os.h,v $
 * $Revision: #1 $
 * $Date: 2015/11/10 $
 * $Author: dtvbm11 $
 *
 * Description:
 *         This header file contains handle specific definitions which are
 *         known to the whole Middleware.
 *---------------------------------------------------------------------------*/

#ifndef _OS_H_
#define _OS_H_


/*-----------------------------------------------------------------------------
                    include files
 ----------------------------------------------------------------------------*/

#include "x_common.h"
#include "handle.h"
#include "dbg.h"

#include "x_driver_os.h"        /* driver-OS header file */


/*-----------------------------------------------------------------------------
                    macros, defines, typedefs, enums
 ----------------------------------------------------------------------------*/

#define GET_LINK_NEXT(r, q)         r = (q)->pt_next
#define SET_LINK_NEXT(q, r)         (q)->pt_next = r
#define SET_LINK_PREV(q, r)         (q)->pt_prev = r
#define GET_LINK_HEAD(q, h)         q = h
#define SET_LINK_HEAD(h, q)         h = q
#define GET_LINK_TAIL(q, t)         q = t
#define SET_LINK_TAIL(t, q)         t = q
#define LINK_IS_EMPTY(h, empty)     h == empty
#define LINK_NOT_EMPTY(h, empty)    h != empty


/* debug values of OS thread */
#define DBG_THREAD_NOT_INIT             ((UINT32) 0x00000001)
#define DBG_THREAD_NO_HANDLE            ((UINT32) 0x00000002)
#define DBG_THREAD_NO_OBJECT            ((UINT32) 0x00000004)
#define DBG_THREAD_NOT_EXIT             ((UINT32) 0x00000008)

/* debug values of OS memory */
#define DBG_MEM_ADDR_NOT_ALIGNED        ((UINT32) 0x00000001)
#define DBG_MEM_FRONT_END_CORRUPT       ((UINT32) 0x00000002)
#define DBG_MEM_BACK_END_CORRUPT        ((UINT32) 0x00000004)
#define DBG_MEM_BUCKET_INDEX_CORRUPT    ((UINT32) 0x00000008)
#define DBG_MEM_PART_INDEX_CORRUPT      ((UINT32) 0x00000010)
#define DBG_MEM_FREED                   ((UINT32) 0x00000020)
#define DBG_MEM_PART_CORRUPT            ((UINT32) 0x00000040)

/* debug values of OS semaphore */
#define DBG_SEMA_LOCK_FAIL              ((UINT32) 0x00000001)
#define DBG_SEMA_UNLOCK_FAIL            ((UINT32) 0x00000002)

/* debug values for Autofree registeration.*/
#define DBG_CANNOT_SET_AUTOFREE     ((UINT32) 0x00000001)

#define OS_DBG_ABORT(_cat, _val) \
    dbg_abort((DBG_MOD_OS | _cat | _val))

#define HR_TO_OSR(_hr) \
    (((_hr) == HR_OUT_OF_HANDLES) ? OSR_OUT_OF_HANDLES : \
      (((_hr) == HR_NOT_INIT) ? OSR_NOT_INIT : OSR_INV_ARG))

/*-----------------------------------------------------------------------------
                    functions declarations
 ----------------------------------------------------------------------------*/

extern INT32 os_init (const VOID*  pv_address,
                      SIZE_T       z_size);

extern INT32 os_reg_cli(VOID);

extern UINT32 os_get_sys_tick (VOID);
extern UINT32 os_get_fine_tick (VOID);

extern INT32 mem_part_delete (HANDLE_T);

extern VOID os_set_sys_td (TIME_T  t_td_sec,
                           UINT16  ui2_td_msec);
extern TIME_T os_get_sys_td (UINT16*  pui2_td_msec);

extern UINT32 generate_crc32(const UINT8   *pui1_data,
                             SIZE_T        z_size);

extern BOOL check_crc32(const UINT8   *pui1_data,
                        SIZE_T        z_size);


#endif /* _OS_H_ */

