/*
 * drivers/amlogic/media/frame_provider/decoder/utils/vdec_input.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/uaccess.h>
#include <linux/list.h>
#include <linux/slab.h>
#include <linux/dma-mapping.h>
#include <linux/amlogic/media/codec_mm/codec_mm.h>

#include "../../../stream_input/amports/amports_priv.h"
#include "vdec.h"
#include "vdec_input.h"

#include <asm/cacheflush.h>
#include <linux/crc32.h>


#define VFRAME_BLOCK_SIZE (512 * SZ_1K)/*512 for 1080p default init.*/
#define VFRAME_BLOCK_SIZE_4K (2 * SZ_1M) /*2M for 4K default.*/
#define VFRAME_BLOCK_SIZE_MAX (4 * SZ_1M)

#define VFRAME_BLOCK_PAGEALIGN 4
#define VFRAME_BLOCK_MIN_LEVEL (2 * SZ_1M)
#define VFRAME_BLOCK_MAX_LEVEL (8 * SZ_1M)
#define VFRAME_BLOCK_MAX_TOTAL_SIZE (16 * SZ_1M)

/*
2s for OMX
*/
#define MAX_FRAME_DURATION_S 2


#define VFRAME_BLOCK_HOLE (SZ_64K)

#define MIN_FRAME_PADDING_SIZE ((u32)(L1_CACHE_BYTES))

#define EXTRA_PADDING_SIZE  (16 * SZ_1K) /*HEVC_PADDING_SIZE*/

#define MEM_NAME "VFRAME_INPUT"

//static int vdec_input_get_duration_u64(struct vdec_input_s *input);
static struct vframe_block_list_s *
	vdec_input_alloc_new_block(struct vdec_input_s *input,
	ulong phy_addr,
	int size,
	chunk_free free,
	void* priv);

static int aml_copy_from_user(void *to, const void *from, ulong n)
{
	int ret =0;

	if (likely(access_ok(VERIFY_READ, from, n)))
		ret = copy_from_user(to, from, n);
	else
		memcpy(to, from, n);

	return ret;
}

static int copy_from_user_to_phyaddr(void *virts, const char __user *buf,
		u32 size, ulong phys, u32 pading, bool is_mapped)
{
	u32 i, span = SZ_1M;
	u32 count = size / PAGE_ALIGN(span);
	u32 remain = size % PAGE_ALIGN(span);
	ulong addr = phys;
	u8 *p = virts;

	if (is_mapped) {
		if (aml_copy_from_user(p, buf, size))
			return -EFAULT;

		if (pading)
			memset(p + size, 0, pading);

		codec_mm_dma_flush(p, size + pading, DMA_TO_DEVICE);

		return 0;
	}

	for (i = 0; i < count; i++) {
		addr = phys + i * span;
		p = codec_mm_vmap(addr, span);
		if (!p)
			return -1;

		if (aml_copy_from_user(p, buf + i * span, span)) {
			codec_mm_unmap_phyaddr(p);
			return -EFAULT;
		}

		codec_mm_dma_flush(p, span, DMA_TO_DEVICE);
		codec_mm_unmap_phyaddr(p);
	}

	if (!remain)
		return 0;

	span = size - remain;
	addr = phys + span;
	p = codec_mm_vmap(addr, remain + pading);
	if (!p)
		return -1;

	if (aml_copy_from_user(p, buf + span, remain)) {
		codec_mm_unmap_phyaddr(p);
		return -EFAULT;
	}

	if (pading)
		memset(p + remain, 0, pading);

	codec_mm_dma_flush(p, remain + pading, DMA_TO_DEVICE);
	codec_mm_unmap_phyaddr(p);

	return 0;
}

static int vframe_chunk_fill(struct vdec_input_s *input,
			struct vframe_chunk_s *chunk, const char *buf,
			size_t count, struct vframe_block_list_s *block)
{
	u8 *p = (u8 *)block->start_virt + block->wp;
	if (block->type == VDEC_TYPE_FRAME_BLOCK) {
		copy_from_user_to_phyaddr(p, buf, count,
			block->start + block->wp,
			chunk->pading_size,
			block->is_mapped);
	} else if (block->type == VDEC_TYPE_FRAME_CIRCULAR) {
		size_t len = min((size_t)(block->size - block->wp), count);
		u32 wp;

		copy_from_user_to_phyaddr(p, buf, len,
				block->start + block->wp, 0,
				block->is_mapped);
		p += len;

		if (count > len) {
			copy_from_user_to_phyaddr(p, buf + len,
				count - len,
				block->start, 0,
				block->is_mapped);

			p += count - len;
		}

		wp = block->wp + count;
		if (wp >= block->size)
			wp -= block->size;

		len = min(block->size - wp, chunk->pading_size);

		if (!block->is_mapped) {
			p = codec_mm_vmap(block->start + wp, len);
			memset(p, 0, len);
			codec_mm_dma_flush(p, len, DMA_TO_DEVICE);
			codec_mm_unmap_phyaddr(p);
		} else {
			memset(p, 0, len);
			codec_mm_dma_flush(p, len, DMA_TO_DEVICE);
		}

		if (chunk->pading_size > len) {
			p = (u8 *)block->start_virt;

			if (!block->is_mapped) {
				p = codec_mm_vmap(block->start,
					chunk->pading_size - len);
				memset(p, 0, chunk->pading_size - len);
				codec_mm_dma_flush(p,
					chunk->pading_size - len,
					DMA_TO_DEVICE);
				codec_mm_unmap_phyaddr(p);
			} else {
				memset(p, 0, chunk->pading_size - len);
				codec_mm_dma_flush(p,
					chunk->pading_size - len,
					DMA_TO_DEVICE);
			}
		}
	}

	return 0;
}

static inline u32 vframe_block_space(struct vframe_block_list_s *block)
{
	if (block->type == VDEC_TYPE_FRAME_BLOCK) {
		return block->size - block->wp;
	} else {
		return (block->rp >= block->wp) ?
			   (block->rp - block->wp) :
			   (block->rp - block->wp + block->size);
	}
}

static void vframe_block_add_chunk(struct vframe_block_list_s *block,
				struct vframe_chunk_s *chunk)
{
	block->wp += chunk->size + chunk->pading_size;
	if (block->wp >= block->size)
		block->wp -= block->size;
	block->data_size += chunk->size;
	block->chunk_count++;
	chunk->block = block;
	block->input->wr_block = block;
	chunk->sequence = block->input->sequence;
	block->input->sequence++;
}

static bool is_coherent_buff = 1;

static void vframe_block_free_block(struct vframe_block_list_s *block)
{
	if (is_coherent_buff) {
		if (block->mem_handle) {
			codec_mm_dma_free_coherent(block->mem_handle);
		}
	} else {
		if (block->addr) {
			codec_mm_free_for_dma(MEM_NAME,	block->addr);
		}
	}
	/*
	*pr_err("free block %d, size=%d\n", block->id, block->size);
	*/
	kfree(block);
}

static int vframe_block_init_alloc_storage(struct vdec_input_s *input,
			struct vframe_block_list_s *block,
			ulong phy_addr,
			int size,
			chunk_free free,
			void *priv)
{
	int alloc_size = input->default_block_size;
	block->magic = 0x4b434c42;
	block->input = input;
	block->type = input->type;

	/*
	 * todo: for different type use different size
	 */
	if (phy_addr) {
		block->is_out_buf = 1;
		block->start_virt = NULL;
		block->start = phy_addr;
		block->size = size;
		block->free = free;
		block->priv = priv;
	} else {
		alloc_size = PAGE_ALIGN(alloc_size);
		if (is_coherent_buff) {
			block->start_virt = codec_mm_dma_alloc_coherent(&block->mem_handle, &block->addr, alloc_size, MEM_NAME);
		} else {
			block->addr = codec_mm_alloc_for_dma_ex(
				MEM_NAME,
				alloc_size/PAGE_SIZE,
				VFRAME_BLOCK_PAGEALIGN,
				CODEC_MM_FLAGS_DMA_CPU | CODEC_MM_FLAGS_FOR_VDECODER,
				input->id,
				block->id);
		}

		if (!block->addr) {
			pr_err("Input block allocation failed\n");
			return -ENOMEM;
		}

		if (!is_coherent_buff)
			block->start_virt = (void *)codec_mm_phys_to_virt(block->addr);
		if (block->start_virt)
			block->is_mapped = true;
		block->start = block->addr;
		block->size = alloc_size;
		block->is_out_buf = 0;
		block->free = NULL;
	}

	return 0;
}

void vdec_input_init(struct vdec_input_s *input, struct vdec_s *vdec)
{
	INIT_LIST_HEAD(&input->vframe_block_list);
	INIT_LIST_HEAD(&input->vframe_block_free_list);
	INIT_LIST_HEAD(&input->vframe_chunk_list);
	spin_lock_init(&input->lock);
	input->id = vdec->id;
	input->block_nums = 0;
	input->vdec = vdec;
	input->block_id_seq = 0;
	input->size = 0;
	input->default_block_size = VFRAME_BLOCK_SIZE;
	snprintf(input->vdec_input_name, sizeof(input->vdec_input_name),
		 "vdec-input-%d", vdec->id);
}
int vdec_input_prepare_bufs(struct vdec_input_s *input,
	int frame_width, int frame_height)
{
	struct vframe_block_list_s *block;
	int i;
	unsigned long flags;

	if (vdec_secure(input->vdec))
		return 0;
	if (input->size > 0)
		return 0;
	if (frame_width * frame_height >= 1920 * 1088) {
		/*have add data before. ignore prepare buffers.*/
		input->default_block_size = VFRAME_BLOCK_SIZE_4K;
	}
	/*prepared 3 buffers for smooth start.*/
	for (i = 0; i < 3; i++) {
		block = vdec_input_alloc_new_block(input, 0, 0, NULL, NULL);
		if (!block)
			break;
		flags = vdec_input_lock(input);
		list_move_tail(&block->list,
				&input->vframe_block_free_list);
		input->wr_block = NULL;
		vdec_input_unlock(input, flags);
	}
	return 0;
}

static int vdec_input_dump_block_locked(
	struct vframe_block_list_s *block,
	char *buf, int size)
{
	char *pbuf = buf;
	char sbuf[512];
	int tsize = 0;
	int s;
	if (!pbuf) {
		pbuf = sbuf;
		size = 512;
	}
	#define BUFPRINT(args...) \
	do {\
		s = snprintf(pbuf, size - tsize, args);\
		tsize += s;\
		pbuf += s; \
	} while (0)

	BUFPRINT("\tblock:[%d:%p]-addr=%p,vstart=%p,type=%d\n",
		block->id,
		block,
		(void *)block->addr,
		(void *)block->start_virt,
		block->type);
	BUFPRINT("\t-blocksize=%d,data=%d,wp=%d,rp=%d,chunk_count=%d\n",
		block->size,
		block->data_size,
		block->wp,
		block->rp,
		block->chunk_count);
	/*
	BUFPRINT("\tlist=%p,next=%p,prev=%p\n",
		&block->list,
		block->list.next,
		block->list.prev);
	*/
	#undef BUFPRINT
	if (!buf)
		pr_info("%s", sbuf);
	return tsize;
}

int vdec_input_dump_blocks(struct vdec_input_s *input,
	char *bufs, int size)
{
	struct list_head *p, *tmp;
	unsigned long flags;
	char *lbuf = bufs;
	char sbuf[256];
	int s = 0;

	if (size <= 0)
		return 0;
	if (!bufs)
		lbuf = sbuf;
	s += snprintf(lbuf + s, size - s,
		"blocks:vdec-%d id:%d,bufsize=%d,dsize=%d,frames:%d,dur:%dms\n",
		input->id,
		input->block_nums,
		input->size,
		input->data_size,
		input->have_frame_num,
		vdec_input_get_duration_u64(input)/1000);
	if (bufs)
		lbuf += s;
	else {
		pr_info("%s", sbuf);
		lbuf = NULL;
	}

	flags = vdec_input_lock(input);
	/* dump input blocks */
	list_for_each_safe(p, tmp, &input->vframe_block_list) {
		struct vframe_block_list_s *block = list_entry(
			p, struct vframe_block_list_s, list);
		if (bufs != NULL) {
			lbuf = bufs + s;
			if (size - s < 128)
				break;
		}
		s += vdec_input_dump_block_locked(block, lbuf, size - s);
	}
	list_for_each_safe(p, tmp, &input->vframe_block_free_list) {
		struct vframe_block_list_s *block = list_entry(
			p, struct vframe_block_list_s, list);
		if (bufs != NULL) {
			lbuf = bufs + s;
			if (size - s < 128)
				break;
		}
		s += vdec_input_dump_block_locked(block, lbuf, size - s);
	}
	vdec_input_unlock(input, flags);
	return s;
}

static int vdec_input_dump_chunk_locked(
	int id,
	struct vframe_chunk_s *chunk,
	char *buf, int size)
{
	char *pbuf = buf;
	char sbuf[512];
	int tsize = 0;
	int s;
	if (!pbuf) {
		pbuf = sbuf;
		size = 512;
	}
	#define BUFPRINT(args...) \
	do {\
		s = snprintf(pbuf, size - tsize, args);\
		tsize += s;\
		pbuf += s; \
	} while (0)

	BUFPRINT(
		"\t[%d][%lld:%p]-off=%d,size:%d,p:%d,\tpts64=%lld,addr=%p\n",
		id,
		chunk->sequence,
		chunk->block,
		chunk->offset,
		chunk->size,
		chunk->pading_size,
		chunk->pts64,
		(void *)(chunk->block->addr + chunk->offset));
	/*
	BUFPRINT("\tlist=%p,next=%p,prev=%p\n",
		&chunk->list,
		chunk->list.next,
		chunk->list.prev);
	*/
	#undef BUFPRINT
	if (!buf)
		pr_info("%s", sbuf);
	return tsize;
}

int vdec_input_dump_chunks(int id, struct vdec_input_s *input,
	char *bufs, int size)
{

	struct list_head *p, *tmp;
	unsigned long flags;
	char *lbuf = bufs;
	char sbuf[256];
	int s = 0;
	int i = 0;

	if (size <= 0)
		return 0;
	if (!bufs)
		lbuf = sbuf;
	s = snprintf(lbuf + s, size - s,
		"[%d]blocks:vdec-%d id:%d,bufsize=%d,dsize=%d,frames:%d,maxframe:%d\n",
		id,
		input->id,
		input->block_nums,
		input->size,
		input->data_size,
		input->have_frame_num,
		input->frame_max_size);
	if (bufs)
		lbuf += s;
	if (!bufs) {
		pr_info("%s", sbuf);
		lbuf = NULL;
	}
	flags = vdec_input_lock(input);
	/*dump chunks list infos.*/
	list_for_each_safe(p, tmp, &input->vframe_chunk_list) {
		struct vframe_chunk_s *chunk = list_entry(
				p, struct vframe_chunk_s, list);
		if (bufs != NULL)
			lbuf = bufs + s;
		s += vdec_input_dump_chunk_locked(id, chunk, lbuf, size - s);
		i++;
		if (i >= 10)
			break;
	}
	vdec_input_unlock(input, flags);
	return s;
}



int vdec_input_set_buffer(struct vdec_input_s *input, u32 start, u32 size)
{
	if (input_frame_based(input))
		return -EINVAL;

	input->start = start;
	input->size = size;
	input->swap_rp = start;

	if (vdec_secure(input->vdec))
		input->swap_page_phys = codec_mm_alloc_for_dma("SWAP",
			1, 0, CODEC_MM_FLAGS_TVP);
	else {
		input->swap_page = codec_mm_dma_alloc_coherent(&input->mem_handle,
				(ulong *)&input->swap_page_phys,
				PAGE_SIZE, MEM_NAME);
		if (input->swap_page == NULL)
			return -ENOMEM;
	}

	if (input->swap_page_phys == 0)
		return -ENOMEM;
	return 0;
}
EXPORT_SYMBOL(vdec_input_set_buffer);

void vdec_input_set_type(struct vdec_input_s *input, int type, int target)
{
	input->type = type;
	input->target = target;
	if (type == VDEC_TYPE_FRAME_CIRCULAR) {
		/*alway used max block.*/
		input->default_block_size = VFRAME_BLOCK_SIZE_MAX;
	}
}
EXPORT_SYMBOL(vdec_input_set_type);

int vdec_input_get_status(struct vdec_input_s *input,
			struct vdec_input_status_s *status)
{
	unsigned long flags;

	if (input->vdec == NULL)
		return -EINVAL;

	flags = vdec_input_lock(input);

	if (list_empty(&input->vframe_block_list)) {
		status->size = VFRAME_BLOCK_SIZE;
		status->data_len = 0;
		status->free_len = VFRAME_BLOCK_SIZE;
		status->read_pointer = 0;
	} else {
		int r = VFRAME_BLOCK_MAX_LEVEL - vdec_input_level(input)
			- VFRAME_BLOCK_HOLE;
		status->size = input->size;
		status->data_len = vdec_input_level(input);
		status->free_len = (r > 0) ? r : 0;
		status->read_pointer = input->total_rd_count;
	}

	vdec_input_unlock(input, flags);

	return 0;
}
EXPORT_SYMBOL(vdec_input_get_status);

static void vdec_input_add_block(struct vdec_input_s *input,
				struct vframe_block_list_s *block)
{
	unsigned long flags;

	flags = vdec_input_lock(input);
	block->wp = 0;
	block->id = input->block_id_seq++;
	list_add_tail(&block->list, &input->vframe_block_list);
	input->size += block->size;
	input->block_nums++;
	input->wr_block = block;
	vdec_input_unlock(input, flags);
}

static inline void vdec_input_del_block_locked(struct vdec_input_s *input,
				struct vframe_block_list_s *block)
{
	list_del(&block->list);
	input->size -= block->size;
	input->block_nums--;
}

int vdec_input_level(struct vdec_input_s *input)
{
	return input->total_wr_count - input->total_rd_count;
}
EXPORT_SYMBOL(vdec_input_level);

static struct vframe_block_list_s *
	vdec_input_alloc_new_block(struct vdec_input_s *input,
	ulong phy_addr,
	int size,
	chunk_free free,
	void* priv)
{
	struct vframe_block_list_s *block;
	block = kzalloc(sizeof(struct vframe_block_list_s),
			GFP_KERNEL);
	if (block == NULL) {
		input->no_mem_err_cnt++;
		pr_err("vframe_block structure allocation failed\n");
		return NULL;
	}

	if (vframe_block_init_alloc_storage(input,
		block, phy_addr, size, free, priv) != 0) {
		kfree(block);
		pr_err("vframe_block storage allocation failed\n");
		return NULL;
	}

	INIT_LIST_HEAD(&block->list);

	vdec_input_add_block(input, block);

	/*
	 *pr_info("vdec-%d:new block id=%d, total_blocks:%d, size=%d\n",
	 *	input->id,
	 *	block->id,
	 *	input->block_nums,
	 *	block->size);
	 */
	if (0 && input->size > VFRAME_BLOCK_MAX_LEVEL * 2) {
		/*
		used
		*/
		pr_info(
		"input[%d] reach max: size:%d, blocks:%d",
			input->id,
			input->size,
			input->block_nums);
		pr_info("level:%d, wr:%lld,rd:%lld\n",
			vdec_input_level(input),
			input->total_wr_count,
			input->total_rd_count);
		vdec_input_dump_blocks(input, NULL, 0);
	}
	return block;
}
int vdec_input_get_duration_u64(struct vdec_input_s *input)
{
	int duration = (input->last_inpts_u64 - input->last_comsumed_pts_u64);
	if (input->last_in_nopts_cnt > 0 &&
		input->last_comsumed_pts_u64 > 0 &&
		input->last_duration > 0) {
		duration += (input->last_in_nopts_cnt -
			input->last_comsumed_no_pts_cnt) *
			input->last_duration;
	}
	if (duration > 1000 * 1000000)/*> 1000S,I think jumped.*/
		duration = 0;
	if (duration <= 0 && input->last_duration > 0) {
		/*..*/
		duration = input->last_duration * input->have_frame_num;
	}
	if (duration < 0)
		duration = 0;
	return duration;
}
EXPORT_SYMBOL(vdec_input_get_duration_u64);

/*
	ret >= 13: have enough buffer, blocked add more buffers
*/
static int vdec_input_have_blocks_enough(struct vdec_input_s *input)
{
	int ret = 0;
	if (vdec_input_level(input) > VFRAME_BLOCK_MIN_LEVEL)
		ret += 1;
	if (vdec_input_level(input) >= VFRAME_BLOCK_MAX_LEVEL)
		ret += 2;
	if (vdec_input_get_duration_u64(input) > MAX_FRAME_DURATION_S)
		ret += 4;
	if (input->have_frame_num > 30)
		ret += 8;
	else
		ret -= 8;/*not enough frames.*/
	if (input->size >= VFRAME_BLOCK_MAX_TOTAL_SIZE)
		ret += 100;/*always bloced add more buffers.*/

	return ret;
}
static int	vdec_input_get_free_block(
	struct vdec_input_s *input,
	int size,/*frame size + pading*/
	struct vframe_block_list_s **block_ret)
{
	struct vframe_block_list_s *to_freeblock = NULL;
	struct vframe_block_list_s *block = NULL;
	unsigned long flags;
	flags = vdec_input_lock(input);
	/*get from free list.*/
	if (!list_empty(&input->vframe_block_free_list)) {
		block = list_entry(input->vframe_block_free_list.next,
		struct vframe_block_list_s, list);
		if (block->size < (size)) {
			vdec_input_del_block_locked(input, block);
			to_freeblock = block;
			block = NULL;
		} else {
			list_move_tail(&block->list,
				&input->vframe_block_list);
			input->wr_block = block;/*swith to new block*/
		}
	}
	vdec_input_unlock(input, flags);
	if (to_freeblock) {
		/*free the small block.*/
		vframe_block_free_block(to_freeblock);
	}
	if (block) {
		*block_ret = block;
		return 0;
	}

	if (vdec_input_have_blocks_enough(input) > 13) {
		/*buf fulled */
		return -EAGAIN;
	}
	if (input->no_mem_err_cnt > 3) {
		/*alloced failed more times.
		*/
		return -EAGAIN;
	}
	if (input->default_block_size <=
		size * 2) {
		int def_size = input->default_block_size;
		do {
			def_size *= 2;
		} while ((def_size <= 2 * size) &&
			(def_size <= VFRAME_BLOCK_SIZE_MAX));
		if (def_size < size)
			def_size = ALIGN(size + 64, (1 << 17));
		/*128k aligned,same as codec_mm*/
		input->default_block_size = def_size;
	}
	block = vdec_input_alloc_new_block(input, 0, 0, NULL, NULL);
	if (!block) {
		input->no_mem_err_cnt++;
		return -EAGAIN;
	}
	input->no_mem_err_cnt = 0;
	*block_ret = block;
	return 0;
}

int vdec_input_add_chunk(struct vdec_input_s *input, const char *buf,
		size_t count, u32 handle, chunk_free free, void* priv)
{
	unsigned long flags;
	struct vframe_chunk_s *chunk;
	struct vdec_s *vdec = input->vdec;
	struct vframe_block_list_s *block;
	int need_pading_size = MIN_FRAME_PADDING_SIZE;

	if (vdec_secure(vdec)) {
		block = vdec_input_alloc_new_block(input, (ulong)buf,
			PAGE_ALIGN(count + HEVC_PADDING_SIZE + 1),
			free, priv); /*Add padding large than HEVC_PADDING_SIZE */
		if (!block)
			return -ENOMEM;
		block->handle = handle;
	} else {
#if 0
		if (add_count == 0) {
			add_count++;
			memcpy(sps, buf, 30);
			return 30;
		} else if (add_count == 1) {
			add_count++;
			memcpy(pps, buf, 8);
			return 8;
		}
		add_count++;
#endif

#if 0
		pr_info("vdec_input_add_frame add %p, count=%d\n", buf, (int)count);

		if (count >= 8) {
			pr_info("%02x %02x %02x %02x %02x %02x %02x %02x\n",
			buf[0], buf[1], buf[2], buf[3],
			buf[4], buf[5], buf[6], buf[7]);
		}
		if (count >= 16) {
			pr_info("%02x %02x %02x %02x %02x %02x %02x %02x\n",
			buf[8], buf[9], buf[10], buf[11],
			buf[12], buf[13], buf[14], buf[15]);
		}
		if (count >= 24) {
			pr_info("%02x %02x %02x %02x %02x %02x %02x %02x\n",
			buf[16], buf[17], buf[18], buf[19],
			buf[20], buf[21], buf[22], buf[23]);
		}
		if (count >= 32) {
			pr_info("%02x %02x %02x %02x %02x %02x %02x %02x\n",
			buf[24], buf[25], buf[26], buf[27],
			buf[28], buf[29], buf[30], buf[31]);
	}
#endif
		if (input_stream_based(input))
			return -EINVAL;

		if (count < PAGE_SIZE) {
			need_pading_size = PAGE_ALIGN(count + need_pading_size) -
				count;
		} else {
			/*to 64 bytes aligned;*/
			if (count & 0x3f)
				need_pading_size += 64 - (count & 0x3f);
		}
		block = input->wr_block;
		if (block &&
			(vframe_block_space(block) > (count + need_pading_size))) {
			/*this block have enough buffers.
			do nothings.
			*/
		} else if (block && (block->type == VDEC_TYPE_FRAME_CIRCULAR)) {
			/*in circular module.
			only one block,.*/
			return -EAGAIN;
		} else if (block != NULL) {
			/*have block but not enough space.
			recycle the no enough blocks.*/
			flags = vdec_input_lock(input);
			if (input->wr_block == block &&
				block->chunk_count == 0) {
				block->rp = 0;
				block->wp = 0;
				/*block no data move to freelist*/
				list_move_tail(&block->list,
					&input->vframe_block_free_list);
				input->wr_block = NULL;
			}
			vdec_input_unlock(input, flags);
			block = NULL;
		}
		if (!block) {/*try new block.*/
			int ret = vdec_input_get_free_block(input,
				count + need_pading_size + EXTRA_PADDING_SIZE,
				&block);
			if (ret < 0)/*no enough block now.*/
				return ret;
		}
	}

	chunk = kzalloc(sizeof(struct vframe_chunk_s), GFP_KERNEL);

	if (!chunk) {
		pr_err("vframe_chunk structure allocation failed\n");
		return -ENOMEM;
	}

	if ((vdec->hdr10p_data_valid == true) &&
		(vdec->hdr10p_data_size != 0)) {
		char *new_buf;
		new_buf = vzalloc(vdec->hdr10p_data_size);
		if (new_buf) {
			memcpy(new_buf, vdec->hdr10p_data_buf, vdec->hdr10p_data_size);
			chunk->hdr10p_data_buf = new_buf;
			chunk->hdr10p_data_size = vdec->hdr10p_data_size;
		} else {
			pr_err("%s:hdr10p data vzalloc size(%d) failed\n",
				__func__, vdec->hdr10p_data_size);
			chunk->hdr10p_data_buf = NULL;
			chunk->hdr10p_data_size = 0;
		}
	} else {
		chunk->hdr10p_data_buf = NULL;
		chunk->hdr10p_data_size = 0;
	}
	vdec->hdr10p_data_valid = false;

	chunk->magic = 0x4b554843;
	if (vdec->pts_valid) {
		chunk->pts = vdec->pts;
		chunk->pts64 = vdec->pts64;
	}

	if (vdec->timestamp_valid)
		chunk->timestamp = vdec->timestamp;

	if (vdec->pts_valid &&
		input->last_inpts_u64 > 0 &&
		input->last_in_nopts_cnt == 0) {
		int d = (int)(chunk->pts64 - input->last_inpts_u64);
		if (d > 0 && (d < input->last_duration))
			input->last_duration = d;
		/*	alwasy: used the smallest duration;
			if 60fps->30 fps.
			maybe have warning value.
		*/
	}
	chunk->pts_valid = vdec->pts_valid;
	vdec->pts_valid = false;
	INIT_LIST_HEAD(&chunk->list);

	if (vdec_secure(vdec)) {
		chunk->offset = 0;
		chunk->size = count;
		chunk->pading_size = PAGE_ALIGN(chunk->size + need_pading_size) -
			chunk->size;
	} else {
		chunk->offset = block->wp;
		chunk->size = count;
		chunk->pading_size = need_pading_size;
		if (vframe_chunk_fill(input, chunk, buf, count, block)) {
			pr_err("vframe_chunk_fill failed\n");
			kfree(chunk);
			return -EFAULT;
		}

	}


	flags = vdec_input_lock(input);

	vframe_block_add_chunk(block, chunk);

	list_add_tail(&chunk->list, &input->vframe_chunk_list);
	input->data_size += chunk->size;
	input->have_frame_num++;

	if (input->have_frame_num == 1)
		input->vdec_up(vdec);
	ATRACE_COUNTER(input->vdec_input_name, input->have_frame_num);
	if (chunk->pts_valid) {
		input->last_inpts_u64 = chunk->pts64;
		input->last_in_nopts_cnt = 0;
	} else {
		/*nopts*/
		input->last_in_nopts_cnt++;
	}
	if (chunk->size > input->frame_max_size)
		input->frame_max_size = chunk->size;
	input->total_wr_count += count;
	vdec_input_unlock(input, flags);
#if 0
	if (add_count == 2)
		input->total_wr_count += 38;
#endif

	return count;
}

int vdec_input_add_frame(struct vdec_input_s *input, const char *buf,
			size_t count)
{
	int ret = 0;
	struct drm_info drm;
	struct vdec_s *vdec = input->vdec;
	unsigned long phy_buf;

	if (vdec_secure(vdec)) {
		while (count > 0) {
			if (count < sizeof(struct drm_info))
				return -EIO;
			if (copy_from_user((void*)&drm, buf + ret, sizeof(struct drm_info)))
				return -EAGAIN;
			if (!(drm.drm_flag & TYPE_DRMINFO_V2))
				return -EIO; /*must drm info v2 version*/
			phy_buf = (unsigned long) drm.drm_phy;
			vdec_input_add_chunk(input, (char *)phy_buf,
				(size_t)drm.drm_pktsize, drm.handle, NULL, NULL);
			count -= sizeof(struct drm_info);
			ret += sizeof(struct drm_info);

			/* the drm frame data might include head infos and raw */
			/* data thus the next drm unit still need a valid pts.*/
			if (count >= sizeof(struct drm_info))
				vdec->pts_valid = true;
		}
	} else {
		ret = vdec_input_add_chunk(input, buf, count, 0, NULL, NULL);
	}

	return ret;
}
EXPORT_SYMBOL(vdec_input_add_frame);

int vdec_input_add_frame_with_dma(struct vdec_input_s *input, ulong addr,
	size_t count, u32 handle, chunk_free free, void* priv)
{
	struct vdec_s *vdec = input->vdec;

	return vdec_secure(vdec) ?
		vdec_input_add_chunk(input,
			(char *)addr, count, handle, free, priv) : -1;
}
EXPORT_SYMBOL(vdec_input_add_frame_with_dma);

struct vframe_chunk_s *vdec_input_next_chunk(struct vdec_input_s *input)
{
	struct vframe_chunk_s *chunk = NULL;
	unsigned long flags;
	flags = vdec_input_lock(input);
	if (!list_empty(&input->vframe_chunk_list)) {
		chunk = list_first_entry(&input->vframe_chunk_list,
				struct vframe_chunk_s, list);
	}
	vdec_input_unlock(input, flags);
	return chunk;
}
EXPORT_SYMBOL(vdec_input_next_chunk);

struct vframe_chunk_s *vdec_input_next_input_chunk(
			struct vdec_input_s *input)
{
	struct vframe_chunk_s *chunk = NULL;
	struct list_head *p;
	unsigned long flags;
	flags = vdec_input_lock(input);

	list_for_each(p, &input->vframe_chunk_list) {
		struct vframe_chunk_s *c = list_entry(
			p, struct vframe_chunk_s, list);
		if ((c->flag & VFRAME_CHUNK_FLAG_CONSUMED) == 0) {
			chunk = c;
			break;
		}
	}
	vdec_input_unlock(input, flags);
	return chunk;
}
EXPORT_SYMBOL(vdec_input_next_input_chunk);

void vdec_input_release_chunk(struct vdec_input_s *input,
			struct vframe_chunk_s *chunk)
{
	struct vframe_chunk_s *p;
	u32 chunk_valid = 0;
	unsigned long flags;
	struct vframe_block_list_s *block = chunk->block;
	struct vframe_block_list_s *tofreeblock = NULL;
	flags = vdec_input_lock(input);

	list_for_each_entry(p, &input->vframe_chunk_list, list) {
		if (p == chunk) {
			chunk_valid = 1;
			break;
		}
	}
	/* 2 threads go here, the other done the deletion,so return*/
	if (chunk_valid == 0) {
		vdec_input_unlock(input, flags);
		pr_err("%s chunk is deleted,so return.\n", __func__);
		return;
	}

	list_del(&chunk->list);
	input->have_frame_num--;
	ATRACE_COUNTER(input->vdec_input_name, input->have_frame_num);
	if (chunk->pts_valid) {
		input->last_comsumed_no_pts_cnt = 0;
		input->last_comsumed_pts_u64 = chunk->pts64;
	} else
		input->last_comsumed_no_pts_cnt++;
	block->rp += chunk->size;
	if (block->rp >= block->size)
		block->rp -= block->size;
	block->data_size -= chunk->size;
	block->chunk_count--;
	input->data_size -= chunk->size;
	input->total_rd_count += chunk->size;
	if (block->is_out_buf) {
		list_move_tail(&block->list,
			&input->vframe_block_free_list);
		if (block->free) {
			vdec_input_del_block_locked(input, block);
			block->free(block->priv, block->handle);
			kfree(block);
		}
	} else if (block->chunk_count == 0 &&
		input->wr_block != block ) {/*don't free used block*/
		if (block->size < input->default_block_size) {
			vdec_input_del_block_locked(input, block);
			tofreeblock = block;
		} else {
			block->rp = 0;
			block->wp = 0;
			list_move_tail(&block->list,
				&input->vframe_block_free_list);
		}
	}

	vdec_input_unlock(input, flags);
	if (tofreeblock)
		vframe_block_free_block(tofreeblock);
	kfree(chunk);
}
EXPORT_SYMBOL(vdec_input_release_chunk);

unsigned long vdec_input_lock(struct vdec_input_s *input)
{
	unsigned long flags;

	spin_lock_irqsave(&input->lock, flags);

	return flags;
}
EXPORT_SYMBOL(vdec_input_lock);

void vdec_input_unlock(struct vdec_input_s *input, unsigned long flags)
{
	spin_unlock_irqrestore(&input->lock, flags);
}
EXPORT_SYMBOL(vdec_input_unlock);

void vdec_input_release(struct vdec_input_s *input)
{
	struct list_head *p, *tmp;

	/* release chunk data */
	list_for_each_safe(p, tmp, &input->vframe_chunk_list) {
		struct vframe_chunk_s *chunk = list_entry(
				p, struct vframe_chunk_s, list);
		vdec_input_release_chunk(input, chunk);
	}
	list_for_each_safe(p, tmp, &input->vframe_block_list) {
		/*should never here.*/
		list_move_tail(p, &input->vframe_block_free_list);
	}
	/* release input blocks */
	list_for_each_safe(p, tmp, &input->vframe_block_free_list) {
		struct vframe_block_list_s *block = list_entry(
			p, struct vframe_block_list_s, list);
		vdec_input_del_block_locked(input, block);
		vframe_block_free_block(block);
	}

	/* release swap pages */
	if (vdec_secure(input->vdec)) {
		if (input->swap_page_phys)
			codec_mm_free_for_dma("SWAP", input->swap_page_phys);
	} else {
		if (input->swap_page)
			codec_mm_dma_free_coherent(input->mem_handle);
	}
	input->swap_page = NULL;
	input->swap_page_phys = 0;
	input->swap_valid = false;
}
EXPORT_SYMBOL(vdec_input_release);

u32 vdec_input_get_freed_handle(struct vdec_s *vdec)
{
	struct vframe_block_list_s *block;
	struct vdec_input_s *input = &vdec->input;
	unsigned long flags;
	u32 handle = 0;

	if (!vdec)
		return 0;

	if (!vdec_secure(vdec))
		return 0;

	flags = vdec_input_lock(input);
	do {
		block = list_first_entry_or_null(&input->vframe_block_free_list,
		struct vframe_block_list_s, list);
		if (!block) {
			break;
		}

		handle = block->handle;
		vdec_input_del_block_locked(input, block);
		if (block->free)
			block->free(block->priv, handle);
		kfree(block);

	} while(!handle);

	vdec_input_unlock(input, flags);
	return handle;
}
EXPORT_SYMBOL(vdec_input_get_freed_handle);


