xref: /openbmc/linux/drivers/media/platform/mediatek/mdp3/mtk-mdp3-comp.h (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
161890ccaSMoudy Ho /* SPDX-License-Identifier: GPL-2.0-only */
261890ccaSMoudy Ho /*
361890ccaSMoudy Ho  * Copyright (c) 2022 MediaTek Inc.
461890ccaSMoudy Ho  * Author: Ping-Hsun Wu <ping-hsun.wu@mediatek.com>
561890ccaSMoudy Ho  */
661890ccaSMoudy Ho 
761890ccaSMoudy Ho #ifndef __MTK_MDP3_COMP_H__
861890ccaSMoudy Ho #define __MTK_MDP3_COMP_H__
961890ccaSMoudy Ho 
1061890ccaSMoudy Ho #include "mtk-mdp3-cmdq.h"
1161890ccaSMoudy Ho 
1261890ccaSMoudy Ho #define MM_REG_WRITE_MASK(cmd, id, base, ofst, val, mask, ...)	\
1361890ccaSMoudy Ho 	cmdq_pkt_write_mask(&((cmd)->pkt), id,			\
1461890ccaSMoudy Ho 		(base) + (ofst), (val), (mask), ##__VA_ARGS__)
1561890ccaSMoudy Ho 
1661890ccaSMoudy Ho #define MM_REG_WRITE(cmd, id, base, ofst, val, mask, ...)	\
1761890ccaSMoudy Ho do {								\
1861890ccaSMoudy Ho 	typeof(mask) (m) = (mask);				\
1961890ccaSMoudy Ho 	MM_REG_WRITE_MASK(cmd, id, base, ofst, val,		\
2061890ccaSMoudy Ho 		(((m) & (ofst##_MASK)) == (ofst##_MASK)) ?	\
2161890ccaSMoudy Ho 			(0xffffffff) : (m), ##__VA_ARGS__);	\
2261890ccaSMoudy Ho } while (0)
2361890ccaSMoudy Ho 
2461890ccaSMoudy Ho #define MM_REG_WAIT(cmd, evt)					\
2561890ccaSMoudy Ho do {								\
2661890ccaSMoudy Ho 	typeof(cmd) (c) = (cmd);				\
2761890ccaSMoudy Ho 	typeof(evt) (e) = (evt);				\
2861890ccaSMoudy Ho 	cmdq_pkt_wfe(&((c)->pkt), (e), true);			\
2961890ccaSMoudy Ho } while (0)
3061890ccaSMoudy Ho 
3161890ccaSMoudy Ho #define MM_REG_WAIT_NO_CLEAR(cmd, evt)				\
3261890ccaSMoudy Ho do {								\
3361890ccaSMoudy Ho 	typeof(cmd) (c) = (cmd);				\
3461890ccaSMoudy Ho 	typeof(evt) (e) = (evt);				\
3561890ccaSMoudy Ho 	cmdq_pkt_wfe(&((c)->pkt), (e), false);			\
3661890ccaSMoudy Ho } while (0)
3761890ccaSMoudy Ho 
3861890ccaSMoudy Ho #define MM_REG_CLEAR(cmd, evt)					\
3961890ccaSMoudy Ho do {								\
4061890ccaSMoudy Ho 	typeof(cmd) (c) = (cmd);				\
4161890ccaSMoudy Ho 	typeof(evt) (e) = (evt);				\
4261890ccaSMoudy Ho 	cmdq_pkt_clear_event(&((c)->pkt), (e));			\
4361890ccaSMoudy Ho } while (0)
4461890ccaSMoudy Ho 
4561890ccaSMoudy Ho #define MM_REG_SET_EVENT(cmd, evt)				\
4661890ccaSMoudy Ho do {								\
4761890ccaSMoudy Ho 	typeof(cmd) (c) = (cmd);				\
4861890ccaSMoudy Ho 	typeof(evt) (e) = (evt);				\
4961890ccaSMoudy Ho 	cmdq_pkt_set_event(&((c)->pkt), (e));			\
5061890ccaSMoudy Ho } while (0)
5161890ccaSMoudy Ho 
5261890ccaSMoudy Ho #define MM_REG_POLL_MASK(cmd, id, base, ofst, val, _mask, ...)	\
5361890ccaSMoudy Ho do {								\
5461890ccaSMoudy Ho 	typeof(_mask) (_m) = (_mask);				\
5561890ccaSMoudy Ho 	cmdq_pkt_poll_mask(&((cmd)->pkt), id,			\
5661890ccaSMoudy Ho 		(base) + (ofst), (val), (_m), ##__VA_ARGS__);	\
5761890ccaSMoudy Ho } while (0)
5861890ccaSMoudy Ho 
5961890ccaSMoudy Ho #define MM_REG_POLL(cmd, id, base, ofst, val, mask, ...)	\
6061890ccaSMoudy Ho do {								\
6161890ccaSMoudy Ho 	typeof(mask) (m) = (mask);				\
6261890ccaSMoudy Ho 	MM_REG_POLL_MASK((cmd), id, base, ofst, val,		\
6361890ccaSMoudy Ho 		(((m) & (ofst##_MASK)) == (ofst##_MASK)) ?	\
6461890ccaSMoudy Ho 			(0xffffffff) : (m), ##__VA_ARGS__);	\
6561890ccaSMoudy Ho } while (0)
6661890ccaSMoudy Ho 
6761890ccaSMoudy Ho enum mtk_mdp_comp_id {
6861890ccaSMoudy Ho 	MDP_COMP_NONE = -1,	/* Invalid engine */
6961890ccaSMoudy Ho 
7061890ccaSMoudy Ho 	/* ISP */
7161890ccaSMoudy Ho 	MDP_COMP_WPEI = 0,
7261890ccaSMoudy Ho 	MDP_COMP_WPEO,		/* 1 */
7361890ccaSMoudy Ho 	MDP_COMP_WPEI2,		/* 2 */
7461890ccaSMoudy Ho 	MDP_COMP_WPEO2,		/* 3 */
7561890ccaSMoudy Ho 	MDP_COMP_ISP_IMGI,	/* 4 */
7661890ccaSMoudy Ho 	MDP_COMP_ISP_IMGO,	/* 5 */
7761890ccaSMoudy Ho 	MDP_COMP_ISP_IMG2O,	/* 6 */
7861890ccaSMoudy Ho 
7961890ccaSMoudy Ho 	/* IPU */
8061890ccaSMoudy Ho 	MDP_COMP_IPUI,		/* 7 */
8161890ccaSMoudy Ho 	MDP_COMP_IPUO,		/* 8 */
8261890ccaSMoudy Ho 
8361890ccaSMoudy Ho 	/* MDP */
8461890ccaSMoudy Ho 	MDP_COMP_CAMIN,		/* 9 */
8561890ccaSMoudy Ho 	MDP_COMP_CAMIN2,	/* 10 */
8661890ccaSMoudy Ho 	MDP_COMP_RDMA0,		/* 11 */
8761890ccaSMoudy Ho 	MDP_COMP_AAL0,		/* 12 */
8861890ccaSMoudy Ho 	MDP_COMP_CCORR0,	/* 13 */
8961890ccaSMoudy Ho 	MDP_COMP_RSZ0,		/* 14 */
9061890ccaSMoudy Ho 	MDP_COMP_RSZ1,		/* 15 */
9161890ccaSMoudy Ho 	MDP_COMP_TDSHP0,	/* 16 */
9261890ccaSMoudy Ho 	MDP_COMP_COLOR0,	/* 17 */
9361890ccaSMoudy Ho 	MDP_COMP_PATH0_SOUT,	/* 18 */
9461890ccaSMoudy Ho 	MDP_COMP_PATH1_SOUT,	/* 19 */
9561890ccaSMoudy Ho 	MDP_COMP_WROT0,		/* 20 */
9661890ccaSMoudy Ho 	MDP_COMP_WDMA,		/* 21 */
9761890ccaSMoudy Ho 
9861890ccaSMoudy Ho 	/* Dummy Engine */
9961890ccaSMoudy Ho 	MDP_COMP_RDMA1,		/* 22 */
10061890ccaSMoudy Ho 	MDP_COMP_RSZ2,		/* 23 */
10161890ccaSMoudy Ho 	MDP_COMP_TDSHP1,	/* 24 */
10261890ccaSMoudy Ho 	MDP_COMP_WROT1,		/* 25 */
10361890ccaSMoudy Ho 
10461890ccaSMoudy Ho 	MDP_MAX_COMP_COUNT	/* ALWAYS keep at the end */
10561890ccaSMoudy Ho };
10661890ccaSMoudy Ho 
10761890ccaSMoudy Ho enum mdp_comp_type {
10861890ccaSMoudy Ho 	MDP_COMP_TYPE_INVALID = 0,
10961890ccaSMoudy Ho 
11061890ccaSMoudy Ho 	MDP_COMP_TYPE_RDMA,
11161890ccaSMoudy Ho 	MDP_COMP_TYPE_RSZ,
11261890ccaSMoudy Ho 	MDP_COMP_TYPE_WROT,
11361890ccaSMoudy Ho 	MDP_COMP_TYPE_WDMA,
11461890ccaSMoudy Ho 	MDP_COMP_TYPE_PATH,
11561890ccaSMoudy Ho 
11661890ccaSMoudy Ho 	MDP_COMP_TYPE_TDSHP,
11761890ccaSMoudy Ho 	MDP_COMP_TYPE_COLOR,
11861890ccaSMoudy Ho 	MDP_COMP_TYPE_DRE,
11961890ccaSMoudy Ho 	MDP_COMP_TYPE_CCORR,
12061890ccaSMoudy Ho 	MDP_COMP_TYPE_HDR,
12161890ccaSMoudy Ho 
12261890ccaSMoudy Ho 	MDP_COMP_TYPE_IMGI,
12361890ccaSMoudy Ho 	MDP_COMP_TYPE_WPEI,
12461890ccaSMoudy Ho 	MDP_COMP_TYPE_EXTO,	/* External path */
12561890ccaSMoudy Ho 	MDP_COMP_TYPE_DL_PATH,	/* Direct-link path */
12661890ccaSMoudy Ho 
12761890ccaSMoudy Ho 	MDP_COMP_TYPE_COUNT	/* ALWAYS keep at the end */
12861890ccaSMoudy Ho };
12961890ccaSMoudy Ho 
13061890ccaSMoudy Ho #define MDP_GCE_NO_EVENT (-1)
13161890ccaSMoudy Ho enum {
13261890ccaSMoudy Ho 	MDP_GCE_EVENT_SOF = 0,
13361890ccaSMoudy Ho 	MDP_GCE_EVENT_EOF = 1,
13461890ccaSMoudy Ho 	MDP_GCE_EVENT_MAX,
13561890ccaSMoudy Ho };
13661890ccaSMoudy Ho 
137b59ed26fSMoudy Ho struct mdp_comp_match {
138b59ed26fSMoudy Ho 	enum mdp_comp_type type;
139b59ed26fSMoudy Ho 	u32 alias_id;
140b59ed26fSMoudy Ho 	s32 inner_id;
141b59ed26fSMoudy Ho };
142b59ed26fSMoudy Ho 
143b59ed26fSMoudy Ho /* Used to describe the item order in MDP property */
144b59ed26fSMoudy Ho struct mdp_comp_info {
145b59ed26fSMoudy Ho 	u32 clk_num;
146b59ed26fSMoudy Ho 	u32 clk_ofst;
147b59ed26fSMoudy Ho 	u32 dts_reg_ofst;
148b59ed26fSMoudy Ho };
149b59ed26fSMoudy Ho 
150b59ed26fSMoudy Ho struct mdp_comp_data {
151b59ed26fSMoudy Ho 	struct mdp_comp_match match;
152b59ed26fSMoudy Ho 	struct mdp_comp_info info;
153b59ed26fSMoudy Ho };
154b59ed26fSMoudy Ho 
15561890ccaSMoudy Ho struct mdp_comp_ops;
15661890ccaSMoudy Ho 
15761890ccaSMoudy Ho struct mdp_comp {
15861890ccaSMoudy Ho 	struct mdp_dev			*mdp_dev;
15961890ccaSMoudy Ho 	void __iomem			*regs;
16061890ccaSMoudy Ho 	phys_addr_t			reg_base;
16161890ccaSMoudy Ho 	u8				subsys_id;
162*c4320f97SMoudy Ho 	u8				clk_num;
163*c4320f97SMoudy Ho 	struct clk			**clks;
16461890ccaSMoudy Ho 	struct device			*comp_dev;
16561890ccaSMoudy Ho 	enum mdp_comp_type		type;
166b59ed26fSMoudy Ho 	enum mtk_mdp_comp_id		public_id;
167b59ed26fSMoudy Ho 	s32				inner_id;
16861890ccaSMoudy Ho 	u32				alias_id;
16961890ccaSMoudy Ho 	s32				gce_event[MDP_GCE_EVENT_MAX];
17061890ccaSMoudy Ho 	const struct mdp_comp_ops	*ops;
17161890ccaSMoudy Ho };
17261890ccaSMoudy Ho 
17361890ccaSMoudy Ho struct mdp_comp_ctx {
17461890ccaSMoudy Ho 	struct mdp_comp			*comp;
17561890ccaSMoudy Ho 	const struct img_compparam	*param;
17661890ccaSMoudy Ho 	const struct img_input		*input;
17761890ccaSMoudy Ho 	const struct img_output		*outputs[IMG_MAX_HW_OUTPUTS];
17861890ccaSMoudy Ho };
17961890ccaSMoudy Ho 
18061890ccaSMoudy Ho struct mdp_comp_ops {
18161890ccaSMoudy Ho 	s64 (*get_comp_flag)(const struct mdp_comp_ctx *ctx);
18261890ccaSMoudy Ho 	int (*init_comp)(struct mdp_comp_ctx *ctx, struct mdp_cmdq_cmd *cmd);
18361890ccaSMoudy Ho 	int (*config_frame)(struct mdp_comp_ctx *ctx, struct mdp_cmdq_cmd *cmd,
18461890ccaSMoudy Ho 			    const struct v4l2_rect *compose);
18561890ccaSMoudy Ho 	int (*config_subfrm)(struct mdp_comp_ctx *ctx,
18661890ccaSMoudy Ho 			     struct mdp_cmdq_cmd *cmd, u32 index);
18761890ccaSMoudy Ho 	int (*wait_comp_event)(struct mdp_comp_ctx *ctx,
18861890ccaSMoudy Ho 			       struct mdp_cmdq_cmd *cmd);
18961890ccaSMoudy Ho 	int (*advance_subfrm)(struct mdp_comp_ctx *ctx,
19061890ccaSMoudy Ho 			      struct mdp_cmdq_cmd *cmd, u32 index);
19161890ccaSMoudy Ho 	int (*post_process)(struct mdp_comp_ctx *ctx, struct mdp_cmdq_cmd *cmd);
19261890ccaSMoudy Ho };
19361890ccaSMoudy Ho 
19461890ccaSMoudy Ho struct mdp_dev;
19561890ccaSMoudy Ho 
19661890ccaSMoudy Ho int mdp_comp_config(struct mdp_dev *mdp);
19761890ccaSMoudy Ho void mdp_comp_destroy(struct mdp_dev *mdp);
19861890ccaSMoudy Ho int mdp_comp_clock_on(struct device *dev, struct mdp_comp *comp);
19961890ccaSMoudy Ho void mdp_comp_clock_off(struct device *dev, struct mdp_comp *comp);
20061890ccaSMoudy Ho int mdp_comp_clocks_on(struct device *dev, struct mdp_comp *comps, int num);
20161890ccaSMoudy Ho void mdp_comp_clocks_off(struct device *dev, struct mdp_comp *comps, int num);
20261890ccaSMoudy Ho int mdp_comp_ctx_config(struct mdp_dev *mdp, struct mdp_comp_ctx *ctx,
20361890ccaSMoudy Ho 			const struct img_compparam *param,
20461890ccaSMoudy Ho 			const struct img_ipi_frameparam *frame);
20561890ccaSMoudy Ho 
20661890ccaSMoudy Ho #endif  /* __MTK_MDP3_COMP_H__ */
207