/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */

/*
 * drivers/amlogic/media/camera/common/vm.h
 *
 * 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.
 *
 */

#ifndef _VM_INCLUDE__
#define _VM_INCLUDE__

#include <linux/interrupt.h>
#include <linux/amlogic/media/canvas/canvas.h>
#include <linux/fb.h>
#include <linux/list.h>
#include <linux/uaccess.h>
#include <linux/sysfs.h>
#include <linux/spinlock.h>
#include <linux/kthread.h>
#include <linux/io-mapping.h>
#include <linux/wait.h>
#include <linux/semaphore.h>
#include <linux/cdev.h>
#include <linux/amlogic/media/vfm/vframe_receiver.h>
#include <linux/amlogic/media/vfm/vframe_provider.h>
#include <linux/amlogic/media/camera/aml_cam_info.h>
#include <linux/amlogic/media/camera/vmapi.h>

/*************************************
 **
 **	macro define
 **
 *************************************/

#define VM_IOC_MAGIC  'P'
#define VM_IOC_2OSD0		_IOW(VM_IOC_MAGIC, 0x00, unsigned int)
#define VM_IOC_ENABLE_PP _IOW(VM_IOC_MAGIC, 0X01, unsigned int)
#define VM_IOC_CONFIG_FRAME  _IOW(VM_IOC_MAGIC, 0X02, unsigned int)
#define MAX_CANVAS_INDEX 12

#define VM_MAP_NAME_SIZE 100
#define VM_PROVIDER_NAME_SIZE 10

struct vm_device_s {
	unsigned int  index;
	char name[20];
	struct platform_device *pdev;
	int dump;
	char *dump_path;
	unsigned int open_count;
	int major;
	unsigned int dbg_enable;
	/* struct class *cla; */
	struct cdev	cdev;
	struct device *dev;
	resource_size_t buffer_start;
	unsigned int buffer_size;
#ifdef CONFIG_CMA
	ulong cma_pool_size;
#endif
	struct vframe_receiver_s vm_vf_recv;
	struct task_struct *task;
	wait_queue_head_t frame_ready;
	int task_running;
	int vm_skip_count;
	int test_zoom;
	struct vm_output_para output_para;
	struct completion vb_start_sema;
	struct completion vb_done_sema;
	char vf_provider_name[VM_PROVIDER_NAME_SIZE];
	char vfm_map_id[VM_MAP_NAME_SIZE];
	char vfm_map_chain[VM_MAP_NAME_SIZE];
	int vm_canvas[MAX_CANVAS_INDEX];
};

struct display_frame_s {
	int frame_top;
	int frame_left;
	int frame_width;
	int frame_height;
	int content_top;
	int content_left;
	int content_width;
	int content_height;
};

int start_vm_task(struct vm_device_s *vdevp);
int start_simulate_task(void);
int alloc_vm_canvas(struct vm_device_s *vdevp);

int get_vm_status(void);
void set_vm_status(int flag);

/* for vm device op. */
int init_vm_device(struct vm_device_s *vdevp,
		struct platform_device *pdev);
int uninit_vm_device(struct platform_device *plat_dev);

/* for vm device class op. */
struct class *init_vm_cls(void);

/* for thread of vm. */
int start_vpp_task(void);
void stop_vpp_task(void);

/* for vm private member. */
void set_vm_buf_info(resource_size_t start, unsigned int size);
void get_vm_buf_info(resource_size_t *start, unsigned int *size,
			    struct io_mapping **mapping);

/*  vm buffer op. */
int vm_buffer_init(struct vm_device_s *vdevp);
void vm_local_init(void);

void vm_deinit_resource(struct vm_init_s *info);

static DEFINE_MUTEX(vm_mutex);

/* #if MESON_CPU_TYPE >= MESON_CPU_TYPE_MESON6TV */

#define CANVAS_WIDTH_ALIGN 32

//#define CANVAS_WIDTH_ALIGN 8

#define MAGIC_SG_MEM    0x17890714
#define MAGIC_DC_MEM    0x0733ac61
#define MAGIC_VMAL_MEM  0x18221223
#define MAGIC_RE_MEM    0x123039dc

#endif /* _VM_INCLUDE__ */
