xref: /OK3568_Linux_fs/kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
4*4882a593Smuzhiyun  * Author:Mark Yao <mark.yao@rock-chips.com>
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * based on exynos_drm_drv.h
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #ifndef _ROCKCHIP_DRM_DRV_H
10*4882a593Smuzhiyun #define _ROCKCHIP_DRM_DRV_H
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include <drm/drm_atomic_helper.h>
13*4882a593Smuzhiyun #include <drm/drm_dsc.h>
14*4882a593Smuzhiyun #include <drm/drm_fb_helper.h>
15*4882a593Smuzhiyun #include <drm/drm_fourcc.h>
16*4882a593Smuzhiyun #include <drm/drm_gem.h>
17*4882a593Smuzhiyun #include <drm/rockchip_drm.h>
18*4882a593Smuzhiyun #include <linux/module.h>
19*4882a593Smuzhiyun #include <linux/component.h>
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #include <soc/rockchip/rockchip_dmc.h>
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #include "../panel/panel-simple.h"
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #include "rockchip_drm_debugfs.h"
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #define ROCKCHIP_MAX_FB_BUFFER	3
28*4882a593Smuzhiyun #define ROCKCHIP_MAX_CONNECTOR	2
29*4882a593Smuzhiyun #define ROCKCHIP_MAX_CRTC	4
30*4882a593Smuzhiyun #define ROCKCHIP_MAX_LAYER	16
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun struct drm_device;
34*4882a593Smuzhiyun struct drm_connector;
35*4882a593Smuzhiyun struct iommu_domain;
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun #define VOP_COLOR_KEY_NONE	(0 << 31)
38*4882a593Smuzhiyun #define VOP_COLOR_KEY_MASK	(1 << 31)
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun #define VOP_OUTPUT_IF_RGB	BIT(0)
41*4882a593Smuzhiyun #define VOP_OUTPUT_IF_BT1120	BIT(1)
42*4882a593Smuzhiyun #define VOP_OUTPUT_IF_BT656	BIT(2)
43*4882a593Smuzhiyun #define VOP_OUTPUT_IF_LVDS0	BIT(3)
44*4882a593Smuzhiyun #define VOP_OUTPUT_IF_LVDS1	BIT(4)
45*4882a593Smuzhiyun #define VOP_OUTPUT_IF_MIPI0	BIT(5)
46*4882a593Smuzhiyun #define VOP_OUTPUT_IF_MIPI1	BIT(6)
47*4882a593Smuzhiyun #define VOP_OUTPUT_IF_eDP0	BIT(7)
48*4882a593Smuzhiyun #define VOP_OUTPUT_IF_eDP1	BIT(8)
49*4882a593Smuzhiyun #define VOP_OUTPUT_IF_DP0	BIT(9)
50*4882a593Smuzhiyun #define VOP_OUTPUT_IF_DP1	BIT(10)
51*4882a593Smuzhiyun #define VOP_OUTPUT_IF_HDMI0	BIT(11)
52*4882a593Smuzhiyun #define VOP_OUTPUT_IF_HDMI1	BIT(12)
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun #ifndef DRM_FORMAT_NV20
55*4882a593Smuzhiyun #define DRM_FORMAT_NV20		fourcc_code('N', 'V', '2', '0') /* 2x1 subsampled Cr:Cb plane */
56*4882a593Smuzhiyun #endif
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun #ifndef DRM_FORMAT_NV30
59*4882a593Smuzhiyun #define DRM_FORMAT_NV30		fourcc_code('N', 'V', '3', '0') /* non-subsampled Cr:Cb plane */
60*4882a593Smuzhiyun #endif
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun #define RK_IF_PROP_COLOR_DEPTH		"color_depth"
63*4882a593Smuzhiyun #define RK_IF_PROP_COLOR_FORMAT		"color_format"
64*4882a593Smuzhiyun #define RK_IF_PROP_COLOR_DEPTH_CAPS	"color_depth_caps"
65*4882a593Smuzhiyun #define RK_IF_PROP_COLOR_FORMAT_CAPS	"color_format_caps"
66*4882a593Smuzhiyun #define RK_IF_PROP_ENCRYPTED		"hdcp_encrypted"
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun enum rockchip_drm_debug_category {
69*4882a593Smuzhiyun 	VOP_DEBUG_PLANE		= BIT(0),
70*4882a593Smuzhiyun 	VOP_DEBUG_OVERLAY	= BIT(1),
71*4882a593Smuzhiyun 	VOP_DEBUG_WB		= BIT(2),
72*4882a593Smuzhiyun 	VOP_DEBUG_CFG_DONE	= BIT(3),
73*4882a593Smuzhiyun 	VOP_DEBUG_VSYNC		= BIT(7),
74*4882a593Smuzhiyun };
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun enum rk_if_color_depth {
77*4882a593Smuzhiyun 	RK_IF_DEPTH_8,
78*4882a593Smuzhiyun 	RK_IF_DEPTH_10,
79*4882a593Smuzhiyun 	RK_IF_DEPTH_12,
80*4882a593Smuzhiyun 	RK_IF_DEPTH_16,
81*4882a593Smuzhiyun 	RK_IF_DEPTH_420_10,
82*4882a593Smuzhiyun 	RK_IF_DEPTH_420_12,
83*4882a593Smuzhiyun 	RK_IF_DEPTH_420_16,
84*4882a593Smuzhiyun 	RK_IF_DEPTH_6,
85*4882a593Smuzhiyun 	RK_IF_DEPTH_MAX,
86*4882a593Smuzhiyun };
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun enum rk_if_color_format {
89*4882a593Smuzhiyun 	RK_IF_FORMAT_RGB, /* default RGB */
90*4882a593Smuzhiyun 	RK_IF_FORMAT_YCBCR444, /* YCBCR 444 */
91*4882a593Smuzhiyun 	RK_IF_FORMAT_YCBCR422, /* YCBCR 422 */
92*4882a593Smuzhiyun 	RK_IF_FORMAT_YCBCR420, /* YCBCR 420 */
93*4882a593Smuzhiyun 	RK_IF_FORMAT_YCBCR_HQ, /* Highest subsampled YUV */
94*4882a593Smuzhiyun 	RK_IF_FORMAT_YCBCR_LQ, /* Lowest subsampled YUV */
95*4882a593Smuzhiyun 	RK_IF_FORMAT_MAX,
96*4882a593Smuzhiyun };
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun enum rockchip_hdcp_encrypted {
99*4882a593Smuzhiyun 	RK_IF_HDCP_ENCRYPTED_NONE = 0,
100*4882a593Smuzhiyun 	RK_IF_HDCP_ENCRYPTED_LEVEL1,
101*4882a593Smuzhiyun 	RK_IF_HDCP_ENCRYPTED_LEVEL2,
102*4882a593Smuzhiyun };
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun enum rockchip_color_bar_mode {
105*4882a593Smuzhiyun 	ROCKCHIP_COLOR_BAR_OFF = 0,
106*4882a593Smuzhiyun 	ROCKCHIP_COLOR_BAR_HORIZONTAL = 1,
107*4882a593Smuzhiyun 	ROCKCHIP_COLOR_BAR_VERTICAL = 2,
108*4882a593Smuzhiyun };
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun enum rockchip_drm_split_area {
111*4882a593Smuzhiyun 	ROCKCHIP_DRM_SPLIT_UNSET = 0,
112*4882a593Smuzhiyun 	ROCKCHIP_DRM_SPLIT_LEFT_SIDE = 1,
113*4882a593Smuzhiyun 	ROCKCHIP_DRM_SPLIT_RIGHT_SIDE = 2,
114*4882a593Smuzhiyun };
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun struct rockchip_drm_sub_dev {
117*4882a593Smuzhiyun 	struct list_head list;
118*4882a593Smuzhiyun 	struct drm_connector *connector;
119*4882a593Smuzhiyun 	struct device_node *of_node;
120*4882a593Smuzhiyun 	int (*loader_protect)(struct drm_encoder *encoder, bool on);
121*4882a593Smuzhiyun 	void (*oob_hotplug_event)(struct drm_connector *connector);
122*4882a593Smuzhiyun 	void (*update_vfp_for_vrr)(struct drm_connector *connector, struct drm_display_mode *mode,
123*4882a593Smuzhiyun 				   int vfp);
124*4882a593Smuzhiyun };
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun struct rockchip_sdr2hdr_state {
127*4882a593Smuzhiyun 	int sdr2hdr_func;
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun 	bool bt1886eotf_pre_conv_en;
130*4882a593Smuzhiyun 	bool rgb2rgb_pre_conv_en;
131*4882a593Smuzhiyun 	bool rgb2rgb_pre_conv_mode;
132*4882a593Smuzhiyun 	bool st2084oetf_pre_conv_en;
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun 	bool bt1886eotf_post_conv_en;
135*4882a593Smuzhiyun 	bool rgb2rgb_post_conv_en;
136*4882a593Smuzhiyun 	bool rgb2rgb_post_conv_mode;
137*4882a593Smuzhiyun 	bool st2084oetf_post_conv_en;
138*4882a593Smuzhiyun };
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun struct rockchip_hdr_state {
141*4882a593Smuzhiyun 	bool pre_overlay;
142*4882a593Smuzhiyun 	bool hdr2sdr_en;
143*4882a593Smuzhiyun 	struct rockchip_sdr2hdr_state sdr2hdr_state;
144*4882a593Smuzhiyun };
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun struct rockchip_bcsh_state {
147*4882a593Smuzhiyun 	int brightness;
148*4882a593Smuzhiyun 	int contrast;
149*4882a593Smuzhiyun 	int saturation;
150*4882a593Smuzhiyun 	int sin_hue;
151*4882a593Smuzhiyun 	int cos_hue;
152*4882a593Smuzhiyun };
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun struct rockchip_crtc {
155*4882a593Smuzhiyun 	struct drm_crtc crtc;
156*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_DRM_DEBUG)
157*4882a593Smuzhiyun 	/**
158*4882a593Smuzhiyun 	 * @vop_dump_status the status of vop dump control
159*4882a593Smuzhiyun 	 * @vop_dump_list_head the list head of vop dump list
160*4882a593Smuzhiyun 	 * @vop_dump_list_init_flag init once
161*4882a593Smuzhiyun 	 * @vop_dump_times control the dump times
162*4882a593Smuzhiyun 	 * @frme_count the frame of dump buf
163*4882a593Smuzhiyun 	 */
164*4882a593Smuzhiyun 	enum vop_dump_status vop_dump_status;
165*4882a593Smuzhiyun 	struct list_head vop_dump_list_head;
166*4882a593Smuzhiyun 	bool vop_dump_list_init_flag;
167*4882a593Smuzhiyun 	int vop_dump_times;
168*4882a593Smuzhiyun 	int frame_count;
169*4882a593Smuzhiyun #endif
170*4882a593Smuzhiyun };
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun struct rockchip_dsc_sink_cap {
173*4882a593Smuzhiyun 	/**
174*4882a593Smuzhiyun 	 * @slice_width: the number of pixel columns that comprise the slice width
175*4882a593Smuzhiyun 	 * @slice_height: the number of pixel rows that comprise the slice height
176*4882a593Smuzhiyun 	 * @block_pred: Does block prediction
177*4882a593Smuzhiyun 	 * @native_420: Does sink support DSC with 4:2:0 compression
178*4882a593Smuzhiyun 	 * @bpc_supported: compressed bpc supported by sink : 10, 12 or 16 bpc
179*4882a593Smuzhiyun 	 * @version_major: DSC major version
180*4882a593Smuzhiyun 	 * @version_minor: DSC minor version
181*4882a593Smuzhiyun 	 * @target_bits_per_pixel_x16: bits num after compress and multiply 16
182*4882a593Smuzhiyun 	 */
183*4882a593Smuzhiyun 	u16 slice_width;
184*4882a593Smuzhiyun 	u16 slice_height;
185*4882a593Smuzhiyun 	bool block_pred;
186*4882a593Smuzhiyun 	bool native_420;
187*4882a593Smuzhiyun 	u8 bpc_supported;
188*4882a593Smuzhiyun 	u8 version_major;
189*4882a593Smuzhiyun 	u8 version_minor;
190*4882a593Smuzhiyun 	u16 target_bits_per_pixel_x16;
191*4882a593Smuzhiyun };
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun #define ACM_GAIN_LUT_HY_LENGTH		(9*17)
194*4882a593Smuzhiyun #define ACM_GAIN_LUT_HY_TOTAL_LENGTH	(ACM_GAIN_LUT_HY_LENGTH * 3)
195*4882a593Smuzhiyun #define ACM_GAIN_LUT_HS_LENGTH		(13*17)
196*4882a593Smuzhiyun #define ACM_GAIN_LUT_HS_TOTAL_LENGTH	(ACM_GAIN_LUT_HS_LENGTH * 3)
197*4882a593Smuzhiyun #define ACM_DELTA_LUT_H_LENGTH		65
198*4882a593Smuzhiyun #define ACM_DELTA_LUT_H_TOTAL_LENGTH	(ACM_DELTA_LUT_H_LENGTH * 3)
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun struct post_acm {
201*4882a593Smuzhiyun 	s16 delta_lut_h[ACM_DELTA_LUT_H_TOTAL_LENGTH];
202*4882a593Smuzhiyun 	s16 gain_lut_hy[ACM_GAIN_LUT_HY_TOTAL_LENGTH];
203*4882a593Smuzhiyun 	s16 gain_lut_hs[ACM_GAIN_LUT_HS_TOTAL_LENGTH];
204*4882a593Smuzhiyun 	u16 y_gain;
205*4882a593Smuzhiyun 	u16 h_gain;
206*4882a593Smuzhiyun 	u16 s_gain;
207*4882a593Smuzhiyun 	u16 acm_enable;
208*4882a593Smuzhiyun };
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun struct post_csc {
211*4882a593Smuzhiyun 	u16 hue;
212*4882a593Smuzhiyun 	u16 saturation;
213*4882a593Smuzhiyun 	u16 contrast;
214*4882a593Smuzhiyun 	u16 brightness;
215*4882a593Smuzhiyun 	u16 r_gain;
216*4882a593Smuzhiyun 	u16 g_gain;
217*4882a593Smuzhiyun 	u16 b_gain;
218*4882a593Smuzhiyun 	u16 r_offset;
219*4882a593Smuzhiyun 	u16 g_offset;
220*4882a593Smuzhiyun 	u16 b_offset;
221*4882a593Smuzhiyun 	u16 csc_enable;
222*4882a593Smuzhiyun };
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun struct rockchip_crtc_state {
225*4882a593Smuzhiyun 	struct drm_crtc_state base;
226*4882a593Smuzhiyun 	int vp_id;
227*4882a593Smuzhiyun 	int output_type;
228*4882a593Smuzhiyun 	int output_mode;
229*4882a593Smuzhiyun 	int output_bpc;
230*4882a593Smuzhiyun 	int output_flags;
231*4882a593Smuzhiyun 	bool enable_afbc;
232*4882a593Smuzhiyun 	/**
233*4882a593Smuzhiyun 	 * @splice_mode: enabled when display a hdisplay > 4096 on rk3588
234*4882a593Smuzhiyun 	 */
235*4882a593Smuzhiyun 	bool splice_mode;
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun 	/**
238*4882a593Smuzhiyun 	 * @hold_mode: enabled when it's:
239*4882a593Smuzhiyun 	 * (1) mcu hold mode
240*4882a593Smuzhiyun 	 * (2) mipi dsi cmd mode
241*4882a593Smuzhiyun 	 * (3) edp psr mode
242*4882a593Smuzhiyun 	 */
243*4882a593Smuzhiyun 	bool hold_mode;
244*4882a593Smuzhiyun 	/**
245*4882a593Smuzhiyun 	 * when enable soft_te, use gpio irq to triggle new fs,
246*4882a593Smuzhiyun 	 * otherwise use hardware te
247*4882a593Smuzhiyun 	 */
248*4882a593Smuzhiyun 	bool soft_te;
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	struct drm_tv_connector_state *tv_state;
251*4882a593Smuzhiyun 	int left_margin;
252*4882a593Smuzhiyun 	int right_margin;
253*4882a593Smuzhiyun 	int top_margin;
254*4882a593Smuzhiyun 	int bottom_margin;
255*4882a593Smuzhiyun 	int vdisplay;
256*4882a593Smuzhiyun 	int afbdc_win_format;
257*4882a593Smuzhiyun 	int afbdc_win_width;
258*4882a593Smuzhiyun 	int afbdc_win_height;
259*4882a593Smuzhiyun 	int afbdc_win_ptr;
260*4882a593Smuzhiyun 	int afbdc_win_id;
261*4882a593Smuzhiyun 	int afbdc_en;
262*4882a593Smuzhiyun 	int afbdc_win_vir_width;
263*4882a593Smuzhiyun 	int afbdc_win_xoffset;
264*4882a593Smuzhiyun 	int afbdc_win_yoffset;
265*4882a593Smuzhiyun 	int dsp_layer_sel;
266*4882a593Smuzhiyun 	u32 output_if;
267*4882a593Smuzhiyun 	u32 output_if_left_panel;
268*4882a593Smuzhiyun 	u32 bus_format;
269*4882a593Smuzhiyun 	u32 bus_flags;
270*4882a593Smuzhiyun 	int yuv_overlay;
271*4882a593Smuzhiyun 	int post_r2y_en;
272*4882a593Smuzhiyun 	int post_y2r_en;
273*4882a593Smuzhiyun 	int post_csc_mode;
274*4882a593Smuzhiyun 	int bcsh_en;
275*4882a593Smuzhiyun 	int color_space;
276*4882a593Smuzhiyun 	int eotf;
277*4882a593Smuzhiyun 	u32 background;
278*4882a593Smuzhiyun 	u32 line_flag;
279*4882a593Smuzhiyun 	u8 mode_update;
280*4882a593Smuzhiyun 	u8 dsc_id;
281*4882a593Smuzhiyun 	u8 dsc_enable;
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun 	u8 dsc_slice_num;
284*4882a593Smuzhiyun 	u8 dsc_pixel_num;
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun 	u64 dsc_txp_clk_rate;
287*4882a593Smuzhiyun 	u64 dsc_pxl_clk_rate;
288*4882a593Smuzhiyun 	u64 dsc_cds_clk_rate;
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun 	struct drm_dsc_picture_parameter_set pps;
291*4882a593Smuzhiyun 	struct rockchip_dsc_sink_cap dsc_sink_cap;
292*4882a593Smuzhiyun 	struct rockchip_hdr_state hdr;
293*4882a593Smuzhiyun 	struct drm_property_blob *hdr_ext_data;
294*4882a593Smuzhiyun 	struct drm_property_blob *acm_lut_data;
295*4882a593Smuzhiyun 	struct drm_property_blob *post_csc_data;
296*4882a593Smuzhiyun 	struct drm_property_blob *cubic_lut_data;
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun 	int request_refresh_rate;
299*4882a593Smuzhiyun 	int max_refresh_rate;
300*4882a593Smuzhiyun 	int min_refresh_rate;
301*4882a593Smuzhiyun };
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun #define to_rockchip_crtc_state(s) \
304*4882a593Smuzhiyun 		container_of(s, struct rockchip_crtc_state, base)
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun struct rockchip_drm_vcnt {
307*4882a593Smuzhiyun 	struct drm_pending_vblank_event *event;
308*4882a593Smuzhiyun 	__u32 sequence;
309*4882a593Smuzhiyun 	int pipe;
310*4882a593Smuzhiyun };
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun struct rockchip_logo {
313*4882a593Smuzhiyun 	dma_addr_t dma_addr;
314*4882a593Smuzhiyun 	struct drm_mm_node logo_reserved_node;
315*4882a593Smuzhiyun 	void *kvaddr;
316*4882a593Smuzhiyun 	phys_addr_t start;
317*4882a593Smuzhiyun 	phys_addr_t size;
318*4882a593Smuzhiyun 	int count;
319*4882a593Smuzhiyun };
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun struct rockchip_mcu_timing {
322*4882a593Smuzhiyun 	int mcu_pix_total;
323*4882a593Smuzhiyun 	int mcu_cs_pst;
324*4882a593Smuzhiyun 	int mcu_cs_pend;
325*4882a593Smuzhiyun 	int mcu_rw_pst;
326*4882a593Smuzhiyun 	int mcu_rw_pend;
327*4882a593Smuzhiyun 	int mcu_hold_mode;
328*4882a593Smuzhiyun };
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun struct loader_cubic_lut {
331*4882a593Smuzhiyun 	bool enable;
332*4882a593Smuzhiyun 	u32 offset;
333*4882a593Smuzhiyun };
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun struct rockchip_drm_dsc_cap {
336*4882a593Smuzhiyun 	bool v_1p2;
337*4882a593Smuzhiyun 	bool native_420;
338*4882a593Smuzhiyun 	bool all_bpp;
339*4882a593Smuzhiyun 	u8 bpc_supported;
340*4882a593Smuzhiyun 	u8 max_slices;
341*4882a593Smuzhiyun 	u8 max_lanes;
342*4882a593Smuzhiyun 	u8 max_frl_rate_per_lane;
343*4882a593Smuzhiyun 	u8 total_chunk_kbytes;
344*4882a593Smuzhiyun 	int clk_per_slice;
345*4882a593Smuzhiyun };
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun struct ver_26_v0 {
348*4882a593Smuzhiyun 	u8 yuv422_12bit;
349*4882a593Smuzhiyun 	u8 support_2160p_60;
350*4882a593Smuzhiyun 	u8 global_dimming;
351*4882a593Smuzhiyun 	u8 dm_major_ver;
352*4882a593Smuzhiyun 	u8 dm_minor_ver;
353*4882a593Smuzhiyun 	u16 t_min_pq;
354*4882a593Smuzhiyun 	u16 t_max_pq;
355*4882a593Smuzhiyun 	u16 rx;
356*4882a593Smuzhiyun 	u16 ry;
357*4882a593Smuzhiyun 	u16 gx;
358*4882a593Smuzhiyun 	u16 gy;
359*4882a593Smuzhiyun 	u16 bx;
360*4882a593Smuzhiyun 	u16 by;
361*4882a593Smuzhiyun 	u16 wx;
362*4882a593Smuzhiyun 	u16 wy;
363*4882a593Smuzhiyun } __packed;
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun struct ver_15_v1 {
366*4882a593Smuzhiyun 	u8 yuv422_12bit;
367*4882a593Smuzhiyun 	u8 support_2160p_60;
368*4882a593Smuzhiyun 	u8 global_dimming;
369*4882a593Smuzhiyun 	u8 dm_version;
370*4882a593Smuzhiyun 	u8 colorimetry;
371*4882a593Smuzhiyun 	u8 t_max_lum;
372*4882a593Smuzhiyun 	u8 t_min_lum;
373*4882a593Smuzhiyun 	u8 rx;
374*4882a593Smuzhiyun 	u8 ry;
375*4882a593Smuzhiyun 	u8 gx;
376*4882a593Smuzhiyun 	u8 gy;
377*4882a593Smuzhiyun 	u8 bx;
378*4882a593Smuzhiyun 	u8 by;
379*4882a593Smuzhiyun } __packed;
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun struct ver_12_v1 {
382*4882a593Smuzhiyun 	u8 yuv422_12bit;
383*4882a593Smuzhiyun 	u8 support_2160p_60;
384*4882a593Smuzhiyun 	u8 global_dimming;
385*4882a593Smuzhiyun 	u8 dm_version;
386*4882a593Smuzhiyun 	u8 colorimetry;
387*4882a593Smuzhiyun 	u8 low_latency;
388*4882a593Smuzhiyun 	u8 t_max_lum;
389*4882a593Smuzhiyun 	u8 t_min_lum;
390*4882a593Smuzhiyun 	u8 unique_rx;
391*4882a593Smuzhiyun 	u8 unique_ry;
392*4882a593Smuzhiyun 	u8 unique_gx;
393*4882a593Smuzhiyun 	u8 unique_gy;
394*4882a593Smuzhiyun 	u8 unique_bx;
395*4882a593Smuzhiyun 	u8 unique_by;
396*4882a593Smuzhiyun } __packed;
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun struct ver_12_v2 {
399*4882a593Smuzhiyun 	u8 yuv422_12bit;
400*4882a593Smuzhiyun 	u8 backlt_ctrl;
401*4882a593Smuzhiyun 	u8 global_dimming;
402*4882a593Smuzhiyun 	u8 dm_version;
403*4882a593Smuzhiyun 	u8 backlt_min_luma;
404*4882a593Smuzhiyun 	u8 interface;
405*4882a593Smuzhiyun 	u8 yuv444_10b_12b;
406*4882a593Smuzhiyun 	u8 t_min_pq_v2;
407*4882a593Smuzhiyun 	u8 t_max_pq_v2;
408*4882a593Smuzhiyun 	u8 unique_rx;
409*4882a593Smuzhiyun 	u8 unique_ry;
410*4882a593Smuzhiyun 	u8 unique_gx;
411*4882a593Smuzhiyun 	u8 unique_gy;
412*4882a593Smuzhiyun 	u8 unique_bx;
413*4882a593Smuzhiyun 	u8 unique_by;
414*4882a593Smuzhiyun } __packed;
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun struct next_hdr_sink_data {
417*4882a593Smuzhiyun 	u8 version;
418*4882a593Smuzhiyun 	struct ver_26_v0 ver_26_v0;
419*4882a593Smuzhiyun 	struct ver_15_v1 ver_15_v1;
420*4882a593Smuzhiyun 	struct ver_12_v1 ver_12_v1;
421*4882a593Smuzhiyun 	struct ver_12_v2 ver_12_v2;
422*4882a593Smuzhiyun } __packed;
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun /*
425*4882a593Smuzhiyun  * Rockchip drm private crtc funcs.
426*4882a593Smuzhiyun  * @loader_protect: protect loader logo crtc's power
427*4882a593Smuzhiyun  * @enable_vblank: enable crtc vblank irq.
428*4882a593Smuzhiyun  * @disable_vblank: disable crtc vblank irq.
429*4882a593Smuzhiyun  * @bandwidth: report present crtc bandwidth consume.
430*4882a593Smuzhiyun  * @cancel_pending_vblank: cancel pending vblank.
431*4882a593Smuzhiyun  * @debugfs_init: init crtc debugfs.
432*4882a593Smuzhiyun  * @debugfs_dump: debugfs to dump crtc and plane state.
433*4882a593Smuzhiyun  * @regs_dump: dump vop current register config.
434*4882a593Smuzhiyun  * @mode_valid: verify that the current mode is supported.
435*4882a593Smuzhiyun  * @crtc_close: close vop.
436*4882a593Smuzhiyun  * @crtc_send_mcu_cmd: send mcu panel init cmd.
437*4882a593Smuzhiyun  * @te_handler: soft te hand for cmd mode panel.
438*4882a593Smuzhiyun  * @wait_vact_end: wait the last active line.
439*4882a593Smuzhiyun  */
440*4882a593Smuzhiyun struct rockchip_crtc_funcs {
441*4882a593Smuzhiyun 	int (*loader_protect)(struct drm_crtc *crtc, bool on, void *data);
442*4882a593Smuzhiyun 	int (*enable_vblank)(struct drm_crtc *crtc);
443*4882a593Smuzhiyun 	void (*disable_vblank)(struct drm_crtc *crtc);
444*4882a593Smuzhiyun 	size_t (*bandwidth)(struct drm_crtc *crtc,
445*4882a593Smuzhiyun 			    struct drm_crtc_state *crtc_state,
446*4882a593Smuzhiyun 			    struct dmcfreq_vop_info *vop_bw_info);
447*4882a593Smuzhiyun 	void (*cancel_pending_vblank)(struct drm_crtc *crtc,
448*4882a593Smuzhiyun 				      struct drm_file *file_priv);
449*4882a593Smuzhiyun 	int (*debugfs_init)(struct drm_minor *minor, struct drm_crtc *crtc);
450*4882a593Smuzhiyun 	int (*debugfs_dump)(struct drm_crtc *crtc, struct seq_file *s);
451*4882a593Smuzhiyun 	void (*regs_dump)(struct drm_crtc *crtc, struct seq_file *s);
452*4882a593Smuzhiyun 	void (*active_regs_dump)(struct drm_crtc *crtc, struct seq_file *s);
453*4882a593Smuzhiyun 	enum drm_mode_status (*mode_valid)(struct drm_crtc *crtc,
454*4882a593Smuzhiyun 					   const struct drm_display_mode *mode,
455*4882a593Smuzhiyun 					   int output_type);
456*4882a593Smuzhiyun 	void (*crtc_close)(struct drm_crtc *crtc);
457*4882a593Smuzhiyun 	void (*crtc_send_mcu_cmd)(struct drm_crtc *crtc, u32 type, u32 value);
458*4882a593Smuzhiyun 	void (*te_handler)(struct drm_crtc *crtc);
459*4882a593Smuzhiyun 	int (*wait_vact_end)(struct drm_crtc *crtc, unsigned int mstimeout);
460*4882a593Smuzhiyun 	void (*crtc_standby)(struct drm_crtc *crtc, bool standby);
461*4882a593Smuzhiyun 	int (*crtc_set_color_bar)(struct drm_crtc *crtc, enum rockchip_color_bar_mode mode);
462*4882a593Smuzhiyun };
463*4882a593Smuzhiyun 
464*4882a593Smuzhiyun struct rockchip_dclk_pll {
465*4882a593Smuzhiyun 	struct clk *pll;
466*4882a593Smuzhiyun 	unsigned int use_count;
467*4882a593Smuzhiyun };
468*4882a593Smuzhiyun 
469*4882a593Smuzhiyun /*
470*4882a593Smuzhiyun  * Rockchip drm private structure.
471*4882a593Smuzhiyun  *
472*4882a593Smuzhiyun  * @crtc: array of enabled CRTCs, used to map from "pipe" to drm_crtc.
473*4882a593Smuzhiyun  * @num_pipe: number of pipes for this device.
474*4882a593Smuzhiyun  * @mm_lock: protect drm_mm on multi-threads.
475*4882a593Smuzhiyun  */
476*4882a593Smuzhiyun struct rockchip_drm_private {
477*4882a593Smuzhiyun 	struct rockchip_logo *logo;
478*4882a593Smuzhiyun 	struct drm_fb_helper *fbdev_helper;
479*4882a593Smuzhiyun 	struct drm_gem_object *fbdev_bo;
480*4882a593Smuzhiyun 	struct iommu_domain *domain;
481*4882a593Smuzhiyun 	struct gen_pool *secure_buffer_pool;
482*4882a593Smuzhiyun 	struct mutex mm_lock;
483*4882a593Smuzhiyun 	struct drm_mm mm;
484*4882a593Smuzhiyun 	struct list_head psr_list;
485*4882a593Smuzhiyun 	struct mutex psr_list_lock;
486*4882a593Smuzhiyun 	struct mutex commit_lock;
487*4882a593Smuzhiyun 
488*4882a593Smuzhiyun 	/* private crtc prop */
489*4882a593Smuzhiyun 	struct drm_property *soc_id_prop;
490*4882a593Smuzhiyun 	struct drm_property *port_id_prop;
491*4882a593Smuzhiyun 	struct drm_property *aclk_prop;
492*4882a593Smuzhiyun 	struct drm_property *bg_prop;
493*4882a593Smuzhiyun 	struct drm_property *line_flag_prop;
494*4882a593Smuzhiyun 	struct drm_property *cubic_lut_prop;
495*4882a593Smuzhiyun 	struct drm_property *cubic_lut_size_prop;
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun 	/* private plane prop */
498*4882a593Smuzhiyun 	struct drm_property *eotf_prop;
499*4882a593Smuzhiyun 	struct drm_property *color_space_prop;
500*4882a593Smuzhiyun 	struct drm_property *async_commit_prop;
501*4882a593Smuzhiyun 	struct drm_property *share_id_prop;
502*4882a593Smuzhiyun 
503*4882a593Smuzhiyun 	/* private connector prop */
504*4882a593Smuzhiyun 	struct drm_property *connector_id_prop;
505*4882a593Smuzhiyun 	struct drm_property *split_area_prop;
506*4882a593Smuzhiyun 
507*4882a593Smuzhiyun 	const struct rockchip_crtc_funcs *crtc_funcs[ROCKCHIP_MAX_CRTC];
508*4882a593Smuzhiyun 
509*4882a593Smuzhiyun 	struct rockchip_dclk_pll default_pll;
510*4882a593Smuzhiyun 	struct rockchip_dclk_pll hdmi_pll;
511*4882a593Smuzhiyun 
512*4882a593Smuzhiyun 	/*
513*4882a593Smuzhiyun 	 * protect some shared overlay resource
514*4882a593Smuzhiyun 	 * OVL_LAYER_SEL/OVL_PORT_SEL
515*4882a593Smuzhiyun 	 */
516*4882a593Smuzhiyun 	struct mutex ovl_lock;
517*4882a593Smuzhiyun 
518*4882a593Smuzhiyun 	struct rockchip_drm_vcnt vcnt[ROCKCHIP_MAX_CRTC];
519*4882a593Smuzhiyun 	/**
520*4882a593Smuzhiyun 	 * @loader_protect
521*4882a593Smuzhiyun 	 * ignore restore_fbdev_mode_atomic when in logo on state
522*4882a593Smuzhiyun 	 */
523*4882a593Smuzhiyun 	bool loader_protect;
524*4882a593Smuzhiyun 
525*4882a593Smuzhiyun 	dma_addr_t cubic_lut_dma_addr;
526*4882a593Smuzhiyun 	void *cubic_lut_kvaddr;
527*4882a593Smuzhiyun 	struct drm_mm_node *clut_reserved_node;
528*4882a593Smuzhiyun 	struct loader_cubic_lut cubic_lut[ROCKCHIP_MAX_CRTC];
529*4882a593Smuzhiyun };
530*4882a593Smuzhiyun 
531*4882a593Smuzhiyun void rockchip_connector_update_vfp_for_vrr(struct drm_crtc *crtc, struct drm_display_mode *mode,
532*4882a593Smuzhiyun 					   int vfp);
533*4882a593Smuzhiyun int rockchip_drm_dma_attach_device(struct drm_device *drm_dev,
534*4882a593Smuzhiyun 				   struct device *dev);
535*4882a593Smuzhiyun void rockchip_drm_dma_detach_device(struct drm_device *drm_dev,
536*4882a593Smuzhiyun 				    struct device *dev);
537*4882a593Smuzhiyun int rockchip_drm_wait_vact_end(struct drm_crtc *crtc, unsigned int mstimeout);
538*4882a593Smuzhiyun int rockchip_register_crtc_funcs(struct drm_crtc *crtc,
539*4882a593Smuzhiyun 				 const struct rockchip_crtc_funcs *crtc_funcs);
540*4882a593Smuzhiyun void rockchip_unregister_crtc_funcs(struct drm_crtc *crtc);
541*4882a593Smuzhiyun void rockchip_drm_crtc_standby(struct drm_crtc *crtc, bool standby);
542*4882a593Smuzhiyun 
543*4882a593Smuzhiyun void rockchip_drm_register_sub_dev(struct rockchip_drm_sub_dev *sub_dev);
544*4882a593Smuzhiyun void rockchip_drm_unregister_sub_dev(struct rockchip_drm_sub_dev *sub_dev);
545*4882a593Smuzhiyun struct rockchip_drm_sub_dev *rockchip_drm_get_sub_dev(struct device_node *node);
546*4882a593Smuzhiyun int rockchip_drm_add_modes_noedid(struct drm_connector *connector);
547*4882a593Smuzhiyun void rockchip_drm_te_handle(struct drm_crtc *crtc);
548*4882a593Smuzhiyun void drm_mode_convert_to_split_mode(struct drm_display_mode *mode);
549*4882a593Smuzhiyun void drm_mode_convert_to_origin_mode(struct drm_display_mode *mode);
550*4882a593Smuzhiyun u32 rockchip_drm_get_dclk_by_width(int width);
551*4882a593Smuzhiyun #if IS_REACHABLE(CONFIG_DRM_ROCKCHIP)
552*4882a593Smuzhiyun int rockchip_drm_get_sub_dev_type(void);
553*4882a593Smuzhiyun u32 rockchip_drm_get_scan_line_time_ns(void);
554*4882a593Smuzhiyun #else
rockchip_drm_get_sub_dev_type(void)555*4882a593Smuzhiyun static inline int rockchip_drm_get_sub_dev_type(void)
556*4882a593Smuzhiyun {
557*4882a593Smuzhiyun 	return DRM_MODE_CONNECTOR_Unknown;
558*4882a593Smuzhiyun }
559*4882a593Smuzhiyun 
rockchip_drm_get_scan_line_time_ns(void)560*4882a593Smuzhiyun static inline u32 rockchip_drm_get_scan_line_time_ns(void)
561*4882a593Smuzhiyun {
562*4882a593Smuzhiyun 	return 0;
563*4882a593Smuzhiyun }
564*4882a593Smuzhiyun #endif
565*4882a593Smuzhiyun 
566*4882a593Smuzhiyun int rockchip_drm_endpoint_is_subdriver(struct device_node *ep);
567*4882a593Smuzhiyun uint32_t rockchip_drm_of_find_possible_crtcs(struct drm_device *dev,
568*4882a593Smuzhiyun 					     struct device_node *port);
569*4882a593Smuzhiyun uint32_t rockchip_drm_get_bpp(const struct drm_format_info *info);
570*4882a593Smuzhiyun int rockchip_drm_get_yuv422_format(struct drm_connector *connector,
571*4882a593Smuzhiyun 				   struct edid *edid);
572*4882a593Smuzhiyun int rockchip_drm_parse_cea_ext(struct rockchip_drm_dsc_cap *dsc_cap,
573*4882a593Smuzhiyun 			       u8 *max_frl_rate_per_lane, u8 *max_lanes, u8 *add_func,
574*4882a593Smuzhiyun 			       const struct edid *edid);
575*4882a593Smuzhiyun int rockchip_drm_parse_next_hdr(struct next_hdr_sink_data *sink_data,
576*4882a593Smuzhiyun 				const struct edid *edid);
577*4882a593Smuzhiyun int rockchip_drm_parse_colorimetry_data_block(u8 *colorimetry, const struct edid *edid);
578*4882a593Smuzhiyun 
579*4882a593Smuzhiyun __printf(3, 4)
580*4882a593Smuzhiyun void rockchip_drm_dbg(const struct device *dev, enum rockchip_drm_debug_category category,
581*4882a593Smuzhiyun 		      const char *format, ...);
582*4882a593Smuzhiyun 
583*4882a593Smuzhiyun extern struct platform_driver cdn_dp_driver;
584*4882a593Smuzhiyun extern struct platform_driver dw_hdmi_rockchip_pltfm_driver;
585*4882a593Smuzhiyun extern struct platform_driver dw_mipi_dsi_rockchip_driver;
586*4882a593Smuzhiyun extern struct platform_driver dw_mipi_dsi2_rockchip_driver;
587*4882a593Smuzhiyun extern struct platform_driver inno_hdmi_driver;
588*4882a593Smuzhiyun extern struct platform_driver rockchip_dp_driver;
589*4882a593Smuzhiyun extern struct platform_driver rockchip_lvds_driver;
590*4882a593Smuzhiyun extern struct platform_driver vop_platform_driver;
591*4882a593Smuzhiyun extern struct platform_driver vop2_platform_driver;
592*4882a593Smuzhiyun extern struct platform_driver rk3066_hdmi_driver;
593*4882a593Smuzhiyun extern struct platform_driver rockchip_rgb_driver;
594*4882a593Smuzhiyun extern struct platform_driver rockchip_tve_driver;
595*4882a593Smuzhiyun extern struct platform_driver dw_dp_driver;
596*4882a593Smuzhiyun extern struct platform_driver vconn_platform_driver;
597*4882a593Smuzhiyun extern struct platform_driver vvop_platform_driver;
598*4882a593Smuzhiyun #endif /* _ROCKCHIP_DRM_DRV_H_ */
599