xref: /OK3568_Linux_fs/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (c) 2021 Rockchip Electronics Co., Ltd
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * author:
6*4882a593Smuzhiyun  *	Herman Chen <herman.chen@rock-chips.com>
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun #ifndef __ROCKCHIP_MPP_RKVDEC2_H__
10*4882a593Smuzhiyun #define __ROCKCHIP_MPP_RKVDEC2_H__
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include <linux/dma-iommu.h>
13*4882a593Smuzhiyun #include <linux/iopoll.h>
14*4882a593Smuzhiyun #include <linux/of_platform.h>
15*4882a593Smuzhiyun #include <linux/of_address.h>
16*4882a593Smuzhiyun #include <linux/slab.h>
17*4882a593Smuzhiyun #include <linux/uaccess.h>
18*4882a593Smuzhiyun #include <linux/regmap.h>
19*4882a593Smuzhiyun #include <linux/kernel.h>
20*4882a593Smuzhiyun #include <linux/thermal.h>
21*4882a593Smuzhiyun #include <linux/notifier.h>
22*4882a593Smuzhiyun #include <linux/proc_fs.h>
23*4882a593Smuzhiyun #include <linux/nospec.h>
24*4882a593Smuzhiyun #include <linux/rockchip/rockchip_sip.h>
25*4882a593Smuzhiyun #include <linux/regulator/consumer.h>
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #include <soc/rockchip/pm_domains.h>
28*4882a593Smuzhiyun #include <soc/rockchip/rockchip_sip.h>
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #include "mpp_debug.h"
31*4882a593Smuzhiyun #include "mpp_common.h"
32*4882a593Smuzhiyun #include "mpp_iommu.h"
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #define RKVDEC_DRIVER_NAME		"mpp_rkvdec2"
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun #define RKVDEC_REG_IMPORTANT_BASE	0x2c
37*4882a593Smuzhiyun #define RKVDEC_REG_IMPORTANT_INDEX	11
38*4882a593Smuzhiyun #define RKVDEC_SOFTREST_EN		BIT(20)
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun #define	RKVDEC_SESSION_MAX_BUFFERS	40
41*4882a593Smuzhiyun /* The maximum registers number of all the version */
42*4882a593Smuzhiyun #define RKVDEC_REG_NUM			279
43*4882a593Smuzhiyun #define RKVDEC_REG_HW_ID_INDEX		0
44*4882a593Smuzhiyun #define RKVDEC_REG_START_INDEX		0
45*4882a593Smuzhiyun #define RKVDEC_REG_END_INDEX		278
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun #define REVDEC_GET_PROD_NUM(x)		(((x) >> 16) & 0xffff)
48*4882a593Smuzhiyun #define RKVDEC_REG_FORMAT_INDEX		9
49*4882a593Smuzhiyun #define RKVDEC_GET_FORMAT(x)		((x) & 0x3ff)
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun #define RKVDEC_REG_START_EN_BASE       0x28
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun #define RKVDEC_REG_START_EN_INDEX      10
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #define RKVDEC_START_EN			BIT(0)
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun #define RKVDEC_REG_YSTRIDE_INDEX	20
58*4882a593Smuzhiyun #define RKVDEC_REG_CORE_CTRL_INDEX	28
59*4882a593Smuzhiyun #define RKVDEC_REG_FILM_IDX_MASK	(0x3ff0000)
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun #define RKVDEC_REG_RLC_BASE		0x200
62*4882a593Smuzhiyun #define RKVDEC_REG_RLC_BASE_INDEX	(128)
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun #define RKVDEC_REG_INT_EN		0x380
65*4882a593Smuzhiyun #define RKVDEC_REG_INT_EN_INDEX		(224)
66*4882a593Smuzhiyun #define RKVDEC_SOFT_RESET_READY		BIT(9)
67*4882a593Smuzhiyun #define RKVDEC_CABAC_END_STA		BIT(8)
68*4882a593Smuzhiyun #define RKVDEC_COLMV_REF_ERR_STA	BIT(7)
69*4882a593Smuzhiyun #define RKVDEC_BUF_EMPTY_STA		BIT(6)
70*4882a593Smuzhiyun #define RKVDEC_TIMEOUT_STA		BIT(5)
71*4882a593Smuzhiyun #define RKVDEC_ERROR_STA		BIT(4)
72*4882a593Smuzhiyun #define RKVDEC_BUS_STA			BIT(3)
73*4882a593Smuzhiyun #define RKVDEC_READY_STA		BIT(2)
74*4882a593Smuzhiyun #define RKVDEC_IRQ_RAW			BIT(1)
75*4882a593Smuzhiyun #define RKVDEC_IRQ			BIT(0)
76*4882a593Smuzhiyun #define RKVDEC_INT_ERROR_MASK		(RKVDEC_COLMV_REF_ERR_STA |\
77*4882a593Smuzhiyun 					RKVDEC_BUF_EMPTY_STA |\
78*4882a593Smuzhiyun 					RKVDEC_TIMEOUT_STA |\
79*4882a593Smuzhiyun 					RKVDEC_ERROR_STA)
80*4882a593Smuzhiyun #define RKVDEC_PERF_WORKING_CNT		0x41c
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun /* perf sel reference register */
83*4882a593Smuzhiyun #define RKVDEC_PERF_SEL_OFFSET		0x20000
84*4882a593Smuzhiyun #define RKVDEC_PERF_SEL_NUM		64
85*4882a593Smuzhiyun #define RKVDEC_PERF_SEL_BASE		0x424
86*4882a593Smuzhiyun #define RKVDEC_SEL_VAL0_BASE		0x428
87*4882a593Smuzhiyun #define RKVDEC_SEL_VAL1_BASE		0x42c
88*4882a593Smuzhiyun #define RKVDEC_SEL_VAL2_BASE		0x430
89*4882a593Smuzhiyun #define RKVDEC_SET_PERF_SEL(a, b, c)	((a) | ((b) << 8) | ((c) << 16))
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun /* cache reference register */
92*4882a593Smuzhiyun #define RKVDEC_REG_CACHE0_SIZE_BASE	0x51c
93*4882a593Smuzhiyun #define RKVDEC_REG_CACHE1_SIZE_BASE	0x55c
94*4882a593Smuzhiyun #define RKVDEC_REG_CACHE2_SIZE_BASE	0x59c
95*4882a593Smuzhiyun #define RKVDEC_REG_CLR_CACHE0_BASE	0x510
96*4882a593Smuzhiyun #define RKVDEC_REG_CLR_CACHE1_BASE	0x550
97*4882a593Smuzhiyun #define RKVDEC_REG_CLR_CACHE2_BASE	0x590
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun #define RKVDEC_CACHE_PERMIT_CACHEABLE_ACCESS	BIT(0)
100*4882a593Smuzhiyun #define RKVDEC_CACHE_PERMIT_READ_ALLOCATE	BIT(1)
101*4882a593Smuzhiyun #define RKVDEC_CACHE_LINE_SIZE_64_BYTES		BIT(4)
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun #define to_rkvdec2_task(task)		\
104*4882a593Smuzhiyun 		container_of(task, struct rkvdec2_task, mpp_task)
105*4882a593Smuzhiyun #define to_rkvdec2_dev(dev)		\
106*4882a593Smuzhiyun 		container_of(dev, struct rkvdec2_dev, mpp)
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun enum RKVDEC_FMT {
109*4882a593Smuzhiyun 	RKVDEC_FMT_H265D	= 0,
110*4882a593Smuzhiyun 	RKVDEC_FMT_H264D	= 1,
111*4882a593Smuzhiyun 	RKVDEC_FMT_VP9D		= 2,
112*4882a593Smuzhiyun 	RKVDEC_FMT_AVS2		= 3,
113*4882a593Smuzhiyun };
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun #define RKVDEC_MAX_RCB_NUM		(16)
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun struct rcb_info_elem {
118*4882a593Smuzhiyun 	u32 index;
119*4882a593Smuzhiyun 	u32 size;
120*4882a593Smuzhiyun };
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun struct rkvdec2_rcb_info {
123*4882a593Smuzhiyun 	u32 cnt;
124*4882a593Smuzhiyun 	struct rcb_info_elem elem[RKVDEC_MAX_RCB_NUM];
125*4882a593Smuzhiyun };
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun struct rkvdec2_task {
128*4882a593Smuzhiyun 	struct mpp_task mpp_task;
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun 	enum MPP_CLOCK_MODE clk_mode;
131*4882a593Smuzhiyun 	u32 reg[RKVDEC_REG_NUM];
132*4882a593Smuzhiyun 	struct reg_offset_info off_inf;
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun 	/* perf sel data back */
135*4882a593Smuzhiyun 	u32 reg_sel[RKVDEC_PERF_SEL_NUM];
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun 	u32 strm_addr;
138*4882a593Smuzhiyun 	u32 irq_status;
139*4882a593Smuzhiyun 	/* req for current task */
140*4882a593Smuzhiyun 	u32 w_req_cnt;
141*4882a593Smuzhiyun 	struct mpp_request w_reqs[MPP_MAX_MSG_NUM];
142*4882a593Smuzhiyun 	u32 r_req_cnt;
143*4882a593Smuzhiyun 	struct mpp_request r_reqs[MPP_MAX_MSG_NUM];
144*4882a593Smuzhiyun 	/* image info */
145*4882a593Smuzhiyun 	u32 width;
146*4882a593Smuzhiyun 	u32 height;
147*4882a593Smuzhiyun 	u32 pixels;
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun 	/* task index for link table rnunning list */
150*4882a593Smuzhiyun 	int slot_idx;
151*4882a593Smuzhiyun 	u32 need_hack;
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun 	/* link table DMA buffer */
154*4882a593Smuzhiyun 	struct mpp_dma_buffer *table;
155*4882a593Smuzhiyun };
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun struct rkvdec2_session_priv {
158*4882a593Smuzhiyun 	/* codec info from user */
159*4882a593Smuzhiyun 	struct {
160*4882a593Smuzhiyun 		/* show mode */
161*4882a593Smuzhiyun 		u32 flag;
162*4882a593Smuzhiyun 		/* item data */
163*4882a593Smuzhiyun 		u64 val;
164*4882a593Smuzhiyun 	} codec_info[DEC_INFO_BUTT];
165*4882a593Smuzhiyun 	/* rcb_info for sram */
166*4882a593Smuzhiyun 	struct rkvdec2_rcb_info rcb_inf;
167*4882a593Smuzhiyun };
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun struct rkvdec2_dev {
170*4882a593Smuzhiyun 	struct mpp_dev mpp;
171*4882a593Smuzhiyun 	/* sip smc reset lock */
172*4882a593Smuzhiyun 	struct mutex sip_reset_lock;
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 	struct mpp_clk_info aclk_info;
175*4882a593Smuzhiyun 	struct mpp_clk_info hclk_info;
176*4882a593Smuzhiyun 	struct mpp_clk_info core_clk_info;
177*4882a593Smuzhiyun 	struct mpp_clk_info cabac_clk_info;
178*4882a593Smuzhiyun 	struct mpp_clk_info hevc_cabac_clk_info;
179*4882a593Smuzhiyun 	struct mpp_clk_info *cycle_clk;
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun 	u32 default_max_load;
182*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
183*4882a593Smuzhiyun 	struct proc_dir_entry *procfs;
184*4882a593Smuzhiyun #endif
185*4882a593Smuzhiyun 	struct reset_control *rst_a;
186*4882a593Smuzhiyun 	struct reset_control *rst_h;
187*4882a593Smuzhiyun 	struct reset_control *rst_niu_a;
188*4882a593Smuzhiyun 	struct reset_control *rst_niu_h;
189*4882a593Smuzhiyun 	struct reset_control *rst_core;
190*4882a593Smuzhiyun 	struct reset_control *rst_cabac;
191*4882a593Smuzhiyun 	struct reset_control *rst_hevc_cabac;
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun #ifdef CONFIG_PM_DEVFREQ
194*4882a593Smuzhiyun 	struct regulator *vdd;
195*4882a593Smuzhiyun 	struct devfreq *devfreq;
196*4882a593Smuzhiyun 	unsigned long volt;
197*4882a593Smuzhiyun 	unsigned long core_rate_hz;
198*4882a593Smuzhiyun 	unsigned long core_last_rate_hz;
199*4882a593Smuzhiyun 	struct ipa_power_model_data *model_data;
200*4882a593Smuzhiyun 	struct thermal_cooling_device *devfreq_cooling;
201*4882a593Smuzhiyun 	struct monitor_dev_info *mdev_info;
202*4882a593Smuzhiyun #endif
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun 	/* internal rcb-memory */
205*4882a593Smuzhiyun 	u32 sram_size;
206*4882a593Smuzhiyun 	u32 rcb_size;
207*4882a593Smuzhiyun 	dma_addr_t rcb_iova;
208*4882a593Smuzhiyun 	struct page *rcb_page;
209*4882a593Smuzhiyun 	u32 rcb_min_width;
210*4882a593Smuzhiyun 	u32 rcb_info_count;
211*4882a593Smuzhiyun 	u32 rcb_infos[RKVDEC_MAX_RCB_NUM * 2];
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun 	/* for link mode */
214*4882a593Smuzhiyun 	struct rkvdec_link_dev *link_dec;
215*4882a593Smuzhiyun 	struct mpp_dma_buffer *fix;
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun 	/* for ccu link mode */
218*4882a593Smuzhiyun 	struct rkvdec2_ccu *ccu;
219*4882a593Smuzhiyun 	u32 core_mask;
220*4882a593Smuzhiyun 	u32 task_index;
221*4882a593Smuzhiyun 	/* mmu info */
222*4882a593Smuzhiyun 	void __iomem *mmu_base;
223*4882a593Smuzhiyun 	u32 fault_iova;
224*4882a593Smuzhiyun 	u32 mmu_fault;
225*4882a593Smuzhiyun 	u32 mmu0_st;
226*4882a593Smuzhiyun 	u32 mmu1_st;
227*4882a593Smuzhiyun 	u32 mmu0_pta;
228*4882a593Smuzhiyun 	u32 mmu1_pta;
229*4882a593Smuzhiyun };
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun int mpp_set_rcbbuf(struct mpp_dev *mpp, struct mpp_session *session,
232*4882a593Smuzhiyun 		   struct mpp_task *task);
233*4882a593Smuzhiyun int rkvdec2_task_init(struct mpp_dev *mpp, struct mpp_session *session,
234*4882a593Smuzhiyun 		      struct rkvdec2_task *task, struct mpp_task_msgs *msgs);
235*4882a593Smuzhiyun void *rkvdec2_alloc_task(struct mpp_session *session,
236*4882a593Smuzhiyun 			 struct mpp_task_msgs *msgs);
237*4882a593Smuzhiyun int rkvdec2_free_task(struct mpp_session *session, struct mpp_task *mpp_task);
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun int rkvdec2_free_session(struct mpp_session *session);
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun int rkvdec2_result(struct mpp_dev *mpp, struct mpp_task *mpp_task,
242*4882a593Smuzhiyun 		   struct mpp_task_msgs *msgs);
243*4882a593Smuzhiyun int rkvdec2_reset(struct mpp_dev *mpp);
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun void mpp_devfreq_set_core_rate(struct mpp_dev *mpp, enum MPP_CLOCK_MODE mode);
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun #endif
248