Merge tag 'vfio-v5.8-rc7' of git://github.com/awilliam/linux-vfio into master
[linux-2.6-microblaze.git] / drivers / gpu / drm / amd / display / amdgpu_dm / amdgpu_dm.c
1 /*
2  * Copyright 2015 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 /* The caprices of the preprocessor require that this be declared right here */
27 #define CREATE_TRACE_POINTS
28
29 #include "dm_services_types.h"
30 #include "dc.h"
31 #include "dc/inc/core_types.h"
32 #include "dal_asic_id.h"
33 #include "dmub/dmub_srv.h"
34 #include "dc/inc/hw/dmcu.h"
35 #include "dc/inc/hw/abm.h"
36 #include "dc/dc_dmub_srv.h"
37
38 #include "vid.h"
39 #include "amdgpu.h"
40 #include "amdgpu_display.h"
41 #include "amdgpu_ucode.h"
42 #include "atom.h"
43 #include "amdgpu_dm.h"
44 #ifdef CONFIG_DRM_AMD_DC_HDCP
45 #include "amdgpu_dm_hdcp.h"
46 #include <drm/drm_hdcp.h>
47 #endif
48 #include "amdgpu_pm.h"
49
50 #include "amd_shared.h"
51 #include "amdgpu_dm_irq.h"
52 #include "dm_helpers.h"
53 #include "amdgpu_dm_mst_types.h"
54 #if defined(CONFIG_DEBUG_FS)
55 #include "amdgpu_dm_debugfs.h"
56 #endif
57
58 #include "ivsrcid/ivsrcid_vislands30.h"
59
60 #include <linux/module.h>
61 #include <linux/moduleparam.h>
62 #include <linux/version.h>
63 #include <linux/types.h>
64 #include <linux/pm_runtime.h>
65 #include <linux/pci.h>
66 #include <linux/firmware.h>
67 #include <linux/component.h>
68
69 #include <drm/drm_atomic.h>
70 #include <drm/drm_atomic_uapi.h>
71 #include <drm/drm_atomic_helper.h>
72 #include <drm/drm_dp_mst_helper.h>
73 #include <drm/drm_fb_helper.h>
74 #include <drm/drm_fourcc.h>
75 #include <drm/drm_edid.h>
76 #include <drm/drm_vblank.h>
77 #include <drm/drm_audio_component.h>
78 #include <drm/drm_hdcp.h>
79
80 #if defined(CONFIG_DRM_AMD_DC_DCN)
81 #include "ivsrcid/dcn/irqsrcs_dcn_1_0.h"
82
83 #include "dcn/dcn_1_0_offset.h"
84 #include "dcn/dcn_1_0_sh_mask.h"
85 #include "soc15_hw_ip.h"
86 #include "vega10_ip_offset.h"
87
88 #include "soc15_common.h"
89 #endif
90
91 #include "modules/inc/mod_freesync.h"
92 #include "modules/power/power_helpers.h"
93 #include "modules/inc/mod_info_packet.h"
94
95 #define FIRMWARE_RENOIR_DMUB "amdgpu/renoir_dmcub.bin"
96 MODULE_FIRMWARE(FIRMWARE_RENOIR_DMUB);
97
98 #define FIRMWARE_RAVEN_DMCU             "amdgpu/raven_dmcu.bin"
99 MODULE_FIRMWARE(FIRMWARE_RAVEN_DMCU);
100
101 #define FIRMWARE_NAVI12_DMCU            "amdgpu/navi12_dmcu.bin"
102 MODULE_FIRMWARE(FIRMWARE_NAVI12_DMCU);
103
104 /* Number of bytes in PSP header for firmware. */
105 #define PSP_HEADER_BYTES 0x100
106
107 /* Number of bytes in PSP footer for firmware. */
108 #define PSP_FOOTER_BYTES 0x100
109
110 /**
111  * DOC: overview
112  *
113  * The AMDgpu display manager, **amdgpu_dm** (or even simpler,
114  * **dm**) sits between DRM and DC. It acts as a liason, converting DRM
115  * requests into DC requests, and DC responses into DRM responses.
116  *
117  * The root control structure is &struct amdgpu_display_manager.
118  */
119
120 /* basic init/fini API */
121 static int amdgpu_dm_init(struct amdgpu_device *adev);
122 static void amdgpu_dm_fini(struct amdgpu_device *adev);
123
124 /*
125  * initializes drm_device display related structures, based on the information
126  * provided by DAL. The drm strcutures are: drm_crtc, drm_connector,
127  * drm_encoder, drm_mode_config
128  *
129  * Returns 0 on success
130  */
131 static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev);
132 /* removes and deallocates the drm structures, created by the above function */
133 static void amdgpu_dm_destroy_drm_device(struct amdgpu_display_manager *dm);
134
135 static int amdgpu_dm_plane_init(struct amdgpu_display_manager *dm,
136                                 struct drm_plane *plane,
137                                 unsigned long possible_crtcs,
138                                 const struct dc_plane_cap *plane_cap);
139 static int amdgpu_dm_crtc_init(struct amdgpu_display_manager *dm,
140                                struct drm_plane *plane,
141                                uint32_t link_index);
142 static int amdgpu_dm_connector_init(struct amdgpu_display_manager *dm,
143                                     struct amdgpu_dm_connector *amdgpu_dm_connector,
144                                     uint32_t link_index,
145                                     struct amdgpu_encoder *amdgpu_encoder);
146 static int amdgpu_dm_encoder_init(struct drm_device *dev,
147                                   struct amdgpu_encoder *aencoder,
148                                   uint32_t link_index);
149
150 static int amdgpu_dm_connector_get_modes(struct drm_connector *connector);
151
152 static int amdgpu_dm_atomic_commit(struct drm_device *dev,
153                                    struct drm_atomic_state *state,
154                                    bool nonblock);
155
156 static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state);
157
158 static int amdgpu_dm_atomic_check(struct drm_device *dev,
159                                   struct drm_atomic_state *state);
160
161 static void handle_cursor_update(struct drm_plane *plane,
162                                  struct drm_plane_state *old_plane_state);
163
164 static void amdgpu_dm_set_psr_caps(struct dc_link *link);
165 static bool amdgpu_dm_psr_enable(struct dc_stream_state *stream);
166 static bool amdgpu_dm_link_setup_psr(struct dc_stream_state *stream);
167 static bool amdgpu_dm_psr_disable(struct dc_stream_state *stream);
168
169
170 /*
171  * dm_vblank_get_counter
172  *
173  * @brief
174  * Get counter for number of vertical blanks
175  *
176  * @param
177  * struct amdgpu_device *adev - [in] desired amdgpu device
178  * int disp_idx - [in] which CRTC to get the counter from
179  *
180  * @return
181  * Counter for vertical blanks
182  */
183 static u32 dm_vblank_get_counter(struct amdgpu_device *adev, int crtc)
184 {
185         if (crtc >= adev->mode_info.num_crtc)
186                 return 0;
187         else {
188                 struct amdgpu_crtc *acrtc = adev->mode_info.crtcs[crtc];
189                 struct dm_crtc_state *acrtc_state = to_dm_crtc_state(
190                                 acrtc->base.state);
191
192
193                 if (acrtc_state->stream == NULL) {
194                         DRM_ERROR("dc_stream_state is NULL for crtc '%d'!\n",
195                                   crtc);
196                         return 0;
197                 }
198
199                 return dc_stream_get_vblank_counter(acrtc_state->stream);
200         }
201 }
202
203 static int dm_crtc_get_scanoutpos(struct amdgpu_device *adev, int crtc,
204                                   u32 *vbl, u32 *position)
205 {
206         uint32_t v_blank_start, v_blank_end, h_position, v_position;
207
208         if ((crtc < 0) || (crtc >= adev->mode_info.num_crtc))
209                 return -EINVAL;
210         else {
211                 struct amdgpu_crtc *acrtc = adev->mode_info.crtcs[crtc];
212                 struct dm_crtc_state *acrtc_state = to_dm_crtc_state(
213                                                 acrtc->base.state);
214
215                 if (acrtc_state->stream ==  NULL) {
216                         DRM_ERROR("dc_stream_state is NULL for crtc '%d'!\n",
217                                   crtc);
218                         return 0;
219                 }
220
221                 /*
222                  * TODO rework base driver to use values directly.
223                  * for now parse it back into reg-format
224                  */
225                 dc_stream_get_scanoutpos(acrtc_state->stream,
226                                          &v_blank_start,
227                                          &v_blank_end,
228                                          &h_position,
229                                          &v_position);
230
231                 *position = v_position | (h_position << 16);
232                 *vbl = v_blank_start | (v_blank_end << 16);
233         }
234
235         return 0;
236 }
237
238 static bool dm_is_idle(void *handle)
239 {
240         /* XXX todo */
241         return true;
242 }
243
244 static int dm_wait_for_idle(void *handle)
245 {
246         /* XXX todo */
247         return 0;
248 }
249
250 static bool dm_check_soft_reset(void *handle)
251 {
252         return false;
253 }
254
255 static int dm_soft_reset(void *handle)
256 {
257         /* XXX todo */
258         return 0;
259 }
260
261 static struct amdgpu_crtc *
262 get_crtc_by_otg_inst(struct amdgpu_device *adev,
263                      int otg_inst)
264 {
265         struct drm_device *dev = adev->ddev;
266         struct drm_crtc *crtc;
267         struct amdgpu_crtc *amdgpu_crtc;
268
269         if (otg_inst == -1) {
270                 WARN_ON(1);
271                 return adev->mode_info.crtcs[0];
272         }
273
274         list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
275                 amdgpu_crtc = to_amdgpu_crtc(crtc);
276
277                 if (amdgpu_crtc->otg_inst == otg_inst)
278                         return amdgpu_crtc;
279         }
280
281         return NULL;
282 }
283
284 static inline bool amdgpu_dm_vrr_active(struct dm_crtc_state *dm_state)
285 {
286         return dm_state->freesync_config.state == VRR_STATE_ACTIVE_VARIABLE ||
287                dm_state->freesync_config.state == VRR_STATE_ACTIVE_FIXED;
288 }
289
290 /**
291  * dm_pflip_high_irq() - Handle pageflip interrupt
292  * @interrupt_params: ignored
293  *
294  * Handles the pageflip interrupt by notifying all interested parties
295  * that the pageflip has been completed.
296  */
297 static void dm_pflip_high_irq(void *interrupt_params)
298 {
299         struct amdgpu_crtc *amdgpu_crtc;
300         struct common_irq_params *irq_params = interrupt_params;
301         struct amdgpu_device *adev = irq_params->adev;
302         unsigned long flags;
303         struct drm_pending_vblank_event *e;
304         struct dm_crtc_state *acrtc_state;
305         uint32_t vpos, hpos, v_blank_start, v_blank_end;
306         bool vrr_active;
307
308         amdgpu_crtc = get_crtc_by_otg_inst(adev, irq_params->irq_src - IRQ_TYPE_PFLIP);
309
310         /* IRQ could occur when in initial stage */
311         /* TODO work and BO cleanup */
312         if (amdgpu_crtc == NULL) {
313                 DRM_DEBUG_DRIVER("CRTC is null, returning.\n");
314                 return;
315         }
316
317         spin_lock_irqsave(&adev->ddev->event_lock, flags);
318
319         if (amdgpu_crtc->pflip_status != AMDGPU_FLIP_SUBMITTED){
320                 DRM_DEBUG_DRIVER("amdgpu_crtc->pflip_status = %d !=AMDGPU_FLIP_SUBMITTED(%d) on crtc:%d[%p] \n",
321                                                  amdgpu_crtc->pflip_status,
322                                                  AMDGPU_FLIP_SUBMITTED,
323                                                  amdgpu_crtc->crtc_id,
324                                                  amdgpu_crtc);
325                 spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
326                 return;
327         }
328
329         /* page flip completed. */
330         e = amdgpu_crtc->event;
331         amdgpu_crtc->event = NULL;
332
333         if (!e)
334                 WARN_ON(1);
335
336         acrtc_state = to_dm_crtc_state(amdgpu_crtc->base.state);
337         vrr_active = amdgpu_dm_vrr_active(acrtc_state);
338
339         /* Fixed refresh rate, or VRR scanout position outside front-porch? */
340         if (!vrr_active ||
341             !dc_stream_get_scanoutpos(acrtc_state->stream, &v_blank_start,
342                                       &v_blank_end, &hpos, &vpos) ||
343             (vpos < v_blank_start)) {
344                 /* Update to correct count and vblank timestamp if racing with
345                  * vblank irq. This also updates to the correct vblank timestamp
346                  * even in VRR mode, as scanout is past the front-porch atm.
347                  */
348                 drm_crtc_accurate_vblank_count(&amdgpu_crtc->base);
349
350                 /* Wake up userspace by sending the pageflip event with proper
351                  * count and timestamp of vblank of flip completion.
352                  */
353                 if (e) {
354                         drm_crtc_send_vblank_event(&amdgpu_crtc->base, e);
355
356                         /* Event sent, so done with vblank for this flip */
357                         drm_crtc_vblank_put(&amdgpu_crtc->base);
358                 }
359         } else if (e) {
360                 /* VRR active and inside front-porch: vblank count and
361                  * timestamp for pageflip event will only be up to date after
362                  * drm_crtc_handle_vblank() has been executed from late vblank
363                  * irq handler after start of back-porch (vline 0). We queue the
364                  * pageflip event for send-out by drm_crtc_handle_vblank() with
365                  * updated timestamp and count, once it runs after us.
366                  *
367                  * We need to open-code this instead of using the helper
368                  * drm_crtc_arm_vblank_event(), as that helper would
369                  * call drm_crtc_accurate_vblank_count(), which we must
370                  * not call in VRR mode while we are in front-porch!
371                  */
372
373                 /* sequence will be replaced by real count during send-out. */
374                 e->sequence = drm_crtc_vblank_count(&amdgpu_crtc->base);
375                 e->pipe = amdgpu_crtc->crtc_id;
376
377                 list_add_tail(&e->base.link, &adev->ddev->vblank_event_list);
378                 e = NULL;
379         }
380
381         /* Keep track of vblank of this flip for flip throttling. We use the
382          * cooked hw counter, as that one incremented at start of this vblank
383          * of pageflip completion, so last_flip_vblank is the forbidden count
384          * for queueing new pageflips if vsync + VRR is enabled.
385          */
386         amdgpu_crtc->last_flip_vblank =
387                 amdgpu_get_vblank_counter_kms(&amdgpu_crtc->base);
388
389         amdgpu_crtc->pflip_status = AMDGPU_FLIP_NONE;
390         spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
391
392         DRM_DEBUG_DRIVER("crtc:%d[%p], pflip_stat:AMDGPU_FLIP_NONE, vrr[%d]-fp %d\n",
393                          amdgpu_crtc->crtc_id, amdgpu_crtc,
394                          vrr_active, (int) !e);
395 }
396
397 static void dm_vupdate_high_irq(void *interrupt_params)
398 {
399         struct common_irq_params *irq_params = interrupt_params;
400         struct amdgpu_device *adev = irq_params->adev;
401         struct amdgpu_crtc *acrtc;
402         struct dm_crtc_state *acrtc_state;
403         unsigned long flags;
404
405         acrtc = get_crtc_by_otg_inst(adev, irq_params->irq_src - IRQ_TYPE_VUPDATE);
406
407         if (acrtc) {
408                 acrtc_state = to_dm_crtc_state(acrtc->base.state);
409
410                 DRM_DEBUG_VBL("crtc:%d, vupdate-vrr:%d\n",
411                               acrtc->crtc_id,
412                               amdgpu_dm_vrr_active(acrtc_state));
413
414                 /* Core vblank handling is done here after end of front-porch in
415                  * vrr mode, as vblank timestamping will give valid results
416                  * while now done after front-porch. This will also deliver
417                  * page-flip completion events that have been queued to us
418                  * if a pageflip happened inside front-porch.
419                  */
420                 if (amdgpu_dm_vrr_active(acrtc_state)) {
421                         drm_crtc_handle_vblank(&acrtc->base);
422
423                         /* BTR processing for pre-DCE12 ASICs */
424                         if (acrtc_state->stream &&
425                             adev->family < AMDGPU_FAMILY_AI) {
426                                 spin_lock_irqsave(&adev->ddev->event_lock, flags);
427                                 mod_freesync_handle_v_update(
428                                     adev->dm.freesync_module,
429                                     acrtc_state->stream,
430                                     &acrtc_state->vrr_params);
431
432                                 dc_stream_adjust_vmin_vmax(
433                                     adev->dm.dc,
434                                     acrtc_state->stream,
435                                     &acrtc_state->vrr_params.adjust);
436                                 spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
437                         }
438                 }
439         }
440 }
441
442 /**
443  * dm_crtc_high_irq() - Handles CRTC interrupt
444  * @interrupt_params: used for determining the CRTC instance
445  *
446  * Handles the CRTC/VSYNC interrupt by notfying DRM's VBLANK
447  * event handler.
448  */
449 static void dm_crtc_high_irq(void *interrupt_params)
450 {
451         struct common_irq_params *irq_params = interrupt_params;
452         struct amdgpu_device *adev = irq_params->adev;
453         struct amdgpu_crtc *acrtc;
454         struct dm_crtc_state *acrtc_state;
455         unsigned long flags;
456
457         acrtc = get_crtc_by_otg_inst(adev, irq_params->irq_src - IRQ_TYPE_VBLANK);
458         if (!acrtc)
459                 return;
460
461         acrtc_state = to_dm_crtc_state(acrtc->base.state);
462
463         DRM_DEBUG_VBL("crtc:%d, vupdate-vrr:%d, planes:%d\n", acrtc->crtc_id,
464                          amdgpu_dm_vrr_active(acrtc_state),
465                          acrtc_state->active_planes);
466
467         /**
468          * Core vblank handling at start of front-porch is only possible
469          * in non-vrr mode, as only there vblank timestamping will give
470          * valid results while done in front-porch. Otherwise defer it
471          * to dm_vupdate_high_irq after end of front-porch.
472          */
473         if (!amdgpu_dm_vrr_active(acrtc_state))
474                 drm_crtc_handle_vblank(&acrtc->base);
475
476         /**
477          * Following stuff must happen at start of vblank, for crc
478          * computation and below-the-range btr support in vrr mode.
479          */
480         amdgpu_dm_crtc_handle_crc_irq(&acrtc->base);
481
482         /* BTR updates need to happen before VUPDATE on Vega and above. */
483         if (adev->family < AMDGPU_FAMILY_AI)
484                 return;
485
486         spin_lock_irqsave(&adev->ddev->event_lock, flags);
487
488         if (acrtc_state->stream && acrtc_state->vrr_params.supported &&
489             acrtc_state->freesync_config.state == VRR_STATE_ACTIVE_VARIABLE) {
490                 mod_freesync_handle_v_update(adev->dm.freesync_module,
491                                              acrtc_state->stream,
492                                              &acrtc_state->vrr_params);
493
494                 dc_stream_adjust_vmin_vmax(adev->dm.dc, acrtc_state->stream,
495                                            &acrtc_state->vrr_params.adjust);
496         }
497
498         /*
499          * If there aren't any active_planes then DCH HUBP may be clock-gated.
500          * In that case, pageflip completion interrupts won't fire and pageflip
501          * completion events won't get delivered. Prevent this by sending
502          * pending pageflip events from here if a flip is still pending.
503          *
504          * If any planes are enabled, use dm_pflip_high_irq() instead, to
505          * avoid race conditions between flip programming and completion,
506          * which could cause too early flip completion events.
507          */
508         if (adev->family >= AMDGPU_FAMILY_RV &&
509             acrtc->pflip_status == AMDGPU_FLIP_SUBMITTED &&
510             acrtc_state->active_planes == 0) {
511                 if (acrtc->event) {
512                         drm_crtc_send_vblank_event(&acrtc->base, acrtc->event);
513                         acrtc->event = NULL;
514                         drm_crtc_vblank_put(&acrtc->base);
515                 }
516                 acrtc->pflip_status = AMDGPU_FLIP_NONE;
517         }
518
519         spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
520 }
521
522 static int dm_set_clockgating_state(void *handle,
523                   enum amd_clockgating_state state)
524 {
525         return 0;
526 }
527
528 static int dm_set_powergating_state(void *handle,
529                   enum amd_powergating_state state)
530 {
531         return 0;
532 }
533
534 /* Prototypes of private functions */
535 static int dm_early_init(void* handle);
536
537 /* Allocate memory for FBC compressed data  */
538 static void amdgpu_dm_fbc_init(struct drm_connector *connector)
539 {
540         struct drm_device *dev = connector->dev;
541         struct amdgpu_device *adev = dev->dev_private;
542         struct dm_comressor_info *compressor = &adev->dm.compressor;
543         struct amdgpu_dm_connector *aconn = to_amdgpu_dm_connector(connector);
544         struct drm_display_mode *mode;
545         unsigned long max_size = 0;
546
547         if (adev->dm.dc->fbc_compressor == NULL)
548                 return;
549
550         if (aconn->dc_link->connector_signal != SIGNAL_TYPE_EDP)
551                 return;
552
553         if (compressor->bo_ptr)
554                 return;
555
556
557         list_for_each_entry(mode, &connector->modes, head) {
558                 if (max_size < mode->htotal * mode->vtotal)
559                         max_size = mode->htotal * mode->vtotal;
560         }
561
562         if (max_size) {
563                 int r = amdgpu_bo_create_kernel(adev, max_size * 4, PAGE_SIZE,
564                             AMDGPU_GEM_DOMAIN_GTT, &compressor->bo_ptr,
565                             &compressor->gpu_addr, &compressor->cpu_addr);
566
567                 if (r)
568                         DRM_ERROR("DM: Failed to initialize FBC\n");
569                 else {
570                         adev->dm.dc->ctx->fbc_gpu_addr = compressor->gpu_addr;
571                         DRM_INFO("DM: FBC alloc %lu\n", max_size*4);
572                 }
573
574         }
575
576 }
577
578 static int amdgpu_dm_audio_component_get_eld(struct device *kdev, int port,
579                                           int pipe, bool *enabled,
580                                           unsigned char *buf, int max_bytes)
581 {
582         struct drm_device *dev = dev_get_drvdata(kdev);
583         struct amdgpu_device *adev = dev->dev_private;
584         struct drm_connector *connector;
585         struct drm_connector_list_iter conn_iter;
586         struct amdgpu_dm_connector *aconnector;
587         int ret = 0;
588
589         *enabled = false;
590
591         mutex_lock(&adev->dm.audio_lock);
592
593         drm_connector_list_iter_begin(dev, &conn_iter);
594         drm_for_each_connector_iter(connector, &conn_iter) {
595                 aconnector = to_amdgpu_dm_connector(connector);
596                 if (aconnector->audio_inst != port)
597                         continue;
598
599                 *enabled = true;
600                 ret = drm_eld_size(connector->eld);
601                 memcpy(buf, connector->eld, min(max_bytes, ret));
602
603                 break;
604         }
605         drm_connector_list_iter_end(&conn_iter);
606
607         mutex_unlock(&adev->dm.audio_lock);
608
609         DRM_DEBUG_KMS("Get ELD : idx=%d ret=%d en=%d\n", port, ret, *enabled);
610
611         return ret;
612 }
613
614 static const struct drm_audio_component_ops amdgpu_dm_audio_component_ops = {
615         .get_eld = amdgpu_dm_audio_component_get_eld,
616 };
617
618 static int amdgpu_dm_audio_component_bind(struct device *kdev,
619                                        struct device *hda_kdev, void *data)
620 {
621         struct drm_device *dev = dev_get_drvdata(kdev);
622         struct amdgpu_device *adev = dev->dev_private;
623         struct drm_audio_component *acomp = data;
624
625         acomp->ops = &amdgpu_dm_audio_component_ops;
626         acomp->dev = kdev;
627         adev->dm.audio_component = acomp;
628
629         return 0;
630 }
631
632 static void amdgpu_dm_audio_component_unbind(struct device *kdev,
633                                           struct device *hda_kdev, void *data)
634 {
635         struct drm_device *dev = dev_get_drvdata(kdev);
636         struct amdgpu_device *adev = dev->dev_private;
637         struct drm_audio_component *acomp = data;
638
639         acomp->ops = NULL;
640         acomp->dev = NULL;
641         adev->dm.audio_component = NULL;
642 }
643
644 static const struct component_ops amdgpu_dm_audio_component_bind_ops = {
645         .bind   = amdgpu_dm_audio_component_bind,
646         .unbind = amdgpu_dm_audio_component_unbind,
647 };
648
649 static int amdgpu_dm_audio_init(struct amdgpu_device *adev)
650 {
651         int i, ret;
652
653         if (!amdgpu_audio)
654                 return 0;
655
656         adev->mode_info.audio.enabled = true;
657
658         adev->mode_info.audio.num_pins = adev->dm.dc->res_pool->audio_count;
659
660         for (i = 0; i < adev->mode_info.audio.num_pins; i++) {
661                 adev->mode_info.audio.pin[i].channels = -1;
662                 adev->mode_info.audio.pin[i].rate = -1;
663                 adev->mode_info.audio.pin[i].bits_per_sample = -1;
664                 adev->mode_info.audio.pin[i].status_bits = 0;
665                 adev->mode_info.audio.pin[i].category_code = 0;
666                 adev->mode_info.audio.pin[i].connected = false;
667                 adev->mode_info.audio.pin[i].id =
668                         adev->dm.dc->res_pool->audios[i]->inst;
669                 adev->mode_info.audio.pin[i].offset = 0;
670         }
671
672         ret = component_add(adev->dev, &amdgpu_dm_audio_component_bind_ops);
673         if (ret < 0)
674                 return ret;
675
676         adev->dm.audio_registered = true;
677
678         return 0;
679 }
680
681 static void amdgpu_dm_audio_fini(struct amdgpu_device *adev)
682 {
683         if (!amdgpu_audio)
684                 return;
685
686         if (!adev->mode_info.audio.enabled)
687                 return;
688
689         if (adev->dm.audio_registered) {
690                 component_del(adev->dev, &amdgpu_dm_audio_component_bind_ops);
691                 adev->dm.audio_registered = false;
692         }
693
694         /* TODO: Disable audio? */
695
696         adev->mode_info.audio.enabled = false;
697 }
698
699 void amdgpu_dm_audio_eld_notify(struct amdgpu_device *adev, int pin)
700 {
701         struct drm_audio_component *acomp = adev->dm.audio_component;
702
703         if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify) {
704                 DRM_DEBUG_KMS("Notify ELD: %d\n", pin);
705
706                 acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr,
707                                                  pin, -1);
708         }
709 }
710
711 static int dm_dmub_hw_init(struct amdgpu_device *adev)
712 {
713         const struct dmcub_firmware_header_v1_0 *hdr;
714         struct dmub_srv *dmub_srv = adev->dm.dmub_srv;
715         struct dmub_srv_fb_info *fb_info = adev->dm.dmub_fb_info;
716         const struct firmware *dmub_fw = adev->dm.dmub_fw;
717         struct dmcu *dmcu = adev->dm.dc->res_pool->dmcu;
718         struct abm *abm = adev->dm.dc->res_pool->abm;
719         struct dmub_srv_hw_params hw_params;
720         enum dmub_status status;
721         const unsigned char *fw_inst_const, *fw_bss_data;
722         uint32_t i, fw_inst_const_size, fw_bss_data_size;
723         bool has_hw_support;
724
725         if (!dmub_srv)
726                 /* DMUB isn't supported on the ASIC. */
727                 return 0;
728
729         if (!fb_info) {
730                 DRM_ERROR("No framebuffer info for DMUB service.\n");
731                 return -EINVAL;
732         }
733
734         if (!dmub_fw) {
735                 /* Firmware required for DMUB support. */
736                 DRM_ERROR("No firmware provided for DMUB.\n");
737                 return -EINVAL;
738         }
739
740         status = dmub_srv_has_hw_support(dmub_srv, &has_hw_support);
741         if (status != DMUB_STATUS_OK) {
742                 DRM_ERROR("Error checking HW support for DMUB: %d\n", status);
743                 return -EINVAL;
744         }
745
746         if (!has_hw_support) {
747                 DRM_INFO("DMUB unsupported on ASIC\n");
748                 return 0;
749         }
750
751         hdr = (const struct dmcub_firmware_header_v1_0 *)dmub_fw->data;
752
753         fw_inst_const = dmub_fw->data +
754                         le32_to_cpu(hdr->header.ucode_array_offset_bytes) +
755                         PSP_HEADER_BYTES;
756
757         fw_bss_data = dmub_fw->data +
758                       le32_to_cpu(hdr->header.ucode_array_offset_bytes) +
759                       le32_to_cpu(hdr->inst_const_bytes);
760
761         /* Copy firmware and bios info into FB memory. */
762         fw_inst_const_size = le32_to_cpu(hdr->inst_const_bytes) -
763                              PSP_HEADER_BYTES - PSP_FOOTER_BYTES;
764
765         fw_bss_data_size = le32_to_cpu(hdr->bss_data_bytes);
766
767         /* if adev->firmware.load_type == AMDGPU_FW_LOAD_PSP,
768          * amdgpu_ucode_init_single_fw will load dmub firmware
769          * fw_inst_const part to cw0; otherwise, the firmware back door load
770          * will be done by dm_dmub_hw_init
771          */
772         if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) {
773                 memcpy(fb_info->fb[DMUB_WINDOW_0_INST_CONST].cpu_addr, fw_inst_const,
774                                 fw_inst_const_size);
775         }
776
777         if (fw_bss_data_size)
778                 memcpy(fb_info->fb[DMUB_WINDOW_2_BSS_DATA].cpu_addr,
779                        fw_bss_data, fw_bss_data_size);
780
781         /* Copy firmware bios info into FB memory. */
782         memcpy(fb_info->fb[DMUB_WINDOW_3_VBIOS].cpu_addr, adev->bios,
783                adev->bios_size);
784
785         /* Reset regions that need to be reset. */
786         memset(fb_info->fb[DMUB_WINDOW_4_MAILBOX].cpu_addr, 0,
787         fb_info->fb[DMUB_WINDOW_4_MAILBOX].size);
788
789         memset(fb_info->fb[DMUB_WINDOW_5_TRACEBUFF].cpu_addr, 0,
790                fb_info->fb[DMUB_WINDOW_5_TRACEBUFF].size);
791
792         memset(fb_info->fb[DMUB_WINDOW_6_FW_STATE].cpu_addr, 0,
793                fb_info->fb[DMUB_WINDOW_6_FW_STATE].size);
794
795         /* Initialize hardware. */
796         memset(&hw_params, 0, sizeof(hw_params));
797         hw_params.fb_base = adev->gmc.fb_start;
798         hw_params.fb_offset = adev->gmc.aper_base;
799
800         /* backdoor load firmware and trigger dmub running */
801         if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP)
802                 hw_params.load_inst_const = true;
803
804         if (dmcu)
805                 hw_params.psp_version = dmcu->psp_version;
806
807         for (i = 0; i < fb_info->num_fb; ++i)
808                 hw_params.fb[i] = &fb_info->fb[i];
809
810         status = dmub_srv_hw_init(dmub_srv, &hw_params);
811         if (status != DMUB_STATUS_OK) {
812                 DRM_ERROR("Error initializing DMUB HW: %d\n", status);
813                 return -EINVAL;
814         }
815
816         /* Wait for firmware load to finish. */
817         status = dmub_srv_wait_for_auto_load(dmub_srv, 100000);
818         if (status != DMUB_STATUS_OK)
819                 DRM_WARN("Wait for DMUB auto-load failed: %d\n", status);
820
821         /* Init DMCU and ABM if available. */
822         if (dmcu && abm) {
823                 dmcu->funcs->dmcu_init(dmcu);
824                 abm->dmcu_is_running = dmcu->funcs->is_dmcu_initialized(dmcu);
825         }
826
827         adev->dm.dc->ctx->dmub_srv = dc_dmub_srv_create(adev->dm.dc, dmub_srv);
828         if (!adev->dm.dc->ctx->dmub_srv) {
829                 DRM_ERROR("Couldn't allocate DC DMUB server!\n");
830                 return -ENOMEM;
831         }
832
833         DRM_INFO("DMUB hardware initialized: version=0x%08X\n",
834                  adev->dm.dmcub_fw_version);
835
836         return 0;
837 }
838
839 static int amdgpu_dm_init(struct amdgpu_device *adev)
840 {
841         struct dc_init_data init_data;
842 #ifdef CONFIG_DRM_AMD_DC_HDCP
843         struct dc_callback_init init_params;
844 #endif
845         int r;
846
847         adev->dm.ddev = adev->ddev;
848         adev->dm.adev = adev;
849
850         /* Zero all the fields */
851         memset(&init_data, 0, sizeof(init_data));
852 #ifdef CONFIG_DRM_AMD_DC_HDCP
853         memset(&init_params, 0, sizeof(init_params));
854 #endif
855
856         mutex_init(&adev->dm.dc_lock);
857         mutex_init(&adev->dm.audio_lock);
858
859         if(amdgpu_dm_irq_init(adev)) {
860                 DRM_ERROR("amdgpu: failed to initialize DM IRQ support.\n");
861                 goto error;
862         }
863
864         init_data.asic_id.chip_family = adev->family;
865
866         init_data.asic_id.pci_revision_id = adev->pdev->revision;
867         init_data.asic_id.hw_internal_rev = adev->external_rev_id;
868
869         init_data.asic_id.vram_width = adev->gmc.vram_width;
870         /* TODO: initialize init_data.asic_id.vram_type here!!!! */
871         init_data.asic_id.atombios_base_address =
872                 adev->mode_info.atom_context->bios;
873
874         init_data.driver = adev;
875
876         adev->dm.cgs_device = amdgpu_cgs_create_device(adev);
877
878         if (!adev->dm.cgs_device) {
879                 DRM_ERROR("amdgpu: failed to create cgs device.\n");
880                 goto error;
881         }
882
883         init_data.cgs_device = adev->dm.cgs_device;
884
885         init_data.dce_environment = DCE_ENV_PRODUCTION_DRV;
886
887         switch (adev->asic_type) {
888         case CHIP_CARRIZO:
889         case CHIP_STONEY:
890         case CHIP_RAVEN:
891         case CHIP_RENOIR:
892                 init_data.flags.gpu_vm_support = true;
893                 break;
894         default:
895                 break;
896         }
897
898         if (amdgpu_dc_feature_mask & DC_FBC_MASK)
899                 init_data.flags.fbc_support = true;
900
901         if (amdgpu_dc_feature_mask & DC_MULTI_MON_PP_MCLK_SWITCH_MASK)
902                 init_data.flags.multi_mon_pp_mclk_switch = true;
903
904         if (amdgpu_dc_feature_mask & DC_DISABLE_FRACTIONAL_PWM_MASK)
905                 init_data.flags.disable_fractional_pwm = true;
906
907         init_data.flags.power_down_display_on_boot = true;
908
909         init_data.soc_bounding_box = adev->dm.soc_bounding_box;
910
911         /* Display Core create. */
912         adev->dm.dc = dc_create(&init_data);
913
914         if (adev->dm.dc) {
915                 DRM_INFO("Display Core initialized with v%s!\n", DC_VER);
916         } else {
917                 DRM_INFO("Display Core failed to initialize with v%s!\n", DC_VER);
918                 goto error;
919         }
920
921         if (amdgpu_dc_debug_mask & DC_DISABLE_PIPE_SPLIT) {
922                 adev->dm.dc->debug.force_single_disp_pipe_split = false;
923                 adev->dm.dc->debug.pipe_split_policy = MPC_SPLIT_AVOID;
924         }
925
926         if (adev->asic_type != CHIP_CARRIZO && adev->asic_type != CHIP_STONEY)
927                 adev->dm.dc->debug.disable_stutter = amdgpu_pp_feature_mask & PP_STUTTER_MODE ? false : true;
928
929         if (amdgpu_dc_debug_mask & DC_DISABLE_STUTTER)
930                 adev->dm.dc->debug.disable_stutter = true;
931
932         if (amdgpu_dc_debug_mask & DC_DISABLE_DSC)
933                 adev->dm.dc->debug.disable_dsc = true;
934
935         if (amdgpu_dc_debug_mask & DC_DISABLE_CLOCK_GATING)
936                 adev->dm.dc->debug.disable_clock_gate = true;
937
938         r = dm_dmub_hw_init(adev);
939         if (r) {
940                 DRM_ERROR("DMUB interface failed to initialize: status=%d\n", r);
941                 goto error;
942         }
943
944         dc_hardware_init(adev->dm.dc);
945
946         adev->dm.freesync_module = mod_freesync_create(adev->dm.dc);
947         if (!adev->dm.freesync_module) {
948                 DRM_ERROR(
949                 "amdgpu: failed to initialize freesync_module.\n");
950         } else
951                 DRM_DEBUG_DRIVER("amdgpu: freesync_module init done %p.\n",
952                                 adev->dm.freesync_module);
953
954         amdgpu_dm_init_color_mod();
955
956 #ifdef CONFIG_DRM_AMD_DC_HDCP
957         if (adev->asic_type >= CHIP_RAVEN) {
958                 adev->dm.hdcp_workqueue = hdcp_create_workqueue(adev, &init_params.cp_psp, adev->dm.dc);
959
960                 if (!adev->dm.hdcp_workqueue)
961                         DRM_ERROR("amdgpu: failed to initialize hdcp_workqueue.\n");
962                 else
963                         DRM_DEBUG_DRIVER("amdgpu: hdcp_workqueue init done %p.\n", adev->dm.hdcp_workqueue);
964
965                 dc_init_callbacks(adev->dm.dc, &init_params);
966         }
967 #endif
968         if (amdgpu_dm_initialize_drm_device(adev)) {
969                 DRM_ERROR(
970                 "amdgpu: failed to initialize sw for display support.\n");
971                 goto error;
972         }
973
974         /* Update the actual used number of crtc */
975         adev->mode_info.num_crtc = adev->dm.display_indexes_num;
976
977         /* create fake encoders for MST */
978         dm_dp_create_fake_mst_encoders(adev);
979
980         /* TODO: Add_display_info? */
981
982         /* TODO use dynamic cursor width */
983         adev->ddev->mode_config.cursor_width = adev->dm.dc->caps.max_cursor_size;
984         adev->ddev->mode_config.cursor_height = adev->dm.dc->caps.max_cursor_size;
985
986         if (drm_vblank_init(adev->ddev, adev->dm.display_indexes_num)) {
987                 DRM_ERROR(
988                 "amdgpu: failed to initialize sw for display support.\n");
989                 goto error;
990         }
991
992         DRM_DEBUG_DRIVER("KMS initialized.\n");
993
994         return 0;
995 error:
996         amdgpu_dm_fini(adev);
997
998         return -EINVAL;
999 }
1000
1001 static void amdgpu_dm_fini(struct amdgpu_device *adev)
1002 {
1003         int i;
1004
1005         for (i = 0; i < adev->dm.display_indexes_num; i++) {
1006                 drm_encoder_cleanup(&adev->dm.mst_encoders[i].base);
1007         }
1008
1009         amdgpu_dm_audio_fini(adev);
1010
1011         amdgpu_dm_destroy_drm_device(&adev->dm);
1012
1013 #ifdef CONFIG_DRM_AMD_DC_HDCP
1014         if (adev->dm.hdcp_workqueue) {
1015                 hdcp_destroy(adev->dm.hdcp_workqueue);
1016                 adev->dm.hdcp_workqueue = NULL;
1017         }
1018
1019         if (adev->dm.dc)
1020                 dc_deinit_callbacks(adev->dm.dc);
1021 #endif
1022         if (adev->dm.dc->ctx->dmub_srv) {
1023                 dc_dmub_srv_destroy(&adev->dm.dc->ctx->dmub_srv);
1024                 adev->dm.dc->ctx->dmub_srv = NULL;
1025         }
1026
1027         if (adev->dm.dmub_bo)
1028                 amdgpu_bo_free_kernel(&adev->dm.dmub_bo,
1029                                       &adev->dm.dmub_bo_gpu_addr,
1030                                       &adev->dm.dmub_bo_cpu_addr);
1031
1032         /* DC Destroy TODO: Replace destroy DAL */
1033         if (adev->dm.dc)
1034                 dc_destroy(&adev->dm.dc);
1035         /*
1036          * TODO: pageflip, vlank interrupt
1037          *
1038          * amdgpu_dm_irq_fini(adev);
1039          */
1040
1041         if (adev->dm.cgs_device) {
1042                 amdgpu_cgs_destroy_device(adev->dm.cgs_device);
1043                 adev->dm.cgs_device = NULL;
1044         }
1045         if (adev->dm.freesync_module) {
1046                 mod_freesync_destroy(adev->dm.freesync_module);
1047                 adev->dm.freesync_module = NULL;
1048         }
1049
1050         mutex_destroy(&adev->dm.audio_lock);
1051         mutex_destroy(&adev->dm.dc_lock);
1052
1053         return;
1054 }
1055
1056 static int load_dmcu_fw(struct amdgpu_device *adev)
1057 {
1058         const char *fw_name_dmcu = NULL;
1059         int r;
1060         const struct dmcu_firmware_header_v1_0 *hdr;
1061
1062         switch(adev->asic_type) {
1063         case CHIP_BONAIRE:
1064         case CHIP_HAWAII:
1065         case CHIP_KAVERI:
1066         case CHIP_KABINI:
1067         case CHIP_MULLINS:
1068         case CHIP_TONGA:
1069         case CHIP_FIJI:
1070         case CHIP_CARRIZO:
1071         case CHIP_STONEY:
1072         case CHIP_POLARIS11:
1073         case CHIP_POLARIS10:
1074         case CHIP_POLARIS12:
1075         case CHIP_VEGAM:
1076         case CHIP_VEGA10:
1077         case CHIP_VEGA12:
1078         case CHIP_VEGA20:
1079         case CHIP_NAVI10:
1080         case CHIP_NAVI14:
1081         case CHIP_RENOIR:
1082                 return 0;
1083         case CHIP_NAVI12:
1084                 fw_name_dmcu = FIRMWARE_NAVI12_DMCU;
1085                 break;
1086         case CHIP_RAVEN:
1087                 if (ASICREV_IS_PICASSO(adev->external_rev_id))
1088                         fw_name_dmcu = FIRMWARE_RAVEN_DMCU;
1089                 else if (ASICREV_IS_RAVEN2(adev->external_rev_id))
1090                         fw_name_dmcu = FIRMWARE_RAVEN_DMCU;
1091                 else
1092                         return 0;
1093                 break;
1094         default:
1095                 DRM_ERROR("Unsupported ASIC type: 0x%X\n", adev->asic_type);
1096                 return -EINVAL;
1097         }
1098
1099         if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) {
1100                 DRM_DEBUG_KMS("dm: DMCU firmware not supported on direct or SMU loading\n");
1101                 return 0;
1102         }
1103
1104         r = request_firmware_direct(&adev->dm.fw_dmcu, fw_name_dmcu, adev->dev);
1105         if (r == -ENOENT) {
1106                 /* DMCU firmware is not necessary, so don't raise a fuss if it's missing */
1107                 DRM_DEBUG_KMS("dm: DMCU firmware not found\n");
1108                 adev->dm.fw_dmcu = NULL;
1109                 return 0;
1110         }
1111         if (r) {
1112                 dev_err(adev->dev, "amdgpu_dm: Can't load firmware \"%s\"\n",
1113                         fw_name_dmcu);
1114                 return r;
1115         }
1116
1117         r = amdgpu_ucode_validate(adev->dm.fw_dmcu);
1118         if (r) {
1119                 dev_err(adev->dev, "amdgpu_dm: Can't validate firmware \"%s\"\n",
1120                         fw_name_dmcu);
1121                 release_firmware(adev->dm.fw_dmcu);
1122                 adev->dm.fw_dmcu = NULL;
1123                 return r;
1124         }
1125
1126         hdr = (const struct dmcu_firmware_header_v1_0 *)adev->dm.fw_dmcu->data;
1127         adev->firmware.ucode[AMDGPU_UCODE_ID_DMCU_ERAM].ucode_id = AMDGPU_UCODE_ID_DMCU_ERAM;
1128         adev->firmware.ucode[AMDGPU_UCODE_ID_DMCU_ERAM].fw = adev->dm.fw_dmcu;
1129         adev->firmware.fw_size +=
1130                 ALIGN(le32_to_cpu(hdr->header.ucode_size_bytes) - le32_to_cpu(hdr->intv_size_bytes), PAGE_SIZE);
1131
1132         adev->firmware.ucode[AMDGPU_UCODE_ID_DMCU_INTV].ucode_id = AMDGPU_UCODE_ID_DMCU_INTV;
1133         adev->firmware.ucode[AMDGPU_UCODE_ID_DMCU_INTV].fw = adev->dm.fw_dmcu;
1134         adev->firmware.fw_size +=
1135                 ALIGN(le32_to_cpu(hdr->intv_size_bytes), PAGE_SIZE);
1136
1137         adev->dm.dmcu_fw_version = le32_to_cpu(hdr->header.ucode_version);
1138
1139         DRM_DEBUG_KMS("PSP loading DMCU firmware\n");
1140
1141         return 0;
1142 }
1143
1144 static uint32_t amdgpu_dm_dmub_reg_read(void *ctx, uint32_t address)
1145 {
1146         struct amdgpu_device *adev = ctx;
1147
1148         return dm_read_reg(adev->dm.dc->ctx, address);
1149 }
1150
1151 static void amdgpu_dm_dmub_reg_write(void *ctx, uint32_t address,
1152                                      uint32_t value)
1153 {
1154         struct amdgpu_device *adev = ctx;
1155
1156         return dm_write_reg(adev->dm.dc->ctx, address, value);
1157 }
1158
1159 static int dm_dmub_sw_init(struct amdgpu_device *adev)
1160 {
1161         struct dmub_srv_create_params create_params;
1162         struct dmub_srv_region_params region_params;
1163         struct dmub_srv_region_info region_info;
1164         struct dmub_srv_fb_params fb_params;
1165         struct dmub_srv_fb_info *fb_info;
1166         struct dmub_srv *dmub_srv;
1167         const struct dmcub_firmware_header_v1_0 *hdr;
1168         const char *fw_name_dmub;
1169         enum dmub_asic dmub_asic;
1170         enum dmub_status status;
1171         int r;
1172
1173         switch (adev->asic_type) {
1174         case CHIP_RENOIR:
1175                 dmub_asic = DMUB_ASIC_DCN21;
1176                 fw_name_dmub = FIRMWARE_RENOIR_DMUB;
1177                 break;
1178
1179         default:
1180                 /* ASIC doesn't support DMUB. */
1181                 return 0;
1182         }
1183
1184         r = request_firmware_direct(&adev->dm.dmub_fw, fw_name_dmub, adev->dev);
1185         if (r) {
1186                 DRM_ERROR("DMUB firmware loading failed: %d\n", r);
1187                 return 0;
1188         }
1189
1190         r = amdgpu_ucode_validate(adev->dm.dmub_fw);
1191         if (r) {
1192                 DRM_ERROR("Couldn't validate DMUB firmware: %d\n", r);
1193                 return 0;
1194         }
1195
1196         hdr = (const struct dmcub_firmware_header_v1_0 *)adev->dm.dmub_fw->data;
1197
1198         if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
1199                 adev->firmware.ucode[AMDGPU_UCODE_ID_DMCUB].ucode_id =
1200                         AMDGPU_UCODE_ID_DMCUB;
1201                 adev->firmware.ucode[AMDGPU_UCODE_ID_DMCUB].fw =
1202                         adev->dm.dmub_fw;
1203                 adev->firmware.fw_size +=
1204                         ALIGN(le32_to_cpu(hdr->inst_const_bytes), PAGE_SIZE);
1205
1206                 DRM_INFO("Loading DMUB firmware via PSP: version=0x%08X\n",
1207                          adev->dm.dmcub_fw_version);
1208         }
1209
1210         adev->dm.dmcub_fw_version = le32_to_cpu(hdr->header.ucode_version);
1211
1212         adev->dm.dmub_srv = kzalloc(sizeof(*adev->dm.dmub_srv), GFP_KERNEL);
1213         dmub_srv = adev->dm.dmub_srv;
1214
1215         if (!dmub_srv) {
1216                 DRM_ERROR("Failed to allocate DMUB service!\n");
1217                 return -ENOMEM;
1218         }
1219
1220         memset(&create_params, 0, sizeof(create_params));
1221         create_params.user_ctx = adev;
1222         create_params.funcs.reg_read = amdgpu_dm_dmub_reg_read;
1223         create_params.funcs.reg_write = amdgpu_dm_dmub_reg_write;
1224         create_params.asic = dmub_asic;
1225
1226         /* Create the DMUB service. */
1227         status = dmub_srv_create(dmub_srv, &create_params);
1228         if (status != DMUB_STATUS_OK) {
1229                 DRM_ERROR("Error creating DMUB service: %d\n", status);
1230                 return -EINVAL;
1231         }
1232
1233         /* Calculate the size of all the regions for the DMUB service. */
1234         memset(&region_params, 0, sizeof(region_params));
1235
1236         region_params.inst_const_size = le32_to_cpu(hdr->inst_const_bytes) -
1237                                         PSP_HEADER_BYTES - PSP_FOOTER_BYTES;
1238         region_params.bss_data_size = le32_to_cpu(hdr->bss_data_bytes);
1239         region_params.vbios_size = adev->bios_size;
1240         region_params.fw_bss_data =
1241                 adev->dm.dmub_fw->data +
1242                 le32_to_cpu(hdr->header.ucode_array_offset_bytes) +
1243                 le32_to_cpu(hdr->inst_const_bytes);
1244         region_params.fw_inst_const =
1245                 adev->dm.dmub_fw->data +
1246                 le32_to_cpu(hdr->header.ucode_array_offset_bytes) +
1247                 PSP_HEADER_BYTES;
1248
1249         status = dmub_srv_calc_region_info(dmub_srv, &region_params,
1250                                            &region_info);
1251
1252         if (status != DMUB_STATUS_OK) {
1253                 DRM_ERROR("Error calculating DMUB region info: %d\n", status);
1254                 return -EINVAL;
1255         }
1256
1257         /*
1258          * Allocate a framebuffer based on the total size of all the regions.
1259          * TODO: Move this into GART.
1260          */
1261         r = amdgpu_bo_create_kernel(adev, region_info.fb_size, PAGE_SIZE,
1262                                     AMDGPU_GEM_DOMAIN_VRAM, &adev->dm.dmub_bo,
1263                                     &adev->dm.dmub_bo_gpu_addr,
1264                                     &adev->dm.dmub_bo_cpu_addr);
1265         if (r)
1266                 return r;
1267
1268         /* Rebase the regions on the framebuffer address. */
1269         memset(&fb_params, 0, sizeof(fb_params));
1270         fb_params.cpu_addr = adev->dm.dmub_bo_cpu_addr;
1271         fb_params.gpu_addr = adev->dm.dmub_bo_gpu_addr;
1272         fb_params.region_info = &region_info;
1273
1274         adev->dm.dmub_fb_info =
1275                 kzalloc(sizeof(*adev->dm.dmub_fb_info), GFP_KERNEL);
1276         fb_info = adev->dm.dmub_fb_info;
1277
1278         if (!fb_info) {
1279                 DRM_ERROR(
1280                         "Failed to allocate framebuffer info for DMUB service!\n");
1281                 return -ENOMEM;
1282         }
1283
1284         status = dmub_srv_calc_fb_info(dmub_srv, &fb_params, fb_info);
1285         if (status != DMUB_STATUS_OK) {
1286                 DRM_ERROR("Error calculating DMUB FB info: %d\n", status);
1287                 return -EINVAL;
1288         }
1289
1290         return 0;
1291 }
1292
1293 static int dm_sw_init(void *handle)
1294 {
1295         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1296         int r;
1297
1298         r = dm_dmub_sw_init(adev);
1299         if (r)
1300                 return r;
1301
1302         return load_dmcu_fw(adev);
1303 }
1304
1305 static int dm_sw_fini(void *handle)
1306 {
1307         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1308
1309         kfree(adev->dm.dmub_fb_info);
1310         adev->dm.dmub_fb_info = NULL;
1311
1312         if (adev->dm.dmub_srv) {
1313                 dmub_srv_destroy(adev->dm.dmub_srv);
1314                 adev->dm.dmub_srv = NULL;
1315         }
1316
1317         if (adev->dm.dmub_fw) {
1318                 release_firmware(adev->dm.dmub_fw);
1319                 adev->dm.dmub_fw = NULL;
1320         }
1321
1322         if(adev->dm.fw_dmcu) {
1323                 release_firmware(adev->dm.fw_dmcu);
1324                 adev->dm.fw_dmcu = NULL;
1325         }
1326
1327         return 0;
1328 }
1329
1330 static int detect_mst_link_for_all_connectors(struct drm_device *dev)
1331 {
1332         struct amdgpu_dm_connector *aconnector;
1333         struct drm_connector *connector;
1334         struct drm_connector_list_iter iter;
1335         int ret = 0;
1336
1337         drm_connector_list_iter_begin(dev, &iter);
1338         drm_for_each_connector_iter(connector, &iter) {
1339                 aconnector = to_amdgpu_dm_connector(connector);
1340                 if (aconnector->dc_link->type == dc_connection_mst_branch &&
1341                     aconnector->mst_mgr.aux) {
1342                         DRM_DEBUG_DRIVER("DM_MST: starting TM on aconnector: %p [id: %d]\n",
1343                                          aconnector,
1344                                          aconnector->base.base.id);
1345
1346                         ret = drm_dp_mst_topology_mgr_set_mst(&aconnector->mst_mgr, true);
1347                         if (ret < 0) {
1348                                 DRM_ERROR("DM_MST: Failed to start MST\n");
1349                                 aconnector->dc_link->type =
1350                                         dc_connection_single;
1351                                 break;
1352                         }
1353                 }
1354         }
1355         drm_connector_list_iter_end(&iter);
1356
1357         return ret;
1358 }
1359
1360 static int dm_late_init(void *handle)
1361 {
1362         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1363
1364         struct dmcu_iram_parameters params;
1365         unsigned int linear_lut[16];
1366         int i;
1367         struct dmcu *dmcu = NULL;
1368         bool ret;
1369
1370         if (!adev->dm.fw_dmcu && !adev->dm.dmub_fw)
1371                 return detect_mst_link_for_all_connectors(adev->ddev);
1372
1373         dmcu = adev->dm.dc->res_pool->dmcu;
1374
1375         for (i = 0; i < 16; i++)
1376                 linear_lut[i] = 0xFFFF * i / 15;
1377
1378         params.set = 0;
1379         params.backlight_ramping_start = 0xCCCC;
1380         params.backlight_ramping_reduction = 0xCCCCCCCC;
1381         params.backlight_lut_array_size = 16;
1382         params.backlight_lut_array = linear_lut;
1383
1384         /* Min backlight level after ABM reduction,  Don't allow below 1%
1385          * 0xFFFF x 0.01 = 0x28F
1386          */
1387         params.min_abm_backlight = 0x28F;
1388
1389         ret = dmcu_load_iram(dmcu, params);
1390
1391         if (!ret)
1392                 return -EINVAL;
1393
1394         return detect_mst_link_for_all_connectors(adev->ddev);
1395 }
1396
1397 static void s3_handle_mst(struct drm_device *dev, bool suspend)
1398 {
1399         struct amdgpu_dm_connector *aconnector;
1400         struct drm_connector *connector;
1401         struct drm_connector_list_iter iter;
1402         struct drm_dp_mst_topology_mgr *mgr;
1403         int ret;
1404         bool need_hotplug = false;
1405
1406         drm_connector_list_iter_begin(dev, &iter);
1407         drm_for_each_connector_iter(connector, &iter) {
1408                 aconnector = to_amdgpu_dm_connector(connector);
1409                 if (aconnector->dc_link->type != dc_connection_mst_branch ||
1410                     aconnector->mst_port)
1411                         continue;
1412
1413                 mgr = &aconnector->mst_mgr;
1414
1415                 if (suspend) {
1416                         drm_dp_mst_topology_mgr_suspend(mgr);
1417                 } else {
1418                         ret = drm_dp_mst_topology_mgr_resume(mgr, true);
1419                         if (ret < 0) {
1420                                 drm_dp_mst_topology_mgr_set_mst(mgr, false);
1421                                 need_hotplug = true;
1422                         }
1423                 }
1424         }
1425         drm_connector_list_iter_end(&iter);
1426
1427         if (need_hotplug)
1428                 drm_kms_helper_hotplug_event(dev);
1429 }
1430
1431 static int amdgpu_dm_smu_write_watermarks_table(struct amdgpu_device *adev)
1432 {
1433         struct smu_context *smu = &adev->smu;
1434         int ret = 0;
1435
1436         if (!is_support_sw_smu(adev))
1437                 return 0;
1438
1439         /* This interface is for dGPU Navi1x.Linux dc-pplib interface depends
1440          * on window driver dc implementation.
1441          * For Navi1x, clock settings of dcn watermarks are fixed. the settings
1442          * should be passed to smu during boot up and resume from s3.
1443          * boot up: dc calculate dcn watermark clock settings within dc_create,
1444          * dcn20_resource_construct
1445          * then call pplib functions below to pass the settings to smu:
1446          * smu_set_watermarks_for_clock_ranges
1447          * smu_set_watermarks_table
1448          * navi10_set_watermarks_table
1449          * smu_write_watermarks_table
1450          *
1451          * For Renoir, clock settings of dcn watermark are also fixed values.
1452          * dc has implemented different flow for window driver:
1453          * dc_hardware_init / dc_set_power_state
1454          * dcn10_init_hw
1455          * notify_wm_ranges
1456          * set_wm_ranges
1457          * -- Linux
1458          * smu_set_watermarks_for_clock_ranges
1459          * renoir_set_watermarks_table
1460          * smu_write_watermarks_table
1461          *
1462          * For Linux,
1463          * dc_hardware_init -> amdgpu_dm_init
1464          * dc_set_power_state --> dm_resume
1465          *
1466          * therefore, this function apply to navi10/12/14 but not Renoir
1467          * *
1468          */
1469         switch(adev->asic_type) {
1470         case CHIP_NAVI10:
1471         case CHIP_NAVI14:
1472         case CHIP_NAVI12:
1473                 break;
1474         default:
1475                 return 0;
1476         }
1477
1478         mutex_lock(&smu->mutex);
1479
1480         /* pass data to smu controller */
1481         if ((smu->watermarks_bitmap & WATERMARKS_EXIST) &&
1482                         !(smu->watermarks_bitmap & WATERMARKS_LOADED)) {
1483                 ret = smu_write_watermarks_table(smu);
1484
1485                 if (ret) {
1486                         mutex_unlock(&smu->mutex);
1487                         DRM_ERROR("Failed to update WMTABLE!\n");
1488                         return ret;
1489                 }
1490                 smu->watermarks_bitmap |= WATERMARKS_LOADED;
1491         }
1492
1493         mutex_unlock(&smu->mutex);
1494
1495         return 0;
1496 }
1497
1498 /**
1499  * dm_hw_init() - Initialize DC device
1500  * @handle: The base driver device containing the amdgpu_dm device.
1501  *
1502  * Initialize the &struct amdgpu_display_manager device. This involves calling
1503  * the initializers of each DM component, then populating the struct with them.
1504  *
1505  * Although the function implies hardware initialization, both hardware and
1506  * software are initialized here. Splitting them out to their relevant init
1507  * hooks is a future TODO item.
1508  *
1509  * Some notable things that are initialized here:
1510  *
1511  * - Display Core, both software and hardware
1512  * - DC modules that we need (freesync and color management)
1513  * - DRM software states
1514  * - Interrupt sources and handlers
1515  * - Vblank support
1516  * - Debug FS entries, if enabled
1517  */
1518 static int dm_hw_init(void *handle)
1519 {
1520         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1521         /* Create DAL display manager */
1522         amdgpu_dm_init(adev);
1523         amdgpu_dm_hpd_init(adev);
1524
1525         return 0;
1526 }
1527
1528 /**
1529  * dm_hw_fini() - Teardown DC device
1530  * @handle: The base driver device containing the amdgpu_dm device.
1531  *
1532  * Teardown components within &struct amdgpu_display_manager that require
1533  * cleanup. This involves cleaning up the DRM device, DC, and any modules that
1534  * were loaded. Also flush IRQ workqueues and disable them.
1535  */
1536 static int dm_hw_fini(void *handle)
1537 {
1538         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1539
1540         amdgpu_dm_hpd_fini(adev);
1541
1542         amdgpu_dm_irq_fini(adev);
1543         amdgpu_dm_fini(adev);
1544         return 0;
1545 }
1546
1547
1548 static int dm_enable_vblank(struct drm_crtc *crtc);
1549 static void dm_disable_vblank(struct drm_crtc *crtc);
1550
1551 static void dm_gpureset_toggle_interrupts(struct amdgpu_device *adev,
1552                                  struct dc_state *state, bool enable)
1553 {
1554         enum dc_irq_source irq_source;
1555         struct amdgpu_crtc *acrtc;
1556         int rc = -EBUSY;
1557         int i = 0;
1558
1559         for (i = 0; i < state->stream_count; i++) {
1560                 acrtc = get_crtc_by_otg_inst(
1561                                 adev, state->stream_status[i].primary_otg_inst);
1562
1563                 if (acrtc && state->stream_status[i].plane_count != 0) {
1564                         irq_source = IRQ_TYPE_PFLIP + acrtc->otg_inst;
1565                         rc = dc_interrupt_set(adev->dm.dc, irq_source, enable) ? 0 : -EBUSY;
1566                         DRM_DEBUG("crtc %d - vupdate irq %sabling: r=%d\n",
1567                                   acrtc->crtc_id, enable ? "en" : "dis", rc);
1568                         if (rc)
1569                                 DRM_WARN("Failed to %s pflip interrupts\n",
1570                                          enable ? "enable" : "disable");
1571
1572                         if (enable) {
1573                                 rc = dm_enable_vblank(&acrtc->base);
1574                                 if (rc)
1575                                         DRM_WARN("Failed to enable vblank interrupts\n");
1576                         } else {
1577                                 dm_disable_vblank(&acrtc->base);
1578                         }
1579
1580                 }
1581         }
1582
1583 }
1584
1585 enum dc_status amdgpu_dm_commit_zero_streams(struct dc *dc)
1586 {
1587         struct dc_state *context = NULL;
1588         enum dc_status res = DC_ERROR_UNEXPECTED;
1589         int i;
1590         struct dc_stream_state *del_streams[MAX_PIPES];
1591         int del_streams_count = 0;
1592
1593         memset(del_streams, 0, sizeof(del_streams));
1594
1595         context = dc_create_state(dc);
1596         if (context == NULL)
1597                 goto context_alloc_fail;
1598
1599         dc_resource_state_copy_construct_current(dc, context);
1600
1601         /* First remove from context all streams */
1602         for (i = 0; i < context->stream_count; i++) {
1603                 struct dc_stream_state *stream = context->streams[i];
1604
1605                 del_streams[del_streams_count++] = stream;
1606         }
1607
1608         /* Remove all planes for removed streams and then remove the streams */
1609         for (i = 0; i < del_streams_count; i++) {
1610                 if (!dc_rem_all_planes_for_stream(dc, del_streams[i], context)) {
1611                         res = DC_FAIL_DETACH_SURFACES;
1612                         goto fail;
1613                 }
1614
1615                 res = dc_remove_stream_from_ctx(dc, context, del_streams[i]);
1616                 if (res != DC_OK)
1617                         goto fail;
1618         }
1619
1620
1621         res = dc_validate_global_state(dc, context, false);
1622
1623         if (res != DC_OK) {
1624                 DRM_ERROR("%s:resource validation failed, dc_status:%d\n", __func__, res);
1625                 goto fail;
1626         }
1627
1628         res = dc_commit_state(dc, context);
1629
1630 fail:
1631         dc_release_state(context);
1632
1633 context_alloc_fail:
1634         return res;
1635 }
1636
1637 static int dm_suspend(void *handle)
1638 {
1639         struct amdgpu_device *adev = handle;
1640         struct amdgpu_display_manager *dm = &adev->dm;
1641         int ret = 0;
1642
1643         if (adev->in_gpu_reset) {
1644                 mutex_lock(&dm->dc_lock);
1645                 dm->cached_dc_state = dc_copy_state(dm->dc->current_state);
1646
1647                 dm_gpureset_toggle_interrupts(adev, dm->cached_dc_state, false);
1648
1649                 amdgpu_dm_commit_zero_streams(dm->dc);
1650
1651                 amdgpu_dm_irq_suspend(adev);
1652
1653                 return ret;
1654         }
1655
1656         WARN_ON(adev->dm.cached_state);
1657         adev->dm.cached_state = drm_atomic_helper_suspend(adev->ddev);
1658
1659         s3_handle_mst(adev->ddev, true);
1660
1661         amdgpu_dm_irq_suspend(adev);
1662
1663
1664         dc_set_power_state(dm->dc, DC_ACPI_CM_POWER_STATE_D3);
1665
1666         return 0;
1667 }
1668
1669 static struct amdgpu_dm_connector *
1670 amdgpu_dm_find_first_crtc_matching_connector(struct drm_atomic_state *state,
1671                                              struct drm_crtc *crtc)
1672 {
1673         uint32_t i;
1674         struct drm_connector_state *new_con_state;
1675         struct drm_connector *connector;
1676         struct drm_crtc *crtc_from_state;
1677
1678         for_each_new_connector_in_state(state, connector, new_con_state, i) {
1679                 crtc_from_state = new_con_state->crtc;
1680
1681                 if (crtc_from_state == crtc)
1682                         return to_amdgpu_dm_connector(connector);
1683         }
1684
1685         return NULL;
1686 }
1687
1688 static void emulated_link_detect(struct dc_link *link)
1689 {
1690         struct dc_sink_init_data sink_init_data = { 0 };
1691         struct display_sink_capability sink_caps = { 0 };
1692         enum dc_edid_status edid_status;
1693         struct dc_context *dc_ctx = link->ctx;
1694         struct dc_sink *sink = NULL;
1695         struct dc_sink *prev_sink = NULL;
1696
1697         link->type = dc_connection_none;
1698         prev_sink = link->local_sink;
1699
1700         if (prev_sink != NULL)
1701                 dc_sink_retain(prev_sink);
1702
1703         switch (link->connector_signal) {
1704         case SIGNAL_TYPE_HDMI_TYPE_A: {
1705                 sink_caps.transaction_type = DDC_TRANSACTION_TYPE_I2C;
1706                 sink_caps.signal = SIGNAL_TYPE_HDMI_TYPE_A;
1707                 break;
1708         }
1709
1710         case SIGNAL_TYPE_DVI_SINGLE_LINK: {
1711                 sink_caps.transaction_type = DDC_TRANSACTION_TYPE_I2C;
1712                 sink_caps.signal = SIGNAL_TYPE_DVI_SINGLE_LINK;
1713                 break;
1714         }
1715
1716         case SIGNAL_TYPE_DVI_DUAL_LINK: {
1717                 sink_caps.transaction_type = DDC_TRANSACTION_TYPE_I2C;
1718                 sink_caps.signal = SIGNAL_TYPE_DVI_DUAL_LINK;
1719                 break;
1720         }
1721
1722         case SIGNAL_TYPE_LVDS: {
1723                 sink_caps.transaction_type = DDC_TRANSACTION_TYPE_I2C;
1724                 sink_caps.signal = SIGNAL_TYPE_LVDS;
1725                 break;
1726         }
1727
1728         case SIGNAL_TYPE_EDP: {
1729                 sink_caps.transaction_type =
1730                         DDC_TRANSACTION_TYPE_I2C_OVER_AUX;
1731                 sink_caps.signal = SIGNAL_TYPE_EDP;
1732                 break;
1733         }
1734
1735         case SIGNAL_TYPE_DISPLAY_PORT: {
1736                 sink_caps.transaction_type =
1737                         DDC_TRANSACTION_TYPE_I2C_OVER_AUX;
1738                 sink_caps.signal = SIGNAL_TYPE_VIRTUAL;
1739                 break;
1740         }
1741
1742         default:
1743                 DC_ERROR("Invalid connector type! signal:%d\n",
1744                         link->connector_signal);
1745                 return;
1746         }
1747
1748         sink_init_data.link = link;
1749         sink_init_data.sink_signal = sink_caps.signal;
1750
1751         sink = dc_sink_create(&sink_init_data);
1752         if (!sink) {
1753                 DC_ERROR("Failed to create sink!\n");
1754                 return;
1755         }
1756
1757         /* dc_sink_create returns a new reference */
1758         link->local_sink = sink;
1759
1760         edid_status = dm_helpers_read_local_edid(
1761                         link->ctx,
1762                         link,
1763                         sink);
1764
1765         if (edid_status != EDID_OK)
1766                 DC_ERROR("Failed to read EDID");
1767
1768 }
1769
1770 static void dm_gpureset_commit_state(struct dc_state *dc_state,
1771                                      struct amdgpu_display_manager *dm)
1772 {
1773         struct {
1774                 struct dc_surface_update surface_updates[MAX_SURFACES];
1775                 struct dc_plane_info plane_infos[MAX_SURFACES];
1776                 struct dc_scaling_info scaling_infos[MAX_SURFACES];
1777                 struct dc_flip_addrs flip_addrs[MAX_SURFACES];
1778                 struct dc_stream_update stream_update;
1779         } * bundle;
1780         int k, m;
1781
1782         bundle = kzalloc(sizeof(*bundle), GFP_KERNEL);
1783
1784         if (!bundle) {
1785                 dm_error("Failed to allocate update bundle\n");
1786                 goto cleanup;
1787         }
1788
1789         for (k = 0; k < dc_state->stream_count; k++) {
1790                 bundle->stream_update.stream = dc_state->streams[k];
1791
1792                 for (m = 0; m < dc_state->stream_status->plane_count; m++) {
1793                         bundle->surface_updates[m].surface =
1794                                 dc_state->stream_status->plane_states[m];
1795                         bundle->surface_updates[m].surface->force_full_update =
1796                                 true;
1797                 }
1798                 dc_commit_updates_for_stream(
1799                         dm->dc, bundle->surface_updates,
1800                         dc_state->stream_status->plane_count,
1801                         dc_state->streams[k], &bundle->stream_update, dc_state);
1802         }
1803
1804 cleanup:
1805         kfree(bundle);
1806
1807         return;
1808 }
1809
1810 static int dm_resume(void *handle)
1811 {
1812         struct amdgpu_device *adev = handle;
1813         struct drm_device *ddev = adev->ddev;
1814         struct amdgpu_display_manager *dm = &adev->dm;
1815         struct amdgpu_dm_connector *aconnector;
1816         struct drm_connector *connector;
1817         struct drm_connector_list_iter iter;
1818         struct drm_crtc *crtc;
1819         struct drm_crtc_state *new_crtc_state;
1820         struct dm_crtc_state *dm_new_crtc_state;
1821         struct drm_plane *plane;
1822         struct drm_plane_state *new_plane_state;
1823         struct dm_plane_state *dm_new_plane_state;
1824         struct dm_atomic_state *dm_state = to_dm_atomic_state(dm->atomic_obj.state);
1825         enum dc_connection_type new_connection_type = dc_connection_none;
1826         struct dc_state *dc_state;
1827         int i, r, j;
1828
1829         if (adev->in_gpu_reset) {
1830                 dc_state = dm->cached_dc_state;
1831
1832                 r = dm_dmub_hw_init(adev);
1833                 if (r)
1834                         DRM_ERROR("DMUB interface failed to initialize: status=%d\n", r);
1835
1836                 dc_set_power_state(dm->dc, DC_ACPI_CM_POWER_STATE_D0);
1837                 dc_resume(dm->dc);
1838
1839                 amdgpu_dm_irq_resume_early(adev);
1840
1841                 for (i = 0; i < dc_state->stream_count; i++) {
1842                         dc_state->streams[i]->mode_changed = true;
1843                         for (j = 0; j < dc_state->stream_status->plane_count; j++) {
1844                                 dc_state->stream_status->plane_states[j]->update_flags.raw
1845                                         = 0xffffffff;
1846                         }
1847                 }
1848
1849                 WARN_ON(!dc_commit_state(dm->dc, dc_state));
1850
1851                 dm_gpureset_commit_state(dm->cached_dc_state, dm);
1852
1853                 dm_gpureset_toggle_interrupts(adev, dm->cached_dc_state, true);
1854
1855                 dc_release_state(dm->cached_dc_state);
1856                 dm->cached_dc_state = NULL;
1857
1858                 amdgpu_dm_irq_resume_late(adev);
1859
1860                 mutex_unlock(&dm->dc_lock);
1861
1862                 return 0;
1863         }
1864         /* Recreate dc_state - DC invalidates it when setting power state to S3. */
1865         dc_release_state(dm_state->context);
1866         dm_state->context = dc_create_state(dm->dc);
1867         /* TODO: Remove dc_state->dccg, use dc->dccg directly. */
1868         dc_resource_state_construct(dm->dc, dm_state->context);
1869
1870         /* Before powering on DC we need to re-initialize DMUB. */
1871         r = dm_dmub_hw_init(adev);
1872         if (r)
1873                 DRM_ERROR("DMUB interface failed to initialize: status=%d\n", r);
1874
1875         /* power on hardware */
1876         dc_set_power_state(dm->dc, DC_ACPI_CM_POWER_STATE_D0);
1877
1878         /* program HPD filter */
1879         dc_resume(dm->dc);
1880
1881         /*
1882          * early enable HPD Rx IRQ, should be done before set mode as short
1883          * pulse interrupts are used for MST
1884          */
1885         amdgpu_dm_irq_resume_early(adev);
1886
1887         /* On resume we need to rewrite the MSTM control bits to enable MST*/
1888         s3_handle_mst(ddev, false);
1889
1890         /* Do detection*/
1891         drm_connector_list_iter_begin(ddev, &iter);
1892         drm_for_each_connector_iter(connector, &iter) {
1893                 aconnector = to_amdgpu_dm_connector(connector);
1894
1895                 /*
1896                  * this is the case when traversing through already created
1897                  * MST connectors, should be skipped
1898                  */
1899                 if (aconnector->mst_port)
1900                         continue;
1901
1902                 mutex_lock(&aconnector->hpd_lock);
1903                 if (!dc_link_detect_sink(aconnector->dc_link, &new_connection_type))
1904                         DRM_ERROR("KMS: Failed to detect connector\n");
1905
1906                 if (aconnector->base.force && new_connection_type == dc_connection_none)
1907                         emulated_link_detect(aconnector->dc_link);
1908                 else
1909                         dc_link_detect(aconnector->dc_link, DETECT_REASON_HPD);
1910
1911                 if (aconnector->fake_enable && aconnector->dc_link->local_sink)
1912                         aconnector->fake_enable = false;
1913
1914                 if (aconnector->dc_sink)
1915                         dc_sink_release(aconnector->dc_sink);
1916                 aconnector->dc_sink = NULL;
1917                 amdgpu_dm_update_connector_after_detect(aconnector);
1918                 mutex_unlock(&aconnector->hpd_lock);
1919         }
1920         drm_connector_list_iter_end(&iter);
1921
1922         /* Force mode set in atomic commit */
1923         for_each_new_crtc_in_state(dm->cached_state, crtc, new_crtc_state, i)
1924                 new_crtc_state->active_changed = true;
1925
1926         /*
1927          * atomic_check is expected to create the dc states. We need to release
1928          * them here, since they were duplicated as part of the suspend
1929          * procedure.
1930          */
1931         for_each_new_crtc_in_state(dm->cached_state, crtc, new_crtc_state, i) {
1932                 dm_new_crtc_state = to_dm_crtc_state(new_crtc_state);
1933                 if (dm_new_crtc_state->stream) {
1934                         WARN_ON(kref_read(&dm_new_crtc_state->stream->refcount) > 1);
1935                         dc_stream_release(dm_new_crtc_state->stream);
1936                         dm_new_crtc_state->stream = NULL;
1937                 }
1938         }
1939
1940         for_each_new_plane_in_state(dm->cached_state, plane, new_plane_state, i) {
1941                 dm_new_plane_state = to_dm_plane_state(new_plane_state);
1942                 if (dm_new_plane_state->dc_state) {
1943                         WARN_ON(kref_read(&dm_new_plane_state->dc_state->refcount) > 1);
1944                         dc_plane_state_release(dm_new_plane_state->dc_state);
1945                         dm_new_plane_state->dc_state = NULL;
1946                 }
1947         }
1948
1949         drm_atomic_helper_resume(ddev, dm->cached_state);
1950
1951         dm->cached_state = NULL;
1952
1953         amdgpu_dm_irq_resume_late(adev);
1954
1955         amdgpu_dm_smu_write_watermarks_table(adev);
1956
1957         return 0;
1958 }
1959
1960 /**
1961  * DOC: DM Lifecycle
1962  *
1963  * DM (and consequently DC) is registered in the amdgpu base driver as a IP
1964  * block. When CONFIG_DRM_AMD_DC is enabled, the DM device IP block is added to
1965  * the base driver's device list to be initialized and torn down accordingly.
1966  *
1967  * The functions to do so are provided as hooks in &struct amd_ip_funcs.
1968  */
1969
1970 static const struct amd_ip_funcs amdgpu_dm_funcs = {
1971         .name = "dm",
1972         .early_init = dm_early_init,
1973         .late_init = dm_late_init,
1974         .sw_init = dm_sw_init,
1975         .sw_fini = dm_sw_fini,
1976         .hw_init = dm_hw_init,
1977         .hw_fini = dm_hw_fini,
1978         .suspend = dm_suspend,
1979         .resume = dm_resume,
1980         .is_idle = dm_is_idle,
1981         .wait_for_idle = dm_wait_for_idle,
1982         .check_soft_reset = dm_check_soft_reset,
1983         .soft_reset = dm_soft_reset,
1984         .set_clockgating_state = dm_set_clockgating_state,
1985         .set_powergating_state = dm_set_powergating_state,
1986 };
1987
1988 const struct amdgpu_ip_block_version dm_ip_block =
1989 {
1990         .type = AMD_IP_BLOCK_TYPE_DCE,
1991         .major = 1,
1992         .minor = 0,
1993         .rev = 0,
1994         .funcs = &amdgpu_dm_funcs,
1995 };
1996
1997
1998 /**
1999  * DOC: atomic
2000  *
2001  * *WIP*
2002  */
2003
2004 static const struct drm_mode_config_funcs amdgpu_dm_mode_funcs = {
2005         .fb_create = amdgpu_display_user_framebuffer_create,
2006         .output_poll_changed = drm_fb_helper_output_poll_changed,
2007         .atomic_check = amdgpu_dm_atomic_check,
2008         .atomic_commit = amdgpu_dm_atomic_commit,
2009 };
2010
2011 static struct drm_mode_config_helper_funcs amdgpu_dm_mode_config_helperfuncs = {
2012         .atomic_commit_tail = amdgpu_dm_atomic_commit_tail
2013 };
2014
2015 static void update_connector_ext_caps(struct amdgpu_dm_connector *aconnector)
2016 {
2017         u32 max_cll, min_cll, max, min, q, r;
2018         struct amdgpu_dm_backlight_caps *caps;
2019         struct amdgpu_display_manager *dm;
2020         struct drm_connector *conn_base;
2021         struct amdgpu_device *adev;
2022         struct dc_link *link = NULL;
2023         static const u8 pre_computed_values[] = {
2024                 50, 51, 52, 53, 55, 56, 57, 58, 59, 61, 62, 63, 65, 66, 68, 69,
2025                 71, 72, 74, 75, 77, 79, 81, 82, 84, 86, 88, 90, 92, 94, 96, 98};
2026
2027         if (!aconnector || !aconnector->dc_link)
2028                 return;
2029
2030         link = aconnector->dc_link;
2031         if (link->connector_signal != SIGNAL_TYPE_EDP)
2032                 return;
2033
2034         conn_base = &aconnector->base;
2035         adev = conn_base->dev->dev_private;
2036         dm = &adev->dm;
2037         caps = &dm->backlight_caps;
2038         caps->ext_caps = &aconnector->dc_link->dpcd_sink_ext_caps;
2039         caps->aux_support = false;
2040         max_cll = conn_base->hdr_sink_metadata.hdmi_type1.max_cll;
2041         min_cll = conn_base->hdr_sink_metadata.hdmi_type1.min_cll;
2042
2043         if (caps->ext_caps->bits.oled == 1 ||
2044             caps->ext_caps->bits.sdr_aux_backlight_control == 1 ||
2045             caps->ext_caps->bits.hdr_aux_backlight_control == 1)
2046                 caps->aux_support = true;
2047
2048         /* From the specification (CTA-861-G), for calculating the maximum
2049          * luminance we need to use:
2050          *      Luminance = 50*2**(CV/32)
2051          * Where CV is a one-byte value.
2052          * For calculating this expression we may need float point precision;
2053          * to avoid this complexity level, we take advantage that CV is divided
2054          * by a constant. From the Euclids division algorithm, we know that CV
2055          * can be written as: CV = 32*q + r. Next, we replace CV in the
2056          * Luminance expression and get 50*(2**q)*(2**(r/32)), hence we just
2057          * need to pre-compute the value of r/32. For pre-computing the values
2058          * We just used the following Ruby line:
2059          *      (0...32).each {|cv| puts (50*2**(cv/32.0)).round}
2060          * The results of the above expressions can be verified at
2061          * pre_computed_values.
2062          */
2063         q = max_cll >> 5;
2064         r = max_cll % 32;
2065         max = (1 << q) * pre_computed_values[r];
2066
2067         // min luminance: maxLum * (CV/255)^2 / 100
2068         q = DIV_ROUND_CLOSEST(min_cll, 255);
2069         min = max * DIV_ROUND_CLOSEST((q * q), 100);
2070
2071         caps->aux_max_input_signal = max;
2072         caps->aux_min_input_signal = min;
2073 }
2074
2075 void amdgpu_dm_update_connector_after_detect(
2076                 struct amdgpu_dm_connector *aconnector)
2077 {
2078         struct drm_connector *connector = &aconnector->base;
2079         struct drm_device *dev = connector->dev;
2080         struct dc_sink *sink;
2081
2082         /* MST handled by drm_mst framework */
2083         if (aconnector->mst_mgr.mst_state == true)
2084                 return;
2085
2086
2087         sink = aconnector->dc_link->local_sink;
2088         if (sink)
2089                 dc_sink_retain(sink);
2090
2091         /*
2092          * Edid mgmt connector gets first update only in mode_valid hook and then
2093          * the connector sink is set to either fake or physical sink depends on link status.
2094          * Skip if already done during boot.
2095          */
2096         if (aconnector->base.force != DRM_FORCE_UNSPECIFIED
2097                         && aconnector->dc_em_sink) {
2098
2099                 /*
2100                  * For S3 resume with headless use eml_sink to fake stream
2101                  * because on resume connector->sink is set to NULL
2102                  */
2103                 mutex_lock(&dev->mode_config.mutex);
2104
2105                 if (sink) {
2106                         if (aconnector->dc_sink) {
2107                                 amdgpu_dm_update_freesync_caps(connector, NULL);
2108                                 /*
2109                                  * retain and release below are used to
2110                                  * bump up refcount for sink because the link doesn't point
2111                                  * to it anymore after disconnect, so on next crtc to connector
2112                                  * reshuffle by UMD we will get into unwanted dc_sink release
2113                                  */
2114                                 dc_sink_release(aconnector->dc_sink);
2115                         }
2116                         aconnector->dc_sink = sink;
2117                         dc_sink_retain(aconnector->dc_sink);
2118                         amdgpu_dm_update_freesync_caps(connector,
2119                                         aconnector->edid);
2120                 } else {
2121                         amdgpu_dm_update_freesync_caps(connector, NULL);
2122                         if (!aconnector->dc_sink) {
2123                                 aconnector->dc_sink = aconnector->dc_em_sink;
2124                                 dc_sink_retain(aconnector->dc_sink);
2125                         }
2126                 }
2127
2128                 mutex_unlock(&dev->mode_config.mutex);
2129
2130                 if (sink)
2131                         dc_sink_release(sink);
2132                 return;
2133         }
2134
2135         /*
2136          * TODO: temporary guard to look for proper fix
2137          * if this sink is MST sink, we should not do anything
2138          */
2139         if (sink && sink->sink_signal == SIGNAL_TYPE_DISPLAY_PORT_MST) {
2140                 dc_sink_release(sink);
2141                 return;
2142         }
2143
2144         if (aconnector->dc_sink == sink) {
2145                 /*
2146                  * We got a DP short pulse (Link Loss, DP CTS, etc...).
2147                  * Do nothing!!
2148                  */
2149                 DRM_DEBUG_DRIVER("DCHPD: connector_id=%d: dc_sink didn't change.\n",
2150                                 aconnector->connector_id);
2151                 if (sink)
2152                         dc_sink_release(sink);
2153                 return;
2154         }
2155
2156         DRM_DEBUG_DRIVER("DCHPD: connector_id=%d: Old sink=%p New sink=%p\n",
2157                 aconnector->connector_id, aconnector->dc_sink, sink);
2158
2159         mutex_lock(&dev->mode_config.mutex);
2160
2161         /*
2162          * 1. Update status of the drm connector
2163          * 2. Send an event and let userspace tell us what to do
2164          */
2165         if (sink) {
2166                 /*
2167                  * TODO: check if we still need the S3 mode update workaround.
2168                  * If yes, put it here.
2169                  */
2170                 if (aconnector->dc_sink)
2171                         amdgpu_dm_update_freesync_caps(connector, NULL);
2172
2173                 aconnector->dc_sink = sink;
2174                 dc_sink_retain(aconnector->dc_sink);
2175                 if (sink->dc_edid.length == 0) {
2176                         aconnector->edid = NULL;
2177                         if (aconnector->dc_link->aux_mode) {
2178                                 drm_dp_cec_unset_edid(
2179                                         &aconnector->dm_dp_aux.aux);
2180                         }
2181                 } else {
2182                         aconnector->edid =
2183                                 (struct edid *)sink->dc_edid.raw_edid;
2184
2185                         drm_connector_update_edid_property(connector,
2186                                                            aconnector->edid);
2187
2188                         if (aconnector->dc_link->aux_mode)
2189                                 drm_dp_cec_set_edid(&aconnector->dm_dp_aux.aux,
2190                                                     aconnector->edid);
2191                 }
2192
2193                 amdgpu_dm_update_freesync_caps(connector, aconnector->edid);
2194                 update_connector_ext_caps(aconnector);
2195         } else {
2196                 drm_dp_cec_unset_edid(&aconnector->dm_dp_aux.aux);
2197                 amdgpu_dm_update_freesync_caps(connector, NULL);
2198                 drm_connector_update_edid_property(connector, NULL);
2199                 aconnector->num_modes = 0;
2200                 dc_sink_release(aconnector->dc_sink);
2201                 aconnector->dc_sink = NULL;
2202                 aconnector->edid = NULL;
2203 #ifdef CONFIG_DRM_AMD_DC_HDCP
2204                 /* Set CP to DESIRED if it was ENABLED, so we can re-enable it again on hotplug */
2205                 if (connector->state->content_protection == DRM_MODE_CONTENT_PROTECTION_ENABLED)
2206                         connector->state->content_protection = DRM_MODE_CONTENT_PROTECTION_DESIRED;
2207 #endif
2208         }
2209
2210         mutex_unlock(&dev->mode_config.mutex);
2211
2212         if (sink)
2213                 dc_sink_release(sink);
2214 }
2215
2216 static void handle_hpd_irq(void *param)
2217 {
2218         struct amdgpu_dm_connector *aconnector = (struct amdgpu_dm_connector *)param;
2219         struct drm_connector *connector = &aconnector->base;
2220         struct drm_device *dev = connector->dev;
2221         enum dc_connection_type new_connection_type = dc_connection_none;
2222 #ifdef CONFIG_DRM_AMD_DC_HDCP
2223         struct amdgpu_device *adev = dev->dev_private;
2224 #endif
2225
2226         /*
2227          * In case of failure or MST no need to update connector status or notify the OS
2228          * since (for MST case) MST does this in its own context.
2229          */
2230         mutex_lock(&aconnector->hpd_lock);
2231
2232 #ifdef CONFIG_DRM_AMD_DC_HDCP
2233         if (adev->dm.hdcp_workqueue)
2234                 hdcp_reset_display(adev->dm.hdcp_workqueue, aconnector->dc_link->link_index);
2235 #endif
2236         if (aconnector->fake_enable)
2237                 aconnector->fake_enable = false;
2238
2239         if (!dc_link_detect_sink(aconnector->dc_link, &new_connection_type))
2240                 DRM_ERROR("KMS: Failed to detect connector\n");
2241
2242         if (aconnector->base.force && new_connection_type == dc_connection_none) {
2243                 emulated_link_detect(aconnector->dc_link);
2244
2245
2246                 drm_modeset_lock_all(dev);
2247                 dm_restore_drm_connector_state(dev, connector);
2248                 drm_modeset_unlock_all(dev);
2249
2250                 if (aconnector->base.force == DRM_FORCE_UNSPECIFIED)
2251                         drm_kms_helper_hotplug_event(dev);
2252
2253         } else if (dc_link_detect(aconnector->dc_link, DETECT_REASON_HPD)) {
2254                 amdgpu_dm_update_connector_after_detect(aconnector);
2255
2256
2257                 drm_modeset_lock_all(dev);
2258                 dm_restore_drm_connector_state(dev, connector);
2259                 drm_modeset_unlock_all(dev);
2260
2261                 if (aconnector->base.force == DRM_FORCE_UNSPECIFIED)
2262                         drm_kms_helper_hotplug_event(dev);
2263         }
2264         mutex_unlock(&aconnector->hpd_lock);
2265
2266 }
2267
2268 static void dm_handle_hpd_rx_irq(struct amdgpu_dm_connector *aconnector)
2269 {
2270         uint8_t esi[DP_PSR_ERROR_STATUS - DP_SINK_COUNT_ESI] = { 0 };
2271         uint8_t dret;
2272         bool new_irq_handled = false;
2273         int dpcd_addr;
2274         int dpcd_bytes_to_read;
2275
2276         const int max_process_count = 30;
2277         int process_count = 0;
2278
2279         const struct dc_link_status *link_status = dc_link_get_status(aconnector->dc_link);
2280
2281         if (link_status->dpcd_caps->dpcd_rev.raw < 0x12) {
2282                 dpcd_bytes_to_read = DP_LANE0_1_STATUS - DP_SINK_COUNT;
2283                 /* DPCD 0x200 - 0x201 for downstream IRQ */
2284                 dpcd_addr = DP_SINK_COUNT;
2285         } else {
2286                 dpcd_bytes_to_read = DP_PSR_ERROR_STATUS - DP_SINK_COUNT_ESI;
2287                 /* DPCD 0x2002 - 0x2005 for downstream IRQ */
2288                 dpcd_addr = DP_SINK_COUNT_ESI;
2289         }
2290
2291         dret = drm_dp_dpcd_read(
2292                 &aconnector->dm_dp_aux.aux,
2293                 dpcd_addr,
2294                 esi,
2295                 dpcd_bytes_to_read);
2296
2297         while (dret == dpcd_bytes_to_read &&
2298                 process_count < max_process_count) {
2299                 uint8_t retry;
2300                 dret = 0;
2301
2302                 process_count++;
2303
2304                 DRM_DEBUG_DRIVER("ESI %02x %02x %02x\n", esi[0], esi[1], esi[2]);
2305                 /* handle HPD short pulse irq */
2306                 if (aconnector->mst_mgr.mst_state)
2307                         drm_dp_mst_hpd_irq(
2308                                 &aconnector->mst_mgr,
2309                                 esi,
2310                                 &new_irq_handled);
2311
2312                 if (new_irq_handled) {
2313                         /* ACK at DPCD to notify down stream */
2314                         const int ack_dpcd_bytes_to_write =
2315                                 dpcd_bytes_to_read - 1;
2316
2317                         for (retry = 0; retry < 3; retry++) {
2318                                 uint8_t wret;
2319
2320                                 wret = drm_dp_dpcd_write(
2321                                         &aconnector->dm_dp_aux.aux,
2322                                         dpcd_addr + 1,
2323                                         &esi[1],
2324                                         ack_dpcd_bytes_to_write);
2325                                 if (wret == ack_dpcd_bytes_to_write)
2326                                         break;
2327                         }
2328
2329                         /* check if there is new irq to be handled */
2330                         dret = drm_dp_dpcd_read(
2331                                 &aconnector->dm_dp_aux.aux,
2332                                 dpcd_addr,
2333                                 esi,
2334                                 dpcd_bytes_to_read);
2335
2336                         new_irq_handled = false;
2337                 } else {
2338                         break;
2339                 }
2340         }
2341
2342         if (process_count == max_process_count)
2343                 DRM_DEBUG_DRIVER("Loop exceeded max iterations\n");
2344 }
2345
2346 static void handle_hpd_rx_irq(void *param)
2347 {
2348         struct amdgpu_dm_connector *aconnector = (struct amdgpu_dm_connector *)param;
2349         struct drm_connector *connector = &aconnector->base;
2350         struct drm_device *dev = connector->dev;
2351         struct dc_link *dc_link = aconnector->dc_link;
2352         bool is_mst_root_connector = aconnector->mst_mgr.mst_state;
2353         enum dc_connection_type new_connection_type = dc_connection_none;
2354 #ifdef CONFIG_DRM_AMD_DC_HDCP
2355         union hpd_irq_data hpd_irq_data;
2356         struct amdgpu_device *adev = dev->dev_private;
2357
2358         memset(&hpd_irq_data, 0, sizeof(hpd_irq_data));
2359 #endif
2360
2361         /*
2362          * TODO:Temporary add mutex to protect hpd interrupt not have a gpio
2363          * conflict, after implement i2c helper, this mutex should be
2364          * retired.
2365          */
2366         if (dc_link->type != dc_connection_mst_branch)
2367                 mutex_lock(&aconnector->hpd_lock);
2368
2369
2370 #ifdef CONFIG_DRM_AMD_DC_HDCP
2371         if (dc_link_handle_hpd_rx_irq(dc_link, &hpd_irq_data, NULL) &&
2372 #else
2373         if (dc_link_handle_hpd_rx_irq(dc_link, NULL, NULL) &&
2374 #endif
2375                         !is_mst_root_connector) {
2376                 /* Downstream Port status changed. */
2377                 if (!dc_link_detect_sink(dc_link, &new_connection_type))
2378                         DRM_ERROR("KMS: Failed to detect connector\n");
2379
2380                 if (aconnector->base.force && new_connection_type == dc_connection_none) {
2381                         emulated_link_detect(dc_link);
2382
2383                         if (aconnector->fake_enable)
2384                                 aconnector->fake_enable = false;
2385
2386                         amdgpu_dm_update_connector_after_detect(aconnector);
2387
2388
2389                         drm_modeset_lock_all(dev);
2390                         dm_restore_drm_connector_state(dev, connector);
2391                         drm_modeset_unlock_all(dev);
2392
2393                         drm_kms_helper_hotplug_event(dev);
2394                 } else if (dc_link_detect(dc_link, DETECT_REASON_HPDRX)) {
2395
2396                         if (aconnector->fake_enable)
2397                                 aconnector->fake_enable = false;
2398
2399                         amdgpu_dm_update_connector_after_detect(aconnector);
2400
2401
2402                         drm_modeset_lock_all(dev);
2403                         dm_restore_drm_connector_state(dev, connector);
2404                         drm_modeset_unlock_all(dev);
2405
2406                         drm_kms_helper_hotplug_event(dev);
2407                 }
2408         }
2409 #ifdef CONFIG_DRM_AMD_DC_HDCP
2410         if (hpd_irq_data.bytes.device_service_irq.bits.CP_IRQ) {
2411                 if (adev->dm.hdcp_workqueue)
2412                         hdcp_handle_cpirq(adev->dm.hdcp_workqueue,  aconnector->base.index);
2413         }
2414 #endif
2415         if ((dc_link->cur_link_settings.lane_count != LANE_COUNT_UNKNOWN) ||
2416             (dc_link->type == dc_connection_mst_branch))
2417                 dm_handle_hpd_rx_irq(aconnector);
2418
2419         if (dc_link->type != dc_connection_mst_branch) {
2420                 drm_dp_cec_irq(&aconnector->dm_dp_aux.aux);
2421                 mutex_unlock(&aconnector->hpd_lock);
2422         }
2423 }
2424
2425 static void register_hpd_handlers(struct amdgpu_device *adev)
2426 {
2427         struct drm_device *dev = adev->ddev;
2428         struct drm_connector *connector;
2429         struct amdgpu_dm_connector *aconnector;
2430         const struct dc_link *dc_link;
2431         struct dc_interrupt_params int_params = {0};
2432
2433         int_params.requested_polarity = INTERRUPT_POLARITY_DEFAULT;
2434         int_params.current_polarity = INTERRUPT_POLARITY_DEFAULT;
2435
2436         list_for_each_entry(connector,
2437                         &dev->mode_config.connector_list, head) {
2438
2439                 aconnector = to_amdgpu_dm_connector(connector);
2440                 dc_link = aconnector->dc_link;
2441
2442                 if (DC_IRQ_SOURCE_INVALID != dc_link->irq_source_hpd) {
2443                         int_params.int_context = INTERRUPT_LOW_IRQ_CONTEXT;
2444                         int_params.irq_source = dc_link->irq_source_hpd;
2445
2446                         amdgpu_dm_irq_register_interrupt(adev, &int_params,
2447                                         handle_hpd_irq,
2448                                         (void *) aconnector);
2449                 }
2450
2451                 if (DC_IRQ_SOURCE_INVALID != dc_link->irq_source_hpd_rx) {
2452
2453                         /* Also register for DP short pulse (hpd_rx). */
2454                         int_params.int_context = INTERRUPT_LOW_IRQ_CONTEXT;
2455                         int_params.irq_source = dc_link->irq_source_hpd_rx;
2456
2457                         amdgpu_dm_irq_register_interrupt(adev, &int_params,
2458                                         handle_hpd_rx_irq,
2459                                         (void *) aconnector);
2460                 }
2461         }
2462 }
2463
2464 /* Register IRQ sources and initialize IRQ callbacks */
2465 static int dce110_register_irq_handlers(struct amdgpu_device *adev)
2466 {
2467         struct dc *dc = adev->dm.dc;
2468         struct common_irq_params *c_irq_params;
2469         struct dc_interrupt_params int_params = {0};
2470         int r;
2471         int i;
2472         unsigned client_id = AMDGPU_IRQ_CLIENTID_LEGACY;
2473
2474         if (adev->asic_type >= CHIP_VEGA10)
2475                 client_id = SOC15_IH_CLIENTID_DCE;
2476
2477         int_params.requested_polarity = INTERRUPT_POLARITY_DEFAULT;
2478         int_params.current_polarity = INTERRUPT_POLARITY_DEFAULT;
2479
2480         /*
2481          * Actions of amdgpu_irq_add_id():
2482          * 1. Register a set() function with base driver.
2483          *    Base driver will call set() function to enable/disable an
2484          *    interrupt in DC hardware.
2485          * 2. Register amdgpu_dm_irq_handler().
2486          *    Base driver will call amdgpu_dm_irq_handler() for ALL interrupts
2487          *    coming from DC hardware.
2488          *    amdgpu_dm_irq_handler() will re-direct the interrupt to DC
2489          *    for acknowledging and handling. */
2490
2491         /* Use VBLANK interrupt */
2492         for (i = VISLANDS30_IV_SRCID_D1_VERTICAL_INTERRUPT0; i <= VISLANDS30_IV_SRCID_D6_VERTICAL_INTERRUPT0; i++) {
2493                 r = amdgpu_irq_add_id(adev, client_id, i, &adev->crtc_irq);
2494                 if (r) {
2495                         DRM_ERROR("Failed to add crtc irq id!\n");
2496                         return r;
2497                 }
2498
2499                 int_params.int_context = INTERRUPT_HIGH_IRQ_CONTEXT;
2500                 int_params.irq_source =
2501                         dc_interrupt_to_irq_source(dc, i, 0);
2502
2503                 c_irq_params = &adev->dm.vblank_params[int_params.irq_source - DC_IRQ_SOURCE_VBLANK1];
2504
2505                 c_irq_params->adev = adev;
2506                 c_irq_params->irq_src = int_params.irq_source;
2507
2508                 amdgpu_dm_irq_register_interrupt(adev, &int_params,
2509                                 dm_crtc_high_irq, c_irq_params);
2510         }
2511
2512         /* Use VUPDATE interrupt */
2513         for (i = VISLANDS30_IV_SRCID_D1_V_UPDATE_INT; i <= VISLANDS30_IV_SRCID_D6_V_UPDATE_INT; i += 2) {
2514                 r = amdgpu_irq_add_id(adev, client_id, i, &adev->vupdate_irq);
2515                 if (r) {
2516                         DRM_ERROR("Failed to add vupdate irq id!\n");
2517                         return r;
2518                 }
2519
2520                 int_params.int_context = INTERRUPT_HIGH_IRQ_CONTEXT;
2521                 int_params.irq_source =
2522                         dc_interrupt_to_irq_source(dc, i, 0);
2523
2524                 c_irq_params = &adev->dm.vupdate_params[int_params.irq_source - DC_IRQ_SOURCE_VUPDATE1];
2525
2526                 c_irq_params->adev = adev;
2527                 c_irq_params->irq_src = int_params.irq_source;
2528
2529                 amdgpu_dm_irq_register_interrupt(adev, &int_params,
2530                                 dm_vupdate_high_irq, c_irq_params);
2531         }
2532
2533         /* Use GRPH_PFLIP interrupt */
2534         for (i = VISLANDS30_IV_SRCID_D1_GRPH_PFLIP;
2535                         i <= VISLANDS30_IV_SRCID_D6_GRPH_PFLIP; i += 2) {
2536                 r = amdgpu_irq_add_id(adev, client_id, i, &adev->pageflip_irq);
2537                 if (r) {
2538                         DRM_ERROR("Failed to add page flip irq id!\n");
2539                         return r;
2540                 }
2541
2542                 int_params.int_context = INTERRUPT_HIGH_IRQ_CONTEXT;
2543                 int_params.irq_source =
2544                         dc_interrupt_to_irq_source(dc, i, 0);
2545
2546                 c_irq_params = &adev->dm.pflip_params[int_params.irq_source - DC_IRQ_SOURCE_PFLIP_FIRST];
2547
2548                 c_irq_params->adev = adev;
2549                 c_irq_params->irq_src = int_params.irq_source;
2550
2551                 amdgpu_dm_irq_register_interrupt(adev, &int_params,
2552                                 dm_pflip_high_irq, c_irq_params);
2553
2554         }
2555
2556         /* HPD */
2557         r = amdgpu_irq_add_id(adev, client_id,
2558                         VISLANDS30_IV_SRCID_HOTPLUG_DETECT_A, &adev->hpd_irq);
2559         if (r) {
2560                 DRM_ERROR("Failed to add hpd irq id!\n");
2561                 return r;
2562         }
2563
2564         register_hpd_handlers(adev);
2565
2566         return 0;
2567 }
2568
2569 #if defined(CONFIG_DRM_AMD_DC_DCN)
2570 /* Register IRQ sources and initialize IRQ callbacks */
2571 static int dcn10_register_irq_handlers(struct amdgpu_device *adev)
2572 {
2573         struct dc *dc = adev->dm.dc;
2574         struct common_irq_params *c_irq_params;
2575         struct dc_interrupt_params int_params = {0};
2576         int r;
2577         int i;
2578
2579         int_params.requested_polarity = INTERRUPT_POLARITY_DEFAULT;
2580         int_params.current_polarity = INTERRUPT_POLARITY_DEFAULT;
2581
2582         /*
2583          * Actions of amdgpu_irq_add_id():
2584          * 1. Register a set() function with base driver.
2585          *    Base driver will call set() function to enable/disable an
2586          *    interrupt in DC hardware.
2587          * 2. Register amdgpu_dm_irq_handler().
2588          *    Base driver will call amdgpu_dm_irq_handler() for ALL interrupts
2589          *    coming from DC hardware.
2590          *    amdgpu_dm_irq_handler() will re-direct the interrupt to DC
2591          *    for acknowledging and handling.
2592          */
2593
2594         /* Use VSTARTUP interrupt */
2595         for (i = DCN_1_0__SRCID__DC_D1_OTG_VSTARTUP;
2596                         i <= DCN_1_0__SRCID__DC_D1_OTG_VSTARTUP + adev->mode_info.num_crtc - 1;
2597                         i++) {
2598                 r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_DCE, i, &adev->crtc_irq);
2599
2600                 if (r) {
2601                         DRM_ERROR("Failed to add crtc irq id!\n");
2602                         return r;
2603                 }
2604
2605                 int_params.int_context = INTERRUPT_HIGH_IRQ_CONTEXT;
2606                 int_params.irq_source =
2607                         dc_interrupt_to_irq_source(dc, i, 0);
2608
2609                 c_irq_params = &adev->dm.vblank_params[int_params.irq_source - DC_IRQ_SOURCE_VBLANK1];
2610
2611                 c_irq_params->adev = adev;
2612                 c_irq_params->irq_src = int_params.irq_source;
2613
2614                 amdgpu_dm_irq_register_interrupt(
2615                         adev, &int_params, dm_crtc_high_irq, c_irq_params);
2616         }
2617
2618         /* Use VUPDATE_NO_LOCK interrupt on DCN, which seems to correspond to
2619          * the regular VUPDATE interrupt on DCE. We want DC_IRQ_SOURCE_VUPDATEx
2620          * to trigger at end of each vblank, regardless of state of the lock,
2621          * matching DCE behaviour.
2622          */
2623         for (i = DCN_1_0__SRCID__OTG0_IHC_V_UPDATE_NO_LOCK_INTERRUPT;
2624              i <= DCN_1_0__SRCID__OTG0_IHC_V_UPDATE_NO_LOCK_INTERRUPT + adev->mode_info.num_crtc - 1;
2625              i++) {
2626                 r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_DCE, i, &adev->vupdate_irq);
2627
2628                 if (r) {
2629                         DRM_ERROR("Failed to add vupdate irq id!\n");
2630                         return r;
2631                 }
2632
2633                 int_params.int_context = INTERRUPT_HIGH_IRQ_CONTEXT;
2634                 int_params.irq_source =
2635                         dc_interrupt_to_irq_source(dc, i, 0);
2636
2637                 c_irq_params = &adev->dm.vupdate_params[int_params.irq_source - DC_IRQ_SOURCE_VUPDATE1];
2638
2639                 c_irq_params->adev = adev;
2640                 c_irq_params->irq_src = int_params.irq_source;
2641
2642                 amdgpu_dm_irq_register_interrupt(adev, &int_params,
2643                                 dm_vupdate_high_irq, c_irq_params);
2644         }
2645
2646         /* Use GRPH_PFLIP interrupt */
2647         for (i = DCN_1_0__SRCID__HUBP0_FLIP_INTERRUPT;
2648                         i <= DCN_1_0__SRCID__HUBP0_FLIP_INTERRUPT + adev->mode_info.num_crtc - 1;
2649                         i++) {
2650                 r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_DCE, i, &adev->pageflip_irq);
2651                 if (r) {
2652                         DRM_ERROR("Failed to add page flip irq id!\n");
2653                         return r;
2654                 }
2655
2656                 int_params.int_context = INTERRUPT_HIGH_IRQ_CONTEXT;
2657                 int_params.irq_source =
2658                         dc_interrupt_to_irq_source(dc, i, 0);
2659
2660                 c_irq_params = &adev->dm.pflip_params[int_params.irq_source - DC_IRQ_SOURCE_PFLIP_FIRST];
2661
2662                 c_irq_params->adev = adev;
2663                 c_irq_params->irq_src = int_params.irq_source;
2664
2665                 amdgpu_dm_irq_register_interrupt(adev, &int_params,
2666                                 dm_pflip_high_irq, c_irq_params);
2667
2668         }
2669
2670         /* HPD */
2671         r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_DCE, DCN_1_0__SRCID__DC_HPD1_INT,
2672                         &adev->hpd_irq);
2673         if (r) {
2674                 DRM_ERROR("Failed to add hpd irq id!\n");
2675                 return r;
2676         }
2677
2678         register_hpd_handlers(adev);
2679
2680         return 0;
2681 }
2682 #endif
2683
2684 /*
2685  * Acquires the lock for the atomic state object and returns
2686  * the new atomic state.
2687  *
2688  * This should only be called during atomic check.
2689  */
2690 static int dm_atomic_get_state(struct drm_atomic_state *state,
2691                                struct dm_atomic_state **dm_state)
2692 {
2693         struct drm_device *dev = state->dev;
2694         struct amdgpu_device *adev = dev->dev_private;
2695         struct amdgpu_display_manager *dm = &adev->dm;
2696         struct drm_private_state *priv_state;
2697
2698         if (*dm_state)
2699                 return 0;
2700
2701         priv_state = drm_atomic_get_private_obj_state(state, &dm->atomic_obj);
2702         if (IS_ERR(priv_state))
2703                 return PTR_ERR(priv_state);
2704
2705         *dm_state = to_dm_atomic_state(priv_state);
2706
2707         return 0;
2708 }
2709
2710 struct dm_atomic_state *
2711 dm_atomic_get_new_state(struct drm_atomic_state *state)
2712 {
2713         struct drm_device *dev = state->dev;
2714         struct amdgpu_device *adev = dev->dev_private;
2715         struct amdgpu_display_manager *dm = &adev->dm;
2716         struct drm_private_obj *obj;
2717         struct drm_private_state *new_obj_state;
2718         int i;
2719
2720         for_each_new_private_obj_in_state(state, obj, new_obj_state, i) {
2721                 if (obj->funcs == dm->atomic_obj.funcs)
2722                         return to_dm_atomic_state(new_obj_state);
2723         }
2724
2725         return NULL;
2726 }
2727
2728 struct dm_atomic_state *
2729 dm_atomic_get_old_state(struct drm_atomic_state *state)
2730 {
2731         struct drm_device *dev = state->dev;
2732         struct amdgpu_device *adev = dev->dev_private;
2733         struct amdgpu_display_manager *dm = &adev->dm;
2734         struct drm_private_obj *obj;
2735         struct drm_private_state *old_obj_state;
2736         int i;
2737
2738         for_each_old_private_obj_in_state(state, obj, old_obj_state, i) {
2739                 if (obj->funcs == dm->atomic_obj.funcs)
2740                         return to_dm_atomic_state(old_obj_state);
2741         }
2742
2743         return NULL;
2744 }
2745
2746 static struct drm_private_state *
2747 dm_atomic_duplicate_state(struct drm_private_obj *obj)
2748 {
2749         struct dm_atomic_state *old_state, *new_state;
2750
2751         new_state = kzalloc(sizeof(*new_state), GFP_KERNEL);
2752         if (!new_state)
2753                 return NULL;
2754
2755         __drm_atomic_helper_private_obj_duplicate_state(obj, &new_state->base);
2756
2757         old_state = to_dm_atomic_state(obj->state);
2758
2759         if (old_state && old_state->context)
2760                 new_state->context = dc_copy_state(old_state->context);
2761
2762         if (!new_state->context) {
2763                 kfree(new_state);
2764                 return NULL;
2765         }
2766
2767         return &new_state->base;
2768 }
2769
2770 static void dm_atomic_destroy_state(struct drm_private_obj *obj,
2771                                     struct drm_private_state *state)
2772 {
2773         struct dm_atomic_state *dm_state = to_dm_atomic_state(state);
2774
2775         if (dm_state && dm_state->context)
2776                 dc_release_state(dm_state->context);
2777
2778         kfree(dm_state);
2779 }
2780
2781 static struct drm_private_state_funcs dm_atomic_state_funcs = {
2782         .atomic_duplicate_state = dm_atomic_duplicate_state,
2783         .atomic_destroy_state = dm_atomic_destroy_state,
2784 };
2785
2786 static int amdgpu_dm_mode_config_init(struct amdgpu_device *adev)
2787 {
2788         struct dm_atomic_state *state;
2789         int r;
2790
2791         adev->mode_info.mode_config_initialized = true;
2792
2793         adev->ddev->mode_config.funcs = (void *)&amdgpu_dm_mode_funcs;
2794         adev->ddev->mode_config.helper_private = &amdgpu_dm_mode_config_helperfuncs;
2795
2796         adev->ddev->mode_config.max_width = 16384;
2797         adev->ddev->mode_config.max_height = 16384;
2798
2799         adev->ddev->mode_config.preferred_depth = 24;
2800         adev->ddev->mode_config.prefer_shadow = 1;
2801         /* indicates support for immediate flip */
2802         adev->ddev->mode_config.async_page_flip = true;
2803
2804         adev->ddev->mode_config.fb_base = adev->gmc.aper_base;
2805
2806         state = kzalloc(sizeof(*state), GFP_KERNEL);
2807         if (!state)
2808                 return -ENOMEM;
2809
2810         state->context = dc_create_state(adev->dm.dc);
2811         if (!state->context) {
2812                 kfree(state);
2813                 return -ENOMEM;
2814         }
2815
2816         dc_resource_state_copy_construct_current(adev->dm.dc, state->context);
2817
2818         drm_atomic_private_obj_init(adev->ddev,
2819                                     &adev->dm.atomic_obj,
2820                                     &state->base,
2821                                     &dm_atomic_state_funcs);
2822
2823         r = amdgpu_display_modeset_create_props(adev);
2824         if (r)
2825                 return r;
2826
2827         r = amdgpu_dm_audio_init(adev);
2828         if (r)
2829                 return r;
2830
2831         return 0;
2832 }
2833
2834 #define AMDGPU_DM_DEFAULT_MIN_BACKLIGHT 12
2835 #define AMDGPU_DM_DEFAULT_MAX_BACKLIGHT 255
2836 #define AUX_BL_DEFAULT_TRANSITION_TIME_MS 50
2837
2838 #if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) ||\
2839         defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
2840
2841 static void amdgpu_dm_update_backlight_caps(struct amdgpu_display_manager *dm)
2842 {
2843 #if defined(CONFIG_ACPI)
2844         struct amdgpu_dm_backlight_caps caps;
2845
2846         if (dm->backlight_caps.caps_valid)
2847                 return;
2848
2849         amdgpu_acpi_get_backlight_caps(dm->adev, &caps);
2850         if (caps.caps_valid) {
2851                 dm->backlight_caps.caps_valid = true;
2852                 if (caps.aux_support)
2853                         return;
2854                 dm->backlight_caps.min_input_signal = caps.min_input_signal;
2855                 dm->backlight_caps.max_input_signal = caps.max_input_signal;
2856         } else {
2857                 dm->backlight_caps.min_input_signal =
2858                                 AMDGPU_DM_DEFAULT_MIN_BACKLIGHT;
2859                 dm->backlight_caps.max_input_signal =
2860                                 AMDGPU_DM_DEFAULT_MAX_BACKLIGHT;
2861         }
2862 #else
2863         if (dm->backlight_caps.aux_support)
2864                 return;
2865
2866         dm->backlight_caps.min_input_signal = AMDGPU_DM_DEFAULT_MIN_BACKLIGHT;
2867         dm->backlight_caps.max_input_signal = AMDGPU_DM_DEFAULT_MAX_BACKLIGHT;
2868 #endif
2869 }
2870
2871 static int set_backlight_via_aux(struct dc_link *link, uint32_t brightness)
2872 {
2873         bool rc;
2874
2875         if (!link)
2876                 return 1;
2877
2878         rc = dc_link_set_backlight_level_nits(link, true, brightness,
2879                                               AUX_BL_DEFAULT_TRANSITION_TIME_MS);
2880
2881         return rc ? 0 : 1;
2882 }
2883
2884 static u32 convert_brightness(const struct amdgpu_dm_backlight_caps *caps,
2885                               const uint32_t user_brightness)
2886 {
2887         u32 min, max, conversion_pace;
2888         u32 brightness = user_brightness;
2889
2890         if (!caps)
2891                 goto out;
2892
2893         if (!caps->aux_support) {
2894                 max = caps->max_input_signal;
2895                 min = caps->min_input_signal;
2896                 /*
2897                  * The brightness input is in the range 0-255
2898                  * It needs to be rescaled to be between the
2899                  * requested min and max input signal
2900                  * It also needs to be scaled up by 0x101 to
2901                  * match the DC interface which has a range of
2902                  * 0 to 0xffff
2903                  */
2904                 conversion_pace = 0x101;
2905                 brightness =
2906                         user_brightness
2907                         * conversion_pace
2908                         * (max - min)
2909                         / AMDGPU_MAX_BL_LEVEL
2910                         + min * conversion_pace;
2911         } else {
2912                 /* TODO
2913                  * We are doing a linear interpolation here, which is OK but
2914                  * does not provide the optimal result. We probably want
2915                  * something close to the Perceptual Quantizer (PQ) curve.
2916                  */
2917                 max = caps->aux_max_input_signal;
2918                 min = caps->aux_min_input_signal;
2919
2920                 brightness = (AMDGPU_MAX_BL_LEVEL - user_brightness) * min
2921                                + user_brightness * max;
2922                 // Multiple the value by 1000 since we use millinits
2923                 brightness *= 1000;
2924                 brightness = DIV_ROUND_CLOSEST(brightness, AMDGPU_MAX_BL_LEVEL);
2925         }
2926
2927 out:
2928         return brightness;
2929 }
2930
2931 static int amdgpu_dm_backlight_update_status(struct backlight_device *bd)
2932 {
2933         struct amdgpu_display_manager *dm = bl_get_data(bd);
2934         struct amdgpu_dm_backlight_caps caps;
2935         struct dc_link *link = NULL;
2936         u32 brightness;
2937         bool rc;
2938
2939         amdgpu_dm_update_backlight_caps(dm);
2940         caps = dm->backlight_caps;
2941
2942         link = (struct dc_link *)dm->backlight_link;
2943
2944         brightness = convert_brightness(&caps, bd->props.brightness);
2945         // Change brightness based on AUX property
2946         if (caps.aux_support)
2947                 return set_backlight_via_aux(link, brightness);
2948
2949         rc = dc_link_set_backlight_level(dm->backlight_link, brightness, 0);
2950
2951         return rc ? 0 : 1;
2952 }
2953
2954 static int amdgpu_dm_backlight_get_brightness(struct backlight_device *bd)
2955 {
2956         struct amdgpu_display_manager *dm = bl_get_data(bd);
2957         int ret = dc_link_get_backlight_level(dm->backlight_link);
2958
2959         if (ret == DC_ERROR_UNEXPECTED)
2960                 return bd->props.brightness;
2961         return ret;
2962 }
2963
2964 static const struct backlight_ops amdgpu_dm_backlight_ops = {
2965         .options = BL_CORE_SUSPENDRESUME,
2966         .get_brightness = amdgpu_dm_backlight_get_brightness,
2967         .update_status  = amdgpu_dm_backlight_update_status,
2968 };
2969
2970 static void
2971 amdgpu_dm_register_backlight_device(struct amdgpu_display_manager *dm)
2972 {
2973         char bl_name[16];
2974         struct backlight_properties props = { 0 };
2975
2976         amdgpu_dm_update_backlight_caps(dm);
2977
2978         props.max_brightness = AMDGPU_MAX_BL_LEVEL;
2979         props.brightness = AMDGPU_MAX_BL_LEVEL;
2980         props.type = BACKLIGHT_RAW;
2981
2982         snprintf(bl_name, sizeof(bl_name), "amdgpu_bl%d",
2983                         dm->adev->ddev->primary->index);
2984
2985         dm->backlight_dev = backlight_device_register(bl_name,
2986                         dm->adev->ddev->dev,
2987                         dm,
2988                         &amdgpu_dm_backlight_ops,
2989                         &props);
2990
2991         if (IS_ERR(dm->backlight_dev))
2992                 DRM_ERROR("DM: Backlight registration failed!\n");
2993         else
2994                 DRM_DEBUG_DRIVER("DM: Registered Backlight device: %s\n", bl_name);
2995 }
2996
2997 #endif
2998
2999 static int initialize_plane(struct amdgpu_display_manager *dm,
3000                             struct amdgpu_mode_info *mode_info, int plane_id,
3001                             enum drm_plane_type plane_type,
3002                             const struct dc_plane_cap *plane_cap)
3003 {
3004         struct drm_plane *plane;
3005         unsigned long possible_crtcs;
3006         int ret = 0;
3007
3008         plane = kzalloc(sizeof(struct drm_plane), GFP_KERNEL);
3009         if (!plane) {
3010                 DRM_ERROR("KMS: Failed to allocate plane\n");
3011                 return -ENOMEM;
3012         }
3013         plane->type = plane_type;
3014
3015         /*
3016          * HACK: IGT tests expect that the primary plane for a CRTC
3017          * can only have one possible CRTC. Only expose support for
3018          * any CRTC if they're not going to be used as a primary plane
3019          * for a CRTC - like overlay or underlay planes.
3020          */
3021         possible_crtcs = 1 << plane_id;
3022         if (plane_id >= dm->dc->caps.max_streams)
3023                 possible_crtcs = 0xff;
3024
3025         ret = amdgpu_dm_plane_init(dm, plane, possible_crtcs, plane_cap);
3026
3027         if (ret) {
3028                 DRM_ERROR("KMS: Failed to initialize plane\n");
3029                 kfree(plane);
3030                 return ret;
3031         }
3032
3033         if (mode_info)
3034                 mode_info->planes[plane_id] = plane;
3035
3036         return ret;
3037 }
3038
3039
3040 static void register_backlight_device(struct amdgpu_display_manager *dm,
3041                                       struct dc_link *link)
3042 {
3043 #if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) ||\
3044         defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
3045
3046         if ((link->connector_signal & (SIGNAL_TYPE_EDP | SIGNAL_TYPE_LVDS)) &&
3047             link->type != dc_connection_none) {
3048                 /*
3049                  * Event if registration failed, we should continue with
3050                  * DM initialization because not having a backlight control
3051                  * is better then a black screen.
3052                  */
3053                 amdgpu_dm_register_backlight_device(dm);
3054
3055                 if (dm->backlight_dev)
3056                         dm->backlight_link = link;
3057         }
3058 #endif
3059 }
3060
3061
3062 /*
3063  * In this architecture, the association
3064  * connector -> encoder -> crtc
3065  * id not really requried. The crtc and connector will hold the
3066  * display_index as an abstraction to use with DAL component
3067  *
3068  * Returns 0 on success
3069  */
3070 static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
3071 {
3072         struct amdgpu_display_manager *dm = &adev->dm;
3073         int32_t i;
3074         struct amdgpu_dm_connector *aconnector = NULL;
3075         struct amdgpu_encoder *aencoder = NULL;
3076         struct amdgpu_mode_info *mode_info = &adev->mode_info;
3077         uint32_t link_cnt;
3078         int32_t primary_planes;
3079         enum dc_connection_type new_connection_type = dc_connection_none;
3080         const struct dc_plane_cap *plane;
3081
3082         link_cnt = dm->dc->caps.max_links;
3083         if (amdgpu_dm_mode_config_init(dm->adev)) {
3084                 DRM_ERROR("DM: Failed to initialize mode config\n");
3085                 return -EINVAL;
3086         }
3087
3088         /* There is one primary plane per CRTC */
3089         primary_planes = dm->dc->caps.max_streams;
3090         ASSERT(primary_planes <= AMDGPU_MAX_PLANES);
3091
3092         /*
3093          * Initialize primary planes, implicit planes for legacy IOCTLS.
3094          * Order is reversed to match iteration order in atomic check.
3095          */
3096         for (i = (primary_planes - 1); i >= 0; i--) {
3097                 plane = &dm->dc->caps.planes[i];
3098
3099                 if (initialize_plane(dm, mode_info, i,
3100                                      DRM_PLANE_TYPE_PRIMARY, plane)) {
3101                         DRM_ERROR("KMS: Failed to initialize primary plane\n");
3102                         goto fail;
3103                 }
3104         }
3105
3106         /*
3107          * Initialize overlay planes, index starting after primary planes.
3108          * These planes have a higher DRM index than the primary planes since
3109          * they should be considered as having a higher z-order.
3110          * Order is reversed to match iteration order in atomic check.
3111          *
3112          * Only support DCN for now, and only expose one so we don't encourage
3113          * userspace to use up all the pipes.
3114          */
3115         for (i = 0; i < dm->dc->caps.max_planes; ++i) {
3116                 struct dc_plane_cap *plane = &dm->dc->caps.planes[i];
3117
3118                 if (plane->type != DC_PLANE_TYPE_DCN_UNIVERSAL)
3119                         continue;
3120
3121                 if (!plane->blends_with_above || !plane->blends_with_below)
3122                         continue;
3123
3124                 if (!plane->pixel_format_support.argb8888)
3125                         continue;
3126
3127                 if (initialize_plane(dm, NULL, primary_planes + i,
3128                                      DRM_PLANE_TYPE_OVERLAY, plane)) {
3129                         DRM_ERROR("KMS: Failed to initialize overlay plane\n");
3130                         goto fail;
3131                 }
3132
3133                 /* Only create one overlay plane. */
3134                 break;
3135         }
3136
3137         for (i = 0; i < dm->dc->caps.max_streams; i++)
3138                 if (amdgpu_dm_crtc_init(dm, mode_info->planes[i], i)) {
3139                         DRM_ERROR("KMS: Failed to initialize crtc\n");
3140                         goto fail;
3141                 }
3142
3143         dm->display_indexes_num = dm->dc->caps.max_streams;
3144
3145         /* loops over all connectors on the board */
3146         for (i = 0; i < link_cnt; i++) {
3147                 struct dc_link *link = NULL;
3148
3149                 if (i > AMDGPU_DM_MAX_DISPLAY_INDEX) {
3150                         DRM_ERROR(
3151                                 "KMS: Cannot support more than %d display indexes\n",
3152                                         AMDGPU_DM_MAX_DISPLAY_INDEX);
3153                         continue;
3154                 }
3155
3156                 aconnector = kzalloc(sizeof(*aconnector), GFP_KERNEL);
3157                 if (!aconnector)
3158                         goto fail;
3159
3160                 aencoder = kzalloc(sizeof(*aencoder), GFP_KERNEL);
3161                 if (!aencoder)
3162                         goto fail;
3163
3164                 if (amdgpu_dm_encoder_init(dm->ddev, aencoder, i)) {
3165                         DRM_ERROR("KMS: Failed to initialize encoder\n");
3166                         goto fail;
3167                 }
3168
3169                 if (amdgpu_dm_connector_init(dm, aconnector, i, aencoder)) {
3170                         DRM_ERROR("KMS: Failed to initialize connector\n");
3171                         goto fail;
3172                 }
3173
3174                 link = dc_get_link_at_index(dm->dc, i);
3175
3176                 if (!dc_link_detect_sink(link, &new_connection_type))
3177                         DRM_ERROR("KMS: Failed to detect connector\n");
3178
3179                 if (aconnector->base.force && new_connection_type == dc_connection_none) {
3180                         emulated_link_detect(link);
3181                         amdgpu_dm_update_connector_after_detect(aconnector);
3182
3183                 } else if (dc_link_detect(link, DETECT_REASON_BOOT)) {
3184                         amdgpu_dm_update_connector_after_detect(aconnector);
3185                         register_backlight_device(dm, link);
3186                         if (amdgpu_dc_feature_mask & DC_PSR_MASK)
3187                                 amdgpu_dm_set_psr_caps(link);
3188                 }
3189
3190
3191         }
3192
3193         /* Software is initialized. Now we can register interrupt handlers. */
3194         switch (adev->asic_type) {
3195         case CHIP_BONAIRE:
3196         case CHIP_HAWAII:
3197         case CHIP_KAVERI:
3198         case CHIP_KABINI:
3199         case CHIP_MULLINS:
3200         case CHIP_TONGA:
3201         case CHIP_FIJI:
3202         case CHIP_CARRIZO:
3203         case CHIP_STONEY:
3204         case CHIP_POLARIS11:
3205         case CHIP_POLARIS10:
3206         case CHIP_POLARIS12:
3207         case CHIP_VEGAM:
3208         case CHIP_VEGA10:
3209         case CHIP_VEGA12:
3210         case CHIP_VEGA20:
3211                 if (dce110_register_irq_handlers(dm->adev)) {
3212                         DRM_ERROR("DM: Failed to initialize IRQ\n");
3213                         goto fail;
3214                 }
3215                 break;
3216 #if defined(CONFIG_DRM_AMD_DC_DCN)
3217         case CHIP_RAVEN:
3218         case CHIP_NAVI12:
3219         case CHIP_NAVI10:
3220         case CHIP_NAVI14:
3221         case CHIP_RENOIR:
3222                 if (dcn10_register_irq_handlers(dm->adev)) {
3223                         DRM_ERROR("DM: Failed to initialize IRQ\n");
3224                         goto fail;
3225                 }
3226                 break;
3227 #endif
3228         default:
3229                 DRM_ERROR("Unsupported ASIC type: 0x%X\n", adev->asic_type);
3230                 goto fail;
3231         }
3232
3233         /* No userspace support. */
3234         dm->dc->debug.disable_tri_buf = true;
3235
3236         return 0;
3237 fail:
3238         kfree(aencoder);
3239         kfree(aconnector);
3240
3241         return -EINVAL;
3242 }
3243
3244 static void amdgpu_dm_destroy_drm_device(struct amdgpu_display_manager *dm)
3245 {
3246         drm_mode_config_cleanup(dm->ddev);
3247         drm_atomic_private_obj_fini(&dm->atomic_obj);
3248         return;
3249 }
3250
3251 /******************************************************************************
3252  * amdgpu_display_funcs functions
3253  *****************************************************************************/
3254
3255 /*
3256  * dm_bandwidth_update - program display watermarks
3257  *
3258  * @adev: amdgpu_device pointer
3259  *
3260  * Calculate and program the display watermarks and line buffer allocation.
3261  */
3262 static void dm_bandwidth_update(struct amdgpu_device *adev)
3263 {
3264         /* TODO: implement later */
3265 }
3266
3267 static const struct amdgpu_display_funcs dm_display_funcs = {
3268         .bandwidth_update = dm_bandwidth_update, /* called unconditionally */
3269         .vblank_get_counter = dm_vblank_get_counter,/* called unconditionally */
3270         .backlight_set_level = NULL, /* never called for DC */
3271         .backlight_get_level = NULL, /* never called for DC */
3272         .hpd_sense = NULL,/* called unconditionally */
3273         .hpd_set_polarity = NULL, /* called unconditionally */
3274         .hpd_get_gpio_reg = NULL, /* VBIOS parsing. DAL does it. */
3275         .page_flip_get_scanoutpos =
3276                 dm_crtc_get_scanoutpos,/* called unconditionally */
3277         .add_encoder = NULL, /* VBIOS parsing. DAL does it. */
3278         .add_connector = NULL, /* VBIOS parsing. DAL does it. */
3279 };
3280
3281 #if defined(CONFIG_DEBUG_KERNEL_DC)
3282
3283 static ssize_t s3_debug_store(struct device *device,
3284                               struct device_attribute *attr,
3285                               const char *buf,
3286                               size_t count)
3287 {
3288         int ret;
3289         int s3_state;
3290         struct drm_device *drm_dev = dev_get_drvdata(device);
3291         struct amdgpu_device *adev = drm_dev->dev_private;
3292
3293         ret = kstrtoint(buf, 0, &s3_state);
3294
3295         if (ret == 0) {
3296                 if (s3_state) {
3297                         dm_resume(adev);
3298                         drm_kms_helper_hotplug_event(adev->ddev);
3299                 } else
3300                         dm_suspend(adev);
3301         }
3302
3303         return ret == 0 ? count : 0;
3304 }
3305
3306 DEVICE_ATTR_WO(s3_debug);
3307
3308 #endif
3309
3310 static int dm_early_init(void *handle)
3311 {
3312         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
3313
3314         switch (adev->asic_type) {
3315         case CHIP_BONAIRE:
3316         case CHIP_HAWAII:
3317                 adev->mode_info.num_crtc = 6;
3318                 adev->mode_info.num_hpd = 6;
3319                 adev->mode_info.num_dig = 6;
3320                 break;
3321         case CHIP_KAVERI:
3322                 adev->mode_info.num_crtc = 4;
3323                 adev->mode_info.num_hpd = 6;
3324                 adev->mode_info.num_dig = 7;
3325                 break;
3326         case CHIP_KABINI:
3327         case CHIP_MULLINS:
3328                 adev->mode_info.num_crtc = 2;
3329                 adev->mode_info.num_hpd = 6;
3330                 adev->mode_info.num_dig = 6;
3331                 break;
3332         case CHIP_FIJI:
3333         case CHIP_TONGA:
3334                 adev->mode_info.num_crtc = 6;
3335                 adev->mode_info.num_hpd = 6;
3336                 adev->mode_info.num_dig = 7;
3337                 break;
3338         case CHIP_CARRIZO:
3339                 adev->mode_info.num_crtc = 3;
3340                 adev->mode_info.num_hpd = 6;
3341                 adev->mode_info.num_dig = 9;
3342                 break;
3343         case CHIP_STONEY:
3344                 adev->mode_info.num_crtc = 2;
3345                 adev->mode_info.num_hpd = 6;
3346                 adev->mode_info.num_dig = 9;
3347                 break;
3348         case CHIP_POLARIS11:
3349         case CHIP_POLARIS12:
3350                 adev->mode_info.num_crtc = 5;
3351                 adev->mode_info.num_hpd = 5;
3352                 adev->mode_info.num_dig = 5;
3353                 break;
3354         case CHIP_POLARIS10:
3355         case CHIP_VEGAM:
3356                 adev->mode_info.num_crtc = 6;
3357                 adev->mode_info.num_hpd = 6;
3358                 adev->mode_info.num_dig = 6;
3359                 break;
3360         case CHIP_VEGA10:
3361         case CHIP_VEGA12:
3362         case CHIP_VEGA20:
3363                 adev->mode_info.num_crtc = 6;
3364                 adev->mode_info.num_hpd = 6;
3365                 adev->mode_info.num_dig = 6;
3366                 break;
3367 #if defined(CONFIG_DRM_AMD_DC_DCN)
3368         case CHIP_RAVEN:
3369                 adev->mode_info.num_crtc = 4;
3370                 adev->mode_info.num_hpd = 4;
3371                 adev->mode_info.num_dig = 4;
3372                 break;
3373 #endif
3374         case CHIP_NAVI10:
3375         case CHIP_NAVI12:
3376                 adev->mode_info.num_crtc = 6;
3377                 adev->mode_info.num_hpd = 6;
3378                 adev->mode_info.num_dig = 6;
3379                 break;
3380         case CHIP_NAVI14:
3381                 adev->mode_info.num_crtc = 5;
3382                 adev->mode_info.num_hpd = 5;
3383                 adev->mode_info.num_dig = 5;
3384                 break;
3385         case CHIP_RENOIR:
3386                 adev->mode_info.num_crtc = 4;
3387                 adev->mode_info.num_hpd = 4;
3388                 adev->mode_info.num_dig = 4;
3389                 break;
3390         default:
3391                 DRM_ERROR("Unsupported ASIC type: 0x%X\n", adev->asic_type);
3392                 return -EINVAL;
3393         }
3394
3395         amdgpu_dm_set_irq_funcs(adev);
3396
3397         if (adev->mode_info.funcs == NULL)
3398                 adev->mode_info.funcs = &dm_display_funcs;
3399
3400         /*
3401          * Note: Do NOT change adev->audio_endpt_rreg and
3402          * adev->audio_endpt_wreg because they are initialised in
3403          * amdgpu_device_init()
3404          */
3405 #if defined(CONFIG_DEBUG_KERNEL_DC)
3406         device_create_file(
3407                 adev->ddev->dev,
3408                 &dev_attr_s3_debug);
3409 #endif
3410
3411         return 0;
3412 }
3413
3414 static bool modeset_required(struct drm_crtc_state *crtc_state,
3415                              struct dc_stream_state *new_stream,
3416                              struct dc_stream_state *old_stream)
3417 {
3418         if (!drm_atomic_crtc_needs_modeset(crtc_state))
3419                 return false;
3420
3421         if (!crtc_state->enable)
3422                 return false;
3423
3424         return crtc_state->active;
3425 }
3426
3427 static bool modereset_required(struct drm_crtc_state *crtc_state)
3428 {
3429         if (!drm_atomic_crtc_needs_modeset(crtc_state))
3430                 return false;
3431
3432         return !crtc_state->enable || !crtc_state->active;
3433 }
3434
3435 static void amdgpu_dm_encoder_destroy(struct drm_encoder *encoder)
3436 {
3437         drm_encoder_cleanup(encoder);
3438         kfree(encoder);
3439 }
3440
3441 static const struct drm_encoder_funcs amdgpu_dm_encoder_funcs = {
3442         .destroy = amdgpu_dm_encoder_destroy,
3443 };
3444
3445
3446 static int fill_dc_scaling_info(const struct drm_plane_state *state,
3447                                 struct dc_scaling_info *scaling_info)
3448 {
3449         int scale_w, scale_h;
3450
3451         memset(scaling_info, 0, sizeof(*scaling_info));
3452
3453         /* Source is fixed 16.16 but we ignore mantissa for now... */
3454         scaling_info->src_rect.x = state->src_x >> 16;
3455         scaling_info->src_rect.y = state->src_y >> 16;
3456
3457         scaling_info->src_rect.width = state->src_w >> 16;
3458         if (scaling_info->src_rect.width == 0)
3459                 return -EINVAL;
3460
3461         scaling_info->src_rect.height = state->src_h >> 16;
3462         if (scaling_info->src_rect.height == 0)
3463                 return -EINVAL;
3464
3465         scaling_info->dst_rect.x = state->crtc_x;
3466         scaling_info->dst_rect.y = state->crtc_y;
3467
3468         if (state->crtc_w == 0)
3469                 return -EINVAL;
3470
3471         scaling_info->dst_rect.width = state->crtc_w;
3472
3473         if (state->crtc_h == 0)
3474                 return -EINVAL;
3475
3476         scaling_info->dst_rect.height = state->crtc_h;
3477
3478         /* DRM doesn't specify clipping on destination output. */
3479         scaling_info->clip_rect = scaling_info->dst_rect;
3480
3481         /* TODO: Validate scaling per-format with DC plane caps */
3482         scale_w = scaling_info->dst_rect.width * 1000 /
3483                   scaling_info->src_rect.width;
3484
3485         if (scale_w < 250 || scale_w > 16000)
3486                 return -EINVAL;
3487
3488         scale_h = scaling_info->dst_rect.height * 1000 /
3489                   scaling_info->src_rect.height;
3490
3491         if (scale_h < 250 || scale_h > 16000)
3492                 return -EINVAL;
3493
3494         /*
3495          * The "scaling_quality" can be ignored for now, quality = 0 has DC
3496          * assume reasonable defaults based on the format.
3497          */
3498
3499         return 0;
3500 }
3501
3502 static int get_fb_info(const struct amdgpu_framebuffer *amdgpu_fb,
3503                        uint64_t *tiling_flags, bool *tmz_surface)
3504 {
3505         struct amdgpu_bo *rbo = gem_to_amdgpu_bo(amdgpu_fb->base.obj[0]);
3506         int r = amdgpu_bo_reserve(rbo, false);
3507
3508         if (unlikely(r)) {
3509                 /* Don't show error message when returning -ERESTARTSYS */
3510                 if (r != -ERESTARTSYS)
3511                         DRM_ERROR("Unable to reserve buffer: %d\n", r);
3512                 return r;
3513         }
3514
3515         if (tiling_flags)
3516                 amdgpu_bo_get_tiling_flags(rbo, tiling_flags);
3517
3518         if (tmz_surface)
3519                 *tmz_surface = amdgpu_bo_encrypted(rbo);
3520
3521         amdgpu_bo_unreserve(rbo);
3522
3523         return r;
3524 }
3525
3526 static inline uint64_t get_dcc_address(uint64_t address, uint64_t tiling_flags)
3527 {
3528         uint32_t offset = AMDGPU_TILING_GET(tiling_flags, DCC_OFFSET_256B);
3529
3530         return offset ? (address + offset * 256) : 0;
3531 }
3532
3533 static int
3534 fill_plane_dcc_attributes(struct amdgpu_device *adev,
3535                           const struct amdgpu_framebuffer *afb,
3536                           const enum surface_pixel_format format,
3537                           const enum dc_rotation_angle rotation,
3538                           const struct plane_size *plane_size,
3539                           const union dc_tiling_info *tiling_info,
3540                           const uint64_t info,
3541                           struct dc_plane_dcc_param *dcc,
3542                           struct dc_plane_address *address,
3543                           bool force_disable_dcc)
3544 {
3545         struct dc *dc = adev->dm.dc;
3546         struct dc_dcc_surface_param input;
3547         struct dc_surface_dcc_cap output;
3548         uint32_t offset = AMDGPU_TILING_GET(info, DCC_OFFSET_256B);
3549         uint32_t i64b = AMDGPU_TILING_GET(info, DCC_INDEPENDENT_64B) != 0;
3550         uint64_t dcc_address;
3551
3552         memset(&input, 0, sizeof(input));
3553         memset(&output, 0, sizeof(output));
3554
3555         if (force_disable_dcc)
3556                 return 0;
3557
3558         if (!offset)
3559                 return 0;
3560
3561         if (format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN)
3562                 return 0;
3563
3564         if (!dc->cap_funcs.get_dcc_compression_cap)
3565                 return -EINVAL;
3566
3567         input.format = format;
3568         input.surface_size.width = plane_size->surface_size.width;
3569         input.surface_size.height = plane_size->surface_size.height;
3570         input.swizzle_mode = tiling_info->gfx9.swizzle;
3571
3572         if (rotation == ROTATION_ANGLE_0 || rotation == ROTATION_ANGLE_180)
3573                 input.scan = SCAN_DIRECTION_HORIZONTAL;
3574         else if (rotation == ROTATION_ANGLE_90 || rotation == ROTATION_ANGLE_270)
3575                 input.scan = SCAN_DIRECTION_VERTICAL;
3576
3577         if (!dc->cap_funcs.get_dcc_compression_cap(dc, &input, &output))
3578                 return -EINVAL;
3579
3580         if (!output.capable)
3581                 return -EINVAL;
3582
3583         if (i64b == 0 && output.grph.rgb.independent_64b_blks != 0)
3584                 return -EINVAL;
3585
3586         dcc->enable = 1;
3587         dcc->meta_pitch =
3588                 AMDGPU_TILING_GET(info, DCC_PITCH_MAX) + 1;
3589         dcc->independent_64b_blks = i64b;
3590
3591         dcc_address = get_dcc_address(afb->address, info);
3592         address->grph.meta_addr.low_part = lower_32_bits(dcc_address);
3593         address->grph.meta_addr.high_part = upper_32_bits(dcc_address);
3594
3595         return 0;
3596 }
3597
3598 static int
3599 fill_plane_buffer_attributes(struct amdgpu_device *adev,
3600                              const struct amdgpu_framebuffer *afb,
3601                              const enum surface_pixel_format format,
3602                              const enum dc_rotation_angle rotation,
3603                              const uint64_t tiling_flags,
3604                              union dc_tiling_info *tiling_info,
3605                              struct plane_size *plane_size,
3606                              struct dc_plane_dcc_param *dcc,
3607                              struct dc_plane_address *address,
3608                              bool tmz_surface,
3609                              bool force_disable_dcc)
3610 {
3611         const struct drm_framebuffer *fb = &afb->base;
3612         int ret;
3613
3614         memset(tiling_info, 0, sizeof(*tiling_info));
3615         memset(plane_size, 0, sizeof(*plane_size));
3616         memset(dcc, 0, sizeof(*dcc));
3617         memset(address, 0, sizeof(*address));
3618
3619         address->tmz_surface = tmz_surface;
3620
3621         if (format < SURFACE_PIXEL_FORMAT_VIDEO_BEGIN) {
3622                 plane_size->surface_size.x = 0;
3623                 plane_size->surface_size.y = 0;
3624                 plane_size->surface_size.width = fb->width;
3625                 plane_size->surface_size.height = fb->height;
3626                 plane_size->surface_pitch =
3627                         fb->pitches[0] / fb->format->cpp[0];
3628
3629                 address->type = PLN_ADDR_TYPE_GRAPHICS;
3630                 address->grph.addr.low_part = lower_32_bits(afb->address);
3631                 address->grph.addr.high_part = upper_32_bits(afb->address);
3632         } else if (format < SURFACE_PIXEL_FORMAT_INVALID) {
3633                 uint64_t chroma_addr = afb->address + fb->offsets[1];
3634
3635                 plane_size->surface_size.x = 0;
3636                 plane_size->surface_size.y = 0;
3637                 plane_size->surface_size.width = fb->width;
3638                 plane_size->surface_size.height = fb->height;
3639                 plane_size->surface_pitch =
3640                         fb->pitches[0] / fb->format->cpp[0];
3641
3642                 plane_size->chroma_size.x = 0;
3643                 plane_size->chroma_size.y = 0;
3644                 /* TODO: set these based on surface format */
3645                 plane_size->chroma_size.width = fb->width / 2;
3646                 plane_size->chroma_size.height = fb->height / 2;
3647
3648                 plane_size->chroma_pitch =
3649                         fb->pitches[1] / fb->format->cpp[1];
3650
3651                 address->type = PLN_ADDR_TYPE_VIDEO_PROGRESSIVE;
3652                 address->video_progressive.luma_addr.low_part =
3653                         lower_32_bits(afb->address);
3654                 address->video_progressive.luma_addr.high_part =
3655                         upper_32_bits(afb->address);
3656                 address->video_progressive.chroma_addr.low_part =
3657                         lower_32_bits(chroma_addr);
3658                 address->video_progressive.chroma_addr.high_part =
3659                         upper_32_bits(chroma_addr);
3660         }
3661
3662         /* Fill GFX8 params */
3663         if (AMDGPU_TILING_GET(tiling_flags, ARRAY_MODE) == DC_ARRAY_2D_TILED_THIN1) {
3664                 unsigned int bankw, bankh, mtaspect, tile_split, num_banks;
3665
3666                 bankw = AMDGPU_TILING_GET(tiling_flags, BANK_WIDTH);
3667                 bankh = AMDGPU_TILING_GET(tiling_flags, BANK_HEIGHT);
3668                 mtaspect = AMDGPU_TILING_GET(tiling_flags, MACRO_TILE_ASPECT);
3669                 tile_split = AMDGPU_TILING_GET(tiling_flags, TILE_SPLIT);
3670                 num_banks = AMDGPU_TILING_GET(tiling_flags, NUM_BANKS);
3671
3672                 /* XXX fix me for VI */
3673                 tiling_info->gfx8.num_banks = num_banks;
3674                 tiling_info->gfx8.array_mode =
3675                                 DC_ARRAY_2D_TILED_THIN1;
3676                 tiling_info->gfx8.tile_split = tile_split;
3677                 tiling_info->gfx8.bank_width = bankw;
3678                 tiling_info->gfx8.bank_height = bankh;
3679                 tiling_info->gfx8.tile_aspect = mtaspect;
3680                 tiling_info->gfx8.tile_mode =
3681                                 DC_ADDR_SURF_MICRO_TILING_DISPLAY;
3682         } else if (AMDGPU_TILING_GET(tiling_flags, ARRAY_MODE)
3683                         == DC_ARRAY_1D_TILED_THIN1) {
3684                 tiling_info->gfx8.array_mode = DC_ARRAY_1D_TILED_THIN1;
3685         }
3686
3687         tiling_info->gfx8.pipe_config =
3688                         AMDGPU_TILING_GET(tiling_flags, PIPE_CONFIG);
3689
3690         if (adev->asic_type == CHIP_VEGA10 ||
3691             adev->asic_type == CHIP_VEGA12 ||
3692             adev->asic_type == CHIP_VEGA20 ||
3693             adev->asic_type == CHIP_NAVI10 ||
3694             adev->asic_type == CHIP_NAVI14 ||
3695             adev->asic_type == CHIP_NAVI12 ||
3696             adev->asic_type == CHIP_RENOIR ||
3697             adev->asic_type == CHIP_RAVEN) {
3698                 /* Fill GFX9 params */
3699                 tiling_info->gfx9.num_pipes =
3700                         adev->gfx.config.gb_addr_config_fields.num_pipes;
3701                 tiling_info->gfx9.num_banks =
3702                         adev->gfx.config.gb_addr_config_fields.num_banks;
3703                 tiling_info->gfx9.pipe_interleave =
3704                         adev->gfx.config.gb_addr_config_fields.pipe_interleave_size;
3705                 tiling_info->gfx9.num_shader_engines =
3706                         adev->gfx.config.gb_addr_config_fields.num_se;
3707                 tiling_info->gfx9.max_compressed_frags =
3708                         adev->gfx.config.gb_addr_config_fields.max_compress_frags;
3709                 tiling_info->gfx9.num_rb_per_se =
3710                         adev->gfx.config.gb_addr_config_fields.num_rb_per_se;
3711                 tiling_info->gfx9.swizzle =
3712                         AMDGPU_TILING_GET(tiling_flags, SWIZZLE_MODE);
3713                 tiling_info->gfx9.shaderEnable = 1;
3714
3715                 ret = fill_plane_dcc_attributes(adev, afb, format, rotation,
3716                                                 plane_size, tiling_info,
3717                                                 tiling_flags, dcc, address,
3718                                                 force_disable_dcc);
3719                 if (ret)
3720                         return ret;
3721         }
3722
3723         return 0;
3724 }
3725
3726 static void
3727 fill_blending_from_plane_state(const struct drm_plane_state *plane_state,
3728                                bool *per_pixel_alpha, bool *global_alpha,
3729                                int *global_alpha_value)
3730 {
3731         *per_pixel_alpha = false;
3732         *global_alpha = false;
3733         *global_alpha_value = 0xff;
3734
3735         if (plane_state->plane->type != DRM_PLANE_TYPE_OVERLAY)
3736                 return;
3737
3738         if (plane_state->pixel_blend_mode == DRM_MODE_BLEND_PREMULTI) {
3739                 static const uint32_t alpha_formats[] = {
3740                         DRM_FORMAT_ARGB8888,
3741                         DRM_FORMAT_RGBA8888,
3742                         DRM_FORMAT_ABGR8888,
3743                 };
3744                 uint32_t format = plane_state->fb->format->format;
3745                 unsigned int i;
3746
3747                 for (i = 0; i < ARRAY_SIZE(alpha_formats); ++i) {
3748                         if (format == alpha_formats[i]) {
3749                                 *per_pixel_alpha = true;
3750                                 break;
3751                         }
3752                 }
3753         }
3754
3755         if (plane_state->alpha < 0xffff) {
3756                 *global_alpha = true;
3757                 *global_alpha_value = plane_state->alpha >> 8;
3758         }
3759 }
3760
3761 static int
3762 fill_plane_color_attributes(const struct drm_plane_state *plane_state,
3763                             const enum surface_pixel_format format,
3764                             enum dc_color_space *color_space)
3765 {
3766         bool full_range;
3767
3768         *color_space = COLOR_SPACE_SRGB;
3769
3770         /* DRM color properties only affect non-RGB formats. */
3771         if (format < SURFACE_PIXEL_FORMAT_VIDEO_BEGIN)
3772                 return 0;
3773
3774         full_range = (plane_state->color_range == DRM_COLOR_YCBCR_FULL_RANGE);
3775
3776         switch (plane_state->color_encoding) {
3777         case DRM_COLOR_YCBCR_BT601:
3778                 if (full_range)
3779                         *color_space = COLOR_SPACE_YCBCR601;
3780                 else
3781                         *color_space = COLOR_SPACE_YCBCR601_LIMITED;
3782                 break;
3783
3784         case DRM_COLOR_YCBCR_BT709:
3785                 if (full_range)
3786                         *color_space = COLOR_SPACE_YCBCR709;
3787                 else
3788                         *color_space = COLOR_SPACE_YCBCR709_LIMITED;
3789                 break;
3790
3791         case DRM_COLOR_YCBCR_BT2020:
3792                 if (full_range)
3793                         *color_space = COLOR_SPACE_2020_YCBCR;
3794                 else
3795                         return -EINVAL;
3796                 break;
3797
3798         default:
3799                 return -EINVAL;
3800         }
3801
3802         return 0;
3803 }
3804
3805 static int
3806 fill_dc_plane_info_and_addr(struct amdgpu_device *adev,
3807                             const struct drm_plane_state *plane_state,
3808                             const uint64_t tiling_flags,
3809                             struct dc_plane_info *plane_info,
3810                             struct dc_plane_address *address,
3811                             bool tmz_surface,
3812                             bool force_disable_dcc)
3813 {
3814         const struct drm_framebuffer *fb = plane_state->fb;
3815         const struct amdgpu_framebuffer *afb =
3816                 to_amdgpu_framebuffer(plane_state->fb);
3817         struct drm_format_name_buf format_name;
3818         int ret;
3819
3820         memset(plane_info, 0, sizeof(*plane_info));
3821
3822         switch (fb->format->format) {
3823         case DRM_FORMAT_C8:
3824                 plane_info->format =
3825                         SURFACE_PIXEL_FORMAT_GRPH_PALETA_256_COLORS;
3826                 break;
3827         case DRM_FORMAT_RGB565:
3828                 plane_info->format = SURFACE_PIXEL_FORMAT_GRPH_RGB565;
3829                 break;
3830         case DRM_FORMAT_XRGB8888:
3831         case DRM_FORMAT_ARGB8888:
3832                 plane_info->format = SURFACE_PIXEL_FORMAT_GRPH_ARGB8888;
3833                 break;
3834         case DRM_FORMAT_XRGB2101010:
3835         case DRM_FORMAT_ARGB2101010:
3836                 plane_info->format = SURFACE_PIXEL_FORMAT_GRPH_ARGB2101010;
3837                 break;
3838         case DRM_FORMAT_XBGR2101010:
3839         case DRM_FORMAT_ABGR2101010:
3840                 plane_info->format = SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010;
3841                 break;
3842         case DRM_FORMAT_XBGR8888:
3843         case DRM_FORMAT_ABGR8888:
3844                 plane_info->format = SURFACE_PIXEL_FORMAT_GRPH_ABGR8888;
3845                 break;
3846         case DRM_FORMAT_NV21:
3847                 plane_info->format = SURFACE_PIXEL_FORMAT_VIDEO_420_YCbCr;
3848                 break;
3849         case DRM_FORMAT_NV12:
3850                 plane_info->format = SURFACE_PIXEL_FORMAT_VIDEO_420_YCrCb;
3851                 break;
3852         case DRM_FORMAT_P010:
3853                 plane_info->format = SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCrCb;
3854                 break;
3855         case DRM_FORMAT_XRGB16161616F:
3856         case DRM_FORMAT_ARGB16161616F:
3857                 plane_info->format = SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F;
3858                 break;
3859         case DRM_FORMAT_XBGR16161616F:
3860         case DRM_FORMAT_ABGR16161616F:
3861                 plane_info->format = SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F;
3862                 break;
3863         default:
3864                 DRM_ERROR(
3865                         "Unsupported screen format %s\n",
3866                         drm_get_format_name(fb->format->format, &format_name));
3867                 return -EINVAL;
3868         }
3869
3870         switch (plane_state->rotation & DRM_MODE_ROTATE_MASK) {
3871         case DRM_MODE_ROTATE_0:
3872                 plane_info->rotation = ROTATION_ANGLE_0;
3873                 break;
3874         case DRM_MODE_ROTATE_90:
3875                 plane_info->rotation = ROTATION_ANGLE_90;
3876                 break;
3877         case DRM_MODE_ROTATE_180:
3878                 plane_info->rotation = ROTATION_ANGLE_180;
3879                 break;
3880         case DRM_MODE_ROTATE_270:
3881                 plane_info->rotation = ROTATION_ANGLE_270;
3882                 break;
3883         default:
3884                 plane_info->rotation = ROTATION_ANGLE_0;
3885                 break;
3886         }
3887
3888         plane_info->visible = true;
3889         plane_info->stereo_format = PLANE_STEREO_FORMAT_NONE;
3890
3891         plane_info->layer_index = 0;
3892
3893         ret = fill_plane_color_attributes(plane_state, plane_info->format,
3894                                           &plane_info->color_space);
3895         if (ret)
3896                 return ret;
3897
3898         ret = fill_plane_buffer_attributes(adev, afb, plane_info->format,
3899                                            plane_info->rotation, tiling_flags,
3900                                            &plane_info->tiling_info,
3901                                            &plane_info->plane_size,
3902                                            &plane_info->dcc, address, tmz_surface,
3903                                            force_disable_dcc);
3904         if (ret)
3905                 return ret;
3906
3907         fill_blending_from_plane_state(
3908                 plane_state, &plane_info->per_pixel_alpha,
3909                 &plane_info->global_alpha, &plane_info->global_alpha_value);
3910
3911         return 0;
3912 }
3913
3914 static int fill_dc_plane_attributes(struct amdgpu_device *adev,
3915                                     struct dc_plane_state *dc_plane_state,
3916                                     struct drm_plane_state *plane_state,
3917                                     struct drm_crtc_state *crtc_state)
3918 {
3919         struct dm_crtc_state *dm_crtc_state = to_dm_crtc_state(crtc_state);
3920         const struct amdgpu_framebuffer *amdgpu_fb =
3921                 to_amdgpu_framebuffer(plane_state->fb);
3922         struct dc_scaling_info scaling_info;
3923         struct dc_plane_info plane_info;
3924         uint64_t tiling_flags;
3925         int ret;
3926         bool tmz_surface = false;
3927         bool force_disable_dcc = false;
3928
3929         ret = fill_dc_scaling_info(plane_state, &scaling_info);
3930         if (ret)
3931                 return ret;
3932
3933         dc_plane_state->src_rect = scaling_info.src_rect;
3934         dc_plane_state->dst_rect = scaling_info.dst_rect;
3935         dc_plane_state->clip_rect = scaling_info.clip_rect;
3936         dc_plane_state->scaling_quality = scaling_info.scaling_quality;
3937
3938         ret = get_fb_info(amdgpu_fb, &tiling_flags, &tmz_surface);
3939         if (ret)
3940                 return ret;
3941
3942         force_disable_dcc = adev->asic_type == CHIP_RAVEN && adev->in_suspend;
3943         ret = fill_dc_plane_info_and_addr(adev, plane_state, tiling_flags,
3944                                           &plane_info,
3945                                           &dc_plane_state->address,
3946                                           tmz_surface,
3947                                           force_disable_dcc);
3948         if (ret)
3949                 return ret;
3950
3951         dc_plane_state->format = plane_info.format;
3952         dc_plane_state->color_space = plane_info.color_space;
3953         dc_plane_state->format = plane_info.format;
3954         dc_plane_state->plane_size = plane_info.plane_size;
3955         dc_plane_state->rotation = plane_info.rotation;
3956         dc_plane_state->horizontal_mirror = plane_info.horizontal_mirror;
3957         dc_plane_state->stereo_format = plane_info.stereo_format;
3958         dc_plane_state->tiling_info = plane_info.tiling_info;
3959         dc_plane_state->visible = plane_info.visible;
3960         dc_plane_state->per_pixel_alpha = plane_info.per_pixel_alpha;
3961         dc_plane_state->global_alpha = plane_info.global_alpha;
3962         dc_plane_state->global_alpha_value = plane_info.global_alpha_value;
3963         dc_plane_state->dcc = plane_info.dcc;
3964         dc_plane_state->layer_index = plane_info.layer_index; // Always returns 0
3965
3966         /*
3967          * Always set input transfer function, since plane state is refreshed
3968          * every time.
3969          */
3970         ret = amdgpu_dm_update_plane_color_mgmt(dm_crtc_state, dc_plane_state);
3971         if (ret)
3972                 return ret;
3973
3974         return 0;
3975 }
3976
3977 static void update_stream_scaling_settings(const struct drm_display_mode *mode,
3978                                            const struct dm_connector_state *dm_state,
3979                                            struct dc_stream_state *stream)
3980 {
3981         enum amdgpu_rmx_type rmx_type;
3982
3983         struct rect src = { 0 }; /* viewport in composition space*/
3984         struct rect dst = { 0 }; /* stream addressable area */
3985
3986         /* no mode. nothing to be done */
3987         if (!mode)
3988                 return;
3989
3990         /* Full screen scaling by default */
3991         src.width = mode->hdisplay;
3992         src.height = mode->vdisplay;
3993         dst.width = stream->timing.h_addressable;
3994         dst.height = stream->timing.v_addressable;
3995
3996         if (dm_state) {
3997                 rmx_type = dm_state->scaling;
3998                 if (rmx_type == RMX_ASPECT || rmx_type == RMX_OFF) {
3999                         if (src.width * dst.height <
4000                                         src.height * dst.width) {
4001                                 /* height needs less upscaling/more downscaling */
4002                                 dst.width = src.width *
4003                                                 dst.height / src.height;
4004                         } else {
4005                                 /* width needs less upscaling/more downscaling */
4006                                 dst.height = src.height *
4007                                                 dst.width / src.width;
4008                         }
4009                 } else if (rmx_type == RMX_CENTER) {
4010                         dst = src;
4011                 }
4012
4013                 dst.x = (stream->timing.h_addressable - dst.width) / 2;
4014                 dst.y = (stream->timing.v_addressable - dst.height) / 2;
4015
4016                 if (dm_state->underscan_enable) {
4017                         dst.x += dm_state->underscan_hborder / 2;
4018                         dst.y += dm_state->underscan_vborder / 2;
4019                         dst.width -= dm_state->underscan_hborder;
4020                         dst.height -= dm_state->underscan_vborder;
4021                 }
4022         }
4023
4024         stream->src = src;
4025         stream->dst = dst;
4026
4027         DRM_DEBUG_DRIVER("Destination Rectangle x:%d  y:%d  width:%d  height:%d\n",
4028                         dst.x, dst.y, dst.width, dst.height);
4029
4030 }
4031
4032 static enum dc_color_depth
4033 convert_color_depth_from_display_info(const struct drm_connector *connector,
4034                                       bool is_y420, int requested_bpc)
4035 {
4036         uint8_t bpc;
4037
4038         if (is_y420) {
4039                 bpc = 8;
4040
4041                 /* Cap display bpc based on HDMI 2.0 HF-VSDB */
4042                 if (connector->display_info.hdmi.y420_dc_modes & DRM_EDID_YCBCR420_DC_48)
4043                         bpc = 16;
4044                 else if (connector->display_info.hdmi.y420_dc_modes & DRM_EDID_YCBCR420_DC_36)
4045                         bpc = 12;
4046                 else if (connector->display_info.hdmi.y420_dc_modes & DRM_EDID_YCBCR420_DC_30)
4047                         bpc = 10;
4048         } else {
4049                 bpc = (uint8_t)connector->display_info.bpc;
4050                 /* Assume 8 bpc by default if no bpc is specified. */
4051                 bpc = bpc ? bpc : 8;
4052         }
4053
4054         if (requested_bpc > 0) {
4055                 /*
4056                  * Cap display bpc based on the user requested value.
4057                  *
4058                  * The value for state->max_bpc may not correctly updated
4059                  * depending on when the connector gets added to the state
4060                  * or if this was called outside of atomic check, so it
4061                  * can't be used directly.
4062                  */
4063                 bpc = min_t(u8, bpc, requested_bpc);
4064
4065                 /* Round down to the nearest even number. */
4066                 bpc = bpc - (bpc & 1);
4067         }
4068
4069         switch (bpc) {
4070         case 0:
4071                 /*
4072                  * Temporary Work around, DRM doesn't parse color depth for
4073                  * EDID revision before 1.4
4074                  * TODO: Fix edid parsing
4075                  */
4076                 return COLOR_DEPTH_888;
4077         case 6:
4078                 return COLOR_DEPTH_666;
4079         case 8:
4080                 return COLOR_DEPTH_888;
4081         case 10:
4082                 return COLOR_DEPTH_101010;
4083         case 12:
4084                 return COLOR_DEPTH_121212;
4085         case 14:
4086                 return COLOR_DEPTH_141414;
4087         case 16:
4088                 return COLOR_DEPTH_161616;
4089         default:
4090                 return COLOR_DEPTH_UNDEFINED;
4091         }
4092 }
4093
4094 static enum dc_aspect_ratio
4095 get_aspect_ratio(const struct drm_display_mode *mode_in)
4096 {
4097         /* 1-1 mapping, since both enums follow the HDMI spec. */
4098         return (enum dc_aspect_ratio) mode_in->picture_aspect_ratio;
4099 }
4100
4101 static enum dc_color_space
4102 get_output_color_space(const struct dc_crtc_timing *dc_crtc_timing)
4103 {
4104         enum dc_color_space color_space = COLOR_SPACE_SRGB;
4105
4106         switch (dc_crtc_timing->pixel_encoding) {
4107         case PIXEL_ENCODING_YCBCR422:
4108         case PIXEL_ENCODING_YCBCR444:
4109         case PIXEL_ENCODING_YCBCR420:
4110         {
4111                 /*
4112                  * 27030khz is the separation point between HDTV and SDTV
4113                  * according to HDMI spec, we use YCbCr709 and YCbCr601
4114                  * respectively
4115                  */
4116                 if (dc_crtc_timing->pix_clk_100hz > 270300) {
4117                         if (dc_crtc_timing->flags.Y_ONLY)
4118                                 color_space =
4119                                         COLOR_SPACE_YCBCR709_LIMITED;
4120                         else
4121                                 color_space = COLOR_SPACE_YCBCR709;
4122                 } else {
4123                         if (dc_crtc_timing->flags.Y_ONLY)
4124                                 color_space =
4125                                         COLOR_SPACE_YCBCR601_LIMITED;
4126                         else
4127                                 color_space = COLOR_SPACE_YCBCR601;
4128                 }
4129
4130         }
4131         break;
4132         case PIXEL_ENCODING_RGB:
4133                 color_space = COLOR_SPACE_SRGB;
4134                 break;
4135
4136         default:
4137                 WARN_ON(1);
4138                 break;
4139         }
4140
4141         return color_space;
4142 }
4143
4144 static bool adjust_colour_depth_from_display_info(
4145         struct dc_crtc_timing *timing_out,
4146         const struct drm_display_info *info)
4147 {
4148         enum dc_color_depth depth = timing_out->display_color_depth;
4149         int normalized_clk;
4150         do {
4151                 normalized_clk = timing_out->pix_clk_100hz / 10;
4152                 /* YCbCr 4:2:0 requires additional adjustment of 1/2 */
4153                 if (timing_out->pixel_encoding == PIXEL_ENCODING_YCBCR420)
4154                         normalized_clk /= 2;
4155                 /* Adjusting pix clock following on HDMI spec based on colour depth */
4156                 switch (depth) {
4157                 case COLOR_DEPTH_888:
4158                         break;
4159                 case COLOR_DEPTH_101010:
4160                         normalized_clk = (normalized_clk * 30) / 24;
4161                         break;
4162                 case COLOR_DEPTH_121212:
4163                         normalized_clk = (normalized_clk * 36) / 24;
4164                         break;
4165                 case COLOR_DEPTH_161616:
4166                         normalized_clk = (normalized_clk * 48) / 24;
4167                         break;
4168                 default:
4169                         /* The above depths are the only ones valid for HDMI. */
4170                         return false;
4171                 }
4172                 if (normalized_clk <= info->max_tmds_clock) {
4173                         timing_out->display_color_depth = depth;
4174                         return true;
4175                 }
4176         } while (--depth > COLOR_DEPTH_666);
4177         return false;
4178 }
4179
4180 static void fill_stream_properties_from_drm_display_mode(
4181         struct dc_stream_state *stream,
4182         const struct drm_display_mode *mode_in,
4183         const struct drm_connector *connector,
4184         const struct drm_connector_state *connector_state,
4185         const struct dc_stream_state *old_stream,
4186         int requested_bpc)
4187 {
4188         struct dc_crtc_timing *timing_out = &stream->timing;
4189         const struct drm_display_info *info = &connector->display_info;
4190         struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
4191         struct hdmi_vendor_infoframe hv_frame;
4192         struct hdmi_avi_infoframe avi_frame;
4193
4194         memset(&hv_frame, 0, sizeof(hv_frame));
4195         memset(&avi_frame, 0, sizeof(avi_frame));
4196
4197         timing_out->h_border_left = 0;
4198         timing_out->h_border_right = 0;
4199         timing_out->v_border_top = 0;
4200         timing_out->v_border_bottom = 0;
4201         /* TODO: un-hardcode */
4202         if (drm_mode_is_420_only(info, mode_in)
4203                         && stream->signal == SIGNAL_TYPE_HDMI_TYPE_A)
4204                 timing_out->pixel_encoding = PIXEL_ENCODING_YCBCR420;
4205         else if (drm_mode_is_420_also(info, mode_in)
4206                         && aconnector->force_yuv420_output)
4207                 timing_out->pixel_encoding = PIXEL_ENCODING_YCBCR420;
4208         else if ((connector->display_info.color_formats & DRM_COLOR_FORMAT_YCRCB444)
4209                         && stream->signal == SIGNAL_TYPE_HDMI_TYPE_A)
4210                 timing_out->pixel_encoding = PIXEL_ENCODING_YCBCR444;
4211         else
4212                 timing_out->pixel_encoding = PIXEL_ENCODING_RGB;
4213
4214         timing_out->timing_3d_format = TIMING_3D_FORMAT_NONE;
4215         timing_out->display_color_depth = convert_color_depth_from_display_info(
4216                 connector,
4217                 (timing_out->pixel_encoding == PIXEL_ENCODING_YCBCR420),
4218                 requested_bpc);
4219         timing_out->scan_type = SCANNING_TYPE_NODATA;
4220         timing_out->hdmi_vic = 0;
4221
4222         if(old_stream) {
4223                 timing_out->vic = old_stream->timing.vic;
4224                 timing_out->flags.HSYNC_POSITIVE_POLARITY = old_stream->timing.flags.HSYNC_POSITIVE_POLARITY;
4225                 timing_out->flags.VSYNC_POSITIVE_POLARITY = old_stream->timing.flags.VSYNC_POSITIVE_POLARITY;
4226         } else {
4227                 timing_out->vic = drm_match_cea_mode(mode_in);
4228                 if (mode_in->flags & DRM_MODE_FLAG_PHSYNC)
4229                         timing_out->flags.HSYNC_POSITIVE_POLARITY = 1;
4230                 if (mode_in->flags & DRM_MODE_FLAG_PVSYNC)
4231                         timing_out->flags.VSYNC_POSITIVE_POLARITY = 1;
4232         }
4233
4234         if (stream->signal == SIGNAL_TYPE_HDMI_TYPE_A) {
4235                 drm_hdmi_avi_infoframe_from_display_mode(&avi_frame, (struct drm_connector *)connector, mode_in);
4236                 timing_out->vic = avi_frame.video_code;
4237                 drm_hdmi_vendor_infoframe_from_display_mode(&hv_frame, (struct drm_connector *)connector, mode_in);
4238                 timing_out->hdmi_vic = hv_frame.vic;
4239         }
4240
4241         timing_out->h_addressable = mode_in->crtc_hdisplay;
4242         timing_out->h_total = mode_in->crtc_htotal;
4243         timing_out->h_sync_width =
4244                 mode_in->crtc_hsync_end - mode_in->crtc_hsync_start;
4245         timing_out->h_front_porch =
4246                 mode_in->crtc_hsync_start - mode_in->crtc_hdisplay;
4247         timing_out->v_total = mode_in->crtc_vtotal;
4248         timing_out->v_addressable = mode_in->crtc_vdisplay;
4249         timing_out->v_front_porch =
4250                 mode_in->crtc_vsync_start - mode_in->crtc_vdisplay;
4251         timing_out->v_sync_width =
4252                 mode_in->crtc_vsync_end - mode_in->crtc_vsync_start;
4253         timing_out->pix_clk_100hz = mode_in->crtc_clock * 10;
4254         timing_out->aspect_ratio = get_aspect_ratio(mode_in);
4255
4256         stream->output_color_space = get_output_color_space(timing_out);
4257
4258         stream->out_transfer_func->type = TF_TYPE_PREDEFINED;
4259         stream->out_transfer_func->tf = TRANSFER_FUNCTION_SRGB;
4260         if (stream->signal == SIGNAL_TYPE_HDMI_TYPE_A) {
4261                 if (!adjust_colour_depth_from_display_info(timing_out, info) &&
4262                     drm_mode_is_420_also(info, mode_in) &&
4263                     timing_out->pixel_encoding != PIXEL_ENCODING_YCBCR420) {
4264                         timing_out->pixel_encoding = PIXEL_ENCODING_YCBCR420;
4265                         adjust_colour_depth_from_display_info(timing_out, info);
4266                 }
4267         }
4268 }
4269
4270 static void fill_audio_info(struct audio_info *audio_info,
4271                             const struct drm_connector *drm_connector,
4272                             const struct dc_sink *dc_sink)
4273 {
4274         int i = 0;
4275         int cea_revision = 0;
4276         const struct dc_edid_caps *edid_caps = &dc_sink->edid_caps;
4277
4278         audio_info->manufacture_id = edid_caps->manufacturer_id;
4279         audio_info->product_id = edid_caps->product_id;
4280
4281         cea_revision = drm_connector->display_info.cea_rev;
4282
4283         strscpy(audio_info->display_name,
4284                 edid_caps->display_name,
4285                 AUDIO_INFO_DISPLAY_NAME_SIZE_IN_CHARS);
4286
4287         if (cea_revision >= 3) {
4288                 audio_info->mode_count = edid_caps->audio_mode_count;
4289
4290                 for (i = 0; i < audio_info->mode_count; ++i) {
4291                         audio_info->modes[i].format_code =
4292                                         (enum audio_format_code)
4293                                         (edid_caps->audio_modes[i].format_code);
4294                         audio_info->modes[i].channel_count =
4295                                         edid_caps->audio_modes[i].channel_count;
4296                         audio_info->modes[i].sample_rates.all =
4297                                         edid_caps->audio_modes[i].sample_rate;
4298                         audio_info->modes[i].sample_size =
4299                                         edid_caps->audio_modes[i].sample_size;
4300                 }
4301         }
4302
4303         audio_info->flags.all = edid_caps->speaker_flags;
4304
4305         /* TODO: We only check for the progressive mode, check for interlace mode too */
4306         if (drm_connector->latency_present[0]) {
4307                 audio_info->video_latency = drm_connector->video_latency[0];
4308                 audio_info->audio_latency = drm_connector->audio_latency[0];
4309         }
4310
4311         /* TODO: For DP, video and audio latency should be calculated from DPCD caps */
4312
4313 }
4314
4315 static void
4316 copy_crtc_timing_for_drm_display_mode(const struct drm_display_mode *src_mode,
4317                                       struct drm_display_mode *dst_mode)
4318 {
4319         dst_mode->crtc_hdisplay = src_mode->crtc_hdisplay;
4320         dst_mode->crtc_vdisplay = src_mode->crtc_vdisplay;
4321         dst_mode->crtc_clock = src_mode->crtc_clock;
4322         dst_mode->crtc_hblank_start = src_mode->crtc_hblank_start;
4323         dst_mode->crtc_hblank_end = src_mode->crtc_hblank_end;
4324         dst_mode->crtc_hsync_start =  src_mode->crtc_hsync_start;
4325         dst_mode->crtc_hsync_end = src_mode->crtc_hsync_end;
4326         dst_mode->crtc_htotal = src_mode->crtc_htotal;
4327         dst_mode->crtc_hskew = src_mode->crtc_hskew;
4328         dst_mode->crtc_vblank_start = src_mode->crtc_vblank_start;
4329         dst_mode->crtc_vblank_end = src_mode->crtc_vblank_end;
4330         dst_mode->crtc_vsync_start = src_mode->crtc_vsync_start;
4331         dst_mode->crtc_vsync_end = src_mode->crtc_vsync_end;
4332         dst_mode->crtc_vtotal = src_mode->crtc_vtotal;
4333 }
4334
4335 static void
4336 decide_crtc_timing_for_drm_display_mode(struct drm_display_mode *drm_mode,
4337                                         const struct drm_display_mode *native_mode,
4338                                         bool scale_enabled)
4339 {
4340         if (scale_enabled) {
4341                 copy_crtc_timing_for_drm_display_mode(native_mode, drm_mode);
4342         } else if (native_mode->clock == drm_mode->clock &&
4343                         native_mode->htotal == drm_mode->htotal &&
4344                         native_mode->vtotal == drm_mode->vtotal) {
4345                 copy_crtc_timing_for_drm_display_mode(native_mode, drm_mode);
4346         } else {
4347                 /* no scaling nor amdgpu inserted, no need to patch */
4348         }
4349 }
4350
4351 static struct dc_sink *
4352 create_fake_sink(struct amdgpu_dm_connector *aconnector)
4353 {
4354         struct dc_sink_init_data sink_init_data = { 0 };
4355         struct dc_sink *sink = NULL;
4356         sink_init_data.link = aconnector->dc_link;
4357         sink_init_data.sink_signal = aconnector->dc_link->connector_signal;
4358
4359         sink = dc_sink_create(&sink_init_data);
4360         if (!sink) {
4361                 DRM_ERROR("Failed to create sink!\n");
4362                 return NULL;
4363         }
4364         sink->sink_signal = SIGNAL_TYPE_VIRTUAL;
4365
4366         return sink;
4367 }
4368
4369 static void set_multisync_trigger_params(
4370                 struct dc_stream_state *stream)
4371 {
4372         if (stream->triggered_crtc_reset.enabled) {
4373                 stream->triggered_crtc_reset.event = CRTC_EVENT_VSYNC_RISING;
4374                 stream->triggered_crtc_reset.delay = TRIGGER_DELAY_NEXT_LINE;
4375         }
4376 }
4377
4378 static void set_master_stream(struct dc_stream_state *stream_set[],
4379                               int stream_count)
4380 {
4381         int j, highest_rfr = 0, master_stream = 0;
4382
4383         for (j = 0;  j < stream_count; j++) {
4384                 if (stream_set[j] && stream_set[j]->triggered_crtc_reset.enabled) {
4385                         int refresh_rate = 0;
4386
4387                         refresh_rate = (stream_set[j]->timing.pix_clk_100hz*100)/
4388                                 (stream_set[j]->timing.h_total*stream_set[j]->timing.v_total);
4389                         if (refresh_rate > highest_rfr) {
4390                                 highest_rfr = refresh_rate;
4391                                 master_stream = j;
4392                         }
4393                 }
4394         }
4395         for (j = 0;  j < stream_count; j++) {
4396                 if (stream_set[j])
4397                         stream_set[j]->triggered_crtc_reset.event_source = stream_set[master_stream];
4398         }
4399 }
4400
4401 static void dm_enable_per_frame_crtc_master_sync(struct dc_state *context)
4402 {
4403         int i = 0;
4404
4405         if (context->stream_count < 2)
4406                 return;
4407         for (i = 0; i < context->stream_count ; i++) {
4408                 if (!context->streams[i])
4409                         continue;
4410                 /*
4411                  * TODO: add a function to read AMD VSDB bits and set
4412                  * crtc_sync_master.multi_sync_enabled flag
4413                  * For now it's set to false
4414                  */
4415                 set_multisync_trigger_params(context->streams[i]);
4416         }
4417         set_master_stream(context->streams, context->stream_count);
4418 }
4419
4420 static struct dc_stream_state *
4421 create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
4422                        const struct drm_display_mode *drm_mode,
4423                        const struct dm_connector_state *dm_state,
4424                        const struct dc_stream_state *old_stream,
4425                        int requested_bpc)
4426 {
4427         struct drm_display_mode *preferred_mode = NULL;
4428         struct drm_connector *drm_connector;
4429         const struct drm_connector_state *con_state =
4430                 dm_state ? &dm_state->base : NULL;
4431         struct dc_stream_state *stream = NULL;
4432         struct drm_display_mode mode = *drm_mode;
4433         bool native_mode_found = false;
4434         bool scale = dm_state ? (dm_state->scaling != RMX_OFF) : false;
4435         int mode_refresh;
4436         int preferred_refresh = 0;
4437 #if defined(CONFIG_DRM_AMD_DC_DCN)
4438         struct dsc_dec_dpcd_caps dsc_caps;
4439 #endif
4440         uint32_t link_bandwidth_kbps;
4441
4442         struct dc_sink *sink = NULL;
4443         if (aconnector == NULL) {
4444                 DRM_ERROR("aconnector is NULL!\n");
4445                 return stream;
4446         }
4447
4448         drm_connector = &aconnector->base;
4449
4450         if (!aconnector->dc_sink) {
4451                 sink = create_fake_sink(aconnector);
4452                 if (!sink)
4453                         return stream;
4454         } else {
4455                 sink = aconnector->dc_sink;
4456                 dc_sink_retain(sink);
4457         }
4458
4459         stream = dc_create_stream_for_sink(sink);
4460
4461         if (stream == NULL) {
4462                 DRM_ERROR("Failed to create stream for sink!\n");
4463                 goto finish;
4464         }
4465
4466         stream->dm_stream_context = aconnector;
4467
4468         stream->timing.flags.LTE_340MCSC_SCRAMBLE =
4469                 drm_connector->display_info.hdmi.scdc.scrambling.low_rates;
4470
4471         list_for_each_entry(preferred_mode, &aconnector->base.modes, head) {
4472                 /* Search for preferred mode */
4473                 if (preferred_mode->type & DRM_MODE_TYPE_PREFERRED) {
4474                         native_mode_found = true;
4475                         break;
4476                 }
4477         }
4478         if (!native_mode_found)
4479                 preferred_mode = list_first_entry_or_null(
4480                                 &aconnector->base.modes,
4481                                 struct drm_display_mode,
4482                                 head);
4483
4484         mode_refresh = drm_mode_vrefresh(&mode);
4485
4486         if (preferred_mode == NULL) {
4487                 /*
4488                  * This may not be an error, the use case is when we have no
4489                  * usermode calls to reset and set mode upon hotplug. In this
4490                  * case, we call set mode ourselves to restore the previous mode
4491                  * and the modelist may not be filled in in time.
4492                  */
4493                 DRM_DEBUG_DRIVER("No preferred mode found\n");
4494         } else {
4495                 decide_crtc_timing_for_drm_display_mode(
4496                                 &mode, preferred_mode,
4497                                 dm_state ? (dm_state->scaling != RMX_OFF) : false);
4498                 preferred_refresh = drm_mode_vrefresh(preferred_mode);
4499         }
4500
4501         if (!dm_state)
4502                 drm_mode_set_crtcinfo(&mode, 0);
4503
4504         /*
4505         * If scaling is enabled and refresh rate didn't change
4506         * we copy the vic and polarities of the old timings
4507         */
4508         if (!scale || mode_refresh != preferred_refresh)
4509                 fill_stream_properties_from_drm_display_mode(stream,
4510                         &mode, &aconnector->base, con_state, NULL, requested_bpc);
4511         else
4512                 fill_stream_properties_from_drm_display_mode(stream,
4513                         &mode, &aconnector->base, con_state, old_stream, requested_bpc);
4514
4515         stream->timing.flags.DSC = 0;
4516
4517         if (aconnector->dc_link && sink->sink_signal == SIGNAL_TYPE_DISPLAY_PORT) {
4518 #if defined(CONFIG_DRM_AMD_DC_DCN)
4519                 dc_dsc_parse_dsc_dpcd(aconnector->dc_link->ctx->dc,
4520                                       aconnector->dc_link->dpcd_caps.dsc_caps.dsc_basic_caps.raw,
4521                                       aconnector->dc_link->dpcd_caps.dsc_caps.dsc_ext_caps.raw,
4522                                       &dsc_caps);
4523 #endif
4524                 link_bandwidth_kbps = dc_link_bandwidth_kbps(aconnector->dc_link,
4525                                                              dc_link_get_link_cap(aconnector->dc_link));
4526
4527 #if defined(CONFIG_DRM_AMD_DC_DCN)
4528                 if (dsc_caps.is_dsc_supported)
4529                         if (dc_dsc_compute_config(aconnector->dc_link->ctx->dc->res_pool->dscs[0],
4530                                                   &dsc_caps,
4531                                                   aconnector->dc_link->ctx->dc->debug.dsc_min_slice_height_override,
4532                                                   link_bandwidth_kbps,
4533                                                   &stream->timing,
4534                                                   &stream->timing.dsc_cfg))
4535                                 stream->timing.flags.DSC = 1;
4536 #endif
4537         }
4538
4539         update_stream_scaling_settings(&mode, dm_state, stream);
4540
4541         fill_audio_info(
4542                 &stream->audio_info,
4543                 drm_connector,
4544                 sink);
4545
4546         update_stream_signal(stream, sink);
4547
4548         if (stream->signal == SIGNAL_TYPE_HDMI_TYPE_A)
4549                 mod_build_hf_vsif_infopacket(stream, &stream->vsp_infopacket, false, false);
4550         if (stream->link->psr_settings.psr_feature_enabled)     {
4551                 struct dc  *core_dc = stream->link->ctx->dc;
4552
4553                 if (dc_is_dmcu_initialized(core_dc)) {
4554                         //
4555                         // should decide stream support vsc sdp colorimetry capability
4556                         // before building vsc info packet
4557                         //
4558                         stream->use_vsc_sdp_for_colorimetry = false;
4559                         if (aconnector->dc_sink->sink_signal == SIGNAL_TYPE_DISPLAY_PORT_MST) {
4560                                 stream->use_vsc_sdp_for_colorimetry =
4561                                         aconnector->dc_sink->is_vsc_sdp_colorimetry_supported;
4562                         } else {
4563                                 if (stream->link->dpcd_caps.dpcd_rev.raw >= 0x14 &&
4564                                         stream->link->dpcd_caps.dprx_feature.bits.VSC_SDP_COLORIMETRY_SUPPORTED) {
4565                                         stream->use_vsc_sdp_for_colorimetry = true;
4566                                 }
4567                         }
4568                         mod_build_vsc_infopacket(stream, &stream->vsc_infopacket);
4569                 }
4570         }
4571 finish:
4572         dc_sink_release(sink);
4573
4574         return stream;
4575 }
4576
4577 static void amdgpu_dm_crtc_destroy(struct drm_crtc *crtc)
4578 {
4579         drm_crtc_cleanup(crtc);
4580         kfree(crtc);
4581 }
4582
4583 static void dm_crtc_destroy_state(struct drm_crtc *crtc,
4584                                   struct drm_crtc_state *state)
4585 {
4586         struct dm_crtc_state *cur = to_dm_crtc_state(state);
4587
4588         /* TODO Destroy dc_stream objects are stream object is flattened */
4589         if (cur->stream)
4590                 dc_stream_release(cur->stream);
4591
4592
4593         __drm_atomic_helper_crtc_destroy_state(state);
4594
4595
4596         kfree(state);
4597 }
4598
4599 static void dm_crtc_reset_state(struct drm_crtc *crtc)
4600 {
4601         struct dm_crtc_state *state;
4602
4603         if (crtc->state)
4604                 dm_crtc_destroy_state(crtc, crtc->state);
4605
4606         state = kzalloc(sizeof(*state), GFP_KERNEL);
4607         if (WARN_ON(!state))
4608                 return;
4609
4610         crtc->state = &state->base;
4611         crtc->state->crtc = crtc;
4612
4613 }
4614
4615 static struct drm_crtc_state *
4616 dm_crtc_duplicate_state(struct drm_crtc *crtc)
4617 {
4618         struct dm_crtc_state *state, *cur;
4619
4620         cur = to_dm_crtc_state(crtc->state);
4621
4622         if (WARN_ON(!crtc->state))
4623                 return NULL;
4624
4625         state = kzalloc(sizeof(*state), GFP_KERNEL);
4626         if (!state)
4627                 return NULL;
4628
4629         __drm_atomic_helper_crtc_duplicate_state(crtc, &state->base);
4630
4631         if (cur->stream) {
4632                 state->stream = cur->stream;
4633                 dc_stream_retain(state->stream);
4634         }
4635
4636         state->active_planes = cur->active_planes;
4637         state->interrupts_enabled = cur->interrupts_enabled;
4638         state->vrr_params = cur->vrr_params;
4639         state->vrr_infopacket = cur->vrr_infopacket;
4640         state->abm_level = cur->abm_level;
4641         state->vrr_supported = cur->vrr_supported;
4642         state->freesync_config = cur->freesync_config;
4643         state->crc_src = cur->crc_src;
4644         state->cm_has_degamma = cur->cm_has_degamma;
4645         state->cm_is_degamma_srgb = cur->cm_is_degamma_srgb;
4646
4647         /* TODO Duplicate dc_stream after objects are stream object is flattened */
4648
4649         return &state->base;
4650 }
4651
4652 static inline int dm_set_vupdate_irq(struct drm_crtc *crtc, bool enable)
4653 {
4654         enum dc_irq_source irq_source;
4655         struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc);
4656         struct amdgpu_device *adev = crtc->dev->dev_private;
4657         int rc;
4658
4659         irq_source = IRQ_TYPE_VUPDATE + acrtc->otg_inst;
4660
4661         rc = dc_interrupt_set(adev->dm.dc, irq_source, enable) ? 0 : -EBUSY;
4662
4663         DRM_DEBUG_DRIVER("crtc %d - vupdate irq %sabling: r=%d\n",
4664                          acrtc->crtc_id, enable ? "en" : "dis", rc);
4665         return rc;
4666 }
4667
4668 static inline int dm_set_vblank(struct drm_crtc *crtc, bool enable)
4669 {
4670         enum dc_irq_source irq_source;
4671         struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc);
4672         struct amdgpu_device *adev = crtc->dev->dev_private;
4673         struct dm_crtc_state *acrtc_state = to_dm_crtc_state(crtc->state);
4674         int rc = 0;
4675
4676         if (enable) {
4677                 /* vblank irq on -> Only need vupdate irq in vrr mode */
4678                 if (amdgpu_dm_vrr_active(acrtc_state))
4679                         rc = dm_set_vupdate_irq(crtc, true);
4680         } else {
4681                 /* vblank irq off -> vupdate irq off */
4682                 rc = dm_set_vupdate_irq(crtc, false);
4683         }
4684
4685         if (rc)
4686                 return rc;
4687
4688         irq_source = IRQ_TYPE_VBLANK + acrtc->otg_inst;
4689         return dc_interrupt_set(adev->dm.dc, irq_source, enable) ? 0 : -EBUSY;
4690 }
4691
4692 static int dm_enable_vblank(struct drm_crtc *crtc)
4693 {
4694         return dm_set_vblank(crtc, true);
4695 }
4696
4697 static void dm_disable_vblank(struct drm_crtc *crtc)
4698 {
4699         dm_set_vblank(crtc, false);
4700 }
4701
4702 /* Implemented only the options currently availible for the driver */
4703 static const struct drm_crtc_funcs amdgpu_dm_crtc_funcs = {
4704         .reset = dm_crtc_reset_state,
4705         .destroy = amdgpu_dm_crtc_destroy,
4706         .gamma_set = drm_atomic_helper_legacy_gamma_set,
4707         .set_config = drm_atomic_helper_set_config,
4708         .page_flip = drm_atomic_helper_page_flip,
4709         .atomic_duplicate_state = dm_crtc_duplicate_state,
4710         .atomic_destroy_state = dm_crtc_destroy_state,
4711         .set_crc_source = amdgpu_dm_crtc_set_crc_source,
4712         .verify_crc_source = amdgpu_dm_crtc_verify_crc_source,
4713         .get_crc_sources = amdgpu_dm_crtc_get_crc_sources,
4714         .get_vblank_counter = amdgpu_get_vblank_counter_kms,
4715         .enable_vblank = dm_enable_vblank,
4716         .disable_vblank = dm_disable_vblank,
4717         .get_vblank_timestamp = drm_crtc_vblank_helper_get_vblank_timestamp,
4718 };
4719
4720 static enum drm_connector_status
4721 amdgpu_dm_connector_detect(struct drm_connector *connector, bool force)
4722 {
4723         bool connected;
4724         struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
4725
4726         /*
4727          * Notes:
4728          * 1. This interface is NOT called in context of HPD irq.
4729          * 2. This interface *is called* in context of user-mode ioctl. Which
4730          * makes it a bad place for *any* MST-related activity.
4731          */
4732
4733         if (aconnector->base.force == DRM_FORCE_UNSPECIFIED &&
4734             !aconnector->fake_enable)
4735                 connected = (aconnector->dc_sink != NULL);
4736         else
4737                 connected = (aconnector->base.force == DRM_FORCE_ON);
4738
4739         return (connected ? connector_status_connected :
4740                         connector_status_disconnected);
4741 }
4742
4743 int amdgpu_dm_connector_atomic_set_property(struct drm_connector *connector,
4744                                             struct drm_connector_state *connector_state,
4745                                             struct drm_property *property,
4746                                             uint64_t val)
4747 {
4748         struct drm_device *dev = connector->dev;
4749         struct amdgpu_device *adev = dev->dev_private;
4750         struct dm_connector_state *dm_old_state =
4751                 to_dm_connector_state(connector->state);
4752         struct dm_connector_state *dm_new_state =
4753                 to_dm_connector_state(connector_state);
4754
4755         int ret = -EINVAL;
4756
4757         if (property == dev->mode_config.scaling_mode_property) {
4758                 enum amdgpu_rmx_type rmx_type;
4759
4760                 switch (val) {
4761                 case DRM_MODE_SCALE_CENTER:
4762                         rmx_type = RMX_CENTER;
4763                         break;
4764                 case DRM_MODE_SCALE_ASPECT:
4765                         rmx_type = RMX_ASPECT;
4766                         break;
4767                 case DRM_MODE_SCALE_FULLSCREEN:
4768                         rmx_type = RMX_FULL;
4769                         break;
4770                 case DRM_MODE_SCALE_NONE:
4771                 default:
4772                         rmx_type = RMX_OFF;
4773                         break;
4774                 }
4775
4776                 if (dm_old_state->scaling == rmx_type)
4777                         return 0;
4778
4779                 dm_new_state->scaling = rmx_type;
4780                 ret = 0;
4781         } else if (property == adev->mode_info.underscan_hborder_property) {
4782                 dm_new_state->underscan_hborder = val;
4783                 ret = 0;
4784         } else if (property == adev->mode_info.underscan_vborder_property) {
4785                 dm_new_state->underscan_vborder = val;
4786                 ret = 0;
4787         } else if (property == adev->mode_info.underscan_property) {
4788                 dm_new_state->underscan_enable = val;
4789                 ret = 0;
4790         } else if (property == adev->mode_info.abm_level_property) {
4791                 dm_new_state->abm_level = val;
4792                 ret = 0;
4793         }
4794
4795         return ret;
4796 }
4797
4798 int amdgpu_dm_connector_atomic_get_property(struct drm_connector *connector,
4799                                             const struct drm_connector_state *state,
4800                                             struct drm_property *property,
4801                                             uint64_t *val)
4802 {
4803         struct drm_device *dev = connector->dev;
4804         struct amdgpu_device *adev = dev->dev_private;
4805         struct dm_connector_state *dm_state =
4806                 to_dm_connector_state(state);
4807         int ret = -EINVAL;
4808
4809         if (property == dev->mode_config.scaling_mode_property) {
4810                 switch (dm_state->scaling) {
4811                 case RMX_CENTER:
4812                         *val = DRM_MODE_SCALE_CENTER;
4813                         break;
4814                 case RMX_ASPECT:
4815                         *val = DRM_MODE_SCALE_ASPECT;
4816                         break;
4817                 case RMX_FULL:
4818                         *val = DRM_MODE_SCALE_FULLSCREEN;
4819                         break;
4820                 case RMX_OFF:
4821                 default:
4822                         *val = DRM_MODE_SCALE_NONE;
4823                         break;
4824                 }
4825                 ret = 0;
4826         } else if (property == adev->mode_info.underscan_hborder_property) {
4827                 *val = dm_state->underscan_hborder;
4828                 ret = 0;
4829         } else if (property == adev->mode_info.underscan_vborder_property) {
4830                 *val = dm_state->underscan_vborder;
4831                 ret = 0;
4832         } else if (property == adev->mode_info.underscan_property) {
4833                 *val = dm_state->underscan_enable;
4834                 ret = 0;
4835         } else if (property == adev->mode_info.abm_level_property) {
4836                 *val = dm_state->abm_level;
4837                 ret = 0;
4838         }
4839
4840         return ret;
4841 }
4842
4843 static void amdgpu_dm_connector_unregister(struct drm_connector *connector)
4844 {
4845         struct amdgpu_dm_connector *amdgpu_dm_connector = to_amdgpu_dm_connector(connector);
4846
4847         drm_dp_aux_unregister(&amdgpu_dm_connector->dm_dp_aux.aux);
4848 }
4849
4850 static void amdgpu_dm_connector_destroy(struct drm_connector *connector)
4851 {
4852         struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
4853         const struct dc_link *link = aconnector->dc_link;
4854         struct amdgpu_device *adev = connector->dev->dev_private;
4855         struct amdgpu_display_manager *dm = &adev->dm;
4856
4857 #if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) ||\
4858         defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
4859
4860         if ((link->connector_signal & (SIGNAL_TYPE_EDP | SIGNAL_TYPE_LVDS)) &&
4861             link->type != dc_connection_none &&
4862             dm->backlight_dev) {
4863                 backlight_device_unregister(dm->backlight_dev);
4864                 dm->backlight_dev = NULL;
4865         }
4866 #endif
4867
4868         if (aconnector->dc_em_sink)
4869                 dc_sink_release(aconnector->dc_em_sink);
4870         aconnector->dc_em_sink = NULL;
4871         if (aconnector->dc_sink)
4872                 dc_sink_release(aconnector->dc_sink);
4873         aconnector->dc_sink = NULL;
4874
4875         drm_dp_cec_unregister_connector(&aconnector->dm_dp_aux.aux);
4876         drm_connector_unregister(connector);
4877         drm_connector_cleanup(connector);
4878         if (aconnector->i2c) {
4879                 i2c_del_adapter(&aconnector->i2c->base);
4880                 kfree(aconnector->i2c);
4881         }
4882         kfree(aconnector->dm_dp_aux.aux.name);
4883
4884         kfree(connector);
4885 }
4886
4887 void amdgpu_dm_connector_funcs_reset(struct drm_connector *connector)
4888 {
4889         struct dm_connector_state *state =
4890                 to_dm_connector_state(connector->state);
4891
4892         if (connector->state)
4893                 __drm_atomic_helper_connector_destroy_state(connector->state);
4894
4895         kfree(state);
4896
4897         state = kzalloc(sizeof(*state), GFP_KERNEL);
4898
4899         if (state) {
4900                 state->scaling = RMX_OFF;
4901                 state->underscan_enable = false;
4902                 state->underscan_hborder = 0;
4903                 state->underscan_vborder = 0;
4904                 state->base.max_requested_bpc = 8;
4905                 state->vcpi_slots = 0;
4906                 state->pbn = 0;
4907                 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP)
4908                         state->abm_level = amdgpu_dm_abm_level;
4909
4910                 __drm_atomic_helper_connector_reset(connector, &state->base);
4911         }
4912 }
4913
4914 struct drm_connector_state *
4915 amdgpu_dm_connector_atomic_duplicate_state(struct drm_connector *connector)
4916 {
4917         struct dm_connector_state *state =
4918                 to_dm_connector_state(connector->state);
4919
4920         struct dm_connector_state *new_state =
4921                         kmemdup(state, sizeof(*state), GFP_KERNEL);
4922
4923         if (!new_state)
4924                 return NULL;
4925
4926         __drm_atomic_helper_connector_duplicate_state(connector, &new_state->base);
4927
4928         new_state->freesync_capable = state->freesync_capable;
4929         new_state->abm_level = state->abm_level;
4930         new_state->scaling = state->scaling;
4931         new_state->underscan_enable = state->underscan_enable;
4932         new_state->underscan_hborder = state->underscan_hborder;
4933         new_state->underscan_vborder = state->underscan_vborder;
4934         new_state->vcpi_slots = state->vcpi_slots;
4935         new_state->pbn = state->pbn;
4936         return &new_state->base;
4937 }
4938
4939 static int
4940 amdgpu_dm_connector_late_register(struct drm_connector *connector)
4941 {
4942         struct amdgpu_dm_connector *amdgpu_dm_connector =
4943                 to_amdgpu_dm_connector(connector);
4944         int r;
4945
4946         if ((connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) ||
4947             (connector->connector_type == DRM_MODE_CONNECTOR_eDP)) {
4948                 amdgpu_dm_connector->dm_dp_aux.aux.dev = connector->kdev;
4949                 r = drm_dp_aux_register(&amdgpu_dm_connector->dm_dp_aux.aux);
4950                 if (r)
4951                         return r;
4952         }
4953
4954 #if defined(CONFIG_DEBUG_FS)
4955         connector_debugfs_init(amdgpu_dm_connector);
4956 #endif
4957
4958         return 0;
4959 }
4960
4961 static const struct drm_connector_funcs amdgpu_dm_connector_funcs = {
4962         .reset = amdgpu_dm_connector_funcs_reset,
4963         .detect = amdgpu_dm_connector_detect,
4964         .fill_modes = drm_helper_probe_single_connector_modes,
4965         .destroy = amdgpu_dm_connector_destroy,
4966         .atomic_duplicate_state = amdgpu_dm_connector_atomic_duplicate_state,
4967         .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
4968         .atomic_set_property = amdgpu_dm_connector_atomic_set_property,
4969         .atomic_get_property = amdgpu_dm_connector_atomic_get_property,
4970         .late_register = amdgpu_dm_connector_late_register,
4971         .early_unregister = amdgpu_dm_connector_unregister
4972 };
4973
4974 static int get_modes(struct drm_connector *connector)
4975 {
4976         return amdgpu_dm_connector_get_modes(connector);
4977 }
4978
4979 static void create_eml_sink(struct amdgpu_dm_connector *aconnector)
4980 {
4981         struct dc_sink_init_data init_params = {
4982                         .link = aconnector->dc_link,
4983                         .sink_signal = SIGNAL_TYPE_VIRTUAL
4984         };
4985         struct edid *edid;
4986
4987         if (!aconnector->base.edid_blob_ptr) {
4988                 DRM_ERROR("No EDID firmware found on connector: %s ,forcing to OFF!\n",
4989                                 aconnector->base.name);
4990
4991                 aconnector->base.force = DRM_FORCE_OFF;
4992                 aconnector->base.override_edid = false;
4993                 return;
4994         }
4995
4996         edid = (struct edid *) aconnector->base.edid_blob_ptr->data;
4997
4998         aconnector->edid = edid;
4999
5000         aconnector->dc_em_sink = dc_link_add_remote_sink(
5001                 aconnector->dc_link,
5002                 (uint8_t *)edid,
5003                 (edid->extensions + 1) * EDID_LENGTH,
5004                 &init_params);
5005
5006         if (aconnector->base.force == DRM_FORCE_ON) {
5007                 aconnector->dc_sink = aconnector->dc_link->local_sink ?
5008                 aconnector->dc_link->local_sink :
5009                 aconnector->dc_em_sink;
5010                 dc_sink_retain(aconnector->dc_sink);
5011         }
5012 }
5013
5014 static void handle_edid_mgmt(struct amdgpu_dm_connector *aconnector)
5015 {
5016         struct dc_link *link = (struct dc_link *)aconnector->dc_link;
5017
5018         /*
5019          * In case of headless boot with force on for DP managed connector
5020          * Those settings have to be != 0 to get initial modeset
5021          */
5022         if (link->connector_signal == SIGNAL_TYPE_DISPLAY_PORT) {
5023                 link->verified_link_cap.lane_count = LANE_COUNT_FOUR;
5024                 link->verified_link_cap.link_rate = LINK_RATE_HIGH2;
5025         }
5026
5027
5028         aconnector->base.override_edid = true;
5029         create_eml_sink(aconnector);
5030 }
5031
5032 static struct dc_stream_state *
5033 create_validate_stream_for_sink(struct amdgpu_dm_connector *aconnector,
5034                                 const struct drm_display_mode *drm_mode,
5035                                 const struct dm_connector_state *dm_state,
5036                                 const struct dc_stream_state *old_stream)
5037 {
5038         struct drm_connector *connector = &aconnector->base;
5039         struct amdgpu_device *adev = connector->dev->dev_private;
5040         struct dc_stream_state *stream;
5041         const struct drm_connector_state *drm_state = dm_state ? &dm_state->base : NULL;
5042         int requested_bpc = drm_state ? drm_state->max_requested_bpc : 8;
5043         enum dc_status dc_result = DC_OK;
5044
5045         do {
5046                 stream = create_stream_for_sink(aconnector, drm_mode,
5047                                                 dm_state, old_stream,
5048                                                 requested_bpc);
5049                 if (stream == NULL) {
5050                         DRM_ERROR("Failed to create stream for sink!\n");
5051                         break;
5052                 }
5053
5054                 dc_result = dc_validate_stream(adev->dm.dc, stream);
5055
5056                 if (dc_result != DC_OK) {
5057                         DRM_DEBUG_KMS("Mode %dx%d (clk %d) failed DC validation with error %d\n",
5058                                       drm_mode->hdisplay,
5059                                       drm_mode->vdisplay,
5060                                       drm_mode->clock,
5061                                       dc_result);
5062
5063                         dc_stream_release(stream);
5064                         stream = NULL;
5065                         requested_bpc -= 2; /* lower bpc to retry validation */
5066                 }
5067
5068         } while (stream == NULL && requested_bpc >= 6);
5069
5070         return stream;
5071 }
5072
5073 enum drm_mode_status amdgpu_dm_connector_mode_valid(struct drm_connector *connector,
5074                                    struct drm_display_mode *mode)
5075 {
5076         int result = MODE_ERROR;
5077         struct dc_sink *dc_sink;
5078         /* TODO: Unhardcode stream count */
5079         struct dc_stream_state *stream;
5080         struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
5081
5082         if ((mode->flags & DRM_MODE_FLAG_INTERLACE) ||
5083                         (mode->flags & DRM_MODE_FLAG_DBLSCAN))
5084                 return result;
5085
5086         /*
5087          * Only run this the first time mode_valid is called to initilialize
5088          * EDID mgmt
5089          */
5090         if (aconnector->base.force != DRM_FORCE_UNSPECIFIED &&
5091                 !aconnector->dc_em_sink)
5092                 handle_edid_mgmt(aconnector);
5093
5094         dc_sink = to_amdgpu_dm_connector(connector)->dc_sink;
5095
5096         if (dc_sink == NULL) {
5097                 DRM_ERROR("dc_sink is NULL!\n");
5098                 goto fail;
5099         }
5100
5101         stream = create_validate_stream_for_sink(aconnector, mode, NULL, NULL);
5102         if (stream) {
5103                 dc_stream_release(stream);
5104                 result = MODE_OK;
5105         }
5106
5107 fail:
5108         /* TODO: error handling*/
5109         return result;
5110 }
5111
5112 static int fill_hdr_info_packet(const struct drm_connector_state *state,
5113                                 struct dc_info_packet *out)
5114 {
5115         struct hdmi_drm_infoframe frame;
5116         unsigned char buf[30]; /* 26 + 4 */
5117         ssize_t len;
5118         int ret, i;
5119
5120         memset(out, 0, sizeof(*out));
5121
5122         if (!state->hdr_output_metadata)
5123                 return 0;
5124
5125         ret = drm_hdmi_infoframe_set_hdr_metadata(&frame, state);
5126         if (ret)
5127                 return ret;
5128
5129         len = hdmi_drm_infoframe_pack_only(&frame, buf, sizeof(buf));
5130         if (len < 0)
5131                 return (int)len;
5132
5133         /* Static metadata is a fixed 26 bytes + 4 byte header. */
5134         if (len != 30)
5135                 return -EINVAL;
5136
5137         /* Prepare the infopacket for DC. */
5138         switch (state->connector->connector_type) {
5139         case DRM_MODE_CONNECTOR_HDMIA:
5140                 out->hb0 = 0x87; /* type */
5141                 out->hb1 = 0x01; /* version */
5142                 out->hb2 = 0x1A; /* length */
5143                 out->sb[0] = buf[3]; /* checksum */
5144                 i = 1;
5145                 break;
5146
5147         case DRM_MODE_CONNECTOR_DisplayPort:
5148         case DRM_MODE_CONNECTOR_eDP:
5149                 out->hb0 = 0x00; /* sdp id, zero */
5150                 out->hb1 = 0x87; /* type */
5151                 out->hb2 = 0x1D; /* payload len - 1 */
5152                 out->hb3 = (0x13 << 2); /* sdp version */
5153                 out->sb[0] = 0x01; /* version */
5154                 out->sb[1] = 0x1A; /* length */
5155                 i = 2;
5156                 break;
5157
5158         default:
5159                 return -EINVAL;
5160         }
5161
5162         memcpy(&out->sb[i], &buf[4], 26);
5163         out->valid = true;
5164
5165         print_hex_dump(KERN_DEBUG, "HDR SB:", DUMP_PREFIX_NONE, 16, 1, out->sb,
5166                        sizeof(out->sb), false);
5167
5168         return 0;
5169 }
5170
5171 static bool
5172 is_hdr_metadata_different(const struct drm_connector_state *old_state,
5173                           const struct drm_connector_state *new_state)
5174 {
5175         struct drm_property_blob *old_blob = old_state->hdr_output_metadata;
5176         struct drm_property_blob *new_blob = new_state->hdr_output_metadata;
5177
5178         if (old_blob != new_blob) {
5179                 if (old_blob && new_blob &&
5180                     old_blob->length == new_blob->length)
5181                         return memcmp(old_blob->data, new_blob->data,
5182                                       old_blob->length);
5183
5184                 return true;
5185         }
5186
5187         return false;
5188 }
5189
5190 static int
5191 amdgpu_dm_connector_atomic_check(struct drm_connector *conn,
5192                                  struct drm_atomic_state *state)
5193 {
5194         struct drm_connector_state *new_con_state =
5195                 drm_atomic_get_new_connector_state(state, conn);
5196         struct drm_connector_state *old_con_state =
5197                 drm_atomic_get_old_connector_state(state, conn);
5198         struct drm_crtc *crtc = new_con_state->crtc;
5199         struct drm_crtc_state *new_crtc_state;
5200         int ret;
5201
5202         if (!crtc)
5203                 return 0;
5204
5205         if (is_hdr_metadata_different(old_con_state, new_con_state)) {
5206                 struct dc_info_packet hdr_infopacket;
5207
5208                 ret = fill_hdr_info_packet(new_con_state, &hdr_infopacket);
5209                 if (ret)
5210                         return ret;
5211
5212                 new_crtc_state = drm_atomic_get_crtc_state(state, crtc);
5213                 if (IS_ERR(new_crtc_state))
5214                         return PTR_ERR(new_crtc_state);
5215
5216                 /*
5217                  * DC considers the stream backends changed if the
5218                  * static metadata changes. Forcing the modeset also
5219                  * gives a simple way for userspace to switch from
5220                  * 8bpc to 10bpc when setting the metadata to enter
5221                  * or exit HDR.
5222                  *
5223                  * Changing the static metadata after it's been
5224                  * set is permissible, however. So only force a
5225                  * modeset if we're entering or exiting HDR.
5226                  */
5227                 new_crtc_state->mode_changed =
5228                         !old_con_state->hdr_output_metadata ||
5229                         !new_con_state->hdr_output_metadata;
5230         }
5231
5232         return 0;
5233 }
5234
5235 static const struct drm_connector_helper_funcs
5236 amdgpu_dm_connector_helper_funcs = {
5237         /*
5238          * If hotplugging a second bigger display in FB Con mode, bigger resolution
5239          * modes will be filtered by drm_mode_validate_size(), and those modes
5240          * are missing after user start lightdm. So we need to renew modes list.
5241          * in get_modes call back, not just return the modes count
5242          */
5243         .get_modes = get_modes,
5244         .mode_valid = amdgpu_dm_connector_mode_valid,
5245         .atomic_check = amdgpu_dm_connector_atomic_check,
5246 };
5247
5248 static void dm_crtc_helper_disable(struct drm_crtc *crtc)
5249 {
5250 }
5251
5252 static bool does_crtc_have_active_cursor(struct drm_crtc_state *new_crtc_state)
5253 {
5254         struct drm_device *dev = new_crtc_state->crtc->dev;
5255         struct drm_plane *plane;
5256
5257         drm_for_each_plane_mask(plane, dev, new_crtc_state->plane_mask) {
5258                 if (plane->type == DRM_PLANE_TYPE_CURSOR)
5259                         return true;
5260         }
5261
5262         return false;
5263 }
5264
5265 static int count_crtc_active_planes(struct drm_crtc_state *new_crtc_state)
5266 {
5267         struct drm_atomic_state *state = new_crtc_state->state;
5268         struct drm_plane *plane;
5269         int num_active = 0;
5270
5271         drm_for_each_plane_mask(plane, state->dev, new_crtc_state->plane_mask) {
5272                 struct drm_plane_state *new_plane_state;
5273
5274                 /* Cursor planes are "fake". */
5275                 if (plane->type == DRM_PLANE_TYPE_CURSOR)
5276                         continue;
5277
5278                 new_plane_state = drm_atomic_get_new_plane_state(state, plane);
5279
5280                 if (!new_plane_state) {
5281                         /*
5282                          * The plane is enable on the CRTC and hasn't changed
5283                          * state. This means that it previously passed
5284                          * validation and is therefore enabled.
5285                          */
5286                         num_active += 1;
5287                         continue;
5288                 }
5289
5290                 /* We need a framebuffer to be considered enabled. */
5291                 num_active += (new_plane_state->fb != NULL);
5292         }
5293
5294         return num_active;
5295 }
5296
5297 /*
5298  * Sets whether interrupts should be enabled on a specific CRTC.
5299  * We require that the stream be enabled and that there exist active
5300  * DC planes on the stream.
5301  */
5302 static void
5303 dm_update_crtc_interrupt_state(struct drm_crtc *crtc,
5304                                struct drm_crtc_state *new_crtc_state)
5305 {
5306         struct dm_crtc_state *dm_new_crtc_state =
5307                 to_dm_crtc_state(new_crtc_state);
5308
5309         dm_new_crtc_state->active_planes = 0;
5310         dm_new_crtc_state->interrupts_enabled = false;
5311
5312         if (!dm_new_crtc_state->stream)
5313                 return;
5314
5315         dm_new_crtc_state->active_planes =
5316                 count_crtc_active_planes(new_crtc_state);
5317
5318         dm_new_crtc_state->interrupts_enabled =
5319                 dm_new_crtc_state->active_planes > 0;
5320 }
5321
5322 static int dm_crtc_helper_atomic_check(struct drm_crtc *crtc,
5323                                        struct drm_crtc_state *state)
5324 {
5325         struct amdgpu_device *adev = crtc->dev->dev_private;
5326         struct dc *dc = adev->dm.dc;
5327         struct dm_crtc_state *dm_crtc_state = to_dm_crtc_state(state);
5328         int ret = -EINVAL;
5329
5330         /*
5331          * Update interrupt state for the CRTC. This needs to happen whenever
5332          * the CRTC has changed or whenever any of its planes have changed.
5333          * Atomic check satisfies both of these requirements since the CRTC
5334          * is added to the state by DRM during drm_atomic_helper_check_planes.
5335          */
5336         dm_update_crtc_interrupt_state(crtc, state);
5337
5338         if (unlikely(!dm_crtc_state->stream &&
5339                      modeset_required(state, NULL, dm_crtc_state->stream))) {
5340                 WARN_ON(1);
5341                 return ret;
5342         }
5343
5344         /* In some use cases, like reset, no stream is attached */
5345         if (!dm_crtc_state->stream)
5346                 return 0;
5347
5348         /*
5349          * We want at least one hardware plane enabled to use
5350          * the stream with a cursor enabled.
5351          */
5352         if (state->enable && state->active &&
5353             does_crtc_have_active_cursor(state) &&
5354             dm_crtc_state->active_planes == 0)
5355                 return -EINVAL;
5356
5357         if (dc_validate_stream(dc, dm_crtc_state->stream) == DC_OK)
5358                 return 0;
5359
5360         return ret;
5361 }
5362
5363 static bool dm_crtc_helper_mode_fixup(struct drm_crtc *crtc,
5364                                       const struct drm_display_mode *mode,
5365                                       struct drm_display_mode *adjusted_mode)
5366 {
5367         return true;
5368 }
5369
5370 static const struct drm_crtc_helper_funcs amdgpu_dm_crtc_helper_funcs = {
5371         .disable = dm_crtc_helper_disable,
5372         .atomic_check = dm_crtc_helper_atomic_check,
5373         .mode_fixup = dm_crtc_helper_mode_fixup,
5374         .get_scanout_position = amdgpu_crtc_get_scanout_position,
5375 };
5376
5377 static void dm_encoder_helper_disable(struct drm_encoder *encoder)
5378 {
5379
5380 }
5381
5382 static int convert_dc_color_depth_into_bpc (enum dc_color_depth display_color_depth)
5383 {
5384         switch (display_color_depth) {
5385                 case COLOR_DEPTH_666:
5386                         return 6;
5387                 case COLOR_DEPTH_888:
5388                         return 8;
5389                 case COLOR_DEPTH_101010:
5390                         return 10;
5391                 case COLOR_DEPTH_121212:
5392                         return 12;
5393                 case COLOR_DEPTH_141414:
5394                         return 14;
5395                 case COLOR_DEPTH_161616:
5396                         return 16;
5397                 default:
5398                         break;
5399                 }
5400         return 0;
5401 }
5402
5403 static int dm_encoder_helper_atomic_check(struct drm_encoder *encoder,
5404                                           struct drm_crtc_state *crtc_state,
5405                                           struct drm_connector_state *conn_state)
5406 {
5407         struct drm_atomic_state *state = crtc_state->state;
5408         struct drm_connector *connector = conn_state->connector;
5409         struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
5410         struct dm_connector_state *dm_new_connector_state = to_dm_connector_state(conn_state);
5411         const struct drm_display_mode *adjusted_mode = &crtc_state->adjusted_mode;
5412         struct drm_dp_mst_topology_mgr *mst_mgr;
5413         struct drm_dp_mst_port *mst_port;
5414         enum dc_color_depth color_depth;
5415         int clock, bpp = 0;
5416         bool is_y420 = false;
5417
5418         if (!aconnector->port || !aconnector->dc_sink)
5419                 return 0;
5420
5421         mst_port = aconnector->port;
5422         mst_mgr = &aconnector->mst_port->mst_mgr;
5423
5424         if (!crtc_state->connectors_changed && !crtc_state->mode_changed)
5425                 return 0;
5426
5427         if (!state->duplicated) {
5428                 int max_bpc = conn_state->max_requested_bpc;
5429                 is_y420 = drm_mode_is_420_also(&connector->display_info, adjusted_mode) &&
5430                                 aconnector->force_yuv420_output;
5431                 color_depth = convert_color_depth_from_display_info(connector,
5432                                                                     is_y420,
5433                                                                     max_bpc);
5434                 bpp = convert_dc_color_depth_into_bpc(color_depth) * 3;
5435                 clock = adjusted_mode->clock;
5436                 dm_new_connector_state->pbn = drm_dp_calc_pbn_mode(clock, bpp, false);
5437         }
5438         dm_new_connector_state->vcpi_slots = drm_dp_atomic_find_vcpi_slots(state,
5439                                                                            mst_mgr,
5440                                                                            mst_port,
5441                                                                            dm_new_connector_state->pbn,
5442                                                                            0);
5443         if (dm_new_connector_state->vcpi_slots < 0) {
5444                 DRM_DEBUG_ATOMIC("failed finding vcpi slots: %d\n", (int)dm_new_connector_state->vcpi_slots);
5445                 return dm_new_connector_state->vcpi_slots;
5446         }
5447         return 0;
5448 }
5449
5450 const struct drm_encoder_helper_funcs amdgpu_dm_encoder_helper_funcs = {
5451         .disable = dm_encoder_helper_disable,
5452         .atomic_check = dm_encoder_helper_atomic_check
5453 };
5454
5455 #if defined(CONFIG_DRM_AMD_DC_DCN)
5456 static int dm_update_mst_vcpi_slots_for_dsc(struct drm_atomic_state *state,
5457                                             struct dc_state *dc_state)
5458 {
5459         struct dc_stream_state *stream = NULL;
5460         struct drm_connector *connector;
5461         struct drm_connector_state *new_con_state, *old_con_state;
5462         struct amdgpu_dm_connector *aconnector;
5463         struct dm_connector_state *dm_conn_state;
5464         int i, j, clock, bpp;
5465         int vcpi, pbn_div, pbn = 0;
5466
5467         for_each_oldnew_connector_in_state(state, connector, old_con_state, new_con_state, i) {
5468
5469                 aconnector = to_amdgpu_dm_connector(connector);
5470
5471                 if (!aconnector->port)
5472                         continue;
5473
5474                 if (!new_con_state || !new_con_state->crtc)
5475                         continue;
5476
5477                 dm_conn_state = to_dm_connector_state(new_con_state);
5478
5479                 for (j = 0; j < dc_state->stream_count; j++) {
5480                         stream = dc_state->streams[j];
5481                         if (!stream)
5482                                 continue;
5483
5484                         if ((struct amdgpu_dm_connector*)stream->dm_stream_context == aconnector)
5485                                 break;
5486
5487                         stream = NULL;
5488                 }
5489
5490                 if (!stream)
5491                         continue;
5492
5493                 if (stream->timing.flags.DSC != 1) {
5494                         drm_dp_mst_atomic_enable_dsc(state,
5495                                                      aconnector->port,
5496                                                      dm_conn_state->pbn,
5497                                                      0,
5498                                                      false);
5499                         continue;
5500                 }
5501
5502                 pbn_div = dm_mst_get_pbn_divider(stream->link);
5503                 bpp = stream->timing.dsc_cfg.bits_per_pixel;
5504                 clock = stream->timing.pix_clk_100hz / 10;
5505                 pbn = drm_dp_calc_pbn_mode(clock, bpp, true);
5506                 vcpi = drm_dp_mst_atomic_enable_dsc(state,
5507                                                     aconnector->port,
5508                                                     pbn, pbn_div,
5509                                                     true);
5510                 if (vcpi < 0)
5511                         return vcpi;
5512
5513                 dm_conn_state->pbn = pbn;
5514                 dm_conn_state->vcpi_slots = vcpi;
5515         }
5516         return 0;
5517 }
5518 #endif
5519
5520 static void dm_drm_plane_reset(struct drm_plane *plane)
5521 {
5522         struct dm_plane_state *amdgpu_state = NULL;
5523
5524         if (plane->state)
5525                 plane->funcs->atomic_destroy_state(plane, plane->state);
5526
5527         amdgpu_state = kzalloc(sizeof(*amdgpu_state), GFP_KERNEL);
5528         WARN_ON(amdgpu_state == NULL);
5529
5530         if (amdgpu_state)
5531                 __drm_atomic_helper_plane_reset(plane, &amdgpu_state->base);
5532 }
5533
5534 static struct drm_plane_state *
5535 dm_drm_plane_duplicate_state(struct drm_plane *plane)
5536 {
5537         struct dm_plane_state *dm_plane_state, *old_dm_plane_state;
5538
5539         old_dm_plane_state = to_dm_plane_state(plane->state);
5540         dm_plane_state = kzalloc(sizeof(*dm_plane_state), GFP_KERNEL);
5541         if (!dm_plane_state)
5542                 return NULL;
5543
5544         __drm_atomic_helper_plane_duplicate_state(plane, &dm_plane_state->base);
5545
5546         if (old_dm_plane_state->dc_state) {
5547                 dm_plane_state->dc_state = old_dm_plane_state->dc_state;
5548                 dc_plane_state_retain(dm_plane_state->dc_state);
5549         }
5550
5551         return &dm_plane_state->base;
5552 }
5553
5554 void dm_drm_plane_destroy_state(struct drm_plane *plane,
5555                                 struct drm_plane_state *state)
5556 {
5557         struct dm_plane_state *dm_plane_state = to_dm_plane_state(state);
5558
5559         if (dm_plane_state->dc_state)
5560                 dc_plane_state_release(dm_plane_state->dc_state);
5561
5562         drm_atomic_helper_plane_destroy_state(plane, state);
5563 }
5564
5565 static const struct drm_plane_funcs dm_plane_funcs = {
5566         .update_plane   = drm_atomic_helper_update_plane,
5567         .disable_plane  = drm_atomic_helper_disable_plane,
5568         .destroy        = drm_primary_helper_destroy,
5569         .reset = dm_drm_plane_reset,
5570         .atomic_duplicate_state = dm_drm_plane_duplicate_state,
5571         .atomic_destroy_state = dm_drm_plane_destroy_state,
5572 };
5573
5574 static int dm_plane_helper_prepare_fb(struct drm_plane *plane,
5575                                       struct drm_plane_state *new_state)
5576 {
5577         struct amdgpu_framebuffer *afb;
5578         struct drm_gem_object *obj;
5579         struct amdgpu_device *adev;
5580         struct amdgpu_bo *rbo;
5581         struct dm_plane_state *dm_plane_state_new, *dm_plane_state_old;
5582         struct list_head list;
5583         struct ttm_validate_buffer tv;
5584         struct ww_acquire_ctx ticket;
5585         uint64_t tiling_flags;
5586         uint32_t domain;
5587         int r;
5588         bool tmz_surface = false;
5589         bool force_disable_dcc = false;
5590
5591         dm_plane_state_old = to_dm_plane_state(plane->state);
5592         dm_plane_state_new = to_dm_plane_state(new_state);
5593
5594         if (!new_state->fb) {
5595                 DRM_DEBUG_DRIVER("No FB bound\n");
5596                 return 0;
5597         }
5598
5599         afb = to_amdgpu_framebuffer(new_state->fb);
5600         obj = new_state->fb->obj[0];
5601         rbo = gem_to_amdgpu_bo(obj);
5602         adev = amdgpu_ttm_adev(rbo->tbo.bdev);
5603         INIT_LIST_HEAD(&list);
5604
5605         tv.bo = &rbo->tbo;
5606         tv.num_shared = 1;
5607         list_add(&tv.head, &list);
5608
5609         r = ttm_eu_reserve_buffers(&ticket, &list, false, NULL);
5610         if (r) {
5611                 dev_err(adev->dev, "fail to reserve bo (%d)\n", r);
5612                 return r;
5613         }
5614
5615         if (plane->type != DRM_PLANE_TYPE_CURSOR)
5616                 domain = amdgpu_display_supported_domains(adev, rbo->flags);
5617         else
5618                 domain = AMDGPU_GEM_DOMAIN_VRAM;
5619
5620         r = amdgpu_bo_pin(rbo, domain);
5621         if (unlikely(r != 0)) {
5622                 if (r != -ERESTARTSYS)
5623                         DRM_ERROR("Failed to pin framebuffer with error %d\n", r);
5624                 ttm_eu_backoff_reservation(&ticket, &list);
5625                 return r;
5626         }
5627
5628         r = amdgpu_ttm_alloc_gart(&rbo->tbo);
5629         if (unlikely(r != 0)) {
5630                 amdgpu_bo_unpin(rbo);
5631                 ttm_eu_backoff_reservation(&ticket, &list);
5632                 DRM_ERROR("%p bind failed\n", rbo);
5633                 return r;
5634         }
5635
5636         amdgpu_bo_get_tiling_flags(rbo, &tiling_flags);
5637
5638         tmz_surface = amdgpu_bo_encrypted(rbo);
5639
5640         ttm_eu_backoff_reservation(&ticket, &list);
5641
5642         afb->address = amdgpu_bo_gpu_offset(rbo);
5643
5644         amdgpu_bo_ref(rbo);
5645
5646         if (dm_plane_state_new->dc_state &&
5647                         dm_plane_state_old->dc_state != dm_plane_state_new->dc_state) {
5648                 struct dc_plane_state *plane_state = dm_plane_state_new->dc_state;
5649
5650                 force_disable_dcc = adev->asic_type == CHIP_RAVEN && adev->in_suspend;
5651                 fill_plane_buffer_attributes(
5652                         adev, afb, plane_state->format, plane_state->rotation,
5653                         tiling_flags, &plane_state->tiling_info,
5654                         &plane_state->plane_size, &plane_state->dcc,
5655                         &plane_state->address, tmz_surface,
5656                         force_disable_dcc);
5657         }
5658
5659         return 0;
5660 }
5661
5662 static void dm_plane_helper_cleanup_fb(struct drm_plane *plane,
5663                                        struct drm_plane_state *old_state)
5664 {
5665         struct amdgpu_bo *rbo;
5666         int r;
5667
5668         if (!old_state->fb)
5669                 return;
5670
5671         rbo = gem_to_amdgpu_bo(old_state->fb->obj[0]);
5672         r = amdgpu_bo_reserve(rbo, false);
5673         if (unlikely(r)) {
5674                 DRM_ERROR("failed to reserve rbo before unpin\n");
5675                 return;
5676         }
5677
5678         amdgpu_bo_unpin(rbo);
5679         amdgpu_bo_unreserve(rbo);
5680         amdgpu_bo_unref(&rbo);
5681 }
5682
5683 static int dm_plane_atomic_check(struct drm_plane *plane,
5684                                  struct drm_plane_state *state)
5685 {
5686         struct amdgpu_device *adev = plane->dev->dev_private;
5687         struct dc *dc = adev->dm.dc;
5688         struct dm_plane_state *dm_plane_state;
5689         struct dc_scaling_info scaling_info;
5690         int ret;
5691
5692         dm_plane_state = to_dm_plane_state(state);
5693
5694         if (!dm_plane_state->dc_state)
5695                 return 0;
5696
5697         ret = fill_dc_scaling_info(state, &scaling_info);
5698         if (ret)
5699                 return ret;
5700
5701         if (dc_validate_plane(dc, dm_plane_state->dc_state) == DC_OK)
5702                 return 0;
5703
5704         return -EINVAL;
5705 }
5706
5707 static int dm_plane_atomic_async_check(struct drm_plane *plane,
5708                                        struct drm_plane_state *new_plane_state)
5709 {
5710         /* Only support async updates on cursor planes. */
5711         if (plane->type != DRM_PLANE_TYPE_CURSOR)
5712                 return -EINVAL;
5713
5714         return 0;
5715 }
5716
5717 static void dm_plane_atomic_async_update(struct drm_plane *plane,
5718                                          struct drm_plane_state *new_state)
5719 {
5720         struct drm_plane_state *old_state =
5721                 drm_atomic_get_old_plane_state(new_state->state, plane);
5722
5723         swap(plane->state->fb, new_state->fb);
5724
5725         plane->state->src_x = new_state->src_x;
5726         plane->state->src_y = new_state->src_y;
5727         plane->state->src_w = new_state->src_w;
5728         plane->state->src_h = new_state->src_h;
5729         plane->state->crtc_x = new_state->crtc_x;
5730         plane->state->crtc_y = new_state->crtc_y;
5731         plane->state->crtc_w = new_state->crtc_w;
5732         plane->state->crtc_h = new_state->crtc_h;
5733
5734         handle_cursor_update(plane, old_state);
5735 }
5736
5737 static const struct drm_plane_helper_funcs dm_plane_helper_funcs = {
5738         .prepare_fb = dm_plane_helper_prepare_fb,
5739         .cleanup_fb = dm_plane_helper_cleanup_fb,
5740         .atomic_check = dm_plane_atomic_check,
5741         .atomic_async_check = dm_plane_atomic_async_check,
5742         .atomic_async_update = dm_plane_atomic_async_update
5743 };
5744
5745 /*
5746  * TODO: these are currently initialized to rgb formats only.
5747  * For future use cases we should either initialize them dynamically based on
5748  * plane capabilities, or initialize this array to all formats, so internal drm
5749  * check will succeed, and let DC implement proper check
5750  */
5751 static const uint32_t rgb_formats[] = {
5752         DRM_FORMAT_XRGB8888,
5753         DRM_FORMAT_ARGB8888,
5754         DRM_FORMAT_RGBA8888,
5755         DRM_FORMAT_XRGB2101010,
5756         DRM_FORMAT_XBGR2101010,
5757         DRM_FORMAT_ARGB2101010,
5758         DRM_FORMAT_ABGR2101010,
5759         DRM_FORMAT_XBGR8888,
5760         DRM_FORMAT_ABGR8888,
5761         DRM_FORMAT_RGB565,
5762 };
5763
5764 static const uint32_t overlay_formats[] = {
5765         DRM_FORMAT_XRGB8888,
5766         DRM_FORMAT_ARGB8888,
5767         DRM_FORMAT_RGBA8888,
5768         DRM_FORMAT_XBGR8888,
5769         DRM_FORMAT_ABGR8888,
5770         DRM_FORMAT_RGB565
5771 };
5772
5773 static const u32 cursor_formats[] = {
5774         DRM_FORMAT_ARGB8888
5775 };
5776
5777 static int get_plane_formats(const struct drm_plane *plane,
5778                              const struct dc_plane_cap *plane_cap,
5779                              uint32_t *formats, int max_formats)
5780 {
5781         int i, num_formats = 0;
5782
5783         /*
5784          * TODO: Query support for each group of formats directly from
5785          * DC plane caps. This will require adding more formats to the
5786          * caps list.
5787          */
5788
5789         switch (plane->type) {
5790         case DRM_PLANE_TYPE_PRIMARY:
5791                 for (i = 0; i < ARRAY_SIZE(rgb_formats); ++i) {
5792                         if (num_formats >= max_formats)
5793                                 break;
5794
5795                         formats[num_formats++] = rgb_formats[i];
5796                 }
5797
5798                 if (plane_cap && plane_cap->pixel_format_support.nv12)
5799                         formats[num_formats++] = DRM_FORMAT_NV12;
5800                 if (plane_cap && plane_cap->pixel_format_support.p010)
5801                         formats[num_formats++] = DRM_FORMAT_P010;
5802                 if (plane_cap && plane_cap->pixel_format_support.fp16) {
5803                         formats[num_formats++] = DRM_FORMAT_XRGB16161616F;
5804                         formats[num_formats++] = DRM_FORMAT_ARGB16161616F;
5805                         formats[num_formats++] = DRM_FORMAT_XBGR16161616F;
5806                         formats[num_formats++] = DRM_FORMAT_ABGR16161616F;
5807                 }
5808                 break;
5809
5810         case DRM_PLANE_TYPE_OVERLAY:
5811                 for (i = 0; i < ARRAY_SIZE(overlay_formats); ++i) {
5812                         if (num_formats >= max_formats)
5813                                 break;
5814
5815                         formats[num_formats++] = overlay_formats[i];
5816                 }
5817                 break;
5818
5819         case DRM_PLANE_TYPE_CURSOR:
5820                 for (i = 0; i < ARRAY_SIZE(cursor_formats); ++i) {
5821                         if (num_formats >= max_formats)
5822                                 break;
5823
5824                         formats[num_formats++] = cursor_formats[i];
5825                 }
5826                 break;
5827         }
5828
5829         return num_formats;
5830 }
5831
5832 static int amdgpu_dm_plane_init(struct amdgpu_display_manager *dm,
5833                                 struct drm_plane *plane,
5834                                 unsigned long possible_crtcs,
5835                                 const struct dc_plane_cap *plane_cap)
5836 {
5837         uint32_t formats[32];
5838         int num_formats;
5839         int res = -EPERM;
5840
5841         num_formats = get_plane_formats(plane, plane_cap, formats,
5842                                         ARRAY_SIZE(formats));
5843
5844         res = drm_universal_plane_init(dm->adev->ddev, plane, possible_crtcs,
5845                                        &dm_plane_funcs, formats, num_formats,
5846                                        NULL, plane->type, NULL);
5847         if (res)
5848                 return res;
5849
5850         if (plane->type == DRM_PLANE_TYPE_OVERLAY &&
5851             plane_cap && plane_cap->per_pixel_alpha) {
5852                 unsigned int blend_caps = BIT(DRM_MODE_BLEND_PIXEL_NONE) |
5853                                           BIT(DRM_MODE_BLEND_PREMULTI);
5854
5855                 drm_plane_create_alpha_property(plane);
5856                 drm_plane_create_blend_mode_property(plane, blend_caps);
5857         }
5858
5859         if (plane->type == DRM_PLANE_TYPE_PRIMARY &&
5860             plane_cap &&
5861             (plane_cap->pixel_format_support.nv12 ||
5862              plane_cap->pixel_format_support.p010)) {
5863                 /* This only affects YUV formats. */
5864                 drm_plane_create_color_properties(
5865                         plane,
5866                         BIT(DRM_COLOR_YCBCR_BT601) |
5867                         BIT(DRM_COLOR_YCBCR_BT709) |
5868                         BIT(DRM_COLOR_YCBCR_BT2020),
5869                         BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) |
5870                         BIT(DRM_COLOR_YCBCR_FULL_RANGE),
5871                         DRM_COLOR_YCBCR_BT709, DRM_COLOR_YCBCR_LIMITED_RANGE);
5872         }
5873
5874         drm_plane_helper_add(plane, &dm_plane_helper_funcs);
5875
5876         /* Create (reset) the plane state */
5877         if (plane->funcs->reset)
5878                 plane->funcs->reset(plane);
5879
5880         return 0;
5881 }
5882
5883 static int amdgpu_dm_crtc_init(struct amdgpu_display_manager *dm,
5884                                struct drm_plane *plane,
5885                                uint32_t crtc_index)
5886 {
5887         struct amdgpu_crtc *acrtc = NULL;
5888         struct drm_plane *cursor_plane;
5889
5890         int res = -ENOMEM;
5891
5892         cursor_plane = kzalloc(sizeof(*cursor_plane), GFP_KERNEL);
5893         if (!cursor_plane)
5894                 goto fail;
5895
5896         cursor_plane->type = DRM_PLANE_TYPE_CURSOR;
5897         res = amdgpu_dm_plane_init(dm, cursor_plane, 0, NULL);
5898
5899         acrtc = kzalloc(sizeof(struct amdgpu_crtc), GFP_KERNEL);
5900         if (!acrtc)
5901                 goto fail;
5902
5903         res = drm_crtc_init_with_planes(
5904                         dm->ddev,
5905                         &acrtc->base,
5906                         plane,
5907                         cursor_plane,
5908                         &amdgpu_dm_crtc_funcs, NULL);
5909
5910         if (res)
5911                 goto fail;
5912
5913         drm_crtc_helper_add(&acrtc->base, &amdgpu_dm_crtc_helper_funcs);
5914
5915         /* Create (reset) the plane state */
5916         if (acrtc->base.funcs->reset)
5917                 acrtc->base.funcs->reset(&acrtc->base);
5918
5919         acrtc->max_cursor_width = dm->adev->dm.dc->caps.max_cursor_size;
5920         acrtc->max_cursor_height = dm->adev->dm.dc->caps.max_cursor_size;
5921
5922         acrtc->crtc_id = crtc_index;
5923         acrtc->base.enabled = false;
5924         acrtc->otg_inst = -1;
5925
5926         dm->adev->mode_info.crtcs[crtc_index] = acrtc;
5927         drm_crtc_enable_color_mgmt(&acrtc->base, MAX_COLOR_LUT_ENTRIES,
5928                                    true, MAX_COLOR_LUT_ENTRIES);
5929         drm_mode_crtc_set_gamma_size(&acrtc->base, MAX_COLOR_LEGACY_LUT_ENTRIES);
5930
5931         return 0;
5932
5933 fail:
5934         kfree(acrtc);
5935         kfree(cursor_plane);
5936         return res;
5937 }
5938
5939
5940 static int to_drm_connector_type(enum signal_type st)
5941 {
5942         switch (st) {
5943         case SIGNAL_TYPE_HDMI_TYPE_A:
5944                 return DRM_MODE_CONNECTOR_HDMIA;
5945         case SIGNAL_TYPE_EDP:
5946                 return DRM_MODE_CONNECTOR_eDP;
5947         case SIGNAL_TYPE_LVDS:
5948                 return DRM_MODE_CONNECTOR_LVDS;
5949         case SIGNAL_TYPE_RGB:
5950                 return DRM_MODE_CONNECTOR_VGA;
5951         case SIGNAL_TYPE_DISPLAY_PORT:
5952         case SIGNAL_TYPE_DISPLAY_PORT_MST:
5953                 return DRM_MODE_CONNECTOR_DisplayPort;
5954         case SIGNAL_TYPE_DVI_DUAL_LINK:
5955         case SIGNAL_TYPE_DVI_SINGLE_LINK:
5956                 return DRM_MODE_CONNECTOR_DVID;
5957         case SIGNAL_TYPE_VIRTUAL:
5958                 return DRM_MODE_CONNECTOR_VIRTUAL;
5959
5960         default:
5961                 return DRM_MODE_CONNECTOR_Unknown;
5962         }
5963 }
5964
5965 static struct drm_encoder *amdgpu_dm_connector_to_encoder(struct drm_connector *connector)
5966 {
5967         struct drm_encoder *encoder;
5968
5969         /* There is only one encoder per connector */
5970         drm_connector_for_each_possible_encoder(connector, encoder)
5971                 return encoder;
5972
5973         return NULL;
5974 }
5975
5976 static void amdgpu_dm_get_native_mode(struct drm_connector *connector)
5977 {
5978         struct drm_encoder *encoder;
5979         struct amdgpu_encoder *amdgpu_encoder;
5980
5981         encoder = amdgpu_dm_connector_to_encoder(connector);
5982
5983         if (encoder == NULL)
5984                 return;
5985
5986         amdgpu_encoder = to_amdgpu_encoder(encoder);
5987
5988         amdgpu_encoder->native_mode.clock = 0;
5989
5990         if (!list_empty(&connector->probed_modes)) {
5991                 struct drm_display_mode *preferred_mode = NULL;
5992
5993                 list_for_each_entry(preferred_mode,
5994                                     &connector->probed_modes,
5995                                     head) {
5996                         if (preferred_mode->type & DRM_MODE_TYPE_PREFERRED)
5997                                 amdgpu_encoder->native_mode = *preferred_mode;
5998
5999                         break;
6000                 }
6001
6002         }
6003 }
6004
6005 static struct drm_display_mode *
6006 amdgpu_dm_create_common_mode(struct drm_encoder *encoder,
6007                              char *name,
6008                              int hdisplay, int vdisplay)
6009 {
6010         struct drm_device *dev = encoder->dev;
6011         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
6012         struct drm_display_mode *mode = NULL;
6013         struct drm_display_mode *native_mode = &amdgpu_encoder->native_mode;
6014
6015         mode = drm_mode_duplicate(dev, native_mode);
6016
6017         if (mode == NULL)
6018                 return NULL;
6019
6020         mode->hdisplay = hdisplay;
6021         mode->vdisplay = vdisplay;
6022         mode->type &= ~DRM_MODE_TYPE_PREFERRED;
6023         strscpy(mode->name, name, DRM_DISPLAY_MODE_LEN);
6024
6025         return mode;
6026
6027 }
6028
6029 static void amdgpu_dm_connector_add_common_modes(struct drm_encoder *encoder,
6030                                                  struct drm_connector *connector)
6031 {
6032         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
6033         struct drm_display_mode *mode = NULL;
6034         struct drm_display_mode *native_mode = &amdgpu_encoder->native_mode;
6035         struct amdgpu_dm_connector *amdgpu_dm_connector =
6036                                 to_amdgpu_dm_connector(connector);
6037         int i;
6038         int n;
6039         struct mode_size {
6040                 char name[DRM_DISPLAY_MODE_LEN];
6041                 int w;
6042                 int h;
6043         } common_modes[] = {
6044                 {  "640x480",  640,  480},
6045                 {  "800x600",  800,  600},
6046                 { "1024x768", 1024,  768},
6047                 { "1280x720", 1280,  720},
6048                 { "1280x800", 1280,  800},
6049                 {"1280x1024", 1280, 1024},
6050                 { "1440x900", 1440,  900},
6051                 {"1680x1050", 1680, 1050},
6052                 {"1600x1200", 1600, 1200},
6053                 {"1920x1080", 1920, 1080},
6054                 {"1920x1200", 1920, 1200}
6055         };
6056
6057         n = ARRAY_SIZE(common_modes);
6058
6059         for (i = 0; i < n; i++) {
6060                 struct drm_display_mode *curmode = NULL;
6061                 bool mode_existed = false;
6062
6063                 if (common_modes[i].w > native_mode->hdisplay ||
6064                     common_modes[i].h > native_mode->vdisplay ||
6065                    (common_modes[i].w == native_mode->hdisplay &&
6066                     common_modes[i].h == native_mode->vdisplay))
6067                         continue;
6068
6069                 list_for_each_entry(curmode, &connector->probed_modes, head) {
6070                         if (common_modes[i].w == curmode->hdisplay &&
6071                             common_modes[i].h == curmode->vdisplay) {
6072                                 mode_existed = true;
6073                                 break;
6074                         }
6075                 }
6076
6077                 if (mode_existed)
6078                         continue;
6079
6080                 mode = amdgpu_dm_create_common_mode(encoder,
6081                                 common_modes[i].name, common_modes[i].w,
6082                                 common_modes[i].h);
6083                 drm_mode_probed_add(connector, mode);
6084                 amdgpu_dm_connector->num_modes++;
6085         }
6086 }
6087
6088 static void amdgpu_dm_connector_ddc_get_modes(struct drm_connector *connector,
6089                                               struct edid *edid)
6090 {
6091         struct amdgpu_dm_connector *amdgpu_dm_connector =
6092                         to_amdgpu_dm_connector(connector);
6093
6094         if (edid) {
6095                 /* empty probed_modes */
6096                 INIT_LIST_HEAD(&connector->probed_modes);
6097                 amdgpu_dm_connector->num_modes =
6098                                 drm_add_edid_modes(connector, edid);
6099
6100                 /* sorting the probed modes before calling function
6101                  * amdgpu_dm_get_native_mode() since EDID can have
6102                  * more than one preferred mode. The modes that are
6103                  * later in the probed mode list could be of higher
6104                  * and preferred resolution. For example, 3840x2160
6105                  * resolution in base EDID preferred timing and 4096x2160
6106                  * preferred resolution in DID extension block later.
6107                  */
6108                 drm_mode_sort(&connector->probed_modes);
6109                 amdgpu_dm_get_native_mode(connector);
6110         } else {
6111                 amdgpu_dm_connector->num_modes = 0;
6112         }
6113 }
6114
6115 static int amdgpu_dm_connector_get_modes(struct drm_connector *connector)
6116 {
6117         struct amdgpu_dm_connector *amdgpu_dm_connector =
6118                         to_amdgpu_dm_connector(connector);
6119         struct drm_encoder *encoder;
6120         struct edid *edid = amdgpu_dm_connector->edid;
6121
6122         encoder = amdgpu_dm_connector_to_encoder(connector);
6123
6124         if (!edid || !drm_edid_is_valid(edid)) {
6125                 amdgpu_dm_connector->num_modes =
6126                                 drm_add_modes_noedid(connector, 640, 480);
6127         } else {
6128                 amdgpu_dm_connector_ddc_get_modes(connector, edid);
6129                 amdgpu_dm_connector_add_common_modes(encoder, connector);
6130         }
6131         amdgpu_dm_fbc_init(connector);
6132
6133         return amdgpu_dm_connector->num_modes;
6134 }
6135
6136 void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm,
6137                                      struct amdgpu_dm_connector *aconnector,
6138                                      int connector_type,
6139                                      struct dc_link *link,
6140                                      int link_index)
6141 {
6142         struct amdgpu_device *adev = dm->ddev->dev_private;
6143
6144         /*
6145          * Some of the properties below require access to state, like bpc.
6146          * Allocate some default initial connector state with our reset helper.
6147          */
6148         if (aconnector->base.funcs->reset)
6149                 aconnector->base.funcs->reset(&aconnector->base);
6150
6151         aconnector->connector_id = link_index;
6152         aconnector->dc_link = link;
6153         aconnector->base.interlace_allowed = false;
6154         aconnector->base.doublescan_allowed = false;
6155         aconnector->base.stereo_allowed = false;
6156         aconnector->base.dpms = DRM_MODE_DPMS_OFF;
6157         aconnector->hpd.hpd = AMDGPU_HPD_NONE; /* not used */
6158         aconnector->audio_inst = -1;
6159         mutex_init(&aconnector->hpd_lock);
6160
6161         /*
6162          * configure support HPD hot plug connector_>polled default value is 0
6163          * which means HPD hot plug not supported
6164          */
6165         switch (connector_type) {
6166         case DRM_MODE_CONNECTOR_HDMIA:
6167                 aconnector->base.polled = DRM_CONNECTOR_POLL_HPD;
6168                 aconnector->base.ycbcr_420_allowed =
6169                         link->link_enc->features.hdmi_ycbcr420_supported ? true : false;
6170                 break;
6171         case DRM_MODE_CONNECTOR_DisplayPort:
6172                 aconnector->base.polled = DRM_CONNECTOR_POLL_HPD;
6173                 aconnector->base.ycbcr_420_allowed =
6174                         link->link_enc->features.dp_ycbcr420_supported ? true : false;
6175                 break;
6176         case DRM_MODE_CONNECTOR_DVID:
6177                 aconnector->base.polled = DRM_CONNECTOR_POLL_HPD;
6178                 break;
6179         default:
6180                 break;
6181         }
6182
6183         drm_object_attach_property(&aconnector->base.base,
6184                                 dm->ddev->mode_config.scaling_mode_property,
6185                                 DRM_MODE_SCALE_NONE);
6186
6187         drm_object_attach_property(&aconnector->base.base,
6188                                 adev->mode_info.underscan_property,
6189                                 UNDERSCAN_OFF);
6190         drm_object_attach_property(&aconnector->base.base,
6191                                 adev->mode_info.underscan_hborder_property,
6192                                 0);
6193         drm_object_attach_property(&aconnector->base.base,
6194                                 adev->mode_info.underscan_vborder_property,
6195                                 0);
6196
6197         if (!aconnector->mst_port)
6198                 drm_connector_attach_max_bpc_property(&aconnector->base, 8, 16);
6199
6200         /* This defaults to the max in the range, but we want 8bpc for non-edp. */
6201         aconnector->base.state->max_bpc = (connector_type == DRM_MODE_CONNECTOR_eDP) ? 16 : 8;
6202         aconnector->base.state->max_requested_bpc = aconnector->base.state->max_bpc;
6203
6204         if (connector_type == DRM_MODE_CONNECTOR_eDP &&
6205             dc_is_dmcu_initialized(adev->dm.dc)) {
6206                 drm_object_attach_property(&aconnector->base.base,
6207                                 adev->mode_info.abm_level_property, 0);
6208         }
6209
6210         if (connector_type == DRM_MODE_CONNECTOR_HDMIA ||
6211             connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
6212             connector_type == DRM_MODE_CONNECTOR_eDP) {
6213                 drm_object_attach_property(
6214                         &aconnector->base.base,
6215                         dm->ddev->mode_config.hdr_output_metadata_property, 0);
6216
6217                 if (!aconnector->mst_port)
6218                         drm_connector_attach_vrr_capable_property(&aconnector->base);
6219
6220 #ifdef CONFIG_DRM_AMD_DC_HDCP
6221                 if (adev->dm.hdcp_workqueue)
6222                         drm_connector_attach_content_protection_property(&aconnector->base, true);
6223 #endif
6224         }
6225 }
6226
6227 static int amdgpu_dm_i2c_xfer(struct i2c_adapter *i2c_adap,
6228                               struct i2c_msg *msgs, int num)
6229 {
6230         struct amdgpu_i2c_adapter *i2c = i2c_get_adapdata(i2c_adap);
6231         struct ddc_service *ddc_service = i2c->ddc_service;
6232         struct i2c_command cmd;
6233         int i;
6234         int result = -EIO;
6235
6236         cmd.payloads = kcalloc(num, sizeof(struct i2c_payload), GFP_KERNEL);
6237
6238         if (!cmd.payloads)
6239                 return result;
6240
6241         cmd.number_of_payloads = num;
6242         cmd.engine = I2C_COMMAND_ENGINE_DEFAULT;
6243         cmd.speed = 100;
6244
6245         for (i = 0; i < num; i++) {
6246                 cmd.payloads[i].write = !(msgs[i].flags & I2C_M_RD);
6247                 cmd.payloads[i].address = msgs[i].addr;
6248                 cmd.payloads[i].length = msgs[i].len;
6249                 cmd.payloads[i].data = msgs[i].buf;
6250         }
6251
6252         if (dc_submit_i2c(
6253                         ddc_service->ctx->dc,
6254                         ddc_service->ddc_pin->hw_info.ddc_channel,
6255                         &cmd))
6256                 result = num;
6257
6258         kfree(cmd.payloads);
6259         return result;
6260 }
6261
6262 static u32 amdgpu_dm_i2c_func(struct i2c_adapter *adap)
6263 {
6264         return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
6265 }
6266
6267 static const struct i2c_algorithm amdgpu_dm_i2c_algo = {
6268         .master_xfer = amdgpu_dm_i2c_xfer,
6269         .functionality = amdgpu_dm_i2c_func,
6270 };
6271
6272 static struct amdgpu_i2c_adapter *
6273 create_i2c(struct ddc_service *ddc_service,
6274            int link_index,
6275            int *res)
6276 {
6277         struct amdgpu_device *adev = ddc_service->ctx->driver_context;
6278         struct amdgpu_i2c_adapter *i2c;
6279
6280         i2c = kzalloc(sizeof(struct amdgpu_i2c_adapter), GFP_KERNEL);
6281         if (!i2c)
6282                 return NULL;
6283         i2c->base.owner = THIS_MODULE;
6284         i2c->base.class = I2C_CLASS_DDC;
6285         i2c->base.dev.parent = &adev->pdev->dev;
6286         i2c->base.algo = &amdgpu_dm_i2c_algo;
6287         snprintf(i2c->base.name, sizeof(i2c->base.name), "AMDGPU DM i2c hw bus %d", link_index);
6288         i2c_set_adapdata(&i2c->base, i2c);
6289         i2c->ddc_service = ddc_service;
6290         i2c->ddc_service->ddc_pin->hw_info.ddc_channel = link_index;
6291
6292         return i2c;
6293 }
6294
6295
6296 /*
6297  * Note: this function assumes that dc_link_detect() was called for the
6298  * dc_link which will be represented by this aconnector.
6299  */
6300 static int amdgpu_dm_connector_init(struct amdgpu_display_manager *dm,
6301                                     struct amdgpu_dm_connector *aconnector,
6302                                     uint32_t link_index,
6303                                     struct amdgpu_encoder *aencoder)
6304 {
6305         int res = 0;
6306         int connector_type;
6307         struct dc *dc = dm->dc;
6308         struct dc_link *link = dc_get_link_at_index(dc, link_index);
6309         struct amdgpu_i2c_adapter *i2c;
6310
6311         link->priv = aconnector;
6312
6313         DRM_DEBUG_DRIVER("%s()\n", __func__);
6314
6315         i2c = create_i2c(link->ddc, link->link_index, &res);
6316         if (!i2c) {
6317                 DRM_ERROR("Failed to create i2c adapter data\n");
6318                 return -ENOMEM;
6319         }
6320
6321         aconnector->i2c = i2c;
6322         res = i2c_add_adapter(&i2c->base);
6323
6324         if (res) {
6325                 DRM_ERROR("Failed to register hw i2c %d\n", link->link_index);
6326                 goto out_free;
6327         }
6328
6329         connector_type = to_drm_connector_type(link->connector_signal);
6330
6331         res = drm_connector_init_with_ddc(
6332                         dm->ddev,
6333                         &aconnector->base,
6334                         &amdgpu_dm_connector_funcs,
6335                         connector_type,
6336                         &i2c->base);
6337
6338         if (res) {
6339                 DRM_ERROR("connector_init failed\n");
6340                 aconnector->connector_id = -1;
6341                 goto out_free;
6342         }
6343
6344         drm_connector_helper_add(
6345                         &aconnector->base,
6346                         &amdgpu_dm_connector_helper_funcs);
6347
6348         amdgpu_dm_connector_init_helper(
6349                 dm,
6350                 aconnector,
6351                 connector_type,
6352                 link,
6353                 link_index);
6354
6355         drm_connector_attach_encoder(
6356                 &aconnector->base, &aencoder->base);
6357
6358         if (connector_type == DRM_MODE_CONNECTOR_DisplayPort
6359                 || connector_type == DRM_MODE_CONNECTOR_eDP)
6360                 amdgpu_dm_initialize_dp_connector(dm, aconnector, link->link_index);
6361
6362 out_free:
6363         if (res) {
6364                 kfree(i2c);
6365                 aconnector->i2c = NULL;
6366         }
6367         return res;
6368 }
6369
6370 int amdgpu_dm_get_encoder_crtc_mask(struct amdgpu_device *adev)
6371 {
6372         switch (adev->mode_info.num_crtc) {
6373         case 1:
6374                 return 0x1;
6375         case 2:
6376                 return 0x3;
6377         case 3:
6378                 return 0x7;
6379         case 4:
6380                 return 0xf;
6381         case 5:
6382                 return 0x1f;
6383         case 6:
6384         default:
6385                 return 0x3f;
6386         }
6387 }
6388
6389 static int amdgpu_dm_encoder_init(struct drm_device *dev,
6390                                   struct amdgpu_encoder *aencoder,
6391                                   uint32_t link_index)
6392 {
6393         struct amdgpu_device *adev = dev->dev_private;
6394
6395         int res = drm_encoder_init(dev,
6396                                    &aencoder->base,
6397                                    &amdgpu_dm_encoder_funcs,
6398                                    DRM_MODE_ENCODER_TMDS,
6399                                    NULL);
6400
6401         aencoder->base.possible_crtcs = amdgpu_dm_get_encoder_crtc_mask(adev);
6402
6403         if (!res)
6404                 aencoder->encoder_id = link_index;
6405         else
6406                 aencoder->encoder_id = -1;
6407
6408         drm_encoder_helper_add(&aencoder->base, &amdgpu_dm_encoder_helper_funcs);
6409
6410         return res;
6411 }
6412
6413 static void manage_dm_interrupts(struct amdgpu_device *adev,
6414                                  struct amdgpu_crtc *acrtc,
6415                                  bool enable)
6416 {
6417         /*
6418          * this is not correct translation but will work as soon as VBLANK
6419          * constant is the same as PFLIP
6420          */
6421         int irq_type =
6422                 amdgpu_display_crtc_idx_to_irq_type(
6423                         adev,
6424                         acrtc->crtc_id);
6425
6426         if (enable) {
6427                 drm_crtc_vblank_on(&acrtc->base);
6428                 amdgpu_irq_get(
6429                         adev,
6430                         &adev->pageflip_irq,
6431                         irq_type);
6432         } else {
6433
6434                 amdgpu_irq_put(
6435                         adev,
6436                         &adev->pageflip_irq,
6437                         irq_type);
6438                 drm_crtc_vblank_off(&acrtc->base);
6439         }
6440 }
6441
6442 static bool
6443 is_scaling_state_different(const struct dm_connector_state *dm_state,
6444                            const struct dm_connector_state *old_dm_state)
6445 {
6446         if (dm_state->scaling != old_dm_state->scaling)
6447                 return true;
6448         if (!dm_state->underscan_enable && old_dm_state->underscan_enable) {
6449                 if (old_dm_state->underscan_hborder != 0 && old_dm_state->underscan_vborder != 0)
6450                         return true;
6451         } else  if (dm_state->underscan_enable && !old_dm_state->underscan_enable) {
6452                 if (dm_state->underscan_hborder != 0 && dm_state->underscan_vborder != 0)
6453                         return true;
6454         } else if (dm_state->underscan_hborder != old_dm_state->underscan_hborder ||
6455                    dm_state->underscan_vborder != old_dm_state->underscan_vborder)
6456                 return true;
6457         return false;
6458 }
6459
6460 #ifdef CONFIG_DRM_AMD_DC_HDCP
6461 static bool is_content_protection_different(struct drm_connector_state *state,
6462                                             const struct drm_connector_state *old_state,
6463                                             const struct drm_connector *connector, struct hdcp_workqueue *hdcp_w)
6464 {
6465         struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
6466
6467         if (old_state->hdcp_content_type != state->hdcp_content_type &&
6468             state->content_protection != DRM_MODE_CONTENT_PROTECTION_UNDESIRED) {
6469                 state->content_protection = DRM_MODE_CONTENT_PROTECTION_DESIRED;
6470                 return true;
6471         }
6472
6473         /* CP is being re enabled, ignore this */
6474         if (old_state->content_protection == DRM_MODE_CONTENT_PROTECTION_ENABLED &&
6475             state->content_protection == DRM_MODE_CONTENT_PROTECTION_DESIRED) {
6476                 state->content_protection = DRM_MODE_CONTENT_PROTECTION_ENABLED;
6477                 return false;
6478         }
6479
6480         /* S3 resume case, since old state will always be 0 (UNDESIRED) and the restored state will be ENABLED */
6481         if (old_state->content_protection == DRM_MODE_CONTENT_PROTECTION_UNDESIRED &&
6482             state->content_protection == DRM_MODE_CONTENT_PROTECTION_ENABLED)
6483                 state->content_protection = DRM_MODE_CONTENT_PROTECTION_DESIRED;
6484
6485         /* Check if something is connected/enabled, otherwise we start hdcp but nothing is connected/enabled
6486          * hot-plug, headless s3, dpms
6487          */
6488         if (state->content_protection == DRM_MODE_CONTENT_PROTECTION_DESIRED && connector->dpms == DRM_MODE_DPMS_ON &&
6489             aconnector->dc_sink != NULL)
6490                 return true;
6491
6492         if (old_state->content_protection == state->content_protection)
6493                 return false;
6494
6495         if (state->content_protection == DRM_MODE_CONTENT_PROTECTION_UNDESIRED)
6496                 return true;
6497
6498         return false;
6499 }
6500
6501 #endif
6502 static void remove_stream(struct amdgpu_device *adev,
6503                           struct amdgpu_crtc *acrtc,
6504                           struct dc_stream_state *stream)
6505 {
6506         /* this is the update mode case */
6507
6508         acrtc->otg_inst = -1;
6509         acrtc->enabled = false;
6510 }
6511
6512 static int get_cursor_position(struct drm_plane *plane, struct drm_crtc *crtc,
6513                                struct dc_cursor_position *position)
6514 {
6515         struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
6516         int x, y;
6517         int xorigin = 0, yorigin = 0;
6518
6519         position->enable = false;
6520         position->x = 0;
6521         position->y = 0;
6522
6523         if (!crtc || !plane->state->fb)
6524                 return 0;
6525
6526         if ((plane->state->crtc_w > amdgpu_crtc->max_cursor_width) ||
6527             (plane->state->crtc_h > amdgpu_crtc->max_cursor_height)) {
6528                 DRM_ERROR("%s: bad cursor width or height %d x %d\n",
6529                           __func__,
6530                           plane->state->crtc_w,
6531                           plane->state->crtc_h);
6532                 return -EINVAL;
6533         }
6534
6535         x = plane->state->crtc_x;
6536         y = plane->state->crtc_y;
6537
6538         if (x <= -amdgpu_crtc->max_cursor_width ||
6539             y <= -amdgpu_crtc->max_cursor_height)
6540                 return 0;
6541
6542         if (x < 0) {
6543                 xorigin = min(-x, amdgpu_crtc->max_cursor_width - 1);
6544                 x = 0;
6545         }
6546         if (y < 0) {
6547                 yorigin = min(-y, amdgpu_crtc->max_cursor_height - 1);
6548                 y = 0;
6549         }
6550         position->enable = true;
6551         position->translate_by_source = true;
6552         position->x = x;
6553         position->y = y;
6554         position->x_hotspot = xorigin;
6555         position->y_hotspot = yorigin;
6556
6557         return 0;
6558 }
6559
6560 static void handle_cursor_update(struct drm_plane *plane,
6561                                  struct drm_plane_state *old_plane_state)
6562 {
6563         struct amdgpu_device *adev = plane->dev->dev_private;
6564         struct amdgpu_framebuffer *afb = to_amdgpu_framebuffer(plane->state->fb);
6565         struct drm_crtc *crtc = afb ? plane->state->crtc : old_plane_state->crtc;
6566         struct dm_crtc_state *crtc_state = crtc ? to_dm_crtc_state(crtc->state) : NULL;
6567         struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
6568         uint64_t address = afb ? afb->address : 0;
6569         struct dc_cursor_position position;
6570         struct dc_cursor_attributes attributes;
6571         int ret;
6572
6573         if (!plane->state->fb && !old_plane_state->fb)
6574                 return;
6575
6576         DRM_DEBUG_DRIVER("%s: crtc_id=%d with size %d to %d\n",
6577                          __func__,
6578                          amdgpu_crtc->crtc_id,
6579                          plane->state->crtc_w,
6580                          plane->state->crtc_h);
6581
6582         ret = get_cursor_position(plane, crtc, &position);
6583         if (ret)
6584                 return;
6585
6586         if (!position.enable) {
6587                 /* turn off cursor */
6588                 if (crtc_state && crtc_state->stream) {
6589                         mutex_lock(&adev->dm.dc_lock);
6590                         dc_stream_set_cursor_position(crtc_state->stream,
6591                                                       &position);
6592                         mutex_unlock(&adev->dm.dc_lock);
6593                 }
6594                 return;
6595         }
6596
6597         amdgpu_crtc->cursor_width = plane->state->crtc_w;
6598         amdgpu_crtc->cursor_height = plane->state->crtc_h;
6599
6600         memset(&attributes, 0, sizeof(attributes));
6601         attributes.address.high_part = upper_32_bits(address);
6602         attributes.address.low_part  = lower_32_bits(address);
6603         attributes.width             = plane->state->crtc_w;
6604         attributes.height            = plane->state->crtc_h;
6605         attributes.color_format      = CURSOR_MODE_COLOR_PRE_MULTIPLIED_ALPHA;
6606         attributes.rotation_angle    = 0;
6607         attributes.attribute_flags.value = 0;
6608
6609         attributes.pitch = attributes.width;
6610
6611         if (crtc_state->stream) {
6612                 mutex_lock(&adev->dm.dc_lock);
6613                 if (!dc_stream_set_cursor_attributes(crtc_state->stream,
6614                                                          &attributes))
6615                         DRM_ERROR("DC failed to set cursor attributes\n");
6616
6617                 if (!dc_stream_set_cursor_position(crtc_state->stream,
6618                                                    &position))
6619                         DRM_ERROR("DC failed to set cursor position\n");
6620                 mutex_unlock(&adev->dm.dc_lock);
6621         }
6622 }
6623
6624 static void prepare_flip_isr(struct amdgpu_crtc *acrtc)
6625 {
6626
6627         assert_spin_locked(&acrtc->base.dev->event_lock);
6628         WARN_ON(acrtc->event);
6629
6630         acrtc->event = acrtc->base.state->event;
6631
6632         /* Set the flip status */
6633         acrtc->pflip_status = AMDGPU_FLIP_SUBMITTED;
6634
6635         /* Mark this event as consumed */
6636         acrtc->base.state->event = NULL;
6637
6638         DRM_DEBUG_DRIVER("crtc:%d, pflip_stat:AMDGPU_FLIP_SUBMITTED\n",
6639                                                  acrtc->crtc_id);
6640 }
6641
6642 static void update_freesync_state_on_stream(
6643         struct amdgpu_display_manager *dm,
6644         struct dm_crtc_state *new_crtc_state,
6645         struct dc_stream_state *new_stream,
6646         struct dc_plane_state *surface,
6647         u32 flip_timestamp_in_us)
6648 {
6649         struct mod_vrr_params vrr_params;
6650         struct dc_info_packet vrr_infopacket = {0};
6651         struct amdgpu_device *adev = dm->adev;
6652         unsigned long flags;
6653
6654         if (!new_stream)
6655                 return;
6656
6657         /*
6658          * TODO: Determine why min/max totals and vrefresh can be 0 here.
6659          * For now it's sufficient to just guard against these conditions.
6660          */
6661
6662         if (!new_stream->timing.h_total || !new_stream->timing.v_total)
6663                 return;
6664
6665         spin_lock_irqsave(&adev->ddev->event_lock, flags);
6666         vrr_params = new_crtc_state->vrr_params;
6667
6668         if (surface) {
6669                 mod_freesync_handle_preflip(
6670                         dm->freesync_module,
6671                         surface,
6672                         new_stream,
6673                         flip_timestamp_in_us,
6674                         &vrr_params);
6675
6676                 if (adev->family < AMDGPU_FAMILY_AI &&
6677                     amdgpu_dm_vrr_active(new_crtc_state)) {
6678                         mod_freesync_handle_v_update(dm->freesync_module,
6679                                                      new_stream, &vrr_params);
6680
6681                         /* Need to call this before the frame ends. */
6682                         dc_stream_adjust_vmin_vmax(dm->dc,
6683                                                    new_crtc_state->stream,
6684                                                    &vrr_params.adjust);
6685                 }
6686         }
6687
6688         mod_freesync_build_vrr_infopacket(
6689                 dm->freesync_module,
6690                 new_stream,
6691                 &vrr_params,
6692                 PACKET_TYPE_VRR,
6693                 TRANSFER_FUNC_UNKNOWN,
6694                 &vrr_infopacket);
6695
6696         new_crtc_state->freesync_timing_changed |=
6697                 (memcmp(&new_crtc_state->vrr_params.adjust,
6698                         &vrr_params.adjust,
6699                         sizeof(vrr_params.adjust)) != 0);
6700
6701         new_crtc_state->freesync_vrr_info_changed |=
6702                 (memcmp(&new_crtc_state->vrr_infopacket,
6703                         &vrr_infopacket,
6704                         sizeof(vrr_infopacket)) != 0);
6705
6706         new_crtc_state->vrr_params = vrr_params;
6707         new_crtc_state->vrr_infopacket = vrr_infopacket;
6708
6709         new_stream->adjust = new_crtc_state->vrr_params.adjust;
6710         new_stream->vrr_infopacket = vrr_infopacket;
6711
6712         if (new_crtc_state->freesync_vrr_info_changed)
6713                 DRM_DEBUG_KMS("VRR packet update: crtc=%u enabled=%d state=%d",
6714                               new_crtc_state->base.crtc->base.id,
6715                               (int)new_crtc_state->base.vrr_enabled,
6716                               (int)vrr_params.state);
6717
6718         spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
6719 }
6720
6721 static void pre_update_freesync_state_on_stream(
6722         struct amdgpu_display_manager *dm,
6723         struct dm_crtc_state *new_crtc_state)
6724 {
6725         struct dc_stream_state *new_stream = new_crtc_state->stream;
6726         struct mod_vrr_params vrr_params;
6727         struct mod_freesync_config config = new_crtc_state->freesync_config;
6728         struct amdgpu_device *adev = dm->adev;
6729         unsigned long flags;
6730
6731         if (!new_stream)
6732                 return;
6733
6734         /*
6735          * TODO: Determine why min/max totals and vrefresh can be 0 here.
6736          * For now it's sufficient to just guard against these conditions.
6737          */
6738         if (!new_stream->timing.h_total || !new_stream->timing.v_total)
6739                 return;
6740
6741         spin_lock_irqsave(&adev->ddev->event_lock, flags);
6742         vrr_params = new_crtc_state->vrr_params;
6743
6744         if (new_crtc_state->vrr_supported &&
6745             config.min_refresh_in_uhz &&
6746             config.max_refresh_in_uhz) {
6747                 config.state = new_crtc_state->base.vrr_enabled ?
6748                         VRR_STATE_ACTIVE_VARIABLE :
6749                         VRR_STATE_INACTIVE;
6750         } else {
6751                 config.state = VRR_STATE_UNSUPPORTED;
6752         }
6753
6754         mod_freesync_build_vrr_params(dm->freesync_module,
6755                                       new_stream,
6756                                       &config, &vrr_params);
6757
6758         new_crtc_state->freesync_timing_changed |=
6759                 (memcmp(&new_crtc_state->vrr_params.adjust,
6760                         &vrr_params.adjust,
6761                         sizeof(vrr_params.adjust)) != 0);
6762
6763         new_crtc_state->vrr_params = vrr_params;
6764         spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
6765 }
6766
6767 static void amdgpu_dm_handle_vrr_transition(struct dm_crtc_state *old_state,
6768                                             struct dm_crtc_state *new_state)
6769 {
6770         bool old_vrr_active = amdgpu_dm_vrr_active(old_state);
6771         bool new_vrr_active = amdgpu_dm_vrr_active(new_state);
6772
6773         if (!old_vrr_active && new_vrr_active) {
6774                 /* Transition VRR inactive -> active:
6775                  * While VRR is active, we must not disable vblank irq, as a
6776                  * reenable after disable would compute bogus vblank/pflip
6777                  * timestamps if it likely happened inside display front-porch.
6778                  *
6779                  * We also need vupdate irq for the actual core vblank handling
6780                  * at end of vblank.
6781                  */
6782                 dm_set_vupdate_irq(new_state->base.crtc, true);
6783                 drm_crtc_vblank_get(new_state->base.crtc);
6784                 DRM_DEBUG_DRIVER("%s: crtc=%u VRR off->on: Get vblank ref\n",
6785                                  __func__, new_state->base.crtc->base.id);
6786         } else if (old_vrr_active && !new_vrr_active) {
6787                 /* Transition VRR active -> inactive:
6788                  * Allow vblank irq disable again for fixed refresh rate.
6789                  */
6790                 dm_set_vupdate_irq(new_state->base.crtc, false);
6791                 drm_crtc_vblank_put(new_state->base.crtc);
6792                 DRM_DEBUG_DRIVER("%s: crtc=%u VRR on->off: Drop vblank ref\n",
6793                                  __func__, new_state->base.crtc->base.id);
6794         }
6795 }
6796
6797 static void amdgpu_dm_commit_cursors(struct drm_atomic_state *state)
6798 {
6799         struct drm_plane *plane;
6800         struct drm_plane_state *old_plane_state, *new_plane_state;
6801         int i;
6802
6803         /*
6804          * TODO: Make this per-stream so we don't issue redundant updates for
6805          * commits with multiple streams.
6806          */
6807         for_each_oldnew_plane_in_state(state, plane, old_plane_state,
6808                                        new_plane_state, i)
6809                 if (plane->type == DRM_PLANE_TYPE_CURSOR)
6810                         handle_cursor_update(plane, old_plane_state);
6811 }
6812
6813 static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
6814                                     struct dc_state *dc_state,
6815                                     struct drm_device *dev,
6816                                     struct amdgpu_display_manager *dm,
6817                                     struct drm_crtc *pcrtc,
6818                                     bool wait_for_vblank)
6819 {
6820         uint32_t i;
6821         uint64_t timestamp_ns;
6822         struct drm_plane *plane;
6823         struct drm_plane_state *old_plane_state, *new_plane_state;
6824         struct amdgpu_crtc *acrtc_attach = to_amdgpu_crtc(pcrtc);
6825         struct drm_crtc_state *new_pcrtc_state =
6826                         drm_atomic_get_new_crtc_state(state, pcrtc);
6827         struct dm_crtc_state *acrtc_state = to_dm_crtc_state(new_pcrtc_state);
6828         struct dm_crtc_state *dm_old_crtc_state =
6829                         to_dm_crtc_state(drm_atomic_get_old_crtc_state(state, pcrtc));
6830         int planes_count = 0, vpos, hpos;
6831         long r;
6832         unsigned long flags;
6833         struct amdgpu_bo *abo;
6834         uint64_t tiling_flags;
6835         bool tmz_surface = false;
6836         uint32_t target_vblank, last_flip_vblank;
6837         bool vrr_active = amdgpu_dm_vrr_active(acrtc_state);
6838         bool pflip_present = false;
6839         struct {
6840                 struct dc_surface_update surface_updates[MAX_SURFACES];
6841                 struct dc_plane_info plane_infos[MAX_SURFACES];
6842                 struct dc_scaling_info scaling_infos[MAX_SURFACES];
6843                 struct dc_flip_addrs flip_addrs[MAX_SURFACES];
6844                 struct dc_stream_update stream_update;
6845         } *bundle;
6846
6847         bundle = kzalloc(sizeof(*bundle), GFP_KERNEL);
6848
6849         if (!bundle) {
6850                 dm_error("Failed to allocate update bundle\n");
6851                 goto cleanup;
6852         }
6853
6854         /*
6855          * Disable the cursor first if we're disabling all the planes.
6856          * It'll remain on the screen after the planes are re-enabled
6857          * if we don't.
6858          */
6859         if (acrtc_state->active_planes == 0)
6860                 amdgpu_dm_commit_cursors(state);
6861
6862         /* update planes when needed */
6863         for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) {
6864                 struct drm_crtc *crtc = new_plane_state->crtc;
6865                 struct drm_crtc_state *new_crtc_state;
6866                 struct drm_framebuffer *fb = new_plane_state->fb;
6867                 bool plane_needs_flip;
6868                 struct dc_plane_state *dc_plane;
6869                 struct dm_plane_state *dm_new_plane_state = to_dm_plane_state(new_plane_state);
6870
6871                 /* Cursor plane is handled after stream updates */
6872                 if (plane->type == DRM_PLANE_TYPE_CURSOR)
6873                         continue;
6874
6875                 if (!fb || !crtc || pcrtc != crtc)
6876                         continue;
6877
6878                 new_crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
6879                 if (!new_crtc_state->active)
6880                         continue;
6881
6882                 dc_plane = dm_new_plane_state->dc_state;
6883
6884                 bundle->surface_updates[planes_count].surface = dc_plane;
6885                 if (new_pcrtc_state->color_mgmt_changed) {
6886                         bundle->surface_updates[planes_count].gamma = dc_plane->gamma_correction;
6887                         bundle->surface_updates[planes_count].in_transfer_func = dc_plane->in_transfer_func;
6888                         bundle->surface_updates[planes_count].gamut_remap_matrix = &dc_plane->gamut_remap_matrix;
6889                 }
6890
6891                 fill_dc_scaling_info(new_plane_state,
6892                                      &bundle->scaling_infos[planes_count]);
6893
6894                 bundle->surface_updates[planes_count].scaling_info =
6895                         &bundle->scaling_infos[planes_count];
6896
6897                 plane_needs_flip = old_plane_state->fb && new_plane_state->fb;
6898
6899                 pflip_present = pflip_present || plane_needs_flip;
6900
6901                 if (!plane_needs_flip) {
6902                         planes_count += 1;
6903                         continue;
6904                 }
6905
6906                 abo = gem_to_amdgpu_bo(fb->obj[0]);
6907
6908                 /*
6909                  * Wait for all fences on this FB. Do limited wait to avoid
6910                  * deadlock during GPU reset when this fence will not signal
6911                  * but we hold reservation lock for the BO.
6912                  */
6913                 r = dma_resv_wait_timeout_rcu(abo->tbo.base.resv, true,
6914                                                         false,
6915                                                         msecs_to_jiffies(5000));
6916                 if (unlikely(r <= 0))
6917                         DRM_ERROR("Waiting for fences timed out!");
6918
6919                 /*
6920                  * TODO This might fail and hence better not used, wait
6921                  * explicitly on fences instead
6922                  * and in general should be called for
6923                  * blocking commit to as per framework helpers
6924                  */
6925                 r = amdgpu_bo_reserve(abo, true);
6926                 if (unlikely(r != 0))
6927                         DRM_ERROR("failed to reserve buffer before flip\n");
6928
6929                 amdgpu_bo_get_tiling_flags(abo, &tiling_flags);
6930
6931                 tmz_surface = amdgpu_bo_encrypted(abo);
6932
6933                 amdgpu_bo_unreserve(abo);
6934
6935                 fill_dc_plane_info_and_addr(
6936                         dm->adev, new_plane_state, tiling_flags,
6937                         &bundle->plane_infos[planes_count],
6938                         &bundle->flip_addrs[planes_count].address,
6939                         tmz_surface,
6940                         false);
6941
6942                 DRM_DEBUG_DRIVER("plane: id=%d dcc_en=%d\n",
6943                                  new_plane_state->plane->index,
6944                                  bundle->plane_infos[planes_count].dcc.enable);
6945
6946                 bundle->surface_updates[planes_count].plane_info =
6947                         &bundle->plane_infos[planes_count];
6948
6949                 /*
6950                  * Only allow immediate flips for fast updates that don't
6951                  * change FB pitch, DCC state, rotation or mirroing.
6952                  */
6953                 bundle->flip_addrs[planes_count].flip_immediate =
6954                         crtc->state->async_flip &&
6955                         acrtc_state->update_type == UPDATE_TYPE_FAST;
6956
6957                 timestamp_ns = ktime_get_ns();
6958                 bundle->flip_addrs[planes_count].flip_timestamp_in_us = div_u64(timestamp_ns, 1000);
6959                 bundle->surface_updates[planes_count].flip_addr = &bundle->flip_addrs[planes_count];
6960                 bundle->surface_updates[planes_count].surface = dc_plane;
6961
6962                 if (!bundle->surface_updates[planes_count].surface) {
6963                         DRM_ERROR("No surface for CRTC: id=%d\n",
6964                                         acrtc_attach->crtc_id);
6965                         continue;
6966                 }
6967
6968                 if (plane == pcrtc->primary)
6969                         update_freesync_state_on_stream(
6970                                 dm,
6971                                 acrtc_state,
6972                                 acrtc_state->stream,
6973                                 dc_plane,
6974                                 bundle->flip_addrs[planes_count].flip_timestamp_in_us);
6975
6976                 DRM_DEBUG_DRIVER("%s Flipping to hi: 0x%x, low: 0x%x\n",
6977                                  __func__,
6978                                  bundle->flip_addrs[planes_count].address.grph.addr.high_part,
6979                                  bundle->flip_addrs[planes_count].address.grph.addr.low_part);
6980
6981                 planes_count += 1;
6982
6983         }
6984
6985         if (pflip_present) {
6986                 if (!vrr_active) {
6987                         /* Use old throttling in non-vrr fixed refresh rate mode
6988                          * to keep flip scheduling based on target vblank counts
6989                          * working in a backwards compatible way, e.g., for
6990                          * clients using the GLX_OML_sync_control extension or
6991                          * DRI3/Present extension with defined target_msc.
6992                          */
6993                         last_flip_vblank = amdgpu_get_vblank_counter_kms(pcrtc);
6994                 }
6995                 else {
6996                         /* For variable refresh rate mode only:
6997                          * Get vblank of last completed flip to avoid > 1 vrr
6998                          * flips per video frame by use of throttling, but allow
6999                          * flip programming anywhere in the possibly large
7000                          * variable vrr vblank interval for fine-grained flip
7001                          * timing control and more opportunity to avoid stutter
7002                          * on late submission of flips.
7003                          */
7004                         spin_lock_irqsave(&pcrtc->dev->event_lock, flags);
7005                         last_flip_vblank = acrtc_attach->last_flip_vblank;
7006                         spin_unlock_irqrestore(&pcrtc->dev->event_lock, flags);
7007                 }
7008
7009                 target_vblank = last_flip_vblank + wait_for_vblank;
7010
7011                 /*
7012                  * Wait until we're out of the vertical blank period before the one
7013                  * targeted by the flip
7014                  */
7015                 while ((acrtc_attach->enabled &&
7016                         (amdgpu_display_get_crtc_scanoutpos(dm->ddev, acrtc_attach->crtc_id,
7017                                                             0, &vpos, &hpos, NULL,
7018                                                             NULL, &pcrtc->hwmode)
7019                          & (DRM_SCANOUTPOS_VALID | DRM_SCANOUTPOS_IN_VBLANK)) ==
7020                         (DRM_SCANOUTPOS_VALID | DRM_SCANOUTPOS_IN_VBLANK) &&
7021                         (int)(target_vblank -
7022                           amdgpu_get_vblank_counter_kms(pcrtc)) > 0)) {
7023                         usleep_range(1000, 1100);
7024                 }
7025
7026                 if (acrtc_attach->base.state->event) {
7027                         drm_crtc_vblank_get(pcrtc);
7028
7029                         spin_lock_irqsave(&pcrtc->dev->event_lock, flags);
7030
7031                         WARN_ON(acrtc_attach->pflip_status != AMDGPU_FLIP_NONE);
7032                         prepare_flip_isr(acrtc_attach);
7033
7034                         spin_unlock_irqrestore(&pcrtc->dev->event_lock, flags);
7035                 }
7036
7037                 if (acrtc_state->stream) {
7038                         if (acrtc_state->freesync_vrr_info_changed)
7039                                 bundle->stream_update.vrr_infopacket =
7040                                         &acrtc_state->stream->vrr_infopacket;
7041                 }
7042         }
7043
7044         /* Update the planes if changed or disable if we don't have any. */
7045         if ((planes_count || acrtc_state->active_planes == 0) &&
7046                 acrtc_state->stream) {
7047                 bundle->stream_update.stream = acrtc_state->stream;
7048                 if (new_pcrtc_state->mode_changed) {
7049                         bundle->stream_update.src = acrtc_state->stream->src;
7050                         bundle->stream_update.dst = acrtc_state->stream->dst;
7051                 }
7052
7053                 if (new_pcrtc_state->color_mgmt_changed) {
7054                         /*
7055                          * TODO: This isn't fully correct since we've actually
7056                          * already modified the stream in place.
7057                          */
7058                         bundle->stream_update.gamut_remap =
7059                                 &acrtc_state->stream->gamut_remap_matrix;
7060                         bundle->stream_update.output_csc_transform =
7061                                 &acrtc_state->stream->csc_color_matrix;
7062                         bundle->stream_update.out_transfer_func =
7063                                 acrtc_state->stream->out_transfer_func;
7064                 }
7065
7066                 acrtc_state->stream->abm_level = acrtc_state->abm_level;
7067                 if (acrtc_state->abm_level != dm_old_crtc_state->abm_level)
7068                         bundle->stream_update.abm_level = &acrtc_state->abm_level;
7069
7070                 /*
7071                  * If FreeSync state on the stream has changed then we need to
7072                  * re-adjust the min/max bounds now that DC doesn't handle this
7073                  * as part of commit.
7074                  */
7075                 if (amdgpu_dm_vrr_active(dm_old_crtc_state) !=
7076                     amdgpu_dm_vrr_active(acrtc_state)) {
7077                         spin_lock_irqsave(&pcrtc->dev->event_lock, flags);
7078                         dc_stream_adjust_vmin_vmax(
7079                                 dm->dc, acrtc_state->stream,
7080                                 &acrtc_state->vrr_params.adjust);
7081                         spin_unlock_irqrestore(&pcrtc->dev->event_lock, flags);
7082                 }
7083                 mutex_lock(&dm->dc_lock);
7084                 if ((acrtc_state->update_type > UPDATE_TYPE_FAST) &&
7085                                 acrtc_state->stream->link->psr_settings.psr_allow_active)
7086                         amdgpu_dm_psr_disable(acrtc_state->stream);
7087
7088                 dc_commit_updates_for_stream(dm->dc,
7089                                                      bundle->surface_updates,
7090                                                      planes_count,
7091                                                      acrtc_state->stream,
7092                                                      &bundle->stream_update,
7093                                                      dc_state);
7094
7095                 if ((acrtc_state->update_type > UPDATE_TYPE_FAST) &&
7096                                 acrtc_state->stream->link->psr_settings.psr_version != DC_PSR_VERSION_UNSUPPORTED &&
7097                                 !acrtc_state->stream->link->psr_settings.psr_feature_enabled)
7098                         amdgpu_dm_link_setup_psr(acrtc_state->stream);
7099                 else if ((acrtc_state->update_type == UPDATE_TYPE_FAST) &&
7100                                 acrtc_state->stream->link->psr_settings.psr_feature_enabled &&
7101                                 !acrtc_state->stream->link->psr_settings.psr_allow_active) {
7102                         amdgpu_dm_psr_enable(acrtc_state->stream);
7103                 }
7104
7105                 mutex_unlock(&dm->dc_lock);
7106         }
7107
7108         /*
7109          * Update cursor state *after* programming all the planes.
7110          * This avoids redundant programming in the case where we're going
7111          * to be disabling a single plane - those pipes are being disabled.
7112          */
7113         if (acrtc_state->active_planes)
7114                 amdgpu_dm_commit_cursors(state);
7115
7116 cleanup:
7117         kfree(bundle);
7118 }
7119
7120 static void amdgpu_dm_commit_audio(struct drm_device *dev,
7121                                    struct drm_atomic_state *state)
7122 {
7123         struct amdgpu_device *adev = dev->dev_private;
7124         struct amdgpu_dm_connector *aconnector;
7125         struct drm_connector *connector;
7126         struct drm_connector_state *old_con_state, *new_con_state;
7127         struct drm_crtc_state *new_crtc_state;
7128         struct dm_crtc_state *new_dm_crtc_state;
7129         const struct dc_stream_status *status;
7130         int i, inst;
7131
7132         /* Notify device removals. */
7133         for_each_oldnew_connector_in_state(state, connector, old_con_state, new_con_state, i) {
7134                 if (old_con_state->crtc != new_con_state->crtc) {
7135                         /* CRTC changes require notification. */
7136                         goto notify;
7137                 }
7138
7139                 if (!new_con_state->crtc)
7140                         continue;
7141
7142                 new_crtc_state = drm_atomic_get_new_crtc_state(
7143                         state, new_con_state->crtc);
7144
7145                 if (!new_crtc_state)
7146                         continue;
7147
7148                 if (!drm_atomic_crtc_needs_modeset(new_crtc_state))
7149                         continue;
7150
7151         notify:
7152                 aconnector = to_amdgpu_dm_connector(connector);
7153
7154                 mutex_lock(&adev->dm.audio_lock);
7155                 inst = aconnector->audio_inst;
7156                 aconnector->audio_inst = -1;
7157                 mutex_unlock(&adev->dm.audio_lock);
7158
7159                 amdgpu_dm_audio_eld_notify(adev, inst);
7160         }
7161
7162         /* Notify audio device additions. */
7163         for_each_new_connector_in_state(state, connector, new_con_state, i) {
7164                 if (!new_con_state->crtc)
7165                         continue;
7166
7167                 new_crtc_state = drm_atomic_get_new_crtc_state(
7168                         state, new_con_state->crtc);
7169
7170                 if (!new_crtc_state)
7171                         continue;
7172
7173                 if (!drm_atomic_crtc_needs_modeset(new_crtc_state))
7174                         continue;
7175
7176                 new_dm_crtc_state = to_dm_crtc_state(new_crtc_state);
7177                 if (!new_dm_crtc_state->stream)
7178                         continue;
7179
7180                 status = dc_stream_get_status(new_dm_crtc_state->stream);
7181                 if (!status)
7182                         continue;
7183
7184                 aconnector = to_amdgpu_dm_connector(connector);
7185
7186                 mutex_lock(&adev->dm.audio_lock);
7187                 inst = status->audio_inst;
7188                 aconnector->audio_inst = inst;
7189                 mutex_unlock(&adev->dm.audio_lock);
7190
7191                 amdgpu_dm_audio_eld_notify(adev, inst);
7192         }
7193 }
7194
7195 /*
7196  * Enable interrupts on CRTCs that are newly active, undergone
7197  * a modeset, or have active planes again.
7198  *
7199  * Done in two passes, based on the for_modeset flag:
7200  * Pass 1: For CRTCs going through modeset
7201  * Pass 2: For CRTCs going from 0 to n active planes
7202  *
7203  * Interrupts can only be enabled after the planes are programmed,
7204  * so this requires a two-pass approach since we don't want to
7205  * just defer the interrupts until after commit planes every time.
7206  */
7207 static void amdgpu_dm_enable_crtc_interrupts(struct drm_device *dev,
7208                                              struct drm_atomic_state *state,
7209                                              bool for_modeset)
7210 {
7211         struct amdgpu_device *adev = dev->dev_private;
7212         struct drm_crtc *crtc;
7213         struct drm_crtc_state *old_crtc_state, *new_crtc_state;
7214         int i;
7215 #ifdef CONFIG_DEBUG_FS
7216         enum amdgpu_dm_pipe_crc_source source;
7217 #endif
7218
7219         for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state,
7220                                       new_crtc_state, i) {
7221                 struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc);
7222                 struct dm_crtc_state *dm_new_crtc_state =
7223                         to_dm_crtc_state(new_crtc_state);
7224                 struct dm_crtc_state *dm_old_crtc_state =
7225                         to_dm_crtc_state(old_crtc_state);
7226                 bool modeset = drm_atomic_crtc_needs_modeset(new_crtc_state);
7227                 bool run_pass;
7228
7229                 run_pass = (for_modeset && modeset) ||
7230                            (!for_modeset && !modeset &&
7231                             !dm_old_crtc_state->interrupts_enabled);
7232
7233                 if (!run_pass)
7234                         continue;
7235
7236                 if (!dm_new_crtc_state->interrupts_enabled)
7237                         continue;
7238
7239                 manage_dm_interrupts(adev, acrtc, true);
7240
7241 #ifdef CONFIG_DEBUG_FS
7242                 /* The stream has changed so CRC capture needs to re-enabled. */
7243                 source = dm_new_crtc_state->crc_src;
7244                 if (amdgpu_dm_is_valid_crc_source(source)) {
7245                         amdgpu_dm_crtc_configure_crc_source(
7246                                 crtc, dm_new_crtc_state,
7247                                 dm_new_crtc_state->crc_src);
7248                 }
7249 #endif
7250         }
7251 }
7252
7253 /*
7254  * amdgpu_dm_crtc_copy_transient_flags - copy mirrored flags from DRM to DC
7255  * @crtc_state: the DRM CRTC state
7256  * @stream_state: the DC stream state.
7257  *
7258  * Copy the mirrored transient state flags from DRM, to DC. It is used to bring
7259  * a dc_stream_state's flags in sync with a drm_crtc_state's flags.
7260  */
7261 static void amdgpu_dm_crtc_copy_transient_flags(struct drm_crtc_state *crtc_state,
7262                                                 struct dc_stream_state *stream_state)
7263 {
7264         stream_state->mode_changed = drm_atomic_crtc_needs_modeset(crtc_state);
7265 }
7266
7267 static int amdgpu_dm_atomic_commit(struct drm_device *dev,
7268                                    struct drm_atomic_state *state,
7269                                    bool nonblock)
7270 {
7271         struct drm_crtc *crtc;
7272         struct drm_crtc_state *old_crtc_state, *new_crtc_state;
7273         struct amdgpu_device *adev = dev->dev_private;
7274         int i;
7275
7276         /*
7277          * We evade vblank and pflip interrupts on CRTCs that are undergoing
7278          * a modeset, being disabled, or have no active planes.
7279          *
7280          * It's done in atomic commit rather than commit tail for now since
7281          * some of these interrupt handlers access the current CRTC state and
7282          * potentially the stream pointer itself.
7283          *
7284          * Since the atomic state is swapped within atomic commit and not within
7285          * commit tail this would leave to new state (that hasn't been committed yet)
7286          * being accesssed from within the handlers.
7287          *
7288          * TODO: Fix this so we can do this in commit tail and not have to block
7289          * in atomic check.
7290          */
7291         for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
7292                 struct dm_crtc_state *dm_old_crtc_state = to_dm_crtc_state(old_crtc_state);
7293                 struct dm_crtc_state *dm_new_crtc_state = to_dm_crtc_state(new_crtc_state);
7294                 struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc);
7295
7296                 if (dm_old_crtc_state->interrupts_enabled &&
7297                     (!dm_new_crtc_state->interrupts_enabled ||
7298                      drm_atomic_crtc_needs_modeset(new_crtc_state)))
7299                         manage_dm_interrupts(adev, acrtc, false);
7300         }
7301         /*
7302          * Add check here for SoC's that support hardware cursor plane, to
7303          * unset legacy_cursor_update
7304          */
7305
7306         return drm_atomic_helper_commit(dev, state, nonblock);
7307
7308         /*TODO Handle EINTR, reenable IRQ*/
7309 }
7310
7311 /**
7312  * amdgpu_dm_atomic_commit_tail() - AMDgpu DM's commit tail implementation.
7313  * @state: The atomic state to commit
7314  *
7315  * This will tell DC to commit the constructed DC state from atomic_check,
7316  * programming the hardware. Any failures here implies a hardware failure, since
7317  * atomic check should have filtered anything non-kosher.
7318  */
7319 static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
7320 {
7321         struct drm_device *dev = state->dev;
7322         struct amdgpu_device *adev = dev->dev_private;
7323         struct amdgpu_display_manager *dm = &adev->dm;
7324         struct dm_atomic_state *dm_state;
7325         struct dc_state *dc_state = NULL, *dc_state_temp = NULL;
7326         uint32_t i, j;
7327         struct drm_crtc *crtc;
7328         struct drm_crtc_state *old_crtc_state, *new_crtc_state;
7329         unsigned long flags;
7330         bool wait_for_vblank = true;
7331         struct drm_connector *connector;
7332         struct drm_connector_state *old_con_state, *new_con_state;
7333         struct dm_crtc_state *dm_old_crtc_state, *dm_new_crtc_state;
7334         int crtc_disable_count = 0;
7335
7336         drm_atomic_helper_update_legacy_modeset_state(dev, state);
7337
7338         dm_state = dm_atomic_get_new_state(state);
7339         if (dm_state && dm_state->context) {
7340                 dc_state = dm_state->context;
7341         } else {
7342                 /* No state changes, retain current state. */
7343                 dc_state_temp = dc_create_state(dm->dc);
7344                 ASSERT(dc_state_temp);
7345                 dc_state = dc_state_temp;
7346                 dc_resource_state_copy_construct_current(dm->dc, dc_state);
7347         }
7348
7349         /* update changed items */
7350         for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
7351                 struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc);
7352
7353                 dm_new_crtc_state = to_dm_crtc_state(new_crtc_state);
7354                 dm_old_crtc_state = to_dm_crtc_state(old_crtc_state);
7355
7356                 DRM_DEBUG_DRIVER(
7357                         "amdgpu_crtc id:%d crtc_state_flags: enable:%d, active:%d, "
7358                         "planes_changed:%d, mode_changed:%d,active_changed:%d,"
7359                         "connectors_changed:%d\n",
7360                         acrtc->crtc_id,
7361                         new_crtc_state->enable,
7362                         new_crtc_state->active,
7363                         new_crtc_state->planes_changed,
7364                         new_crtc_state->mode_changed,
7365                         new_crtc_state->active_changed,
7366                         new_crtc_state->connectors_changed);
7367
7368                 /* Copy all transient state flags into dc state */
7369                 if (dm_new_crtc_state->stream) {
7370                         amdgpu_dm_crtc_copy_transient_flags(&dm_new_crtc_state->base,
7371                                                             dm_new_crtc_state->stream);
7372                 }
7373
7374                 /* handles headless hotplug case, updating new_state and
7375                  * aconnector as needed
7376                  */
7377
7378                 if (modeset_required(new_crtc_state, dm_new_crtc_state->stream, dm_old_crtc_state->stream)) {
7379
7380                         DRM_DEBUG_DRIVER("Atomic commit: SET crtc id %d: [%p]\n", acrtc->crtc_id, acrtc);
7381
7382                         if (!dm_new_crtc_state->stream) {
7383                                 /*
7384                                  * this could happen because of issues with
7385                                  * userspace notifications delivery.
7386                                  * In this case userspace tries to set mode on
7387                                  * display which is disconnected in fact.
7388                                  * dc_sink is NULL in this case on aconnector.
7389                                  * We expect reset mode will come soon.
7390                                  *
7391                                  * This can also happen when unplug is done
7392                                  * during resume sequence ended
7393                                  *
7394                                  * In this case, we want to pretend we still
7395                                  * have a sink to keep the pipe running so that
7396                                  * hw state is consistent with the sw state
7397                                  */
7398                                 DRM_DEBUG_DRIVER("%s: Failed to create new stream for crtc %d\n",
7399                                                 __func__, acrtc->base.base.id);
7400                                 continue;
7401                         }
7402
7403                         if (dm_old_crtc_state->stream)
7404                                 remove_stream(adev, acrtc, dm_old_crtc_state->stream);
7405
7406                         pm_runtime_get_noresume(dev->dev);
7407
7408                         acrtc->enabled = true;
7409                         acrtc->hw_mode = new_crtc_state->mode;
7410                         crtc->hwmode = new_crtc_state->mode;
7411                 } else if (modereset_required(new_crtc_state)) {
7412                         DRM_DEBUG_DRIVER("Atomic commit: RESET. crtc id %d:[%p]\n", acrtc->crtc_id, acrtc);
7413                         /* i.e. reset mode */
7414                         if (dm_old_crtc_state->stream) {
7415                                 if (dm_old_crtc_state->stream->link->psr_settings.psr_allow_active)
7416                                         amdgpu_dm_psr_disable(dm_old_crtc_state->stream);
7417
7418                                 remove_stream(adev, acrtc, dm_old_crtc_state->stream);
7419                         }
7420                 }
7421         } /* for_each_crtc_in_state() */
7422
7423         if (dc_state) {
7424                 dm_enable_per_frame_crtc_master_sync(dc_state);
7425                 mutex_lock(&dm->dc_lock);
7426                 WARN_ON(!dc_commit_state(dm->dc, dc_state));
7427                 mutex_unlock(&dm->dc_lock);
7428         }
7429
7430         for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
7431                 struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc);
7432
7433                 dm_new_crtc_state = to_dm_crtc_state(new_crtc_state);
7434
7435                 if (dm_new_crtc_state->stream != NULL) {
7436                         const struct dc_stream_status *status =
7437                                         dc_stream_get_status(dm_new_crtc_state->stream);
7438
7439                         if (!status)
7440                                 status = dc_stream_get_status_from_state(dc_state,
7441                                                                          dm_new_crtc_state->stream);
7442
7443                         if (!status)
7444                                 DC_ERR("got no status for stream %p on acrtc%p\n", dm_new_crtc_state->stream, acrtc);
7445                         else
7446                                 acrtc->otg_inst = status->primary_otg_inst;
7447                 }
7448         }
7449 #ifdef CONFIG_DRM_AMD_DC_HDCP
7450         for_each_oldnew_connector_in_state(state, connector, old_con_state, new_con_state, i) {
7451                 struct dm_connector_state *dm_new_con_state = to_dm_connector_state(new_con_state);
7452                 struct amdgpu_crtc *acrtc = to_amdgpu_crtc(dm_new_con_state->base.crtc);
7453                 struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
7454
7455                 new_crtc_state = NULL;
7456
7457                 if (acrtc)
7458                         new_crtc_state = drm_atomic_get_new_crtc_state(state, &acrtc->base);
7459
7460                 dm_new_crtc_state = to_dm_crtc_state(new_crtc_state);
7461
7462                 if (dm_new_crtc_state && dm_new_crtc_state->stream == NULL &&
7463                     connector->state->content_protection == DRM_MODE_CONTENT_PROTECTION_ENABLED) {
7464                         hdcp_reset_display(adev->dm.hdcp_workqueue, aconnector->dc_link->link_index);
7465                         new_con_state->content_protection = DRM_MODE_CONTENT_PROTECTION_DESIRED;
7466                         continue;
7467                 }
7468
7469                 if (is_content_protection_different(new_con_state, old_con_state, connector, adev->dm.hdcp_workqueue))
7470                         hdcp_update_display(
7471                                 adev->dm.hdcp_workqueue, aconnector->dc_link->link_index, aconnector,
7472                                 new_con_state->hdcp_content_type,
7473                                 new_con_state->content_protection == DRM_MODE_CONTENT_PROTECTION_DESIRED ? true
7474                                                                                                          : false);
7475         }
7476 #endif
7477
7478         /* Handle connector state changes */
7479         for_each_oldnew_connector_in_state(state, connector, old_con_state, new_con_state, i) {
7480                 struct dm_connector_state *dm_new_con_state = to_dm_connector_state(new_con_state);
7481                 struct dm_connector_state *dm_old_con_state = to_dm_connector_state(old_con_state);
7482                 struct amdgpu_crtc *acrtc = to_amdgpu_crtc(dm_new_con_state->base.crtc);
7483                 struct dc_surface_update dummy_updates[MAX_SURFACES];
7484                 struct dc_stream_update stream_update;
7485                 struct dc_info_packet hdr_packet;
7486                 struct dc_stream_status *status = NULL;
7487                 bool abm_changed, hdr_changed, scaling_changed;
7488
7489                 memset(&dummy_updates, 0, sizeof(dummy_updates));
7490                 memset(&stream_update, 0, sizeof(stream_update));
7491
7492                 if (acrtc) {
7493                         new_crtc_state = drm_atomic_get_new_crtc_state(state, &acrtc->base);
7494                         old_crtc_state = drm_atomic_get_old_crtc_state(state, &acrtc->base);
7495                 }
7496
7497                 /* Skip any modesets/resets */
7498                 if (!acrtc || drm_atomic_crtc_needs_modeset(new_crtc_state))
7499                         continue;
7500
7501                 dm_new_crtc_state = to_dm_crtc_state(new_crtc_state);
7502                 dm_old_crtc_state = to_dm_crtc_state(old_crtc_state);
7503
7504                 scaling_changed = is_scaling_state_different(dm_new_con_state,
7505                                                              dm_old_con_state);
7506
7507                 abm_changed = dm_new_crtc_state->abm_level !=
7508                               dm_old_crtc_state->abm_level;
7509
7510                 hdr_changed =
7511                         is_hdr_metadata_different(old_con_state, new_con_state);
7512
7513                 if (!scaling_changed && !abm_changed && !hdr_changed)
7514                         continue;
7515
7516                 stream_update.stream = dm_new_crtc_state->stream;
7517                 if (scaling_changed) {
7518                         update_stream_scaling_settings(&dm_new_con_state->base.crtc->mode,
7519                                         dm_new_con_state, dm_new_crtc_state->stream);
7520
7521                         stream_update.src = dm_new_crtc_state->stream->src;
7522                         stream_update.dst = dm_new_crtc_state->stream->dst;
7523                 }
7524
7525                 if (abm_changed) {
7526                         dm_new_crtc_state->stream->abm_level = dm_new_crtc_state->abm_level;
7527
7528                         stream_update.abm_level = &dm_new_crtc_state->abm_level;
7529                 }
7530
7531                 if (hdr_changed) {
7532                         fill_hdr_info_packet(new_con_state, &hdr_packet);
7533                         stream_update.hdr_static_metadata = &hdr_packet;
7534                 }
7535
7536                 status = dc_stream_get_status(dm_new_crtc_state->stream);
7537                 WARN_ON(!status);
7538                 WARN_ON(!status->plane_count);
7539
7540                 /*
7541                  * TODO: DC refuses to perform stream updates without a dc_surface_update.
7542                  * Here we create an empty update on each plane.
7543                  * To fix this, DC should permit updating only stream properties.
7544                  */
7545                 for (j = 0; j < status->plane_count; j++)
7546                         dummy_updates[j].surface = status->plane_states[0];
7547
7548
7549                 mutex_lock(&dm->dc_lock);
7550                 dc_commit_updates_for_stream(dm->dc,
7551                                                      dummy_updates,
7552                                                      status->plane_count,
7553                                                      dm_new_crtc_state->stream,
7554                                                      &stream_update,
7555                                                      dc_state);
7556                 mutex_unlock(&dm->dc_lock);
7557         }
7558
7559         /* Count number of newly disabled CRTCs for dropping PM refs later. */
7560         for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state,
7561                                       new_crtc_state, i) {
7562                 if (old_crtc_state->active && !new_crtc_state->active)
7563                         crtc_disable_count++;
7564
7565                 dm_new_crtc_state = to_dm_crtc_state(new_crtc_state);
7566                 dm_old_crtc_state = to_dm_crtc_state(old_crtc_state);
7567
7568                 /* Update freesync active state. */
7569                 pre_update_freesync_state_on_stream(dm, dm_new_crtc_state);
7570
7571                 /* Handle vrr on->off / off->on transitions */
7572                 amdgpu_dm_handle_vrr_transition(dm_old_crtc_state,
7573                                                 dm_new_crtc_state);
7574         }
7575
7576         /* Enable interrupts for CRTCs going through a modeset. */
7577         amdgpu_dm_enable_crtc_interrupts(dev, state, true);
7578
7579         for_each_new_crtc_in_state(state, crtc, new_crtc_state, j)
7580                 if (new_crtc_state->async_flip)
7581                         wait_for_vblank = false;
7582
7583         /* update planes when needed per crtc*/
7584         for_each_new_crtc_in_state(state, crtc, new_crtc_state, j) {
7585                 dm_new_crtc_state = to_dm_crtc_state(new_crtc_state);
7586
7587                 if (dm_new_crtc_state->stream)
7588                         amdgpu_dm_commit_planes(state, dc_state, dev,
7589                                                 dm, crtc, wait_for_vblank);
7590         }
7591
7592         /* Enable interrupts for CRTCs going from 0 to n active planes. */
7593         amdgpu_dm_enable_crtc_interrupts(dev, state, false);
7594
7595         /* Update audio instances for each connector. */
7596         amdgpu_dm_commit_audio(dev, state);
7597
7598         /*
7599          * send vblank event on all events not handled in flip and
7600          * mark consumed event for drm_atomic_helper_commit_hw_done
7601          */
7602         spin_lock_irqsave(&adev->ddev->event_lock, flags);
7603         for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
7604
7605                 if (new_crtc_state->event)
7606                         drm_send_event_locked(dev, &new_crtc_state->event->base);
7607
7608                 new_crtc_state->event = NULL;
7609         }
7610         spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
7611
7612         /* Signal HW programming completion */
7613         drm_atomic_helper_commit_hw_done(state);
7614
7615         if (wait_for_vblank)
7616                 drm_atomic_helper_wait_for_flip_done(dev, state);
7617
7618         drm_atomic_helper_cleanup_planes(dev, state);
7619
7620         /*
7621          * Finally, drop a runtime PM reference for each newly disabled CRTC,
7622          * so we can put the GPU into runtime suspend if we're not driving any
7623          * displays anymore
7624          */
7625         for (i = 0; i < crtc_disable_count; i++)
7626                 pm_runtime_put_autosuspend(dev->dev);
7627         pm_runtime_mark_last_busy(dev->dev);
7628
7629         if (dc_state_temp)
7630                 dc_release_state(dc_state_temp);
7631 }
7632
7633
7634 static int dm_force_atomic_commit(struct drm_connector *connector)
7635 {
7636         int ret = 0;
7637         struct drm_device *ddev = connector->dev;
7638         struct drm_atomic_state *state = drm_atomic_state_alloc(ddev);
7639         struct amdgpu_crtc *disconnected_acrtc = to_amdgpu_crtc(connector->encoder->crtc);
7640         struct drm_plane *plane = disconnected_acrtc->base.primary;
7641         struct drm_connector_state *conn_state;
7642         struct drm_crtc_state *crtc_state;
7643         struct drm_plane_state *plane_state;
7644
7645         if (!state)
7646                 return -ENOMEM;
7647
7648         state->acquire_ctx = ddev->mode_config.acquire_ctx;
7649
7650         /* Construct an atomic state to restore previous display setting */
7651
7652         /*
7653          * Attach connectors to drm_atomic_state
7654          */
7655         conn_state = drm_atomic_get_connector_state(state, connector);
7656
7657         ret = PTR_ERR_OR_ZERO(conn_state);
7658         if (ret)
7659                 goto err;
7660
7661         /* Attach crtc to drm_atomic_state*/
7662         crtc_state = drm_atomic_get_crtc_state(state, &disconnected_acrtc->base);
7663
7664         ret = PTR_ERR_OR_ZERO(crtc_state);
7665         if (ret)
7666                 goto err;
7667
7668         /* force a restore */
7669         crtc_state->mode_changed = true;
7670
7671         /* Attach plane to drm_atomic_state */
7672         plane_state = drm_atomic_get_plane_state(state, plane);
7673
7674         ret = PTR_ERR_OR_ZERO(plane_state);
7675         if (ret)
7676                 goto err;
7677
7678
7679         /* Call commit internally with the state we just constructed */
7680         ret = drm_atomic_commit(state);
7681         if (!ret)
7682                 return 0;
7683
7684 err:
7685         DRM_ERROR("Restoring old state failed with %i\n", ret);
7686         drm_atomic_state_put(state);
7687
7688         return ret;
7689 }
7690
7691 /*
7692  * This function handles all cases when set mode does not come upon hotplug.
7693  * This includes when a display is unplugged then plugged back into the
7694  * same port and when running without usermode desktop manager supprot
7695  */
7696 void dm_restore_drm_connector_state(struct drm_device *dev,
7697                                     struct drm_connector *connector)
7698 {
7699         struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
7700         struct amdgpu_crtc *disconnected_acrtc;
7701         struct dm_crtc_state *acrtc_state;
7702
7703         if (!aconnector->dc_sink || !connector->state || !connector->encoder)
7704                 return;
7705
7706         disconnected_acrtc = to_amdgpu_crtc(connector->encoder->crtc);
7707         if (!disconnected_acrtc)
7708                 return;
7709
7710         acrtc_state = to_dm_crtc_state(disconnected_acrtc->base.state);
7711         if (!acrtc_state->stream)
7712                 return;
7713
7714         /*
7715          * If the previous sink is not released and different from the current,
7716          * we deduce we are in a state where we can not rely on usermode call
7717          * to turn on the display, so we do it here
7718          */
7719         if (acrtc_state->stream->sink != aconnector->dc_sink)
7720                 dm_force_atomic_commit(&aconnector->base);
7721 }
7722
7723 /*
7724  * Grabs all modesetting locks to serialize against any blocking commits,
7725  * Waits for completion of all non blocking commits.
7726  */
7727 static int do_aquire_global_lock(struct drm_device *dev,
7728                                  struct drm_atomic_state *state)
7729 {
7730         struct drm_crtc *crtc;
7731         struct drm_crtc_commit *commit;
7732         long ret;
7733
7734         /*
7735          * Adding all modeset locks to aquire_ctx will
7736          * ensure that when the framework release it the
7737          * extra locks we are locking here will get released to
7738          */
7739         ret = drm_modeset_lock_all_ctx(dev, state->acquire_ctx);
7740         if (ret)
7741                 return ret;
7742
7743         list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
7744                 spin_lock(&crtc->commit_lock);
7745                 commit = list_first_entry_or_null(&crtc->commit_list,
7746                                 struct drm_crtc_commit, commit_entry);
7747                 if (commit)
7748                         drm_crtc_commit_get(commit);
7749                 spin_unlock(&crtc->commit_lock);
7750
7751                 if (!commit)
7752                         continue;
7753
7754                 /*
7755                  * Make sure all pending HW programming completed and
7756                  * page flips done
7757                  */
7758                 ret = wait_for_completion_interruptible_timeout(&commit->hw_done, 10*HZ);
7759
7760                 if (ret > 0)
7761                         ret = wait_for_completion_interruptible_timeout(
7762                                         &commit->flip_done, 10*HZ);
7763
7764                 if (ret == 0)
7765                         DRM_ERROR("[CRTC:%d:%s] hw_done or flip_done "
7766                                   "timed out\n", crtc->base.id, crtc->name);
7767
7768                 drm_crtc_commit_put(commit);
7769         }
7770
7771         return ret < 0 ? ret : 0;
7772 }
7773
7774 static void get_freesync_config_for_crtc(
7775         struct dm_crtc_state *new_crtc_state,
7776         struct dm_connector_state *new_con_state)
7777 {
7778         struct mod_freesync_config config = {0};
7779         struct amdgpu_dm_connector *aconnector =
7780                         to_amdgpu_dm_connector(new_con_state->base.connector);
7781         struct drm_display_mode *mode = &new_crtc_state->base.mode;
7782         int vrefresh = drm_mode_vrefresh(mode);
7783
7784         new_crtc_state->vrr_supported = new_con_state->freesync_capable &&
7785                                         vrefresh >= aconnector->min_vfreq &&
7786                                         vrefresh <= aconnector->max_vfreq;
7787
7788         if (new_crtc_state->vrr_supported) {
7789                 new_crtc_state->stream->ignore_msa_timing_param = true;
7790                 config.state = new_crtc_state->base.vrr_enabled ?
7791                                 VRR_STATE_ACTIVE_VARIABLE :
7792                                 VRR_STATE_INACTIVE;
7793                 config.min_refresh_in_uhz =
7794                                 aconnector->min_vfreq * 1000000;
7795                 config.max_refresh_in_uhz =
7796                                 aconnector->max_vfreq * 1000000;
7797                 config.vsif_supported = true;
7798                 config.btr = true;
7799         }
7800
7801         new_crtc_state->freesync_config = config;
7802 }
7803
7804 static void reset_freesync_config_for_crtc(
7805         struct dm_crtc_state *new_crtc_state)
7806 {
7807         new_crtc_state->vrr_supported = false;
7808
7809         memset(&new_crtc_state->vrr_params, 0,
7810                sizeof(new_crtc_state->vrr_params));
7811         memset(&new_crtc_state->vrr_infopacket, 0,
7812                sizeof(new_crtc_state->vrr_infopacket));
7813 }
7814
7815 static int dm_update_crtc_state(struct amdgpu_display_manager *dm,
7816                                 struct drm_atomic_state *state,
7817                                 struct drm_crtc *crtc,
7818                                 struct drm_crtc_state *old_crtc_state,
7819                                 struct drm_crtc_state *new_crtc_state,
7820                                 bool enable,
7821                                 bool *lock_and_validation_needed)
7822 {
7823         struct dm_atomic_state *dm_state = NULL;
7824         struct dm_crtc_state *dm_old_crtc_state, *dm_new_crtc_state;
7825         struct dc_stream_state *new_stream;
7826         int ret = 0;
7827
7828         /*
7829          * TODO Move this code into dm_crtc_atomic_check once we get rid of dc_validation_set
7830          * update changed items
7831          */
7832         struct amdgpu_crtc *acrtc = NULL;
7833         struct amdgpu_dm_connector *aconnector = NULL;
7834         struct drm_connector_state *drm_new_conn_state = NULL, *drm_old_conn_state = NULL;
7835         struct dm_connector_state *dm_new_conn_state = NULL, *dm_old_conn_state = NULL;
7836
7837         new_stream = NULL;
7838
7839         dm_old_crtc_state = to_dm_crtc_state(old_crtc_state);
7840         dm_new_crtc_state = to_dm_crtc_state(new_crtc_state);
7841         acrtc = to_amdgpu_crtc(crtc);
7842         aconnector = amdgpu_dm_find_first_crtc_matching_connector(state, crtc);
7843
7844         /* TODO This hack should go away */
7845         if (aconnector && enable) {
7846                 /* Make sure fake sink is created in plug-in scenario */
7847                 drm_new_conn_state = drm_atomic_get_new_connector_state(state,
7848                                                             &aconnector->base);
7849                 drm_old_conn_state = drm_atomic_get_old_connector_state(state,
7850                                                             &aconnector->base);
7851
7852                 if (IS_ERR(drm_new_conn_state)) {
7853                         ret = PTR_ERR_OR_ZERO(drm_new_conn_state);
7854                         goto fail;
7855                 }
7856
7857                 dm_new_conn_state = to_dm_connector_state(drm_new_conn_state);
7858                 dm_old_conn_state = to_dm_connector_state(drm_old_conn_state);
7859
7860                 if (!drm_atomic_crtc_needs_modeset(new_crtc_state))
7861                         goto skip_modeset;
7862
7863                 new_stream = create_validate_stream_for_sink(aconnector,
7864                                                              &new_crtc_state->mode,
7865                                                              dm_new_conn_state,
7866                                                              dm_old_crtc_state->stream);
7867
7868                 /*
7869                  * we can have no stream on ACTION_SET if a display
7870                  * was disconnected during S3, in this case it is not an
7871                  * error, the OS will be updated after detection, and
7872                  * will do the right thing on next atomic commit
7873                  */
7874
7875                 if (!new_stream) {
7876                         DRM_DEBUG_DRIVER("%s: Failed to create new stream for crtc %d\n",
7877                                         __func__, acrtc->base.base.id);
7878                         ret = -ENOMEM;
7879                         goto fail;
7880                 }
7881
7882                 dm_new_crtc_state->abm_level = dm_new_conn_state->abm_level;
7883
7884                 ret = fill_hdr_info_packet(drm_new_conn_state,
7885                                            &new_stream->hdr_static_metadata);
7886                 if (ret)
7887                         goto fail;
7888
7889                 /*
7890                  * If we already removed the old stream from the context
7891                  * (and set the new stream to NULL) then we can't reuse
7892                  * the old stream even if the stream and scaling are unchanged.
7893                  * We'll hit the BUG_ON and black screen.
7894                  *
7895                  * TODO: Refactor this function to allow this check to work
7896                  * in all conditions.
7897                  */
7898                 if (dm_new_crtc_state->stream &&
7899                     dc_is_stream_unchanged(new_stream, dm_old_crtc_state->stream) &&
7900                     dc_is_stream_scaling_unchanged(new_stream, dm_old_crtc_state->stream)) {
7901                         new_crtc_state->mode_changed = false;
7902                         DRM_DEBUG_DRIVER("Mode change not required, setting mode_changed to %d",
7903                                          new_crtc_state->mode_changed);
7904                 }
7905         }
7906
7907         /* mode_changed flag may get updated above, need to check again */
7908         if (!drm_atomic_crtc_needs_modeset(new_crtc_state))
7909                 goto skip_modeset;
7910
7911         DRM_DEBUG_DRIVER(
7912                 "amdgpu_crtc id:%d crtc_state_flags: enable:%d, active:%d, "
7913                 "planes_changed:%d, mode_changed:%d,active_changed:%d,"
7914                 "connectors_changed:%d\n",
7915                 acrtc->crtc_id,
7916                 new_crtc_state->enable,
7917                 new_crtc_state->active,
7918                 new_crtc_state->planes_changed,
7919                 new_crtc_state->mode_changed,
7920                 new_crtc_state->active_changed,
7921                 new_crtc_state->connectors_changed);
7922
7923         /* Remove stream for any changed/disabled CRTC */
7924         if (!enable) {
7925
7926                 if (!dm_old_crtc_state->stream)
7927                         goto skip_modeset;
7928
7929                 ret = dm_atomic_get_state(state, &dm_state);
7930                 if (ret)
7931                         goto fail;
7932
7933                 DRM_DEBUG_DRIVER("Disabling DRM crtc: %d\n",
7934                                 crtc->base.id);
7935
7936                 /* i.e. reset mode */
7937                 if (dc_remove_stream_from_ctx(
7938                                 dm->dc,
7939                                 dm_state->context,
7940                                 dm_old_crtc_state->stream) != DC_OK) {
7941                         ret = -EINVAL;
7942                         goto fail;
7943                 }
7944
7945                 dc_stream_release(dm_old_crtc_state->stream);
7946                 dm_new_crtc_state->stream = NULL;
7947
7948                 reset_freesync_config_for_crtc(dm_new_crtc_state);
7949
7950                 *lock_and_validation_needed = true;
7951
7952         } else {/* Add stream for any updated/enabled CRTC */
7953                 /*
7954                  * Quick fix to prevent NULL pointer on new_stream when
7955                  * added MST connectors not found in existing crtc_state in the chained mode
7956                  * TODO: need to dig out the root cause of that
7957                  */
7958                 if (!aconnector || (!aconnector->dc_sink && aconnector->mst_port))
7959                         goto skip_modeset;
7960
7961                 if (modereset_required(new_crtc_state))
7962                         goto skip_modeset;
7963
7964                 if (modeset_required(new_crtc_state, new_stream,
7965                                      dm_old_crtc_state->stream)) {
7966
7967                         WARN_ON(dm_new_crtc_state->stream);
7968
7969                         ret = dm_atomic_get_state(state, &dm_state);
7970                         if (ret)
7971                                 goto fail;
7972
7973                         dm_new_crtc_state->stream = new_stream;
7974
7975                         dc_stream_retain(new_stream);
7976
7977                         DRM_DEBUG_DRIVER("Enabling DRM crtc: %d\n",
7978                                                 crtc->base.id);
7979
7980                         if (dc_add_stream_to_ctx(
7981                                         dm->dc,
7982                                         dm_state->context,
7983                                         dm_new_crtc_state->stream) != DC_OK) {
7984                                 ret = -EINVAL;
7985                                 goto fail;
7986                         }
7987
7988                         *lock_and_validation_needed = true;
7989                 }
7990         }
7991
7992 skip_modeset:
7993         /* Release extra reference */
7994         if (new_stream)
7995                  dc_stream_release(new_stream);
7996
7997         /*
7998          * We want to do dc stream updates that do not require a
7999          * full modeset below.
8000          */
8001         if (!(enable && aconnector && new_crtc_state->enable &&
8002               new_crtc_state->active))
8003                 return 0;
8004         /*
8005          * Given above conditions, the dc state cannot be NULL because:
8006          * 1. We're in the process of enabling CRTCs (just been added
8007          *    to the dc context, or already is on the context)
8008          * 2. Has a valid connector attached, and
8009          * 3. Is currently active and enabled.
8010          * => The dc stream state currently exists.
8011          */
8012         BUG_ON(dm_new_crtc_state->stream == NULL);
8013
8014         /* Scaling or underscan settings */
8015         if (is_scaling_state_different(dm_old_conn_state, dm_new_conn_state))
8016                 update_stream_scaling_settings(
8017                         &new_crtc_state->mode, dm_new_conn_state, dm_new_crtc_state->stream);
8018
8019         /* ABM settings */
8020         dm_new_crtc_state->abm_level = dm_new_conn_state->abm_level;
8021
8022         /*
8023          * Color management settings. We also update color properties
8024          * when a modeset is needed, to ensure it gets reprogrammed.
8025          */
8026         if (dm_new_crtc_state->base.color_mgmt_changed ||
8027             drm_atomic_crtc_needs_modeset(new_crtc_state)) {
8028                 ret = amdgpu_dm_update_crtc_color_mgmt(dm_new_crtc_state);
8029                 if (ret)
8030                         goto fail;
8031         }
8032
8033         /* Update Freesync settings. */
8034         get_freesync_config_for_crtc(dm_new_crtc_state,
8035                                      dm_new_conn_state);
8036
8037         return ret;
8038
8039 fail:
8040         if (new_stream)
8041                 dc_stream_release(new_stream);
8042         return ret;
8043 }
8044
8045 static bool should_reset_plane(struct drm_atomic_state *state,
8046                                struct drm_plane *plane,
8047                                struct drm_plane_state *old_plane_state,
8048                                struct drm_plane_state *new_plane_state)
8049 {
8050         struct drm_plane *other;
8051         struct drm_plane_state *old_other_state, *new_other_state;
8052         struct drm_crtc_state *new_crtc_state;
8053         int i;
8054
8055         /*
8056          * TODO: Remove this hack once the checks below are sufficient
8057          * enough to determine when we need to reset all the planes on
8058          * the stream.
8059          */
8060         if (state->allow_modeset)
8061                 return true;
8062
8063         /* Exit early if we know that we're adding or removing the plane. */
8064         if (old_plane_state->crtc != new_plane_state->crtc)
8065                 return true;
8066
8067         /* old crtc == new_crtc == NULL, plane not in context. */
8068         if (!new_plane_state->crtc)
8069                 return false;
8070
8071         new_crtc_state =
8072                 drm_atomic_get_new_crtc_state(state, new_plane_state->crtc);
8073
8074         if (!new_crtc_state)
8075                 return true;
8076
8077         /* CRTC Degamma changes currently require us to recreate planes. */
8078         if (new_crtc_state->color_mgmt_changed)
8079                 return true;
8080
8081         if (drm_atomic_crtc_needs_modeset(new_crtc_state))
8082                 return true;
8083
8084         /*
8085          * If there are any new primary or overlay planes being added or
8086          * removed then the z-order can potentially change. To ensure
8087          * correct z-order and pipe acquisition the current DC architecture
8088          * requires us to remove and recreate all existing planes.
8089          *
8090          * TODO: Come up with a more elegant solution for this.
8091          */
8092         for_each_oldnew_plane_in_state(state, other, old_other_state, new_other_state, i) {
8093                 if (other->type == DRM_PLANE_TYPE_CURSOR)
8094                         continue;
8095
8096                 if (old_other_state->crtc != new_plane_state->crtc &&
8097                     new_other_state->crtc != new_plane_state->crtc)
8098                         continue;
8099
8100                 if (old_other_state->crtc != new_other_state->crtc)
8101                         return true;
8102
8103                 /* TODO: Remove this once we can handle fast format changes. */
8104                 if (old_other_state->fb && new_other_state->fb &&
8105                     old_other_state->fb->format != new_other_state->fb->format)
8106                         return true;
8107         }
8108
8109         return false;
8110 }
8111
8112 static int dm_update_plane_state(struct dc *dc,
8113                                  struct drm_atomic_state *state,
8114                                  struct drm_plane *plane,
8115                                  struct drm_plane_state *old_plane_state,
8116                                  struct drm_plane_state *new_plane_state,
8117                                  bool enable,
8118                                  bool *lock_and_validation_needed)
8119 {
8120
8121         struct dm_atomic_state *dm_state = NULL;
8122         struct drm_crtc *new_plane_crtc, *old_plane_crtc;
8123         struct drm_crtc_state *old_crtc_state, *new_crtc_state;
8124         struct dm_crtc_state *dm_new_crtc_state, *dm_old_crtc_state;
8125         struct dm_plane_state *dm_new_plane_state, *dm_old_plane_state;
8126         struct amdgpu_crtc *new_acrtc;
8127         bool needs_reset;
8128         int ret = 0;
8129
8130
8131         new_plane_crtc = new_plane_state->crtc;
8132         old_plane_crtc = old_plane_state->crtc;
8133         dm_new_plane_state = to_dm_plane_state(new_plane_state);
8134         dm_old_plane_state = to_dm_plane_state(old_plane_state);
8135
8136         /*TODO Implement better atomic check for cursor plane */
8137         if (plane->type == DRM_PLANE_TYPE_CURSOR) {
8138                 if (!enable || !new_plane_crtc ||
8139                         drm_atomic_plane_disabling(plane->state, new_plane_state))
8140                         return 0;
8141
8142                 new_acrtc = to_amdgpu_crtc(new_plane_crtc);
8143
8144                 if ((new_plane_state->crtc_w > new_acrtc->max_cursor_width) ||
8145                         (new_plane_state->crtc_h > new_acrtc->max_cursor_height)) {
8146                         DRM_DEBUG_ATOMIC("Bad cursor size %d x %d\n",
8147                                                          new_plane_state->crtc_w, new_plane_state->crtc_h);
8148                         return -EINVAL;
8149                 }
8150
8151                 return 0;
8152         }
8153
8154         needs_reset = should_reset_plane(state, plane, old_plane_state,
8155                                          new_plane_state);
8156
8157         /* Remove any changed/removed planes */
8158         if (!enable) {
8159                 if (!needs_reset)
8160                         return 0;
8161
8162                 if (!old_plane_crtc)
8163                         return 0;
8164
8165                 old_crtc_state = drm_atomic_get_old_crtc_state(
8166                                 state, old_plane_crtc);
8167                 dm_old_crtc_state = to_dm_crtc_state(old_crtc_state);
8168
8169                 if (!dm_old_crtc_state->stream)
8170                         return 0;
8171
8172                 DRM_DEBUG_ATOMIC("Disabling DRM plane: %d on DRM crtc %d\n",
8173                                 plane->base.id, old_plane_crtc->base.id);
8174
8175                 ret = dm_atomic_get_state(state, &dm_state);
8176                 if (ret)
8177                         return ret;
8178
8179                 if (!dc_remove_plane_from_context(
8180                                 dc,
8181                                 dm_old_crtc_state->stream,
8182                                 dm_old_plane_state->dc_state,
8183                                 dm_state->context)) {
8184
8185                         ret = EINVAL;
8186                         return ret;
8187                 }
8188
8189
8190                 dc_plane_state_release(dm_old_plane_state->dc_state);
8191                 dm_new_plane_state->dc_state = NULL;
8192
8193                 *lock_and_validation_needed = true;
8194
8195         } else { /* Add new planes */
8196                 struct dc_plane_state *dc_new_plane_state;
8197
8198                 if (drm_atomic_plane_disabling(plane->state, new_plane_state))
8199                         return 0;
8200
8201                 if (!new_plane_crtc)
8202                         return 0;
8203
8204                 new_crtc_state = drm_atomic_get_new_crtc_state(state, new_plane_crtc);
8205                 dm_new_crtc_state = to_dm_crtc_state(new_crtc_state);
8206
8207                 if (!dm_new_crtc_state->stream)
8208                         return 0;
8209
8210                 if (!needs_reset)
8211                         return 0;
8212
8213                 WARN_ON(dm_new_plane_state->dc_state);
8214
8215                 dc_new_plane_state = dc_create_plane_state(dc);
8216                 if (!dc_new_plane_state)
8217                         return -ENOMEM;
8218
8219                 DRM_DEBUG_DRIVER("Enabling DRM plane: %d on DRM crtc %d\n",
8220                                 plane->base.id, new_plane_crtc->base.id);
8221
8222                 ret = fill_dc_plane_attributes(
8223                         new_plane_crtc->dev->dev_private,
8224                         dc_new_plane_state,
8225                         new_plane_state,
8226                         new_crtc_state);
8227                 if (ret) {
8228                         dc_plane_state_release(dc_new_plane_state);
8229                         return ret;
8230                 }
8231
8232                 ret = dm_atomic_get_state(state, &dm_state);
8233                 if (ret) {
8234                         dc_plane_state_release(dc_new_plane_state);
8235                         return ret;
8236                 }
8237
8238                 /*
8239                  * Any atomic check errors that occur after this will
8240                  * not need a release. The plane state will be attached
8241                  * to the stream, and therefore part of the atomic
8242                  * state. It'll be released when the atomic state is
8243                  * cleaned.
8244                  */
8245                 if (!dc_add_plane_to_context(
8246                                 dc,
8247                                 dm_new_crtc_state->stream,
8248                                 dc_new_plane_state,
8249                                 dm_state->context)) {
8250
8251                         dc_plane_state_release(dc_new_plane_state);
8252                         return -EINVAL;
8253                 }
8254
8255                 dm_new_plane_state->dc_state = dc_new_plane_state;
8256
8257                 /* Tell DC to do a full surface update every time there
8258                  * is a plane change. Inefficient, but works for now.
8259                  */
8260                 dm_new_plane_state->dc_state->update_flags.bits.full_update = 1;
8261
8262                 *lock_and_validation_needed = true;
8263         }
8264
8265
8266         return ret;
8267 }
8268
8269 static int
8270 dm_determine_update_type_for_commit(struct amdgpu_display_manager *dm,
8271                                     struct drm_atomic_state *state,
8272                                     enum surface_update_type *out_type)
8273 {
8274         struct dc *dc = dm->dc;
8275         struct dm_atomic_state *dm_state = NULL, *old_dm_state = NULL;
8276         int i, j, num_plane, ret = 0;
8277         struct drm_plane_state *old_plane_state, *new_plane_state;
8278         struct dm_plane_state *new_dm_plane_state, *old_dm_plane_state;
8279         struct drm_crtc *new_plane_crtc;
8280         struct drm_plane *plane;
8281
8282         struct drm_crtc *crtc;
8283         struct drm_crtc_state *new_crtc_state, *old_crtc_state;
8284         struct dm_crtc_state *new_dm_crtc_state, *old_dm_crtc_state;
8285         struct dc_stream_status *status = NULL;
8286         enum surface_update_type update_type = UPDATE_TYPE_FAST;
8287         struct surface_info_bundle {
8288                 struct dc_surface_update surface_updates[MAX_SURFACES];
8289                 struct dc_plane_info plane_infos[MAX_SURFACES];
8290                 struct dc_scaling_info scaling_infos[MAX_SURFACES];
8291                 struct dc_flip_addrs flip_addrs[MAX_SURFACES];
8292                 struct dc_stream_update stream_update;
8293         } *bundle;
8294
8295         bundle = kzalloc(sizeof(*bundle), GFP_KERNEL);
8296
8297         if (!bundle) {
8298                 DRM_ERROR("Failed to allocate update bundle\n");
8299                 /* Set type to FULL to avoid crashing in DC*/
8300                 update_type = UPDATE_TYPE_FULL;
8301                 goto cleanup;
8302         }
8303
8304         for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
8305
8306                 memset(bundle, 0, sizeof(struct surface_info_bundle));
8307
8308                 new_dm_crtc_state = to_dm_crtc_state(new_crtc_state);
8309                 old_dm_crtc_state = to_dm_crtc_state(old_crtc_state);
8310                 num_plane = 0;
8311
8312                 if (new_dm_crtc_state->stream != old_dm_crtc_state->stream) {
8313                         update_type = UPDATE_TYPE_FULL;
8314                         goto cleanup;
8315                 }
8316
8317                 if (!new_dm_crtc_state->stream)
8318                         continue;
8319
8320                 for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, j) {
8321                         const struct amdgpu_framebuffer *amdgpu_fb =
8322                                 to_amdgpu_framebuffer(new_plane_state->fb);
8323                         struct dc_plane_info *plane_info = &bundle->plane_infos[num_plane];
8324                         struct dc_flip_addrs *flip_addr = &bundle->flip_addrs[num_plane];
8325                         struct dc_scaling_info *scaling_info = &bundle->scaling_infos[num_plane];
8326                         uint64_t tiling_flags;
8327                         bool tmz_surface = false;
8328
8329                         new_plane_crtc = new_plane_state->crtc;
8330                         new_dm_plane_state = to_dm_plane_state(new_plane_state);
8331                         old_dm_plane_state = to_dm_plane_state(old_plane_state);
8332
8333                         if (plane->type == DRM_PLANE_TYPE_CURSOR)
8334                                 continue;
8335
8336                         if (new_dm_plane_state->dc_state != old_dm_plane_state->dc_state) {
8337                                 update_type = UPDATE_TYPE_FULL;
8338                                 goto cleanup;
8339                         }
8340
8341                         if (crtc != new_plane_crtc)
8342                                 continue;
8343
8344                         bundle->surface_updates[num_plane].surface =
8345                                         new_dm_plane_state->dc_state;
8346
8347                         if (new_crtc_state->mode_changed) {
8348                                 bundle->stream_update.dst = new_dm_crtc_state->stream->dst;
8349                                 bundle->stream_update.src = new_dm_crtc_state->stream->src;
8350                         }
8351
8352                         if (new_crtc_state->color_mgmt_changed) {
8353                                 bundle->surface_updates[num_plane].gamma =
8354                                                 new_dm_plane_state->dc_state->gamma_correction;
8355                                 bundle->surface_updates[num_plane].in_transfer_func =
8356                                                 new_dm_plane_state->dc_state->in_transfer_func;
8357                                 bundle->surface_updates[num_plane].gamut_remap_matrix =
8358                                                 &new_dm_plane_state->dc_state->gamut_remap_matrix;
8359                                 bundle->stream_update.gamut_remap =
8360                                                 &new_dm_crtc_state->stream->gamut_remap_matrix;
8361                                 bundle->stream_update.output_csc_transform =
8362                                                 &new_dm_crtc_state->stream->csc_color_matrix;
8363                                 bundle->stream_update.out_transfer_func =
8364                                                 new_dm_crtc_state->stream->out_transfer_func;
8365                         }
8366
8367                         ret = fill_dc_scaling_info(new_plane_state,
8368                                                    scaling_info);
8369                         if (ret)
8370                                 goto cleanup;
8371
8372                         bundle->surface_updates[num_plane].scaling_info = scaling_info;
8373
8374                         if (amdgpu_fb) {
8375                                 ret = get_fb_info(amdgpu_fb, &tiling_flags, &tmz_surface);
8376                                 if (ret)
8377                                         goto cleanup;
8378
8379                                 ret = fill_dc_plane_info_and_addr(
8380                                         dm->adev, new_plane_state, tiling_flags,
8381                                         plane_info,
8382                                         &flip_addr->address, tmz_surface,
8383                                         false);
8384                                 if (ret)
8385                                         goto cleanup;
8386
8387                                 bundle->surface_updates[num_plane].plane_info = plane_info;
8388                                 bundle->surface_updates[num_plane].flip_addr = flip_addr;
8389                         }
8390
8391                         num_plane++;
8392                 }
8393
8394                 if (num_plane == 0)
8395                         continue;
8396
8397                 ret = dm_atomic_get_state(state, &dm_state);
8398                 if (ret)
8399                         goto cleanup;
8400
8401                 old_dm_state = dm_atomic_get_old_state(state);
8402                 if (!old_dm_state) {
8403                         ret = -EINVAL;
8404                         goto cleanup;
8405                 }
8406
8407                 status = dc_stream_get_status_from_state(old_dm_state->context,
8408                                                          new_dm_crtc_state->stream);
8409                 bundle->stream_update.stream = new_dm_crtc_state->stream;
8410                 /*
8411                  * TODO: DC modifies the surface during this call so we need
8412                  * to lock here - find a way to do this without locking.
8413                  */
8414                 mutex_lock(&dm->dc_lock);
8415                 update_type = dc_check_update_surfaces_for_stream(
8416                                 dc,     bundle->surface_updates, num_plane,
8417                                 &bundle->stream_update, status);
8418                 mutex_unlock(&dm->dc_lock);
8419
8420                 if (update_type > UPDATE_TYPE_MED) {
8421                         update_type = UPDATE_TYPE_FULL;
8422                         goto cleanup;
8423                 }
8424         }
8425
8426 cleanup:
8427         kfree(bundle);
8428
8429         *out_type = update_type;
8430         return ret;
8431 }
8432
8433 static int add_affected_mst_dsc_crtcs(struct drm_atomic_state *state, struct drm_crtc *crtc)
8434 {
8435         struct drm_connector *connector;
8436         struct drm_connector_state *conn_state;
8437         struct amdgpu_dm_connector *aconnector = NULL;
8438         int i;
8439         for_each_new_connector_in_state(state, connector, conn_state, i) {
8440                 if (conn_state->crtc != crtc)
8441                         continue;
8442
8443                 aconnector = to_amdgpu_dm_connector(connector);
8444                 if (!aconnector->port || !aconnector->mst_port)
8445                         aconnector = NULL;
8446                 else
8447                         break;
8448         }
8449
8450         if (!aconnector)
8451                 return 0;
8452
8453         return drm_dp_mst_add_affected_dsc_crtcs(state, &aconnector->mst_port->mst_mgr);
8454 }
8455
8456 /**
8457  * amdgpu_dm_atomic_check() - Atomic check implementation for AMDgpu DM.
8458  * @dev: The DRM device
8459  * @state: The atomic state to commit
8460  *
8461  * Validate that the given atomic state is programmable by DC into hardware.
8462  * This involves constructing a &struct dc_state reflecting the new hardware
8463  * state we wish to commit, then querying DC to see if it is programmable. It's
8464  * important not to modify the existing DC state. Otherwise, atomic_check
8465  * may unexpectedly commit hardware changes.
8466  *
8467  * When validating the DC state, it's important that the right locks are
8468  * acquired. For full updates case which removes/adds/updates streams on one
8469  * CRTC while flipping on another CRTC, acquiring global lock will guarantee
8470  * that any such full update commit will wait for completion of any outstanding
8471  * flip using DRMs synchronization events. See
8472  * dm_determine_update_type_for_commit()
8473  *
8474  * Note that DM adds the affected connectors for all CRTCs in state, when that
8475  * might not seem necessary. This is because DC stream creation requires the
8476  * DC sink, which is tied to the DRM connector state. Cleaning this up should
8477  * be possible but non-trivial - a possible TODO item.
8478  *
8479  * Return: -Error code if validation failed.
8480  */
8481 static int amdgpu_dm_atomic_check(struct drm_device *dev,
8482                                   struct drm_atomic_state *state)
8483 {
8484         struct amdgpu_device *adev = dev->dev_private;
8485         struct dm_atomic_state *dm_state = NULL;
8486         struct dc *dc = adev->dm.dc;
8487         struct drm_connector *connector;
8488         struct drm_connector_state *old_con_state, *new_con_state;
8489         struct drm_crtc *crtc;
8490         struct drm_crtc_state *old_crtc_state, *new_crtc_state;
8491         struct drm_plane *plane;
8492         struct drm_plane_state *old_plane_state, *new_plane_state;
8493         enum surface_update_type update_type = UPDATE_TYPE_FAST;
8494         enum surface_update_type overall_update_type = UPDATE_TYPE_FAST;
8495
8496         int ret, i;
8497
8498         /*
8499          * This bool will be set for true for any modeset/reset
8500          * or plane update which implies non fast surface update.
8501          */
8502         bool lock_and_validation_needed = false;
8503
8504         ret = drm_atomic_helper_check_modeset(dev, state);
8505         if (ret)
8506                 goto fail;
8507
8508         if (adev->asic_type >= CHIP_NAVI10) {
8509                 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
8510                         if (drm_atomic_crtc_needs_modeset(new_crtc_state)) {
8511                                 ret = add_affected_mst_dsc_crtcs(state, crtc);
8512                                 if (ret)
8513                                         goto fail;
8514                         }
8515                 }
8516         }
8517
8518         for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
8519                 if (!drm_atomic_crtc_needs_modeset(new_crtc_state) &&
8520                     !new_crtc_state->color_mgmt_changed &&
8521                     old_crtc_state->vrr_enabled == new_crtc_state->vrr_enabled)
8522                         continue;
8523
8524                 if (!new_crtc_state->enable)
8525                         continue;
8526
8527                 ret = drm_atomic_add_affected_connectors(state, crtc);
8528                 if (ret)
8529                         return ret;
8530
8531                 ret = drm_atomic_add_affected_planes(state, crtc);
8532                 if (ret)
8533                         goto fail;
8534         }
8535
8536         /*
8537          * Add all primary and overlay planes on the CRTC to the state
8538          * whenever a plane is enabled to maintain correct z-ordering
8539          * and to enable fast surface updates.
8540          */
8541         drm_for_each_crtc(crtc, dev) {
8542                 bool modified = false;
8543
8544                 for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) {
8545                         if (plane->type == DRM_PLANE_TYPE_CURSOR)
8546                                 continue;
8547
8548                         if (new_plane_state->crtc == crtc ||
8549                             old_plane_state->crtc == crtc) {
8550                                 modified = true;
8551                                 break;
8552                         }
8553                 }
8554
8555                 if (!modified)
8556                         continue;
8557
8558                 drm_for_each_plane_mask(plane, state->dev, crtc->state->plane_mask) {
8559                         if (plane->type == DRM_PLANE_TYPE_CURSOR)
8560                                 continue;
8561
8562                         new_plane_state =
8563                                 drm_atomic_get_plane_state(state, plane);
8564
8565                         if (IS_ERR(new_plane_state)) {
8566                                 ret = PTR_ERR(new_plane_state);
8567                                 goto fail;
8568                         }
8569                 }
8570         }
8571
8572         /* Remove exiting planes if they are modified */
8573         for_each_oldnew_plane_in_state_reverse(state, plane, old_plane_state, new_plane_state, i) {
8574                 ret = dm_update_plane_state(dc, state, plane,
8575                                             old_plane_state,
8576                                             new_plane_state,
8577                                             false,
8578                                             &lock_and_validation_needed);
8579                 if (ret)
8580                         goto fail;
8581         }
8582
8583         /* Disable all crtcs which require disable */
8584         for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
8585                 ret = dm_update_crtc_state(&adev->dm, state, crtc,
8586                                            old_crtc_state,
8587                                            new_crtc_state,
8588                                            false,
8589                                            &lock_and_validation_needed);
8590                 if (ret)
8591                         goto fail;
8592         }
8593
8594         /* Enable all crtcs which require enable */
8595         for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
8596                 ret = dm_update_crtc_state(&adev->dm, state, crtc,
8597                                            old_crtc_state,
8598                                            new_crtc_state,
8599                                            true,
8600                                            &lock_and_validation_needed);
8601                 if (ret)
8602                         goto fail;
8603         }
8604
8605         /* Add new/modified planes */
8606         for_each_oldnew_plane_in_state_reverse(state, plane, old_plane_state, new_plane_state, i) {
8607                 ret = dm_update_plane_state(dc, state, plane,
8608                                             old_plane_state,
8609                                             new_plane_state,
8610                                             true,
8611                                             &lock_and_validation_needed);
8612                 if (ret)
8613                         goto fail;
8614         }
8615
8616         /* Run this here since we want to validate the streams we created */
8617         ret = drm_atomic_helper_check_planes(dev, state);
8618         if (ret)
8619                 goto fail;
8620
8621         if (state->legacy_cursor_update) {
8622                 /*
8623                  * This is a fast cursor update coming from the plane update
8624                  * helper, check if it can be done asynchronously for better
8625                  * performance.
8626                  */
8627                 state->async_update =
8628                         !drm_atomic_helper_async_check(dev, state);
8629
8630                 /*
8631                  * Skip the remaining global validation if this is an async
8632                  * update. Cursor updates can be done without affecting
8633                  * state or bandwidth calcs and this avoids the performance
8634                  * penalty of locking the private state object and
8635                  * allocating a new dc_state.
8636                  */
8637                 if (state->async_update)
8638                         return 0;
8639         }
8640
8641         /* Check scaling and underscan changes*/
8642         /* TODO Removed scaling changes validation due to inability to commit
8643          * new stream into context w\o causing full reset. Need to
8644          * decide how to handle.
8645          */
8646         for_each_oldnew_connector_in_state(state, connector, old_con_state, new_con_state, i) {
8647                 struct dm_connector_state *dm_old_con_state = to_dm_connector_state(old_con_state);
8648                 struct dm_connector_state *dm_new_con_state = to_dm_connector_state(new_con_state);
8649                 struct amdgpu_crtc *acrtc = to_amdgpu_crtc(dm_new_con_state->base.crtc);
8650
8651                 /* Skip any modesets/resets */
8652                 if (!acrtc || drm_atomic_crtc_needs_modeset(
8653                                 drm_atomic_get_new_crtc_state(state, &acrtc->base)))
8654                         continue;
8655
8656                 /* Skip any thing not scale or underscan changes */
8657                 if (!is_scaling_state_different(dm_new_con_state, dm_old_con_state))
8658                         continue;
8659
8660                 overall_update_type = UPDATE_TYPE_FULL;
8661                 lock_and_validation_needed = true;
8662         }
8663
8664         ret = dm_determine_update_type_for_commit(&adev->dm, state, &update_type);
8665         if (ret)
8666                 goto fail;
8667
8668         if (overall_update_type < update_type)
8669                 overall_update_type = update_type;
8670
8671         /*
8672          * lock_and_validation_needed was an old way to determine if we need to set
8673          * the global lock. Leaving it in to check if we broke any corner cases
8674          * lock_and_validation_needed true = UPDATE_TYPE_FULL or UPDATE_TYPE_MED
8675          * lock_and_validation_needed false = UPDATE_TYPE_FAST
8676          */
8677         if (lock_and_validation_needed && overall_update_type <= UPDATE_TYPE_FAST)
8678                 WARN(1, "Global lock should be Set, overall_update_type should be UPDATE_TYPE_MED or UPDATE_TYPE_FULL");
8679
8680         if (overall_update_type > UPDATE_TYPE_FAST) {
8681                 ret = dm_atomic_get_state(state, &dm_state);
8682                 if (ret)
8683                         goto fail;
8684
8685                 ret = do_aquire_global_lock(dev, state);
8686                 if (ret)
8687                         goto fail;
8688
8689 #if defined(CONFIG_DRM_AMD_DC_DCN)
8690                 if (!compute_mst_dsc_configs_for_state(state, dm_state->context))
8691                         goto fail;
8692
8693                 ret = dm_update_mst_vcpi_slots_for_dsc(state, dm_state->context);
8694                 if (ret)
8695                         goto fail;
8696 #endif
8697
8698                 /*
8699                  * Perform validation of MST topology in the state:
8700                  * We need to perform MST atomic check before calling
8701                  * dc_validate_global_state(), or there is a chance
8702                  * to get stuck in an infinite loop and hang eventually.
8703                  */
8704                 ret = drm_dp_mst_atomic_check(state);
8705                 if (ret)
8706                         goto fail;
8707
8708                 if (dc_validate_global_state(dc, dm_state->context, false) != DC_OK) {
8709                         ret = -EINVAL;
8710                         goto fail;
8711                 }
8712         } else {
8713                 /*
8714                  * The commit is a fast update. Fast updates shouldn't change
8715                  * the DC context, affect global validation, and can have their
8716                  * commit work done in parallel with other commits not touching
8717                  * the same resource. If we have a new DC context as part of
8718                  * the DM atomic state from validation we need to free it and
8719                  * retain the existing one instead.
8720                  */
8721                 struct dm_atomic_state *new_dm_state, *old_dm_state;
8722
8723                 new_dm_state = dm_atomic_get_new_state(state);
8724                 old_dm_state = dm_atomic_get_old_state(state);
8725
8726                 if (new_dm_state && old_dm_state) {
8727                         if (new_dm_state->context)
8728                                 dc_release_state(new_dm_state->context);
8729
8730                         new_dm_state->context = old_dm_state->context;
8731
8732                         if (old_dm_state->context)
8733                                 dc_retain_state(old_dm_state->context);
8734                 }
8735         }
8736
8737         /* Store the overall update type for use later in atomic check. */
8738         for_each_new_crtc_in_state (state, crtc, new_crtc_state, i) {
8739                 struct dm_crtc_state *dm_new_crtc_state =
8740                         to_dm_crtc_state(new_crtc_state);
8741
8742                 dm_new_crtc_state->update_type = (int)overall_update_type;
8743         }
8744
8745         /* Must be success */
8746         WARN_ON(ret);
8747         return ret;
8748
8749 fail:
8750         if (ret == -EDEADLK)
8751                 DRM_DEBUG_DRIVER("Atomic check stopped to avoid deadlock.\n");
8752         else if (ret == -EINTR || ret == -EAGAIN || ret == -ERESTARTSYS)
8753                 DRM_DEBUG_DRIVER("Atomic check stopped due to signal.\n");
8754         else
8755                 DRM_DEBUG_DRIVER("Atomic check failed with err: %d \n", ret);
8756
8757         return ret;
8758 }
8759
8760 static bool is_dp_capable_without_timing_msa(struct dc *dc,
8761                                              struct amdgpu_dm_connector *amdgpu_dm_connector)
8762 {
8763         uint8_t dpcd_data;
8764         bool capable = false;
8765
8766         if (amdgpu_dm_connector->dc_link &&
8767                 dm_helpers_dp_read_dpcd(
8768                                 NULL,
8769                                 amdgpu_dm_connector->dc_link,
8770                                 DP_DOWN_STREAM_PORT_COUNT,
8771                                 &dpcd_data,
8772                                 sizeof(dpcd_data))) {
8773                 capable = (dpcd_data & DP_MSA_TIMING_PAR_IGNORED) ? true:false;
8774         }
8775
8776         return capable;
8777 }
8778 void amdgpu_dm_update_freesync_caps(struct drm_connector *connector,
8779                                         struct edid *edid)
8780 {
8781         int i;
8782         bool edid_check_required;
8783         struct detailed_timing *timing;
8784         struct detailed_non_pixel *data;
8785         struct detailed_data_monitor_range *range;
8786         struct amdgpu_dm_connector *amdgpu_dm_connector =
8787                         to_amdgpu_dm_connector(connector);
8788         struct dm_connector_state *dm_con_state = NULL;
8789
8790         struct drm_device *dev = connector->dev;
8791         struct amdgpu_device *adev = dev->dev_private;
8792         bool freesync_capable = false;
8793
8794         if (!connector->state) {
8795                 DRM_ERROR("%s - Connector has no state", __func__);
8796                 goto update;
8797         }
8798
8799         if (!edid) {
8800                 dm_con_state = to_dm_connector_state(connector->state);
8801
8802                 amdgpu_dm_connector->min_vfreq = 0;
8803                 amdgpu_dm_connector->max_vfreq = 0;
8804                 amdgpu_dm_connector->pixel_clock_mhz = 0;
8805
8806                 goto update;
8807         }
8808
8809         dm_con_state = to_dm_connector_state(connector->state);
8810
8811         edid_check_required = false;
8812         if (!amdgpu_dm_connector->dc_sink) {
8813                 DRM_ERROR("dc_sink NULL, could not add free_sync module.\n");
8814                 goto update;
8815         }
8816         if (!adev->dm.freesync_module)
8817                 goto update;
8818         /*
8819          * if edid non zero restrict freesync only for dp and edp
8820          */
8821         if (edid) {
8822                 if (amdgpu_dm_connector->dc_sink->sink_signal == SIGNAL_TYPE_DISPLAY_PORT
8823                         || amdgpu_dm_connector->dc_sink->sink_signal == SIGNAL_TYPE_EDP) {
8824                         edid_check_required = is_dp_capable_without_timing_msa(
8825                                                 adev->dm.dc,
8826                                                 amdgpu_dm_connector);
8827                 }
8828         }
8829         if (edid_check_required == true && (edid->version > 1 ||
8830            (edid->version == 1 && edid->revision > 1))) {
8831                 for (i = 0; i < 4; i++) {
8832
8833                         timing  = &edid->detailed_timings[i];
8834                         data    = &timing->data.other_data;
8835                         range   = &data->data.range;
8836                         /*
8837                          * Check if monitor has continuous frequency mode
8838                          */
8839                         if (data->type != EDID_DETAIL_MONITOR_RANGE)
8840                                 continue;
8841                         /*
8842                          * Check for flag range limits only. If flag == 1 then
8843                          * no additional timing information provided.
8844                          * Default GTF, GTF Secondary curve and CVT are not
8845                          * supported
8846                          */
8847                         if (range->flags != 1)
8848                                 continue;
8849
8850                         amdgpu_dm_connector->min_vfreq = range->min_vfreq;
8851                         amdgpu_dm_connector->max_vfreq = range->max_vfreq;
8852                         amdgpu_dm_connector->pixel_clock_mhz =
8853                                 range->pixel_clock_mhz * 10;
8854                         break;
8855                 }
8856
8857                 if (amdgpu_dm_connector->max_vfreq -
8858                     amdgpu_dm_connector->min_vfreq > 10) {
8859
8860                         freesync_capable = true;
8861                 }
8862         }
8863
8864 update:
8865         if (dm_con_state)
8866                 dm_con_state->freesync_capable = freesync_capable;
8867
8868         if (connector->vrr_capable_property)
8869                 drm_connector_set_vrr_capable_property(connector,
8870                                                        freesync_capable);
8871 }
8872
8873 static void amdgpu_dm_set_psr_caps(struct dc_link *link)
8874 {
8875         uint8_t dpcd_data[EDP_PSR_RECEIVER_CAP_SIZE];
8876
8877         if (!(link->connector_signal & SIGNAL_TYPE_EDP))
8878                 return;
8879         if (link->type == dc_connection_none)
8880                 return;
8881         if (dm_helpers_dp_read_dpcd(NULL, link, DP_PSR_SUPPORT,
8882                                         dpcd_data, sizeof(dpcd_data))) {
8883                 link->dpcd_caps.psr_caps.psr_version = dpcd_data[0];
8884
8885                 if (dpcd_data[0] == 0) {
8886                         link->psr_settings.psr_version = DC_PSR_VERSION_UNSUPPORTED;
8887                         link->psr_settings.psr_feature_enabled = false;
8888                 } else {
8889                         link->psr_settings.psr_version = DC_PSR_VERSION_1;
8890                         link->psr_settings.psr_feature_enabled = true;
8891                 }
8892
8893                 DRM_INFO("PSR support:%d\n", link->psr_settings.psr_feature_enabled);
8894         }
8895 }
8896
8897 /*
8898  * amdgpu_dm_link_setup_psr() - configure psr link
8899  * @stream: stream state
8900  *
8901  * Return: true if success
8902  */
8903 static bool amdgpu_dm_link_setup_psr(struct dc_stream_state *stream)
8904 {
8905         struct dc_link *link = NULL;
8906         struct psr_config psr_config = {0};
8907         struct psr_context psr_context = {0};
8908         bool ret = false;
8909
8910         if (stream == NULL)
8911                 return false;
8912
8913         link = stream->link;
8914
8915         psr_config.psr_version = link->dpcd_caps.psr_caps.psr_version;
8916
8917         if (psr_config.psr_version > 0) {
8918                 psr_config.psr_exit_link_training_required = 0x1;
8919                 psr_config.psr_frame_capture_indication_req = 0;
8920                 psr_config.psr_rfb_setup_time = 0x37;
8921                 psr_config.psr_sdp_transmit_line_num_deadline = 0x20;
8922                 psr_config.allow_smu_optimizations = 0x0;
8923
8924                 ret = dc_link_setup_psr(link, stream, &psr_config, &psr_context);
8925
8926         }
8927         DRM_DEBUG_DRIVER("PSR link: %d\n",      link->psr_settings.psr_feature_enabled);
8928
8929         return ret;
8930 }
8931
8932 /*
8933  * amdgpu_dm_psr_enable() - enable psr f/w
8934  * @stream: stream state
8935  *
8936  * Return: true if success
8937  */
8938 bool amdgpu_dm_psr_enable(struct dc_stream_state *stream)
8939 {
8940         struct dc_link *link = stream->link;
8941         unsigned int vsync_rate_hz = 0;
8942         struct dc_static_screen_params params = {0};
8943         /* Calculate number of static frames before generating interrupt to
8944          * enter PSR.
8945          */
8946         // Init fail safe of 2 frames static
8947         unsigned int num_frames_static = 2;
8948
8949         DRM_DEBUG_DRIVER("Enabling psr...\n");
8950
8951         vsync_rate_hz = div64_u64(div64_u64((
8952                         stream->timing.pix_clk_100hz * 100),
8953                         stream->timing.v_total),
8954                         stream->timing.h_total);
8955
8956         /* Round up
8957          * Calculate number of frames such that at least 30 ms of time has
8958          * passed.
8959          */
8960         if (vsync_rate_hz != 0) {
8961                 unsigned int frame_time_microsec = 1000000 / vsync_rate_hz;
8962                 num_frames_static = (30000 / frame_time_microsec) + 1;
8963         }
8964
8965         params.triggers.cursor_update = true;
8966         params.triggers.overlay_update = true;
8967         params.triggers.surface_update = true;
8968         params.num_frames = num_frames_static;
8969
8970         dc_stream_set_static_screen_params(link->ctx->dc,
8971                                            &stream, 1,
8972                                            &params);
8973
8974         return dc_link_set_psr_allow_active(link, true, false);
8975 }
8976
8977 /*
8978  * amdgpu_dm_psr_disable() - disable psr f/w
8979  * @stream:  stream state
8980  *
8981  * Return: true if success
8982  */
8983 static bool amdgpu_dm_psr_disable(struct dc_stream_state *stream)
8984 {
8985
8986         DRM_DEBUG_DRIVER("Disabling psr...\n");
8987
8988         return dc_link_set_psr_allow_active(stream->link, false, true);
8989 }