xref: /OK3568_Linux_fs/u-boot/drivers/video/drm/rockchip_display.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * (C) Copyright 2008-2017 Fuzhou Rockchip Electronics Co., Ltd
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #ifndef _ROCKCHIP_DISPLAY_H
8*4882a593Smuzhiyun #define _ROCKCHIP_DISPLAY_H
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #ifdef CONFIG_SPL_BUILD
11*4882a593Smuzhiyun #include <linux/hdmi.h>
12*4882a593Smuzhiyun #include <linux/media-bus-format.h>
13*4882a593Smuzhiyun #else
14*4882a593Smuzhiyun #include <bmp_layout.h>
15*4882a593Smuzhiyun #include <edid.h>
16*4882a593Smuzhiyun #endif
17*4882a593Smuzhiyun #include <drm_modes.h>
18*4882a593Smuzhiyun #include <dm/ofnode.h>
19*4882a593Smuzhiyun #include <drm/drm_dsc.h>
20*4882a593Smuzhiyun #include <spl_display.h>
21*4882a593Smuzhiyun #include <clk.h>
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun /*
24*4882a593Smuzhiyun  * major: IP major version, used for IP structure
25*4882a593Smuzhiyun  * minor: big feature change under same structure
26*4882a593Smuzhiyun  * build: RTL current SVN number
27*4882a593Smuzhiyun  */
28*4882a593Smuzhiyun #define VOP_VERSION(major, minor)		((major) << 8 | (minor))
29*4882a593Smuzhiyun #define VOP_MAJOR(version)			((version) >> 8)
30*4882a593Smuzhiyun #define VOP_MINOR(version)			((version) & 0xff)
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #define VOP2_VERSION(major, minor, build)	((major) << 24 | (minor) << 16 | (build))
33*4882a593Smuzhiyun #define VOP2_MAJOR(version)			(((version) >> 24) & 0xff)
34*4882a593Smuzhiyun #define VOP2_MINOR(version)			(((version) >> 16) & 0xff)
35*4882a593Smuzhiyun #define VOP2_BUILD(version)			((version) & 0xffff)
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun #define VOP_VERSION_RK3528			VOP2_VERSION(0x50, 0x17, 0x1263)
38*4882a593Smuzhiyun #define VOP_VERSION_RK3562			VOP2_VERSION(0x50, 0x17, 0x4350)
39*4882a593Smuzhiyun #define VOP_VERSION_RK3568			VOP2_VERSION(0x40, 0x15, 0x8023)
40*4882a593Smuzhiyun #define VOP_VERSION_RK3588			VOP2_VERSION(0x40, 0x17, 0x6786)
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #define ROCKCHIP_OUTPUT_DUAL_CHANNEL_LEFT_RIGHT_MODE	BIT(0)
43*4882a593Smuzhiyun #define ROCKCHIP_OUTPUT_DUAL_CHANNEL_ODD_EVEN_MODE	BIT(1)
44*4882a593Smuzhiyun #define ROCKCHIP_OUTPUT_DATA_SWAP			BIT(2)
45*4882a593Smuzhiyun #define ROCKCHIP_OUTPUT_MIPI_DS_MODE			BIT(3)
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun #define ROCKCHIP_DSC_PPS_SIZE_BYTE			88
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun enum data_format {
50*4882a593Smuzhiyun 	ROCKCHIP_FMT_ARGB8888 = 0,
51*4882a593Smuzhiyun 	ROCKCHIP_FMT_RGB888,
52*4882a593Smuzhiyun 	ROCKCHIP_FMT_RGB565,
53*4882a593Smuzhiyun 	ROCKCHIP_FMT_YUV420SP = 4,
54*4882a593Smuzhiyun 	ROCKCHIP_FMT_YUV422SP,
55*4882a593Smuzhiyun 	ROCKCHIP_FMT_YUV444SP,
56*4882a593Smuzhiyun };
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun enum display_mode {
59*4882a593Smuzhiyun 	ROCKCHIP_DISPLAY_FULLSCREEN,
60*4882a593Smuzhiyun 	ROCKCHIP_DISPLAY_CENTER,
61*4882a593Smuzhiyun };
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun enum rockchip_cmd_type {
64*4882a593Smuzhiyun 	CMD_TYPE_DEFAULT,
65*4882a593Smuzhiyun 	CMD_TYPE_SPI,
66*4882a593Smuzhiyun 	CMD_TYPE_MCU
67*4882a593Smuzhiyun };
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun enum rockchip_mcu_cmd {
70*4882a593Smuzhiyun 	MCU_WRCMD = 0,
71*4882a593Smuzhiyun 	MCU_WRDATA,
72*4882a593Smuzhiyun 	MCU_SETBYPASS,
73*4882a593Smuzhiyun };
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun /*
76*4882a593Smuzhiyun  * display output interface supported by rockchip lcdc
77*4882a593Smuzhiyun  */
78*4882a593Smuzhiyun #define ROCKCHIP_OUT_MODE_P888		0
79*4882a593Smuzhiyun #define ROCKCHIP_OUT_MODE_BT1120	0
80*4882a593Smuzhiyun #define ROCKCHIP_OUT_MODE_P666		1
81*4882a593Smuzhiyun #define ROCKCHIP_OUT_MODE_P565		2
82*4882a593Smuzhiyun #define ROCKCHIP_OUT_MODE_BT656		5
83*4882a593Smuzhiyun #define ROCKCHIP_OUT_MODE_S888		8
84*4882a593Smuzhiyun #define ROCKCHIP_OUT_MODE_YUV422	9
85*4882a593Smuzhiyun #define ROCKCHIP_OUT_MODE_S888_DUMMY	12
86*4882a593Smuzhiyun #define ROCKCHIP_OUT_MODE_YUV420	14
87*4882a593Smuzhiyun /* for use special outface */
88*4882a593Smuzhiyun #define ROCKCHIP_OUT_MODE_AAAA		15
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun #define VOP_OUTPUT_IF_RGB	BIT(0)
91*4882a593Smuzhiyun #define VOP_OUTPUT_IF_BT1120	BIT(1)
92*4882a593Smuzhiyun #define VOP_OUTPUT_IF_BT656	BIT(2)
93*4882a593Smuzhiyun #define VOP_OUTPUT_IF_LVDS0	BIT(3)
94*4882a593Smuzhiyun #define VOP_OUTPUT_IF_LVDS1	BIT(4)
95*4882a593Smuzhiyun #define VOP_OUTPUT_IF_MIPI0	BIT(5)
96*4882a593Smuzhiyun #define VOP_OUTPUT_IF_MIPI1	BIT(6)
97*4882a593Smuzhiyun #define VOP_OUTPUT_IF_eDP0	BIT(7)
98*4882a593Smuzhiyun #define VOP_OUTPUT_IF_eDP1	BIT(8)
99*4882a593Smuzhiyun #define VOP_OUTPUT_IF_DP0	BIT(9)
100*4882a593Smuzhiyun #define VOP_OUTPUT_IF_DP1	BIT(10)
101*4882a593Smuzhiyun #define VOP_OUTPUT_IF_HDMI0	BIT(11)
102*4882a593Smuzhiyun #define VOP_OUTPUT_IF_HDMI1	BIT(12)
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun struct rockchip_mcu_timing {
105*4882a593Smuzhiyun 	int mcu_pix_total;
106*4882a593Smuzhiyun 	int mcu_cs_pst;
107*4882a593Smuzhiyun 	int mcu_cs_pend;
108*4882a593Smuzhiyun 	int mcu_rw_pst;
109*4882a593Smuzhiyun 	int mcu_rw_pend;
110*4882a593Smuzhiyun 	int mcu_hold_mode;
111*4882a593Smuzhiyun };
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun struct vop_rect {
114*4882a593Smuzhiyun 	int width;
115*4882a593Smuzhiyun 	int height;
116*4882a593Smuzhiyun };
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun struct rockchip_dsc_sink_cap {
119*4882a593Smuzhiyun 	/**
120*4882a593Smuzhiyun 	 * @slice_width: the number of pixel columns that comprise the slice width
121*4882a593Smuzhiyun 	 * @slice_height: the number of pixel rows that comprise the slice height
122*4882a593Smuzhiyun 	 * @block_pred: Does block prediction
123*4882a593Smuzhiyun 	 * @native_420: Does sink support DSC with 4:2:0 compression
124*4882a593Smuzhiyun 	 * @bpc_supported: compressed bpc supported by sink : 10, 12 or 16 bpc
125*4882a593Smuzhiyun 	 * @version_major: DSC major version
126*4882a593Smuzhiyun 	 * @version_minor: DSC minor version
127*4882a593Smuzhiyun 	 * @target_bits_per_pixel_x16: bits num after compress and multiply 16
128*4882a593Smuzhiyun 	 */
129*4882a593Smuzhiyun 	u16 slice_width;
130*4882a593Smuzhiyun 	u16 slice_height;
131*4882a593Smuzhiyun 	bool block_pred;
132*4882a593Smuzhiyun 	bool native_420;
133*4882a593Smuzhiyun 	u8 bpc_supported;
134*4882a593Smuzhiyun 	u8 version_major;
135*4882a593Smuzhiyun 	u8 version_minor;
136*4882a593Smuzhiyun 	u16 target_bits_per_pixel_x16;
137*4882a593Smuzhiyun };
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun struct display_rect {
140*4882a593Smuzhiyun 	int x;
141*4882a593Smuzhiyun 	int y;
142*4882a593Smuzhiyun 	int w;
143*4882a593Smuzhiyun 	int h;
144*4882a593Smuzhiyun };
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun struct 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 crtc_state {
155*4882a593Smuzhiyun 	struct udevice *dev;
156*4882a593Smuzhiyun 	struct rockchip_crtc *crtc;
157*4882a593Smuzhiyun 	void *private;
158*4882a593Smuzhiyun 	ofnode node;
159*4882a593Smuzhiyun 	struct device_node *ports_node; /* if (ports_node) it's vop2; */
160*4882a593Smuzhiyun 	struct clk dclk;
161*4882a593Smuzhiyun 	int crtc_id;
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun 	int format;
164*4882a593Smuzhiyun 	u32 dma_addr;
165*4882a593Smuzhiyun 	int ymirror;
166*4882a593Smuzhiyun 	int rb_swap;
167*4882a593Smuzhiyun 	int xvir;
168*4882a593Smuzhiyun 	int post_csc_mode;
169*4882a593Smuzhiyun 	int dclk_core_div;
170*4882a593Smuzhiyun 	int dclk_out_div;
171*4882a593Smuzhiyun 	struct display_rect src_rect;
172*4882a593Smuzhiyun 	struct display_rect crtc_rect;
173*4882a593Smuzhiyun 	struct display_rect right_src_rect;
174*4882a593Smuzhiyun 	struct display_rect right_crtc_rect;
175*4882a593Smuzhiyun 	bool yuv_overlay;
176*4882a593Smuzhiyun 	bool post_r2y_en;
177*4882a593Smuzhiyun 	bool post_y2r_en;
178*4882a593Smuzhiyun 	bool bcsh_en;
179*4882a593Smuzhiyun 	bool splice_mode;
180*4882a593Smuzhiyun 	bool soft_te;
181*4882a593Smuzhiyun 	u8 splice_crtc_id;
182*4882a593Smuzhiyun 	u8 dsc_id;
183*4882a593Smuzhiyun 	u8 dsc_enable;
184*4882a593Smuzhiyun 	u8 dsc_slice_num;
185*4882a593Smuzhiyun 	u8 dsc_pixel_num;
186*4882a593Smuzhiyun 	struct rockchip_mcu_timing mcu_timing;
187*4882a593Smuzhiyun 	u32 dual_channel_swap;
188*4882a593Smuzhiyun 	u32 feature;
189*4882a593Smuzhiyun 	struct vop_rect max_output;
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun 	u64 dsc_txp_clk_rate;
192*4882a593Smuzhiyun 	u64 dsc_pxl_clk_rate;
193*4882a593Smuzhiyun 	u64 dsc_cds_clk_rate;
194*4882a593Smuzhiyun 	struct drm_dsc_picture_parameter_set pps;
195*4882a593Smuzhiyun 	struct rockchip_dsc_sink_cap dsc_sink_cap;
196*4882a593Smuzhiyun };
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun struct panel_state {
199*4882a593Smuzhiyun 	struct rockchip_panel *panel;
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun 	ofnode dsp_lut_node;
202*4882a593Smuzhiyun };
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun struct overscan {
205*4882a593Smuzhiyun 	int left_margin;
206*4882a593Smuzhiyun 	int right_margin;
207*4882a593Smuzhiyun 	int top_margin;
208*4882a593Smuzhiyun 	int bottom_margin;
209*4882a593Smuzhiyun };
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun struct connector_state {
212*4882a593Smuzhiyun 	struct rockchip_connector *connector;
213*4882a593Smuzhiyun 	struct rockchip_connector *secondary;
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun 	struct drm_display_mode mode;
216*4882a593Smuzhiyun 	struct overscan overscan;
217*4882a593Smuzhiyun 	u8 edid[EDID_SIZE * 4];
218*4882a593Smuzhiyun 	int bus_format;
219*4882a593Smuzhiyun 	u32 bus_flags;
220*4882a593Smuzhiyun 	int output_mode;
221*4882a593Smuzhiyun 	int type;
222*4882a593Smuzhiyun 	int output_if;
223*4882a593Smuzhiyun 	int output_flags;
224*4882a593Smuzhiyun 	int color_space;
225*4882a593Smuzhiyun 	unsigned int bpc;
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun 	/**
228*4882a593Smuzhiyun 	 * @hold_mode: enabled when it's:
229*4882a593Smuzhiyun 	 * (1) mcu hold mode
230*4882a593Smuzhiyun 	 * (2) mipi dsi cmd mode
231*4882a593Smuzhiyun 	 * (3) edp psr mode
232*4882a593Smuzhiyun 	 */
233*4882a593Smuzhiyun 	bool hold_mode;
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun 	struct base2_disp_info *disp_info; /* disp_info from baseparameter 2.0 */
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun 	u8 dsc_id;
238*4882a593Smuzhiyun 	u8 dsc_slice_num;
239*4882a593Smuzhiyun 	u8 dsc_pixel_num;
240*4882a593Smuzhiyun 	u64 dsc_txp_clk;
241*4882a593Smuzhiyun 	u64 dsc_pxl_clk;
242*4882a593Smuzhiyun 	u64 dsc_cds_clk;
243*4882a593Smuzhiyun 	struct rockchip_dsc_sink_cap dsc_sink_cap;
244*4882a593Smuzhiyun 	struct drm_dsc_picture_parameter_set pps;
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun 	struct gpio_desc *te_gpio;
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun 	struct {
249*4882a593Smuzhiyun 		u32 *lut;
250*4882a593Smuzhiyun 		int size;
251*4882a593Smuzhiyun 	} gamma;
252*4882a593Smuzhiyun };
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun struct logo_info {
255*4882a593Smuzhiyun 	int mode;
256*4882a593Smuzhiyun 	char *mem;
257*4882a593Smuzhiyun 	bool ymirror;
258*4882a593Smuzhiyun 	u32 offset;
259*4882a593Smuzhiyun 	u32 width;
260*4882a593Smuzhiyun 	int height;
261*4882a593Smuzhiyun 	u32 bpp;
262*4882a593Smuzhiyun };
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun struct rockchip_logo_cache {
265*4882a593Smuzhiyun 	struct list_head head;
266*4882a593Smuzhiyun 	char name[20];
267*4882a593Smuzhiyun 	struct logo_info logo;
268*4882a593Smuzhiyun };
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun struct display_state {
271*4882a593Smuzhiyun 	struct list_head head;
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun 	const void *blob;
274*4882a593Smuzhiyun 	ofnode node;
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun 	struct crtc_state crtc_state;
277*4882a593Smuzhiyun 	struct connector_state conn_state;
278*4882a593Smuzhiyun 	struct panel_state panel_state;
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun 	char ulogo_name[30];
281*4882a593Smuzhiyun 	char klogo_name[30];
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun 	struct logo_info logo;
284*4882a593Smuzhiyun 	int logo_mode;
285*4882a593Smuzhiyun 	int charge_logo_mode;
286*4882a593Smuzhiyun 	void *mem_base;
287*4882a593Smuzhiyun 	int mem_size;
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun 	int enable;
290*4882a593Smuzhiyun 	int is_init;
291*4882a593Smuzhiyun 	int is_enable;
292*4882a593Smuzhiyun 	bool is_klogo_valid;
293*4882a593Smuzhiyun 	bool force_output;
294*4882a593Smuzhiyun 	bool enabled_at_spl;
295*4882a593Smuzhiyun 	struct drm_display_mode force_mode;
296*4882a593Smuzhiyun 	u32 force_bus_format;
297*4882a593Smuzhiyun };
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun int drm_mode_vrefresh(const struct drm_display_mode *mode);
300*4882a593Smuzhiyun int display_send_mcu_cmd(struct display_state *state, u32 type, u32 val);
301*4882a593Smuzhiyun bool drm_mode_is_420(const struct drm_display_info *display,
302*4882a593Smuzhiyun 		     struct drm_display_mode *mode);
303*4882a593Smuzhiyun struct base2_disp_info *rockchip_get_disp_info(int type, int id);
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun void drm_mode_max_resolution_filter(struct hdmi_edid_data *edid_data,
306*4882a593Smuzhiyun 				    struct vop_rect *max_output);
307*4882a593Smuzhiyun unsigned long get_cubic_lut_buffer(int crtc_id);
308*4882a593Smuzhiyun int rockchip_ofnode_get_display_mode(ofnode node, struct drm_display_mode *mode,
309*4882a593Smuzhiyun 				     u32 *bus_flags);
310*4882a593Smuzhiyun void rockchip_display_make_crc32_table(void);
311*4882a593Smuzhiyun uint32_t rockchip_display_crc32c_cal(unsigned char *data, int length);
312*4882a593Smuzhiyun void drm_mode_set_crtcinfo(struct drm_display_mode *p, int adjust_flags);
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun int display_rect_calc_hscale(struct display_rect *src, struct display_rect *dst,
315*4882a593Smuzhiyun 			     int min_hscale, int max_hscale);
316*4882a593Smuzhiyun int display_rect_calc_vscale(struct display_rect *src, struct display_rect *dst,
317*4882a593Smuzhiyun 			     int min_vscale, int max_vscale);
318*4882a593Smuzhiyun const struct device_node *
319*4882a593Smuzhiyun rockchip_of_graph_get_endpoint_by_regs(ofnode node, int port, int endpoint);
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun #ifdef CONFIG_SPL_BUILD
322*4882a593Smuzhiyun int rockchip_spl_vop_probe(struct crtc_state *crtc_state);
323*4882a593Smuzhiyun int rockchip_spl_dw_hdmi_probe(struct connector_state *conn_state);
324*4882a593Smuzhiyun int inno_spl_hdmi_phy_probe(struct display_state *state);
325*4882a593Smuzhiyun #endif
326*4882a593Smuzhiyun #endif
327