xref: /openbmc/linux/drivers/media/platform/mediatek/mdp3/mtk-mdp3-core.h (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
1  /* SPDX-License-Identifier: GPL-2.0-only */
2  /*
3   * Copyright (c) 2022 MediaTek Inc.
4   * Author: Ping-Hsun Wu <ping-hsun.wu@mediatek.com>
5   */
6  
7  #ifndef __MTK_MDP3_CORE_H__
8  #define __MTK_MDP3_CORE_H__
9  
10  #include <media/v4l2-device.h>
11  #include <media/v4l2-mem2mem.h>
12  #include <linux/soc/mediatek/mtk-mmsys.h>
13  #include <linux/soc/mediatek/mtk-mutex.h>
14  #include "mtk-mdp3-comp.h"
15  #include "mtk-mdp3-vpu.h"
16  
17  #define MDP_MODULE_NAME		"mtk-mdp3"
18  #define MDP_DEVICE_NAME		"MediaTek MDP3"
19  #define MDP_PHANDLE_NAME	"mediatek,mdp3"
20  
21  enum mdp_infra_id {
22  	MDP_INFRA_MMSYS,
23  	MDP_INFRA_MUTEX,
24  	MDP_INFRA_SCP,
25  	MDP_INFRA_MAX
26  };
27  
28  enum mdp_buffer_usage {
29  	MDP_BUFFER_USAGE_HW_READ,
30  	MDP_BUFFER_USAGE_MDP,
31  	MDP_BUFFER_USAGE_MDP2,
32  	MDP_BUFFER_USAGE_ISP,
33  	MDP_BUFFER_USAGE_WPE,
34  };
35  
36  struct mdp_platform_config {
37  	bool	rdma_support_10bit;
38  	bool	rdma_rsz1_sram_sharing;
39  	bool	rdma_upsample_repeat_only;
40  	bool	rsz_disable_dcm_small_sample;
41  	bool	wrot_filter_constraint;
42  };
43  
44  /* indicate which mutex is used by each pipepline */
45  enum mdp_pipe_id {
46  	MDP_PIPE_WPEI,
47  	MDP_PIPE_WPEI2,
48  	MDP_PIPE_IMGI,
49  	MDP_PIPE_RDMA0,
50  	MDP_PIPE_MAX
51  };
52  
53  struct mtk_mdp_driver_data {
54  	const int mdp_plat_id;
55  	const struct of_device_id *mdp_probe_infra;
56  	const struct mdp_platform_config *mdp_cfg;
57  	const u32 *mdp_mutex_table_idx;
58  	const struct mdp_comp_data *comp_data;
59  	unsigned int comp_data_len;
60  	const struct of_device_id *mdp_sub_comp_dt_ids;
61  	const struct mdp_format *format;
62  	unsigned int format_len;
63  	const struct mdp_limit *def_limit;
64  	const struct mdp_pipe_info *pipe_info;
65  	unsigned int pipe_info_len;
66  };
67  
68  struct mdp_dev {
69  	struct platform_device			*pdev;
70  	struct device				*mdp_mmsys;
71  	struct mtk_mutex			*mdp_mutex[MDP_PIPE_MAX];
72  	struct mdp_comp				*comp[MDP_MAX_COMP_COUNT];
73  	const struct mtk_mdp_driver_data	*mdp_data;
74  
75  	struct workqueue_struct			*job_wq;
76  	struct workqueue_struct			*clock_wq;
77  	struct mdp_vpu_dev			vpu;
78  	struct mtk_scp				*scp;
79  	struct rproc				*rproc_handle;
80  	/* synchronization protect for accessing vpu working buffer info */
81  	struct mutex				vpu_lock;
82  	s32					vpu_count;
83  	u32					id_count;
84  	struct ida				mdp_ida;
85  	struct cmdq_client			*cmdq_clt;
86  	wait_queue_head_t			callback_wq;
87  
88  	struct v4l2_device			v4l2_dev;
89  	struct video_device			*m2m_vdev;
90  	struct v4l2_m2m_dev			*m2m_dev;
91  	/* synchronization protect for m2m device operation */
92  	struct mutex				m2m_lock;
93  	atomic_t				suspended;
94  	atomic_t				job_count;
95  };
96  
97  struct mdp_pipe_info {
98  	enum mdp_pipe_id pipe_id;
99  	u32 mutex_id;
100  };
101  
102  int mdp_vpu_get_locked(struct mdp_dev *mdp);
103  void mdp_vpu_put_locked(struct mdp_dev *mdp);
104  int mdp_vpu_register(struct mdp_dev *mdp);
105  void mdp_vpu_unregister(struct mdp_dev *mdp);
106  void mdp_video_device_release(struct video_device *vdev);
107  
108  #endif  /* __MTK_MDP3_CORE_H__ */
109