1 /*
2  * Copyright 2017 Advanced Micro Devices, Inc.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20  * OTHER DEALINGS IN THE SOFTWARE.
21  *
22  */
23 /*
24  * stream_encoder.h
25  *
26  */
27 
28 #ifndef STREAM_ENCODER_H_
29 #define STREAM_ENCODER_H_
30 
31 #include "audio_types.h"
32 #include "hw_shared.h"
33 #include "dc_link.h"
34 
35 struct dc_bios;
36 struct dc_context;
37 struct dc_crtc_timing;
38 
39 enum dp_pixel_encoding_type {
40 	DP_PIXEL_ENCODING_TYPE_RGB444		= 0x00000000,
41 	DP_PIXEL_ENCODING_TYPE_YCBCR422		= 0x00000001,
42 	DP_PIXEL_ENCODING_TYPE_YCBCR444		= 0x00000002,
43 	DP_PIXEL_ENCODING_TYPE_RGB_WIDE_GAMUT	= 0x00000003,
44 	DP_PIXEL_ENCODING_TYPE_Y_ONLY		= 0x00000004,
45 	DP_PIXEL_ENCODING_TYPE_YCBCR420		= 0x00000005
46 };
47 
48 enum dp_component_depth {
49 	DP_COMPONENT_PIXEL_DEPTH_6BPC		= 0x00000000,
50 	DP_COMPONENT_PIXEL_DEPTH_8BPC		= 0x00000001,
51 	DP_COMPONENT_PIXEL_DEPTH_10BPC		= 0x00000002,
52 	DP_COMPONENT_PIXEL_DEPTH_12BPC		= 0x00000003,
53 	DP_COMPONENT_PIXEL_DEPTH_16BPC		= 0x00000004
54 };
55 
56 struct audio_clock_info {
57 	/* pixel clock frequency*/
58 	uint32_t pixel_clock_in_10khz;
59 	/* N - 32KHz audio */
60 	uint32_t n_32khz;
61 	/* CTS - 32KHz audio*/
62 	uint32_t cts_32khz;
63 	uint32_t n_44khz;
64 	uint32_t cts_44khz;
65 	uint32_t n_48khz;
66 	uint32_t cts_48khz;
67 };
68 
69 enum dynamic_metadata_mode {
70 	dmdata_dp,
71 	dmdata_hdmi,
72 	dmdata_dolby_vision
73 };
74 
75 struct enc_sdp_line_num {
76 	/* Adaptive Sync SDP */
77 	bool adaptive_sync_line_num_valid;
78 	uint32_t adaptive_sync_line_num;
79 };
80 
81 struct encoder_info_frame {
82 	/* auxiliary video information */
83 	struct dc_info_packet avi;
84 	struct dc_info_packet gamut;
85 	struct dc_info_packet vendor;
86 	struct dc_info_packet hfvsif;
87 	struct dc_info_packet vtem;
88 	/* source product description */
89 	struct dc_info_packet spd;
90 	/* video stream configuration */
91 	struct dc_info_packet vsc;
92 	/* HDR Static MetaData */
93 	struct dc_info_packet hdrsmd;
94 	/* Adaptive Sync SDP*/
95 	struct dc_info_packet adaptive_sync;
96 	struct enc_sdp_line_num sdp_line_num;
97 };
98 
99 struct encoder_unblank_param {
100 	struct dc_link_settings link_settings;
101 	struct dc_crtc_timing timing;
102 	int opp_cnt;
103 };
104 
105 struct encoder_set_dp_phy_pattern_param {
106 	enum dp_test_pattern dp_phy_pattern;
107 	const uint8_t *custom_pattern;
108 	uint32_t custom_pattern_size;
109 	enum dp_panel_mode dp_panel_mode;
110 };
111 
112 struct stream_encoder {
113 	const struct stream_encoder_funcs *funcs;
114 	struct dc_context *ctx;
115 	struct dc_bios *bp;
116 	enum engine_id id;
117 	uint32_t stream_enc_inst;
118 	struct vpg *vpg;
119 	struct afmt *afmt;
120 };
121 
122 struct enc_state {
123 	uint32_t dsc_mode;  // DISABLED  0; 1 or 2 indicate enabled state.
124 	uint32_t dsc_slice_width;
125 	uint32_t sec_gsp_pps_line_num;
126 	uint32_t vbid6_line_reference;
127 	uint32_t vbid6_line_num;
128 	uint32_t sec_gsp_pps_enable;
129 	uint32_t sec_stream_enable;
130 };
131 
132 struct stream_encoder_funcs {
133 	void (*dp_set_stream_attribute)(
134 		struct stream_encoder *enc,
135 		struct dc_crtc_timing *crtc_timing,
136 		enum dc_color_space output_color_space,
137 		bool use_vsc_sdp_for_colorimetry,
138 		uint32_t enable_sdp_splitting);
139 
140 	void (*hdmi_set_stream_attribute)(
141 		struct stream_encoder *enc,
142 		struct dc_crtc_timing *crtc_timing,
143 		int actual_pix_clk_khz,
144 		bool enable_audio);
145 
146 	void (*dvi_set_stream_attribute)(
147 		struct stream_encoder *enc,
148 		struct dc_crtc_timing *crtc_timing,
149 		bool is_dual_link);
150 
151 	void (*lvds_set_stream_attribute)(
152 		struct stream_encoder *enc,
153 		struct dc_crtc_timing *crtc_timing);
154 
155 	void (*set_throttled_vcp_size)(
156 		struct stream_encoder *enc,
157 		struct fixed31_32 avg_time_slots_per_mtp);
158 
159 	void (*update_hdmi_info_packets)(
160 		struct stream_encoder *enc,
161 		const struct encoder_info_frame *info_frame);
162 
163 	void (*stop_hdmi_info_packets)(
164 		struct stream_encoder *enc);
165 
166 	void (*update_dp_info_packets_sdp_line_num)(
167 		struct stream_encoder *enc,
168 		struct encoder_info_frame *info_frame);
169 
170 	void (*update_dp_info_packets)(
171 		struct stream_encoder *enc,
172 		const struct encoder_info_frame *info_frame);
173 
174 	void (*send_immediate_sdp_message)(
175 				struct stream_encoder *enc,
176 				const uint8_t *custom_sdp_message,
177 				unsigned int sdp_message_size);
178 
179 	void (*stop_dp_info_packets)(
180 		struct stream_encoder *enc);
181 
182 	void (*reset_fifo)(
183 		struct stream_encoder *enc
184 	);
185 
186 	void (*dp_blank)(
187 		struct dc_link *link,
188 		struct stream_encoder *enc);
189 
190 	void (*dp_unblank)(
191 		struct dc_link *link,
192 		struct stream_encoder *enc,
193 		const struct encoder_unblank_param *param);
194 
195 	void (*audio_mute_control)(
196 		struct stream_encoder *enc, bool mute);
197 
198 	void (*dp_audio_setup)(
199 		struct stream_encoder *enc,
200 		unsigned int az_inst,
201 		struct audio_info *info);
202 
203 	void (*dp_audio_enable) (
204 			struct stream_encoder *enc);
205 
206 	void (*dp_audio_disable) (
207 			struct stream_encoder *enc);
208 
209 	void (*hdmi_audio_setup)(
210 		struct stream_encoder *enc,
211 		unsigned int az_inst,
212 		struct audio_info *info,
213 		struct audio_crtc_info *audio_crtc_info);
214 
215 	void (*hdmi_audio_disable) (
216 			struct stream_encoder *enc);
217 
218 	void (*setup_stereo_sync) (
219 			struct stream_encoder *enc,
220 			int tg_inst,
221 			bool enable);
222 
223 	void (*set_avmute)(
224 		struct stream_encoder *enc, bool enable);
225 
226 	void (*dig_connect_to_otg)(
227 		struct stream_encoder *enc,
228 		int tg_inst);
229 
230 	void (*hdmi_reset_stream_attribute)(
231 		struct stream_encoder *enc);
232 
233 	unsigned int (*dig_source_otg)(
234 		struct stream_encoder *enc);
235 
236 	bool (*dp_get_pixel_format)(
237 		struct stream_encoder *enc,
238 		enum dc_pixel_encoding *encoding,
239 		enum dc_color_depth *depth);
240 
241 	void (*enc_read_state)(struct stream_encoder *enc, struct enc_state *s);
242 
243 	void (*dp_set_dsc_config)(
244 			struct stream_encoder *enc,
245 			enum optc_dsc_mode dsc_mode,
246 			uint32_t dsc_bytes_per_pixel,
247 			uint32_t dsc_slice_width);
248 
249 	void (*dp_set_dsc_pps_info_packet)(struct stream_encoder *enc,
250 				bool enable,
251 				uint8_t *dsc_packed_pps,
252 				bool immediate_update);
253 
254 	void (*set_dynamic_metadata)(struct stream_encoder *enc,
255 			bool enable,
256 			uint32_t hubp_requestor_id,
257 			enum dynamic_metadata_mode dmdata_mode);
258 
259 	/**
260 	 * @dp_set_odm_combine: Sets up DP stream encoder for ODM.
261 	 */
262 	void (*dp_set_odm_combine)(
263 		struct stream_encoder *enc,
264 		bool odm_combine);
265 
266 	uint32_t (*get_fifo_cal_average_level)(
267 		struct stream_encoder *enc);
268 
269 	void (*set_input_mode)(
270 		struct stream_encoder *enc, unsigned int pix_per_container);
271 	void (*enable_fifo)(struct stream_encoder *enc);
272 	void (*disable_fifo)(struct stream_encoder *enc);
273 };
274 
275 struct hpo_dp_stream_encoder_state {
276 	uint32_t stream_enc_enabled;
277 	uint32_t vid_stream_enabled;
278 	uint32_t otg_inst;
279 	uint32_t pixel_encoding;
280 	uint32_t component_depth;
281 	uint32_t compressed_format;
282 	uint32_t sdp_enabled;
283 	uint32_t mapped_to_link_enc;
284 };
285 
286 struct hpo_dp_stream_encoder {
287 	const struct hpo_dp_stream_encoder_funcs *funcs;
288 	struct dc_context *ctx;
289 	struct dc_bios *bp;
290 	uint32_t inst;
291 	enum engine_id id;
292 	struct vpg *vpg;
293 	struct apg *apg;
294 };
295 
296 struct hpo_dp_stream_encoder_funcs {
297 	void (*enable_stream)(
298 			struct hpo_dp_stream_encoder *enc);
299 
300 	void (*dp_unblank)(
301 			struct hpo_dp_stream_encoder *enc,
302 			uint32_t stream_source);
303 
304 	void (*dp_blank)(
305 			struct hpo_dp_stream_encoder *enc);
306 
307 	void (*disable)(
308 			struct hpo_dp_stream_encoder *enc);
309 
310 	void (*set_stream_attribute)(
311 		struct hpo_dp_stream_encoder *enc,
312 		struct dc_crtc_timing *crtc_timing,
313 		enum dc_color_space output_color_space,
314 		bool use_vsc_sdp_for_colorimetry,
315 		bool compressed_format,
316 		bool double_buffer_en);
317 
318 	void (*update_dp_info_packets_sdp_line_num)(
319 		struct hpo_dp_stream_encoder *enc,
320 		struct encoder_info_frame *info_frame);
321 
322 	void (*update_dp_info_packets)(
323 		struct hpo_dp_stream_encoder *enc,
324 		const struct encoder_info_frame *info_frame);
325 
326 	void (*stop_dp_info_packets)(
327 		struct hpo_dp_stream_encoder *enc);
328 
329 	void (*dp_set_dsc_pps_info_packet)(
330 			struct hpo_dp_stream_encoder *enc,
331 			bool enable,
332 			uint8_t *dsc_packed_pps,
333 			bool immediate_update);
334 
335 	void (*map_stream_to_link)(
336 			struct hpo_dp_stream_encoder *enc,
337 			uint32_t stream_enc_inst,
338 			uint32_t link_enc_inst);
339 
340 	void (*dp_audio_setup)(
341 			struct hpo_dp_stream_encoder *enc,
342 			unsigned int az_inst,
343 			struct audio_info *info);
344 
345 	void (*dp_audio_enable)(
346 			struct hpo_dp_stream_encoder *enc);
347 
348 	void (*dp_audio_disable)(
349 			struct hpo_dp_stream_encoder *enc);
350 
351 	void (*read_state)(
352 			struct hpo_dp_stream_encoder *enc,
353 			struct hpo_dp_stream_encoder_state *state);
354 
355 	void (*set_hblank_min_symbol_width)(
356 			struct hpo_dp_stream_encoder *enc,
357 			uint16_t width);
358 };
359 
360 #endif /* STREAM_ENCODER_H_ */
361