blob: 0fa1c26bc20db4faad5a29d4aaf568a8533403fe [file] [log] [blame]
Harry Wentland7c0c9672017-11-08 14:34:14 -05001/*
2 * Copyright 2012-14 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 * Authors: AMD
23 *
24 */
25
26#ifndef DC_STREAM_H_
27#define DC_STREAM_H_
28
29#include "dc_types.h"
30#include "grph_object_defs.h"
31
32/*******************************************************************************
33 * Stream Interfaces
34 ******************************************************************************/
Su Sung Chung8dac4e72019-01-21 12:01:53 -050035struct timing_sync_info {
36 int group_id;
37 int group_size;
38 bool master;
39};
Harry Wentland7c0c9672017-11-08 14:34:14 -050040
41struct dc_stream_status {
42 int primary_otg_inst;
43 int stream_enc_inst;
44 int plane_count;
Nicholas Kazlauskas5fdb7c42019-06-28 13:39:41 -040045 int audio_inst;
Su Sung Chung8dac4e72019-01-21 12:01:53 -050046 struct timing_sync_info timing_sync_info;
Harry Wentland7c0c9672017-11-08 14:34:14 -050047 struct dc_plane_state *plane_states[MAX_SURFACE_NUM];
Harry Wentland7c0c9672017-11-08 14:34:14 -050048};
49
Anthony Koo98e64362018-08-21 14:40:28 -050050// TODO: References to this needs to be removed..
51struct freesync_context {
52 bool dummy;
53};
54
Harry Wentland6fbefb82019-02-22 16:52:34 -050055#if defined(CONFIG_DRM_AMD_DC_DCN2_0)
56enum hubp_dmdata_mode {
57 DMDATA_SW_MODE,
58 DMDATA_HW_MODE
59};
60
61struct dc_dmdata_attributes {
62 /* Specifies whether dynamic meta data will be updated by software
63 * or has to be fetched by hardware (DMA mode)
64 */
65 enum hubp_dmdata_mode dmdata_mode;
66 /* Specifies if current dynamic meta data is to be used only for the current frame */
67 bool dmdata_repeat;
68 /* Specifies the size of Dynamic Metadata surface in byte. Size of 0 means no Dynamic metadata is fetched */
69 uint32_t dmdata_size;
70 /* Specifies if a new dynamic meta data should be fetched for an upcoming frame */
71 bool dmdata_updated;
72 /* If hardware mode is used, the base address where DMDATA surface is located */
73 PHYSICAL_ADDRESS_LOC address;
74 /* Specifies whether QOS level will be provided by TTU or it will come from DMDATA_QOS_LEVEL */
75 bool dmdata_qos_mode;
76 /* If qos_mode = 1, this is the QOS value to be used: */
77 uint32_t dmdata_qos_level;
78 /* Specifies the value in unit of REFCLK cycles to be added to the
79 * current time to produce the Amortized deadline for Dynamic Metadata chunk request
80 */
81 uint32_t dmdata_dl_delta;
82 /* An unbounded array of uint32s, represents software dmdata to be loaded */
83 uint32_t *dmdata_sw_data;
84};
85#endif
86
87#if defined(CONFIG_DRM_AMD_DC_DCN2_0)
88struct dc_writeback_info {
89 bool wb_enabled;
90 int dwb_pipe_inst;
91 struct dc_dwb_params dwb_params;
92 struct mcif_buf_params mcif_buf_params;
93};
94
95struct dc_writeback_update {
96 unsigned int num_wb_info;
97 struct dc_writeback_info writeback_info[MAX_DWB_PIPES];
98};
99#endif
100
Yongqiang Sund6001ae2019-01-25 14:40:14 -0500101enum vertical_interrupt_ref_point {
102 START_V_UPDATE = 0,
103 START_V_SYNC,
104 INVALID_POINT
105
106 //For now, only v_update interrupt is used.
107 //START_V_BLANK,
108 //START_V_ACTIVE
109};
110
111struct periodic_interrupt_config {
112 enum vertical_interrupt_ref_point ref_point;
113 int lines_offset;
Fatemeh Darbehani8fde60b2019-01-11 11:00:26 -0500114};
115
Yongqiang Sun810ece12019-01-24 15:59:22 -0500116
Harry Wentland7c0c9672017-11-08 14:34:14 -0500117struct dc_stream_state {
Jun Leiceb3dbb2018-11-09 09:21:21 -0500118 // sink is deprecated, new code should not reference
119 // this pointer
Harry Wentland7c0c9672017-11-08 14:34:14 -0500120 struct dc_sink *sink;
Jun Leiceb3dbb2018-11-09 09:21:21 -0500121
122 struct dc_link *link;
123 struct dc_panel_patch sink_patches;
124 union display_content_support content_support;
Harry Wentland7c0c9672017-11-08 14:34:14 -0500125 struct dc_crtc_timing timing;
Anthony Koo98e64362018-08-21 14:40:28 -0500126 struct dc_crtc_timing_adjust adjust;
127 struct dc_info_packet vrr_infopacket;
Alvin lee13369262018-06-04 17:31:25 -0400128 struct dc_info_packet vsc_infopacket;
Harmanprit Tatlaecd01362018-11-05 17:55:53 -0500129 struct dc_info_packet vsp_infopacket;
Harry Wentland7c0c9672017-11-08 14:34:14 -0500130
131 struct rect src; /* composition area */
132 struct rect dst; /* stream addressable area */
133
Anthony Koo98e64362018-08-21 14:40:28 -0500134 // TODO: References to this needs to be removed..
Harry Wentland7c0c9672017-11-08 14:34:14 -0500135 struct freesync_context freesync_ctx;
136
Anthony Koo98e64362018-08-21 14:40:28 -0500137 struct audio_info audio_info;
138
Anthony Koo0eeef692018-04-09 14:55:17 -0500139 struct dc_info_packet hdr_static_metadata;
Krunoslav Kovac4ea20902018-05-08 16:03:58 -0400140 PHYSICAL_ADDRESS_LOC dmdata_address;
Krunoslav Kovaca10dc972018-05-17 14:50:12 -0400141 bool use_dynamic_meta;
Krunoslav Kovac4ea20902018-05-08 16:03:58 -0400142
Harry Wentland7c0c9672017-11-08 14:34:14 -0500143 struct dc_transfer_func *out_transfer_func;
144 struct colorspace_transform gamut_remap_matrix;
Anthony Koo586f27a2018-03-26 16:19:18 -0400145 struct dc_csc_transform csc_color_matrix;
Harry Wentland7c0c9672017-11-08 14:34:14 -0500146
147 enum dc_color_space output_color_space;
148 enum dc_dither_option dither_option;
149
150 enum view_3d_format view_format;
151
152 bool ignore_msa_timing_param;
Jun Leiceb3dbb2018-11-09 09:21:21 -0500153 bool converter_disable_audio;
154 uint8_t qs_bit;
155 uint8_t qy_bit;
SivapiriyanKumarasamy6e5b3582018-03-14 09:15:24 -0400156
Harry Wentland7c0c9672017-11-08 14:34:14 -0500157 /* TODO: custom INFO packets */
158 /* TODO: ABM info (DMCU) */
Xingyue Tao85075fa2018-02-16 16:29:13 -0500159 /* PSR info */
160 unsigned char psr_version;
Harry Wentland7c0c9672017-11-08 14:34:14 -0500161 /* TODO: CEA VIC */
162
SivapiriyanKumarasamyaa5a5772018-02-13 17:37:23 -0500163 /* DMCU info */
SivapiriyanKumarasamy9aef1a32018-02-23 13:04:13 -0500164 unsigned int abm_level;
SivapiriyanKumarasamyaa5a5772018-02-13 17:37:23 -0500165
Yongqiang Sund6001ae2019-01-25 14:40:14 -0500166 struct periodic_interrupt_config periodic_interrupt0;
167 struct periodic_interrupt_config periodic_interrupt1;
Fatemeh Darbehani8fde60b2019-01-11 11:00:26 -0500168
Harry Wentland7c0c9672017-11-08 14:34:14 -0500169 /* from core_stream struct */
170 struct dc_context *ctx;
171
172 /* used by DCP and FMT */
173 struct bit_depth_reduction_params bit_depth_params;
174 struct clamping_and_pixel_encoding_params clamping;
175
176 int phy_pix_clk;
177 enum signal_type signal;
178 bool dpms_off;
179
Jun Leiceb3dbb2018-11-09 09:21:21 -0500180 void *dm_stream_context;
181
Harry Wentland7c0c9672017-11-08 14:34:14 -0500182 struct dc_cursor_attributes cursor_attributes;
Yongqiang Sunea783c32017-11-21 16:12:23 -0500183 struct dc_cursor_position cursor_position;
Krunoslav Kovac6d92b5c2018-06-27 18:23:37 -0400184 uint32_t sdr_white_level; // for boosting (SDR) cursor in HDR mode
Harry Wentland7c0c9672017-11-08 14:34:14 -0500185
186 /* from stream struct */
187 struct kref refcount;
188
189 struct crtc_trigger_info triggered_crtc_reset;
190
Harry Wentland6fbefb82019-02-22 16:52:34 -0500191#if defined(CONFIG_DRM_AMD_DC_DCN2_0)
192 /* writeback */
193 unsigned int num_wb_info;
194 struct dc_writeback_info writeback_info[MAX_DWB_PIPES];
195#endif
Leo (Sunpeng) Li27b3f4f2017-11-10 16:12:08 -0500196 /* Computed state bits */
197 bool mode_changed : 1;
198
Jun Lei04a789b2018-11-23 15:21:02 -0500199 /* Output from DC when stream state is committed or altered
200 * DC may only access these values during:
201 * dc_commit_state, dc_commit_state_no_check, dc_commit_streams
202 * values may not change outside of those calls
203 */
204 struct {
205 // For interrupt management, some hardware instance
206 // offsets need to be exposed to DM
207 uint8_t otg_offset;
208 } out;
209
Anthony Kood2d78852019-01-20 01:41:44 -0500210 bool apply_edp_fast_boot_optimization;
211 bool apply_seamless_boot_optimization;
212
Jun Lei04a789b2018-11-23 15:21:02 -0500213 uint32_t stream_id;
Harry Wentland97bda032019-02-25 13:26:34 -0500214#ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT
215 bool is_dsc_enabled;
216#endif
Harry Wentland7c0c9672017-11-08 14:34:14 -0500217};
218
219struct dc_stream_update {
220 struct rect src;
221 struct rect dst;
222 struct dc_transfer_func *out_transfer_func;
Anthony Koo0eeef692018-04-09 14:55:17 -0500223 struct dc_info_packet *hdr_static_metadata;
SivapiriyanKumarasamy9aef1a32018-02-23 13:04:13 -0500224 unsigned int *abm_level;
Anthony Kooa2e8f542018-04-09 14:57:47 -0500225
Yongqiang Sund6001ae2019-01-25 14:40:14 -0500226 struct periodic_interrupt_config *periodic_interrupt0;
227 struct periodic_interrupt_config *periodic_interrupt1;
Fatemeh Darbehani8fde60b2019-01-11 11:00:26 -0500228
Anthony Koo98e64362018-08-21 14:40:28 -0500229 struct dc_info_packet *vrr_infopacket;
Alvin lee0e4af5f2018-06-08 13:58:36 -0400230 struct dc_info_packet *vsc_infopacket;
Harmanprit Tatlaecd01362018-11-05 17:55:53 -0500231 struct dc_info_packet *vsp_infopacket;
Samson Tam1e7e86c2018-05-01 10:39:26 -0400232
233 bool *dpms_off;
SivapiriyanKumarasamy8ab56172018-07-26 14:58:35 -0400234
235 struct colorspace_transform *gamut_remap;
236 enum dc_color_space *output_color_space;
SivapiriyanKumarasamy8ccb5962018-11-07 14:59:41 -0500237 enum dc_dither_option *dither_option;
SivapiriyanKumarasamy8ab56172018-07-26 14:58:35 -0400238
SivapiriyanKumarasamyeb385202018-07-26 14:58:35 -0400239 struct dc_csc_transform *output_csc_transform;
SivapiriyanKumarasamy8ab56172018-07-26 14:58:35 -0400240
Harry Wentland6fbefb82019-02-22 16:52:34 -0500241#if defined(CONFIG_DRM_AMD_DC_DCN2_0)
242 struct dc_writeback_update *wb_update;
243#endif
Harry Wentland97bda032019-02-25 13:26:34 -0500244#if defined(CONFIG_DRM_AMD_DC_DSC_SUPPORT)
245 struct dc_dsc_config *dsc_config;
246#endif
Harry Wentland7c0c9672017-11-08 14:34:14 -0500247};
248
249bool dc_is_stream_unchanged(
250 struct dc_stream_state *old_stream, struct dc_stream_state *stream);
251bool dc_is_stream_scaling_unchanged(
252 struct dc_stream_state *old_stream, struct dc_stream_state *stream);
253
254/*
255 * Set up surface attributes and associate to a stream
256 * The surfaces parameter is an absolute set of all surface active for the stream.
257 * If no surfaces are provided, the stream will be blanked; no memory read.
258 * Any flip related attribute changes must be done through this interface.
259 *
260 * After this call:
261 * Surfaces attributes are programmed and configured to be composed into stream.
262 * This does not trigger a flip. No surface address is programmed.
263 */
264
Harry Wentland7c0c9672017-11-08 14:34:14 -0500265void dc_commit_updates_for_stream(struct dc *dc,
266 struct dc_surface_update *srf_updates,
267 int surface_count,
268 struct dc_stream_state *stream,
269 struct dc_stream_update *stream_update,
Harry Wentland7c0c9672017-11-08 14:34:14 -0500270 struct dc_state *state);
271/*
272 * Log the current stream state.
273 */
Nicholas Kazlauskase1cb3e482018-06-19 09:58:24 -0400274void dc_stream_log(const struct dc *dc, const struct dc_stream_state *stream);
Harry Wentland7c0c9672017-11-08 14:34:14 -0500275
276uint8_t dc_get_current_stream_count(struct dc *dc);
277struct dc_stream_state *dc_get_stream_at_index(struct dc *dc, uint8_t i);
278
279/*
280 * Return the current frame counter.
281 */
282uint32_t dc_stream_get_vblank_counter(const struct dc_stream_state *stream);
283
Leo (Hanghong) Mad5f90f32019-03-07 15:31:11 -0500284/*
285 * Send dp sdp message.
286 */
287bool dc_stream_send_dp_sdp(const struct dc_stream_state *stream,
288 const uint8_t *custom_sdp_message,
289 unsigned int sdp_message_size);
290
Harry Wentland7c0c9672017-11-08 14:34:14 -0500291/* TODO: Return parsed values rather than direct register read
Samuel Liaa8e2862018-01-19 15:53:16 -0500292 * This has a dependency on the caller (amdgpu_display_get_crtc_scanoutpos)
Harry Wentland7c0c9672017-11-08 14:34:14 -0500293 * being refactored properly to be dce-specific
294 */
295bool dc_stream_get_scanoutpos(const struct dc_stream_state *stream,
296 uint32_t *v_blank_start,
297 uint32_t *v_blank_end,
298 uint32_t *h_position,
299 uint32_t *v_position);
300
301enum dc_status dc_add_stream_to_ctx(
302 struct dc *dc,
303 struct dc_state *new_ctx,
304 struct dc_stream_state *stream);
305
306enum dc_status dc_remove_stream_from_ctx(
307 struct dc *dc,
308 struct dc_state *new_ctx,
309 struct dc_stream_state *stream);
310
311
312bool dc_add_plane_to_context(
313 const struct dc *dc,
314 struct dc_stream_state *stream,
315 struct dc_plane_state *plane_state,
316 struct dc_state *context);
317
318bool dc_remove_plane_from_context(
319 const struct dc *dc,
320 struct dc_stream_state *stream,
321 struct dc_plane_state *plane_state,
322 struct dc_state *context);
323
324bool dc_rem_all_planes_for_stream(
325 const struct dc *dc,
326 struct dc_stream_state *stream,
327 struct dc_state *context);
328
329bool dc_add_all_planes_for_stream(
330 const struct dc *dc,
331 struct dc_stream_state *stream,
332 struct dc_plane_state * const *plane_states,
333 int plane_count,
334 struct dc_state *context);
335
Harry Wentland6fbefb82019-02-22 16:52:34 -0500336#if defined(CONFIG_DRM_AMD_DC_DCN2_0)
337bool dc_stream_add_writeback(struct dc *dc,
338 struct dc_stream_state *stream,
339 struct dc_writeback_info *wb_info);
340bool dc_stream_remove_writeback(struct dc *dc,
341 struct dc_stream_state *stream,
342 uint32_t dwb_pipe_inst);
343bool dc_stream_dmdata_status_done(struct dc *dc, struct dc_stream_state *stream);
344bool dc_stream_set_dynamic_metadata(struct dc *dc,
345 struct dc_stream_state *stream,
346 struct dc_dmdata_attributes *dmdata_attr);
347#endif
348
Harry Wentland7c0c9672017-11-08 14:34:14 -0500349enum dc_status dc_validate_stream(struct dc *dc, struct dc_stream_state *stream);
350
351/*
Harry Wentland7c0c9672017-11-08 14:34:14 -0500352 * Set up streams and links associated to drive sinks
353 * The streams parameter is an absolute set of all active streams.
354 *
355 * After this call:
356 * Phy, Encoder, Timing Generator are programmed and enabled.
357 * New streams are enabled with blank stream; no memory read.
358 */
359/*
360 * Enable stereo when commit_streams is not required,
361 * for example, frame alternate.
362 */
363bool dc_enable_stereo(
364 struct dc *dc,
365 struct dc_state *context,
366 struct dc_stream_state *streams[],
367 uint8_t stream_count);
368
369
370enum surface_update_type dc_check_update_surfaces_for_stream(
371 struct dc *dc,
372 struct dc_surface_update *updates,
373 int surface_count,
374 struct dc_stream_update *stream_update,
375 const struct dc_stream_status *stream_status);
376
377/**
378 * Create a new default stream for the requested sink
379 */
380struct dc_stream_state *dc_create_stream_for_sink(struct dc_sink *dc_sink);
381
Wenjing Liu43e3ac82019-03-29 18:22:16 -0400382struct dc_stream_state *dc_copy_stream(const struct dc_stream_state *stream);
383
Jun Leiceb3dbb2018-11-09 09:21:21 -0500384void update_stream_signal(struct dc_stream_state *stream, struct dc_sink *sink);
Harry Wentland9182b4c2017-12-18 12:01:30 -0500385
Harry Wentland7c0c9672017-11-08 14:34:14 -0500386void dc_stream_retain(struct dc_stream_state *dc_stream);
387void dc_stream_release(struct dc_stream_state *dc_stream);
388
Leo Li09f609c2018-11-27 15:05:12 -0500389struct dc_stream_status *dc_stream_get_status_from_state(
390 struct dc_state *state,
391 struct dc_stream_state *stream);
Harry Wentland7c0c9672017-11-08 14:34:14 -0500392struct dc_stream_status *dc_stream_get_status(
393 struct dc_stream_state *dc_stream);
394
395/*******************************************************************************
396 * Cursor interfaces - To manages the cursor within a stream
397 ******************************************************************************/
398/* TODO: Deprecated once we switch to dc_set_cursor_position */
399bool dc_stream_set_cursor_attributes(
400 struct dc_stream_state *stream,
401 const struct dc_cursor_attributes *attributes);
402
403bool dc_stream_set_cursor_position(
404 struct dc_stream_state *stream,
405 const struct dc_cursor_position *position);
406
Krunoslav Kovac6d92b5c2018-06-27 18:23:37 -0400407
Harry Wentland7c0c9672017-11-08 14:34:14 -0500408bool dc_stream_adjust_vmin_vmax(struct dc *dc,
Anthony Koo98e64362018-08-21 14:40:28 -0500409 struct dc_stream_state *stream,
410 struct dc_crtc_timing_adjust *adjust);
Harry Wentland7c0c9672017-11-08 14:34:14 -0500411
412bool dc_stream_get_crtc_position(struct dc *dc,
413 struct dc_stream_state **stream,
414 int num_streams,
415 unsigned int *v_pos,
416 unsigned int *nom_v_pos);
417
Leo (Sunpeng) Li31aec352017-12-18 14:20:39 -0500418bool dc_stream_configure_crc(struct dc *dc,
419 struct dc_stream_state *stream,
420 bool enable,
421 bool continuous);
422
423bool dc_stream_get_crc(struct dc *dc,
424 struct dc_stream_state *stream,
425 uint32_t *r_cr,
426 uint32_t *g_y,
427 uint32_t *b_cb);
428
Harry Wentland7c0c9672017-11-08 14:34:14 -0500429void dc_stream_set_static_screen_events(struct dc *dc,
430 struct dc_stream_state **stream,
431 int num_streams,
432 const struct dc_static_screen_events *events);
433
Leo (Sunpeng) Li44af70a2018-02-06 09:50:49 -0500434void dc_stream_set_dither_option(struct dc_stream_state *stream,
435 enum dc_dither_option option);
436
SivapiriyanKumarasamy8ab56172018-07-26 14:58:35 -0400437bool dc_stream_set_gamut_remap(struct dc *dc,
438 const struct dc_stream_state *stream);
439
SivapiriyanKumarasamyeb385202018-07-26 14:58:35 -0400440bool dc_stream_program_csc_matrix(struct dc *dc,
441 struct dc_stream_state *stream);
442
Harry Wentland2a06e0a2017-11-01 11:43:36 -0400443bool dc_stream_get_crtc_position(struct dc *dc,
444 struct dc_stream_state **stream,
445 int num_streams,
446 unsigned int *v_pos,
447 unsigned int *nom_v_pos);
448
Harry Wentland7c0c9672017-11-08 14:34:14 -0500449#endif /* DC_STREAM_H_ */