aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h5
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c160
-rw-r--r--drivers/gpu/drm/i915/intel_ddi.c3
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c20
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h4
5 files changed, 183 insertions, 9 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 38362863b1dc..b560efc6eb35 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1559,6 +1559,11 @@ struct drm_i915_private {
1559 1559
1560 struct i915_runtime_pm pm; 1560 struct i915_runtime_pm pm;
1561 1561
1562 struct intel_digital_port *hpd_irq_port[I915_MAX_PORTS];
1563 u32 long_hpd_port_mask;
1564 u32 short_hpd_port_mask;
1565 struct work_struct dig_port_work;
1566
1562 /* Old dri1 support infrastructure, beware the dragons ya fools entering 1567 /* Old dri1 support infrastructure, beware the dragons ya fools entering
1563 * here! */ 1568 * here! */
1564 struct i915_dri1_state dri1; 1569 struct i915_dri1_state dri1;
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 1c1ec22bc7ef..c50e3b41d6fe 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -1090,6 +1090,53 @@ static bool intel_hpd_irq_event(struct drm_device *dev,
1090 return true; 1090 return true;
1091} 1091}
1092 1092
1093static void i915_digport_work_func(struct work_struct *work)
1094{
1095 struct drm_i915_private *dev_priv =
1096 container_of(work, struct drm_i915_private, dig_port_work);
1097 unsigned long irqflags;
1098 u32 long_port_mask, short_port_mask;
1099 struct intel_digital_port *intel_dig_port;
1100 int i, ret;
1101 u32 old_bits = 0;
1102
1103 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
1104 long_port_mask = dev_priv->long_hpd_port_mask;
1105 dev_priv->long_hpd_port_mask = 0;
1106 short_port_mask = dev_priv->short_hpd_port_mask;
1107 dev_priv->short_hpd_port_mask = 0;
1108 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
1109
1110 for (i = 0; i < I915_MAX_PORTS; i++) {
1111 bool valid = false;
1112 bool long_hpd = false;
1113 intel_dig_port = dev_priv->hpd_irq_port[i];
1114 if (!intel_dig_port || !intel_dig_port->hpd_pulse)
1115 continue;
1116
1117 if (long_port_mask & (1 << i)) {
1118 valid = true;
1119 long_hpd = true;
1120 } else if (short_port_mask & (1 << i))
1121 valid = true;
1122
1123 if (valid) {
1124 ret = intel_dig_port->hpd_pulse(intel_dig_port, long_hpd);
1125 if (ret == true) {
1126 /* if we get true fallback to old school hpd */
1127 old_bits |= (1 << intel_dig_port->base.hpd_pin);
1128 }
1129 }
1130 }
1131
1132 if (old_bits) {
1133 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
1134 dev_priv->hpd_event_bits |= old_bits;
1135 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
1136 schedule_work(&dev_priv->hotplug_work);
1137 }
1138}
1139
1093/* 1140/*
1094 * Handle hotplug events outside the interrupt handler proper. 1141 * Handle hotplug events outside the interrupt handler proper.
1095 */ 1142 */
@@ -1521,23 +1568,104 @@ static irqreturn_t gen8_gt_irq_handler(struct drm_device *dev,
1521#define HPD_STORM_DETECT_PERIOD 1000 1568#define HPD_STORM_DETECT_PERIOD 1000
1522#define HPD_STORM_THRESHOLD 5 1569#define HPD_STORM_THRESHOLD 5
1523 1570
1571static int ilk_port_to_hotplug_shift(enum port port)
1572{
1573 switch (port) {
1574 case PORT_A:
1575 case PORT_E:
1576 default:
1577 return -1;
1578 case PORT_B:
1579 return 0;
1580 case PORT_C:
1581 return 8;
1582 case PORT_D:
1583 return 16;
1584 }
1585}
1586
1587static int g4x_port_to_hotplug_shift(enum port port)
1588{
1589 switch (port) {
1590 case PORT_A:
1591 case PORT_E:
1592 default:
1593 return -1;
1594 case PORT_B:
1595 return 17;
1596 case PORT_C:
1597 return 19;
1598 case PORT_D:
1599 return 21;
1600 }
1601}
1602
1603static inline enum port get_port_from_pin(enum hpd_pin pin)
1604{
1605 switch (pin) {
1606 case HPD_PORT_B:
1607 return PORT_B;
1608 case HPD_PORT_C:
1609 return PORT_C;
1610 case HPD_PORT_D:
1611 return PORT_D;
1612 default:
1613 return PORT_A; /* no hpd */
1614 }
1615}
1616
1524static inline void intel_hpd_irq_handler(struct drm_device *dev, 1617static inline void intel_hpd_irq_handler(struct drm_device *dev,
1525 u32 hotplug_trigger, 1618 u32 hotplug_trigger,
1619 u32 dig_hotplug_reg,
1526 const u32 *hpd) 1620 const u32 *hpd)
1527{ 1621{
1528 struct drm_i915_private *dev_priv = dev->dev_private; 1622 struct drm_i915_private *dev_priv = dev->dev_private;
1529 int i; 1623 int i;
1624 enum port port;
1530 bool storm_detected = false; 1625 bool storm_detected = false;
1626 bool queue_dig = false, queue_hp = false;
1627 u32 dig_shift;
1628 u32 dig_port_mask = 0;
1531 1629
1532 if (!hotplug_trigger) 1630 if (!hotplug_trigger)
1533 return; 1631 return;
1534 1632
1535 DRM_DEBUG_DRIVER("hotplug event received, stat 0x%08x\n", 1633 DRM_DEBUG_DRIVER("hotplug event received, stat 0x%08x, dig 0x%08x\n",
1536 hotplug_trigger); 1634 hotplug_trigger, dig_hotplug_reg);
1537 1635
1538 spin_lock(&dev_priv->irq_lock); 1636 spin_lock(&dev_priv->irq_lock);
1539 for (i = 1; i < HPD_NUM_PINS; i++) { 1637 for (i = 1; i < HPD_NUM_PINS; i++) {
1638 if (!(hpd[i] & hotplug_trigger))
1639 continue;
1640
1641 port = get_port_from_pin(i);
1642 if (port && dev_priv->hpd_irq_port[port]) {
1643 bool long_hpd;
1644
1645 if (IS_G4X(dev)) {
1646 dig_shift = g4x_port_to_hotplug_shift(port);
1647 long_hpd = (hotplug_trigger >> dig_shift) & PORTB_HOTPLUG_LONG_DETECT;
1648 } else {
1649 dig_shift = ilk_port_to_hotplug_shift(port);
1650 long_hpd = (dig_hotplug_reg >> dig_shift) & PORTB_HOTPLUG_LONG_DETECT;
1651 }
1652
1653 DRM_DEBUG_DRIVER("digital hpd port %d %d\n", port, long_hpd);
1654 /* for long HPD pulses we want to have the digital queue happen,
1655 but we still want HPD storm detection to function. */
1656 if (long_hpd) {
1657 dev_priv->long_hpd_port_mask |= (1 << port);
1658 dig_port_mask |= hpd[i];
1659 } else {
1660 /* for short HPD just trigger the digital queue */
1661 dev_priv->short_hpd_port_mask |= (1 << port);
1662 hotplug_trigger &= ~hpd[i];
1663 }
1664 queue_dig = true;
1665 }
1666 }
1540 1667
1668 for (i = 1; i < HPD_NUM_PINS; i++) {
1541 if (hpd[i] & hotplug_trigger && 1669 if (hpd[i] & hotplug_trigger &&
1542 dev_priv->hpd_stats[i].hpd_mark == HPD_DISABLED) { 1670 dev_priv->hpd_stats[i].hpd_mark == HPD_DISABLED) {
1543 /* 1671 /*
@@ -1557,7 +1685,11 @@ static inline void intel_hpd_irq_handler(struct drm_device *dev,
1557 dev_priv->hpd_stats[i].hpd_mark != HPD_ENABLED) 1685 dev_priv->hpd_stats[i].hpd_mark != HPD_ENABLED)
1558 continue; 1686 continue;
1559 1687
1560 dev_priv->hpd_event_bits |= (1 << i); 1688 if (!(dig_port_mask & hpd[i])) {
1689 dev_priv->hpd_event_bits |= (1 << i);
1690 queue_hp = true;
1691 }
1692
1561 if (!time_in_range(jiffies, dev_priv->hpd_stats[i].hpd_last_jiffies, 1693 if (!time_in_range(jiffies, dev_priv->hpd_stats[i].hpd_last_jiffies,
1562 dev_priv->hpd_stats[i].hpd_last_jiffies 1694 dev_priv->hpd_stats[i].hpd_last_jiffies
1563 + msecs_to_jiffies(HPD_STORM_DETECT_PERIOD))) { 1695 + msecs_to_jiffies(HPD_STORM_DETECT_PERIOD))) {
@@ -1586,7 +1718,10 @@ static inline void intel_hpd_irq_handler(struct drm_device *dev,
1586 * queue for otherwise the flush_work in the pageflip code will 1718 * queue for otherwise the flush_work in the pageflip code will
1587 * deadlock. 1719 * deadlock.
1588 */ 1720 */
1589 schedule_work(&dev_priv->hotplug_work); 1721 if (queue_dig)
1722 schedule_work(&dev_priv->dig_port_work);
1723 if (queue_hp)
1724 schedule_work(&dev_priv->hotplug_work);
1590} 1725}
1591 1726
1592static void gmbus_irq_handler(struct drm_device *dev) 1727static void gmbus_irq_handler(struct drm_device *dev)
@@ -1827,11 +1962,11 @@ static void i9xx_hpd_irq_handler(struct drm_device *dev)
1827 if (IS_G4X(dev)) { 1962 if (IS_G4X(dev)) {
1828 u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_G4X; 1963 u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_G4X;
1829 1964
1830 intel_hpd_irq_handler(dev, hotplug_trigger, hpd_status_g4x); 1965 intel_hpd_irq_handler(dev, hotplug_trigger, 0, hpd_status_g4x);
1831 } else { 1966 } else {
1832 u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_I915; 1967 u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_I915;
1833 1968
1834 intel_hpd_irq_handler(dev, hotplug_trigger, hpd_status_i915); 1969 intel_hpd_irq_handler(dev, hotplug_trigger, 0, hpd_status_i915);
1835 } 1970 }
1836 1971
1837 if ((IS_G4X(dev) || IS_VALLEYVIEW(dev)) && 1972 if ((IS_G4X(dev) || IS_VALLEYVIEW(dev)) &&
@@ -1929,8 +2064,12 @@ static void ibx_irq_handler(struct drm_device *dev, u32 pch_iir)
1929 struct drm_i915_private *dev_priv = dev->dev_private; 2064 struct drm_i915_private *dev_priv = dev->dev_private;
1930 int pipe; 2065 int pipe;
1931 u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK; 2066 u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK;
2067 u32 dig_hotplug_reg;
2068
2069 dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG);
2070 I915_WRITE(PCH_PORT_HOTPLUG, dig_hotplug_reg);
1932 2071
1933 intel_hpd_irq_handler(dev, hotplug_trigger, hpd_ibx); 2072 intel_hpd_irq_handler(dev, hotplug_trigger, dig_hotplug_reg, hpd_ibx);
1934 2073
1935 if (pch_iir & SDE_AUDIO_POWER_MASK) { 2074 if (pch_iir & SDE_AUDIO_POWER_MASK) {
1936 int port = ffs((pch_iir & SDE_AUDIO_POWER_MASK) >> 2075 int port = ffs((pch_iir & SDE_AUDIO_POWER_MASK) >>
@@ -2036,8 +2175,12 @@ static void cpt_irq_handler(struct drm_device *dev, u32 pch_iir)
2036 struct drm_i915_private *dev_priv = dev->dev_private; 2175 struct drm_i915_private *dev_priv = dev->dev_private;
2037 int pipe; 2176 int pipe;
2038 u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK_CPT; 2177 u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK_CPT;
2178 u32 dig_hotplug_reg;
2179
2180 dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG);
2181 I915_WRITE(PCH_PORT_HOTPLUG, dig_hotplug_reg);
2039 2182
2040 intel_hpd_irq_handler(dev, hotplug_trigger, hpd_cpt); 2183 intel_hpd_irq_handler(dev, hotplug_trigger, dig_hotplug_reg, hpd_cpt);
2041 2184
2042 if (pch_iir & SDE_AUDIO_POWER_MASK_CPT) { 2185 if (pch_iir & SDE_AUDIO_POWER_MASK_CPT) {
2043 int port = ffs((pch_iir & SDE_AUDIO_POWER_MASK_CPT) >> 2186 int port = ffs((pch_iir & SDE_AUDIO_POWER_MASK_CPT) >>
@@ -4358,6 +4501,7 @@ void intel_irq_init(struct drm_device *dev)
4358 struct drm_i915_private *dev_priv = dev->dev_private; 4501 struct drm_i915_private *dev_priv = dev->dev_private;
4359 4502
4360 INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func); 4503 INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func);
4504 INIT_WORK(&dev_priv->dig_port_work, i915_digport_work_func);
4361 INIT_WORK(&dev_priv->gpu_error.work, i915_error_work_func); 4505 INIT_WORK(&dev_priv->gpu_error.work, i915_error_work_func);
4362 INIT_WORK(&dev_priv->rps.work, gen6_pm_rps_work); 4506 INIT_WORK(&dev_priv->rps.work, gen6_pm_rps_work);
4363 INIT_WORK(&dev_priv->l3_parity.error_work, ivybridge_parity_work); 4507 INIT_WORK(&dev_priv->l3_parity.error_work, ivybridge_parity_work);
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index ded60139820e..efaf44b5ff25 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -1705,6 +1705,9 @@ void intel_ddi_init(struct drm_device *dev, enum port port)
1705 intel_encoder->cloneable = 0; 1705 intel_encoder->cloneable = 0;
1706 intel_encoder->hot_plug = intel_ddi_hot_plug; 1706 intel_encoder->hot_plug = intel_ddi_hot_plug;
1707 1707
1708 intel_dig_port->hpd_pulse = intel_dp_hpd_pulse;
1709 dev_priv->hpd_irq_port[port] = intel_dig_port;
1710
1708 if (init_dp) 1711 if (init_dp)
1709 dp_connector = intel_ddi_init_dp_connector(intel_dig_port); 1712 dp_connector = intel_ddi_init_dp_connector(intel_dig_port);
1710 1713
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 23b62b0d9e3b..2da413cba987 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -3815,6 +3815,22 @@ intel_dp_hot_plug(struct intel_encoder *intel_encoder)
3815 intel_dp_check_link_status(intel_dp); 3815 intel_dp_check_link_status(intel_dp);
3816} 3816}
3817 3817
3818bool
3819intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd)
3820{
3821 struct intel_dp *intel_dp = &intel_dig_port->dp;
3822
3823 if (long_hpd)
3824 return true;
3825
3826 /*
3827 * we'll check the link status via the normal hot plug path later -
3828 * but for short hpds we should check it now
3829 */
3830 intel_dp_check_link_status(intel_dp);
3831 return false;
3832}
3833
3818/* Return which DP Port should be selected for Transcoder DP control */ 3834/* Return which DP Port should be selected for Transcoder DP control */
3819int 3835int
3820intel_trans_dp_port_sel(struct drm_crtc *crtc) 3836intel_trans_dp_port_sel(struct drm_crtc *crtc)
@@ -4387,6 +4403,7 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
4387void 4403void
4388intel_dp_init(struct drm_device *dev, int output_reg, enum port port) 4404intel_dp_init(struct drm_device *dev, int output_reg, enum port port)
4389{ 4405{
4406 struct drm_i915_private *dev_priv = dev->dev_private;
4390 struct intel_digital_port *intel_dig_port; 4407 struct intel_digital_port *intel_dig_port;
4391 struct intel_encoder *intel_encoder; 4408 struct intel_encoder *intel_encoder;
4392 struct drm_encoder *encoder; 4409 struct drm_encoder *encoder;
@@ -4443,6 +4460,9 @@ intel_dp_init(struct drm_device *dev, int output_reg, enum port port)
4443 intel_encoder->cloneable = 0; 4460 intel_encoder->cloneable = 0;
4444 intel_encoder->hot_plug = intel_dp_hot_plug; 4461 intel_encoder->hot_plug = intel_dp_hot_plug;
4445 4462
4463 intel_dig_port->hpd_pulse = intel_dp_hpd_pulse;
4464 dev_priv->hpd_irq_port[port] = intel_dig_port;
4465
4446 if (!intel_dp_init_connector(intel_dig_port, intel_connector)) { 4466 if (!intel_dp_init_connector(intel_dig_port, intel_connector)) {
4447 drm_encoder_cleanup(encoder); 4467 drm_encoder_cleanup(encoder);
4448 kfree(intel_dig_port); 4468 kfree(intel_dig_port);
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 0ef04ea68719..45afd25f9362 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -567,6 +567,7 @@ struct intel_digital_port {
567 u32 saved_port_bits; 567 u32 saved_port_bits;
568 struct intel_dp dp; 568 struct intel_dp dp;
569 struct intel_hdmi hdmi; 569 struct intel_hdmi hdmi;
570 bool (*hpd_pulse)(struct intel_digital_port *, bool);
570}; 571};
571 572
572static inline int 573static inline int
@@ -850,6 +851,8 @@ int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc);
850bool intel_dp_compute_config(struct intel_encoder *encoder, 851bool intel_dp_compute_config(struct intel_encoder *encoder,
851 struct intel_crtc_config *pipe_config); 852 struct intel_crtc_config *pipe_config);
852bool intel_dp_is_edp(struct drm_device *dev, enum port port); 853bool intel_dp_is_edp(struct drm_device *dev, enum port port);
854bool intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port,
855 bool long_hpd);
853void intel_edp_backlight_on(struct intel_dp *intel_dp); 856void intel_edp_backlight_on(struct intel_dp *intel_dp);
854void intel_edp_backlight_off(struct intel_dp *intel_dp); 857void intel_edp_backlight_off(struct intel_dp *intel_dp);
855void intel_edp_panel_vdd_on(struct intel_dp *intel_dp); 858void intel_edp_panel_vdd_on(struct intel_dp *intel_dp);
@@ -861,7 +864,6 @@ void intel_dp_set_drrs_state(struct drm_device *dev, int refresh_rate);
861void intel_edp_psr_exit(struct drm_device *dev); 864void intel_edp_psr_exit(struct drm_device *dev);
862void intel_edp_psr_init(struct drm_device *dev); 865void intel_edp_psr_init(struct drm_device *dev);
863 866
864
865/* intel_dsi.c */ 867/* intel_dsi.c */
866void intel_dsi_init(struct drm_device *dev); 868void intel_dsi_init(struct drm_device *dev);
867 869