forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-01-04 1543e317f1da31b75942316931e8f491a8920811
kernel/drivers/gpu/drm/amd/display/dc/dc_link.h
....@@ -26,10 +26,17 @@
2626 #ifndef DC_LINK_H_
2727 #define DC_LINK_H_
2828
29
+#include "dc.h"
2930 #include "dc_types.h"
3031 #include "grph_object_defs.h"
3132
33
+enum dc_link_fec_state {
34
+ dc_link_fec_not_ready,
35
+ dc_link_fec_ready,
36
+ dc_link_fec_enabled
37
+};
3238 struct dc_link_status {
39
+ bool link_active;
3340 struct dpcd_caps *dpcd_caps;
3441 };
3542
....@@ -59,6 +66,22 @@
5966 struct link_trace {
6067 struct time_stamp time_stamp;
6168 };
69
+
70
+/* PSR feature flags */
71
+struct psr_settings {
72
+ bool psr_feature_enabled; // PSR is supported by sink
73
+ bool psr_allow_active; // PSR is currently active
74
+ enum dc_psr_version psr_version; // Internal PSR version, determined based on DPCD
75
+
76
+ /* These parameters are calculated in Driver,
77
+ * based on display timing and Sink capabilities.
78
+ * If VBLANK region is too small and Sink takes a long time
79
+ * to set up RFB, it may take an extra frame to enter PSR state.
80
+ */
81
+ bool psr_frame_capture_indication_req;
82
+ unsigned int psr_sdp_transmit_line_num_deadline;
83
+};
84
+
6285 /*
6386 * A link contains one or more sinks and their connected status.
6487 * The currently active signal type (HDMI, DP-SST, DP-MST) is also reported.
....@@ -74,6 +97,10 @@
7497 enum dc_irq_source irq_source_hpd_rx;/* aka DP Short Pulse */
7598 bool is_hpd_filter_disabled;
7699 bool dp_ss_off;
100
+ bool link_state_valid;
101
+ bool aux_access_disabled;
102
+ bool sync_lt_in_progress;
103
+ bool lttpr_non_transparent_mode;
77104
78105 /* caps is the same as reported_link_cap. link_traing use
79106 * reported_link_cap. Will clean up. TODO
....@@ -83,6 +110,8 @@
83110 struct dc_link_settings cur_link_settings;
84111 struct dc_lane_settings cur_lane_setting;
85112 struct dc_link_settings preferred_link_setting;
113
+ struct dc_link_training_overrides preferred_training_settings;
114
+ struct dp_audio_test_data audio_test_data;
86115
87116 uint8_t ddc_hw_inst;
88117
....@@ -105,31 +134,44 @@
105134
106135 struct dc_context *ctx;
107136
137
+ struct panel_cntl *panel_cntl;
108138 struct link_encoder *link_enc;
109139 struct graphics_object_id link_id;
110140 union ddi_channel_mapping ddi_channel_mapping;
111141 struct connector_device_tag_info device_tag;
112142 struct dpcd_caps dpcd_caps;
143
+ uint32_t dongle_max_pix_clk;
113144 unsigned short chip_caps;
114145 unsigned int dpcd_sink_count;
146
+#if defined(CONFIG_DRM_AMD_DC_HDCP)
147
+ struct hdcp_caps hdcp_caps;
148
+#endif
115149 enum edp_revision edp_revision;
116
- bool psr_enabled;
150
+ union dpcd_sink_ext_caps dpcd_sink_ext_caps;
151
+
152
+ struct psr_settings psr_settings;
117153
118154 /* MST record stream using this link */
119155 struct link_flags {
120156 bool dp_keep_receiver_powered;
157
+ bool dp_skip_DID2;
158
+ bool dp_skip_reset_segment;
121159 } wa_flags;
122160 struct link_mst_stream_allocation_table mst_stream_alloc_table;
123161
124162 struct dc_link_status link_status;
125163
126164 struct link_trace link_trace;
165
+ struct gpio *hpd_gpio;
166
+ enum dc_link_fec_state fec_state;
127167 };
128168
129169 const struct dc_link_status *dc_link_get_status(const struct dc_link *dc_link);
130170
131
-/*
132
- * Return an enumerated dc_link. dc_link order is constant and determined at
171
+/**
172
+ * dc_get_link_at_index() - Return an enumerated dc_link.
173
+ *
174
+ * dc_link order is constant and determined at
133175 * boot time. They cannot be created or destroyed.
134176 * Use dc_get_caps() to get number of links.
135177 */
....@@ -138,15 +180,46 @@
138180 return dc->links[link_index];
139181 }
140182
141
-/* Set backlight level of an embedded panel (eDP, LVDS). */
142
-bool dc_link_set_backlight_level(const struct dc_link *dc_link, uint32_t level,
143
- uint32_t frame_ramp, const struct dc_stream_state *stream);
183
+static inline struct dc_link *get_edp_link(const struct dc *dc)
184
+{
185
+ int i;
186
+
187
+ // report any eDP links, even unconnected DDI's
188
+ for (i = 0; i < dc->link_count; i++) {
189
+ if (dc->links[i]->connector_signal == SIGNAL_TYPE_EDP)
190
+ return dc->links[i];
191
+ }
192
+ return NULL;
193
+}
194
+
195
+/* Set backlight level of an embedded panel (eDP, LVDS).
196
+ * backlight_pwm_u16_16 is unsigned 32 bit with 16 bit integer
197
+ * and 16 bit fractional, where 1.0 is max backlight value.
198
+ */
199
+bool dc_link_set_backlight_level(const struct dc_link *dc_link,
200
+ uint32_t backlight_pwm_u16_16,
201
+ uint32_t frame_ramp);
202
+
203
+/* Set/get nits-based backlight level of an embedded panel (eDP, LVDS). */
204
+bool dc_link_set_backlight_level_nits(struct dc_link *link,
205
+ bool isHDR,
206
+ uint32_t backlight_millinits,
207
+ uint32_t transition_time_in_ms);
208
+
209
+bool dc_link_get_backlight_level_nits(struct dc_link *link,
210
+ uint32_t *backlight_millinits,
211
+ uint32_t *backlight_millinits_peak);
212
+
213
+bool dc_link_backlight_enable_aux(struct dc_link *link, bool enable);
214
+
215
+bool dc_link_read_default_bl_aux(struct dc_link *link, uint32_t *backlight_millinits);
216
+bool dc_link_set_default_brightness_aux(struct dc_link *link);
144217
145218 int dc_link_get_backlight_level(const struct dc_link *dc_link);
146219
147
-bool dc_link_set_abm_disable(const struct dc_link *dc_link);
220
+int dc_link_get_target_backlight_pwm(const struct dc_link *link);
148221
149
-bool dc_link_set_psr_enable(const struct dc_link *dc_link, bool enable, bool wait);
222
+bool dc_link_set_psr_allow_active(struct dc_link *dc_link, bool enable, bool wait);
150223
151224 bool dc_link_get_psr_state(const struct dc_link *dc_link, uint32_t *psr_state);
152225
....@@ -164,9 +237,14 @@
164237 DETECT_REASON_BOOT,
165238 DETECT_REASON_HPD,
166239 DETECT_REASON_HPDRX,
240
+ DETECT_REASON_FALLBACK,
241
+ DETECT_REASON_RETRAIN
167242 };
168243
169244 bool dc_link_detect(struct dc_link *dc_link, enum dc_detect_reason reason);
245
+bool dc_link_get_hpd_state(struct dc_link *dc_link);
246
+enum dc_status dc_link_allocate_mst_payload(struct pipe_ctx *pipe_ctx);
247
+enum dc_status dc_link_reallocate_mst_payload(struct dc_link *link);
170248
171249 /* Notify DC about DP RX Interrupt (aka Short Pulse Interrupt).
172250 * Return:
....@@ -195,10 +273,23 @@
195273 struct dc_link *link,
196274 struct link_training_settings *lt_settings);
197275
276
+bool dc_link_dp_perform_link_training_skip_aux(
277
+ struct dc_link *link,
278
+ const struct dc_link_settings *link_setting);
279
+
198280 enum link_training_result dc_link_dp_perform_link_training(
199281 struct dc_link *link,
200282 const struct dc_link_settings *link_setting,
201283 bool skip_video_pattern);
284
+
285
+bool dc_link_dp_sync_lt_begin(struct dc_link *link);
286
+
287
+enum link_training_result dc_link_dp_sync_lt_attempt(
288
+ struct dc_link *link,
289
+ struct dc_link_settings *link_setting,
290
+ struct dc_link_training_overrides *lt_settings);
291
+
292
+bool dc_link_dp_sync_lt_end(struct dc_link *link, bool link_down);
202293
203294 void dc_link_dp_enable_hpd(const struct dc_link *link);
204295
....@@ -207,6 +298,7 @@
207298 bool dc_link_dp_set_test_pattern(
208299 struct dc_link *link,
209300 enum dp_test_pattern test_pattern,
301
+ enum dp_test_pattern_color_space test_pattern_color_space,
210302 const struct link_training_settings *p_link_settings,
211303 const unsigned char *p_custom_pattern,
212304 unsigned int cust_pattern_size);
....@@ -220,6 +312,10 @@
220312 * DPCD access interfaces
221313 */
222314
315
+#ifdef CONFIG_DRM_AMD_DC_HDCP
316
+bool dc_link_is_hdcp14(struct dc_link *link, enum signal_type signal);
317
+bool dc_link_is_hdcp22(struct dc_link *link, enum signal_type signal);
318
+#endif
223319 void dc_link_set_drive_settings(struct dc *dc,
224320 struct link_training_settings *lt_settings,
225321 const struct dc_link *link);
....@@ -229,17 +325,41 @@
229325 void dc_link_set_preferred_link_settings(struct dc *dc,
230326 struct dc_link_settings *link_setting,
231327 struct dc_link *link);
328
+void dc_link_set_preferred_training_settings(struct dc *dc,
329
+ struct dc_link_settings *link_setting,
330
+ struct dc_link_training_overrides *lt_overrides,
331
+ struct dc_link *link,
332
+ bool skip_immediate_retrain);
232333 void dc_link_enable_hpd(const struct dc_link *link);
233334 void dc_link_disable_hpd(const struct dc_link *link);
234335 void dc_link_set_test_pattern(struct dc_link *link,
235336 enum dp_test_pattern test_pattern,
337
+ enum dp_test_pattern_color_space test_pattern_color_space,
236338 const struct link_training_settings *p_link_settings,
237339 const unsigned char *p_custom_pattern,
238340 unsigned int cust_pattern_size);
341
+uint32_t dc_link_bandwidth_kbps(
342
+ const struct dc_link *link,
343
+ const struct dc_link_settings *link_setting);
344
+
345
+const struct dc_link_settings *dc_link_get_link_cap(
346
+ const struct dc_link *link);
347
+
348
+void dc_link_overwrite_extended_receiver_cap(
349
+ struct dc_link *link);
239350
240351 bool dc_submit_i2c(
241352 struct dc *dc,
242353 uint32_t link_index,
243354 struct i2c_command *cmd);
244355
356
+bool dc_submit_i2c_oem(
357
+ struct dc *dc,
358
+ struct i2c_command *cmd);
359
+
360
+uint32_t dc_bandwidth_in_kbps_from_timing(
361
+ const struct dc_crtc_timing *timing);
362
+
363
+bool dc_link_is_fec_supported(const struct dc_link *link);
364
+
245365 #endif /* DC_LINK_H_ */