162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2022 MediaTek Inc.
462306a36Sopenharmony_ci * Author: Holmes Chiou <holmes.chiou@mediatek.com>
562306a36Sopenharmony_ci *         Ping-Hsun Wu <ping-hsun.wu@mediatek.com>
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef __MTK_IMG_IPI_H__
962306a36Sopenharmony_ci#define __MTK_IMG_IPI_H__
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/err.h>
1262306a36Sopenharmony_ci#include "mdp_sm_mt8183.h"
1362306a36Sopenharmony_ci#include "mtk-mdp3-type.h"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/* ISP-MDP generic input information */
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define IMG_IPI_INIT    1
1862306a36Sopenharmony_ci#define IMG_IPI_DEINIT  2
1962306a36Sopenharmony_ci#define IMG_IPI_FRAME   3
2062306a36Sopenharmony_ci#define IMG_IPI_DEBUG   4
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistruct img_timeval {
2362306a36Sopenharmony_ci	u32 tv_sec;
2462306a36Sopenharmony_ci	u32 tv_usec;
2562306a36Sopenharmony_ci} __packed;
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistruct img_addr {
2862306a36Sopenharmony_ci	u64 va; /* Used for Linux OS access */
2962306a36Sopenharmony_ci	u32 pa; /* Used for CM4 access */
3062306a36Sopenharmony_ci	u32 iova; /* Used for IOMMU HW access */
3162306a36Sopenharmony_ci} __packed;
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cistruct tuning_addr {
3462306a36Sopenharmony_ci	u64	present;
3562306a36Sopenharmony_ci	u32	pa;	/* Used for CM4 access */
3662306a36Sopenharmony_ci	u32	iova;	/* Used for IOMMU HW access */
3762306a36Sopenharmony_ci} __packed;
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_cistruct img_sw_addr {
4062306a36Sopenharmony_ci	u64 va; /* Used for APMCU access */
4162306a36Sopenharmony_ci	u32 pa; /* Used for CM4 access */
4262306a36Sopenharmony_ci} __packed;
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistruct img_plane_format {
4562306a36Sopenharmony_ci	u32 size;
4662306a36Sopenharmony_ci	u32 stride;
4762306a36Sopenharmony_ci} __packed;
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_cistruct img_pix_format {
5062306a36Sopenharmony_ci	u32 width;
5162306a36Sopenharmony_ci	u32 height;
5262306a36Sopenharmony_ci	u32 colorformat; /* enum mdp_color */
5362306a36Sopenharmony_ci	u32 ycbcr_prof; /* enum mdp_ycbcr_profile */
5462306a36Sopenharmony_ci	struct img_plane_format plane_fmt[IMG_MAX_PLANES];
5562306a36Sopenharmony_ci} __packed;
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cistruct img_image_buffer {
5862306a36Sopenharmony_ci	struct img_pix_format format;
5962306a36Sopenharmony_ci	u32 iova[IMG_MAX_PLANES];
6062306a36Sopenharmony_ci	/* enum mdp_buffer_usage, FD or advanced ISP usages */
6162306a36Sopenharmony_ci	u32 usage;
6262306a36Sopenharmony_ci} __packed;
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci#define IMG_SUBPIXEL_SHIFT	20
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci#define IMG_CTRL_FLAG_HFLIP	BIT(0)
6762306a36Sopenharmony_ci#define IMG_CTRL_FLAG_DITHER	BIT(1)
6862306a36Sopenharmony_ci#define IMG_CTRL_FLAG_SHARPNESS	BIT(4)
6962306a36Sopenharmony_ci#define IMG_CTRL_FLAG_HDR	BIT(5)
7062306a36Sopenharmony_ci#define IMG_CTRL_FLAG_DRE	BIT(6)
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cistruct img_input {
7362306a36Sopenharmony_ci	struct img_image_buffer buffer;
7462306a36Sopenharmony_ci	u32 flags; /* HDR, DRE, dither */
7562306a36Sopenharmony_ci} __packed;
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_cistruct img_output {
7862306a36Sopenharmony_ci	struct img_image_buffer buffer;
7962306a36Sopenharmony_ci	struct img_crop crop;
8062306a36Sopenharmony_ci	s32 rotation;
8162306a36Sopenharmony_ci	u32 flags; /* H-flip, sharpness, dither */
8262306a36Sopenharmony_ci} __packed;
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_cistruct img_ipi_frameparam {
8562306a36Sopenharmony_ci	u32 index;
8662306a36Sopenharmony_ci	u32 frame_no;
8762306a36Sopenharmony_ci	struct img_timeval timestamp;
8862306a36Sopenharmony_ci	u32 type; /* enum mdp_stream_type */
8962306a36Sopenharmony_ci	u32 state;
9062306a36Sopenharmony_ci	u32 num_inputs;
9162306a36Sopenharmony_ci	u32 num_outputs;
9262306a36Sopenharmony_ci	u64 drv_data;
9362306a36Sopenharmony_ci	struct img_input inputs[IMG_MAX_HW_INPUTS];
9462306a36Sopenharmony_ci	struct img_output outputs[IMG_MAX_HW_OUTPUTS];
9562306a36Sopenharmony_ci	struct tuning_addr tuning_data;
9662306a36Sopenharmony_ci	struct img_addr subfrm_data;
9762306a36Sopenharmony_ci	struct img_sw_addr config_data;
9862306a36Sopenharmony_ci	struct img_sw_addr self_data;
9962306a36Sopenharmony_ci} __packed;
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_cistruct img_sw_buffer {
10262306a36Sopenharmony_ci	u64	handle;		/* Used for APMCU access */
10362306a36Sopenharmony_ci	u32	scp_addr;	/* Used for CM4 access */
10462306a36Sopenharmony_ci} __packed;
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_cistruct img_ipi_param {
10762306a36Sopenharmony_ci	u32 usage;
10862306a36Sopenharmony_ci	struct img_sw_buffer frm_param;
10962306a36Sopenharmony_ci} __packed;
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_cistruct img_frameparam {
11262306a36Sopenharmony_ci	struct list_head list_entry;
11362306a36Sopenharmony_ci	struct img_ipi_frameparam frameparam;
11462306a36Sopenharmony_ci} __packed;
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci/* Platform config indicator */
11762306a36Sopenharmony_ci#define MT8183 8183
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci#define CFG_CHECK(plat, p_id) ((plat) == (p_id))
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci#define _CFG_OFST(plat, cfg, ofst) ((void *)(&((cfg)->config_##plat) + (ofst)))
12262306a36Sopenharmony_ci#define CFG_OFST(plat, cfg, ofst) \
12362306a36Sopenharmony_ci	(IS_ERR_OR_NULL(cfg) ? NULL : _CFG_OFST(plat, cfg, ofst))
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci#define _CFG_ADDR(plat, cfg, mem) (&((cfg)->config_##plat.mem))
12662306a36Sopenharmony_ci#define CFG_ADDR(plat, cfg, mem) \
12762306a36Sopenharmony_ci	(IS_ERR_OR_NULL(cfg) ? NULL : _CFG_ADDR(plat, cfg, mem))
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci#define _CFG_GET(plat, cfg, mem) ((cfg)->config_##plat.mem)
13062306a36Sopenharmony_ci#define CFG_GET(plat, cfg, mem) \
13162306a36Sopenharmony_ci	(IS_ERR_OR_NULL(cfg) ? 0 : _CFG_GET(plat, cfg, mem))
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci#define _CFG_COMP(plat, comp, mem) ((comp)->comp_##plat.mem)
13462306a36Sopenharmony_ci#define CFG_COMP(plat, comp, mem) \
13562306a36Sopenharmony_ci	(IS_ERR_OR_NULL(comp) ? 0 : _CFG_COMP(plat, comp, mem))
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_cistruct img_config {
13862306a36Sopenharmony_ci	union {
13962306a36Sopenharmony_ci		struct img_config_8183 config_8183;
14062306a36Sopenharmony_ci	};
14162306a36Sopenharmony_ci} __packed;
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_cistruct img_compparam {
14462306a36Sopenharmony_ci	union {
14562306a36Sopenharmony_ci		struct img_compparam_8183 comp_8183;
14662306a36Sopenharmony_ci	};
14762306a36Sopenharmony_ci} __packed;
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci#endif  /* __MTK_IMG_IPI_H__ */
150