162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2022 MediaTek Inc. 462306a36Sopenharmony_ci * Author: Ping-Hsun Wu <ping-hsun.wu@mediatek.com> 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifndef __MTK_MDP3_COMP_H__ 862306a36Sopenharmony_ci#define __MTK_MDP3_COMP_H__ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include "mtk-mdp3-cmdq.h" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#define MM_REG_WRITE_MASK(cmd, id, base, ofst, val, mask, ...) \ 1362306a36Sopenharmony_ci cmdq_pkt_write_mask(&((cmd)->pkt), id, \ 1462306a36Sopenharmony_ci (base) + (ofst), (val), (mask), ##__VA_ARGS__) 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#define MM_REG_WRITE(cmd, id, base, ofst, val, mask, ...) \ 1762306a36Sopenharmony_cido { \ 1862306a36Sopenharmony_ci typeof(mask) (m) = (mask); \ 1962306a36Sopenharmony_ci MM_REG_WRITE_MASK(cmd, id, base, ofst, val, \ 2062306a36Sopenharmony_ci (((m) & (ofst##_MASK)) == (ofst##_MASK)) ? \ 2162306a36Sopenharmony_ci (0xffffffff) : (m), ##__VA_ARGS__); \ 2262306a36Sopenharmony_ci} while (0) 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#define MM_REG_WAIT(cmd, evt) \ 2562306a36Sopenharmony_cido { \ 2662306a36Sopenharmony_ci typeof(cmd) (c) = (cmd); \ 2762306a36Sopenharmony_ci typeof(evt) (e) = (evt); \ 2862306a36Sopenharmony_ci cmdq_pkt_wfe(&((c)->pkt), (e), true); \ 2962306a36Sopenharmony_ci} while (0) 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci#define MM_REG_WAIT_NO_CLEAR(cmd, evt) \ 3262306a36Sopenharmony_cido { \ 3362306a36Sopenharmony_ci typeof(cmd) (c) = (cmd); \ 3462306a36Sopenharmony_ci typeof(evt) (e) = (evt); \ 3562306a36Sopenharmony_ci cmdq_pkt_wfe(&((c)->pkt), (e), false); \ 3662306a36Sopenharmony_ci} while (0) 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci#define MM_REG_CLEAR(cmd, evt) \ 3962306a36Sopenharmony_cido { \ 4062306a36Sopenharmony_ci typeof(cmd) (c) = (cmd); \ 4162306a36Sopenharmony_ci typeof(evt) (e) = (evt); \ 4262306a36Sopenharmony_ci cmdq_pkt_clear_event(&((c)->pkt), (e)); \ 4362306a36Sopenharmony_ci} while (0) 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#define MM_REG_SET_EVENT(cmd, evt) \ 4662306a36Sopenharmony_cido { \ 4762306a36Sopenharmony_ci typeof(cmd) (c) = (cmd); \ 4862306a36Sopenharmony_ci typeof(evt) (e) = (evt); \ 4962306a36Sopenharmony_ci cmdq_pkt_set_event(&((c)->pkt), (e)); \ 5062306a36Sopenharmony_ci} while (0) 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci#define MM_REG_POLL_MASK(cmd, id, base, ofst, val, _mask, ...) \ 5362306a36Sopenharmony_cido { \ 5462306a36Sopenharmony_ci typeof(_mask) (_m) = (_mask); \ 5562306a36Sopenharmony_ci cmdq_pkt_poll_mask(&((cmd)->pkt), id, \ 5662306a36Sopenharmony_ci (base) + (ofst), (val), (_m), ##__VA_ARGS__); \ 5762306a36Sopenharmony_ci} while (0) 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci#define MM_REG_POLL(cmd, id, base, ofst, val, mask, ...) \ 6062306a36Sopenharmony_cido { \ 6162306a36Sopenharmony_ci typeof(mask) (m) = (mask); \ 6262306a36Sopenharmony_ci MM_REG_POLL_MASK((cmd), id, base, ofst, val, \ 6362306a36Sopenharmony_ci (((m) & (ofst##_MASK)) == (ofst##_MASK)) ? \ 6462306a36Sopenharmony_ci (0xffffffff) : (m), ##__VA_ARGS__); \ 6562306a36Sopenharmony_ci} while (0) 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_cienum mtk_mdp_comp_id { 6862306a36Sopenharmony_ci MDP_COMP_NONE = -1, /* Invalid engine */ 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci /* ISP */ 7162306a36Sopenharmony_ci MDP_COMP_WPEI = 0, 7262306a36Sopenharmony_ci MDP_COMP_WPEO, /* 1 */ 7362306a36Sopenharmony_ci MDP_COMP_WPEI2, /* 2 */ 7462306a36Sopenharmony_ci MDP_COMP_WPEO2, /* 3 */ 7562306a36Sopenharmony_ci MDP_COMP_ISP_IMGI, /* 4 */ 7662306a36Sopenharmony_ci MDP_COMP_ISP_IMGO, /* 5 */ 7762306a36Sopenharmony_ci MDP_COMP_ISP_IMG2O, /* 6 */ 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci /* IPU */ 8062306a36Sopenharmony_ci MDP_COMP_IPUI, /* 7 */ 8162306a36Sopenharmony_ci MDP_COMP_IPUO, /* 8 */ 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci /* MDP */ 8462306a36Sopenharmony_ci MDP_COMP_CAMIN, /* 9 */ 8562306a36Sopenharmony_ci MDP_COMP_CAMIN2, /* 10 */ 8662306a36Sopenharmony_ci MDP_COMP_RDMA0, /* 11 */ 8762306a36Sopenharmony_ci MDP_COMP_AAL0, /* 12 */ 8862306a36Sopenharmony_ci MDP_COMP_CCORR0, /* 13 */ 8962306a36Sopenharmony_ci MDP_COMP_RSZ0, /* 14 */ 9062306a36Sopenharmony_ci MDP_COMP_RSZ1, /* 15 */ 9162306a36Sopenharmony_ci MDP_COMP_TDSHP0, /* 16 */ 9262306a36Sopenharmony_ci MDP_COMP_COLOR0, /* 17 */ 9362306a36Sopenharmony_ci MDP_COMP_PATH0_SOUT, /* 18 */ 9462306a36Sopenharmony_ci MDP_COMP_PATH1_SOUT, /* 19 */ 9562306a36Sopenharmony_ci MDP_COMP_WROT0, /* 20 */ 9662306a36Sopenharmony_ci MDP_COMP_WDMA, /* 21 */ 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci /* Dummy Engine */ 9962306a36Sopenharmony_ci MDP_COMP_RDMA1, /* 22 */ 10062306a36Sopenharmony_ci MDP_COMP_RSZ2, /* 23 */ 10162306a36Sopenharmony_ci MDP_COMP_TDSHP1, /* 24 */ 10262306a36Sopenharmony_ci MDP_COMP_WROT1, /* 25 */ 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci MDP_MAX_COMP_COUNT /* ALWAYS keep at the end */ 10562306a36Sopenharmony_ci}; 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_cienum mdp_comp_type { 10862306a36Sopenharmony_ci MDP_COMP_TYPE_INVALID = 0, 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci MDP_COMP_TYPE_RDMA, 11162306a36Sopenharmony_ci MDP_COMP_TYPE_RSZ, 11262306a36Sopenharmony_ci MDP_COMP_TYPE_WROT, 11362306a36Sopenharmony_ci MDP_COMP_TYPE_WDMA, 11462306a36Sopenharmony_ci MDP_COMP_TYPE_PATH, 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci MDP_COMP_TYPE_TDSHP, 11762306a36Sopenharmony_ci MDP_COMP_TYPE_COLOR, 11862306a36Sopenharmony_ci MDP_COMP_TYPE_DRE, 11962306a36Sopenharmony_ci MDP_COMP_TYPE_CCORR, 12062306a36Sopenharmony_ci MDP_COMP_TYPE_HDR, 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci MDP_COMP_TYPE_IMGI, 12362306a36Sopenharmony_ci MDP_COMP_TYPE_WPEI, 12462306a36Sopenharmony_ci MDP_COMP_TYPE_EXTO, /* External path */ 12562306a36Sopenharmony_ci MDP_COMP_TYPE_DL_PATH, /* Direct-link path */ 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci MDP_COMP_TYPE_COUNT /* ALWAYS keep at the end */ 12862306a36Sopenharmony_ci}; 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci#define MDP_GCE_NO_EVENT (-1) 13162306a36Sopenharmony_cienum { 13262306a36Sopenharmony_ci MDP_GCE_EVENT_SOF = 0, 13362306a36Sopenharmony_ci MDP_GCE_EVENT_EOF = 1, 13462306a36Sopenharmony_ci MDP_GCE_EVENT_MAX, 13562306a36Sopenharmony_ci}; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_cistruct mdp_comp_match { 13862306a36Sopenharmony_ci enum mdp_comp_type type; 13962306a36Sopenharmony_ci u32 alias_id; 14062306a36Sopenharmony_ci s32 inner_id; 14162306a36Sopenharmony_ci}; 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci/* Used to describe the item order in MDP property */ 14462306a36Sopenharmony_cistruct mdp_comp_info { 14562306a36Sopenharmony_ci u32 clk_num; 14662306a36Sopenharmony_ci u32 clk_ofst; 14762306a36Sopenharmony_ci u32 dts_reg_ofst; 14862306a36Sopenharmony_ci}; 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_cistruct mdp_comp_data { 15162306a36Sopenharmony_ci struct mdp_comp_match match; 15262306a36Sopenharmony_ci struct mdp_comp_info info; 15362306a36Sopenharmony_ci}; 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_cistruct mdp_comp_ops; 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_cistruct mdp_comp { 15862306a36Sopenharmony_ci struct mdp_dev *mdp_dev; 15962306a36Sopenharmony_ci void __iomem *regs; 16062306a36Sopenharmony_ci phys_addr_t reg_base; 16162306a36Sopenharmony_ci u8 subsys_id; 16262306a36Sopenharmony_ci u8 clk_num; 16362306a36Sopenharmony_ci struct clk **clks; 16462306a36Sopenharmony_ci struct device *comp_dev; 16562306a36Sopenharmony_ci enum mdp_comp_type type; 16662306a36Sopenharmony_ci enum mtk_mdp_comp_id public_id; 16762306a36Sopenharmony_ci s32 inner_id; 16862306a36Sopenharmony_ci u32 alias_id; 16962306a36Sopenharmony_ci s32 gce_event[MDP_GCE_EVENT_MAX]; 17062306a36Sopenharmony_ci const struct mdp_comp_ops *ops; 17162306a36Sopenharmony_ci}; 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_cistruct mdp_comp_ctx { 17462306a36Sopenharmony_ci struct mdp_comp *comp; 17562306a36Sopenharmony_ci const struct img_compparam *param; 17662306a36Sopenharmony_ci const struct img_input *input; 17762306a36Sopenharmony_ci const struct img_output *outputs[IMG_MAX_HW_OUTPUTS]; 17862306a36Sopenharmony_ci}; 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_cistruct mdp_comp_ops { 18162306a36Sopenharmony_ci s64 (*get_comp_flag)(const struct mdp_comp_ctx *ctx); 18262306a36Sopenharmony_ci int (*init_comp)(struct mdp_comp_ctx *ctx, struct mdp_cmdq_cmd *cmd); 18362306a36Sopenharmony_ci int (*config_frame)(struct mdp_comp_ctx *ctx, struct mdp_cmdq_cmd *cmd, 18462306a36Sopenharmony_ci const struct v4l2_rect *compose); 18562306a36Sopenharmony_ci int (*config_subfrm)(struct mdp_comp_ctx *ctx, 18662306a36Sopenharmony_ci struct mdp_cmdq_cmd *cmd, u32 index); 18762306a36Sopenharmony_ci int (*wait_comp_event)(struct mdp_comp_ctx *ctx, 18862306a36Sopenharmony_ci struct mdp_cmdq_cmd *cmd); 18962306a36Sopenharmony_ci int (*advance_subfrm)(struct mdp_comp_ctx *ctx, 19062306a36Sopenharmony_ci struct mdp_cmdq_cmd *cmd, u32 index); 19162306a36Sopenharmony_ci int (*post_process)(struct mdp_comp_ctx *ctx, struct mdp_cmdq_cmd *cmd); 19262306a36Sopenharmony_ci}; 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_cistruct mdp_dev; 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ciint mdp_comp_config(struct mdp_dev *mdp); 19762306a36Sopenharmony_civoid mdp_comp_destroy(struct mdp_dev *mdp); 19862306a36Sopenharmony_ciint mdp_comp_clock_on(struct device *dev, struct mdp_comp *comp); 19962306a36Sopenharmony_civoid mdp_comp_clock_off(struct device *dev, struct mdp_comp *comp); 20062306a36Sopenharmony_ciint mdp_comp_clocks_on(struct device *dev, struct mdp_comp *comps, int num); 20162306a36Sopenharmony_civoid mdp_comp_clocks_off(struct device *dev, struct mdp_comp *comps, int num); 20262306a36Sopenharmony_ciint mdp_comp_ctx_config(struct mdp_dev *mdp, struct mdp_comp_ctx *ctx, 20362306a36Sopenharmony_ci const struct img_compparam *param, 20462306a36Sopenharmony_ci const struct img_ipi_frameparam *frame); 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci#endif /* __MTK_MDP3_COMP_H__ */ 207