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