Line data Source code
1 : /*
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_LINK_H_
27 : #define DC_LINK_H_
28 :
29 : #include "dc.h"
30 : #include "dc_types.h"
31 : #include "grph_object_defs.h"
32 :
33 : struct link_resource;
34 :
35 : enum dc_link_fec_state {
36 : dc_link_fec_not_ready,
37 : dc_link_fec_ready,
38 : dc_link_fec_enabled
39 : };
40 :
41 : struct dc_link_status {
42 : bool link_active;
43 : struct dpcd_caps *dpcd_caps;
44 : };
45 :
46 : struct dprx_states {
47 : bool cable_id_written;
48 : };
49 :
50 : /* DP MST stream allocation (payload bandwidth number) */
51 : struct link_mst_stream_allocation {
52 : /* DIG front */
53 : const struct stream_encoder *stream_enc;
54 : /* HPO DP Stream Encoder */
55 : const struct hpo_dp_stream_encoder *hpo_dp_stream_enc;
56 : /* associate DRM payload table with DC stream encoder */
57 : uint8_t vcp_id;
58 : /* number of slots required for the DP stream in transport packet */
59 : uint8_t slot_count;
60 : };
61 :
62 : /* DP MST stream allocation table */
63 : struct link_mst_stream_allocation_table {
64 : /* number of DP video streams */
65 : int stream_count;
66 : /* array of stream allocations */
67 : struct link_mst_stream_allocation stream_allocations[MAX_CONTROLLER_NUM];
68 : };
69 :
70 : struct edp_trace_power_timestamps {
71 : uint64_t poweroff;
72 : uint64_t poweron;
73 : };
74 :
75 : struct dp_trace_lt_counts {
76 : unsigned int total;
77 : unsigned int fail;
78 : };
79 :
80 : struct dp_trace_lt {
81 : struct dp_trace_lt_counts counts;
82 : struct dp_trace_timestamps {
83 : unsigned long long start;
84 : unsigned long long end;
85 : } timestamps;
86 : enum link_training_result result;
87 : bool is_logged;
88 : };
89 :
90 : struct dp_trace {
91 : struct dp_trace_lt detect_lt_trace;
92 : struct dp_trace_lt commit_lt_trace;
93 : unsigned int link_loss_count;
94 : bool is_initialized;
95 : struct edp_trace_power_timestamps edp_trace_power_timestamps;
96 : };
97 :
98 : /* PSR feature flags */
99 : struct psr_settings {
100 : bool psr_feature_enabled; // PSR is supported by sink
101 : bool psr_allow_active; // PSR is currently active
102 : enum dc_psr_version psr_version; // Internal PSR version, determined based on DPCD
103 : bool psr_vtotal_control_support; // Vtotal control is supported by sink
104 :
105 : /* These parameters are calculated in Driver,
106 : * based on display timing and Sink capabilities.
107 : * If VBLANK region is too small and Sink takes a long time
108 : * to set up RFB, it may take an extra frame to enter PSR state.
109 : */
110 : bool psr_frame_capture_indication_req;
111 : unsigned int psr_sdp_transmit_line_num_deadline;
112 : uint8_t force_ffu_mode;
113 : unsigned int psr_power_opt;
114 : };
115 :
116 : /* To split out "global" and "per-panel" config settings.
117 : * Add a struct dc_panel_config under dc_link
118 : */
119 : struct dc_panel_config {
120 : // edp DSC
121 : struct dsc {
122 : bool disable_dsc_edp;
123 : unsigned int force_dsc_edp_policy;
124 : } dsc;
125 : };
126 : /*
127 : * A link contains one or more sinks and their connected status.
128 : * The currently active signal type (HDMI, DP-SST, DP-MST) is also reported.
129 : */
130 : struct dc_link {
131 : struct dc_sink *remote_sinks[MAX_SINKS_PER_LINK];
132 : unsigned int sink_count;
133 : struct dc_sink *local_sink;
134 : unsigned int link_index;
135 : enum dc_connection_type type;
136 : enum signal_type connector_signal;
137 : enum dc_irq_source irq_source_hpd;
138 : enum dc_irq_source irq_source_hpd_rx;/* aka DP Short Pulse */
139 : bool is_hpd_filter_disabled;
140 : bool dp_ss_off;
141 : bool link_state_valid;
142 : bool aux_access_disabled;
143 : bool sync_lt_in_progress;
144 : enum lttpr_mode lttpr_mode;
145 : bool is_internal_display;
146 :
147 : /* TODO: Rename. Flag an endpoint as having a programmable mapping to a
148 : * DIG encoder. */
149 : bool is_dig_mapping_flexible;
150 : bool hpd_status; /* HPD status of link without physical HPD pin. */
151 : bool is_hpd_pending; /* Indicates a new received hpd */
152 :
153 : bool edp_sink_present;
154 :
155 : struct dp_trace dp_trace;
156 :
157 : /* caps is the same as reported_link_cap. link_traing use
158 : * reported_link_cap. Will clean up. TODO
159 : */
160 : struct dc_link_settings reported_link_cap;
161 : struct dc_link_settings verified_link_cap;
162 : struct dc_link_settings cur_link_settings;
163 : struct dc_lane_settings cur_lane_setting[LANE_COUNT_DP_MAX];
164 : struct dc_link_settings preferred_link_setting;
165 : /* preferred_training_settings are override values that
166 : * come from DM. DM is responsible for the memory
167 : * management of the override pointers.
168 : */
169 : struct dc_link_training_overrides preferred_training_settings;
170 : struct dp_audio_test_data audio_test_data;
171 :
172 : uint8_t ddc_hw_inst;
173 :
174 : uint8_t hpd_src;
175 :
176 : uint8_t link_enc_hw_inst;
177 : /* DIG link encoder ID. Used as index in link encoder resource pool.
178 : * For links with fixed mapping to DIG, this is not changed after dc_link
179 : * object creation.
180 : */
181 : enum engine_id eng_id;
182 :
183 : bool test_pattern_enabled;
184 : union compliance_test_state compliance_test_state;
185 :
186 : void *priv;
187 :
188 : struct ddc_service *ddc;
189 :
190 : bool aux_mode;
191 :
192 : /* Private to DC core */
193 :
194 : const struct dc *dc;
195 :
196 : struct dc_context *ctx;
197 :
198 : struct panel_cntl *panel_cntl;
199 : struct link_encoder *link_enc;
200 : struct graphics_object_id link_id;
201 : /* Endpoint type distinguishes display endpoints which do not have entries
202 : * in the BIOS connector table from those that do. Helps when tracking link
203 : * encoder to display endpoint assignments.
204 : */
205 : enum display_endpoint_type ep_type;
206 : union ddi_channel_mapping ddi_channel_mapping;
207 : struct connector_device_tag_info device_tag;
208 : struct dpcd_caps dpcd_caps;
209 : uint32_t dongle_max_pix_clk;
210 : unsigned short chip_caps;
211 : unsigned int dpcd_sink_count;
212 : #if defined(CONFIG_DRM_AMD_DC_HDCP)
213 : struct hdcp_caps hdcp_caps;
214 : #endif
215 : enum edp_revision edp_revision;
216 : union dpcd_sink_ext_caps dpcd_sink_ext_caps;
217 :
218 : struct psr_settings psr_settings;
219 :
220 : /* Drive settings read from integrated info table */
221 : struct dc_lane_settings bios_forced_drive_settings;
222 :
223 : /* Vendor specific LTTPR workaround variables */
224 : uint8_t vendor_specific_lttpr_link_rate_wa;
225 : bool apply_vendor_specific_lttpr_link_rate_wa;
226 :
227 : /* MST record stream using this link */
228 : struct link_flags {
229 : bool dp_keep_receiver_powered;
230 : bool dp_skip_DID2;
231 : bool dp_skip_reset_segment;
232 : bool dp_mot_reset_segment;
233 : /* Some USB4 docks do not handle turning off MST DSC once it has been enabled. */
234 : bool dpia_mst_dsc_always_on;
235 : /* Forced DPIA into TBT3 compatibility mode. */
236 : bool dpia_forced_tbt3_mode;
237 : bool dongle_mode_timing_override;
238 : } wa_flags;
239 : struct link_mst_stream_allocation_table mst_stream_alloc_table;
240 :
241 : struct dc_link_status link_status;
242 : struct dprx_states dprx_states;
243 :
244 : struct gpio *hpd_gpio;
245 : enum dc_link_fec_state fec_state;
246 : struct dc_panel_config panel_config;
247 : enum phy_state phy_state;
248 : };
249 :
250 : const struct dc_link_status *dc_link_get_status(const struct dc_link *dc_link);
251 :
252 : /**
253 : * dc_get_link_at_index() - Return an enumerated dc_link.
254 : *
255 : * dc_link order is constant and determined at
256 : * boot time. They cannot be created or destroyed.
257 : * Use dc_get_caps() to get number of links.
258 : */
259 : static inline struct dc_link *dc_get_link_at_index(struct dc *dc, uint32_t link_index)
260 : {
261 0 : return dc->links[link_index];
262 : }
263 :
264 : static inline void get_edp_links(const struct dc *dc,
265 : struct dc_link **edp_links,
266 : int *edp_num)
267 : {
268 : int i;
269 :
270 0 : *edp_num = 0;
271 0 : for (i = 0; i < dc->link_count; i++) {
272 : // report any eDP links, even unconnected DDI's
273 0 : if (!dc->links[i])
274 0 : continue;
275 0 : if (dc->links[i]->connector_signal == SIGNAL_TYPE_EDP) {
276 0 : edp_links[*edp_num] = dc->links[i];
277 0 : if (++(*edp_num) == MAX_NUM_EDP)
278 : return;
279 : }
280 : }
281 : }
282 :
283 0 : static inline bool dc_get_edp_link_panel_inst(const struct dc *dc,
284 : const struct dc_link *link,
285 : unsigned int *inst_out)
286 : {
287 : struct dc_link *edp_links[MAX_NUM_EDP];
288 : int edp_num;
289 :
290 0 : if (link->connector_signal != SIGNAL_TYPE_EDP)
291 : return false;
292 0 : get_edp_links(dc, edp_links, &edp_num);
293 0 : if ((edp_num > 1) && (link->link_index > edp_links[0]->link_index))
294 0 : *inst_out = 1;
295 : else
296 0 : *inst_out = 0;
297 : return true;
298 : }
299 :
300 : /* Set backlight level of an embedded panel (eDP, LVDS).
301 : * backlight_pwm_u16_16 is unsigned 32 bit with 16 bit integer
302 : * and 16 bit fractional, where 1.0 is max backlight value.
303 : */
304 : bool dc_link_set_backlight_level(const struct dc_link *dc_link,
305 : uint32_t backlight_pwm_u16_16,
306 : uint32_t frame_ramp);
307 :
308 : /* Set/get nits-based backlight level of an embedded panel (eDP, LVDS). */
309 : bool dc_link_set_backlight_level_nits(struct dc_link *link,
310 : bool isHDR,
311 : uint32_t backlight_millinits,
312 : uint32_t transition_time_in_ms);
313 :
314 : bool dc_link_get_backlight_level_nits(struct dc_link *link,
315 : uint32_t *backlight_millinits,
316 : uint32_t *backlight_millinits_peak);
317 :
318 : bool dc_link_backlight_enable_aux(struct dc_link *link, bool enable);
319 :
320 : bool dc_link_read_default_bl_aux(struct dc_link *link, uint32_t *backlight_millinits);
321 : bool dc_link_set_default_brightness_aux(struct dc_link *link);
322 :
323 : int dc_link_get_backlight_level(const struct dc_link *dc_link);
324 :
325 : int dc_link_get_target_backlight_pwm(const struct dc_link *link);
326 :
327 : bool dc_link_set_psr_allow_active(struct dc_link *dc_link, const bool *enable,
328 : bool wait, bool force_static, const unsigned int *power_opts);
329 :
330 : bool dc_link_get_psr_state(const struct dc_link *dc_link, enum dc_psr_state *state);
331 :
332 : bool dc_link_setup_psr(struct dc_link *dc_link,
333 : const struct dc_stream_state *stream, struct psr_config *psr_config,
334 : struct psr_context *psr_context);
335 :
336 : bool dc_power_alpm_dpcd_enable(struct dc_link *link, bool enable);
337 :
338 : void dc_link_get_psr_residency(const struct dc_link *link, uint32_t *residency);
339 :
340 : void dc_link_blank_all_dp_displays(struct dc *dc);
341 : void dc_link_blank_all_edp_displays(struct dc *dc);
342 :
343 : void dc_link_blank_dp_stream(struct dc_link *link, bool hw_init);
344 : bool dc_link_set_sink_vtotal_in_psr_active(const struct dc_link *link,
345 : uint16_t psr_vtotal_idle, uint16_t psr_vtotal_su);
346 :
347 : /* Request DC to detect if there is a Panel connected.
348 : * boot - If this call is during initial boot.
349 : * Return false for any type of detection failure or MST detection
350 : * true otherwise. True meaning further action is required (status update
351 : * and OS notification).
352 : */
353 : enum dc_detect_reason {
354 : DETECT_REASON_BOOT,
355 : DETECT_REASON_RESUMEFROMS3S4,
356 : DETECT_REASON_HPD,
357 : DETECT_REASON_HPDRX,
358 : DETECT_REASON_FALLBACK,
359 : DETECT_REASON_RETRAIN,
360 : DETECT_REASON_TDR,
361 : };
362 :
363 : bool dc_link_detect(struct dc_link *dc_link, enum dc_detect_reason reason);
364 : bool dc_link_get_hpd_state(struct dc_link *dc_link);
365 : enum dc_status dc_link_allocate_mst_payload(struct pipe_ctx *pipe_ctx);
366 : enum dc_status dc_link_reduce_mst_payload(struct pipe_ctx *pipe_ctx, uint32_t req_pbn);
367 : enum dc_status dc_link_increase_mst_payload(struct pipe_ctx *pipe_ctx, uint32_t req_pbn);
368 :
369 : /* Notify DC about DP RX Interrupt (aka Short Pulse Interrupt).
370 : * Return:
371 : * true - Downstream port status changed. DM should call DC to do the
372 : * detection.
373 : * false - no change in Downstream port status. No further action required
374 : * from DM. */
375 : bool dc_link_handle_hpd_rx_irq(struct dc_link *dc_link,
376 : union hpd_irq_data *hpd_irq_dpcd_data, bool *out_link_loss,
377 : bool defer_handling, bool *has_left_work);
378 :
379 : /*
380 : * On eDP links this function call will stall until T12 has elapsed.
381 : * If the panel is not in power off state, this function will return
382 : * immediately.
383 : */
384 : bool dc_link_wait_for_t12(struct dc_link *link);
385 :
386 : void dc_link_dp_handle_automated_test(struct dc_link *link);
387 : void dc_link_dp_handle_link_loss(struct dc_link *link);
388 : bool dc_link_dp_allow_hpd_rx_irq(const struct dc_link *link);
389 :
390 : struct dc_sink_init_data;
391 :
392 : struct dc_sink *dc_link_add_remote_sink(
393 : struct dc_link *dc_link,
394 : const uint8_t *edid,
395 : int len,
396 : struct dc_sink_init_data *init_data);
397 :
398 : void dc_link_remove_remote_sink(
399 : struct dc_link *link,
400 : struct dc_sink *sink);
401 :
402 : /* Used by diagnostics for virtual link at the moment */
403 :
404 : void dc_link_dp_set_drive_settings(
405 : struct dc_link *link,
406 : const struct link_resource *link_res,
407 : struct link_training_settings *lt_settings);
408 :
409 : bool dc_link_dp_perform_link_training_skip_aux(
410 : struct dc_link *link,
411 : const struct link_resource *link_res,
412 : const struct dc_link_settings *link_setting);
413 :
414 : enum link_training_result dc_link_dp_perform_link_training(
415 : struct dc_link *link,
416 : const struct link_resource *link_res,
417 : const struct dc_link_settings *link_settings,
418 : bool skip_video_pattern);
419 :
420 : bool dc_link_dp_sync_lt_begin(struct dc_link *link);
421 :
422 : enum link_training_result dc_link_dp_sync_lt_attempt(
423 : struct dc_link *link,
424 : const struct link_resource *link_res,
425 : struct dc_link_settings *link_setting,
426 : struct dc_link_training_overrides *lt_settings);
427 :
428 : bool dc_link_dp_sync_lt_end(struct dc_link *link, bool link_down);
429 :
430 : void dc_link_dp_enable_hpd(const struct dc_link *link);
431 :
432 : void dc_link_dp_disable_hpd(const struct dc_link *link);
433 :
434 : bool dc_link_dp_set_test_pattern(
435 : struct dc_link *link,
436 : enum dp_test_pattern test_pattern,
437 : enum dp_test_pattern_color_space test_pattern_color_space,
438 : const struct link_training_settings *p_link_settings,
439 : const unsigned char *p_custom_pattern,
440 : unsigned int cust_pattern_size);
441 :
442 : bool dc_link_dp_get_max_link_enc_cap(const struct dc_link *link, struct dc_link_settings *max_link_enc_cap);
443 :
444 : void dc_link_enable_hpd_filter(struct dc_link *link, bool enable);
445 :
446 : bool dc_link_is_dp_sink_present(struct dc_link *link);
447 :
448 : bool dc_link_detect_sink(struct dc_link *link, enum dc_connection_type *type);
449 : /*
450 : * DPCD access interfaces
451 : */
452 :
453 : #ifdef CONFIG_DRM_AMD_DC_HDCP
454 : bool dc_link_is_hdcp14(struct dc_link *link, enum signal_type signal);
455 : bool dc_link_is_hdcp22(struct dc_link *link, enum signal_type signal);
456 : #endif
457 : void dc_link_set_drive_settings(struct dc *dc,
458 : struct link_training_settings *lt_settings,
459 : const struct dc_link *link);
460 : void dc_link_set_preferred_link_settings(struct dc *dc,
461 : struct dc_link_settings *link_setting,
462 : struct dc_link *link);
463 : void dc_link_set_preferred_training_settings(struct dc *dc,
464 : struct dc_link_settings *link_setting,
465 : struct dc_link_training_overrides *lt_overrides,
466 : struct dc_link *link,
467 : bool skip_immediate_retrain);
468 : void dc_link_enable_hpd(const struct dc_link *link);
469 : void dc_link_disable_hpd(const struct dc_link *link);
470 : void dc_link_set_test_pattern(struct dc_link *link,
471 : enum dp_test_pattern test_pattern,
472 : enum dp_test_pattern_color_space test_pattern_color_space,
473 : const struct link_training_settings *p_link_settings,
474 : const unsigned char *p_custom_pattern,
475 : unsigned int cust_pattern_size);
476 : uint32_t dc_link_bandwidth_kbps(
477 : const struct dc_link *link,
478 : const struct dc_link_settings *link_setting);
479 :
480 : const struct dc_link_settings *dc_link_get_link_cap(
481 : const struct dc_link *link);
482 :
483 : void dc_link_overwrite_extended_receiver_cap(
484 : struct dc_link *link);
485 :
486 : bool dc_is_oem_i2c_device_present(
487 : struct dc *dc,
488 : size_t slave_address
489 : );
490 :
491 : bool dc_submit_i2c(
492 : struct dc *dc,
493 : uint32_t link_index,
494 : struct i2c_command *cmd);
495 :
496 : bool dc_submit_i2c_oem(
497 : struct dc *dc,
498 : struct i2c_command *cmd);
499 :
500 : uint32_t dc_bandwidth_in_kbps_from_timing(
501 : const struct dc_crtc_timing *timing);
502 :
503 : bool dc_link_is_fec_supported(const struct dc_link *link);
504 : bool dc_link_should_enable_fec(const struct dc_link *link);
505 :
506 : uint32_t dc_link_bw_kbps_from_raw_frl_link_rate_data(uint8_t bw);
507 : enum dp_link_encoding dc_link_dp_mst_decide_link_encoding_format(const struct dc_link *link);
508 :
509 : void dc_link_get_cur_link_res(const struct dc_link *link,
510 : struct link_resource *link_res);
511 : /* take a snapshot of current link resource allocation state */
512 : void dc_get_cur_link_res_map(const struct dc *dc, uint32_t *map);
513 : /* restore link resource allocation state from a snapshot */
514 : void dc_restore_link_res_map(const struct dc *dc, uint32_t *map);
515 : void dc_link_clear_dprx_states(struct dc_link *link);
516 : struct gpio *get_hpd_gpio(struct dc_bios *dcb,
517 : struct graphics_object_id link_id,
518 : struct gpio_service *gpio_service);
519 : void dp_trace_reset(struct dc_link *link);
520 : bool dc_dp_trace_is_initialized(struct dc_link *link);
521 : unsigned long long dc_dp_trace_get_lt_end_timestamp(struct dc_link *link,
522 : bool in_detection);
523 : void dc_dp_trace_set_is_logged_flag(struct dc_link *link,
524 : bool in_detection,
525 : bool is_logged);
526 : bool dc_dp_trace_is_logged(struct dc_link *link,
527 : bool in_detection);
528 : struct dp_trace_lt_counts *dc_dp_trace_get_lt_counts(struct dc_link *link,
529 : bool in_detection);
530 : unsigned int dc_dp_trace_get_link_loss_count(struct dc_link *link);
531 :
532 : /* Destruct the mst topology of the link and reset the allocated payload table */
533 : bool reset_cur_dp_mst_topology(struct dc_link *link);
534 : #endif /* DC_LINK_H_ */
|