xref: /OK3568_Linux_fs/kernel/drivers/gpu/drm/tidss/tidss_dispc.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (C) 2018 Texas Instruments Incorporated - https://www.ti.com/
4*4882a593Smuzhiyun  * Author: Tomi Valkeinen <tomi.valkeinen@ti.com>
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #ifndef __TIDSS_DISPC_H__
8*4882a593Smuzhiyun #define __TIDSS_DISPC_H__
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include "tidss_drv.h"
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun struct dispc_device;
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun struct drm_crtc_state;
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun enum tidss_gamma_type { TIDSS_GAMMA_8BIT, TIDSS_GAMMA_10BIT };
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun struct tidss_vp_feat {
19*4882a593Smuzhiyun 	struct tidss_vp_color_feat {
20*4882a593Smuzhiyun 		u32 gamma_size;
21*4882a593Smuzhiyun 		enum tidss_gamma_type gamma_type;
22*4882a593Smuzhiyun 		bool has_ctm;
23*4882a593Smuzhiyun 	} color;
24*4882a593Smuzhiyun };
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun struct tidss_plane_feat {
27*4882a593Smuzhiyun 	struct tidss_plane_color_feat {
28*4882a593Smuzhiyun 		u32 encodings;
29*4882a593Smuzhiyun 		u32 ranges;
30*4882a593Smuzhiyun 		enum drm_color_encoding default_encoding;
31*4882a593Smuzhiyun 		enum drm_color_range default_range;
32*4882a593Smuzhiyun 	} color;
33*4882a593Smuzhiyun 	struct tidss_plane_blend_feat {
34*4882a593Smuzhiyun 		bool global_alpha;
35*4882a593Smuzhiyun 	} blend;
36*4882a593Smuzhiyun };
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun struct dispc_features_scaling {
39*4882a593Smuzhiyun 	u32 in_width_max_5tap_rgb;
40*4882a593Smuzhiyun 	u32 in_width_max_3tap_rgb;
41*4882a593Smuzhiyun 	u32 in_width_max_5tap_yuv;
42*4882a593Smuzhiyun 	u32 in_width_max_3tap_yuv;
43*4882a593Smuzhiyun 	u32 upscale_limit;
44*4882a593Smuzhiyun 	u32 downscale_limit_5tap;
45*4882a593Smuzhiyun 	u32 downscale_limit_3tap;
46*4882a593Smuzhiyun 	u32 xinc_max;
47*4882a593Smuzhiyun };
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun struct dispc_errata {
50*4882a593Smuzhiyun 	bool i2000; /* DSS Does Not Support YUV Pixel Data Formats */
51*4882a593Smuzhiyun };
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun enum dispc_vp_bus_type {
54*4882a593Smuzhiyun 	DISPC_VP_DPI,		/* DPI output */
55*4882a593Smuzhiyun 	DISPC_VP_OLDI,		/* OLDI (LVDS) output */
56*4882a593Smuzhiyun 	DISPC_VP_INTERNAL,	/* SoC internal routing */
57*4882a593Smuzhiyun 	DISPC_VP_MAX_BUS_TYPE,
58*4882a593Smuzhiyun };
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun enum dispc_dss_subrevision {
61*4882a593Smuzhiyun 	DISPC_K2G,
62*4882a593Smuzhiyun 	DISPC_AM65X,
63*4882a593Smuzhiyun 	DISPC_J721E,
64*4882a593Smuzhiyun };
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun struct dispc_features {
67*4882a593Smuzhiyun 	int min_pclk_khz;
68*4882a593Smuzhiyun 	int max_pclk_khz[DISPC_VP_MAX_BUS_TYPE];
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun 	struct dispc_features_scaling scaling;
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun 	enum dispc_dss_subrevision subrev;
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun 	const char *common;
75*4882a593Smuzhiyun 	const u16 *common_regs;
76*4882a593Smuzhiyun 	u32 num_vps;
77*4882a593Smuzhiyun 	const char *vp_name[TIDSS_MAX_PORTS]; /* Should match dt reg names */
78*4882a593Smuzhiyun 	const char *ovr_name[TIDSS_MAX_PORTS]; /* Should match dt reg names */
79*4882a593Smuzhiyun 	const char *vpclk_name[TIDSS_MAX_PORTS]; /* Should match dt clk names */
80*4882a593Smuzhiyun 	const enum dispc_vp_bus_type vp_bus_type[TIDSS_MAX_PORTS];
81*4882a593Smuzhiyun 	struct tidss_vp_feat vp_feat;
82*4882a593Smuzhiyun 	u32 num_planes;
83*4882a593Smuzhiyun 	const char *vid_name[TIDSS_MAX_PLANES]; /* Should match dt reg names */
84*4882a593Smuzhiyun 	bool vid_lite[TIDSS_MAX_PLANES];
85*4882a593Smuzhiyun 	u32 vid_order[TIDSS_MAX_PLANES];
86*4882a593Smuzhiyun };
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun extern const struct dispc_features dispc_k2g_feats;
89*4882a593Smuzhiyun extern const struct dispc_features dispc_am65x_feats;
90*4882a593Smuzhiyun extern const struct dispc_features dispc_j721e_feats;
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun void dispc_set_irqenable(struct dispc_device *dispc, dispc_irq_t mask);
93*4882a593Smuzhiyun dispc_irq_t dispc_read_and_clear_irqstatus(struct dispc_device *dispc);
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun void dispc_ovr_set_plane(struct dispc_device *dispc, u32 hw_plane,
96*4882a593Smuzhiyun 			 u32 hw_videoport, u32 x, u32 y, u32 layer);
97*4882a593Smuzhiyun void dispc_ovr_enable_layer(struct dispc_device *dispc,
98*4882a593Smuzhiyun 			    u32 hw_videoport, u32 layer, bool enable);
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun void dispc_vp_prepare(struct dispc_device *dispc, u32 hw_videoport,
101*4882a593Smuzhiyun 		      const struct drm_crtc_state *state);
102*4882a593Smuzhiyun void dispc_vp_enable(struct dispc_device *dispc, u32 hw_videoport,
103*4882a593Smuzhiyun 		     const struct drm_crtc_state *state);
104*4882a593Smuzhiyun void dispc_vp_disable(struct dispc_device *dispc, u32 hw_videoport);
105*4882a593Smuzhiyun void dispc_vp_unprepare(struct dispc_device *dispc, u32 hw_videoport);
106*4882a593Smuzhiyun bool dispc_vp_go_busy(struct dispc_device *dispc, u32 hw_videoport);
107*4882a593Smuzhiyun void dispc_vp_go(struct dispc_device *dispc, u32 hw_videoport);
108*4882a593Smuzhiyun int dispc_vp_bus_check(struct dispc_device *dispc, u32 hw_videoport,
109*4882a593Smuzhiyun 		       const struct drm_crtc_state *state);
110*4882a593Smuzhiyun enum drm_mode_status dispc_vp_mode_valid(struct dispc_device *dispc,
111*4882a593Smuzhiyun 					 u32 hw_videoport,
112*4882a593Smuzhiyun 					 const struct drm_display_mode *mode);
113*4882a593Smuzhiyun int dispc_vp_enable_clk(struct dispc_device *dispc, u32 hw_videoport);
114*4882a593Smuzhiyun void dispc_vp_disable_clk(struct dispc_device *dispc, u32 hw_videoport);
115*4882a593Smuzhiyun int dispc_vp_set_clk_rate(struct dispc_device *dispc, u32 hw_videoport,
116*4882a593Smuzhiyun 			  unsigned long rate);
117*4882a593Smuzhiyun void dispc_vp_setup(struct dispc_device *dispc, u32 hw_videoport,
118*4882a593Smuzhiyun 		    const struct drm_crtc_state *state, bool newmodeset);
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun int dispc_runtime_suspend(struct dispc_device *dispc);
121*4882a593Smuzhiyun int dispc_runtime_resume(struct dispc_device *dispc);
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun int dispc_plane_check(struct dispc_device *dispc, u32 hw_plane,
124*4882a593Smuzhiyun 		      const struct drm_plane_state *state,
125*4882a593Smuzhiyun 		      u32 hw_videoport);
126*4882a593Smuzhiyun int dispc_plane_setup(struct dispc_device *dispc, u32 hw_plane,
127*4882a593Smuzhiyun 		      const struct drm_plane_state *state,
128*4882a593Smuzhiyun 		      u32 hw_videoport);
129*4882a593Smuzhiyun int dispc_plane_enable(struct dispc_device *dispc, u32 hw_plane, bool enable);
130*4882a593Smuzhiyun const u32 *dispc_plane_formats(struct dispc_device *dispc, unsigned int *len);
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun int dispc_init(struct tidss_device *tidss);
133*4882a593Smuzhiyun void dispc_remove(struct tidss_device *tidss);
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun #endif
136