]> Git Repo - linux.git/blob - drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
Merge tag 'riscv-for-linus-6.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel...
[linux.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_connectors.c
1 /*
2  * Copyright 2007-8 Advanced Micro Devices, Inc.
3  * Copyright 2008 Red Hat Inc.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in
13  * all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
19  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21  * OTHER DEALINGS IN THE SOFTWARE.
22  *
23  * Authors: Dave Airlie
24  *          Alex Deucher
25  */
26
27 #include <drm/display/drm_dp_helper.h>
28 #include <drm/drm_crtc_helper.h>
29 #include <drm/drm_edid.h>
30 #include <drm/drm_modeset_helper_vtables.h>
31 #include <drm/drm_probe_helper.h>
32 #include <drm/amdgpu_drm.h>
33 #include "amdgpu.h"
34 #include "atom.h"
35 #include "atombios_encoders.h"
36 #include "atombios_dp.h"
37 #include "amdgpu_connectors.h"
38 #include "amdgpu_i2c.h"
39 #include "amdgpu_display.h"
40
41 #include <linux/pm_runtime.h>
42
43 void amdgpu_connector_hotplug(struct drm_connector *connector)
44 {
45         struct drm_device *dev = connector->dev;
46         struct amdgpu_device *adev = drm_to_adev(dev);
47         struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
48
49         /* bail if the connector does not have hpd pin, e.g.,
50          * VGA, TV, etc.
51          */
52         if (amdgpu_connector->hpd.hpd == AMDGPU_HPD_NONE)
53                 return;
54
55         amdgpu_display_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd);
56
57         /* if the connector is already off, don't turn it back on */
58         if (connector->dpms != DRM_MODE_DPMS_ON)
59                 return;
60
61         /* just deal with DP (not eDP) here. */
62         if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) {
63                 struct amdgpu_connector_atom_dig *dig_connector =
64                         amdgpu_connector->con_priv;
65
66                 /* if existing sink type was not DP no need to retrain */
67                 if (dig_connector->dp_sink_type != CONNECTOR_OBJECT_ID_DISPLAYPORT)
68                         return;
69
70                 /* first get sink type as it may be reset after (un)plug */
71                 dig_connector->dp_sink_type = amdgpu_atombios_dp_get_sinktype(amdgpu_connector);
72                 /* don't do anything if sink is not display port, i.e.,
73                  * passive dp->(dvi|hdmi) adaptor
74                  */
75                 if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT &&
76                     amdgpu_display_hpd_sense(adev, amdgpu_connector->hpd.hpd) &&
77                     amdgpu_atombios_dp_needs_link_train(amdgpu_connector)) {
78                         /* Don't start link training before we have the DPCD */
79                         if (amdgpu_atombios_dp_get_dpcd(amdgpu_connector))
80                                 return;
81
82                         /* Turn the connector off and back on immediately, which
83                          * will trigger link training
84                          */
85                         drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
86                         drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
87                 }
88         }
89 }
90
91 static void amdgpu_connector_property_change_mode(struct drm_encoder *encoder)
92 {
93         struct drm_crtc *crtc = encoder->crtc;
94
95         if (crtc && crtc->enabled) {
96                 drm_crtc_helper_set_mode(crtc, &crtc->mode,
97                                          crtc->x, crtc->y, crtc->primary->fb);
98         }
99 }
100
101 int amdgpu_connector_get_monitor_bpc(struct drm_connector *connector)
102 {
103         struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
104         struct amdgpu_connector_atom_dig *dig_connector;
105         int bpc = 8;
106         unsigned mode_clock, max_tmds_clock;
107
108         switch (connector->connector_type) {
109         case DRM_MODE_CONNECTOR_DVII:
110         case DRM_MODE_CONNECTOR_HDMIB:
111                 if (amdgpu_connector->use_digital) {
112                         if (connector->display_info.is_hdmi) {
113                                 if (connector->display_info.bpc)
114                                         bpc = connector->display_info.bpc;
115                         }
116                 }
117                 break;
118         case DRM_MODE_CONNECTOR_DVID:
119         case DRM_MODE_CONNECTOR_HDMIA:
120                 if (connector->display_info.is_hdmi) {
121                         if (connector->display_info.bpc)
122                                 bpc = connector->display_info.bpc;
123                 }
124                 break;
125         case DRM_MODE_CONNECTOR_DisplayPort:
126                 dig_connector = amdgpu_connector->con_priv;
127                 if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
128                     (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) ||
129                     connector->display_info.is_hdmi) {
130                         if (connector->display_info.bpc)
131                                 bpc = connector->display_info.bpc;
132                 }
133                 break;
134         case DRM_MODE_CONNECTOR_eDP:
135         case DRM_MODE_CONNECTOR_LVDS:
136                 if (connector->display_info.bpc)
137                         bpc = connector->display_info.bpc;
138                 else {
139                         const struct drm_connector_helper_funcs *connector_funcs =
140                                 connector->helper_private;
141                         struct drm_encoder *encoder = connector_funcs->best_encoder(connector);
142                         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
143                         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
144
145                         if (dig->lcd_misc & ATOM_PANEL_MISC_V13_6BIT_PER_COLOR)
146                                 bpc = 6;
147                         else if (dig->lcd_misc & ATOM_PANEL_MISC_V13_8BIT_PER_COLOR)
148                                 bpc = 8;
149                 }
150                 break;
151         }
152
153         if (connector->display_info.is_hdmi) {
154                 /*
155                  * Pre DCE-8 hw can't handle > 12 bpc, and more than 12 bpc doesn't make
156                  * much sense without support for > 12 bpc framebuffers. RGB 4:4:4 at
157                  * 12 bpc is always supported on hdmi deep color sinks, as this is
158                  * required by the HDMI-1.3 spec. Clamp to a safe 12 bpc maximum.
159                  */
160                 if (bpc > 12) {
161                         DRM_DEBUG("%s: HDMI deep color %d bpc unsupported. Using 12 bpc.\n",
162                                   connector->name, bpc);
163                         bpc = 12;
164                 }
165
166                 /* Any defined maximum tmds clock limit we must not exceed? */
167                 if (connector->display_info.max_tmds_clock > 0) {
168                         /* mode_clock is clock in kHz for mode to be modeset on this connector */
169                         mode_clock = amdgpu_connector->pixelclock_for_modeset;
170
171                         /* Maximum allowable input clock in kHz */
172                         max_tmds_clock = connector->display_info.max_tmds_clock;
173
174                         DRM_DEBUG("%s: hdmi mode dotclock %d kHz, max tmds input clock %d kHz.\n",
175                                   connector->name, mode_clock, max_tmds_clock);
176
177                         /* Check if bpc is within clock limit. Try to degrade gracefully otherwise */
178                         if ((bpc == 12) && (mode_clock * 3/2 > max_tmds_clock)) {
179                                 if ((connector->display_info.edid_hdmi_rgb444_dc_modes & DRM_EDID_HDMI_DC_30) &&
180                                     (mode_clock * 5/4 <= max_tmds_clock))
181                                         bpc = 10;
182                                 else
183                                         bpc = 8;
184
185                                 DRM_DEBUG("%s: HDMI deep color 12 bpc exceeds max tmds clock. Using %d bpc.\n",
186                                           connector->name, bpc);
187                         }
188
189                         if ((bpc == 10) && (mode_clock * 5/4 > max_tmds_clock)) {
190                                 bpc = 8;
191                                 DRM_DEBUG("%s: HDMI deep color 10 bpc exceeds max tmds clock. Using %d bpc.\n",
192                                           connector->name, bpc);
193                         }
194                 } else if (bpc > 8) {
195                         /* max_tmds_clock missing, but hdmi spec mandates it for deep color. */
196                         DRM_DEBUG("%s: Required max tmds clock for HDMI deep color missing. Using 8 bpc.\n",
197                                   connector->name);
198                         bpc = 8;
199                 }
200         }
201
202         if ((amdgpu_deep_color == 0) && (bpc > 8)) {
203                 DRM_DEBUG("%s: Deep color disabled. Set amdgpu module param deep_color=1 to enable.\n",
204                           connector->name);
205                 bpc = 8;
206         }
207
208         DRM_DEBUG("%s: Display bpc=%d, returned bpc=%d\n",
209                   connector->name, connector->display_info.bpc, bpc);
210
211         return bpc;
212 }
213
214 static void
215 amdgpu_connector_update_scratch_regs(struct drm_connector *connector,
216                                       enum drm_connector_status status)
217 {
218         struct drm_encoder *best_encoder;
219         struct drm_encoder *encoder;
220         const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
221         bool connected;
222
223         best_encoder = connector_funcs->best_encoder(connector);
224
225         drm_connector_for_each_possible_encoder(connector, encoder) {
226                 if ((encoder == best_encoder) && (status == connector_status_connected))
227                         connected = true;
228                 else
229                         connected = false;
230
231                 amdgpu_atombios_encoder_set_bios_scratch_regs(connector, encoder, connected);
232         }
233 }
234
235 static struct drm_encoder *
236 amdgpu_connector_find_encoder(struct drm_connector *connector,
237                                int encoder_type)
238 {
239         struct drm_encoder *encoder;
240
241         drm_connector_for_each_possible_encoder(connector, encoder) {
242                 if (encoder->encoder_type == encoder_type)
243                         return encoder;
244         }
245
246         return NULL;
247 }
248
249 struct edid *amdgpu_connector_edid(struct drm_connector *connector)
250 {
251         struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
252         struct drm_property_blob *edid_blob = connector->edid_blob_ptr;
253
254         if (amdgpu_connector->edid) {
255                 return amdgpu_connector->edid;
256         } else if (edid_blob) {
257                 struct edid *edid = kmemdup(edid_blob->data, edid_blob->length, GFP_KERNEL);
258                 if (edid)
259                         amdgpu_connector->edid = edid;
260         }
261         return amdgpu_connector->edid;
262 }
263
264 static struct edid *
265 amdgpu_connector_get_hardcoded_edid(struct amdgpu_device *adev)
266 {
267         if (adev->mode_info.bios_hardcoded_edid) {
268                 return kmemdup((unsigned char *)adev->mode_info.bios_hardcoded_edid,
269                                adev->mode_info.bios_hardcoded_edid_size, GFP_KERNEL);
270         }
271         return NULL;
272 }
273
274 static void amdgpu_connector_get_edid(struct drm_connector *connector)
275 {
276         struct drm_device *dev = connector->dev;
277         struct amdgpu_device *adev = drm_to_adev(dev);
278         struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
279
280         if (amdgpu_connector->edid)
281                 return;
282
283         /* on hw with routers, select right port */
284         if (amdgpu_connector->router.ddc_valid)
285                 amdgpu_i2c_router_select_ddc_port(amdgpu_connector);
286
287         if ((amdgpu_connector_encoder_get_dp_bridge_encoder_id(connector) !=
288              ENCODER_OBJECT_ID_NONE) &&
289             amdgpu_connector->ddc_bus->has_aux) {
290                 amdgpu_connector->edid = drm_get_edid(connector,
291                                                       &amdgpu_connector->ddc_bus->aux.ddc);
292         } else if ((connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) ||
293                    (connector->connector_type == DRM_MODE_CONNECTOR_eDP)) {
294                 struct amdgpu_connector_atom_dig *dig = amdgpu_connector->con_priv;
295
296                 if ((dig->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT ||
297                      dig->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) &&
298                     amdgpu_connector->ddc_bus->has_aux)
299                         amdgpu_connector->edid = drm_get_edid(connector,
300                                                               &amdgpu_connector->ddc_bus->aux.ddc);
301                 else if (amdgpu_connector->ddc_bus)
302                         amdgpu_connector->edid = drm_get_edid(connector,
303                                                               &amdgpu_connector->ddc_bus->adapter);
304         } else if (amdgpu_connector->ddc_bus) {
305                 amdgpu_connector->edid = drm_get_edid(connector,
306                                                       &amdgpu_connector->ddc_bus->adapter);
307         }
308
309         if (!amdgpu_connector->edid) {
310                 /* some laptops provide a hardcoded edid in rom for LCDs */
311                 if (((connector->connector_type == DRM_MODE_CONNECTOR_LVDS) ||
312                      (connector->connector_type == DRM_MODE_CONNECTOR_eDP))) {
313                         amdgpu_connector->edid = amdgpu_connector_get_hardcoded_edid(adev);
314                         drm_connector_update_edid_property(connector, amdgpu_connector->edid);
315                 }
316         }
317 }
318
319 static void amdgpu_connector_free_edid(struct drm_connector *connector)
320 {
321         struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
322
323         kfree(amdgpu_connector->edid);
324         amdgpu_connector->edid = NULL;
325 }
326
327 static int amdgpu_connector_ddc_get_modes(struct drm_connector *connector)
328 {
329         struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
330         int ret;
331
332         if (amdgpu_connector->edid) {
333                 drm_connector_update_edid_property(connector, amdgpu_connector->edid);
334                 ret = drm_add_edid_modes(connector, amdgpu_connector->edid);
335                 return ret;
336         }
337         drm_connector_update_edid_property(connector, NULL);
338         return 0;
339 }
340
341 static struct drm_encoder *
342 amdgpu_connector_best_single_encoder(struct drm_connector *connector)
343 {
344         struct drm_encoder *encoder;
345
346         /* pick the first one */
347         drm_connector_for_each_possible_encoder(connector, encoder)
348                 return encoder;
349
350         return NULL;
351 }
352
353 static void amdgpu_get_native_mode(struct drm_connector *connector)
354 {
355         struct drm_encoder *encoder = amdgpu_connector_best_single_encoder(connector);
356         struct amdgpu_encoder *amdgpu_encoder;
357
358         if (encoder == NULL)
359                 return;
360
361         amdgpu_encoder = to_amdgpu_encoder(encoder);
362
363         if (!list_empty(&connector->probed_modes)) {
364                 struct drm_display_mode *preferred_mode =
365                         list_first_entry(&connector->probed_modes,
366                                          struct drm_display_mode, head);
367
368                 amdgpu_encoder->native_mode = *preferred_mode;
369         } else {
370                 amdgpu_encoder->native_mode.clock = 0;
371         }
372 }
373
374 static struct drm_display_mode *
375 amdgpu_connector_lcd_native_mode(struct drm_encoder *encoder)
376 {
377         struct drm_device *dev = encoder->dev;
378         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
379         struct drm_display_mode *mode = NULL;
380         struct drm_display_mode *native_mode = &amdgpu_encoder->native_mode;
381
382         if (native_mode->hdisplay != 0 &&
383             native_mode->vdisplay != 0 &&
384             native_mode->clock != 0) {
385                 mode = drm_mode_duplicate(dev, native_mode);
386                 if (!mode)
387                         return NULL;
388
389                 mode->type = DRM_MODE_TYPE_PREFERRED | DRM_MODE_TYPE_DRIVER;
390                 drm_mode_set_name(mode);
391
392                 DRM_DEBUG_KMS("Adding native panel mode %s\n", mode->name);
393         } else if (native_mode->hdisplay != 0 &&
394                    native_mode->vdisplay != 0) {
395                 /* mac laptops without an edid */
396                 /* Note that this is not necessarily the exact panel mode,
397                  * but an approximation based on the cvt formula.  For these
398                  * systems we should ideally read the mode info out of the
399                  * registers or add a mode table, but this works and is much
400                  * simpler.
401                  */
402                 mode = drm_cvt_mode(dev, native_mode->hdisplay, native_mode->vdisplay, 60, true, false, false);
403                 if (!mode)
404                         return NULL;
405
406                 mode->type = DRM_MODE_TYPE_PREFERRED | DRM_MODE_TYPE_DRIVER;
407                 DRM_DEBUG_KMS("Adding cvt approximation of native panel mode %s\n", mode->name);
408         }
409         return mode;
410 }
411
412 static void amdgpu_connector_add_common_modes(struct drm_encoder *encoder,
413                                                struct drm_connector *connector)
414 {
415         struct drm_device *dev = encoder->dev;
416         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
417         struct drm_display_mode *mode = NULL;
418         struct drm_display_mode *native_mode = &amdgpu_encoder->native_mode;
419         int i;
420         static const struct mode_size {
421                 int w;
422                 int h;
423         } common_modes[17] = {
424                 { 640,  480},
425                 { 720,  480},
426                 { 800,  600},
427                 { 848,  480},
428                 {1024,  768},
429                 {1152,  768},
430                 {1280,  720},
431                 {1280,  800},
432                 {1280,  854},
433                 {1280,  960},
434                 {1280, 1024},
435                 {1440,  900},
436                 {1400, 1050},
437                 {1680, 1050},
438                 {1600, 1200},
439                 {1920, 1080},
440                 {1920, 1200}
441         };
442
443         for (i = 0; i < 17; i++) {
444                 if (amdgpu_encoder->devices & (ATOM_DEVICE_TV_SUPPORT)) {
445                         if (common_modes[i].w > 1024 ||
446                             common_modes[i].h > 768)
447                                 continue;
448                 }
449                 if (amdgpu_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
450                         if (common_modes[i].w > native_mode->hdisplay ||
451                             common_modes[i].h > native_mode->vdisplay ||
452                             (common_modes[i].w == native_mode->hdisplay &&
453                              common_modes[i].h == native_mode->vdisplay))
454                                 continue;
455                 }
456                 if (common_modes[i].w < 320 || common_modes[i].h < 200)
457                         continue;
458
459                 mode = drm_cvt_mode(dev, common_modes[i].w, common_modes[i].h, 60, false, false, false);
460                 drm_mode_probed_add(connector, mode);
461         }
462 }
463
464 static int amdgpu_connector_set_property(struct drm_connector *connector,
465                                           struct drm_property *property,
466                                           uint64_t val)
467 {
468         struct drm_device *dev = connector->dev;
469         struct amdgpu_device *adev = drm_to_adev(dev);
470         struct drm_encoder *encoder;
471         struct amdgpu_encoder *amdgpu_encoder;
472
473         if (property == adev->mode_info.coherent_mode_property) {
474                 struct amdgpu_encoder_atom_dig *dig;
475                 bool new_coherent_mode;
476
477                 /* need to find digital encoder on connector */
478                 encoder = amdgpu_connector_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
479                 if (!encoder)
480                         return 0;
481
482                 amdgpu_encoder = to_amdgpu_encoder(encoder);
483
484                 if (!amdgpu_encoder->enc_priv)
485                         return 0;
486
487                 dig = amdgpu_encoder->enc_priv;
488                 new_coherent_mode = val ? true : false;
489                 if (dig->coherent_mode != new_coherent_mode) {
490                         dig->coherent_mode = new_coherent_mode;
491                         amdgpu_connector_property_change_mode(&amdgpu_encoder->base);
492                 }
493         }
494
495         if (property == adev->mode_info.audio_property) {
496                 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
497                 /* need to find digital encoder on connector */
498                 encoder = amdgpu_connector_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
499                 if (!encoder)
500                         return 0;
501
502                 amdgpu_encoder = to_amdgpu_encoder(encoder);
503
504                 if (amdgpu_connector->audio != val) {
505                         amdgpu_connector->audio = val;
506                         amdgpu_connector_property_change_mode(&amdgpu_encoder->base);
507                 }
508         }
509
510         if (property == adev->mode_info.dither_property) {
511                 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
512                 /* need to find digital encoder on connector */
513                 encoder = amdgpu_connector_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
514                 if (!encoder)
515                         return 0;
516
517                 amdgpu_encoder = to_amdgpu_encoder(encoder);
518
519                 if (amdgpu_connector->dither != val) {
520                         amdgpu_connector->dither = val;
521                         amdgpu_connector_property_change_mode(&amdgpu_encoder->base);
522                 }
523         }
524
525         if (property == adev->mode_info.underscan_property) {
526                 /* need to find digital encoder on connector */
527                 encoder = amdgpu_connector_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
528                 if (!encoder)
529                         return 0;
530
531                 amdgpu_encoder = to_amdgpu_encoder(encoder);
532
533                 if (amdgpu_encoder->underscan_type != val) {
534                         amdgpu_encoder->underscan_type = val;
535                         amdgpu_connector_property_change_mode(&amdgpu_encoder->base);
536                 }
537         }
538
539         if (property == adev->mode_info.underscan_hborder_property) {
540                 /* need to find digital encoder on connector */
541                 encoder = amdgpu_connector_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
542                 if (!encoder)
543                         return 0;
544
545                 amdgpu_encoder = to_amdgpu_encoder(encoder);
546
547                 if (amdgpu_encoder->underscan_hborder != val) {
548                         amdgpu_encoder->underscan_hborder = val;
549                         amdgpu_connector_property_change_mode(&amdgpu_encoder->base);
550                 }
551         }
552
553         if (property == adev->mode_info.underscan_vborder_property) {
554                 /* need to find digital encoder on connector */
555                 encoder = amdgpu_connector_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
556                 if (!encoder)
557                         return 0;
558
559                 amdgpu_encoder = to_amdgpu_encoder(encoder);
560
561                 if (amdgpu_encoder->underscan_vborder != val) {
562                         amdgpu_encoder->underscan_vborder = val;
563                         amdgpu_connector_property_change_mode(&amdgpu_encoder->base);
564                 }
565         }
566
567         if (property == adev->mode_info.load_detect_property) {
568                 struct amdgpu_connector *amdgpu_connector =
569                         to_amdgpu_connector(connector);
570
571                 if (val == 0)
572                         amdgpu_connector->dac_load_detect = false;
573                 else
574                         amdgpu_connector->dac_load_detect = true;
575         }
576
577         if (property == dev->mode_config.scaling_mode_property) {
578                 enum amdgpu_rmx_type rmx_type;
579
580                 if (connector->encoder) {
581                         amdgpu_encoder = to_amdgpu_encoder(connector->encoder);
582                 } else {
583                         const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
584                         amdgpu_encoder = to_amdgpu_encoder(connector_funcs->best_encoder(connector));
585                 }
586
587                 switch (val) {
588                 default:
589                 case DRM_MODE_SCALE_NONE:
590                         rmx_type = RMX_OFF;
591                         break;
592                 case DRM_MODE_SCALE_CENTER:
593                         rmx_type = RMX_CENTER;
594                         break;
595                 case DRM_MODE_SCALE_ASPECT:
596                         rmx_type = RMX_ASPECT;
597                         break;
598                 case DRM_MODE_SCALE_FULLSCREEN:
599                         rmx_type = RMX_FULL;
600                         break;
601                 }
602
603                 if (amdgpu_encoder->rmx_type == rmx_type)
604                         return 0;
605
606                 if ((rmx_type != DRM_MODE_SCALE_NONE) &&
607                     (amdgpu_encoder->native_mode.clock == 0))
608                         return 0;
609
610                 amdgpu_encoder->rmx_type = rmx_type;
611
612                 amdgpu_connector_property_change_mode(&amdgpu_encoder->base);
613         }
614
615         return 0;
616 }
617
618 static void
619 amdgpu_connector_fixup_lcd_native_mode(struct drm_encoder *encoder,
620                                         struct drm_connector *connector)
621 {
622         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
623         struct drm_display_mode *native_mode = &amdgpu_encoder->native_mode;
624         struct drm_display_mode *t, *mode;
625
626         /* If the EDID preferred mode doesn't match the native mode, use it */
627         list_for_each_entry_safe(mode, t, &connector->probed_modes, head) {
628                 if (mode->type & DRM_MODE_TYPE_PREFERRED) {
629                         if (mode->hdisplay != native_mode->hdisplay ||
630                             mode->vdisplay != native_mode->vdisplay)
631                                 drm_mode_copy(native_mode, mode);
632                 }
633         }
634
635         /* Try to get native mode details from EDID if necessary */
636         if (!native_mode->clock) {
637                 list_for_each_entry_safe(mode, t, &connector->probed_modes, head) {
638                         if (mode->hdisplay == native_mode->hdisplay &&
639                             mode->vdisplay == native_mode->vdisplay) {
640                                 drm_mode_copy(native_mode, mode);
641                                 drm_mode_set_crtcinfo(native_mode, CRTC_INTERLACE_HALVE_V);
642                                 DRM_DEBUG_KMS("Determined LVDS native mode details from EDID\n");
643                                 break;
644                         }
645                 }
646         }
647
648         if (!native_mode->clock) {
649                 DRM_DEBUG_KMS("No LVDS native mode details, disabling RMX\n");
650                 amdgpu_encoder->rmx_type = RMX_OFF;
651         }
652 }
653
654 static int amdgpu_connector_lvds_get_modes(struct drm_connector *connector)
655 {
656         struct drm_encoder *encoder;
657         int ret = 0;
658         struct drm_display_mode *mode;
659
660         amdgpu_connector_get_edid(connector);
661         ret = amdgpu_connector_ddc_get_modes(connector);
662         if (ret > 0) {
663                 encoder = amdgpu_connector_best_single_encoder(connector);
664                 if (encoder) {
665                         amdgpu_connector_fixup_lcd_native_mode(encoder, connector);
666                         /* add scaled modes */
667                         amdgpu_connector_add_common_modes(encoder, connector);
668                 }
669                 return ret;
670         }
671
672         encoder = amdgpu_connector_best_single_encoder(connector);
673         if (!encoder)
674                 return 0;
675
676         /* we have no EDID modes */
677         mode = amdgpu_connector_lcd_native_mode(encoder);
678         if (mode) {
679                 ret = 1;
680                 drm_mode_probed_add(connector, mode);
681                 /* add the width/height from vbios tables if available */
682                 connector->display_info.width_mm = mode->width_mm;
683                 connector->display_info.height_mm = mode->height_mm;
684                 /* add scaled modes */
685                 amdgpu_connector_add_common_modes(encoder, connector);
686         }
687
688         return ret;
689 }
690
691 static enum drm_mode_status amdgpu_connector_lvds_mode_valid(struct drm_connector *connector,
692                                              struct drm_display_mode *mode)
693 {
694         struct drm_encoder *encoder = amdgpu_connector_best_single_encoder(connector);
695
696         if ((mode->hdisplay < 320) || (mode->vdisplay < 240))
697                 return MODE_PANEL;
698
699         if (encoder) {
700                 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
701                 struct drm_display_mode *native_mode = &amdgpu_encoder->native_mode;
702
703                 /* AVIVO hardware supports downscaling modes larger than the panel
704                  * to the panel size, but I'm not sure this is desirable.
705                  */
706                 if ((mode->hdisplay > native_mode->hdisplay) ||
707                     (mode->vdisplay > native_mode->vdisplay))
708                         return MODE_PANEL;
709
710                 /* if scaling is disabled, block non-native modes */
711                 if (amdgpu_encoder->rmx_type == RMX_OFF) {
712                         if ((mode->hdisplay != native_mode->hdisplay) ||
713                             (mode->vdisplay != native_mode->vdisplay))
714                                 return MODE_PANEL;
715                 }
716         }
717
718         return MODE_OK;
719 }
720
721 static enum drm_connector_status
722 amdgpu_connector_lvds_detect(struct drm_connector *connector, bool force)
723 {
724         struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
725         struct drm_encoder *encoder = amdgpu_connector_best_single_encoder(connector);
726         enum drm_connector_status ret = connector_status_disconnected;
727         int r;
728
729         if (!drm_kms_helper_is_poll_worker()) {
730                 r = pm_runtime_get_sync(connector->dev->dev);
731                 if (r < 0) {
732                         pm_runtime_put_autosuspend(connector->dev->dev);
733                         return connector_status_disconnected;
734                 }
735         }
736
737         if (encoder) {
738                 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
739                 struct drm_display_mode *native_mode = &amdgpu_encoder->native_mode;
740
741                 /* check if panel is valid */
742                 if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240)
743                         ret = connector_status_connected;
744
745         }
746
747         /* check for edid as well */
748         amdgpu_connector_get_edid(connector);
749         if (amdgpu_connector->edid)
750                 ret = connector_status_connected;
751         /* check acpi lid status ??? */
752
753         amdgpu_connector_update_scratch_regs(connector, ret);
754
755         if (!drm_kms_helper_is_poll_worker()) {
756                 pm_runtime_mark_last_busy(connector->dev->dev);
757                 pm_runtime_put_autosuspend(connector->dev->dev);
758         }
759
760         return ret;
761 }
762
763 static void amdgpu_connector_unregister(struct drm_connector *connector)
764 {
765         struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
766
767         if (amdgpu_connector->ddc_bus && amdgpu_connector->ddc_bus->has_aux) {
768                 drm_dp_aux_unregister(&amdgpu_connector->ddc_bus->aux);
769                 amdgpu_connector->ddc_bus->has_aux = false;
770         }
771 }
772
773 static void amdgpu_connector_destroy(struct drm_connector *connector)
774 {
775         struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
776
777         amdgpu_connector_free_edid(connector);
778         kfree(amdgpu_connector->con_priv);
779         drm_connector_unregister(connector);
780         drm_connector_cleanup(connector);
781         kfree(connector);
782 }
783
784 static int amdgpu_connector_set_lcd_property(struct drm_connector *connector,
785                                               struct drm_property *property,
786                                               uint64_t value)
787 {
788         struct drm_device *dev = connector->dev;
789         struct amdgpu_encoder *amdgpu_encoder;
790         enum amdgpu_rmx_type rmx_type;
791
792         DRM_DEBUG_KMS("\n");
793         if (property != dev->mode_config.scaling_mode_property)
794                 return 0;
795
796         if (connector->encoder)
797                 amdgpu_encoder = to_amdgpu_encoder(connector->encoder);
798         else {
799                 const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
800                 amdgpu_encoder = to_amdgpu_encoder(connector_funcs->best_encoder(connector));
801         }
802
803         switch (value) {
804         case DRM_MODE_SCALE_NONE:
805                 rmx_type = RMX_OFF;
806                 break;
807         case DRM_MODE_SCALE_CENTER:
808                 rmx_type = RMX_CENTER;
809                 break;
810         case DRM_MODE_SCALE_ASPECT:
811                 rmx_type = RMX_ASPECT;
812                 break;
813         default:
814         case DRM_MODE_SCALE_FULLSCREEN:
815                 rmx_type = RMX_FULL;
816                 break;
817         }
818
819         if (amdgpu_encoder->rmx_type == rmx_type)
820                 return 0;
821
822         amdgpu_encoder->rmx_type = rmx_type;
823
824         amdgpu_connector_property_change_mode(&amdgpu_encoder->base);
825         return 0;
826 }
827
828
829 static const struct drm_connector_helper_funcs amdgpu_connector_lvds_helper_funcs = {
830         .get_modes = amdgpu_connector_lvds_get_modes,
831         .mode_valid = amdgpu_connector_lvds_mode_valid,
832         .best_encoder = amdgpu_connector_best_single_encoder,
833 };
834
835 static const struct drm_connector_funcs amdgpu_connector_lvds_funcs = {
836         .dpms = drm_helper_connector_dpms,
837         .detect = amdgpu_connector_lvds_detect,
838         .fill_modes = drm_helper_probe_single_connector_modes,
839         .early_unregister = amdgpu_connector_unregister,
840         .destroy = amdgpu_connector_destroy,
841         .set_property = amdgpu_connector_set_lcd_property,
842 };
843
844 static int amdgpu_connector_vga_get_modes(struct drm_connector *connector)
845 {
846         int ret;
847
848         amdgpu_connector_get_edid(connector);
849         ret = amdgpu_connector_ddc_get_modes(connector);
850         amdgpu_get_native_mode(connector);
851
852         return ret;
853 }
854
855 static enum drm_mode_status amdgpu_connector_vga_mode_valid(struct drm_connector *connector,
856                                             struct drm_display_mode *mode)
857 {
858         struct drm_device *dev = connector->dev;
859         struct amdgpu_device *adev = drm_to_adev(dev);
860
861         /* XXX check mode bandwidth */
862
863         if ((mode->clock / 10) > adev->clock.max_pixel_clock)
864                 return MODE_CLOCK_HIGH;
865
866         return MODE_OK;
867 }
868
869 static enum drm_connector_status
870 amdgpu_connector_vga_detect(struct drm_connector *connector, bool force)
871 {
872         struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
873         struct drm_encoder *encoder;
874         const struct drm_encoder_helper_funcs *encoder_funcs;
875         bool dret = false;
876         enum drm_connector_status ret = connector_status_disconnected;
877         int r;
878
879         if (!drm_kms_helper_is_poll_worker()) {
880                 r = pm_runtime_get_sync(connector->dev->dev);
881                 if (r < 0) {
882                         pm_runtime_put_autosuspend(connector->dev->dev);
883                         return connector_status_disconnected;
884                 }
885         }
886
887         encoder = amdgpu_connector_best_single_encoder(connector);
888         if (!encoder)
889                 ret = connector_status_disconnected;
890
891         if (amdgpu_connector->ddc_bus)
892                 dret = amdgpu_display_ddc_probe(amdgpu_connector, false);
893         if (dret) {
894                 amdgpu_connector->detected_by_load = false;
895                 amdgpu_connector_free_edid(connector);
896                 amdgpu_connector_get_edid(connector);
897
898                 if (!amdgpu_connector->edid) {
899                         DRM_ERROR("%s: probed a monitor but no|invalid EDID\n",
900                                         connector->name);
901                         ret = connector_status_connected;
902                 } else {
903                         amdgpu_connector->use_digital =
904                                 !!(amdgpu_connector->edid->input & DRM_EDID_INPUT_DIGITAL);
905
906                         /* some oems have boards with separate digital and analog connectors
907                          * with a shared ddc line (often vga + hdmi)
908                          */
909                         if (amdgpu_connector->use_digital && amdgpu_connector->shared_ddc) {
910                                 amdgpu_connector_free_edid(connector);
911                                 ret = connector_status_disconnected;
912                         } else {
913                                 ret = connector_status_connected;
914                         }
915                 }
916         } else {
917
918                 /* if we aren't forcing don't do destructive polling */
919                 if (!force) {
920                         /* only return the previous status if we last
921                          * detected a monitor via load.
922                          */
923                         if (amdgpu_connector->detected_by_load)
924                                 ret = connector->status;
925                         goto out;
926                 }
927
928                 if (amdgpu_connector->dac_load_detect && encoder) {
929                         encoder_funcs = encoder->helper_private;
930                         ret = encoder_funcs->detect(encoder, connector);
931                         if (ret != connector_status_disconnected)
932                                 amdgpu_connector->detected_by_load = true;
933                 }
934         }
935
936         amdgpu_connector_update_scratch_regs(connector, ret);
937
938 out:
939         if (!drm_kms_helper_is_poll_worker()) {
940                 pm_runtime_mark_last_busy(connector->dev->dev);
941                 pm_runtime_put_autosuspend(connector->dev->dev);
942         }
943
944         return ret;
945 }
946
947 static const struct drm_connector_helper_funcs amdgpu_connector_vga_helper_funcs = {
948         .get_modes = amdgpu_connector_vga_get_modes,
949         .mode_valid = amdgpu_connector_vga_mode_valid,
950         .best_encoder = amdgpu_connector_best_single_encoder,
951 };
952
953 static const struct drm_connector_funcs amdgpu_connector_vga_funcs = {
954         .dpms = drm_helper_connector_dpms,
955         .detect = amdgpu_connector_vga_detect,
956         .fill_modes = drm_helper_probe_single_connector_modes,
957         .early_unregister = amdgpu_connector_unregister,
958         .destroy = amdgpu_connector_destroy,
959         .set_property = amdgpu_connector_set_property,
960 };
961
962 static bool
963 amdgpu_connector_check_hpd_status_unchanged(struct drm_connector *connector)
964 {
965         struct drm_device *dev = connector->dev;
966         struct amdgpu_device *adev = drm_to_adev(dev);
967         struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
968         enum drm_connector_status status;
969
970         if (amdgpu_connector->hpd.hpd != AMDGPU_HPD_NONE) {
971                 if (amdgpu_display_hpd_sense(adev, amdgpu_connector->hpd.hpd))
972                         status = connector_status_connected;
973                 else
974                         status = connector_status_disconnected;
975                 if (connector->status == status)
976                         return true;
977         }
978
979         return false;
980 }
981
982 /*
983  * DVI is complicated
984  * Do a DDC probe, if DDC probe passes, get the full EDID so
985  * we can do analog/digital monitor detection at this point.
986  * If the monitor is an analog monitor or we got no DDC,
987  * we need to find the DAC encoder object for this connector.
988  * If we got no DDC, we do load detection on the DAC encoder object.
989  * If we got analog DDC or load detection passes on the DAC encoder
990  * we have to check if this analog encoder is shared with anyone else (TV)
991  * if its shared we have to set the other connector to disconnected.
992  */
993 static enum drm_connector_status
994 amdgpu_connector_dvi_detect(struct drm_connector *connector, bool force)
995 {
996         struct drm_device *dev = connector->dev;
997         struct amdgpu_device *adev = drm_to_adev(dev);
998         struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
999         const struct drm_encoder_helper_funcs *encoder_funcs;
1000         int r;
1001         enum drm_connector_status ret = connector_status_disconnected;
1002         bool dret = false, broken_edid = false;
1003
1004         if (!drm_kms_helper_is_poll_worker()) {
1005                 r = pm_runtime_get_sync(connector->dev->dev);
1006                 if (r < 0) {
1007                         pm_runtime_put_autosuspend(connector->dev->dev);
1008                         return connector_status_disconnected;
1009                 }
1010         }
1011
1012         if (amdgpu_connector->detected_hpd_without_ddc) {
1013                 force = true;
1014                 amdgpu_connector->detected_hpd_without_ddc = false;
1015         }
1016
1017         if (!force && amdgpu_connector_check_hpd_status_unchanged(connector)) {
1018                 ret = connector->status;
1019                 goto exit;
1020         }
1021
1022         if (amdgpu_connector->ddc_bus) {
1023                 dret = amdgpu_display_ddc_probe(amdgpu_connector, false);
1024
1025                 /* Sometimes the pins required for the DDC probe on DVI
1026                  * connectors don't make contact at the same time that the ones
1027                  * for HPD do. If the DDC probe fails even though we had an HPD
1028                  * signal, try again later
1029                  */
1030                 if (!dret && !force &&
1031                     amdgpu_display_hpd_sense(adev, amdgpu_connector->hpd.hpd)) {
1032                         DRM_DEBUG_KMS("hpd detected without ddc, retrying in 1 second\n");
1033                         amdgpu_connector->detected_hpd_without_ddc = true;
1034                         schedule_delayed_work(&adev->hotplug_work,
1035                                               msecs_to_jiffies(1000));
1036                         goto exit;
1037                 }
1038         }
1039         if (dret) {
1040                 amdgpu_connector->detected_by_load = false;
1041                 amdgpu_connector_free_edid(connector);
1042                 amdgpu_connector_get_edid(connector);
1043
1044                 if (!amdgpu_connector->edid) {
1045                         DRM_ERROR("%s: probed a monitor but no|invalid EDID\n",
1046                                         connector->name);
1047                         ret = connector_status_connected;
1048                         broken_edid = true; /* defer use_digital to later */
1049                 } else {
1050                         amdgpu_connector->use_digital =
1051                                 !!(amdgpu_connector->edid->input & DRM_EDID_INPUT_DIGITAL);
1052
1053                         /* some oems have boards with separate digital and analog connectors
1054                          * with a shared ddc line (often vga + hdmi)
1055                          */
1056                         if ((!amdgpu_connector->use_digital) && amdgpu_connector->shared_ddc) {
1057                                 amdgpu_connector_free_edid(connector);
1058                                 ret = connector_status_disconnected;
1059                         } else {
1060                                 ret = connector_status_connected;
1061                         }
1062
1063                         /* This gets complicated.  We have boards with VGA + HDMI with a
1064                          * shared DDC line and we have boards with DVI-D + HDMI with a shared
1065                          * DDC line.  The latter is more complex because with DVI<->HDMI adapters
1066                          * you don't really know what's connected to which port as both are digital.
1067                          */
1068                         if (amdgpu_connector->shared_ddc && (ret == connector_status_connected)) {
1069                                 struct drm_connector *list_connector;
1070                                 struct drm_connector_list_iter iter;
1071                                 struct amdgpu_connector *list_amdgpu_connector;
1072
1073                                 drm_connector_list_iter_begin(dev, &iter);
1074                                 drm_for_each_connector_iter(list_connector,
1075                                                             &iter) {
1076                                         if (connector == list_connector)
1077                                                 continue;
1078                                         list_amdgpu_connector = to_amdgpu_connector(list_connector);
1079                                         if (list_amdgpu_connector->shared_ddc &&
1080                                             (list_amdgpu_connector->ddc_bus->rec.i2c_id ==
1081                                              amdgpu_connector->ddc_bus->rec.i2c_id)) {
1082                                                 /* cases where both connectors are digital */
1083                                                 if (list_connector->connector_type != DRM_MODE_CONNECTOR_VGA) {
1084                                                         /* hpd is our only option in this case */
1085                                                         if (!amdgpu_display_hpd_sense(adev, amdgpu_connector->hpd.hpd)) {
1086                                                                 amdgpu_connector_free_edid(connector);
1087                                                                 ret = connector_status_disconnected;
1088                                                         }
1089                                                 }
1090                                         }
1091                                 }
1092                                 drm_connector_list_iter_end(&iter);
1093                         }
1094                 }
1095         }
1096
1097         if ((ret == connector_status_connected) && (amdgpu_connector->use_digital == true))
1098                 goto out;
1099
1100         /* DVI-D and HDMI-A are digital only */
1101         if ((connector->connector_type == DRM_MODE_CONNECTOR_DVID) ||
1102             (connector->connector_type == DRM_MODE_CONNECTOR_HDMIA))
1103                 goto out;
1104
1105         /* if we aren't forcing don't do destructive polling */
1106         if (!force) {
1107                 /* only return the previous status if we last
1108                  * detected a monitor via load.
1109                  */
1110                 if (amdgpu_connector->detected_by_load)
1111                         ret = connector->status;
1112                 goto out;
1113         }
1114
1115         /* find analog encoder */
1116         if (amdgpu_connector->dac_load_detect) {
1117                 struct drm_encoder *encoder;
1118
1119                 drm_connector_for_each_possible_encoder(connector, encoder) {
1120                         if (encoder->encoder_type != DRM_MODE_ENCODER_DAC &&
1121                             encoder->encoder_type != DRM_MODE_ENCODER_TVDAC)
1122                                 continue;
1123
1124                         encoder_funcs = encoder->helper_private;
1125                         if (encoder_funcs->detect) {
1126                                 if (!broken_edid) {
1127                                         if (ret != connector_status_connected) {
1128                                                 /* deal with analog monitors without DDC */
1129                                                 ret = encoder_funcs->detect(encoder, connector);
1130                                                 if (ret == connector_status_connected) {
1131                                                         amdgpu_connector->use_digital = false;
1132                                                 }
1133                                                 if (ret != connector_status_disconnected)
1134                                                         amdgpu_connector->detected_by_load = true;
1135                                         }
1136                                 } else {
1137                                         enum drm_connector_status lret;
1138                                         /* assume digital unless load detected otherwise */
1139                                         amdgpu_connector->use_digital = true;
1140                                         lret = encoder_funcs->detect(encoder, connector);
1141                                         DRM_DEBUG_KMS("load_detect %x returned: %x\n",
1142                                                       encoder->encoder_type, lret);
1143                                         if (lret == connector_status_connected)
1144                                                 amdgpu_connector->use_digital = false;
1145                                 }
1146                                 break;
1147                         }
1148                 }
1149         }
1150
1151 out:
1152         /* updated in get modes as well since we need to know if it's analog or digital */
1153         amdgpu_connector_update_scratch_regs(connector, ret);
1154
1155 exit:
1156         if (!drm_kms_helper_is_poll_worker()) {
1157                 pm_runtime_mark_last_busy(connector->dev->dev);
1158                 pm_runtime_put_autosuspend(connector->dev->dev);
1159         }
1160
1161         return ret;
1162 }
1163
1164 /* okay need to be smart in here about which encoder to pick */
1165 static struct drm_encoder *
1166 amdgpu_connector_dvi_encoder(struct drm_connector *connector)
1167 {
1168         struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
1169         struct drm_encoder *encoder;
1170
1171         drm_connector_for_each_possible_encoder(connector, encoder) {
1172                 if (amdgpu_connector->use_digital == true) {
1173                         if (encoder->encoder_type == DRM_MODE_ENCODER_TMDS)
1174                                 return encoder;
1175                 } else {
1176                         if (encoder->encoder_type == DRM_MODE_ENCODER_DAC ||
1177                             encoder->encoder_type == DRM_MODE_ENCODER_TVDAC)
1178                                 return encoder;
1179                 }
1180         }
1181
1182         /* see if we have a default encoder  TODO */
1183
1184         /* then check use digitial */
1185         /* pick the first one */
1186         drm_connector_for_each_possible_encoder(connector, encoder)
1187                 return encoder;
1188
1189         return NULL;
1190 }
1191
1192 static void amdgpu_connector_dvi_force(struct drm_connector *connector)
1193 {
1194         struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
1195         if (connector->force == DRM_FORCE_ON)
1196                 amdgpu_connector->use_digital = false;
1197         if (connector->force == DRM_FORCE_ON_DIGITAL)
1198                 amdgpu_connector->use_digital = true;
1199 }
1200
1201 static enum drm_mode_status amdgpu_connector_dvi_mode_valid(struct drm_connector *connector,
1202                                             struct drm_display_mode *mode)
1203 {
1204         struct drm_device *dev = connector->dev;
1205         struct amdgpu_device *adev = drm_to_adev(dev);
1206         struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
1207
1208         /* XXX check mode bandwidth */
1209
1210         if (amdgpu_connector->use_digital && (mode->clock > 165000)) {
1211                 if ((amdgpu_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I) ||
1212                     (amdgpu_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D) ||
1213                     (amdgpu_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B)) {
1214                         return MODE_OK;
1215                 } else if (connector->display_info.is_hdmi) {
1216                         /* HDMI 1.3+ supports max clock of 340 Mhz */
1217                         if (mode->clock > 340000)
1218                                 return MODE_CLOCK_HIGH;
1219                         else
1220                                 return MODE_OK;
1221                 } else {
1222                         return MODE_CLOCK_HIGH;
1223                 }
1224         }
1225
1226         /* check against the max pixel clock */
1227         if ((mode->clock / 10) > adev->clock.max_pixel_clock)
1228                 return MODE_CLOCK_HIGH;
1229
1230         return MODE_OK;
1231 }
1232
1233 static const struct drm_connector_helper_funcs amdgpu_connector_dvi_helper_funcs = {
1234         .get_modes = amdgpu_connector_vga_get_modes,
1235         .mode_valid = amdgpu_connector_dvi_mode_valid,
1236         .best_encoder = amdgpu_connector_dvi_encoder,
1237 };
1238
1239 static const struct drm_connector_funcs amdgpu_connector_dvi_funcs = {
1240         .dpms = drm_helper_connector_dpms,
1241         .detect = amdgpu_connector_dvi_detect,
1242         .fill_modes = drm_helper_probe_single_connector_modes,
1243         .set_property = amdgpu_connector_set_property,
1244         .early_unregister = amdgpu_connector_unregister,
1245         .destroy = amdgpu_connector_destroy,
1246         .force = amdgpu_connector_dvi_force,
1247 };
1248
1249 static int amdgpu_connector_dp_get_modes(struct drm_connector *connector)
1250 {
1251         struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
1252         struct amdgpu_connector_atom_dig *amdgpu_dig_connector = amdgpu_connector->con_priv;
1253         struct drm_encoder *encoder = amdgpu_connector_best_single_encoder(connector);
1254         int ret;
1255
1256         if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||
1257             (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {
1258                 struct drm_display_mode *mode;
1259
1260                 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
1261                         if (!amdgpu_dig_connector->edp_on)
1262                                 amdgpu_atombios_encoder_set_edp_panel_power(connector,
1263                                                                      ATOM_TRANSMITTER_ACTION_POWER_ON);
1264                         amdgpu_connector_get_edid(connector);
1265                         ret = amdgpu_connector_ddc_get_modes(connector);
1266                         if (!amdgpu_dig_connector->edp_on)
1267                                 amdgpu_atombios_encoder_set_edp_panel_power(connector,
1268                                                                      ATOM_TRANSMITTER_ACTION_POWER_OFF);
1269                 } else {
1270                         /* need to setup ddc on the bridge */
1271                         if (amdgpu_connector_encoder_get_dp_bridge_encoder_id(connector) !=
1272                             ENCODER_OBJECT_ID_NONE) {
1273                                 if (encoder)
1274                                         amdgpu_atombios_encoder_setup_ext_encoder_ddc(encoder);
1275                         }
1276                         amdgpu_connector_get_edid(connector);
1277                         ret = amdgpu_connector_ddc_get_modes(connector);
1278                 }
1279
1280                 if (ret > 0) {
1281                         if (encoder) {
1282                                 amdgpu_connector_fixup_lcd_native_mode(encoder, connector);
1283                                 /* add scaled modes */
1284                                 amdgpu_connector_add_common_modes(encoder, connector);
1285                         }
1286                         return ret;
1287                 }
1288
1289                 if (!encoder)
1290                         return 0;
1291
1292                 /* we have no EDID modes */
1293                 mode = amdgpu_connector_lcd_native_mode(encoder);
1294                 if (mode) {
1295                         ret = 1;
1296                         drm_mode_probed_add(connector, mode);
1297                         /* add the width/height from vbios tables if available */
1298                         connector->display_info.width_mm = mode->width_mm;
1299                         connector->display_info.height_mm = mode->height_mm;
1300                         /* add scaled modes */
1301                         amdgpu_connector_add_common_modes(encoder, connector);
1302                 }
1303         } else {
1304                 /* need to setup ddc on the bridge */
1305                 if (amdgpu_connector_encoder_get_dp_bridge_encoder_id(connector) !=
1306                         ENCODER_OBJECT_ID_NONE) {
1307                         if (encoder)
1308                                 amdgpu_atombios_encoder_setup_ext_encoder_ddc(encoder);
1309                 }
1310                 amdgpu_connector_get_edid(connector);
1311                 ret = amdgpu_connector_ddc_get_modes(connector);
1312
1313                 amdgpu_get_native_mode(connector);
1314         }
1315
1316         return ret;
1317 }
1318
1319 u16 amdgpu_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *connector)
1320 {
1321         struct drm_encoder *encoder;
1322         struct amdgpu_encoder *amdgpu_encoder;
1323
1324         drm_connector_for_each_possible_encoder(connector, encoder) {
1325                 amdgpu_encoder = to_amdgpu_encoder(encoder);
1326
1327                 switch (amdgpu_encoder->encoder_id) {
1328                 case ENCODER_OBJECT_ID_TRAVIS:
1329                 case ENCODER_OBJECT_ID_NUTMEG:
1330                         return amdgpu_encoder->encoder_id;
1331                 default:
1332                         break;
1333                 }
1334         }
1335
1336         return ENCODER_OBJECT_ID_NONE;
1337 }
1338
1339 static bool amdgpu_connector_encoder_is_hbr2(struct drm_connector *connector)
1340 {
1341         struct drm_encoder *encoder;
1342         struct amdgpu_encoder *amdgpu_encoder;
1343         bool found = false;
1344
1345         drm_connector_for_each_possible_encoder(connector, encoder) {
1346                 amdgpu_encoder = to_amdgpu_encoder(encoder);
1347                 if (amdgpu_encoder->caps & ATOM_ENCODER_CAP_RECORD_HBR2)
1348                         found = true;
1349         }
1350
1351         return found;
1352 }
1353
1354 bool amdgpu_connector_is_dp12_capable(struct drm_connector *connector)
1355 {
1356         struct drm_device *dev = connector->dev;
1357         struct amdgpu_device *adev = drm_to_adev(dev);
1358
1359         if ((adev->clock.default_dispclk >= 53900) &&
1360             amdgpu_connector_encoder_is_hbr2(connector)) {
1361                 return true;
1362         }
1363
1364         return false;
1365 }
1366
1367 static enum drm_connector_status
1368 amdgpu_connector_dp_detect(struct drm_connector *connector, bool force)
1369 {
1370         struct drm_device *dev = connector->dev;
1371         struct amdgpu_device *adev = drm_to_adev(dev);
1372         struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
1373         enum drm_connector_status ret = connector_status_disconnected;
1374         struct amdgpu_connector_atom_dig *amdgpu_dig_connector = amdgpu_connector->con_priv;
1375         struct drm_encoder *encoder = amdgpu_connector_best_single_encoder(connector);
1376         int r;
1377
1378         if (!drm_kms_helper_is_poll_worker()) {
1379                 r = pm_runtime_get_sync(connector->dev->dev);
1380                 if (r < 0) {
1381                         pm_runtime_put_autosuspend(connector->dev->dev);
1382                         return connector_status_disconnected;
1383                 }
1384         }
1385
1386         if (!force && amdgpu_connector_check_hpd_status_unchanged(connector)) {
1387                 ret = connector->status;
1388                 goto out;
1389         }
1390
1391         amdgpu_connector_free_edid(connector);
1392
1393         if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||
1394             (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {
1395                 if (encoder) {
1396                         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
1397                         struct drm_display_mode *native_mode = &amdgpu_encoder->native_mode;
1398
1399                         /* check if panel is valid */
1400                         if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240)
1401                                 ret = connector_status_connected;
1402                 }
1403                 /* eDP is always DP */
1404                 amdgpu_dig_connector->dp_sink_type = CONNECTOR_OBJECT_ID_DISPLAYPORT;
1405                 if (!amdgpu_dig_connector->edp_on)
1406                         amdgpu_atombios_encoder_set_edp_panel_power(connector,
1407                                                              ATOM_TRANSMITTER_ACTION_POWER_ON);
1408                 if (!amdgpu_atombios_dp_get_dpcd(amdgpu_connector))
1409                         ret = connector_status_connected;
1410                 if (!amdgpu_dig_connector->edp_on)
1411                         amdgpu_atombios_encoder_set_edp_panel_power(connector,
1412                                                              ATOM_TRANSMITTER_ACTION_POWER_OFF);
1413         } else if (amdgpu_connector_encoder_get_dp_bridge_encoder_id(connector) !=
1414                    ENCODER_OBJECT_ID_NONE) {
1415                 /* DP bridges are always DP */
1416                 amdgpu_dig_connector->dp_sink_type = CONNECTOR_OBJECT_ID_DISPLAYPORT;
1417                 /* get the DPCD from the bridge */
1418                 amdgpu_atombios_dp_get_dpcd(amdgpu_connector);
1419
1420                 if (encoder) {
1421                         /* setup ddc on the bridge */
1422                         amdgpu_atombios_encoder_setup_ext_encoder_ddc(encoder);
1423                         /* bridge chips are always aux */
1424                         /* try DDC */
1425                         if (amdgpu_display_ddc_probe(amdgpu_connector, true))
1426                                 ret = connector_status_connected;
1427                         else if (amdgpu_connector->dac_load_detect) { /* try load detection */
1428                                 const struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
1429                                 ret = encoder_funcs->detect(encoder, connector);
1430                         }
1431                 }
1432         } else {
1433                 amdgpu_dig_connector->dp_sink_type =
1434                         amdgpu_atombios_dp_get_sinktype(amdgpu_connector);
1435                 if (amdgpu_display_hpd_sense(adev, amdgpu_connector->hpd.hpd)) {
1436                         ret = connector_status_connected;
1437                         if (amdgpu_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT)
1438                                 amdgpu_atombios_dp_get_dpcd(amdgpu_connector);
1439                 } else {
1440                         if (amdgpu_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) {
1441                                 if (!amdgpu_atombios_dp_get_dpcd(amdgpu_connector))
1442                                         ret = connector_status_connected;
1443                         } else {
1444                                 /* try non-aux ddc (DP to DVI/HDMI/etc. adapter) */
1445                                 if (amdgpu_display_ddc_probe(amdgpu_connector,
1446                                                              false))
1447                                         ret = connector_status_connected;
1448                         }
1449                 }
1450         }
1451
1452         amdgpu_connector_update_scratch_regs(connector, ret);
1453 out:
1454         if (!drm_kms_helper_is_poll_worker()) {
1455                 pm_runtime_mark_last_busy(connector->dev->dev);
1456                 pm_runtime_put_autosuspend(connector->dev->dev);
1457         }
1458
1459         if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
1460             connector->connector_type == DRM_MODE_CONNECTOR_eDP)
1461                 drm_dp_set_subconnector_property(&amdgpu_connector->base,
1462                                                  ret,
1463                                                  amdgpu_dig_connector->dpcd,
1464                                                  amdgpu_dig_connector->downstream_ports);
1465         return ret;
1466 }
1467
1468 static enum drm_mode_status amdgpu_connector_dp_mode_valid(struct drm_connector *connector,
1469                                            struct drm_display_mode *mode)
1470 {
1471         struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
1472         struct amdgpu_connector_atom_dig *amdgpu_dig_connector = amdgpu_connector->con_priv;
1473
1474         /* XXX check mode bandwidth */
1475
1476         if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||
1477             (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {
1478                 struct drm_encoder *encoder = amdgpu_connector_best_single_encoder(connector);
1479
1480                 if ((mode->hdisplay < 320) || (mode->vdisplay < 240))
1481                         return MODE_PANEL;
1482
1483                 if (encoder) {
1484                         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
1485                         struct drm_display_mode *native_mode = &amdgpu_encoder->native_mode;
1486
1487                         /* AVIVO hardware supports downscaling modes larger than the panel
1488                          * to the panel size, but I'm not sure this is desirable.
1489                          */
1490                         if ((mode->hdisplay > native_mode->hdisplay) ||
1491                             (mode->vdisplay > native_mode->vdisplay))
1492                                 return MODE_PANEL;
1493
1494                         /* if scaling is disabled, block non-native modes */
1495                         if (amdgpu_encoder->rmx_type == RMX_OFF) {
1496                                 if ((mode->hdisplay != native_mode->hdisplay) ||
1497                                     (mode->vdisplay != native_mode->vdisplay))
1498                                         return MODE_PANEL;
1499                         }
1500                 }
1501                 return MODE_OK;
1502         } else {
1503                 if ((amdgpu_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
1504                     (amdgpu_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) {
1505                         return amdgpu_atombios_dp_mode_valid_helper(connector, mode);
1506                 } else {
1507                         if (connector->display_info.is_hdmi) {
1508                                 /* HDMI 1.3+ supports max clock of 340 Mhz */
1509                                 if (mode->clock > 340000)
1510                                         return MODE_CLOCK_HIGH;
1511                         } else {
1512                                 if (mode->clock > 165000)
1513                                         return MODE_CLOCK_HIGH;
1514                         }
1515                 }
1516         }
1517
1518         return MODE_OK;
1519 }
1520
1521 static int
1522 amdgpu_connector_late_register(struct drm_connector *connector)
1523 {
1524         struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
1525         int r = 0;
1526
1527         if (amdgpu_connector->ddc_bus->has_aux) {
1528                 amdgpu_connector->ddc_bus->aux.dev = amdgpu_connector->base.kdev;
1529                 r = drm_dp_aux_register(&amdgpu_connector->ddc_bus->aux);
1530         }
1531
1532         return r;
1533 }
1534
1535 static const struct drm_connector_helper_funcs amdgpu_connector_dp_helper_funcs = {
1536         .get_modes = amdgpu_connector_dp_get_modes,
1537         .mode_valid = amdgpu_connector_dp_mode_valid,
1538         .best_encoder = amdgpu_connector_dvi_encoder,
1539 };
1540
1541 static const struct drm_connector_funcs amdgpu_connector_dp_funcs = {
1542         .dpms = drm_helper_connector_dpms,
1543         .detect = amdgpu_connector_dp_detect,
1544         .fill_modes = drm_helper_probe_single_connector_modes,
1545         .set_property = amdgpu_connector_set_property,
1546         .early_unregister = amdgpu_connector_unregister,
1547         .destroy = amdgpu_connector_destroy,
1548         .force = amdgpu_connector_dvi_force,
1549         .late_register = amdgpu_connector_late_register,
1550 };
1551
1552 static const struct drm_connector_funcs amdgpu_connector_edp_funcs = {
1553         .dpms = drm_helper_connector_dpms,
1554         .detect = amdgpu_connector_dp_detect,
1555         .fill_modes = drm_helper_probe_single_connector_modes,
1556         .set_property = amdgpu_connector_set_lcd_property,
1557         .early_unregister = amdgpu_connector_unregister,
1558         .destroy = amdgpu_connector_destroy,
1559         .force = amdgpu_connector_dvi_force,
1560         .late_register = amdgpu_connector_late_register,
1561 };
1562
1563 void
1564 amdgpu_connector_add(struct amdgpu_device *adev,
1565                       uint32_t connector_id,
1566                       uint32_t supported_device,
1567                       int connector_type,
1568                       struct amdgpu_i2c_bus_rec *i2c_bus,
1569                       uint16_t connector_object_id,
1570                       struct amdgpu_hpd *hpd,
1571                       struct amdgpu_router *router)
1572 {
1573         struct drm_device *dev = adev_to_drm(adev);
1574         struct drm_connector *connector;
1575         struct drm_connector_list_iter iter;
1576         struct amdgpu_connector *amdgpu_connector;
1577         struct amdgpu_connector_atom_dig *amdgpu_dig_connector;
1578         struct drm_encoder *encoder;
1579         struct amdgpu_encoder *amdgpu_encoder;
1580         struct i2c_adapter *ddc = NULL;
1581         uint32_t subpixel_order = SubPixelNone;
1582         bool shared_ddc = false;
1583         bool is_dp_bridge = false;
1584         bool has_aux = false;
1585
1586         if (connector_type == DRM_MODE_CONNECTOR_Unknown)
1587                 return;
1588
1589         /* see if we already added it */
1590         drm_connector_list_iter_begin(dev, &iter);
1591         drm_for_each_connector_iter(connector, &iter) {
1592                 amdgpu_connector = to_amdgpu_connector(connector);
1593                 if (amdgpu_connector->connector_id == connector_id) {
1594                         amdgpu_connector->devices |= supported_device;
1595                         drm_connector_list_iter_end(&iter);
1596                         return;
1597                 }
1598                 if (amdgpu_connector->ddc_bus && i2c_bus->valid) {
1599                         if (amdgpu_connector->ddc_bus->rec.i2c_id == i2c_bus->i2c_id) {
1600                                 amdgpu_connector->shared_ddc = true;
1601                                 shared_ddc = true;
1602                         }
1603                         if (amdgpu_connector->router_bus && router->ddc_valid &&
1604                             (amdgpu_connector->router.router_id == router->router_id)) {
1605                                 amdgpu_connector->shared_ddc = false;
1606                                 shared_ddc = false;
1607                         }
1608                 }
1609         }
1610         drm_connector_list_iter_end(&iter);
1611
1612         /* check if it's a dp bridge */
1613         list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
1614                 amdgpu_encoder = to_amdgpu_encoder(encoder);
1615                 if (amdgpu_encoder->devices & supported_device) {
1616                         switch (amdgpu_encoder->encoder_id) {
1617                         case ENCODER_OBJECT_ID_TRAVIS:
1618                         case ENCODER_OBJECT_ID_NUTMEG:
1619                                 is_dp_bridge = true;
1620                                 break;
1621                         default:
1622                                 break;
1623                         }
1624                 }
1625         }
1626
1627         amdgpu_connector = kzalloc(sizeof(struct amdgpu_connector), GFP_KERNEL);
1628         if (!amdgpu_connector)
1629                 return;
1630
1631         connector = &amdgpu_connector->base;
1632
1633         amdgpu_connector->connector_id = connector_id;
1634         amdgpu_connector->devices = supported_device;
1635         amdgpu_connector->shared_ddc = shared_ddc;
1636         amdgpu_connector->connector_object_id = connector_object_id;
1637         amdgpu_connector->hpd = *hpd;
1638
1639         amdgpu_connector->router = *router;
1640         if (router->ddc_valid || router->cd_valid) {
1641                 amdgpu_connector->router_bus = amdgpu_i2c_lookup(adev, &router->i2c_info);
1642                 if (!amdgpu_connector->router_bus)
1643                         DRM_ERROR("Failed to assign router i2c bus! Check dmesg for i2c errors.\n");
1644         }
1645
1646         if (is_dp_bridge) {
1647                 amdgpu_dig_connector = kzalloc(sizeof(struct amdgpu_connector_atom_dig), GFP_KERNEL);
1648                 if (!amdgpu_dig_connector)
1649                         goto failed;
1650                 amdgpu_connector->con_priv = amdgpu_dig_connector;
1651                 if (i2c_bus->valid) {
1652                         amdgpu_connector->ddc_bus = amdgpu_i2c_lookup(adev, i2c_bus);
1653                         if (amdgpu_connector->ddc_bus) {
1654                                 has_aux = true;
1655                                 ddc = &amdgpu_connector->ddc_bus->adapter;
1656                         } else {
1657                                 DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1658                         }
1659                 }
1660                 switch (connector_type) {
1661                 case DRM_MODE_CONNECTOR_VGA:
1662                 case DRM_MODE_CONNECTOR_DVIA:
1663                 default:
1664                         drm_connector_init_with_ddc(dev, &amdgpu_connector->base,
1665                                                     &amdgpu_connector_dp_funcs,
1666                                                     connector_type,
1667                                                     ddc);
1668                         drm_connector_helper_add(&amdgpu_connector->base,
1669                                                  &amdgpu_connector_dp_helper_funcs);
1670                         connector->interlace_allowed = true;
1671                         connector->doublescan_allowed = true;
1672                         amdgpu_connector->dac_load_detect = true;
1673                         drm_object_attach_property(&amdgpu_connector->base.base,
1674                                                       adev->mode_info.load_detect_property,
1675                                                       1);
1676                         drm_object_attach_property(&amdgpu_connector->base.base,
1677                                                    dev->mode_config.scaling_mode_property,
1678                                                    DRM_MODE_SCALE_NONE);
1679                         break;
1680                 case DRM_MODE_CONNECTOR_DVII:
1681                 case DRM_MODE_CONNECTOR_DVID:
1682                 case DRM_MODE_CONNECTOR_HDMIA:
1683                 case DRM_MODE_CONNECTOR_HDMIB:
1684                 case DRM_MODE_CONNECTOR_DisplayPort:
1685                         drm_connector_init_with_ddc(dev, &amdgpu_connector->base,
1686                                                     &amdgpu_connector_dp_funcs,
1687                                                     connector_type,
1688                                                     ddc);
1689                         drm_connector_helper_add(&amdgpu_connector->base,
1690                                                  &amdgpu_connector_dp_helper_funcs);
1691                         drm_object_attach_property(&amdgpu_connector->base.base,
1692                                                       adev->mode_info.underscan_property,
1693                                                       UNDERSCAN_OFF);
1694                         drm_object_attach_property(&amdgpu_connector->base.base,
1695                                                       adev->mode_info.underscan_hborder_property,
1696                                                       0);
1697                         drm_object_attach_property(&amdgpu_connector->base.base,
1698                                                       adev->mode_info.underscan_vborder_property,
1699                                                       0);
1700
1701                         drm_object_attach_property(&amdgpu_connector->base.base,
1702                                                    dev->mode_config.scaling_mode_property,
1703                                                    DRM_MODE_SCALE_NONE);
1704
1705                         drm_object_attach_property(&amdgpu_connector->base.base,
1706                                                    adev->mode_info.dither_property,
1707                                                    AMDGPU_FMT_DITHER_DISABLE);
1708
1709                         if (amdgpu_audio != 0) {
1710                                 drm_object_attach_property(&amdgpu_connector->base.base,
1711                                                            adev->mode_info.audio_property,
1712                                                            AMDGPU_AUDIO_AUTO);
1713                                 amdgpu_connector->audio = AMDGPU_AUDIO_AUTO;
1714                         }
1715
1716                         subpixel_order = SubPixelHorizontalRGB;
1717                         connector->interlace_allowed = true;
1718                         if (connector_type == DRM_MODE_CONNECTOR_HDMIB)
1719                                 connector->doublescan_allowed = true;
1720                         else
1721                                 connector->doublescan_allowed = false;
1722                         if (connector_type == DRM_MODE_CONNECTOR_DVII) {
1723                                 amdgpu_connector->dac_load_detect = true;
1724                                 drm_object_attach_property(&amdgpu_connector->base.base,
1725                                                               adev->mode_info.load_detect_property,
1726                                                               1);
1727                         }
1728                         break;
1729                 case DRM_MODE_CONNECTOR_LVDS:
1730                 case DRM_MODE_CONNECTOR_eDP:
1731                         drm_connector_init_with_ddc(dev, &amdgpu_connector->base,
1732                                                     &amdgpu_connector_edp_funcs,
1733                                                     connector_type,
1734                                                     ddc);
1735                         drm_connector_helper_add(&amdgpu_connector->base,
1736                                                  &amdgpu_connector_dp_helper_funcs);
1737                         drm_object_attach_property(&amdgpu_connector->base.base,
1738                                                       dev->mode_config.scaling_mode_property,
1739                                                       DRM_MODE_SCALE_FULLSCREEN);
1740                         subpixel_order = SubPixelHorizontalRGB;
1741                         connector->interlace_allowed = false;
1742                         connector->doublescan_allowed = false;
1743                         break;
1744                 }
1745         } else {
1746                 switch (connector_type) {
1747                 case DRM_MODE_CONNECTOR_VGA:
1748                         if (i2c_bus->valid) {
1749                                 amdgpu_connector->ddc_bus = amdgpu_i2c_lookup(adev, i2c_bus);
1750                                 if (!amdgpu_connector->ddc_bus)
1751                                         DRM_ERROR("VGA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1752                                 else
1753                                         ddc = &amdgpu_connector->ddc_bus->adapter;
1754                         }
1755                         drm_connector_init_with_ddc(dev, &amdgpu_connector->base,
1756                                                     &amdgpu_connector_vga_funcs,
1757                                                     connector_type,
1758                                                     ddc);
1759                         drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_vga_helper_funcs);
1760                         amdgpu_connector->dac_load_detect = true;
1761                         drm_object_attach_property(&amdgpu_connector->base.base,
1762                                                       adev->mode_info.load_detect_property,
1763                                                       1);
1764                         drm_object_attach_property(&amdgpu_connector->base.base,
1765                                                    dev->mode_config.scaling_mode_property,
1766                                                    DRM_MODE_SCALE_NONE);
1767                         /* no HPD on analog connectors */
1768                         amdgpu_connector->hpd.hpd = AMDGPU_HPD_NONE;
1769                         connector->interlace_allowed = true;
1770                         connector->doublescan_allowed = true;
1771                         break;
1772                 case DRM_MODE_CONNECTOR_DVIA:
1773                         if (i2c_bus->valid) {
1774                                 amdgpu_connector->ddc_bus = amdgpu_i2c_lookup(adev, i2c_bus);
1775                                 if (!amdgpu_connector->ddc_bus)
1776                                         DRM_ERROR("DVIA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1777                                 else
1778                                         ddc = &amdgpu_connector->ddc_bus->adapter;
1779                         }
1780                         drm_connector_init_with_ddc(dev, &amdgpu_connector->base,
1781                                                     &amdgpu_connector_vga_funcs,
1782                                                     connector_type,
1783                                                     ddc);
1784                         drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_vga_helper_funcs);
1785                         amdgpu_connector->dac_load_detect = true;
1786                         drm_object_attach_property(&amdgpu_connector->base.base,
1787                                                       adev->mode_info.load_detect_property,
1788                                                       1);
1789                         drm_object_attach_property(&amdgpu_connector->base.base,
1790                                                    dev->mode_config.scaling_mode_property,
1791                                                    DRM_MODE_SCALE_NONE);
1792                         /* no HPD on analog connectors */
1793                         amdgpu_connector->hpd.hpd = AMDGPU_HPD_NONE;
1794                         connector->interlace_allowed = true;
1795                         connector->doublescan_allowed = true;
1796                         break;
1797                 case DRM_MODE_CONNECTOR_DVII:
1798                 case DRM_MODE_CONNECTOR_DVID:
1799                         amdgpu_dig_connector = kzalloc(sizeof(struct amdgpu_connector_atom_dig), GFP_KERNEL);
1800                         if (!amdgpu_dig_connector)
1801                                 goto failed;
1802                         amdgpu_connector->con_priv = amdgpu_dig_connector;
1803                         if (i2c_bus->valid) {
1804                                 amdgpu_connector->ddc_bus = amdgpu_i2c_lookup(adev, i2c_bus);
1805                                 if (!amdgpu_connector->ddc_bus)
1806                                         DRM_ERROR("DVI: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1807                                 else
1808                                         ddc = &amdgpu_connector->ddc_bus->adapter;
1809                         }
1810                         drm_connector_init_with_ddc(dev, &amdgpu_connector->base,
1811                                                     &amdgpu_connector_dvi_funcs,
1812                                                     connector_type,
1813                                                     ddc);
1814                         drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_dvi_helper_funcs);
1815                         subpixel_order = SubPixelHorizontalRGB;
1816                         drm_object_attach_property(&amdgpu_connector->base.base,
1817                                                       adev->mode_info.coherent_mode_property,
1818                                                       1);
1819                         drm_object_attach_property(&amdgpu_connector->base.base,
1820                                                    adev->mode_info.underscan_property,
1821                                                    UNDERSCAN_OFF);
1822                         drm_object_attach_property(&amdgpu_connector->base.base,
1823                                                    adev->mode_info.underscan_hborder_property,
1824                                                    0);
1825                         drm_object_attach_property(&amdgpu_connector->base.base,
1826                                                    adev->mode_info.underscan_vborder_property,
1827                                                    0);
1828                         drm_object_attach_property(&amdgpu_connector->base.base,
1829                                                    dev->mode_config.scaling_mode_property,
1830                                                    DRM_MODE_SCALE_NONE);
1831
1832                         if (amdgpu_audio != 0) {
1833                                 drm_object_attach_property(&amdgpu_connector->base.base,
1834                                                            adev->mode_info.audio_property,
1835                                                            AMDGPU_AUDIO_AUTO);
1836                                 amdgpu_connector->audio = AMDGPU_AUDIO_AUTO;
1837                         }
1838                         drm_object_attach_property(&amdgpu_connector->base.base,
1839                                                    adev->mode_info.dither_property,
1840                                                    AMDGPU_FMT_DITHER_DISABLE);
1841                         if (connector_type == DRM_MODE_CONNECTOR_DVII) {
1842                                 amdgpu_connector->dac_load_detect = true;
1843                                 drm_object_attach_property(&amdgpu_connector->base.base,
1844                                                            adev->mode_info.load_detect_property,
1845                                                            1);
1846                         }
1847                         connector->interlace_allowed = true;
1848                         if (connector_type == DRM_MODE_CONNECTOR_DVII)
1849                                 connector->doublescan_allowed = true;
1850                         else
1851                                 connector->doublescan_allowed = false;
1852                         break;
1853                 case DRM_MODE_CONNECTOR_HDMIA:
1854                 case DRM_MODE_CONNECTOR_HDMIB:
1855                         amdgpu_dig_connector = kzalloc(sizeof(struct amdgpu_connector_atom_dig), GFP_KERNEL);
1856                         if (!amdgpu_dig_connector)
1857                                 goto failed;
1858                         amdgpu_connector->con_priv = amdgpu_dig_connector;
1859                         if (i2c_bus->valid) {
1860                                 amdgpu_connector->ddc_bus = amdgpu_i2c_lookup(adev, i2c_bus);
1861                                 if (!amdgpu_connector->ddc_bus)
1862                                         DRM_ERROR("HDMI: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1863                                 else
1864                                         ddc = &amdgpu_connector->ddc_bus->adapter;
1865                         }
1866                         drm_connector_init_with_ddc(dev, &amdgpu_connector->base,
1867                                                     &amdgpu_connector_dvi_funcs,
1868                                                     connector_type,
1869                                                     ddc);
1870                         drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_dvi_helper_funcs);
1871                         drm_object_attach_property(&amdgpu_connector->base.base,
1872                                                       adev->mode_info.coherent_mode_property,
1873                                                       1);
1874                         drm_object_attach_property(&amdgpu_connector->base.base,
1875                                                    adev->mode_info.underscan_property,
1876                                                    UNDERSCAN_OFF);
1877                         drm_object_attach_property(&amdgpu_connector->base.base,
1878                                                    adev->mode_info.underscan_hborder_property,
1879                                                    0);
1880                         drm_object_attach_property(&amdgpu_connector->base.base,
1881                                                    adev->mode_info.underscan_vborder_property,
1882                                                    0);
1883                         drm_object_attach_property(&amdgpu_connector->base.base,
1884                                                    dev->mode_config.scaling_mode_property,
1885                                                    DRM_MODE_SCALE_NONE);
1886                         if (amdgpu_audio != 0) {
1887                                 drm_object_attach_property(&amdgpu_connector->base.base,
1888                                                            adev->mode_info.audio_property,
1889                                                            AMDGPU_AUDIO_AUTO);
1890                                 amdgpu_connector->audio = AMDGPU_AUDIO_AUTO;
1891                         }
1892                         drm_object_attach_property(&amdgpu_connector->base.base,
1893                                                    adev->mode_info.dither_property,
1894                                                    AMDGPU_FMT_DITHER_DISABLE);
1895                         subpixel_order = SubPixelHorizontalRGB;
1896                         connector->interlace_allowed = true;
1897                         if (connector_type == DRM_MODE_CONNECTOR_HDMIB)
1898                                 connector->doublescan_allowed = true;
1899                         else
1900                                 connector->doublescan_allowed = false;
1901                         break;
1902                 case DRM_MODE_CONNECTOR_DisplayPort:
1903                         amdgpu_dig_connector = kzalloc(sizeof(struct amdgpu_connector_atom_dig), GFP_KERNEL);
1904                         if (!amdgpu_dig_connector)
1905                                 goto failed;
1906                         amdgpu_connector->con_priv = amdgpu_dig_connector;
1907                         if (i2c_bus->valid) {
1908                                 amdgpu_connector->ddc_bus = amdgpu_i2c_lookup(adev, i2c_bus);
1909                                 if (amdgpu_connector->ddc_bus) {
1910                                         has_aux = true;
1911                                         ddc = &amdgpu_connector->ddc_bus->adapter;
1912                                 } else {
1913                                         DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1914                                 }
1915                         }
1916                         drm_connector_init_with_ddc(dev, &amdgpu_connector->base,
1917                                                     &amdgpu_connector_dp_funcs,
1918                                                     connector_type,
1919                                                     ddc);
1920                         drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_dp_helper_funcs);
1921                         subpixel_order = SubPixelHorizontalRGB;
1922                         drm_object_attach_property(&amdgpu_connector->base.base,
1923                                                       adev->mode_info.coherent_mode_property,
1924                                                       1);
1925                         drm_object_attach_property(&amdgpu_connector->base.base,
1926                                                    adev->mode_info.underscan_property,
1927                                                    UNDERSCAN_OFF);
1928                         drm_object_attach_property(&amdgpu_connector->base.base,
1929                                                    adev->mode_info.underscan_hborder_property,
1930                                                    0);
1931                         drm_object_attach_property(&amdgpu_connector->base.base,
1932                                                    adev->mode_info.underscan_vborder_property,
1933                                                    0);
1934                         drm_object_attach_property(&amdgpu_connector->base.base,
1935                                                    dev->mode_config.scaling_mode_property,
1936                                                    DRM_MODE_SCALE_NONE);
1937                         if (amdgpu_audio != 0) {
1938                                 drm_object_attach_property(&amdgpu_connector->base.base,
1939                                                            adev->mode_info.audio_property,
1940                                                            AMDGPU_AUDIO_AUTO);
1941                                 amdgpu_connector->audio = AMDGPU_AUDIO_AUTO;
1942                         }
1943                         drm_object_attach_property(&amdgpu_connector->base.base,
1944                                                    adev->mode_info.dither_property,
1945                                                    AMDGPU_FMT_DITHER_DISABLE);
1946                         connector->interlace_allowed = true;
1947                         /* in theory with a DP to VGA converter... */
1948                         connector->doublescan_allowed = false;
1949                         break;
1950                 case DRM_MODE_CONNECTOR_eDP:
1951                         amdgpu_dig_connector = kzalloc(sizeof(struct amdgpu_connector_atom_dig), GFP_KERNEL);
1952                         if (!amdgpu_dig_connector)
1953                                 goto failed;
1954                         amdgpu_connector->con_priv = amdgpu_dig_connector;
1955                         if (i2c_bus->valid) {
1956                                 amdgpu_connector->ddc_bus = amdgpu_i2c_lookup(adev, i2c_bus);
1957                                 if (amdgpu_connector->ddc_bus) {
1958                                         has_aux = true;
1959                                         ddc = &amdgpu_connector->ddc_bus->adapter;
1960                                 } else {
1961                                         DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1962                                 }
1963                         }
1964                         drm_connector_init_with_ddc(dev, &amdgpu_connector->base,
1965                                                     &amdgpu_connector_edp_funcs,
1966                                                     connector_type,
1967                                                     ddc);
1968                         drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_dp_helper_funcs);
1969                         drm_object_attach_property(&amdgpu_connector->base.base,
1970                                                       dev->mode_config.scaling_mode_property,
1971                                                       DRM_MODE_SCALE_FULLSCREEN);
1972                         subpixel_order = SubPixelHorizontalRGB;
1973                         connector->interlace_allowed = false;
1974                         connector->doublescan_allowed = false;
1975                         break;
1976                 case DRM_MODE_CONNECTOR_LVDS:
1977                         amdgpu_dig_connector = kzalloc(sizeof(struct amdgpu_connector_atom_dig), GFP_KERNEL);
1978                         if (!amdgpu_dig_connector)
1979                                 goto failed;
1980                         amdgpu_connector->con_priv = amdgpu_dig_connector;
1981                         if (i2c_bus->valid) {
1982                                 amdgpu_connector->ddc_bus = amdgpu_i2c_lookup(adev, i2c_bus);
1983                                 if (!amdgpu_connector->ddc_bus)
1984                                         DRM_ERROR("LVDS: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1985                                 else
1986                                         ddc = &amdgpu_connector->ddc_bus->adapter;
1987                         }
1988                         drm_connector_init_with_ddc(dev, &amdgpu_connector->base,
1989                                                     &amdgpu_connector_lvds_funcs,
1990                                                     connector_type,
1991                                                     ddc);
1992                         drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_lvds_helper_funcs);
1993                         drm_object_attach_property(&amdgpu_connector->base.base,
1994                                                       dev->mode_config.scaling_mode_property,
1995                                                       DRM_MODE_SCALE_FULLSCREEN);
1996                         subpixel_order = SubPixelHorizontalRGB;
1997                         connector->interlace_allowed = false;
1998                         connector->doublescan_allowed = false;
1999                         break;
2000                 }
2001         }
2002
2003         if (amdgpu_connector->hpd.hpd == AMDGPU_HPD_NONE) {
2004                 if (i2c_bus->valid) {
2005                         connector->polled = DRM_CONNECTOR_POLL_CONNECT |
2006                                                 DRM_CONNECTOR_POLL_DISCONNECT;
2007                 }
2008         } else
2009                 connector->polled = DRM_CONNECTOR_POLL_HPD;
2010
2011         connector->display_info.subpixel_order = subpixel_order;
2012
2013         if (has_aux)
2014                 amdgpu_atombios_dp_aux_init(amdgpu_connector);
2015
2016         if (connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
2017             connector_type == DRM_MODE_CONNECTOR_eDP) {
2018                 drm_connector_attach_dp_subconnector_property(&amdgpu_connector->base);
2019         }
2020
2021         return;
2022
2023 failed:
2024         drm_connector_cleanup(connector);
2025         kfree(connector);
2026 }
This page took 0.159813 seconds and 4 git commands to generate.