/*
 * Copyright (c) 2017 MediaTek Inc.
 * Author: Yunfei Dong <yunfei.dong@mediatek.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 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 the
 * GNU General Public License for more details.
 */

#ifndef MTK_VCODEC_MEM_H
#define MTK_VCODEC_MEM_H

#include <media/videobuf2-dma-contig.h>
#include <uapi/linux/mtk_vcu_controls.h>
#include <linux/slab.h>

#define DEC_MAX_BUFFER 32U
#define DEC_ALLOCATE_MAX_BUFFER_SIZE 0x1B00000UL

/**
 * struct mtk_vcu_mem - memory buffer allocated in kernel
 *
 * @mem_priv:	vb2_dc_buf
 * @size:	allocated buffer size
 */
struct mtk_vcu_mem {
	void *mem_priv;
	size_t size;
};

/**
 * struct mtk_vcu_queue - the allocated buffer queue
 *
 * @vcu:	struct mtk_vcu
 * @mmap_lock:	the lock to protect allocated buffer
 * @dev:	device
 * @num_buffers:	allocated buffer number
 * @mem_ops:	the file operation of memory allocated
 * @bufs:	store the information of allocated buffers
 */
struct mtk_vcu_queue {
	void *vcu;
	struct vb2_alloc_ctx *alloc_ctx;
	struct mutex mmap_lock;
	struct device *dev;
	unsigned int num_buffers;
	const struct vb2_mem_ops *mem_ops;
	struct mtk_vcu_mem bufs[DEC_MAX_BUFFER];
	int map_buf;
	int map_type;
};

/**
 * mtk_vcu_dec_init - just init vcu_queue
 *
 * @dev:	vcu device.
 *
 * Return:	Return NULL if it is failed.
 * otherwise it is vcu queue to store the allocated buffer
 **/
struct mtk_vcu_queue *mtk_vcu_dec_init(struct device *dev);

/**
 * mtk_vcu_dec_release - just release the vcu_queue
 *
 * @vcu_queue:	the queue to store allocated buffer.
 *
 * Return: void
 **/
void mtk_vcu_dec_release(struct mtk_vcu_queue *vcu_queue);

/**
 * mtk_vcu_get_buffer - get the allocated buffer iova/va
 *
 * @vcu_queue:	the queue to store allocated buffer.
 * @mem_buff_data:	store iova/va.
 *
 * Return: Return real address if it is ok, otherwise failed
 **/
void *mtk_vcu_get_buffer(struct mtk_vcu_queue *vcu_queue, struct mem_obj *mem_buff_data);

/**
 * mtk_vcu_free_buffer - just free unused buffer iova/va
 *
 * @vcu_queue:	the queue to store allocated buffer.
 * @mem_buff_data:	store iova/va to free.
 *
 * Return:	Return 0 if it is ok, otherwise failed
 **/
int mtk_vcu_free_buffer(struct mtk_vcu_queue *vcu_queue, struct mem_obj *mem_buff_data);

#endif

