/* 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.
 *
 *****************************************************************************/
#ifndef VDPOMX_DRV_IF_H
#define VDPOMX_DRV_IF_H

/*=============================================================================
 *                              Include Files
 *===========================================================================*/
#include <x_typedef.h>
#include <linux/ioctl.h>

#ifdef __cplusplus
extern "C" {
#endif


/*=============================================================================
 *                              Definition
 *===========================================================================*/
/**Video plane region (source/output).
*/
typedef struct
{
    UINT32 u4X;        	///< start position in x direction (u4X/10000 = start pixel/total pixel)
    UINT32 u4Y;        	///< start position in y direction (u4Y/10000 = start pixel/total pixel)
    UINT32 u4Width;  	///< width in percentage (u4Width/10000 = region width/total width)
    UINT32 u4Height; 	///< height in percentage (u4Width/10000 = region height/total width)
}VDPOMX_REGION_T;

/**Video plane overscan region.
*/
typedef struct
{
    UINT32 u4Top;      	///<overscan percentage on top side (u4Top%)
    UINT32 u4Bottom;	///<overscan percentage on top side (u4Bottom%)
    UINT32 u4Left;     	///<overscan percentage on top side (u4Left%)
    UINT32 u4Right;   	///<overscan percentage on top side (u4Right%)
}VDPOMX_OVERSCAN_REGION_T;

typedef struct
{
    UCHAR  ucChId ;
    VDPOMX_REGION_T rRegion ;
}VDPOMX_SET_REGION_PARM_T;

typedef struct
{
    UCHAR  ucChId ;
    BOOL    fgOnOff ;
}VDPOMX_SET_CHANNEL_PARM_T;

typedef struct
{
    UCHAR ucChId;
    UINT32 u4Addr;
}VDPOMX_SET_DISPLAY_BUF_PARM_T;

typedef struct
{
    UCHAR ucChId;
    BOOL fgFree;
}VDPOMX_GET_CHANNEL_FREE_PARM_T;

typedef struct
{
    UCHAR ucChId;
    UINT32 u4Buf;
    BOOL fgLocked;
}VDPOMX_GET_BUF_LOCKED_PARM_T;

typedef struct
{
    UCHAR ucChId;
    UINT32 u4AudioHwSync;
}VDPOMX_TUNNEL_CONNECT_AUD_PARM_T;

typedef struct
{
    UCHAR ucChId;
    UCHAR ucVdecId;
    UCHAR ucPort;
}VDPOMX_CONNECT_VDEC_PARM_T;

typedef struct
{
    UCHAR ucChId;
    UINT64 u8Addr;
    UINT32 u4Width;
    UINT32 u4Height;
}VDPOMX_GET_FB_WIDTH_HEIGHT_PARM_T;

enum DISP_CHANNEL
{
    VDP_DISP_CHANNEL_0,
    VDP_DISP_CHANNEL_1,
    VDP_DISP_CHANNEL_NS
};

#define VDPOMX_DEVICE "/dev/vdpomx"

#define VDPOMX_IOC_MAGIC    'k'                                                                                
#define VDPOMX_SET_OUT_REGION              _IOWR(VDPOMX_IOC_MAGIC, 0, long)
#define VDPOMX_SET_SRC_REGION              _IOWR(VDPOMX_IOC_MAGIC, 1, long)
#define VDPOMX_SET_OUT_CHANNEL             _IOWR(VDPOMX_IOC_MAGIC, 2, long)                                    
#define VDPOMX_SET_DISPLAY_BUF             _IOWR(VDPOMX_IOC_MAGIC, 3, long)                                    
#define VDPOMX_GET_CHANNEL_FREE            _IOWR(VDPOMX_IOC_MAGIC, 4, long)
#define VDPOMX_GET_BUF_LOCKED              _IOWR(VDPOMX_IOC_MAGIC, 5, long)
// #define VDPOMX_TUNNEL_CONNECT_AUDIO        _IOWR(VDPOMX_IOC_MAGIC, 6, long) obsolete
#define VDPOMX_CONNECT_VDEC                _IOWR(VDPOMX_IOC_MAGIC, 7, long)
#define VDPOMX_SRM_SETTVMODE               _IOWR(VDPOMX_IOC_MAGIC, 8, long)
#define VDPOMX_GET_FB_WIDTH_HEIGHT         _IOWR(VDPOMX_IOC_MAGIC, 9, long)

#define VDPOMX_OK                0
#define VDPOMX_ERR            (-1)

#ifdef __KERNEL__
#define USR_SPACE_ACCESS_VALIDATE_ARG(arg,type)                 \
    if (!access_ok(VERIFY_READ, (void __user *)arg,         \
                   sizeof(type)))              \
    {                                                       \
        printk("vdpomx_ioctl argument error\n");     \
        return -1;                                          \
    }                                                           

#define COPY_TO_USER_ARG(ArgUsr, ArgKernel,type)              \
    if (copy_to_user((void __user *)ArgUsr, &ArgKernel,   \
                       sizeof(type)))          \
    {                                                       \
        printk("vdpomx_ioctl argument error\n");      \
        return -1;                                          \
    }
#define COPY_FROM_USER_ARG(ArgUsr, ArgKernel,type)             \
        if (copy_from_user(&ArgKernel, (void __user *)ArgUsr,   \
                           sizeof(type)))                        \
        {                                                       \
            printk("vdpomx_ioctl argument error\n");      \
            return -1;                                          \
        }       
#endif


/*=============================================================================
 *                             Function Declaration
 *===========================================================================*/

#ifdef __cplusplus
}
#endif

#endif /* VDPOMX_DRV_IF_H */

