linux/drivers/gpu/drm/nouveau/nouveau_connector.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2008 Maarten Maathuis.
   3 * All Rights Reserved.
   4 *
   5 * Permission is hereby granted, free of charge, to any person obtaining
   6 * a copy of this software and associated documentation files (the
   7 * "Software"), to deal in the Software without restriction, including
   8 * without limitation the rights to use, copy, modify, merge, publish,
   9 * distribute, sublicense, and/or sell copies of the Software, and to
  10 * permit persons to whom the Software is furnished to do so, subject to
  11 * the following conditions:
  12 *
  13 * The above copyright notice and this permission notice (including the
  14 * next paragraph) shall be included in all copies or substantial
  15 * portions of the Software.
  16 *
  17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  20 * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
  21 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  22 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  23 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  24 *
  25 */
  26
  27#include <acpi/button.h>
  28
  29#include <drm/drmP.h>
  30#include <drm/drm_edid.h>
  31#include <drm/drm_crtc_helper.h>
  32
  33#include "nouveau_reg.h"
  34#include "nouveau_drm.h"
  35#include "nouveau_hw.h"
  36#include "nouveau_acpi.h"
  37
  38#include "nouveau_display.h"
  39#include "nouveau_connector.h"
  40#include "nouveau_encoder.h"
  41#include "nouveau_crtc.h"
  42
  43#include <subdev/i2c.h>
  44#include <subdev/gpio.h>
  45
  46MODULE_PARM_DESC(tv_disable, "Disable TV-out detection");
  47static int nouveau_tv_disable = 0;
  48module_param_named(tv_disable, nouveau_tv_disable, int, 0400);
  49
  50MODULE_PARM_DESC(ignorelid, "Ignore ACPI lid status");
  51static int nouveau_ignorelid = 0;
  52module_param_named(ignorelid, nouveau_ignorelid, int, 0400);
  53
  54MODULE_PARM_DESC(duallink, "Allow dual-link TMDS (default: enabled)");
  55static int nouveau_duallink = 1;
  56module_param_named(duallink, nouveau_duallink, int, 0400);
  57
  58static void nouveau_connector_hotplug(void *, int);
  59
  60struct nouveau_encoder *
  61find_encoder(struct drm_connector *connector, int type)
  62{
  63        struct drm_device *dev = connector->dev;
  64        struct nouveau_encoder *nv_encoder;
  65        struct drm_mode_object *obj;
  66        int i, id;
  67
  68        for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
  69                id = connector->encoder_ids[i];
  70                if (!id)
  71                        break;
  72
  73                obj = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_ENCODER);
  74                if (!obj)
  75                        continue;
  76                nv_encoder = nouveau_encoder(obj_to_encoder(obj));
  77
  78                if (type == DCB_OUTPUT_ANY || nv_encoder->dcb->type == type)
  79                        return nv_encoder;
  80        }
  81
  82        return NULL;
  83}
  84
  85struct nouveau_connector *
  86nouveau_encoder_connector_get(struct nouveau_encoder *encoder)
  87{
  88        struct drm_device *dev = to_drm_encoder(encoder)->dev;
  89        struct drm_connector *drm_connector;
  90
  91        list_for_each_entry(drm_connector, &dev->mode_config.connector_list, head) {
  92                if (drm_connector->encoder == to_drm_encoder(encoder))
  93                        return nouveau_connector(drm_connector);
  94        }
  95
  96        return NULL;
  97}
  98
  99static void
 100nouveau_connector_destroy(struct drm_connector *connector)
 101{
 102        struct nouveau_connector *nv_connector = nouveau_connector(connector);
 103        struct nouveau_gpio *gpio;
 104        struct nouveau_drm *drm;
 105        struct drm_device *dev;
 106
 107        if (!nv_connector)
 108                return;
 109
 110        dev  = nv_connector->base.dev;
 111        drm  = nouveau_drm(dev);
 112        gpio = nouveau_gpio(drm->device);
 113        NV_DEBUG(drm, "\n");
 114
 115        if (gpio && nv_connector->hpd != DCB_GPIO_UNUSED) {
 116                gpio->isr_del(gpio, 0, nv_connector->hpd, 0xff,
 117                              nouveau_connector_hotplug, connector);
 118        }
 119
 120        kfree(nv_connector->edid);
 121        drm_sysfs_connector_remove(connector);
 122        drm_connector_cleanup(connector);
 123        kfree(connector);
 124}
 125
 126static struct nouveau_i2c_port *
 127nouveau_connector_ddc_detect(struct drm_connector *connector,
 128                             struct nouveau_encoder **pnv_encoder)
 129{
 130        struct drm_device *dev = connector->dev;
 131        struct nouveau_drm *drm = nouveau_drm(dev);
 132        struct nouveau_i2c *i2c = nouveau_i2c(drm->device);
 133        int i;
 134
 135        for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
 136                struct nouveau_i2c_port *port = NULL;
 137                struct nouveau_encoder *nv_encoder;
 138                struct drm_mode_object *obj;
 139                int id;
 140
 141                id = connector->encoder_ids[i];
 142                if (!id)
 143                        break;
 144
 145                obj = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_ENCODER);
 146                if (!obj)
 147                        continue;
 148                nv_encoder = nouveau_encoder(obj_to_encoder(obj));
 149
 150                if (nv_encoder->dcb->i2c_index < 0xf)
 151                        port = i2c->find(i2c, nv_encoder->dcb->i2c_index);
 152                if (port && nv_probe_i2c(port, 0x50)) {
 153                        *pnv_encoder = nv_encoder;
 154                        return port;
 155                }
 156        }
 157
 158        return NULL;
 159}
 160
 161static struct nouveau_encoder *
 162nouveau_connector_of_detect(struct drm_connector *connector)
 163{
 164#ifdef __powerpc__
 165        struct drm_device *dev = connector->dev;
 166        struct nouveau_connector *nv_connector = nouveau_connector(connector);
 167        struct nouveau_encoder *nv_encoder;
 168        struct device_node *cn, *dn = pci_device_to_OF_node(dev->pdev);
 169
 170        if (!dn ||
 171            !((nv_encoder = find_encoder(connector, DCB_OUTPUT_TMDS)) ||
 172              (nv_encoder = find_encoder(connector, DCB_OUTPUT_ANALOG))))
 173                return NULL;
 174
 175        for_each_child_of_node(dn, cn) {
 176                const char *name = of_get_property(cn, "name", NULL);
 177                const void *edid = of_get_property(cn, "EDID", NULL);
 178                int idx = name ? name[strlen(name) - 1] - 'A' : 0;
 179
 180                if (nv_encoder->dcb->i2c_index == idx && edid) {
 181                        nv_connector->edid =
 182                                kmemdup(edid, EDID_LENGTH, GFP_KERNEL);
 183                        of_node_put(cn);
 184                        return nv_encoder;
 185                }
 186        }
 187#endif
 188        return NULL;
 189}
 190
 191static void
 192nouveau_connector_set_encoder(struct drm_connector *connector,
 193                              struct nouveau_encoder *nv_encoder)
 194{
 195        struct nouveau_connector *nv_connector = nouveau_connector(connector);
 196        struct nouveau_drm *drm = nouveau_drm(connector->dev);
 197        struct drm_device *dev = connector->dev;
 198
 199        if (nv_connector->detected_encoder == nv_encoder)
 200                return;
 201        nv_connector->detected_encoder = nv_encoder;
 202
 203        if (nv_device(drm->device)->card_type >= NV_50) {
 204                connector->interlace_allowed = true;
 205                connector->doublescan_allowed = true;
 206        } else
 207        if (nv_encoder->dcb->type == DCB_OUTPUT_LVDS ||
 208            nv_encoder->dcb->type == DCB_OUTPUT_TMDS) {
 209                connector->doublescan_allowed = false;
 210                connector->interlace_allowed = false;
 211        } else {
 212                connector->doublescan_allowed = true;
 213                if (nv_device(drm->device)->card_type == NV_20 ||
 214                   (nv_device(drm->device)->card_type == NV_10 &&
 215                    (dev->pci_device & 0x0ff0) != 0x0100 &&
 216                    (dev->pci_device & 0x0ff0) != 0x0150))
 217                        /* HW is broken */
 218                        connector->interlace_allowed = false;
 219                else
 220                        connector->interlace_allowed = true;
 221        }
 222
 223        if (nv_connector->type == DCB_CONNECTOR_DVI_I) {
 224                drm_connector_property_set_value(connector,
 225                        dev->mode_config.dvi_i_subconnector_property,
 226                        nv_encoder->dcb->type == DCB_OUTPUT_TMDS ?
 227                        DRM_MODE_SUBCONNECTOR_DVID :
 228                        DRM_MODE_SUBCONNECTOR_DVIA);
 229        }
 230}
 231
 232static enum drm_connector_status
 233nouveau_connector_detect(struct drm_connector *connector, bool force)
 234{
 235        struct drm_device *dev = connector->dev;
 236        struct nouveau_drm *drm = nouveau_drm(dev);
 237        struct nouveau_connector *nv_connector = nouveau_connector(connector);
 238        struct nouveau_encoder *nv_encoder = NULL;
 239        struct nouveau_encoder *nv_partner;
 240        struct nouveau_i2c_port *i2c;
 241        int type;
 242
 243        /* Cleanup the previous EDID block. */
 244        if (nv_connector->edid) {
 245                drm_mode_connector_update_edid_property(connector, NULL);
 246                kfree(nv_connector->edid);
 247                nv_connector->edid = NULL;
 248        }
 249
 250        i2c = nouveau_connector_ddc_detect(connector, &nv_encoder);
 251        if (i2c) {
 252                nv_connector->edid = drm_get_edid(connector, &i2c->adapter);
 253                drm_mode_connector_update_edid_property(connector,
 254                                                        nv_connector->edid);
 255                if (!nv_connector->edid) {
 256                        NV_ERROR(drm, "DDC responded, but no EDID for %s\n",
 257                                 drm_get_connector_name(connector));
 258                        goto detect_analog;
 259                }
 260
 261                if (nv_encoder->dcb->type == DCB_OUTPUT_DP &&
 262                    !nouveau_dp_detect(to_drm_encoder(nv_encoder))) {
 263                        NV_ERROR(drm, "Detected %s, but failed init\n",
 264                                 drm_get_connector_name(connector));
 265                        return connector_status_disconnected;
 266                }
 267
 268                /* Override encoder type for DVI-I based on whether EDID
 269                 * says the display is digital or analog, both use the
 270                 * same i2c channel so the value returned from ddc_detect
 271                 * isn't necessarily correct.
 272                 */
 273                nv_partner = NULL;
 274                if (nv_encoder->dcb->type == DCB_OUTPUT_TMDS)
 275                        nv_partner = find_encoder(connector, DCB_OUTPUT_ANALOG);
 276                if (nv_encoder->dcb->type == DCB_OUTPUT_ANALOG)
 277                        nv_partner = find_encoder(connector, DCB_OUTPUT_TMDS);
 278
 279                if (nv_partner && ((nv_encoder->dcb->type == DCB_OUTPUT_ANALOG &&
 280                                    nv_partner->dcb->type == DCB_OUTPUT_TMDS) ||
 281                                   (nv_encoder->dcb->type == DCB_OUTPUT_TMDS &&
 282                                    nv_partner->dcb->type == DCB_OUTPUT_ANALOG))) {
 283                        if (nv_connector->edid->input & DRM_EDID_INPUT_DIGITAL)
 284                                type = DCB_OUTPUT_TMDS;
 285                        else
 286                                type = DCB_OUTPUT_ANALOG;
 287
 288                        nv_encoder = find_encoder(connector, type);
 289                }
 290
 291                nouveau_connector_set_encoder(connector, nv_encoder);
 292                return connector_status_connected;
 293        }
 294
 295        nv_encoder = nouveau_connector_of_detect(connector);
 296        if (nv_encoder) {
 297                nouveau_connector_set_encoder(connector, nv_encoder);
 298                return connector_status_connected;
 299        }
 300
 301detect_analog:
 302        nv_encoder = find_encoder(connector, DCB_OUTPUT_ANALOG);
 303        if (!nv_encoder && !nouveau_tv_disable)
 304                nv_encoder = find_encoder(connector, DCB_OUTPUT_TV);
 305        if (nv_encoder && force) {
 306                struct drm_encoder *encoder = to_drm_encoder(nv_encoder);
 307                struct drm_encoder_helper_funcs *helper =
 308                                                encoder->helper_private;
 309
 310                if (helper->detect(encoder, connector) ==
 311                                                connector_status_connected) {
 312                        nouveau_connector_set_encoder(connector, nv_encoder);
 313                        return connector_status_connected;
 314                }
 315
 316        }
 317
 318        return connector_status_disconnected;
 319}
 320
 321static enum drm_connector_status
 322nouveau_connector_detect_lvds(struct drm_connector *connector, bool force)
 323{
 324        struct drm_device *dev = connector->dev;
 325        struct nouveau_drm *drm = nouveau_drm(dev);
 326        struct nouveau_connector *nv_connector = nouveau_connector(connector);
 327        struct nouveau_encoder *nv_encoder = NULL;
 328        enum drm_connector_status status = connector_status_disconnected;
 329
 330        /* Cleanup the previous EDID block. */
 331        if (nv_connector->edid) {
 332                drm_mode_connector_update_edid_property(connector, NULL);
 333                kfree(nv_connector->edid);
 334                nv_connector->edid = NULL;
 335        }
 336
 337        nv_encoder = find_encoder(connector, DCB_OUTPUT_LVDS);
 338        if (!nv_encoder)
 339                return connector_status_disconnected;
 340
 341        /* Try retrieving EDID via DDC */
 342        if (!drm->vbios.fp_no_ddc) {
 343                status = nouveau_connector_detect(connector, force);
 344                if (status == connector_status_connected)
 345                        goto out;
 346        }
 347
 348        /* On some laptops (Sony, i'm looking at you) there appears to
 349         * be no direct way of accessing the panel's EDID.  The only
 350         * option available to us appears to be to ask ACPI for help..
 351         *
 352         * It's important this check's before trying straps, one of the
 353         * said manufacturer's laptops are configured in such a way
 354         * the nouveau decides an entry in the VBIOS FP mode table is
 355         * valid - it's not (rh#613284)
 356         */
 357        if (nv_encoder->dcb->lvdsconf.use_acpi_for_edid) {
 358                if ((nv_connector->edid = nouveau_acpi_edid(dev, connector))) {
 359                        status = connector_status_connected;
 360                        goto out;
 361                }
 362        }
 363
 364        /* If no EDID found above, and the VBIOS indicates a hardcoded
 365         * modeline is avalilable for the panel, set it as the panel's
 366         * native mode and exit.
 367         */
 368        if (nouveau_bios_fp_mode(dev, NULL) && (drm->vbios.fp_no_ddc ||
 369            nv_encoder->dcb->lvdsconf.use_straps_for_mode)) {
 370                status = connector_status_connected;
 371                goto out;
 372        }
 373
 374        /* Still nothing, some VBIOS images have a hardcoded EDID block
 375         * stored for the panel stored in them.
 376         */
 377        if (!drm->vbios.fp_no_ddc) {
 378                struct edid *edid =
 379                        (struct edid *)nouveau_bios_embedded_edid(dev);
 380                if (edid) {
 381                        nv_connector->edid = kmalloc(EDID_LENGTH, GFP_KERNEL);
 382                        *(nv_connector->edid) = *edid;
 383                        status = connector_status_connected;
 384                }
 385        }
 386
 387out:
 388#if defined(CONFIG_ACPI_BUTTON) || \
 389        (defined(CONFIG_ACPI_BUTTON_MODULE) && defined(MODULE))
 390        if (status == connector_status_connected &&
 391            !nouveau_ignorelid && !acpi_lid_open())
 392                status = connector_status_unknown;
 393#endif
 394
 395        drm_mode_connector_update_edid_property(connector, nv_connector->edid);
 396        nouveau_connector_set_encoder(connector, nv_encoder);
 397        return status;
 398}
 399
 400static void
 401nouveau_connector_force(struct drm_connector *connector)
 402{
 403        struct nouveau_drm *drm = nouveau_drm(connector->dev);
 404        struct nouveau_connector *nv_connector = nouveau_connector(connector);
 405        struct nouveau_encoder *nv_encoder;
 406        int type;
 407
 408        if (nv_connector->type == DCB_CONNECTOR_DVI_I) {
 409                if (connector->force == DRM_FORCE_ON_DIGITAL)
 410                        type = DCB_OUTPUT_TMDS;
 411                else
 412                        type = DCB_OUTPUT_ANALOG;
 413        } else
 414                type = DCB_OUTPUT_ANY;
 415
 416        nv_encoder = find_encoder(connector, type);
 417        if (!nv_encoder) {
 418                NV_ERROR(drm, "can't find encoder to force %s on!\n",
 419                         drm_get_connector_name(connector));
 420                connector->status = connector_status_disconnected;
 421                return;
 422        }
 423
 424        nouveau_connector_set_encoder(connector, nv_encoder);
 425}
 426
 427static int
 428nouveau_connector_set_property(struct drm_connector *connector,
 429                               struct drm_property *property, uint64_t value)
 430{
 431        struct nouveau_display *disp = nouveau_display(connector->dev);
 432        struct nouveau_connector *nv_connector = nouveau_connector(connector);
 433        struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder;
 434        struct drm_encoder *encoder = to_drm_encoder(nv_encoder);
 435        struct drm_device *dev = connector->dev;
 436        struct nouveau_crtc *nv_crtc;
 437        int ret;
 438
 439        nv_crtc = NULL;
 440        if (connector->encoder && connector->encoder->crtc)
 441                nv_crtc = nouveau_crtc(connector->encoder->crtc);
 442
 443        /* Scaling mode */
 444        if (property == dev->mode_config.scaling_mode_property) {
 445                bool modeset = false;
 446
 447                switch (value) {
 448                case DRM_MODE_SCALE_NONE:
 449                case DRM_MODE_SCALE_FULLSCREEN:
 450                case DRM_MODE_SCALE_CENTER:
 451                case DRM_MODE_SCALE_ASPECT:
 452                        break;
 453                default:
 454                        return -EINVAL;
 455                }
 456
 457                /* LVDS always needs gpu scaling */
 458                if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS &&
 459                    value == DRM_MODE_SCALE_NONE)
 460                        return -EINVAL;
 461
 462                /* Changing between GPU and panel scaling requires a full
 463                 * modeset
 464                 */
 465                if ((nv_connector->scaling_mode == DRM_MODE_SCALE_NONE) ||
 466                    (value == DRM_MODE_SCALE_NONE))
 467                        modeset = true;
 468                nv_connector->scaling_mode = value;
 469
 470                if (!nv_crtc)
 471                        return 0;
 472
 473                if (modeset || !nv_crtc->set_scale) {
 474                        ret = drm_crtc_helper_set_mode(&nv_crtc->base,
 475                                                        &nv_crtc->base.mode,
 476                                                        nv_crtc->base.x,
 477                                                        nv_crtc->base.y, NULL);
 478                        if (!ret)
 479                                return -EINVAL;
 480                } else {
 481                        ret = nv_crtc->set_scale(nv_crtc, true);
 482                        if (ret)
 483                                return ret;
 484                }
 485
 486                return 0;
 487        }
 488
 489        /* Underscan */
 490        if (property == disp->underscan_property) {
 491                if (nv_connector->underscan != value) {
 492                        nv_connector->underscan = value;
 493                        if (!nv_crtc || !nv_crtc->set_scale)
 494                                return 0;
 495
 496                        return nv_crtc->set_scale(nv_crtc, true);
 497                }
 498
 499                return 0;
 500        }
 501
 502        if (property == disp->underscan_hborder_property) {
 503                if (nv_connector->underscan_hborder != value) {
 504                        nv_connector->underscan_hborder = value;
 505                        if (!nv_crtc || !nv_crtc->set_scale)
 506                                return 0;
 507
 508                        return nv_crtc->set_scale(nv_crtc, true);
 509                }
 510
 511                return 0;
 512        }
 513
 514        if (property == disp->underscan_vborder_property) {
 515                if (nv_connector->underscan_vborder != value) {
 516                        nv_connector->underscan_vborder = value;
 517                        if (!nv_crtc || !nv_crtc->set_scale)
 518                                return 0;
 519
 520                        return nv_crtc->set_scale(nv_crtc, true);
 521                }
 522
 523                return 0;
 524        }
 525
 526        /* Dithering */
 527        if (property == disp->dithering_mode) {
 528                nv_connector->dithering_mode = value;
 529                if (!nv_crtc || !nv_crtc->set_dither)
 530                        return 0;
 531
 532                return nv_crtc->set_dither(nv_crtc, true);
 533        }
 534
 535        if (property == disp->dithering_depth) {
 536                nv_connector->dithering_depth = value;
 537                if (!nv_crtc || !nv_crtc->set_dither)
 538                        return 0;
 539
 540                return nv_crtc->set_dither(nv_crtc, true);
 541        }
 542
 543        if (nv_crtc && nv_crtc->set_color_vibrance) {
 544                /* Hue */
 545                if (property == disp->vibrant_hue_property) {
 546                        nv_crtc->vibrant_hue = value - 90;
 547                        return nv_crtc->set_color_vibrance(nv_crtc, true);
 548                }
 549                /* Saturation */
 550                if (property == disp->color_vibrance_property) {
 551                        nv_crtc->color_vibrance = value - 100;
 552                        return nv_crtc->set_color_vibrance(nv_crtc, true);
 553                }
 554        }
 555
 556        if (nv_encoder && nv_encoder->dcb->type == DCB_OUTPUT_TV)
 557                return get_slave_funcs(encoder)->set_property(
 558                        encoder, connector, property, value);
 559
 560        return -EINVAL;
 561}
 562
 563static struct drm_display_mode *
 564nouveau_connector_native_mode(struct drm_connector *connector)
 565{
 566        struct drm_connector_helper_funcs *helper = connector->helper_private;
 567        struct nouveau_drm *drm = nouveau_drm(connector->dev);
 568        struct nouveau_connector *nv_connector = nouveau_connector(connector);
 569        struct drm_device *dev = connector->dev;
 570        struct drm_display_mode *mode, *largest = NULL;
 571        int high_w = 0, high_h = 0, high_v = 0;
 572
 573        list_for_each_entry(mode, &nv_connector->base.probed_modes, head) {
 574                mode->vrefresh = drm_mode_vrefresh(mode);
 575                if (helper->mode_valid(connector, mode) != MODE_OK ||
 576                    (mode->flags & DRM_MODE_FLAG_INTERLACE))
 577                        continue;
 578
 579                /* Use preferred mode if there is one.. */
 580                if (mode->type & DRM_MODE_TYPE_PREFERRED) {
 581                        NV_DEBUG(drm, "native mode from preferred\n");
 582                        return drm_mode_duplicate(dev, mode);
 583                }
 584
 585                /* Otherwise, take the resolution with the largest width, then
 586                 * height, then vertical refresh
 587                 */
 588                if (mode->hdisplay < high_w)
 589                        continue;
 590
 591                if (mode->hdisplay == high_w && mode->vdisplay < high_h)
 592                        continue;
 593
 594                if (mode->hdisplay == high_w && mode->vdisplay == high_h &&
 595                    mode->vrefresh < high_v)
 596                        continue;
 597
 598                high_w = mode->hdisplay;
 599                high_h = mode->vdisplay;
 600                high_v = mode->vrefresh;
 601                largest = mode;
 602        }
 603
 604        NV_DEBUG(drm, "native mode from largest: %dx%d@%d\n",
 605                      high_w, high_h, high_v);
 606        return largest ? drm_mode_duplicate(dev, largest) : NULL;
 607}
 608
 609struct moderec {
 610        int hdisplay;
 611        int vdisplay;
 612};
 613
 614static struct moderec scaler_modes[] = {
 615        { 1920, 1200 },
 616        { 1920, 1080 },
 617        { 1680, 1050 },
 618        { 1600, 1200 },
 619        { 1400, 1050 },
 620        { 1280, 1024 },
 621        { 1280, 960 },
 622        { 1152, 864 },
 623        { 1024, 768 },
 624        { 800, 600 },
 625        { 720, 400 },
 626        { 640, 480 },
 627        { 640, 400 },
 628        { 640, 350 },
 629        {}
 630};
 631
 632static int
 633nouveau_connector_scaler_modes_add(struct drm_connector *connector)
 634{
 635        struct nouveau_connector *nv_connector = nouveau_connector(connector);
 636        struct drm_display_mode *native = nv_connector->native_mode, *m;
 637        struct drm_device *dev = connector->dev;
 638        struct moderec *mode = &scaler_modes[0];
 639        int modes = 0;
 640
 641        if (!native)
 642                return 0;
 643
 644        while (mode->hdisplay) {
 645                if (mode->hdisplay <= native->hdisplay &&
 646                    mode->vdisplay <= native->vdisplay) {
 647                        m = drm_cvt_mode(dev, mode->hdisplay, mode->vdisplay,
 648                                         drm_mode_vrefresh(native), false,
 649                                         false, false);
 650                        if (!m)
 651                                continue;
 652
 653                        m->type |= DRM_MODE_TYPE_DRIVER;
 654
 655                        drm_mode_probed_add(connector, m);
 656                        modes++;
 657                }
 658
 659                mode++;
 660        }
 661
 662        return modes;
 663}
 664
 665static void
 666nouveau_connector_detect_depth(struct drm_connector *connector)
 667{
 668        struct nouveau_drm *drm = nouveau_drm(connector->dev);
 669        struct nouveau_connector *nv_connector = nouveau_connector(connector);
 670        struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder;
 671        struct nvbios *bios = &drm->vbios;
 672        struct drm_display_mode *mode = nv_connector->native_mode;
 673        bool duallink;
 674
 675        /* if the edid is feeling nice enough to provide this info, use it */
 676        if (nv_connector->edid && connector->display_info.bpc)
 677                return;
 678
 679        /* EDID 1.4 is *supposed* to be supported on eDP, but, Apple... */
 680        if (nv_connector->type == DCB_CONNECTOR_eDP) {
 681                connector->display_info.bpc = 6;
 682                return;
 683        }
 684
 685        /* we're out of options unless we're LVDS, default to 8bpc */
 686        if (nv_encoder->dcb->type != DCB_OUTPUT_LVDS) {
 687                connector->display_info.bpc = 8;
 688                return;
 689        }
 690
 691        connector->display_info.bpc = 6;
 692
 693        /* LVDS: panel straps */
 694        if (bios->fp_no_ddc) {
 695                if (bios->fp.if_is_24bit)
 696                        connector->display_info.bpc = 8;
 697                return;
 698        }
 699
 700        /* LVDS: DDC panel, need to first determine the number of links to
 701         * know which if_is_24bit flag to check...
 702         */
 703        if (nv_connector->edid &&
 704            nv_connector->type == DCB_CONNECTOR_LVDS_SPWG)
 705                duallink = ((u8 *)nv_connector->edid)[121] == 2;
 706        else
 707                duallink = mode->clock >= bios->fp.duallink_transition_clk;
 708
 709        if ((!duallink && (bios->fp.strapless_is_24bit & 1)) ||
 710            ( duallink && (bios->fp.strapless_is_24bit & 2)))
 711                connector->display_info.bpc = 8;
 712}
 713
 714static int
 715nouveau_connector_get_modes(struct drm_connector *connector)
 716{
 717        struct drm_device *dev = connector->dev;
 718        struct nouveau_drm *drm = nouveau_drm(dev);
 719        struct nouveau_connector *nv_connector = nouveau_connector(connector);
 720        struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder;
 721        struct drm_encoder *encoder = to_drm_encoder(nv_encoder);
 722        int ret = 0;
 723
 724        /* destroy the native mode, the attached monitor could have changed.
 725         */
 726        if (nv_connector->native_mode) {
 727                drm_mode_destroy(dev, nv_connector->native_mode);
 728                nv_connector->native_mode = NULL;
 729        }
 730
 731        if (nv_connector->edid)
 732                ret = drm_add_edid_modes(connector, nv_connector->edid);
 733        else
 734        if (nv_encoder->dcb->type == DCB_OUTPUT_LVDS &&
 735            (nv_encoder->dcb->lvdsconf.use_straps_for_mode ||
 736             drm->vbios.fp_no_ddc) && nouveau_bios_fp_mode(dev, NULL)) {
 737                struct drm_display_mode mode;
 738
 739                nouveau_bios_fp_mode(dev, &mode);
 740                nv_connector->native_mode = drm_mode_duplicate(dev, &mode);
 741        }
 742
 743        /* Determine display colour depth for everything except LVDS now,
 744         * DP requires this before mode_valid() is called.
 745         */
 746        if (connector->connector_type != DRM_MODE_CONNECTOR_LVDS)
 747                nouveau_connector_detect_depth(connector);
 748
 749        /* Find the native mode if this is a digital panel, if we didn't
 750         * find any modes through DDC previously add the native mode to
 751         * the list of modes.
 752         */
 753        if (!nv_connector->native_mode)
 754                nv_connector->native_mode =
 755                        nouveau_connector_native_mode(connector);
 756        if (ret == 0 && nv_connector->native_mode) {
 757                struct drm_display_mode *mode;
 758
 759                mode = drm_mode_duplicate(dev, nv_connector->native_mode);
 760                drm_mode_probed_add(connector, mode);
 761                ret = 1;
 762        }
 763
 764        /* Determine LVDS colour depth, must happen after determining
 765         * "native" mode as some VBIOS tables require us to use the
 766         * pixel clock as part of the lookup...
 767         */
 768        if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)
 769                nouveau_connector_detect_depth(connector);
 770
 771        if (nv_encoder->dcb->type == DCB_OUTPUT_TV)
 772                ret = get_slave_funcs(encoder)->get_modes(encoder, connector);
 773
 774        if (nv_connector->type == DCB_CONNECTOR_LVDS ||
 775            nv_connector->type == DCB_CONNECTOR_LVDS_SPWG ||
 776            nv_connector->type == DCB_CONNECTOR_eDP)
 777                ret += nouveau_connector_scaler_modes_add(connector);
 778
 779        return ret;
 780}
 781
 782static unsigned
 783get_tmds_link_bandwidth(struct drm_connector *connector)
 784{
 785        struct nouveau_connector *nv_connector = nouveau_connector(connector);
 786        struct nouveau_drm *drm = nouveau_drm(connector->dev);
 787        struct dcb_output *dcb = nv_connector->detected_encoder->dcb;
 788
 789        if (dcb->location != DCB_LOC_ON_CHIP ||
 790            nv_device(drm->device)->chipset >= 0x46)
 791                return 165000;
 792        else if (nv_device(drm->device)->chipset >= 0x40)
 793                return 155000;
 794        else if (nv_device(drm->device)->chipset >= 0x18)
 795                return 135000;
 796        else
 797                return 112000;
 798}
 799
 800static int
 801nouveau_connector_mode_valid(struct drm_connector *connector,
 802                             struct drm_display_mode *mode)
 803{
 804        struct nouveau_connector *nv_connector = nouveau_connector(connector);
 805        struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder;
 806        struct drm_encoder *encoder = to_drm_encoder(nv_encoder);
 807        unsigned min_clock = 25000, max_clock = min_clock;
 808        unsigned clock = mode->clock;
 809
 810        switch (nv_encoder->dcb->type) {
 811        case DCB_OUTPUT_LVDS:
 812                if (nv_connector->native_mode &&
 813                    (mode->hdisplay > nv_connector->native_mode->hdisplay ||
 814                     mode->vdisplay > nv_connector->native_mode->vdisplay))
 815                        return MODE_PANEL;
 816
 817                min_clock = 0;
 818                max_clock = 400000;
 819                break;
 820        case DCB_OUTPUT_TMDS:
 821                max_clock = get_tmds_link_bandwidth(connector);
 822                if (nouveau_duallink && nv_encoder->dcb->duallink_possible)
 823                        max_clock *= 2;
 824                break;
 825        case DCB_OUTPUT_ANALOG:
 826                max_clock = nv_encoder->dcb->crtconf.maxfreq;
 827                if (!max_clock)
 828                        max_clock = 350000;
 829                break;
 830        case DCB_OUTPUT_TV:
 831                return get_slave_funcs(encoder)->mode_valid(encoder, mode);
 832        case DCB_OUTPUT_DP:
 833                max_clock  = nv_encoder->dp.link_nr;
 834                max_clock *= nv_encoder->dp.link_bw;
 835                clock = clock * (connector->display_info.bpc * 3) / 10;
 836                break;
 837        default:
 838                BUG_ON(1);
 839                return MODE_BAD;
 840        }
 841
 842        if (clock < min_clock)
 843                return MODE_CLOCK_LOW;
 844
 845        if (clock > max_clock)
 846                return MODE_CLOCK_HIGH;
 847
 848        return MODE_OK;
 849}
 850
 851static struct drm_encoder *
 852nouveau_connector_best_encoder(struct drm_connector *connector)
 853{
 854        struct nouveau_connector *nv_connector = nouveau_connector(connector);
 855
 856        if (nv_connector->detected_encoder)
 857                return to_drm_encoder(nv_connector->detected_encoder);
 858
 859        return NULL;
 860}
 861
 862static const struct drm_connector_helper_funcs
 863nouveau_connector_helper_funcs = {
 864        .get_modes = nouveau_connector_get_modes,
 865        .mode_valid = nouveau_connector_mode_valid,
 866        .best_encoder = nouveau_connector_best_encoder,
 867};
 868
 869static const struct drm_connector_funcs
 870nouveau_connector_funcs = {
 871        .dpms = drm_helper_connector_dpms,
 872        .save = NULL,
 873        .restore = NULL,
 874        .detect = nouveau_connector_detect,
 875        .destroy = nouveau_connector_destroy,
 876        .fill_modes = drm_helper_probe_single_connector_modes,
 877        .set_property = nouveau_connector_set_property,
 878        .force = nouveau_connector_force
 879};
 880
 881static const struct drm_connector_funcs
 882nouveau_connector_funcs_lvds = {
 883        .dpms = drm_helper_connector_dpms,
 884        .save = NULL,
 885        .restore = NULL,
 886        .detect = nouveau_connector_detect_lvds,
 887        .destroy = nouveau_connector_destroy,
 888        .fill_modes = drm_helper_probe_single_connector_modes,
 889        .set_property = nouveau_connector_set_property,
 890        .force = nouveau_connector_force
 891};
 892
 893static int
 894drm_conntype_from_dcb(enum dcb_connector_type dcb)
 895{
 896        switch (dcb) {
 897        case DCB_CONNECTOR_VGA      : return DRM_MODE_CONNECTOR_VGA;
 898        case DCB_CONNECTOR_TV_0     :
 899        case DCB_CONNECTOR_TV_1     :
 900        case DCB_CONNECTOR_TV_3     : return DRM_MODE_CONNECTOR_TV;
 901        case DCB_CONNECTOR_DMS59_0  :
 902        case DCB_CONNECTOR_DMS59_1  :
 903        case DCB_CONNECTOR_DVI_I    : return DRM_MODE_CONNECTOR_DVII;
 904        case DCB_CONNECTOR_DVI_D    : return DRM_MODE_CONNECTOR_DVID;
 905        case DCB_CONNECTOR_LVDS     :
 906        case DCB_CONNECTOR_LVDS_SPWG: return DRM_MODE_CONNECTOR_LVDS;
 907        case DCB_CONNECTOR_DMS59_DP0:
 908        case DCB_CONNECTOR_DMS59_DP1:
 909        case DCB_CONNECTOR_DP       : return DRM_MODE_CONNECTOR_DisplayPort;
 910        case DCB_CONNECTOR_eDP      : return DRM_MODE_CONNECTOR_eDP;
 911        case DCB_CONNECTOR_HDMI_0   :
 912        case DCB_CONNECTOR_HDMI_1   : return DRM_MODE_CONNECTOR_HDMIA;
 913        default:
 914                break;
 915        }
 916
 917        return DRM_MODE_CONNECTOR_Unknown;
 918}
 919
 920struct drm_connector *
 921nouveau_connector_create(struct drm_device *dev, int index)
 922{
 923        const struct drm_connector_funcs *funcs = &nouveau_connector_funcs;
 924        struct nouveau_drm *drm = nouveau_drm(dev);
 925        struct nouveau_gpio *gpio = nouveau_gpio(drm->device);
 926        struct nouveau_display *disp = nouveau_display(dev);
 927        struct nouveau_connector *nv_connector = NULL;
 928        struct drm_connector *connector;
 929        int type, ret = 0;
 930        bool dummy;
 931
 932        NV_DEBUG(drm, "\n");
 933
 934        list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
 935                nv_connector = nouveau_connector(connector);
 936                if (nv_connector->index == index)
 937                        return connector;
 938        }
 939
 940        nv_connector = kzalloc(sizeof(*nv_connector), GFP_KERNEL);
 941        if (!nv_connector)
 942                return ERR_PTR(-ENOMEM);
 943
 944        connector = &nv_connector->base;
 945        nv_connector->index = index;
 946
 947        /* attempt to parse vbios connector type and hotplug gpio */
 948        nv_connector->dcb = olddcb_conn(dev, index);
 949        if (nv_connector->dcb) {
 950                static const u8 hpd[16] = {
 951                        0xff, 0x07, 0x08, 0xff, 0xff, 0x51, 0x52, 0xff,
 952                        0xff, 0xff, 0xff, 0xff, 0xff, 0x5e, 0x5f, 0x60,
 953                };
 954
 955                u32 entry = ROM16(nv_connector->dcb[0]);
 956                if (olddcb_conntab(dev)[3] >= 4)
 957                        entry |= (u32)ROM16(nv_connector->dcb[2]) << 16;
 958
 959                nv_connector->hpd = ffs((entry & 0x07033000) >> 12);
 960                nv_connector->hpd = hpd[nv_connector->hpd];
 961
 962                nv_connector->type = nv_connector->dcb[0];
 963                if (drm_conntype_from_dcb(nv_connector->type) ==
 964                                          DRM_MODE_CONNECTOR_Unknown) {
 965                        NV_WARN(drm, "unknown connector type %02x\n",
 966                                nv_connector->type);
 967                        nv_connector->type = DCB_CONNECTOR_NONE;
 968                }
 969
 970                /* Gigabyte NX85T */
 971                if (nv_match_device(dev, 0x0421, 0x1458, 0x344c)) {
 972                        if (nv_connector->type == DCB_CONNECTOR_HDMI_1)
 973                                nv_connector->type = DCB_CONNECTOR_DVI_I;
 974                }
 975
 976                /* Gigabyte GV-NX86T512H */
 977                if (nv_match_device(dev, 0x0402, 0x1458, 0x3455)) {
 978                        if (nv_connector->type == DCB_CONNECTOR_HDMI_1)
 979                                nv_connector->type = DCB_CONNECTOR_DVI_I;
 980                }
 981        } else {
 982                nv_connector->type = DCB_CONNECTOR_NONE;
 983                nv_connector->hpd = DCB_GPIO_UNUSED;
 984        }
 985
 986        /* no vbios data, or an unknown dcb connector type - attempt to
 987         * figure out something suitable ourselves
 988         */
 989        if (nv_connector->type == DCB_CONNECTOR_NONE) {
 990                struct nouveau_drm *drm = nouveau_drm(dev);
 991                struct dcb_table *dcbt = &drm->vbios.dcb;
 992                u32 encoders = 0;
 993                int i;
 994
 995                for (i = 0; i < dcbt->entries; i++) {
 996                        if (dcbt->entry[i].connector == nv_connector->index)
 997                                encoders |= (1 << dcbt->entry[i].type);
 998                }
 999
1000                if (encoders & (1 << DCB_OUTPUT_DP)) {
1001                        if (encoders & (1 << DCB_OUTPUT_TMDS))
1002                                nv_connector->type = DCB_CONNECTOR_DP;
1003                        else
1004                                nv_connector->type = DCB_CONNECTOR_eDP;
1005                } else
1006                if (encoders & (1 << DCB_OUTPUT_TMDS)) {
1007                        if (encoders & (1 << DCB_OUTPUT_ANALOG))
1008                                nv_connector->type = DCB_CONNECTOR_DVI_I;
1009                        else
1010                                nv_connector->type = DCB_CONNECTOR_DVI_D;
1011                } else
1012                if (encoders & (1 << DCB_OUTPUT_ANALOG)) {
1013                        nv_connector->type = DCB_CONNECTOR_VGA;
1014                } else
1015                if (encoders & (1 << DCB_OUTPUT_LVDS)) {
1016                        nv_connector->type = DCB_CONNECTOR_LVDS;
1017                } else
1018                if (encoders & (1 << DCB_OUTPUT_TV)) {
1019                        nv_connector->type = DCB_CONNECTOR_TV_0;
1020                }
1021        }
1022
1023        type = drm_conntype_from_dcb(nv_connector->type);
1024        if (type == DRM_MODE_CONNECTOR_LVDS) {
1025                ret = nouveau_bios_parse_lvds_table(dev, 0, &dummy, &dummy);
1026                if (ret) {
1027                        NV_ERROR(drm, "Error parsing LVDS table, disabling\n");
1028                        kfree(nv_connector);
1029                        return ERR_PTR(ret);
1030                }
1031
1032                funcs = &nouveau_connector_funcs_lvds;
1033        } else {
1034                funcs = &nouveau_connector_funcs;
1035        }
1036
1037        /* defaults, will get overridden in detect() */
1038        connector->interlace_allowed = false;
1039        connector->doublescan_allowed = false;
1040
1041        drm_connector_init(dev, connector, funcs, type);
1042        drm_connector_helper_add(connector, &nouveau_connector_helper_funcs);
1043
1044        /* Init DVI-I specific properties */
1045        if (nv_connector->type == DCB_CONNECTOR_DVI_I)
1046                drm_connector_attach_property(connector, dev->mode_config.dvi_i_subconnector_property, 0);
1047
1048        /* Add overscan compensation options to digital outputs */
1049        if (disp->underscan_property &&
1050            (type == DRM_MODE_CONNECTOR_DVID ||
1051             type == DRM_MODE_CONNECTOR_DVII ||
1052             type == DRM_MODE_CONNECTOR_HDMIA ||
1053             type == DRM_MODE_CONNECTOR_DisplayPort)) {
1054                drm_connector_attach_property(connector,
1055                                              disp->underscan_property,
1056                                              UNDERSCAN_OFF);
1057                drm_connector_attach_property(connector,
1058                                              disp->underscan_hborder_property,
1059                                              0);
1060                drm_connector_attach_property(connector,
1061                                              disp->underscan_vborder_property,
1062                                              0);
1063        }
1064
1065        /* Add hue and saturation options */
1066        if (disp->vibrant_hue_property)
1067                drm_connector_attach_property(connector,
1068                                              disp->vibrant_hue_property,
1069                                              90);
1070        if (disp->color_vibrance_property)
1071                drm_connector_attach_property(connector,
1072                                              disp->color_vibrance_property,
1073                                              150);
1074
1075        switch (nv_connector->type) {
1076        case DCB_CONNECTOR_VGA:
1077                if (nv_device(drm->device)->card_type >= NV_50) {
1078                        drm_connector_attach_property(connector,
1079                                        dev->mode_config.scaling_mode_property,
1080                                        nv_connector->scaling_mode);
1081                }
1082                /* fall-through */
1083        case DCB_CONNECTOR_TV_0:
1084        case DCB_CONNECTOR_TV_1:
1085        case DCB_CONNECTOR_TV_3:
1086                nv_connector->scaling_mode = DRM_MODE_SCALE_NONE;
1087                break;
1088        default:
1089                nv_connector->scaling_mode = DRM_MODE_SCALE_FULLSCREEN;
1090
1091                drm_connector_attach_property(connector,
1092                                dev->mode_config.scaling_mode_property,
1093                                nv_connector->scaling_mode);
1094                if (disp->dithering_mode) {
1095                        nv_connector->dithering_mode = DITHERING_MODE_AUTO;
1096                        drm_connector_attach_property(connector,
1097                                                disp->dithering_mode,
1098                                                nv_connector->dithering_mode);
1099                }
1100                if (disp->dithering_depth) {
1101                        nv_connector->dithering_depth = DITHERING_DEPTH_AUTO;
1102                        drm_connector_attach_property(connector,
1103                                                disp->dithering_depth,
1104                                                nv_connector->dithering_depth);
1105                }
1106                break;
1107        }
1108
1109        connector->polled = DRM_CONNECTOR_POLL_CONNECT;
1110        if (gpio && nv_connector->hpd != DCB_GPIO_UNUSED) {
1111                ret = gpio->isr_add(gpio, 0, nv_connector->hpd, 0xff,
1112                                    nouveau_connector_hotplug, connector);
1113                if (ret == 0)
1114                        connector->polled = DRM_CONNECTOR_POLL_HPD;
1115        }
1116
1117        drm_sysfs_connector_add(connector);
1118        return connector;
1119}
1120
1121static void
1122nouveau_connector_hotplug(void *data, int plugged)
1123{
1124        struct drm_connector *connector = data;
1125        struct drm_device *dev = connector->dev;
1126        struct nouveau_drm *drm = nouveau_drm(dev);
1127
1128        NV_DEBUG(drm, "%splugged %s\n", plugged ? "" : "un",
1129                 drm_get_connector_name(connector));
1130
1131        if (plugged)
1132                drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
1133        else
1134                drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
1135
1136        drm_helper_hpd_irq_event(dev);
1137}
1138