blob: b080e44ddf12a1b6eaf418654e7ec7f5d0f757a2 [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0 */
//
// Copyright (c) 2018 MediaTek Inc.
#ifndef __MTK_FD_HW_H__
#define __MTK_FD_HW_H__
#include <linux/completion.h>
#include <linux/io.h>
#include <linux/types.h>
#include <linux/platform_device.h>
#include <media/v4l2-ctrls.h>
#include <media/v4l2-device.h>
#include <media/videobuf2-v4l2.h>
#define MTK_FD_OUTPUT_MIN_WIDTH 26U
#define MTK_FD_OUTPUT_MIN_HEIGHT 26U
#define MTK_FD_OUTPUT_MAX_WIDTH 640U
#define MTK_FD_OUTPUT_MAX_HEIGHT 480U
#define MTK_FD_HW_FMT_VYUY 2
#define MTK_FD_HW_FMT_UYVY 3
#define MTK_FD_HW_FMT_YVYU 4
#define MTK_FD_HW_FMT_YUYV 5
#define MTK_FD_HW_FMT_YVU_2P 6
#define MTK_FD_HW_FMT_YUV_2P 7
#define MTK_FD_HW_FMT_UNKNOWN 8
#define MTK_FD_IPI_CMD_INIT 0
#define MTK_FD_IPI_CMD_INIT_ACK 1
#define MTK_FD_IPI_CMD_ENQUEUE 2
#define MTK_FD_IPI_CMD_ENQ_ACK 3
#define MTK_FD_IPI_CMD_EXIT 4
#define MTK_FD_IPI_CMD_EXIT_ACK 5
#define MTK_FD_IPI_CMD_RESET 6
#define MTK_FD_IPI_CMD_RESET_ACK 7
#define MTK_FD_REG_OFFSET_HW_ENABLE 0x4
#define MTK_FD_REG_OFFSET_INT_EN 0x15c
#define MTK_FD_REG_OFFSET_INT_VAL 0x168
#define MTK_FD_REG_OFFSET_RESULT 0x178
#define MTK_FD_SET_HW_ENABLE 0x111
#define MTK_FD_RS_BUF_SIZE 2289664
#define MTK_FD_HW_WORK_BUF_SIZE 0x100000
#define MTK_FD_MAX_SPEEDUP 7
#define MTK_FD_MAX_RESULT_NUM 1026
/* Max scale size counts */
#define MTK_FD_SCALE_ARR_NUM 15
#define MTK_FD_HW_TIMEOUT 1000
enum face_angle {
MTK_FD_FACE_FRONT,
MTK_FD_FACE_RIGHT_50,
MTK_FD_FACE_LEFT_50,
MTK_FD_FACE_RIGHT_90,
MTK_FD_FACE_LEFT_90,
MTK_FD_FACE_ANGLE_NUM,
};
struct fd_buffer {
__u32 scp_addr; /* used by SCP */
__u32 dma_addr; /* used by DMA HW */
} __packed;
struct fd_face_result {
char data[16];
};
struct fd_user_output {
struct fd_face_result results[MTK_FD_MAX_RESULT_NUM];
__u16 number;
};
struct user_param {
u8 fd_speedup;
u8 fd_extra_model;
u8 scale_img_num;
u8 src_img_fmt;
__u16 scale_img_width[MTK_FD_SCALE_ARR_NUM];
__u16 scale_img_height[MTK_FD_SCALE_ARR_NUM];
__u16 face_directions[MTK_FD_FACE_ANGLE_NUM];
} __packed;
struct fd_init_param {
struct fd_buffer fd_manager;
__u32 rs_dma_addr;
} __packed;
struct fd_enq_param {
__u64 output_vaddr;
struct fd_buffer src_img[2];
struct fd_buffer user_result;
struct user_param user_param;
} __packed;
struct fd_ack_param {
__u32 ret_code;
__u32 ret_msg;
} __packed;
struct ipi_message {
u8 cmd_id;
union {
struct fd_init_param fd_init_param;
struct fd_enq_param fd_enq_param;
struct fd_ack_param fd_ack_param;
};
} __packed;
struct mtk_fd_dev {
struct device *dev;
struct mtk_fd_ctx *ctx;
struct v4l2_device v4l2_dev;
struct v4l2_m2m_dev *m2m_dev;
struct media_device mdev;
struct video_device vfd;
struct mtk_scp *scp;
struct clk *fd_clk;
struct rproc *rproc_handle;
/* Lock for V4L2 operations */
struct mutex vfd_lock;
struct fd_user_output *output;
struct fd_buffer scp_mem;
void __iomem *fd_base;
void *rs_dma_buf;
dma_addr_t rs_dma_handle;
void *scp_mem_virt_addr;
u32 fd_stream_count;
struct completion fd_job_finished;
struct delayed_work job_timeout_work;
};
struct mtk_fd_ctx {
struct mtk_fd_dev *fd_dev;
struct device *dev;
struct v4l2_fh fh;
struct v4l2_ctrl_handler hdl;
struct v4l2_pix_format_mplane src_fmt;
struct v4l2_meta_format dst_fmt;
struct user_param user_param;
};
#endif/*__MTK_FD_HW_H__*/