/*
 * drivers/amlogic/media/common/arch/chips/chips.c
 *
 * Copyright (C) 2016 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.
 *
 */

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/vmalloc.h>
#include <linux/mm.h>

#include <linux/amlogic/media/utils/vformat.h>
#include <linux/amlogic/media/registers/cpu_version.h>
#include "../../stream_input/amports/amports_priv.h"
#include "../../frame_provider/decoder/utils/vdec.h"
#include "chips.h"
#include <linux/amlogic/media/utils/log.h>
#include <linux/amlogic/media/utils/vdec_reg.h>
#include "decoder_cpu_ver_info.h"

#define VIDEO_FIRMWARE_FATHER_NAME "video"

/*
 *#define MESON_CPU_MAJOR_ID_M6		0x16
 *#define MESON_CPU_MAJOR_ID_M6TV		0x17
 *#define MESON_CPU_MAJOR_ID_M6TVL	0x18
 *#define MESON_CPU_MAJOR_ID_M8		0x19
 *#define MESON_CPU_MAJOR_ID_MTVD		0x1A
 *#define MESON_CPU_MAJOR_ID_M8B		0x1B
 *#define MESON_CPU_MAJOR_ID_MG9TV	0x1C
 *#define MESON_CPU_MAJOR_ID_M8M2		0x1D
 *#define MESON_CPU_MAJOR_ID_GXBB		0x1F
 *#define MESON_CPU_MAJOR_ID_GXTVBB		0x20
 *#define MESON_CPU_MAJOR_ID_GXL		0x21
 *#define MESON_CPU_MAJOR_ID_GXM		0x22
 *#define MESON_CPU_MAJOR_ID_TXL		0x23
 */
struct type_name {

	int type;

	const char *name;
};
static const struct type_name cpu_type_name[] = {
	{AM_MESON_CPU_MAJOR_ID_M6, "m6"},
	{AM_MESON_CPU_MAJOR_ID_M6TV, "m6tv"},
	{AM_MESON_CPU_MAJOR_ID_M6TVL, "m6tvl"},
	{AM_MESON_CPU_MAJOR_ID_M8, "m8"},
	{AM_MESON_CPU_MAJOR_ID_MTVD, "mtvd"},
	{AM_MESON_CPU_MAJOR_ID_M8B, "m8b"},
	{AM_MESON_CPU_MAJOR_ID_MG9TV, "mg9tv"},
	{AM_MESON_CPU_MAJOR_ID_M8M2, "m8"},
	{AM_MESON_CPU_MAJOR_ID_GXBB, "gxbb"},
	{AM_MESON_CPU_MAJOR_ID_GXTVBB, "gxtvbb"},
	{AM_MESON_CPU_MAJOR_ID_GXL, "gxl"},
	{AM_MESON_CPU_MAJOR_ID_GXM, "gxm"},
	{AM_MESON_CPU_MAJOR_ID_TXL, "txl"},
	{AM_MESON_CPU_MAJOR_ID_TXLX, "txlx"},
	{AM_MESON_CPU_MAJOR_ID_GXLX, "gxlx"},
	{AM_MESON_CPU_MAJOR_ID_G12A, "g12a"},
	{AM_MESON_CPU_MAJOR_ID_G12B, "g12b"},
	{AM_MESON_CPU_MAJOR_ID_SM1, "sm1"},
	{AM_MESON_CPU_MAJOR_ID_TL1, "tl1"},
	{AM_MESON_CPU_MAJOR_ID_TM2, "tm2"},
	{AM_MESON_CPU_MAJOR_ID_SC2, "sc2"},
	{AM_MESON_CPU_MAJOR_ID_T5, "t5"},
	{AM_MESON_CPU_MAJOR_ID_T5D, "t5d"},
	{AM_MESON_CPU_MAJOR_ID_T7, "t7"},
	{AM_MESON_CPU_MAJOR_ID_S4, "s4"},
	{AM_MESON_CPU_MAJOR_ID_T3, "t3"},
	{AM_MESON_CPU_MAJOR_ID_P1, "p1"},
	{AM_MESON_CPU_MAJOR_ID_S4D, "s4d"},
	{AM_MESON_CPU_MAJOR_ID_T5W, "t5w"},
	{0, NULL},
};

static const char *get_type_name(const struct type_name *typename, int size,
	int type)
{

	const char *name = "unknown";

	int i;

	for (i = 0; i < size; i++) {

		if (type == typename[i].type)

			name = typename[i].name;

	}

	return name;
}

const char *get_cpu_type_name(void)
{

	return get_type_name(cpu_type_name,
		sizeof(cpu_type_name) / sizeof(struct type_name),
		get_cpu_major_id());
}
EXPORT_SYMBOL(get_cpu_type_name);

/*
 *enum vformat_e {
 *	VFORMAT_MPEG12 = 0,
 *	VFORMAT_MPEG4,
 *	VFORMAT_H264,
 *	VFORMAT_MJPEG,
 *	VFORMAT_REAL,
 *	VFORMAT_JPEG,
 *	VFORMAT_VC1,
 *	VFORMAT_AVS,
 *	VFORMAT_YUV,
 *	VFORMAT_H264MVC,
 *	VFORMAT_H264_4K2K,
 *	VFORMAT_HEVC,
 *	VFORMAT_H264_ENC,
 *	VFORMAT_JPEG_ENC,
 *	VFORMAT_VP9,
*	VFORMAT_AVS2,
 *	VFORMAT_MAX
 *};
 */
static const struct type_name vformat_type_name[] = {
	{VFORMAT_MPEG12, "mpeg12"},
	{VFORMAT_MPEG4, "mpeg4"},
	{VFORMAT_H264, "h264"},
	{VFORMAT_MJPEG, "mjpeg"},
	{VFORMAT_REAL, "real"},
	{VFORMAT_JPEG, "jpeg"},
	{VFORMAT_VC1, "vc1"},
	{VFORMAT_AVS, "avs"},
	{VFORMAT_YUV, "yuv"},
	{VFORMAT_H264MVC, "h264mvc"},
	{VFORMAT_H264_4K2K, "h264_4k"},
	{VFORMAT_HEVC, "hevc"},
	{VFORMAT_H264_ENC, "h264_enc"},
	{VFORMAT_JPEG_ENC, "jpeg_enc"},
	{VFORMAT_VP9, "vp9"},
	{VFORMAT_AVS2, "avs2"},
	{VFORMAT_AV1, "av1"},
	{VFORMAT_YUV, "yuv"},
	{0, NULL},
};

const char *get_video_format_name(enum vformat_e type)
{

	return get_type_name(vformat_type_name,
		sizeof(vformat_type_name) / sizeof(struct type_name), type);
}
EXPORT_SYMBOL(get_video_format_name);

static struct chip_vdec_info_s current_chip_info;

struct chip_vdec_info_s *get_current_vdec_chip(void)
{

	return &current_chip_info;
}
EXPORT_SYMBOL(get_current_vdec_chip);

bool check_efuse_chip(int vformat)
{
	unsigned int status, i = 0;
	int type[] = {15, 14, 11, 2}; /* avs2, vp9, h265, h264 */

	status =  (READ_EFUSE_REG(EFUSE_LIC2) >> 8 & 0xf);
	if (!status)
		return false;

	do {
		if ((status & 1) && (type[i] == vformat))
			return true;
		i++;
	} while (status >>= 1);

	return false;
}
EXPORT_SYMBOL(check_efuse_chip);

