This source file includes following definitions.
- intel_hpd_pin_default
- intel_hpd_irq_storm_detect
- intel_hpd_irq_storm_switch_to_polling
- intel_hpd_irq_storm_reenable_work
- intel_encoder_hotplug
- intel_encoder_has_hpd_pulse
- i915_digport_work_func
- i915_hotplug_work_func
- intel_hpd_irq_handler
- intel_hpd_init
- i915_hpd_poll_init_work
- intel_hpd_poll_init
- intel_hpd_init_work
- intel_hpd_cancel_work
- intel_hpd_disable
- intel_hpd_enable
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 
  24 #include <linux/kernel.h>
  25 
  26 #include <drm/i915_drm.h>
  27 
  28 #include "i915_drv.h"
  29 #include "intel_display_types.h"
  30 #include "intel_hotplug.h"
  31 
  32 
  33 
  34 
  35 
  36 
  37 
  38 
  39 
  40 
  41 
  42 
  43 
  44 
  45 
  46 
  47 
  48 
  49 
  50 
  51 
  52 
  53 
  54 
  55 
  56 
  57 
  58 
  59 
  60 
  61 
  62 
  63 
  64 
  65 
  66 
  67 
  68 
  69 
  70 
  71 
  72 
  73 
  74 
  75 
  76 
  77 
  78 
  79 
  80 
  81 
  82 
  83 
  84 
  85 
  86 
  87 
  88 
  89 enum hpd_pin intel_hpd_pin_default(struct drm_i915_private *dev_priv,
  90                                    enum port port)
  91 {
  92         switch (port) {
  93         case PORT_A:
  94                 return HPD_PORT_A;
  95         case PORT_B:
  96                 return HPD_PORT_B;
  97         case PORT_C:
  98                 return HPD_PORT_C;
  99         case PORT_D:
 100                 return HPD_PORT_D;
 101         case PORT_E:
 102                 return HPD_PORT_E;
 103         case PORT_F:
 104                 if (IS_CNL_WITH_PORT_F(dev_priv))
 105                         return HPD_PORT_E;
 106                 return HPD_PORT_F;
 107         case PORT_G:
 108                 return HPD_PORT_G;
 109         case PORT_H:
 110                 return HPD_PORT_H;
 111         case PORT_I:
 112                 return HPD_PORT_I;
 113         default:
 114                 MISSING_CASE(port);
 115                 return HPD_NONE;
 116         }
 117 }
 118 
 119 #define HPD_STORM_DETECT_PERIOD         1000
 120 #define HPD_STORM_REENABLE_DELAY        (2 * 60 * 1000)
 121 #define HPD_RETRY_DELAY                 1000
 122 
 123 
 124 
 125 
 126 
 127 
 128 
 129 
 130 
 131 
 132 
 133 
 134 
 135 
 136 
 137 
 138 
 139 
 140 
 141 
 142 
 143 
 144 
 145 
 146 
 147 
 148 
 149 
 150 
 151 
 152 static bool intel_hpd_irq_storm_detect(struct drm_i915_private *dev_priv,
 153                                        enum hpd_pin pin, bool long_hpd)
 154 {
 155         struct i915_hotplug *hpd = &dev_priv->hotplug;
 156         unsigned long start = hpd->stats[pin].last_jiffies;
 157         unsigned long end = start + msecs_to_jiffies(HPD_STORM_DETECT_PERIOD);
 158         const int increment = long_hpd ? 10 : 1;
 159         const int threshold = hpd->hpd_storm_threshold;
 160         bool storm = false;
 161 
 162         if (!threshold ||
 163             (!long_hpd && !dev_priv->hotplug.hpd_short_storm_enabled))
 164                 return false;
 165 
 166         if (!time_in_range(jiffies, start, end)) {
 167                 hpd->stats[pin].last_jiffies = jiffies;
 168                 hpd->stats[pin].count = 0;
 169         }
 170 
 171         hpd->stats[pin].count += increment;
 172         if (hpd->stats[pin].count > threshold) {
 173                 hpd->stats[pin].state = HPD_MARK_DISABLED;
 174                 DRM_DEBUG_KMS("HPD interrupt storm detected on PIN %d\n", pin);
 175                 storm = true;
 176         } else {
 177                 DRM_DEBUG_KMS("Received HPD interrupt on PIN %d - cnt: %d\n", pin,
 178                               hpd->stats[pin].count);
 179         }
 180 
 181         return storm;
 182 }
 183 
 184 static void
 185 intel_hpd_irq_storm_switch_to_polling(struct drm_i915_private *dev_priv)
 186 {
 187         struct drm_device *dev = &dev_priv->drm;
 188         struct intel_connector *intel_connector;
 189         struct intel_encoder *intel_encoder;
 190         struct drm_connector *connector;
 191         struct drm_connector_list_iter conn_iter;
 192         enum hpd_pin pin;
 193         bool hpd_disabled = false;
 194 
 195         lockdep_assert_held(&dev_priv->irq_lock);
 196 
 197         drm_connector_list_iter_begin(dev, &conn_iter);
 198         drm_for_each_connector_iter(connector, &conn_iter) {
 199                 if (connector->polled != DRM_CONNECTOR_POLL_HPD)
 200                         continue;
 201 
 202                 intel_connector = to_intel_connector(connector);
 203                 intel_encoder = intel_connector->encoder;
 204                 if (!intel_encoder)
 205                         continue;
 206 
 207                 pin = intel_encoder->hpd_pin;
 208                 if (pin == HPD_NONE ||
 209                     dev_priv->hotplug.stats[pin].state != HPD_MARK_DISABLED)
 210                         continue;
 211 
 212                 DRM_INFO("HPD interrupt storm detected on connector %s: "
 213                          "switching from hotplug detection to polling\n",
 214                          connector->name);
 215 
 216                 dev_priv->hotplug.stats[pin].state = HPD_DISABLED;
 217                 connector->polled = DRM_CONNECTOR_POLL_CONNECT
 218                         | DRM_CONNECTOR_POLL_DISCONNECT;
 219                 hpd_disabled = true;
 220         }
 221         drm_connector_list_iter_end(&conn_iter);
 222 
 223         
 224         if (hpd_disabled) {
 225                 drm_kms_helper_poll_enable(dev);
 226                 mod_delayed_work(system_wq, &dev_priv->hotplug.reenable_work,
 227                                  msecs_to_jiffies(HPD_STORM_REENABLE_DELAY));
 228         }
 229 }
 230 
 231 static void intel_hpd_irq_storm_reenable_work(struct work_struct *work)
 232 {
 233         struct drm_i915_private *dev_priv =
 234                 container_of(work, typeof(*dev_priv),
 235                              hotplug.reenable_work.work);
 236         struct drm_device *dev = &dev_priv->drm;
 237         intel_wakeref_t wakeref;
 238         enum hpd_pin pin;
 239 
 240         wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
 241 
 242         spin_lock_irq(&dev_priv->irq_lock);
 243         for_each_hpd_pin(pin) {
 244                 struct drm_connector *connector;
 245                 struct drm_connector_list_iter conn_iter;
 246 
 247                 if (dev_priv->hotplug.stats[pin].state != HPD_DISABLED)
 248                         continue;
 249 
 250                 dev_priv->hotplug.stats[pin].state = HPD_ENABLED;
 251 
 252                 drm_connector_list_iter_begin(dev, &conn_iter);
 253                 drm_for_each_connector_iter(connector, &conn_iter) {
 254                         struct intel_connector *intel_connector = to_intel_connector(connector);
 255 
 256                         
 257                         if (!intel_connector->mst_port &&
 258                             intel_connector->encoder->hpd_pin == pin) {
 259                                 if (connector->polled != intel_connector->polled)
 260                                         DRM_DEBUG_DRIVER("Reenabling HPD on connector %s\n",
 261                                                          connector->name);
 262                                 connector->polled = intel_connector->polled;
 263                                 if (!connector->polled)
 264                                         connector->polled = DRM_CONNECTOR_POLL_HPD;
 265                         }
 266                 }
 267                 drm_connector_list_iter_end(&conn_iter);
 268         }
 269         if (dev_priv->display_irqs_enabled && dev_priv->display.hpd_irq_setup)
 270                 dev_priv->display.hpd_irq_setup(dev_priv);
 271         spin_unlock_irq(&dev_priv->irq_lock);
 272 
 273         intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref);
 274 }
 275 
 276 enum intel_hotplug_state
 277 intel_encoder_hotplug(struct intel_encoder *encoder,
 278                       struct intel_connector *connector,
 279                       bool irq_received)
 280 {
 281         struct drm_device *dev = connector->base.dev;
 282         enum drm_connector_status old_status;
 283 
 284         WARN_ON(!mutex_is_locked(&dev->mode_config.mutex));
 285         old_status = connector->base.status;
 286 
 287         connector->base.status =
 288                 drm_helper_probe_detect(&connector->base, NULL, false);
 289 
 290         if (old_status == connector->base.status)
 291                 return INTEL_HOTPLUG_UNCHANGED;
 292 
 293         DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %s to %s\n",
 294                       connector->base.base.id,
 295                       connector->base.name,
 296                       drm_get_connector_status_name(old_status),
 297                       drm_get_connector_status_name(connector->base.status));
 298 
 299         return INTEL_HOTPLUG_CHANGED;
 300 }
 301 
 302 static bool intel_encoder_has_hpd_pulse(struct intel_encoder *encoder)
 303 {
 304         return intel_encoder_is_dig_port(encoder) &&
 305                 enc_to_dig_port(&encoder->base)->hpd_pulse != NULL;
 306 }
 307 
 308 static void i915_digport_work_func(struct work_struct *work)
 309 {
 310         struct drm_i915_private *dev_priv =
 311                 container_of(work, struct drm_i915_private, hotplug.dig_port_work);
 312         u32 long_port_mask, short_port_mask;
 313         struct intel_encoder *encoder;
 314         u32 old_bits = 0;
 315 
 316         spin_lock_irq(&dev_priv->irq_lock);
 317         long_port_mask = dev_priv->hotplug.long_port_mask;
 318         dev_priv->hotplug.long_port_mask = 0;
 319         short_port_mask = dev_priv->hotplug.short_port_mask;
 320         dev_priv->hotplug.short_port_mask = 0;
 321         spin_unlock_irq(&dev_priv->irq_lock);
 322 
 323         for_each_intel_encoder(&dev_priv->drm, encoder) {
 324                 struct intel_digital_port *dig_port;
 325                 enum port port = encoder->port;
 326                 bool long_hpd, short_hpd;
 327                 enum irqreturn ret;
 328 
 329                 if (!intel_encoder_has_hpd_pulse(encoder))
 330                         continue;
 331 
 332                 long_hpd = long_port_mask & BIT(port);
 333                 short_hpd = short_port_mask & BIT(port);
 334 
 335                 if (!long_hpd && !short_hpd)
 336                         continue;
 337 
 338                 dig_port = enc_to_dig_port(&encoder->base);
 339 
 340                 ret = dig_port->hpd_pulse(dig_port, long_hpd);
 341                 if (ret == IRQ_NONE) {
 342                         
 343                         old_bits |= BIT(encoder->hpd_pin);
 344                 }
 345         }
 346 
 347         if (old_bits) {
 348                 spin_lock_irq(&dev_priv->irq_lock);
 349                 dev_priv->hotplug.event_bits |= old_bits;
 350                 spin_unlock_irq(&dev_priv->irq_lock);
 351                 queue_delayed_work(system_wq, &dev_priv->hotplug.hotplug_work, 0);
 352         }
 353 }
 354 
 355 
 356 
 357 
 358 static void i915_hotplug_work_func(struct work_struct *work)
 359 {
 360         struct drm_i915_private *dev_priv =
 361                 container_of(work, struct drm_i915_private,
 362                              hotplug.hotplug_work.work);
 363         struct drm_device *dev = &dev_priv->drm;
 364         struct intel_connector *intel_connector;
 365         struct intel_encoder *intel_encoder;
 366         struct drm_connector *connector;
 367         struct drm_connector_list_iter conn_iter;
 368         u32 changed = 0, retry = 0;
 369         u32 hpd_event_bits;
 370         u32 hpd_retry_bits;
 371 
 372         mutex_lock(&dev->mode_config.mutex);
 373         DRM_DEBUG_KMS("running encoder hotplug functions\n");
 374 
 375         spin_lock_irq(&dev_priv->irq_lock);
 376 
 377         hpd_event_bits = dev_priv->hotplug.event_bits;
 378         dev_priv->hotplug.event_bits = 0;
 379         hpd_retry_bits = dev_priv->hotplug.retry_bits;
 380         dev_priv->hotplug.retry_bits = 0;
 381 
 382         
 383         intel_hpd_irq_storm_switch_to_polling(dev_priv);
 384 
 385         spin_unlock_irq(&dev_priv->irq_lock);
 386 
 387         drm_connector_list_iter_begin(dev, &conn_iter);
 388         drm_for_each_connector_iter(connector, &conn_iter) {
 389                 u32 hpd_bit;
 390 
 391                 intel_connector = to_intel_connector(connector);
 392                 if (!intel_connector->encoder)
 393                         continue;
 394                 intel_encoder = intel_connector->encoder;
 395                 hpd_bit = BIT(intel_encoder->hpd_pin);
 396                 if ((hpd_event_bits | hpd_retry_bits) & hpd_bit) {
 397                         DRM_DEBUG_KMS("Connector %s (pin %i) received hotplug event.\n",
 398                                       connector->name, intel_encoder->hpd_pin);
 399 
 400                         switch (intel_encoder->hotplug(intel_encoder,
 401                                                        intel_connector,
 402                                                        hpd_event_bits & hpd_bit)) {
 403                         case INTEL_HOTPLUG_UNCHANGED:
 404                                 break;
 405                         case INTEL_HOTPLUG_CHANGED:
 406                                 changed |= hpd_bit;
 407                                 break;
 408                         case INTEL_HOTPLUG_RETRY:
 409                                 retry |= hpd_bit;
 410                                 break;
 411                         }
 412                 }
 413         }
 414         drm_connector_list_iter_end(&conn_iter);
 415         mutex_unlock(&dev->mode_config.mutex);
 416 
 417         if (changed)
 418                 drm_kms_helper_hotplug_event(dev);
 419 
 420         
 421         retry &= ~changed;
 422         if (retry) {
 423                 spin_lock_irq(&dev_priv->irq_lock);
 424                 dev_priv->hotplug.retry_bits |= retry;
 425                 spin_unlock_irq(&dev_priv->irq_lock);
 426 
 427                 mod_delayed_work(system_wq, &dev_priv->hotplug.hotplug_work,
 428                                  msecs_to_jiffies(HPD_RETRY_DELAY));
 429         }
 430 }
 431 
 432 
 433 
 434 
 435 
 436 
 437 
 438 
 439 
 440 
 441 
 442 
 443 
 444 
 445 
 446 
 447 
 448 
 449 void intel_hpd_irq_handler(struct drm_i915_private *dev_priv,
 450                            u32 pin_mask, u32 long_mask)
 451 {
 452         struct intel_encoder *encoder;
 453         bool storm_detected = false;
 454         bool queue_dig = false, queue_hp = false;
 455         u32 long_hpd_pulse_mask = 0;
 456         u32 short_hpd_pulse_mask = 0;
 457         enum hpd_pin pin;
 458 
 459         if (!pin_mask)
 460                 return;
 461 
 462         spin_lock(&dev_priv->irq_lock);
 463 
 464         
 465 
 466 
 467 
 468 
 469 
 470         for_each_intel_encoder(&dev_priv->drm, encoder) {
 471                 bool has_hpd_pulse = intel_encoder_has_hpd_pulse(encoder);
 472                 enum port port = encoder->port;
 473                 bool long_hpd;
 474 
 475                 pin = encoder->hpd_pin;
 476                 if (!(BIT(pin) & pin_mask))
 477                         continue;
 478 
 479                 if (!has_hpd_pulse)
 480                         continue;
 481 
 482                 long_hpd = long_mask & BIT(pin);
 483 
 484                 DRM_DEBUG_DRIVER("digital hpd port %c - %s\n", port_name(port),
 485                                  long_hpd ? "long" : "short");
 486                 queue_dig = true;
 487 
 488                 if (long_hpd) {
 489                         long_hpd_pulse_mask |= BIT(pin);
 490                         dev_priv->hotplug.long_port_mask |= BIT(port);
 491                 } else {
 492                         short_hpd_pulse_mask |= BIT(pin);
 493                         dev_priv->hotplug.short_port_mask |= BIT(port);
 494                 }
 495         }
 496 
 497         
 498         for_each_hpd_pin(pin) {
 499                 bool long_hpd;
 500 
 501                 if (!(BIT(pin) & pin_mask))
 502                         continue;
 503 
 504                 if (dev_priv->hotplug.stats[pin].state == HPD_DISABLED) {
 505                         
 506 
 507 
 508 
 509 
 510 
 511                         WARN_ONCE(!HAS_GMCH(dev_priv),
 512                                   "Received HPD interrupt on pin %d although disabled\n", pin);
 513                         continue;
 514                 }
 515 
 516                 if (dev_priv->hotplug.stats[pin].state != HPD_ENABLED)
 517                         continue;
 518 
 519                 
 520 
 521 
 522 
 523 
 524                 if (((short_hpd_pulse_mask | long_hpd_pulse_mask) & BIT(pin))) {
 525                         long_hpd = long_hpd_pulse_mask & BIT(pin);
 526                 } else {
 527                         dev_priv->hotplug.event_bits |= BIT(pin);
 528                         long_hpd = true;
 529                         queue_hp = true;
 530                 }
 531 
 532                 if (intel_hpd_irq_storm_detect(dev_priv, pin, long_hpd)) {
 533                         dev_priv->hotplug.event_bits &= ~BIT(pin);
 534                         storm_detected = true;
 535                         queue_hp = true;
 536                 }
 537         }
 538 
 539         
 540 
 541 
 542 
 543         if (storm_detected && dev_priv->display_irqs_enabled)
 544                 dev_priv->display.hpd_irq_setup(dev_priv);
 545         spin_unlock(&dev_priv->irq_lock);
 546 
 547         
 548 
 549 
 550 
 551 
 552 
 553         if (queue_dig)
 554                 queue_work(dev_priv->hotplug.dp_wq, &dev_priv->hotplug.dig_port_work);
 555         if (queue_hp)
 556                 queue_delayed_work(system_wq, &dev_priv->hotplug.hotplug_work, 0);
 557 }
 558 
 559 
 560 
 561 
 562 
 563 
 564 
 565 
 566 
 567 
 568 
 569 
 570 
 571 
 572 
 573 void intel_hpd_init(struct drm_i915_private *dev_priv)
 574 {
 575         int i;
 576 
 577         for_each_hpd_pin(i) {
 578                 dev_priv->hotplug.stats[i].count = 0;
 579                 dev_priv->hotplug.stats[i].state = HPD_ENABLED;
 580         }
 581 
 582         WRITE_ONCE(dev_priv->hotplug.poll_enabled, false);
 583         schedule_work(&dev_priv->hotplug.poll_init_work);
 584 
 585         
 586 
 587 
 588 
 589         if (dev_priv->display_irqs_enabled && dev_priv->display.hpd_irq_setup) {
 590                 spin_lock_irq(&dev_priv->irq_lock);
 591                 if (dev_priv->display_irqs_enabled)
 592                         dev_priv->display.hpd_irq_setup(dev_priv);
 593                 spin_unlock_irq(&dev_priv->irq_lock);
 594         }
 595 }
 596 
 597 static void i915_hpd_poll_init_work(struct work_struct *work)
 598 {
 599         struct drm_i915_private *dev_priv =
 600                 container_of(work, struct drm_i915_private,
 601                              hotplug.poll_init_work);
 602         struct drm_device *dev = &dev_priv->drm;
 603         struct drm_connector *connector;
 604         struct drm_connector_list_iter conn_iter;
 605         bool enabled;
 606 
 607         mutex_lock(&dev->mode_config.mutex);
 608 
 609         enabled = READ_ONCE(dev_priv->hotplug.poll_enabled);
 610 
 611         drm_connector_list_iter_begin(dev, &conn_iter);
 612         drm_for_each_connector_iter(connector, &conn_iter) {
 613                 struct intel_connector *intel_connector =
 614                         to_intel_connector(connector);
 615                 connector->polled = intel_connector->polled;
 616 
 617                 
 618 
 619                 if (intel_connector->mst_port)
 620                         continue;
 621 
 622                 if (!connector->polled && I915_HAS_HOTPLUG(dev_priv) &&
 623                     intel_connector->encoder->hpd_pin > HPD_NONE) {
 624                         connector->polled = enabled ?
 625                                 DRM_CONNECTOR_POLL_CONNECT |
 626                                 DRM_CONNECTOR_POLL_DISCONNECT :
 627                                 DRM_CONNECTOR_POLL_HPD;
 628                 }
 629         }
 630         drm_connector_list_iter_end(&conn_iter);
 631 
 632         if (enabled)
 633                 drm_kms_helper_poll_enable(dev);
 634 
 635         mutex_unlock(&dev->mode_config.mutex);
 636 
 637         
 638 
 639 
 640 
 641         if (!enabled)
 642                 drm_helper_hpd_irq_event(dev);
 643 }
 644 
 645 
 646 
 647 
 648 
 649 
 650 
 651 
 652 
 653 
 654 
 655 
 656 
 657 
 658 
 659 
 660 
 661 void intel_hpd_poll_init(struct drm_i915_private *dev_priv)
 662 {
 663         WRITE_ONCE(dev_priv->hotplug.poll_enabled, true);
 664 
 665         
 666 
 667 
 668 
 669 
 670 
 671         schedule_work(&dev_priv->hotplug.poll_init_work);
 672 }
 673 
 674 void intel_hpd_init_work(struct drm_i915_private *dev_priv)
 675 {
 676         INIT_DELAYED_WORK(&dev_priv->hotplug.hotplug_work,
 677                           i915_hotplug_work_func);
 678         INIT_WORK(&dev_priv->hotplug.dig_port_work, i915_digport_work_func);
 679         INIT_WORK(&dev_priv->hotplug.poll_init_work, i915_hpd_poll_init_work);
 680         INIT_DELAYED_WORK(&dev_priv->hotplug.reenable_work,
 681                           intel_hpd_irq_storm_reenable_work);
 682 }
 683 
 684 void intel_hpd_cancel_work(struct drm_i915_private *dev_priv)
 685 {
 686         spin_lock_irq(&dev_priv->irq_lock);
 687 
 688         dev_priv->hotplug.long_port_mask = 0;
 689         dev_priv->hotplug.short_port_mask = 0;
 690         dev_priv->hotplug.event_bits = 0;
 691         dev_priv->hotplug.retry_bits = 0;
 692 
 693         spin_unlock_irq(&dev_priv->irq_lock);
 694 
 695         cancel_work_sync(&dev_priv->hotplug.dig_port_work);
 696         cancel_delayed_work_sync(&dev_priv->hotplug.hotplug_work);
 697         cancel_work_sync(&dev_priv->hotplug.poll_init_work);
 698         cancel_delayed_work_sync(&dev_priv->hotplug.reenable_work);
 699 }
 700 
 701 bool intel_hpd_disable(struct drm_i915_private *dev_priv, enum hpd_pin pin)
 702 {
 703         bool ret = false;
 704 
 705         if (pin == HPD_NONE)
 706                 return false;
 707 
 708         spin_lock_irq(&dev_priv->irq_lock);
 709         if (dev_priv->hotplug.stats[pin].state == HPD_ENABLED) {
 710                 dev_priv->hotplug.stats[pin].state = HPD_DISABLED;
 711                 ret = true;
 712         }
 713         spin_unlock_irq(&dev_priv->irq_lock);
 714 
 715         return ret;
 716 }
 717 
 718 void intel_hpd_enable(struct drm_i915_private *dev_priv, enum hpd_pin pin)
 719 {
 720         if (pin == HPD_NONE)
 721                 return;
 722 
 723         spin_lock_irq(&dev_priv->irq_lock);
 724         dev_priv->hotplug.stats[pin].state = HPD_ENABLED;
 725         spin_unlock_irq(&dev_priv->irq_lock);
 726 }