1 1.7 riastrad /* $NetBSD: nouveau_connector.c,v 1.7 2021/12/19 10:49:21 riastradh Exp $ */ 2 1.2 riastrad 3 1.1 riastrad /* 4 1.1 riastrad * Copyright (C) 2008 Maarten Maathuis. 5 1.1 riastrad * All Rights Reserved. 6 1.1 riastrad * 7 1.1 riastrad * Permission is hereby granted, free of charge, to any person obtaining 8 1.1 riastrad * a copy of this software and associated documentation files (the 9 1.1 riastrad * "Software"), to deal in the Software without restriction, including 10 1.1 riastrad * without limitation the rights to use, copy, modify, merge, publish, 11 1.1 riastrad * distribute, sublicense, and/or sell copies of the Software, and to 12 1.1 riastrad * permit persons to whom the Software is furnished to do so, subject to 13 1.1 riastrad * the following conditions: 14 1.1 riastrad * 15 1.1 riastrad * The above copyright notice and this permission notice (including the 16 1.1 riastrad * next paragraph) shall be included in all copies or substantial 17 1.1 riastrad * portions of the Software. 18 1.1 riastrad * 19 1.1 riastrad * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 1.1 riastrad * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21 1.1 riastrad * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 22 1.1 riastrad * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 23 1.1 riastrad * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 24 1.1 riastrad * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 25 1.1 riastrad * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 26 1.1 riastrad * 27 1.1 riastrad */ 28 1.1 riastrad 29 1.2 riastrad #include <sys/cdefs.h> 30 1.7 riastrad __KERNEL_RCSID(0, "$NetBSD: nouveau_connector.c,v 1.7 2021/12/19 10:49:21 riastradh Exp $"); 31 1.2 riastrad 32 1.1 riastrad #include <acpi/button.h> 33 1.1 riastrad 34 1.1 riastrad #include <linux/pm_runtime.h> 35 1.6 riastrad #include <linux/vga_switcheroo.h> 36 1.1 riastrad 37 1.6 riastrad #include <drm/drm_atomic_helper.h> 38 1.1 riastrad #include <drm/drm_edid.h> 39 1.1 riastrad #include <drm/drm_crtc_helper.h> 40 1.6 riastrad #include <drm/drm_probe_helper.h> 41 1.6 riastrad #include <drm/drm_atomic.h> 42 1.1 riastrad 43 1.1 riastrad #include "nouveau_reg.h" 44 1.6 riastrad #include "nouveau_drv.h" 45 1.1 riastrad #include "dispnv04/hw.h" 46 1.1 riastrad #include "nouveau_acpi.h" 47 1.1 riastrad 48 1.1 riastrad #include "nouveau_display.h" 49 1.1 riastrad #include "nouveau_connector.h" 50 1.1 riastrad #include "nouveau_encoder.h" 51 1.1 riastrad #include "nouveau_crtc.h" 52 1.1 riastrad 53 1.6 riastrad #include <nvif/class.h> 54 1.6 riastrad #include <nvif/cl0046.h> 55 1.4 riastrad #include <nvif/event.h> 56 1.1 riastrad 57 1.6 riastrad struct drm_display_mode * 58 1.6 riastrad nouveau_conn_native_mode(struct drm_connector *connector) 59 1.6 riastrad { 60 1.6 riastrad const struct drm_connector_helper_funcs *helper = connector->helper_private; 61 1.6 riastrad struct nouveau_drm *drm = nouveau_drm(connector->dev); 62 1.6 riastrad struct drm_device *dev = connector->dev; 63 1.6 riastrad struct drm_display_mode *mode, *largest = NULL; 64 1.6 riastrad int high_w = 0, high_h = 0, high_v = 0; 65 1.6 riastrad 66 1.6 riastrad list_for_each_entry(mode, &connector->probed_modes, head) { 67 1.6 riastrad mode->vrefresh = drm_mode_vrefresh(mode); 68 1.6 riastrad if (helper->mode_valid(connector, mode) != MODE_OK || 69 1.6 riastrad (mode->flags & DRM_MODE_FLAG_INTERLACE)) 70 1.6 riastrad continue; 71 1.6 riastrad 72 1.6 riastrad /* Use preferred mode if there is one.. */ 73 1.6 riastrad if (mode->type & DRM_MODE_TYPE_PREFERRED) { 74 1.6 riastrad NV_DEBUG(drm, "native mode from preferred\n"); 75 1.6 riastrad return drm_mode_duplicate(dev, mode); 76 1.6 riastrad } 77 1.6 riastrad 78 1.6 riastrad /* Otherwise, take the resolution with the largest width, then 79 1.6 riastrad * height, then vertical refresh 80 1.6 riastrad */ 81 1.6 riastrad if (mode->hdisplay < high_w) 82 1.6 riastrad continue; 83 1.6 riastrad 84 1.6 riastrad if (mode->hdisplay == high_w && mode->vdisplay < high_h) 85 1.6 riastrad continue; 86 1.6 riastrad 87 1.6 riastrad if (mode->hdisplay == high_w && mode->vdisplay == high_h && 88 1.6 riastrad mode->vrefresh < high_v) 89 1.6 riastrad continue; 90 1.6 riastrad 91 1.6 riastrad high_w = mode->hdisplay; 92 1.6 riastrad high_h = mode->vdisplay; 93 1.6 riastrad high_v = mode->vrefresh; 94 1.6 riastrad largest = mode; 95 1.6 riastrad } 96 1.6 riastrad 97 1.6 riastrad NV_DEBUG(drm, "native mode from largest: %dx%d@%d\n", 98 1.6 riastrad high_w, high_h, high_v); 99 1.6 riastrad return largest ? drm_mode_duplicate(dev, largest) : NULL; 100 1.6 riastrad } 101 1.6 riastrad 102 1.6 riastrad int 103 1.6 riastrad nouveau_conn_atomic_get_property(struct drm_connector *connector, 104 1.6 riastrad const struct drm_connector_state *state, 105 1.6 riastrad struct drm_property *property, u64 *val) 106 1.6 riastrad { 107 1.7 riastrad const struct nouveau_conn_atom *asyc = nouveau_conn_atom_const(state); 108 1.6 riastrad struct nouveau_display *disp = nouveau_display(connector->dev); 109 1.6 riastrad struct drm_device *dev = connector->dev; 110 1.6 riastrad 111 1.6 riastrad if (property == dev->mode_config.scaling_mode_property) 112 1.6 riastrad *val = asyc->scaler.mode; 113 1.6 riastrad else if (property == disp->underscan_property) 114 1.6 riastrad *val = asyc->scaler.underscan.mode; 115 1.6 riastrad else if (property == disp->underscan_hborder_property) 116 1.6 riastrad *val = asyc->scaler.underscan.hborder; 117 1.6 riastrad else if (property == disp->underscan_vborder_property) 118 1.6 riastrad *val = asyc->scaler.underscan.vborder; 119 1.6 riastrad else if (property == disp->dithering_mode) 120 1.6 riastrad *val = asyc->dither.mode; 121 1.6 riastrad else if (property == disp->dithering_depth) 122 1.6 riastrad *val = asyc->dither.depth; 123 1.6 riastrad else if (property == disp->vibrant_hue_property) 124 1.6 riastrad *val = asyc->procamp.vibrant_hue; 125 1.6 riastrad else if (property == disp->color_vibrance_property) 126 1.6 riastrad *val = asyc->procamp.color_vibrance; 127 1.6 riastrad else 128 1.6 riastrad return -EINVAL; 129 1.6 riastrad 130 1.6 riastrad return 0; 131 1.6 riastrad } 132 1.6 riastrad 133 1.6 riastrad int 134 1.6 riastrad nouveau_conn_atomic_set_property(struct drm_connector *connector, 135 1.6 riastrad struct drm_connector_state *state, 136 1.6 riastrad struct drm_property *property, u64 val) 137 1.6 riastrad { 138 1.6 riastrad struct drm_device *dev = connector->dev; 139 1.6 riastrad struct nouveau_conn_atom *asyc = nouveau_conn_atom(state); 140 1.6 riastrad struct nouveau_display *disp = nouveau_display(dev); 141 1.6 riastrad 142 1.6 riastrad if (property == dev->mode_config.scaling_mode_property) { 143 1.6 riastrad switch (val) { 144 1.6 riastrad case DRM_MODE_SCALE_NONE: 145 1.6 riastrad /* We allow 'None' for EDID modes, even on a fixed 146 1.6 riastrad * panel (some exist with support for lower refresh 147 1.6 riastrad * rates, which people might want to use for power- 148 1.6 riastrad * saving purposes). 149 1.6 riastrad * 150 1.6 riastrad * Non-EDID modes will force the use of GPU scaling 151 1.6 riastrad * to the native mode regardless of this setting. 152 1.6 riastrad */ 153 1.6 riastrad switch (connector->connector_type) { 154 1.6 riastrad case DRM_MODE_CONNECTOR_LVDS: 155 1.6 riastrad case DRM_MODE_CONNECTOR_eDP: 156 1.6 riastrad /* ... except prior to G80, where the code 157 1.6 riastrad * doesn't support such things. 158 1.6 riastrad */ 159 1.6 riastrad if (disp->disp.object.oclass < NV50_DISP) 160 1.6 riastrad return -EINVAL; 161 1.6 riastrad break; 162 1.6 riastrad default: 163 1.6 riastrad break; 164 1.6 riastrad } 165 1.6 riastrad case DRM_MODE_SCALE_FULLSCREEN: 166 1.6 riastrad case DRM_MODE_SCALE_CENTER: 167 1.6 riastrad case DRM_MODE_SCALE_ASPECT: 168 1.6 riastrad break; 169 1.6 riastrad default: 170 1.6 riastrad return -EINVAL; 171 1.6 riastrad } 172 1.6 riastrad 173 1.6 riastrad if (asyc->scaler.mode != val) { 174 1.6 riastrad asyc->scaler.mode = val; 175 1.6 riastrad asyc->set.scaler = true; 176 1.6 riastrad } 177 1.6 riastrad } else 178 1.6 riastrad if (property == disp->underscan_property) { 179 1.6 riastrad if (asyc->scaler.underscan.mode != val) { 180 1.6 riastrad asyc->scaler.underscan.mode = val; 181 1.6 riastrad asyc->set.scaler = true; 182 1.6 riastrad } 183 1.6 riastrad } else 184 1.6 riastrad if (property == disp->underscan_hborder_property) { 185 1.6 riastrad if (asyc->scaler.underscan.hborder != val) { 186 1.6 riastrad asyc->scaler.underscan.hborder = val; 187 1.6 riastrad asyc->set.scaler = true; 188 1.6 riastrad } 189 1.6 riastrad } else 190 1.6 riastrad if (property == disp->underscan_vborder_property) { 191 1.6 riastrad if (asyc->scaler.underscan.vborder != val) { 192 1.6 riastrad asyc->scaler.underscan.vborder = val; 193 1.6 riastrad asyc->set.scaler = true; 194 1.6 riastrad } 195 1.6 riastrad } else 196 1.6 riastrad if (property == disp->dithering_mode) { 197 1.6 riastrad if (asyc->dither.mode != val) { 198 1.6 riastrad asyc->dither.mode = val; 199 1.6 riastrad asyc->set.dither = true; 200 1.6 riastrad } 201 1.6 riastrad } else 202 1.6 riastrad if (property == disp->dithering_depth) { 203 1.6 riastrad if (asyc->dither.mode != val) { 204 1.6 riastrad asyc->dither.depth = val; 205 1.6 riastrad asyc->set.dither = true; 206 1.6 riastrad } 207 1.6 riastrad } else 208 1.6 riastrad if (property == disp->vibrant_hue_property) { 209 1.6 riastrad if (asyc->procamp.vibrant_hue != val) { 210 1.6 riastrad asyc->procamp.vibrant_hue = val; 211 1.6 riastrad asyc->set.procamp = true; 212 1.6 riastrad } 213 1.6 riastrad } else 214 1.6 riastrad if (property == disp->color_vibrance_property) { 215 1.6 riastrad if (asyc->procamp.color_vibrance != val) { 216 1.6 riastrad asyc->procamp.color_vibrance = val; 217 1.6 riastrad asyc->set.procamp = true; 218 1.6 riastrad } 219 1.6 riastrad } else { 220 1.6 riastrad return -EINVAL; 221 1.6 riastrad } 222 1.6 riastrad 223 1.6 riastrad return 0; 224 1.6 riastrad } 225 1.6 riastrad 226 1.6 riastrad void 227 1.6 riastrad nouveau_conn_atomic_destroy_state(struct drm_connector *connector, 228 1.6 riastrad struct drm_connector_state *state) 229 1.6 riastrad { 230 1.6 riastrad struct nouveau_conn_atom *asyc = nouveau_conn_atom(state); 231 1.6 riastrad __drm_atomic_helper_connector_destroy_state(&asyc->state); 232 1.6 riastrad kfree(asyc); 233 1.6 riastrad } 234 1.6 riastrad 235 1.6 riastrad struct drm_connector_state * 236 1.6 riastrad nouveau_conn_atomic_duplicate_state(struct drm_connector *connector) 237 1.6 riastrad { 238 1.6 riastrad struct nouveau_conn_atom *armc = nouveau_conn_atom(connector->state); 239 1.6 riastrad struct nouveau_conn_atom *asyc; 240 1.6 riastrad if (!(asyc = kmalloc(sizeof(*asyc), GFP_KERNEL))) 241 1.6 riastrad return NULL; 242 1.6 riastrad __drm_atomic_helper_connector_duplicate_state(connector, &asyc->state); 243 1.6 riastrad asyc->dither = armc->dither; 244 1.6 riastrad asyc->scaler = armc->scaler; 245 1.6 riastrad asyc->procamp = armc->procamp; 246 1.6 riastrad asyc->set.mask = 0; 247 1.6 riastrad return &asyc->state; 248 1.6 riastrad } 249 1.6 riastrad 250 1.6 riastrad void 251 1.6 riastrad nouveau_conn_reset(struct drm_connector *connector) 252 1.6 riastrad { 253 1.6 riastrad struct nouveau_connector *nv_connector = nouveau_connector(connector); 254 1.6 riastrad struct nouveau_conn_atom *asyc; 255 1.6 riastrad 256 1.6 riastrad if (drm_drv_uses_atomic_modeset(connector->dev)) { 257 1.6 riastrad if (WARN_ON(!(asyc = kzalloc(sizeof(*asyc), GFP_KERNEL)))) 258 1.6 riastrad return; 259 1.6 riastrad 260 1.6 riastrad if (connector->state) 261 1.6 riastrad nouveau_conn_atomic_destroy_state(connector, 262 1.6 riastrad connector->state); 263 1.6 riastrad 264 1.6 riastrad __drm_atomic_helper_connector_reset(connector, &asyc->state); 265 1.6 riastrad } else { 266 1.6 riastrad asyc = &nv_connector->properties_state; 267 1.6 riastrad } 268 1.6 riastrad 269 1.6 riastrad asyc->dither.mode = DITHERING_MODE_AUTO; 270 1.6 riastrad asyc->dither.depth = DITHERING_DEPTH_AUTO; 271 1.6 riastrad asyc->scaler.mode = DRM_MODE_SCALE_NONE; 272 1.6 riastrad asyc->scaler.underscan.mode = UNDERSCAN_OFF; 273 1.6 riastrad asyc->procamp.color_vibrance = 150; 274 1.6 riastrad asyc->procamp.vibrant_hue = 90; 275 1.6 riastrad 276 1.6 riastrad if (nouveau_display(connector->dev)->disp.object.oclass < NV50_DISP) { 277 1.6 riastrad switch (connector->connector_type) { 278 1.6 riastrad case DRM_MODE_CONNECTOR_LVDS: 279 1.6 riastrad /* See note in nouveau_conn_atomic_set_property(). */ 280 1.6 riastrad asyc->scaler.mode = DRM_MODE_SCALE_FULLSCREEN; 281 1.6 riastrad break; 282 1.6 riastrad default: 283 1.6 riastrad break; 284 1.6 riastrad } 285 1.6 riastrad } 286 1.6 riastrad } 287 1.6 riastrad 288 1.6 riastrad void 289 1.6 riastrad nouveau_conn_attach_properties(struct drm_connector *connector) 290 1.6 riastrad { 291 1.6 riastrad struct drm_device *dev = connector->dev; 292 1.6 riastrad struct nouveau_display *disp = nouveau_display(dev); 293 1.6 riastrad struct nouveau_connector *nv_connector = nouveau_connector(connector); 294 1.6 riastrad struct nouveau_conn_atom *armc; 295 1.6 riastrad 296 1.6 riastrad if (drm_drv_uses_atomic_modeset(connector->dev)) 297 1.6 riastrad armc = nouveau_conn_atom(connector->state); 298 1.6 riastrad else 299 1.6 riastrad armc = &nv_connector->properties_state; 300 1.6 riastrad 301 1.6 riastrad /* Init DVI-I specific properties. */ 302 1.6 riastrad if (connector->connector_type == DRM_MODE_CONNECTOR_DVII) 303 1.6 riastrad drm_object_attach_property(&connector->base, dev->mode_config. 304 1.6 riastrad dvi_i_subconnector_property, 0); 305 1.6 riastrad 306 1.6 riastrad /* Add overscan compensation options to digital outputs. */ 307 1.6 riastrad if (disp->underscan_property && 308 1.6 riastrad (connector->connector_type == DRM_MODE_CONNECTOR_DVID || 309 1.6 riastrad connector->connector_type == DRM_MODE_CONNECTOR_DVII || 310 1.6 riastrad connector->connector_type == DRM_MODE_CONNECTOR_HDMIA || 311 1.6 riastrad connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort)) { 312 1.6 riastrad drm_object_attach_property(&connector->base, 313 1.6 riastrad disp->underscan_property, 314 1.6 riastrad UNDERSCAN_OFF); 315 1.6 riastrad drm_object_attach_property(&connector->base, 316 1.6 riastrad disp->underscan_hborder_property, 0); 317 1.6 riastrad drm_object_attach_property(&connector->base, 318 1.6 riastrad disp->underscan_vborder_property, 0); 319 1.6 riastrad } 320 1.6 riastrad 321 1.6 riastrad /* Add hue and saturation options. */ 322 1.6 riastrad if (disp->vibrant_hue_property) 323 1.6 riastrad drm_object_attach_property(&connector->base, 324 1.6 riastrad disp->vibrant_hue_property, 325 1.6 riastrad armc->procamp.vibrant_hue); 326 1.6 riastrad if (disp->color_vibrance_property) 327 1.6 riastrad drm_object_attach_property(&connector->base, 328 1.6 riastrad disp->color_vibrance_property, 329 1.6 riastrad armc->procamp.color_vibrance); 330 1.6 riastrad 331 1.6 riastrad /* Scaling mode property. */ 332 1.6 riastrad switch (connector->connector_type) { 333 1.6 riastrad case DRM_MODE_CONNECTOR_TV: 334 1.6 riastrad break; 335 1.6 riastrad case DRM_MODE_CONNECTOR_VGA: 336 1.6 riastrad if (disp->disp.object.oclass < NV50_DISP) 337 1.6 riastrad break; /* Can only scale on DFPs. */ 338 1.6 riastrad /* Fall-through. */ 339 1.6 riastrad default: 340 1.6 riastrad drm_object_attach_property(&connector->base, dev->mode_config. 341 1.6 riastrad scaling_mode_property, 342 1.6 riastrad armc->scaler.mode); 343 1.6 riastrad break; 344 1.6 riastrad } 345 1.6 riastrad 346 1.6 riastrad /* Dithering properties. */ 347 1.6 riastrad switch (connector->connector_type) { 348 1.6 riastrad case DRM_MODE_CONNECTOR_TV: 349 1.6 riastrad case DRM_MODE_CONNECTOR_VGA: 350 1.6 riastrad break; 351 1.6 riastrad default: 352 1.6 riastrad if (disp->dithering_mode) { 353 1.6 riastrad drm_object_attach_property(&connector->base, 354 1.6 riastrad disp->dithering_mode, 355 1.6 riastrad armc->dither.mode); 356 1.6 riastrad } 357 1.6 riastrad if (disp->dithering_depth) { 358 1.6 riastrad drm_object_attach_property(&connector->base, 359 1.6 riastrad disp->dithering_depth, 360 1.6 riastrad armc->dither.depth); 361 1.6 riastrad } 362 1.6 riastrad break; 363 1.6 riastrad } 364 1.6 riastrad } 365 1.6 riastrad 366 1.1 riastrad MODULE_PARM_DESC(tv_disable, "Disable TV-out detection"); 367 1.4 riastrad int nouveau_tv_disable = 0; 368 1.1 riastrad module_param_named(tv_disable, nouveau_tv_disable, int, 0400); 369 1.1 riastrad 370 1.2 riastrad #if defined(CONFIG_ACPI_BUTTON) || \ 371 1.2 riastrad (defined(CONFIG_ACPI_BUTTON_MODULE) && defined(MODULE)) 372 1.1 riastrad MODULE_PARM_DESC(ignorelid, "Ignore ACPI lid status"); 373 1.4 riastrad int nouveau_ignorelid = 0; 374 1.1 riastrad module_param_named(ignorelid, nouveau_ignorelid, int, 0400); 375 1.2 riastrad #endif 376 1.1 riastrad 377 1.1 riastrad MODULE_PARM_DESC(duallink, "Allow dual-link TMDS (default: enabled)"); 378 1.4 riastrad int nouveau_duallink = 1; 379 1.1 riastrad module_param_named(duallink, nouveau_duallink, int, 0400); 380 1.1 riastrad 381 1.6 riastrad MODULE_PARM_DESC(hdmimhz, "Force a maximum HDMI pixel clock (in MHz)"); 382 1.6 riastrad int nouveau_hdmimhz = 0; 383 1.6 riastrad module_param_named(hdmimhz, nouveau_hdmimhz, int, 0400); 384 1.6 riastrad 385 1.1 riastrad struct nouveau_encoder * 386 1.1 riastrad find_encoder(struct drm_connector *connector, int type) 387 1.1 riastrad { 388 1.1 riastrad struct nouveau_encoder *nv_encoder; 389 1.4 riastrad struct drm_encoder *enc; 390 1.1 riastrad 391 1.6 riastrad drm_connector_for_each_possible_encoder(connector, enc) { 392 1.4 riastrad nv_encoder = nouveau_encoder(enc); 393 1.1 riastrad 394 1.4 riastrad if (type == DCB_OUTPUT_ANY || 395 1.4 riastrad (nv_encoder->dcb && nv_encoder->dcb->type == type)) 396 1.1 riastrad return nv_encoder; 397 1.1 riastrad } 398 1.1 riastrad 399 1.1 riastrad return NULL; 400 1.1 riastrad } 401 1.1 riastrad 402 1.1 riastrad struct nouveau_connector * 403 1.1 riastrad nouveau_encoder_connector_get(struct nouveau_encoder *encoder) 404 1.1 riastrad { 405 1.1 riastrad struct drm_device *dev = to_drm_encoder(encoder)->dev; 406 1.1 riastrad struct drm_connector *drm_connector; 407 1.1 riastrad 408 1.1 riastrad list_for_each_entry(drm_connector, &dev->mode_config.connector_list, head) { 409 1.1 riastrad if (drm_connector->encoder == to_drm_encoder(encoder)) 410 1.1 riastrad return nouveau_connector(drm_connector); 411 1.1 riastrad } 412 1.1 riastrad 413 1.1 riastrad return NULL; 414 1.1 riastrad } 415 1.1 riastrad 416 1.1 riastrad static void 417 1.1 riastrad nouveau_connector_destroy(struct drm_connector *connector) 418 1.1 riastrad { 419 1.1 riastrad struct nouveau_connector *nv_connector = nouveau_connector(connector); 420 1.4 riastrad nvif_notify_fini(&nv_connector->hpd); 421 1.1 riastrad kfree(nv_connector->edid); 422 1.4 riastrad drm_connector_unregister(connector); 423 1.1 riastrad drm_connector_cleanup(connector); 424 1.6 riastrad if (nv_connector->aux.transfer) { 425 1.6 riastrad drm_dp_cec_unregister_connector(&nv_connector->aux); 426 1.4 riastrad drm_dp_aux_unregister(&nv_connector->aux); 427 1.7 riastrad kfree(__UNCONST(nv_connector->aux.name)); 428 1.6 riastrad } 429 1.1 riastrad kfree(connector); 430 1.1 riastrad } 431 1.1 riastrad 432 1.4 riastrad static struct nouveau_encoder * 433 1.4 riastrad nouveau_connector_ddc_detect(struct drm_connector *connector) 434 1.1 riastrad { 435 1.1 riastrad struct drm_device *dev = connector->dev; 436 1.6 riastrad struct nouveau_encoder *nv_encoder = NULL, *found = NULL; 437 1.4 riastrad struct drm_encoder *encoder; 438 1.6 riastrad int ret; 439 1.6 riastrad bool switcheroo_ddc = false; 440 1.1 riastrad 441 1.6 riastrad drm_connector_for_each_possible_encoder(connector, encoder) { 442 1.6 riastrad nv_encoder = nouveau_encoder(encoder); 443 1.6 riastrad 444 1.6 riastrad switch (nv_encoder->dcb->type) { 445 1.6 riastrad case DCB_OUTPUT_DP: 446 1.6 riastrad ret = nouveau_dp_detect(nv_encoder); 447 1.6 riastrad if (ret == NOUVEAU_DP_MST) 448 1.6 riastrad return NULL; 449 1.6 riastrad else if (ret == NOUVEAU_DP_SST) 450 1.6 riastrad found = nv_encoder; 451 1.1 riastrad 452 1.1 riastrad break; 453 1.6 riastrad case DCB_OUTPUT_LVDS: 454 1.6 riastrad switcheroo_ddc = !!(vga_switcheroo_handler_flags() & 455 1.6 riastrad VGA_SWITCHEROO_CAN_SWITCH_DDC); 456 1.6 riastrad /* fall-through */ 457 1.6 riastrad default: 458 1.6 riastrad if (!nv_encoder->i2c) 459 1.6 riastrad break; 460 1.1 riastrad 461 1.7 riastrad #ifdef __NetBSD__ 462 1.7 riastrad __USE(switcheroo_ddc); 463 1.7 riastrad __USE(dev); 464 1.7 riastrad #else 465 1.6 riastrad if (switcheroo_ddc) 466 1.6 riastrad vga_switcheroo_lock_ddc(dev->pdev); 467 1.7 riastrad #endif 468 1.6 riastrad if (nvkm_probe_i2c(nv_encoder->i2c, 0x50)) 469 1.6 riastrad found = nv_encoder; 470 1.7 riastrad #ifndef __NetBSD__ 471 1.6 riastrad if (switcheroo_ddc) 472 1.6 riastrad vga_switcheroo_unlock_ddc(dev->pdev); 473 1.7 riastrad #endif 474 1.1 riastrad 475 1.6 riastrad break; 476 1.1 riastrad } 477 1.6 riastrad if (found) 478 1.6 riastrad break; 479 1.1 riastrad } 480 1.1 riastrad 481 1.6 riastrad return found; 482 1.1 riastrad } 483 1.1 riastrad 484 1.1 riastrad static struct nouveau_encoder * 485 1.1 riastrad nouveau_connector_of_detect(struct drm_connector *connector) 486 1.1 riastrad { 487 1.1 riastrad #ifdef __powerpc__ 488 1.1 riastrad struct drm_device *dev = connector->dev; 489 1.1 riastrad struct nouveau_connector *nv_connector = nouveau_connector(connector); 490 1.1 riastrad struct nouveau_encoder *nv_encoder; 491 1.1 riastrad struct device_node *cn, *dn = pci_device_to_OF_node(dev->pdev); 492 1.1 riastrad 493 1.1 riastrad if (!dn || 494 1.1 riastrad !((nv_encoder = find_encoder(connector, DCB_OUTPUT_TMDS)) || 495 1.1 riastrad (nv_encoder = find_encoder(connector, DCB_OUTPUT_ANALOG)))) 496 1.1 riastrad return NULL; 497 1.1 riastrad 498 1.1 riastrad for_each_child_of_node(dn, cn) { 499 1.1 riastrad const char *name = of_get_property(cn, "name", NULL); 500 1.1 riastrad const void *edid = of_get_property(cn, "EDID", NULL); 501 1.1 riastrad int idx = name ? name[strlen(name) - 1] - 'A' : 0; 502 1.1 riastrad 503 1.1 riastrad if (nv_encoder->dcb->i2c_index == idx && edid) { 504 1.1 riastrad nv_connector->edid = 505 1.1 riastrad kmemdup(edid, EDID_LENGTH, GFP_KERNEL); 506 1.1 riastrad of_node_put(cn); 507 1.1 riastrad return nv_encoder; 508 1.1 riastrad } 509 1.1 riastrad } 510 1.1 riastrad #endif 511 1.1 riastrad return NULL; 512 1.1 riastrad } 513 1.1 riastrad 514 1.1 riastrad static void 515 1.1 riastrad nouveau_connector_set_encoder(struct drm_connector *connector, 516 1.1 riastrad struct nouveau_encoder *nv_encoder) 517 1.1 riastrad { 518 1.1 riastrad struct nouveau_connector *nv_connector = nouveau_connector(connector); 519 1.1 riastrad struct nouveau_drm *drm = nouveau_drm(connector->dev); 520 1.1 riastrad struct drm_device *dev = connector->dev; 521 1.1 riastrad 522 1.1 riastrad if (nv_connector->detected_encoder == nv_encoder) 523 1.1 riastrad return; 524 1.1 riastrad nv_connector->detected_encoder = nv_encoder; 525 1.1 riastrad 526 1.6 riastrad if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_TESLA) { 527 1.1 riastrad connector->interlace_allowed = true; 528 1.1 riastrad connector->doublescan_allowed = true; 529 1.1 riastrad } else 530 1.1 riastrad if (nv_encoder->dcb->type == DCB_OUTPUT_LVDS || 531 1.1 riastrad nv_encoder->dcb->type == DCB_OUTPUT_TMDS) { 532 1.1 riastrad connector->doublescan_allowed = false; 533 1.1 riastrad connector->interlace_allowed = false; 534 1.1 riastrad } else { 535 1.1 riastrad connector->doublescan_allowed = true; 536 1.6 riastrad if (drm->client.device.info.family == NV_DEVICE_INFO_V0_KELVIN || 537 1.6 riastrad (drm->client.device.info.family == NV_DEVICE_INFO_V0_CELSIUS && 538 1.1 riastrad (dev->pdev->device & 0x0ff0) != 0x0100 && 539 1.1 riastrad (dev->pdev->device & 0x0ff0) != 0x0150)) 540 1.1 riastrad /* HW is broken */ 541 1.1 riastrad connector->interlace_allowed = false; 542 1.1 riastrad else 543 1.1 riastrad connector->interlace_allowed = true; 544 1.1 riastrad } 545 1.1 riastrad 546 1.1 riastrad if (nv_connector->type == DCB_CONNECTOR_DVI_I) { 547 1.1 riastrad drm_object_property_set_value(&connector->base, 548 1.1 riastrad dev->mode_config.dvi_i_subconnector_property, 549 1.1 riastrad nv_encoder->dcb->type == DCB_OUTPUT_TMDS ? 550 1.1 riastrad DRM_MODE_SUBCONNECTOR_DVID : 551 1.1 riastrad DRM_MODE_SUBCONNECTOR_DVIA); 552 1.1 riastrad } 553 1.1 riastrad } 554 1.1 riastrad 555 1.1 riastrad static enum drm_connector_status 556 1.1 riastrad nouveau_connector_detect(struct drm_connector *connector, bool force) 557 1.1 riastrad { 558 1.1 riastrad struct drm_device *dev = connector->dev; 559 1.1 riastrad struct nouveau_drm *drm = nouveau_drm(dev); 560 1.1 riastrad struct nouveau_connector *nv_connector = nouveau_connector(connector); 561 1.1 riastrad struct nouveau_encoder *nv_encoder = NULL; 562 1.1 riastrad struct nouveau_encoder *nv_partner; 563 1.4 riastrad struct i2c_adapter *i2c; 564 1.1 riastrad int type; 565 1.1 riastrad int ret; 566 1.1 riastrad enum drm_connector_status conn_status = connector_status_disconnected; 567 1.1 riastrad 568 1.1 riastrad /* Cleanup the previous EDID block. */ 569 1.1 riastrad if (nv_connector->edid) { 570 1.6 riastrad drm_connector_update_edid_property(connector, NULL); 571 1.1 riastrad kfree(nv_connector->edid); 572 1.1 riastrad nv_connector->edid = NULL; 573 1.1 riastrad } 574 1.1 riastrad 575 1.6 riastrad /* Outputs are only polled while runtime active, so resuming the 576 1.6 riastrad * device here is unnecessary (and would deadlock upon runtime suspend 577 1.6 riastrad * because it waits for polling to finish). We do however, want to 578 1.6 riastrad * prevent the autosuspend timer from elapsing during this operation 579 1.6 riastrad * if possible. 580 1.4 riastrad */ 581 1.6 riastrad if (drm_kms_helper_is_poll_worker()) { 582 1.6 riastrad pm_runtime_get_noresume(dev->dev); 583 1.6 riastrad } else { 584 1.6 riastrad ret = pm_runtime_get_sync(dev->dev); 585 1.4 riastrad if (ret < 0 && ret != -EACCES) 586 1.4 riastrad return conn_status; 587 1.4 riastrad } 588 1.4 riastrad 589 1.4 riastrad nv_encoder = nouveau_connector_ddc_detect(connector); 590 1.4 riastrad if (nv_encoder && (i2c = nv_encoder->i2c) != NULL) { 591 1.6 riastrad if ((vga_switcheroo_handler_flags() & 592 1.6 riastrad VGA_SWITCHEROO_CAN_SWITCH_DDC) && 593 1.6 riastrad nv_connector->type == DCB_CONNECTOR_LVDS) 594 1.6 riastrad nv_connector->edid = drm_get_edid_switcheroo(connector, 595 1.6 riastrad i2c); 596 1.6 riastrad else 597 1.6 riastrad nv_connector->edid = drm_get_edid(connector, i2c); 598 1.6 riastrad 599 1.6 riastrad drm_connector_update_edid_property(connector, 600 1.1 riastrad nv_connector->edid); 601 1.1 riastrad if (!nv_connector->edid) { 602 1.1 riastrad NV_ERROR(drm, "DDC responded, but no EDID for %s\n", 603 1.4 riastrad connector->name); 604 1.1 riastrad goto detect_analog; 605 1.1 riastrad } 606 1.1 riastrad 607 1.1 riastrad /* Override encoder type for DVI-I based on whether EDID 608 1.1 riastrad * says the display is digital or analog, both use the 609 1.1 riastrad * same i2c channel so the value returned from ddc_detect 610 1.1 riastrad * isn't necessarily correct. 611 1.1 riastrad */ 612 1.1 riastrad nv_partner = NULL; 613 1.1 riastrad if (nv_encoder->dcb->type == DCB_OUTPUT_TMDS) 614 1.1 riastrad nv_partner = find_encoder(connector, DCB_OUTPUT_ANALOG); 615 1.1 riastrad if (nv_encoder->dcb->type == DCB_OUTPUT_ANALOG) 616 1.1 riastrad nv_partner = find_encoder(connector, DCB_OUTPUT_TMDS); 617 1.1 riastrad 618 1.1 riastrad if (nv_partner && ((nv_encoder->dcb->type == DCB_OUTPUT_ANALOG && 619 1.1 riastrad nv_partner->dcb->type == DCB_OUTPUT_TMDS) || 620 1.1 riastrad (nv_encoder->dcb->type == DCB_OUTPUT_TMDS && 621 1.1 riastrad nv_partner->dcb->type == DCB_OUTPUT_ANALOG))) { 622 1.1 riastrad if (nv_connector->edid->input & DRM_EDID_INPUT_DIGITAL) 623 1.1 riastrad type = DCB_OUTPUT_TMDS; 624 1.1 riastrad else 625 1.1 riastrad type = DCB_OUTPUT_ANALOG; 626 1.1 riastrad 627 1.1 riastrad nv_encoder = find_encoder(connector, type); 628 1.3 riastrad BUG_ON(nv_encoder == NULL); 629 1.1 riastrad } 630 1.1 riastrad 631 1.1 riastrad nouveau_connector_set_encoder(connector, nv_encoder); 632 1.1 riastrad conn_status = connector_status_connected; 633 1.6 riastrad drm_dp_cec_set_edid(&nv_connector->aux, nv_connector->edid); 634 1.1 riastrad goto out; 635 1.1 riastrad } 636 1.1 riastrad 637 1.1 riastrad nv_encoder = nouveau_connector_of_detect(connector); 638 1.1 riastrad if (nv_encoder) { 639 1.1 riastrad nouveau_connector_set_encoder(connector, nv_encoder); 640 1.1 riastrad conn_status = connector_status_connected; 641 1.1 riastrad goto out; 642 1.1 riastrad } 643 1.1 riastrad 644 1.1 riastrad detect_analog: 645 1.1 riastrad nv_encoder = find_encoder(connector, DCB_OUTPUT_ANALOG); 646 1.1 riastrad if (!nv_encoder && !nouveau_tv_disable) 647 1.1 riastrad nv_encoder = find_encoder(connector, DCB_OUTPUT_TV); 648 1.1 riastrad if (nv_encoder && force) { 649 1.1 riastrad struct drm_encoder *encoder = to_drm_encoder(nv_encoder); 650 1.4 riastrad const struct drm_encoder_helper_funcs *helper = 651 1.1 riastrad encoder->helper_private; 652 1.1 riastrad 653 1.1 riastrad if (helper->detect(encoder, connector) == 654 1.1 riastrad connector_status_connected) { 655 1.1 riastrad nouveau_connector_set_encoder(connector, nv_encoder); 656 1.1 riastrad conn_status = connector_status_connected; 657 1.1 riastrad goto out; 658 1.1 riastrad } 659 1.1 riastrad 660 1.1 riastrad } 661 1.1 riastrad 662 1.1 riastrad out: 663 1.1 riastrad 664 1.6 riastrad pm_runtime_mark_last_busy(dev->dev); 665 1.6 riastrad pm_runtime_put_autosuspend(dev->dev); 666 1.1 riastrad 667 1.1 riastrad return conn_status; 668 1.1 riastrad } 669 1.1 riastrad 670 1.1 riastrad static enum drm_connector_status 671 1.1 riastrad nouveau_connector_detect_lvds(struct drm_connector *connector, bool force) 672 1.1 riastrad { 673 1.1 riastrad struct drm_device *dev = connector->dev; 674 1.1 riastrad struct nouveau_drm *drm = nouveau_drm(dev); 675 1.1 riastrad struct nouveau_connector *nv_connector = nouveau_connector(connector); 676 1.1 riastrad struct nouveau_encoder *nv_encoder = NULL; 677 1.1 riastrad enum drm_connector_status status = connector_status_disconnected; 678 1.1 riastrad 679 1.1 riastrad /* Cleanup the previous EDID block. */ 680 1.1 riastrad if (nv_connector->edid) { 681 1.6 riastrad drm_connector_update_edid_property(connector, NULL); 682 1.1 riastrad kfree(nv_connector->edid); 683 1.1 riastrad nv_connector->edid = NULL; 684 1.1 riastrad } 685 1.1 riastrad 686 1.1 riastrad nv_encoder = find_encoder(connector, DCB_OUTPUT_LVDS); 687 1.1 riastrad if (!nv_encoder) 688 1.1 riastrad return connector_status_disconnected; 689 1.1 riastrad 690 1.1 riastrad /* Try retrieving EDID via DDC */ 691 1.1 riastrad if (!drm->vbios.fp_no_ddc) { 692 1.1 riastrad status = nouveau_connector_detect(connector, force); 693 1.1 riastrad if (status == connector_status_connected) 694 1.1 riastrad goto out; 695 1.1 riastrad } 696 1.1 riastrad 697 1.1 riastrad /* On some laptops (Sony, i'm looking at you) there appears to 698 1.1 riastrad * be no direct way of accessing the panel's EDID. The only 699 1.1 riastrad * option available to us appears to be to ask ACPI for help.. 700 1.1 riastrad * 701 1.1 riastrad * It's important this check's before trying straps, one of the 702 1.1 riastrad * said manufacturer's laptops are configured in such a way 703 1.1 riastrad * the nouveau decides an entry in the VBIOS FP mode table is 704 1.1 riastrad * valid - it's not (rh#613284) 705 1.1 riastrad */ 706 1.1 riastrad if (nv_encoder->dcb->lvdsconf.use_acpi_for_edid) { 707 1.1 riastrad if ((nv_connector->edid = nouveau_acpi_edid(dev, connector))) { 708 1.1 riastrad status = connector_status_connected; 709 1.1 riastrad goto out; 710 1.1 riastrad } 711 1.1 riastrad } 712 1.1 riastrad 713 1.1 riastrad /* If no EDID found above, and the VBIOS indicates a hardcoded 714 1.1 riastrad * modeline is avalilable for the panel, set it as the panel's 715 1.1 riastrad * native mode and exit. 716 1.1 riastrad */ 717 1.1 riastrad if (nouveau_bios_fp_mode(dev, NULL) && (drm->vbios.fp_no_ddc || 718 1.1 riastrad nv_encoder->dcb->lvdsconf.use_straps_for_mode)) { 719 1.1 riastrad status = connector_status_connected; 720 1.1 riastrad goto out; 721 1.1 riastrad } 722 1.1 riastrad 723 1.1 riastrad /* Still nothing, some VBIOS images have a hardcoded EDID block 724 1.1 riastrad * stored for the panel stored in them. 725 1.1 riastrad */ 726 1.1 riastrad if (!drm->vbios.fp_no_ddc) { 727 1.1 riastrad struct edid *edid = 728 1.1 riastrad (struct edid *)nouveau_bios_embedded_edid(dev); 729 1.1 riastrad if (edid) { 730 1.1 riastrad nv_connector->edid = 731 1.1 riastrad kmemdup(edid, EDID_LENGTH, GFP_KERNEL); 732 1.1 riastrad if (nv_connector->edid) 733 1.1 riastrad status = connector_status_connected; 734 1.1 riastrad } 735 1.1 riastrad } 736 1.1 riastrad 737 1.1 riastrad out: 738 1.1 riastrad #if defined(CONFIG_ACPI_BUTTON) || \ 739 1.1 riastrad (defined(CONFIG_ACPI_BUTTON_MODULE) && defined(MODULE)) 740 1.1 riastrad if (status == connector_status_connected && 741 1.1 riastrad !nouveau_ignorelid && !acpi_lid_open()) 742 1.1 riastrad status = connector_status_unknown; 743 1.1 riastrad #endif 744 1.1 riastrad 745 1.6 riastrad drm_connector_update_edid_property(connector, nv_connector->edid); 746 1.1 riastrad nouveau_connector_set_encoder(connector, nv_encoder); 747 1.1 riastrad return status; 748 1.1 riastrad } 749 1.1 riastrad 750 1.1 riastrad static void 751 1.1 riastrad nouveau_connector_force(struct drm_connector *connector) 752 1.1 riastrad { 753 1.1 riastrad struct nouveau_drm *drm = nouveau_drm(connector->dev); 754 1.1 riastrad struct nouveau_connector *nv_connector = nouveau_connector(connector); 755 1.1 riastrad struct nouveau_encoder *nv_encoder; 756 1.1 riastrad int type; 757 1.1 riastrad 758 1.1 riastrad if (nv_connector->type == DCB_CONNECTOR_DVI_I) { 759 1.1 riastrad if (connector->force == DRM_FORCE_ON_DIGITAL) 760 1.1 riastrad type = DCB_OUTPUT_TMDS; 761 1.1 riastrad else 762 1.1 riastrad type = DCB_OUTPUT_ANALOG; 763 1.1 riastrad } else 764 1.1 riastrad type = DCB_OUTPUT_ANY; 765 1.1 riastrad 766 1.1 riastrad nv_encoder = find_encoder(connector, type); 767 1.1 riastrad if (!nv_encoder) { 768 1.1 riastrad NV_ERROR(drm, "can't find encoder to force %s on!\n", 769 1.4 riastrad connector->name); 770 1.1 riastrad connector->status = connector_status_disconnected; 771 1.1 riastrad return; 772 1.1 riastrad } 773 1.1 riastrad 774 1.1 riastrad nouveau_connector_set_encoder(connector, nv_encoder); 775 1.1 riastrad } 776 1.1 riastrad 777 1.1 riastrad static int 778 1.1 riastrad nouveau_connector_set_property(struct drm_connector *connector, 779 1.1 riastrad struct drm_property *property, uint64_t value) 780 1.1 riastrad { 781 1.1 riastrad struct nouveau_connector *nv_connector = nouveau_connector(connector); 782 1.1 riastrad struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder; 783 1.6 riastrad struct nouveau_conn_atom *asyc = &nv_connector->properties_state; 784 1.1 riastrad struct drm_encoder *encoder = to_drm_encoder(nv_encoder); 785 1.1 riastrad int ret; 786 1.1 riastrad 787 1.6 riastrad ret = connector->funcs->atomic_set_property(&nv_connector->base, 788 1.6 riastrad &asyc->state, 789 1.6 riastrad property, value); 790 1.6 riastrad if (ret) { 791 1.6 riastrad if (nv_encoder && nv_encoder->dcb->type == DCB_OUTPUT_TV) 792 1.6 riastrad return get_slave_funcs(encoder)->set_property( 793 1.6 riastrad encoder, connector, property, value); 794 1.6 riastrad return ret; 795 1.6 riastrad } 796 1.1 riastrad 797 1.6 riastrad nv_connector->scaling_mode = asyc->scaler.mode; 798 1.6 riastrad nv_connector->dithering_mode = asyc->dither.mode; 799 1.1 riastrad 800 1.6 riastrad if (connector->encoder && connector->encoder->crtc) { 801 1.6 riastrad ret = drm_crtc_helper_set_mode(connector->encoder->crtc, 802 1.6 riastrad &connector->encoder->crtc->mode, 803 1.6 riastrad connector->encoder->crtc->x, 804 1.6 riastrad connector->encoder->crtc->y, 805 1.6 riastrad NULL); 806 1.6 riastrad if (!ret) 807 1.1 riastrad return -EINVAL; 808 1.1 riastrad } 809 1.1 riastrad 810 1.6 riastrad return 0; 811 1.1 riastrad } 812 1.1 riastrad 813 1.1 riastrad struct moderec { 814 1.1 riastrad int hdisplay; 815 1.1 riastrad int vdisplay; 816 1.1 riastrad }; 817 1.1 riastrad 818 1.1 riastrad static struct moderec scaler_modes[] = { 819 1.1 riastrad { 1920, 1200 }, 820 1.1 riastrad { 1920, 1080 }, 821 1.1 riastrad { 1680, 1050 }, 822 1.1 riastrad { 1600, 1200 }, 823 1.1 riastrad { 1400, 1050 }, 824 1.1 riastrad { 1280, 1024 }, 825 1.1 riastrad { 1280, 960 }, 826 1.1 riastrad { 1152, 864 }, 827 1.1 riastrad { 1024, 768 }, 828 1.1 riastrad { 800, 600 }, 829 1.1 riastrad { 720, 400 }, 830 1.1 riastrad { 640, 480 }, 831 1.1 riastrad { 640, 400 }, 832 1.1 riastrad { 640, 350 }, 833 1.1 riastrad {} 834 1.1 riastrad }; 835 1.1 riastrad 836 1.1 riastrad static int 837 1.1 riastrad nouveau_connector_scaler_modes_add(struct drm_connector *connector) 838 1.1 riastrad { 839 1.1 riastrad struct nouveau_connector *nv_connector = nouveau_connector(connector); 840 1.1 riastrad struct drm_display_mode *native = nv_connector->native_mode, *m; 841 1.1 riastrad struct drm_device *dev = connector->dev; 842 1.1 riastrad struct moderec *mode = &scaler_modes[0]; 843 1.1 riastrad int modes = 0; 844 1.1 riastrad 845 1.1 riastrad if (!native) 846 1.1 riastrad return 0; 847 1.1 riastrad 848 1.1 riastrad while (mode->hdisplay) { 849 1.1 riastrad if (mode->hdisplay <= native->hdisplay && 850 1.4 riastrad mode->vdisplay <= native->vdisplay && 851 1.4 riastrad (mode->hdisplay != native->hdisplay || 852 1.4 riastrad mode->vdisplay != native->vdisplay)) { 853 1.1 riastrad m = drm_cvt_mode(dev, mode->hdisplay, mode->vdisplay, 854 1.1 riastrad drm_mode_vrefresh(native), false, 855 1.1 riastrad false, false); 856 1.1 riastrad if (!m) 857 1.1 riastrad continue; 858 1.1 riastrad 859 1.1 riastrad drm_mode_probed_add(connector, m); 860 1.1 riastrad modes++; 861 1.1 riastrad } 862 1.1 riastrad 863 1.1 riastrad mode++; 864 1.1 riastrad } 865 1.1 riastrad 866 1.1 riastrad return modes; 867 1.1 riastrad } 868 1.1 riastrad 869 1.1 riastrad static void 870 1.1 riastrad nouveau_connector_detect_depth(struct drm_connector *connector) 871 1.1 riastrad { 872 1.1 riastrad struct nouveau_drm *drm = nouveau_drm(connector->dev); 873 1.1 riastrad struct nouveau_connector *nv_connector = nouveau_connector(connector); 874 1.1 riastrad struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder; 875 1.1 riastrad struct nvbios *bios = &drm->vbios; 876 1.1 riastrad struct drm_display_mode *mode = nv_connector->native_mode; 877 1.1 riastrad bool duallink; 878 1.1 riastrad 879 1.1 riastrad /* if the edid is feeling nice enough to provide this info, use it */ 880 1.1 riastrad if (nv_connector->edid && connector->display_info.bpc) 881 1.1 riastrad return; 882 1.1 riastrad 883 1.1 riastrad /* EDID 1.4 is *supposed* to be supported on eDP, but, Apple... */ 884 1.1 riastrad if (nv_connector->type == DCB_CONNECTOR_eDP) { 885 1.1 riastrad connector->display_info.bpc = 6; 886 1.1 riastrad return; 887 1.1 riastrad } 888 1.1 riastrad 889 1.1 riastrad /* we're out of options unless we're LVDS, default to 8bpc */ 890 1.1 riastrad if (nv_encoder->dcb->type != DCB_OUTPUT_LVDS) { 891 1.1 riastrad connector->display_info.bpc = 8; 892 1.1 riastrad return; 893 1.1 riastrad } 894 1.1 riastrad 895 1.1 riastrad connector->display_info.bpc = 6; 896 1.1 riastrad 897 1.1 riastrad /* LVDS: panel straps */ 898 1.1 riastrad if (bios->fp_no_ddc) { 899 1.1 riastrad if (bios->fp.if_is_24bit) 900 1.1 riastrad connector->display_info.bpc = 8; 901 1.1 riastrad return; 902 1.1 riastrad } 903 1.1 riastrad 904 1.1 riastrad /* LVDS: DDC panel, need to first determine the number of links to 905 1.1 riastrad * know which if_is_24bit flag to check... 906 1.1 riastrad */ 907 1.1 riastrad if (nv_connector->edid && 908 1.1 riastrad nv_connector->type == DCB_CONNECTOR_LVDS_SPWG) 909 1.1 riastrad duallink = ((u8 *)nv_connector->edid)[121] == 2; 910 1.1 riastrad else 911 1.1 riastrad duallink = mode->clock >= bios->fp.duallink_transition_clk; 912 1.1 riastrad 913 1.1 riastrad if ((!duallink && (bios->fp.strapless_is_24bit & 1)) || 914 1.1 riastrad ( duallink && (bios->fp.strapless_is_24bit & 2))) 915 1.1 riastrad connector->display_info.bpc = 8; 916 1.1 riastrad } 917 1.1 riastrad 918 1.1 riastrad static int 919 1.6 riastrad nouveau_connector_late_register(struct drm_connector *connector) 920 1.6 riastrad { 921 1.6 riastrad int ret; 922 1.6 riastrad 923 1.6 riastrad ret = nouveau_backlight_init(connector); 924 1.6 riastrad 925 1.6 riastrad return ret; 926 1.6 riastrad } 927 1.6 riastrad 928 1.6 riastrad static void 929 1.6 riastrad nouveau_connector_early_unregister(struct drm_connector *connector) 930 1.6 riastrad { 931 1.6 riastrad nouveau_backlight_fini(connector); 932 1.6 riastrad } 933 1.6 riastrad 934 1.6 riastrad static int 935 1.1 riastrad nouveau_connector_get_modes(struct drm_connector *connector) 936 1.1 riastrad { 937 1.1 riastrad struct drm_device *dev = connector->dev; 938 1.1 riastrad struct nouveau_drm *drm = nouveau_drm(dev); 939 1.1 riastrad struct nouveau_connector *nv_connector = nouveau_connector(connector); 940 1.1 riastrad struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder; 941 1.1 riastrad struct drm_encoder *encoder = to_drm_encoder(nv_encoder); 942 1.1 riastrad int ret = 0; 943 1.1 riastrad 944 1.1 riastrad /* destroy the native mode, the attached monitor could have changed. 945 1.1 riastrad */ 946 1.1 riastrad if (nv_connector->native_mode) { 947 1.1 riastrad drm_mode_destroy(dev, nv_connector->native_mode); 948 1.1 riastrad nv_connector->native_mode = NULL; 949 1.1 riastrad } 950 1.1 riastrad 951 1.1 riastrad if (nv_connector->edid) 952 1.1 riastrad ret = drm_add_edid_modes(connector, nv_connector->edid); 953 1.1 riastrad else 954 1.1 riastrad if (nv_encoder->dcb->type == DCB_OUTPUT_LVDS && 955 1.1 riastrad (nv_encoder->dcb->lvdsconf.use_straps_for_mode || 956 1.1 riastrad drm->vbios.fp_no_ddc) && nouveau_bios_fp_mode(dev, NULL)) { 957 1.1 riastrad struct drm_display_mode mode; 958 1.1 riastrad 959 1.1 riastrad nouveau_bios_fp_mode(dev, &mode); 960 1.1 riastrad nv_connector->native_mode = drm_mode_duplicate(dev, &mode); 961 1.1 riastrad } 962 1.1 riastrad 963 1.1 riastrad /* Determine display colour depth for everything except LVDS now, 964 1.1 riastrad * DP requires this before mode_valid() is called. 965 1.1 riastrad */ 966 1.1 riastrad if (connector->connector_type != DRM_MODE_CONNECTOR_LVDS) 967 1.1 riastrad nouveau_connector_detect_depth(connector); 968 1.1 riastrad 969 1.1 riastrad /* Find the native mode if this is a digital panel, if we didn't 970 1.1 riastrad * find any modes through DDC previously add the native mode to 971 1.1 riastrad * the list of modes. 972 1.1 riastrad */ 973 1.1 riastrad if (!nv_connector->native_mode) 974 1.6 riastrad nv_connector->native_mode = nouveau_conn_native_mode(connector); 975 1.1 riastrad if (ret == 0 && nv_connector->native_mode) { 976 1.1 riastrad struct drm_display_mode *mode; 977 1.1 riastrad 978 1.1 riastrad mode = drm_mode_duplicate(dev, nv_connector->native_mode); 979 1.1 riastrad drm_mode_probed_add(connector, mode); 980 1.1 riastrad ret = 1; 981 1.1 riastrad } 982 1.1 riastrad 983 1.1 riastrad /* Determine LVDS colour depth, must happen after determining 984 1.1 riastrad * "native" mode as some VBIOS tables require us to use the 985 1.1 riastrad * pixel clock as part of the lookup... 986 1.1 riastrad */ 987 1.1 riastrad if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS) 988 1.1 riastrad nouveau_connector_detect_depth(connector); 989 1.1 riastrad 990 1.1 riastrad if (nv_encoder->dcb->type == DCB_OUTPUT_TV) 991 1.1 riastrad ret = get_slave_funcs(encoder)->get_modes(encoder, connector); 992 1.1 riastrad 993 1.1 riastrad if (nv_connector->type == DCB_CONNECTOR_LVDS || 994 1.1 riastrad nv_connector->type == DCB_CONNECTOR_LVDS_SPWG || 995 1.1 riastrad nv_connector->type == DCB_CONNECTOR_eDP) 996 1.1 riastrad ret += nouveau_connector_scaler_modes_add(connector); 997 1.1 riastrad 998 1.1 riastrad return ret; 999 1.1 riastrad } 1000 1.1 riastrad 1001 1.1 riastrad static unsigned 1002 1.1 riastrad get_tmds_link_bandwidth(struct drm_connector *connector) 1003 1.1 riastrad { 1004 1.1 riastrad struct nouveau_connector *nv_connector = nouveau_connector(connector); 1005 1.6 riastrad struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder; 1006 1.1 riastrad struct nouveau_drm *drm = nouveau_drm(connector->dev); 1007 1.1 riastrad struct dcb_output *dcb = nv_connector->detected_encoder->dcb; 1008 1.6 riastrad struct drm_display_info *info = NULL; 1009 1.6 riastrad unsigned duallink_scale = 1010 1.6 riastrad nouveau_duallink && nv_encoder->dcb->duallink_possible ? 2 : 1; 1011 1.6 riastrad 1012 1.6 riastrad if (drm_detect_hdmi_monitor(nv_connector->edid)) { 1013 1.6 riastrad info = &nv_connector->base.display_info; 1014 1.6 riastrad duallink_scale = 1; 1015 1.6 riastrad } 1016 1.6 riastrad 1017 1.6 riastrad if (info) { 1018 1.6 riastrad if (nouveau_hdmimhz > 0) 1019 1.6 riastrad return nouveau_hdmimhz * 1000; 1020 1.6 riastrad /* Note: these limits are conservative, some Fermi's 1021 1.6 riastrad * can do 297 MHz. Unclear how this can be determined. 1022 1.6 riastrad */ 1023 1.6 riastrad if (drm->client.device.info.chipset >= 0x120) { 1024 1.6 riastrad const int max_tmds_clock = 1025 1.6 riastrad info->hdmi.scdc.scrambling.supported ? 1026 1.6 riastrad 594000 : 340000; 1027 1.6 riastrad return info->max_tmds_clock ? 1028 1.6 riastrad min(info->max_tmds_clock, max_tmds_clock) : 1029 1.6 riastrad max_tmds_clock; 1030 1.6 riastrad } 1031 1.6 riastrad if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_KEPLER) 1032 1.6 riastrad return 297000; 1033 1.6 riastrad if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_FERMI) 1034 1.6 riastrad return 225000; 1035 1.6 riastrad } 1036 1.1 riastrad 1037 1.1 riastrad if (dcb->location != DCB_LOC_ON_CHIP || 1038 1.6 riastrad drm->client.device.info.chipset >= 0x46) 1039 1.6 riastrad return 165000 * duallink_scale; 1040 1.6 riastrad else if (drm->client.device.info.chipset >= 0x40) 1041 1.6 riastrad return 155000 * duallink_scale; 1042 1.6 riastrad else if (drm->client.device.info.chipset >= 0x18) 1043 1.6 riastrad return 135000 * duallink_scale; 1044 1.1 riastrad else 1045 1.6 riastrad return 112000 * duallink_scale; 1046 1.1 riastrad } 1047 1.1 riastrad 1048 1.6 riastrad static enum drm_mode_status 1049 1.1 riastrad nouveau_connector_mode_valid(struct drm_connector *connector, 1050 1.1 riastrad struct drm_display_mode *mode) 1051 1.1 riastrad { 1052 1.1 riastrad struct nouveau_connector *nv_connector = nouveau_connector(connector); 1053 1.1 riastrad struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder; 1054 1.1 riastrad struct drm_encoder *encoder = to_drm_encoder(nv_encoder); 1055 1.1 riastrad unsigned min_clock = 25000, max_clock = min_clock; 1056 1.1 riastrad unsigned clock = mode->clock; 1057 1.1 riastrad 1058 1.1 riastrad switch (nv_encoder->dcb->type) { 1059 1.1 riastrad case DCB_OUTPUT_LVDS: 1060 1.1 riastrad if (nv_connector->native_mode && 1061 1.1 riastrad (mode->hdisplay > nv_connector->native_mode->hdisplay || 1062 1.1 riastrad mode->vdisplay > nv_connector->native_mode->vdisplay)) 1063 1.1 riastrad return MODE_PANEL; 1064 1.1 riastrad 1065 1.1 riastrad min_clock = 0; 1066 1.1 riastrad max_clock = 400000; 1067 1.1 riastrad break; 1068 1.1 riastrad case DCB_OUTPUT_TMDS: 1069 1.1 riastrad max_clock = get_tmds_link_bandwidth(connector); 1070 1.1 riastrad break; 1071 1.1 riastrad case DCB_OUTPUT_ANALOG: 1072 1.1 riastrad max_clock = nv_encoder->dcb->crtconf.maxfreq; 1073 1.1 riastrad if (!max_clock) 1074 1.1 riastrad max_clock = 350000; 1075 1.1 riastrad break; 1076 1.1 riastrad case DCB_OUTPUT_TV: 1077 1.1 riastrad return get_slave_funcs(encoder)->mode_valid(encoder, mode); 1078 1.1 riastrad case DCB_OUTPUT_DP: 1079 1.1 riastrad max_clock = nv_encoder->dp.link_nr; 1080 1.1 riastrad max_clock *= nv_encoder->dp.link_bw; 1081 1.1 riastrad clock = clock * (connector->display_info.bpc * 3) / 10; 1082 1.1 riastrad break; 1083 1.1 riastrad default: 1084 1.6 riastrad BUG(); 1085 1.1 riastrad return MODE_BAD; 1086 1.1 riastrad } 1087 1.1 riastrad 1088 1.6 riastrad if ((mode->flags & DRM_MODE_FLAG_3D_MASK) == DRM_MODE_FLAG_3D_FRAME_PACKING) 1089 1.6 riastrad clock *= 2; 1090 1.6 riastrad 1091 1.1 riastrad if (clock < min_clock) 1092 1.1 riastrad return MODE_CLOCK_LOW; 1093 1.1 riastrad 1094 1.1 riastrad if (clock > max_clock) 1095 1.1 riastrad return MODE_CLOCK_HIGH; 1096 1.1 riastrad 1097 1.1 riastrad return MODE_OK; 1098 1.1 riastrad } 1099 1.1 riastrad 1100 1.1 riastrad static struct drm_encoder * 1101 1.1 riastrad nouveau_connector_best_encoder(struct drm_connector *connector) 1102 1.1 riastrad { 1103 1.1 riastrad struct nouveau_connector *nv_connector = nouveau_connector(connector); 1104 1.1 riastrad 1105 1.1 riastrad if (nv_connector->detected_encoder) 1106 1.1 riastrad return to_drm_encoder(nv_connector->detected_encoder); 1107 1.1 riastrad 1108 1.1 riastrad return NULL; 1109 1.1 riastrad } 1110 1.1 riastrad 1111 1.1 riastrad static const struct drm_connector_helper_funcs 1112 1.1 riastrad nouveau_connector_helper_funcs = { 1113 1.1 riastrad .get_modes = nouveau_connector_get_modes, 1114 1.1 riastrad .mode_valid = nouveau_connector_mode_valid, 1115 1.1 riastrad .best_encoder = nouveau_connector_best_encoder, 1116 1.1 riastrad }; 1117 1.1 riastrad 1118 1.1 riastrad static const struct drm_connector_funcs 1119 1.1 riastrad nouveau_connector_funcs = { 1120 1.1 riastrad .dpms = drm_helper_connector_dpms, 1121 1.6 riastrad .reset = nouveau_conn_reset, 1122 1.1 riastrad .detect = nouveau_connector_detect, 1123 1.6 riastrad .force = nouveau_connector_force, 1124 1.1 riastrad .fill_modes = drm_helper_probe_single_connector_modes, 1125 1.1 riastrad .set_property = nouveau_connector_set_property, 1126 1.6 riastrad .destroy = nouveau_connector_destroy, 1127 1.6 riastrad .atomic_duplicate_state = nouveau_conn_atomic_duplicate_state, 1128 1.6 riastrad .atomic_destroy_state = nouveau_conn_atomic_destroy_state, 1129 1.6 riastrad .atomic_set_property = nouveau_conn_atomic_set_property, 1130 1.6 riastrad .atomic_get_property = nouveau_conn_atomic_get_property, 1131 1.6 riastrad .late_register = nouveau_connector_late_register, 1132 1.6 riastrad .early_unregister = nouveau_connector_early_unregister, 1133 1.1 riastrad }; 1134 1.1 riastrad 1135 1.1 riastrad static const struct drm_connector_funcs 1136 1.1 riastrad nouveau_connector_funcs_lvds = { 1137 1.1 riastrad .dpms = drm_helper_connector_dpms, 1138 1.6 riastrad .reset = nouveau_conn_reset, 1139 1.1 riastrad .detect = nouveau_connector_detect_lvds, 1140 1.6 riastrad .force = nouveau_connector_force, 1141 1.1 riastrad .fill_modes = drm_helper_probe_single_connector_modes, 1142 1.1 riastrad .set_property = nouveau_connector_set_property, 1143 1.4 riastrad .destroy = nouveau_connector_destroy, 1144 1.6 riastrad .atomic_duplicate_state = nouveau_conn_atomic_duplicate_state, 1145 1.6 riastrad .atomic_destroy_state = nouveau_conn_atomic_destroy_state, 1146 1.6 riastrad .atomic_set_property = nouveau_conn_atomic_set_property, 1147 1.6 riastrad .atomic_get_property = nouveau_conn_atomic_get_property, 1148 1.6 riastrad .late_register = nouveau_connector_late_register, 1149 1.6 riastrad .early_unregister = nouveau_connector_early_unregister, 1150 1.4 riastrad }; 1151 1.4 riastrad 1152 1.4 riastrad static int 1153 1.4 riastrad nouveau_connector_hotplug(struct nvif_notify *notify) 1154 1.1 riastrad { 1155 1.1 riastrad struct nouveau_connector *nv_connector = 1156 1.4 riastrad container_of(notify, typeof(*nv_connector), hpd); 1157 1.1 riastrad struct drm_connector *connector = &nv_connector->base; 1158 1.4 riastrad struct nouveau_drm *drm = nouveau_drm(connector->dev); 1159 1.4 riastrad const struct nvif_notify_conn_rep_v0 *rep = notify->data; 1160 1.4 riastrad const char *name = connector->name; 1161 1.6 riastrad struct nouveau_encoder *nv_encoder; 1162 1.6 riastrad int ret; 1163 1.6 riastrad bool plugged = (rep->mask != NVIF_NOTIFY_CONN_V0_UNPLUG); 1164 1.4 riastrad 1165 1.4 riastrad if (rep->mask & NVIF_NOTIFY_CONN_V0_IRQ) { 1166 1.6 riastrad NV_DEBUG(drm, "service %s\n", name); 1167 1.6 riastrad drm_dp_cec_irq(&nv_connector->aux); 1168 1.6 riastrad if ((nv_encoder = find_encoder(connector, DCB_OUTPUT_DP))) 1169 1.6 riastrad nv50_mstm_service(nv_encoder->dp.mstm); 1170 1.6 riastrad 1171 1.6 riastrad return NVIF_NOTIFY_KEEP; 1172 1.6 riastrad } 1173 1.4 riastrad 1174 1.6 riastrad ret = pm_runtime_get(drm->dev->dev); 1175 1.6 riastrad if (ret == 0) { 1176 1.6 riastrad /* We can't block here if there's a pending PM request 1177 1.6 riastrad * running, as we'll deadlock nouveau_display_fini() when it 1178 1.6 riastrad * calls nvif_put() on our nvif_notify struct. So, simply 1179 1.6 riastrad * defer the hotplug event until the device finishes resuming 1180 1.6 riastrad */ 1181 1.6 riastrad NV_DEBUG(drm, "Deferring HPD on %s until runtime resume\n", 1182 1.6 riastrad name); 1183 1.6 riastrad schedule_work(&drm->hpd_work); 1184 1.6 riastrad 1185 1.6 riastrad pm_runtime_put_noidle(drm->dev->dev); 1186 1.6 riastrad return NVIF_NOTIFY_KEEP; 1187 1.6 riastrad } else if (ret != 1 && ret != -EACCES) { 1188 1.6 riastrad NV_WARN(drm, "HPD on %s dropped due to RPM failure: %d\n", 1189 1.6 riastrad name, ret); 1190 1.6 riastrad return NVIF_NOTIFY_DROP; 1191 1.6 riastrad } 1192 1.6 riastrad 1193 1.6 riastrad if (!plugged) 1194 1.6 riastrad drm_dp_cec_unset_edid(&nv_connector->aux); 1195 1.6 riastrad NV_DEBUG(drm, "%splugged %s\n", plugged ? "" : "un", name); 1196 1.6 riastrad if ((nv_encoder = find_encoder(connector, DCB_OUTPUT_DP))) { 1197 1.6 riastrad if (!plugged) 1198 1.6 riastrad nv50_mstm_remove(nv_encoder->dp.mstm); 1199 1.6 riastrad } 1200 1.1 riastrad 1201 1.6 riastrad drm_helper_hpd_irq_event(connector->dev); 1202 1.1 riastrad 1203 1.6 riastrad pm_runtime_mark_last_busy(drm->dev->dev); 1204 1.6 riastrad pm_runtime_put_autosuspend(drm->dev->dev); 1205 1.4 riastrad return NVIF_NOTIFY_KEEP; 1206 1.1 riastrad } 1207 1.1 riastrad 1208 1.4 riastrad static ssize_t 1209 1.4 riastrad nouveau_connector_aux_xfer(struct drm_dp_aux *obj, struct drm_dp_aux_msg *msg) 1210 1.1 riastrad { 1211 1.4 riastrad struct nouveau_connector *nv_connector = 1212 1.4 riastrad container_of(obj, typeof(*nv_connector), aux); 1213 1.4 riastrad struct nouveau_encoder *nv_encoder; 1214 1.4 riastrad struct nvkm_i2c_aux *aux; 1215 1.6 riastrad u8 size = msg->size; 1216 1.4 riastrad int ret; 1217 1.4 riastrad 1218 1.4 riastrad nv_encoder = find_encoder(&nv_connector->base, DCB_OUTPUT_DP); 1219 1.4 riastrad if (!nv_encoder || !(aux = nv_encoder->aux)) 1220 1.4 riastrad return -ENODEV; 1221 1.4 riastrad if (WARN_ON(msg->size > 16)) 1222 1.4 riastrad return -E2BIG; 1223 1.4 riastrad 1224 1.4 riastrad ret = nvkm_i2c_aux_acquire(aux); 1225 1.4 riastrad if (ret) 1226 1.4 riastrad return ret; 1227 1.4 riastrad 1228 1.4 riastrad ret = nvkm_i2c_aux_xfer(aux, false, msg->request, msg->address, 1229 1.6 riastrad msg->buffer, &size); 1230 1.4 riastrad nvkm_i2c_aux_release(aux); 1231 1.4 riastrad if (ret >= 0) { 1232 1.4 riastrad msg->reply = ret; 1233 1.6 riastrad return size; 1234 1.4 riastrad } 1235 1.4 riastrad 1236 1.4 riastrad return ret; 1237 1.1 riastrad } 1238 1.1 riastrad 1239 1.1 riastrad static int 1240 1.1 riastrad drm_conntype_from_dcb(enum dcb_connector_type dcb) 1241 1.1 riastrad { 1242 1.1 riastrad switch (dcb) { 1243 1.1 riastrad case DCB_CONNECTOR_VGA : return DRM_MODE_CONNECTOR_VGA; 1244 1.1 riastrad case DCB_CONNECTOR_TV_0 : 1245 1.1 riastrad case DCB_CONNECTOR_TV_1 : 1246 1.1 riastrad case DCB_CONNECTOR_TV_3 : return DRM_MODE_CONNECTOR_TV; 1247 1.1 riastrad case DCB_CONNECTOR_DMS59_0 : 1248 1.1 riastrad case DCB_CONNECTOR_DMS59_1 : 1249 1.1 riastrad case DCB_CONNECTOR_DVI_I : return DRM_MODE_CONNECTOR_DVII; 1250 1.1 riastrad case DCB_CONNECTOR_DVI_D : return DRM_MODE_CONNECTOR_DVID; 1251 1.1 riastrad case DCB_CONNECTOR_LVDS : 1252 1.1 riastrad case DCB_CONNECTOR_LVDS_SPWG: return DRM_MODE_CONNECTOR_LVDS; 1253 1.1 riastrad case DCB_CONNECTOR_DMS59_DP0: 1254 1.1 riastrad case DCB_CONNECTOR_DMS59_DP1: 1255 1.6 riastrad case DCB_CONNECTOR_DP : 1256 1.6 riastrad case DCB_CONNECTOR_USB_C : return DRM_MODE_CONNECTOR_DisplayPort; 1257 1.1 riastrad case DCB_CONNECTOR_eDP : return DRM_MODE_CONNECTOR_eDP; 1258 1.1 riastrad case DCB_CONNECTOR_HDMI_0 : 1259 1.1 riastrad case DCB_CONNECTOR_HDMI_1 : 1260 1.1 riastrad case DCB_CONNECTOR_HDMI_C : return DRM_MODE_CONNECTOR_HDMIA; 1261 1.6 riastrad case DCB_CONNECTOR_WFD : return DRM_MODE_CONNECTOR_VIRTUAL; 1262 1.1 riastrad default: 1263 1.1 riastrad break; 1264 1.1 riastrad } 1265 1.1 riastrad 1266 1.1 riastrad return DRM_MODE_CONNECTOR_Unknown; 1267 1.1 riastrad } 1268 1.1 riastrad 1269 1.1 riastrad struct drm_connector * 1270 1.6 riastrad nouveau_connector_create(struct drm_device *dev, 1271 1.6 riastrad const struct dcb_output *dcbe) 1272 1.1 riastrad { 1273 1.1 riastrad const struct drm_connector_funcs *funcs = &nouveau_connector_funcs; 1274 1.1 riastrad struct nouveau_drm *drm = nouveau_drm(dev); 1275 1.1 riastrad struct nouveau_display *disp = nouveau_display(dev); 1276 1.1 riastrad struct nouveau_connector *nv_connector = NULL; 1277 1.1 riastrad struct drm_connector *connector; 1278 1.6 riastrad struct drm_connector_list_iter conn_iter; 1279 1.6 riastrad char aux_name[48] = {0}; 1280 1.6 riastrad int index = dcbe->connector; 1281 1.1 riastrad int type, ret = 0; 1282 1.1 riastrad bool dummy; 1283 1.1 riastrad 1284 1.6 riastrad drm_connector_list_iter_begin(dev, &conn_iter); 1285 1.6 riastrad nouveau_for_each_non_mst_connector_iter(connector, &conn_iter) { 1286 1.1 riastrad nv_connector = nouveau_connector(connector); 1287 1.6 riastrad if (nv_connector->index == index) { 1288 1.6 riastrad drm_connector_list_iter_end(&conn_iter); 1289 1.1 riastrad return connector; 1290 1.6 riastrad } 1291 1.1 riastrad } 1292 1.6 riastrad drm_connector_list_iter_end(&conn_iter); 1293 1.1 riastrad 1294 1.1 riastrad nv_connector = kzalloc(sizeof(*nv_connector), GFP_KERNEL); 1295 1.1 riastrad if (!nv_connector) 1296 1.1 riastrad return ERR_PTR(-ENOMEM); 1297 1.1 riastrad 1298 1.1 riastrad connector = &nv_connector->base; 1299 1.1 riastrad nv_connector->index = index; 1300 1.1 riastrad 1301 1.1 riastrad /* attempt to parse vbios connector type and hotplug gpio */ 1302 1.1 riastrad nv_connector->dcb = olddcb_conn(dev, index); 1303 1.1 riastrad if (nv_connector->dcb) { 1304 1.1 riastrad u32 entry = ROM16(nv_connector->dcb[0]); 1305 1.1 riastrad if (olddcb_conntab(dev)[3] >= 4) 1306 1.1 riastrad entry |= (u32)ROM16(nv_connector->dcb[2]) << 16; 1307 1.1 riastrad 1308 1.1 riastrad nv_connector->type = nv_connector->dcb[0]; 1309 1.1 riastrad if (drm_conntype_from_dcb(nv_connector->type) == 1310 1.1 riastrad DRM_MODE_CONNECTOR_Unknown) { 1311 1.1 riastrad NV_WARN(drm, "unknown connector type %02x\n", 1312 1.1 riastrad nv_connector->type); 1313 1.1 riastrad nv_connector->type = DCB_CONNECTOR_NONE; 1314 1.1 riastrad } 1315 1.1 riastrad 1316 1.1 riastrad /* Gigabyte NX85T */ 1317 1.1 riastrad if (nv_match_device(dev, 0x0421, 0x1458, 0x344c)) { 1318 1.1 riastrad if (nv_connector->type == DCB_CONNECTOR_HDMI_1) 1319 1.1 riastrad nv_connector->type = DCB_CONNECTOR_DVI_I; 1320 1.1 riastrad } 1321 1.1 riastrad 1322 1.1 riastrad /* Gigabyte GV-NX86T512H */ 1323 1.1 riastrad if (nv_match_device(dev, 0x0402, 0x1458, 0x3455)) { 1324 1.1 riastrad if (nv_connector->type == DCB_CONNECTOR_HDMI_1) 1325 1.1 riastrad nv_connector->type = DCB_CONNECTOR_DVI_I; 1326 1.1 riastrad } 1327 1.1 riastrad } else { 1328 1.1 riastrad nv_connector->type = DCB_CONNECTOR_NONE; 1329 1.1 riastrad } 1330 1.1 riastrad 1331 1.1 riastrad /* no vbios data, or an unknown dcb connector type - attempt to 1332 1.1 riastrad * figure out something suitable ourselves 1333 1.1 riastrad */ 1334 1.1 riastrad if (nv_connector->type == DCB_CONNECTOR_NONE) { 1335 1.1 riastrad struct dcb_table *dcbt = &drm->vbios.dcb; 1336 1.1 riastrad u32 encoders = 0; 1337 1.1 riastrad int i; 1338 1.1 riastrad 1339 1.1 riastrad for (i = 0; i < dcbt->entries; i++) { 1340 1.1 riastrad if (dcbt->entry[i].connector == nv_connector->index) 1341 1.1 riastrad encoders |= (1 << dcbt->entry[i].type); 1342 1.1 riastrad } 1343 1.1 riastrad 1344 1.1 riastrad if (encoders & (1 << DCB_OUTPUT_DP)) { 1345 1.1 riastrad if (encoders & (1 << DCB_OUTPUT_TMDS)) 1346 1.1 riastrad nv_connector->type = DCB_CONNECTOR_DP; 1347 1.1 riastrad else 1348 1.1 riastrad nv_connector->type = DCB_CONNECTOR_eDP; 1349 1.1 riastrad } else 1350 1.1 riastrad if (encoders & (1 << DCB_OUTPUT_TMDS)) { 1351 1.1 riastrad if (encoders & (1 << DCB_OUTPUT_ANALOG)) 1352 1.1 riastrad nv_connector->type = DCB_CONNECTOR_DVI_I; 1353 1.1 riastrad else 1354 1.1 riastrad nv_connector->type = DCB_CONNECTOR_DVI_D; 1355 1.1 riastrad } else 1356 1.1 riastrad if (encoders & (1 << DCB_OUTPUT_ANALOG)) { 1357 1.1 riastrad nv_connector->type = DCB_CONNECTOR_VGA; 1358 1.1 riastrad } else 1359 1.1 riastrad if (encoders & (1 << DCB_OUTPUT_LVDS)) { 1360 1.1 riastrad nv_connector->type = DCB_CONNECTOR_LVDS; 1361 1.1 riastrad } else 1362 1.1 riastrad if (encoders & (1 << DCB_OUTPUT_TV)) { 1363 1.1 riastrad nv_connector->type = DCB_CONNECTOR_TV_0; 1364 1.1 riastrad } 1365 1.1 riastrad } 1366 1.1 riastrad 1367 1.4 riastrad switch ((type = drm_conntype_from_dcb(nv_connector->type))) { 1368 1.4 riastrad case DRM_MODE_CONNECTOR_LVDS: 1369 1.1 riastrad ret = nouveau_bios_parse_lvds_table(dev, 0, &dummy, &dummy); 1370 1.1 riastrad if (ret) { 1371 1.1 riastrad NV_ERROR(drm, "Error parsing LVDS table, disabling\n"); 1372 1.1 riastrad kfree(nv_connector); 1373 1.1 riastrad return ERR_PTR(ret); 1374 1.1 riastrad } 1375 1.1 riastrad 1376 1.1 riastrad funcs = &nouveau_connector_funcs_lvds; 1377 1.4 riastrad break; 1378 1.4 riastrad case DRM_MODE_CONNECTOR_DisplayPort: 1379 1.4 riastrad case DRM_MODE_CONNECTOR_eDP: 1380 1.6 riastrad nv_connector->aux.dev = connector->kdev; 1381 1.4 riastrad nv_connector->aux.transfer = nouveau_connector_aux_xfer; 1382 1.6 riastrad snprintf(aux_name, sizeof(aux_name), "sor-%04x-%04x", 1383 1.6 riastrad dcbe->hasht, dcbe->hashm); 1384 1.6 riastrad nv_connector->aux.name = kstrdup(aux_name, GFP_KERNEL); 1385 1.4 riastrad ret = drm_dp_aux_register(&nv_connector->aux); 1386 1.4 riastrad if (ret) { 1387 1.4 riastrad NV_ERROR(drm, "failed to register aux channel\n"); 1388 1.4 riastrad kfree(nv_connector); 1389 1.4 riastrad return ERR_PTR(ret); 1390 1.4 riastrad } 1391 1.6 riastrad funcs = &nouveau_connector_funcs; 1392 1.4 riastrad break; 1393 1.4 riastrad default: 1394 1.1 riastrad funcs = &nouveau_connector_funcs; 1395 1.4 riastrad break; 1396 1.1 riastrad } 1397 1.1 riastrad 1398 1.6 riastrad /* HDMI 3D support */ 1399 1.6 riastrad if ((disp->disp.object.oclass >= G82_DISP) 1400 1.6 riastrad && ((type == DRM_MODE_CONNECTOR_DisplayPort) 1401 1.6 riastrad || (type == DRM_MODE_CONNECTOR_eDP) 1402 1.6 riastrad || (type == DRM_MODE_CONNECTOR_HDMIA))) 1403 1.6 riastrad connector->stereo_allowed = true; 1404 1.6 riastrad 1405 1.1 riastrad /* defaults, will get overridden in detect() */ 1406 1.1 riastrad connector->interlace_allowed = false; 1407 1.1 riastrad connector->doublescan_allowed = false; 1408 1.1 riastrad 1409 1.1 riastrad drm_connector_init(dev, connector, funcs, type); 1410 1.1 riastrad drm_connector_helper_add(connector, &nouveau_connector_helper_funcs); 1411 1.1 riastrad 1412 1.6 riastrad connector->funcs->reset(connector); 1413 1.6 riastrad nouveau_conn_attach_properties(connector); 1414 1.1 riastrad 1415 1.6 riastrad /* Default scaling mode */ 1416 1.1 riastrad switch (nv_connector->type) { 1417 1.4 riastrad case DCB_CONNECTOR_LVDS: 1418 1.4 riastrad case DCB_CONNECTOR_LVDS_SPWG: 1419 1.4 riastrad case DCB_CONNECTOR_eDP: 1420 1.4 riastrad /* see note in nouveau_connector_set_property() */ 1421 1.6 riastrad if (disp->disp.object.oclass < NV50_DISP) { 1422 1.4 riastrad nv_connector->scaling_mode = DRM_MODE_SCALE_FULLSCREEN; 1423 1.4 riastrad break; 1424 1.4 riastrad } 1425 1.4 riastrad nv_connector->scaling_mode = DRM_MODE_SCALE_NONE; 1426 1.4 riastrad break; 1427 1.4 riastrad default: 1428 1.4 riastrad nv_connector->scaling_mode = DRM_MODE_SCALE_NONE; 1429 1.4 riastrad break; 1430 1.4 riastrad } 1431 1.4 riastrad 1432 1.6 riastrad /* dithering properties */ 1433 1.4 riastrad switch (nv_connector->type) { 1434 1.4 riastrad case DCB_CONNECTOR_TV_0: 1435 1.4 riastrad case DCB_CONNECTOR_TV_1: 1436 1.4 riastrad case DCB_CONNECTOR_TV_3: 1437 1.6 riastrad case DCB_CONNECTOR_VGA: 1438 1.4 riastrad break; 1439 1.4 riastrad default: 1440 1.6 riastrad nv_connector->dithering_mode = DITHERING_MODE_AUTO; 1441 1.4 riastrad break; 1442 1.4 riastrad } 1443 1.4 riastrad 1444 1.6 riastrad switch (type) { 1445 1.6 riastrad case DRM_MODE_CONNECTOR_DisplayPort: 1446 1.6 riastrad case DRM_MODE_CONNECTOR_eDP: 1447 1.6 riastrad drm_dp_cec_register_connector(&nv_connector->aux, connector); 1448 1.1 riastrad break; 1449 1.1 riastrad } 1450 1.1 riastrad 1451 1.6 riastrad ret = nvif_notify_init(&disp->disp.object, nouveau_connector_hotplug, 1452 1.6 riastrad true, NV04_DISP_NTFY_CONN, 1453 1.4 riastrad &(struct nvif_notify_conn_req_v0) { 1454 1.4 riastrad .mask = NVIF_NOTIFY_CONN_V0_ANY, 1455 1.4 riastrad .conn = index, 1456 1.4 riastrad }, 1457 1.4 riastrad sizeof(struct nvif_notify_conn_req_v0), 1458 1.4 riastrad sizeof(struct nvif_notify_conn_rep_v0), 1459 1.4 riastrad &nv_connector->hpd); 1460 1.4 riastrad if (ret) 1461 1.4 riastrad connector->polled = DRM_CONNECTOR_POLL_CONNECT; 1462 1.4 riastrad else 1463 1.1 riastrad connector->polled = DRM_CONNECTOR_POLL_HPD; 1464 1.1 riastrad 1465 1.4 riastrad drm_connector_register(connector); 1466 1.1 riastrad return connector; 1467 1.1 riastrad } 1468