]> Git Repo - linux.git/blob - drivers/gpu/drm/amd/display/dc/inc/hw/stream_encoder.h
Merge tag 'input-for-v6.7-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor...
[linux.git] / drivers / gpu / drm / amd / display / dc / inc / hw / stream_encoder.h
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
34 struct dc_bios;
35 struct dc_context;
36 struct dc_crtc_timing;
37
38 enum dp_pixel_encoding_type {
39         DP_PIXEL_ENCODING_TYPE_RGB444           = 0x00000000,
40         DP_PIXEL_ENCODING_TYPE_YCBCR422         = 0x00000001,
41         DP_PIXEL_ENCODING_TYPE_YCBCR444         = 0x00000002,
42         DP_PIXEL_ENCODING_TYPE_RGB_WIDE_GAMUT   = 0x00000003,
43         DP_PIXEL_ENCODING_TYPE_Y_ONLY           = 0x00000004,
44         DP_PIXEL_ENCODING_TYPE_YCBCR420         = 0x00000005
45 };
46
47 enum dp_component_depth {
48         DP_COMPONENT_PIXEL_DEPTH_6BPC           = 0x00000000,
49         DP_COMPONENT_PIXEL_DEPTH_8BPC           = 0x00000001,
50         DP_COMPONENT_PIXEL_DEPTH_10BPC          = 0x00000002,
51         DP_COMPONENT_PIXEL_DEPTH_12BPC          = 0x00000003,
52         DP_COMPONENT_PIXEL_DEPTH_16BPC          = 0x00000004
53 };
54
55 struct audio_clock_info {
56         /* pixel clock frequency*/
57         uint32_t pixel_clock_in_10khz;
58         /* N - 32KHz audio */
59         uint32_t n_32khz;
60         /* CTS - 32KHz audio*/
61         uint32_t cts_32khz;
62         uint32_t n_44khz;
63         uint32_t cts_44khz;
64         uint32_t n_48khz;
65         uint32_t cts_48khz;
66 };
67
68 enum dynamic_metadata_mode {
69         dmdata_dp,
70         dmdata_hdmi,
71         dmdata_dolby_vision
72 };
73
74 struct enc_sdp_line_num {
75         /* Adaptive Sync SDP */
76         bool adaptive_sync_line_num_valid;
77         uint32_t adaptive_sync_line_num;
78 };
79
80 struct encoder_info_frame {
81         /* auxiliary video information */
82         struct dc_info_packet avi;
83         struct dc_info_packet gamut;
84         struct dc_info_packet vendor;
85         struct dc_info_packet hfvsif;
86         struct dc_info_packet vtem;
87         /* source product description */
88         struct dc_info_packet spd;
89         /* video stream configuration */
90         struct dc_info_packet vsc;
91         /* HDR Static MetaData */
92         struct dc_info_packet hdrsmd;
93         /* Adaptive Sync SDP*/
94         struct dc_info_packet adaptive_sync;
95         struct enc_sdp_line_num sdp_line_num;
96 };
97
98 struct encoder_unblank_param {
99         struct dc_link_settings link_settings;
100         struct dc_crtc_timing timing;
101         int opp_cnt;
102 };
103
104 struct encoder_set_dp_phy_pattern_param {
105         enum dp_test_pattern dp_phy_pattern;
106         const uint8_t *custom_pattern;
107         uint32_t custom_pattern_size;
108         enum dp_panel_mode dp_panel_mode;
109 };
110
111 struct stream_encoder {
112         const struct stream_encoder_funcs *funcs;
113         struct dc_context *ctx;
114         struct dc_bios *bp;
115         enum engine_id id;
116         uint32_t stream_enc_inst;
117         struct vpg *vpg;
118         struct afmt *afmt;
119 };
120
121 struct enc_state {
122         uint32_t dsc_mode;  // DISABLED  0; 1 or 2 indicate enabled state.
123         uint32_t dsc_slice_width;
124         uint32_t sec_gsp_pps_line_num;
125         uint32_t vbid6_line_reference;
126         uint32_t vbid6_line_num;
127         uint32_t sec_gsp_pps_enable;
128         uint32_t sec_stream_enable;
129 };
130
131 struct stream_encoder_funcs {
132         void (*dp_set_stream_attribute)(
133                 struct stream_encoder *enc,
134                 struct dc_crtc_timing *crtc_timing,
135                 enum dc_color_space output_color_space,
136                 bool use_vsc_sdp_for_colorimetry,
137                 uint32_t enable_sdp_splitting);
138
139         void (*hdmi_set_stream_attribute)(
140                 struct stream_encoder *enc,
141                 struct dc_crtc_timing *crtc_timing,
142                 int actual_pix_clk_khz,
143                 bool enable_audio);
144
145         void (*dvi_set_stream_attribute)(
146                 struct stream_encoder *enc,
147                 struct dc_crtc_timing *crtc_timing,
148                 bool is_dual_link);
149
150         void (*lvds_set_stream_attribute)(
151                 struct stream_encoder *enc,
152                 struct dc_crtc_timing *crtc_timing);
153
154         void (*set_throttled_vcp_size)(
155                 struct stream_encoder *enc,
156                 struct fixed31_32 avg_time_slots_per_mtp);
157
158         void (*update_hdmi_info_packets)(
159                 struct stream_encoder *enc,
160                 const struct encoder_info_frame *info_frame);
161
162         void (*stop_hdmi_info_packets)(
163                 struct stream_encoder *enc);
164
165         void (*update_dp_info_packets_sdp_line_num)(
166                 struct stream_encoder *enc,
167                 struct encoder_info_frame *info_frame);
168
169         void (*update_dp_info_packets)(
170                 struct stream_encoder *enc,
171                 const struct encoder_info_frame *info_frame);
172
173         void (*send_immediate_sdp_message)(
174                                 struct stream_encoder *enc,
175                                 const uint8_t *custom_sdp_message,
176                                 unsigned int sdp_message_size);
177
178         void (*stop_dp_info_packets)(
179                 struct stream_encoder *enc);
180
181         void (*reset_fifo)(
182                 struct stream_encoder *enc
183         );
184
185         void (*dp_blank)(
186                 struct dc_link *link,
187                 struct stream_encoder *enc);
188
189         void (*dp_unblank)(
190                 struct dc_link *link,
191                 struct stream_encoder *enc,
192                 const struct encoder_unblank_param *param);
193
194         void (*audio_mute_control)(
195                 struct stream_encoder *enc, bool mute);
196
197         void (*dp_audio_setup)(
198                 struct stream_encoder *enc,
199                 unsigned int az_inst,
200                 struct audio_info *info);
201
202         void (*dp_audio_enable) (
203                         struct stream_encoder *enc);
204
205         void (*dp_audio_disable) (
206                         struct stream_encoder *enc);
207
208         void (*hdmi_audio_setup)(
209                 struct stream_encoder *enc,
210                 unsigned int az_inst,
211                 struct audio_info *info,
212                 struct audio_crtc_info *audio_crtc_info);
213
214         void (*hdmi_audio_disable) (
215                         struct stream_encoder *enc);
216
217         void (*setup_stereo_sync) (
218                         struct stream_encoder *enc,
219                         int tg_inst,
220                         bool enable);
221
222         void (*set_avmute)(
223                 struct stream_encoder *enc, bool enable);
224
225         void (*dig_connect_to_otg)(
226                 struct stream_encoder *enc,
227                 int tg_inst);
228
229         void (*dig_stream_enable)(
230                 struct stream_encoder *enc,
231                 enum signal_type signal,
232                 bool enable);
233
234         void (*hdmi_reset_stream_attribute)(
235                 struct stream_encoder *enc);
236
237         unsigned int (*dig_source_otg)(
238                 struct stream_encoder *enc);
239
240         bool (*dp_get_pixel_format)(
241                 struct stream_encoder *enc,
242                 enum dc_pixel_encoding *encoding,
243                 enum dc_color_depth *depth);
244
245         void (*enc_read_state)(struct stream_encoder *enc, struct enc_state *s);
246
247         void (*dp_set_dsc_config)(
248                         struct stream_encoder *enc,
249                         enum optc_dsc_mode dsc_mode,
250                         uint32_t dsc_bytes_per_pixel,
251                         uint32_t dsc_slice_width);
252
253         void (*dp_set_dsc_pps_info_packet)(struct stream_encoder *enc,
254                                 bool enable,
255                                 uint8_t *dsc_packed_pps,
256                                 bool immediate_update);
257
258         void (*set_dynamic_metadata)(struct stream_encoder *enc,
259                         bool enable,
260                         uint32_t hubp_requestor_id,
261                         enum dynamic_metadata_mode dmdata_mode);
262
263         /**
264          * @dp_set_odm_combine: Sets up DP stream encoder for ODM.
265          */
266         void (*dp_set_odm_combine)(
267                 struct stream_encoder *enc,
268                 bool odm_combine);
269
270         uint32_t (*get_fifo_cal_average_level)(
271                 struct stream_encoder *enc);
272
273         void (*set_input_mode)(
274                 struct stream_encoder *enc, unsigned int pix_per_container);
275         void (*enable_fifo)(struct stream_encoder *enc);
276         void (*disable_fifo)(struct stream_encoder *enc);
277         void (*map_stream_to_link)(struct stream_encoder *enc, uint32_t stream_enc_inst, uint32_t link_enc_inst);
278 };
279
280 struct hpo_dp_stream_encoder_state {
281         uint32_t stream_enc_enabled;
282         uint32_t vid_stream_enabled;
283         uint32_t otg_inst;
284         uint32_t pixel_encoding;
285         uint32_t component_depth;
286         uint32_t compressed_format;
287         uint32_t sdp_enabled;
288         uint32_t mapped_to_link_enc;
289 };
290
291 struct hpo_dp_stream_encoder {
292         const struct hpo_dp_stream_encoder_funcs *funcs;
293         struct dc_context *ctx;
294         struct dc_bios *bp;
295         uint32_t inst;
296         enum engine_id id;
297         struct vpg *vpg;
298         struct apg *apg;
299 };
300
301 struct hpo_dp_stream_encoder_funcs {
302         void (*enable_stream)(
303                         struct hpo_dp_stream_encoder *enc);
304
305         void (*dp_unblank)(
306                         struct hpo_dp_stream_encoder *enc,
307                         uint32_t stream_source);
308
309         void (*dp_blank)(
310                         struct hpo_dp_stream_encoder *enc);
311
312         void (*disable)(
313                         struct hpo_dp_stream_encoder *enc);
314
315         void (*set_stream_attribute)(
316                 struct hpo_dp_stream_encoder *enc,
317                 struct dc_crtc_timing *crtc_timing,
318                 enum dc_color_space output_color_space,
319                 bool use_vsc_sdp_for_colorimetry,
320                 bool compressed_format,
321                 bool double_buffer_en);
322
323         void (*update_dp_info_packets_sdp_line_num)(
324                 struct hpo_dp_stream_encoder *enc,
325                 struct encoder_info_frame *info_frame);
326
327         void (*update_dp_info_packets)(
328                 struct hpo_dp_stream_encoder *enc,
329                 const struct encoder_info_frame *info_frame);
330
331         void (*stop_dp_info_packets)(
332                 struct hpo_dp_stream_encoder *enc);
333
334         void (*dp_set_dsc_pps_info_packet)(
335                         struct hpo_dp_stream_encoder *enc,
336                         bool enable,
337                         uint8_t *dsc_packed_pps,
338                         bool immediate_update);
339
340         void (*map_stream_to_link)(
341                         struct hpo_dp_stream_encoder *enc,
342                         uint32_t stream_enc_inst,
343                         uint32_t link_enc_inst);
344
345         void (*dp_audio_setup)(
346                         struct hpo_dp_stream_encoder *enc,
347                         unsigned int az_inst,
348                         struct audio_info *info);
349
350         void (*dp_audio_enable)(
351                         struct hpo_dp_stream_encoder *enc);
352
353         void (*dp_audio_disable)(
354                         struct hpo_dp_stream_encoder *enc);
355
356         void (*read_state)(
357                         struct hpo_dp_stream_encoder *enc,
358                         struct hpo_dp_stream_encoder_state *state);
359
360         void (*set_hblank_min_symbol_width)(
361                         struct hpo_dp_stream_encoder *enc,
362                         uint16_t width);
363 };
364
365 #endif /* STREAM_ENCODER_H_ */
This page took 0.051556 seconds and 4 git commands to generate.