/*
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* 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 the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Description:
*/
#ifndef __VIDEO_FIRMWARE_FORMAT_
#define __VIDEO_FIRMWARE_FORMAT_

#include <linux/slab.h>

/* example: #define VIDEO_DEC_AV1  TAG('A', 'V', '1', '-')*/
#define TAG(a, b, c, d)\
	((a << 24) | (b << 16) | (c << 8) | d)

/* fws define */
#define VIDEO_DEC_MPEG12		(0)
#define VIDEO_DEC_MPEG4_3		(1)
#define VIDEO_DEC_MPEG4_4		(2)
#define VIDEO_DEC_MPEG4_5		(3)
#define VIDEO_DEC_H263			(4)
#define VIDEO_DEC_MJPEG			(5)
#define VIDEO_DEC_MJPEG_MULTI		(6)
#define VIDEO_DEC_REAL_V8		(7)
#define VIDEO_DEC_REAL_V9		(8)
#define VIDEO_DEC_VC1			(9)
#define VIDEO_DEC_AVS			(10)
#define VIDEO_DEC_H264			(11)
#define VIDEO_DEC_H264_4k2K		(12)
#define VIDEO_DEC_H264_4k2K_SINGLE	(13)
#define VIDEO_DEC_H264_MVC		(14)
#define VIDEO_DEC_H264_MULTI		(15)
#define VIDEO_DEC_HEVC			(16)
#define VIDEO_DEC_HEVC_MMU		(17)
#define VIDEO_DEC_VP9			(18)
#define VIDEO_DEC_VP9_MMU		(19)
#define VIDEO_ENC_H264			(20)
#define VIDEO_ENC_JPEG			(21)
#define VIDEO_DEC_H264_MULTI_MMU	(23)
#define VIDEO_DEC_HEVC_G12A		(24)
#define VIDEO_DEC_VP9_G12A		(25)
#define VIDEO_DEC_AVS2			(26)
#define VIDEO_DEC_AVS2_MMU		(27)
#define VIDEO_DEC_AVS_GXM		(28)
#define VIDEO_DEC_AVS_NOCABAC		(29)
#define VIDEO_DEC_H264_MULTI_GXM	(30)
#define VIDEO_DEC_H264_MVC_GXM		(31)
#define VIDEO_DEC_VC1_G12A		(32)
#define VIDEO_DEC_MPEG12_MULTI		TAG('M', '1', '2', 'M')
#define VIDEO_DEC_MPEG4_4_MULTI		TAG('M', '4', '4', 'M')
#define VIDEO_DEC_MPEG4_5_MULTI		TAG('M', '4', '5', 'M')
#define VIDEO_DEC_H263_MULTI		TAG('2', '6', '3', 'M')
#define VIDEO_DEC_HEVC_MMU_SWAP		TAG('2', '6', '5', 'S')
#define VIDEO_DEC_AVS_MULTI		TAG('A', 'V', 'S', 'M')
#define VIDEO_DEC_AV1_MMU		TAG('A', 'V', '1', 'M')

/* ... */
#define FIRMWARE_MAX			(UINT_MAX)

#define VIDEO_PACKAGE			(0)
#define VIDEO_FW_FILE			(1)

#define VIDEO_DECODE			(0)
#define VIDEO_ENCODE			(1)
#define VIDEO_MISC			(2)

#define OPTEE_VDEC_LEGENCY		(0)
#define OPTEE_VDEC			(1)
#define OPTEE_VDEC_HEVC			(2)
#define OPTEE_VDEC_HCDEC			(3)

struct format_name_s {
	unsigned int format;
	const char *name;
};

struct cpu_type_s {
	int type;
	const char *name;
};

const char *get_fw_format_name(unsigned int format);
unsigned int get_fw_format(const char *name);
int fw_get_cpu(const char *name);

#endif
