#ifndef __MTK_MDP3_COMP_H__
#define __MTK_MDP3_COMP_H__
#include "mtk-mdp3-cmdq.h"
#define MM_REG_WRITE_MASK(cmd, id, base, ofst, val, mask) \
do { \
typeof(mask) (m) = (mask); \
cmdq_pkt_write_mask(&((cmd)->pkt), id, (base) + (ofst), \
(val), \
(((m) & (ofst##_MASK)) == (ofst##_MASK)) ? \
(0xffffffff) : (m)); \
} while (0)
#define MM_REG_WRITE(cmd, id, base, ofst, val) \
cmdq_pkt_write(&((cmd)->pkt), id, (base) + (ofst), (val))
#define MM_REG_WAIT(cmd, evt) \
do { \
typeof(cmd) (c) = (cmd); \
typeof(evt) (e) = (evt); \
cmdq_pkt_wfe(&((c)->pkt), (e), true); \
} while (0)
#define MM_REG_WAIT_NO_CLEAR(cmd, evt) \
do { \
typeof(cmd) (c) = (cmd); \
typeof(evt) (e) = (evt); \
cmdq_pkt_wfe(&((c)->pkt), (e), false); \
} while (0)
#define MM_REG_CLEAR(cmd, evt) \
do { \
typeof(cmd) (c) = (cmd); \
typeof(evt) (e) = (evt); \
cmdq_pkt_clear_event(&((c)->pkt), (e)); \
} while (0)
#define MM_REG_SET_EVENT(cmd, evt) \
do { \
typeof(cmd) (c) = (cmd); \
typeof(evt) (e) = (evt); \
cmdq_pkt_set_event(&((c)->pkt), (e)); \
} while (0)
#define MM_REG_POLL_MASK(cmd, id, base, ofst, val, _mask) \
do { \
typeof(_mask) (_m) = (_mask); \
cmdq_pkt_poll_mask(&((cmd)->pkt), id, \
(base) + (ofst), (val), \
(((_m) & (ofst##_MASK)) == (ofst##_MASK)) ? \
(0xffffffff) : (_m)); \
} while (0)
#define MM_REG_POLL(cmd, id, base, ofst, val) \
cmdq_pkt_poll(&((cmd)->pkt), id, (base) + (ofst), (val))
enum mtk_mdp_comp_id {
MDP_COMP_NONE = -1,
MDP_COMP_WPEI = 0,
MDP_COMP_WPEO,
MDP_COMP_WPEI2,
MDP_COMP_WPEO2,
MDP_COMP_ISP_IMGI,
MDP_COMP_ISP_IMGO,
MDP_COMP_ISP_IMG2O,
MDP_COMP_IPUI,
MDP_COMP_IPUO,
MDP_COMP_CAMIN,
MDP_COMP_CAMIN2,
MDP_COMP_RDMA0,
MDP_COMP_RDMA1,
MDP_COMP_RDMA2,
MDP_COMP_RDMA3,
MDP_COMP_AAL0,
MDP_COMP_AAL1,
MDP_COMP_AAL2,
MDP_COMP_AAL3,
MDP_COMP_CCORR0,
MDP_COMP_RSZ0,
MDP_COMP_RSZ1,
MDP_COMP_RSZ2,
MDP_COMP_RSZ3,
MDP_COMP_TDSHP0,
MDP_COMP_TDSHP1,
MDP_COMP_TDSHP2,
MDP_COMP_TDSHP3,
MDP_COMP_COLOR0,
MDP_COMP_COLOR1,
MDP_COMP_COLOR2,
MDP_COMP_COLOR3,
MDP_COMP_PATH0_SOUT,
MDP_COMP_PATH1_SOUT,
MDP_COMP_WROT0,
MDP_COMP_WROT1,
MDP_COMP_WROT2,
MDP_COMP_WROT3,
MDP_COMP_WDMA,
MDP_COMP_SPLIT,
MDP_COMP_SPLIT2,
MDP_COMP_STITCH,
MDP_COMP_FG0,
MDP_COMP_FG1,
MDP_COMP_FG2,
MDP_COMP_FG3,
MDP_COMP_TO_SVPP2MOUT,
MDP_COMP_TO_SVPP3MOUT,
MDP_COMP_TO_WARP0MOUT,
MDP_COMP_TO_WARP1MOUT,
MDP_COMP_VPP0_SOUT,
MDP_COMP_VPP1_SOUT,
MDP_COMP_PQ0_SOUT,
MDP_COMP_PQ1_SOUT,
MDP_COMP_HDR0,
MDP_COMP_HDR1,
MDP_COMP_HDR2,
MDP_COMP_HDR3,
MDP_COMP_OVL0,
MDP_COMP_OVL1,
MDP_COMP_PAD0,
MDP_COMP_PAD1,
MDP_COMP_PAD2,
MDP_COMP_PAD3,
MDP_COMP_TCC0,
MDP_COMP_TCC1,
MDP_COMP_MERGE2,
MDP_COMP_MERGE3,
MDP_COMP_VDO0DL0,
MDP_COMP_VDO1DL0,
MDP_COMP_VDO0DL1,
MDP_COMP_VDO1DL1,
MDP_MAX_COMP_COUNT
};
enum mdp_comp_type {
MDP_COMP_TYPE_INVALID = 0,
MDP_COMP_TYPE_RDMA,
MDP_COMP_TYPE_RSZ,
MDP_COMP_TYPE_WROT,
MDP_COMP_TYPE_WDMA,
MDP_COMP_TYPE_PATH,
MDP_COMP_TYPE_TDSHP,
MDP_COMP_TYPE_COLOR,
MDP_COMP_TYPE_DRE,
MDP_COMP_TYPE_CCORR,
MDP_COMP_TYPE_AAL,
MDP_COMP_TYPE_TCC,
MDP_COMP_TYPE_HDR,
MDP_COMP_TYPE_SPLIT,
MDP_COMP_TYPE_STITCH,
MDP_COMP_TYPE_FG,
MDP_COMP_TYPE_OVL,
MDP_COMP_TYPE_PAD,
MDP_COMP_TYPE_MERGE,
MDP_COMP_TYPE_IMGI,
MDP_COMP_TYPE_WPEI,
MDP_COMP_TYPE_EXTO,
MDP_COMP_TYPE_DL_PATH,
MDP_COMP_TYPE_DUMMY,
MDP_COMP_TYPE_COUNT
};
#define MDP_GCE_NO_EVENT (-1)
enum {
MDP_GCE_EVENT_SOF = 0,
MDP_GCE_EVENT_EOF = 1,
MDP_GCE_EVENT_MAX,
};
struct mdp_comp_match {
enum mdp_comp_type type;
u32 alias_id;
s32 inner_id;
s32 subsys_id;
};
struct mdp_comp_info {
u32 clk_num;
u32 clk_ofst;
u32 dts_reg_ofst;
};
struct mdp_comp_blend {
enum mtk_mdp_comp_id b_id;
bool aid_mod;
bool aid_clk;
};
struct mdp_comp_data {
struct mdp_comp_match match;
struct mdp_comp_info info;
struct mdp_comp_blend blend;
};
struct mdp_comp_ops;
struct mdp_comp {
struct mdp_dev *mdp_dev;
void __iomem *regs;
phys_addr_t reg_base;
u8 subsys_id;
u8 clk_num;
struct clk **clks;
struct device *comp_dev;
enum mdp_comp_type type;
enum mtk_mdp_comp_id public_id;
s32 inner_id;
u32 alias_id;
s32 gce_event[MDP_GCE_EVENT_MAX];
const struct mdp_comp_ops *ops;
};
struct mdp_comp_ctx {
struct mdp_comp *comp;
const struct img_compparam *param;
const struct img_input *input;
const struct img_output *outputs[IMG_MAX_HW_OUTPUTS];
};
struct mdp_comp_ops {
s64 (*get_comp_flag)(const struct mdp_comp_ctx *ctx);
int (*init_comp)(struct mdp_comp_ctx *ctx, struct mdp_cmdq_cmd *cmd);
int (*config_frame)(struct mdp_comp_ctx *ctx, struct mdp_cmdq_cmd *cmd,
const struct v4l2_rect *compose);
int (*config_subfrm)(struct mdp_comp_ctx *ctx,
struct mdp_cmdq_cmd *cmd, u32 index);
int (*wait_comp_event)(struct mdp_comp_ctx *ctx,
struct mdp_cmdq_cmd *cmd);
int (*advance_subfrm)(struct mdp_comp_ctx *ctx,
struct mdp_cmdq_cmd *cmd, u32 index);
int (*post_process)(struct mdp_comp_ctx *ctx, struct mdp_cmdq_cmd *cmd);
};
struct mdp_dev;
int mdp_comp_config(struct mdp_dev *mdp);
void mdp_comp_destroy(struct mdp_dev *mdp);
int mdp_comp_clock_on(struct device *dev, struct mdp_comp *comp);
void mdp_comp_clock_off(struct device *dev, struct mdp_comp *comp);
int mdp_comp_clocks_on(struct device *dev, struct mdp_comp *comps, int num);
void mdp_comp_clocks_off(struct device *dev, struct mdp_comp *comps, int num);
int mdp_comp_ctx_config(struct mdp_dev *mdp, struct mdp_comp_ctx *ctx,
const struct img_compparam *param,
const struct img_ipi_frameparam *frame);
#endif