aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJani Nikula <jani.nikula@intel.com>2014-03-14 10:51:15 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-03-18 10:05:34 -0400
commit9d1a1031e84f30f3671f0a650fc38a7c588acc8a (patch)
tree8ef8ac96c735f7da51f6dde341ad770b6aa7bba1
parent884f19e948894fc87b03b631fd03a0998c0ca1ef (diff)
drm/i915/dp: use the new drm helpers for dp aux
Functionality remains largely the same as before. Note that the retry loops and native reply handling all moved into the core drm helper functions now. Signed-off-by: Jani Nikula <jani.nikula@intel.com> [danvet: Fix up the stray ; Rodrigo spotted in his review and add a note to the commit message to answer Rodrigo's question in his review.] Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c257
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h1
2 files changed, 116 insertions, 142 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 17d73511e148..b31f6db5d0c0 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -575,97 +575,77 @@ out:
575 return ret; 575 return ret;
576} 576}
577 577
578/* Write data to the aux channel in native mode */ 578#define HEADER_SIZE 4
579static int 579static ssize_t
580intel_dp_aux_native_write(struct intel_dp *intel_dp, 580intel_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
581 uint16_t address, uint8_t *send, int send_bytes)
582{ 581{
582 struct intel_dp *intel_dp = container_of(aux, struct intel_dp, aux);
583 uint8_t txbuf[20], rxbuf[20];
584 size_t txsize, rxsize;
583 int ret; 585 int ret;
584 uint8_t msg[20];
585 int msg_bytes;
586 uint8_t ack;
587 int retry;
588 586
589 if (WARN_ON(send_bytes > 16)) 587 txbuf[0] = msg->request << 4;
590 return -E2BIG; 588 txbuf[1] = msg->address >> 8;
589 txbuf[2] = msg->address & 0xff;
590 txbuf[3] = msg->size - 1;
591 591
592 intel_dp_check_edp(intel_dp); 592 switch (msg->request & ~DP_AUX_I2C_MOT) {
593 msg[0] = DP_AUX_NATIVE_WRITE << 4; 593 case DP_AUX_NATIVE_WRITE:
594 msg[1] = address >> 8; 594 case DP_AUX_I2C_WRITE:
595 msg[2] = address & 0xff; 595 txsize = HEADER_SIZE + msg->size;
596 msg[3] = send_bytes - 1; 596 rxsize = 1;
597 memcpy(&msg[4], send, send_bytes);
598 msg_bytes = send_bytes + 4;
599 for (retry = 0; retry < 7; retry++) {
600 ret = intel_dp_aux_ch(intel_dp, msg, msg_bytes, &ack, 1);
601 if (ret < 0)
602 return ret;
603 ack >>= 4;
604 if ((ack & DP_AUX_NATIVE_REPLY_MASK) == DP_AUX_NATIVE_REPLY_ACK)
605 return send_bytes;
606 else if ((ack & DP_AUX_NATIVE_REPLY_MASK) == DP_AUX_NATIVE_REPLY_DEFER)
607 usleep_range(400, 500);
608 else
609 return -EIO;
610 }
611 597
612 DRM_ERROR("too many retries, giving up\n"); 598 if (WARN_ON(txsize > 20))
613 return -EIO; 599 return -E2BIG;
614}
615 600
616/* Write a single byte to the aux channel in native mode */ 601 memcpy(txbuf + HEADER_SIZE, msg->buffer, msg->size);
617static int
618intel_dp_aux_native_write_1(struct intel_dp *intel_dp,
619 uint16_t address, uint8_t byte)
620{
621 return intel_dp_aux_native_write(intel_dp, address, &byte, 1);
622}
623 602
624/* read bytes from a native aux channel */ 603 ret = intel_dp_aux_ch(intel_dp, txbuf, txsize, rxbuf, rxsize);
625static int 604 if (ret > 0) {
626intel_dp_aux_native_read(struct intel_dp *intel_dp, 605 msg->reply = rxbuf[0] >> 4;
627 uint16_t address, uint8_t *recv, int recv_bytes)
628{
629 uint8_t msg[4];
630 int msg_bytes;
631 uint8_t reply[20];
632 int reply_bytes;
633 uint8_t ack;
634 int ret;
635 int retry;
636 606
637 if (WARN_ON(recv_bytes > 19)) 607 /* Return payload size. */
638 return -E2BIG; 608 ret = msg->size;
609 }
610 break;
639 611
640 intel_dp_check_edp(intel_dp); 612 case DP_AUX_NATIVE_READ:
641 msg[0] = DP_AUX_NATIVE_READ << 4; 613 case DP_AUX_I2C_READ:
642 msg[1] = address >> 8; 614 txsize = HEADER_SIZE;
643 msg[2] = address & 0xff; 615 rxsize = msg->size + 1;
644 msg[3] = recv_bytes - 1;
645 616
646 msg_bytes = 4; 617 if (WARN_ON(rxsize > 20))
647 reply_bytes = recv_bytes + 1; 618 return -E2BIG;
648 619
649 for (retry = 0; retry < 7; retry++) { 620 ret = intel_dp_aux_ch(intel_dp, txbuf, txsize, rxbuf, rxsize);
650 ret = intel_dp_aux_ch(intel_dp, msg, msg_bytes, 621 if (ret > 0) {
651 reply, reply_bytes); 622 msg->reply = rxbuf[0] >> 4;
652 if (ret == 0) 623 /*
653 return -EPROTO; 624 * Assume happy day, and copy the data. The caller is
654 if (ret < 0) 625 * expected to check msg->reply before touching it.
655 return ret; 626 *
656 ack = reply[0] >> 4; 627 * Return payload size.
657 if ((ack & DP_AUX_NATIVE_REPLY_MASK) == DP_AUX_NATIVE_REPLY_ACK) { 628 */
658 memcpy(recv, reply + 1, ret - 1); 629 ret--;
659 return ret - 1; 630 memcpy(msg->buffer, rxbuf + 1, ret);
660 } 631 }
661 else if ((ack & DP_AUX_NATIVE_REPLY_MASK) == DP_AUX_NATIVE_REPLY_DEFER) 632 break;
662 usleep_range(400, 500); 633
663 else 634 default:
664 return -EIO; 635 ret = -EINVAL;
636 break;
665 } 637 }
666 638
667 DRM_ERROR("too many retries, giving up\n"); 639 return ret;
668 return -EIO; 640}
641
642static void
643intel_dp_aux_init(struct intel_dp *intel_dp, struct intel_connector *connector)
644{
645 struct drm_device *dev = intel_dp_to_dev(intel_dp);
646
647 intel_dp->aux.dev = dev->dev;
648 intel_dp->aux.transfer = intel_dp_aux_transfer;
669} 649}
670 650
671static int 651static int
@@ -1472,8 +1452,8 @@ void intel_dp_sink_dpms(struct intel_dp *intel_dp, int mode)
1472 return; 1452 return;
1473 1453
1474 if (mode != DRM_MODE_DPMS_ON) { 1454 if (mode != DRM_MODE_DPMS_ON) {
1475 ret = intel_dp_aux_native_write_1(intel_dp, DP_SET_POWER, 1455 ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_SET_POWER,
1476 DP_SET_POWER_D3); 1456 DP_SET_POWER_D3);
1477 if (ret != 1) 1457 if (ret != 1)
1478 DRM_DEBUG_DRIVER("failed to write sink power state\n"); 1458 DRM_DEBUG_DRIVER("failed to write sink power state\n");
1479 } else { 1459 } else {
@@ -1482,9 +1462,8 @@ void intel_dp_sink_dpms(struct intel_dp *intel_dp, int mode)
1482 * time to wake up. 1462 * time to wake up.
1483 */ 1463 */
1484 for (i = 0; i < 3; i++) { 1464 for (i = 0; i < 3; i++) {
1485 ret = intel_dp_aux_native_write_1(intel_dp, 1465 ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_SET_POWER,
1486 DP_SET_POWER, 1466 DP_SET_POWER_D0);
1487 DP_SET_POWER_D0);
1488 if (ret == 1) 1467 if (ret == 1)
1489 break; 1468 break;
1490 msleep(1); 1469 msleep(1);
@@ -1708,13 +1687,11 @@ static void intel_edp_psr_enable_sink(struct intel_dp *intel_dp)
1708 1687
1709 /* Enable PSR in sink */ 1688 /* Enable PSR in sink */
1710 if (intel_dp->psr_dpcd[1] & DP_PSR_NO_TRAIN_ON_EXIT) 1689 if (intel_dp->psr_dpcd[1] & DP_PSR_NO_TRAIN_ON_EXIT)
1711 intel_dp_aux_native_write_1(intel_dp, DP_PSR_EN_CFG, 1690 drm_dp_dpcd_writeb(&intel_dp->aux, DP_PSR_EN_CFG,
1712 DP_PSR_ENABLE & 1691 DP_PSR_ENABLE & ~DP_PSR_MAIN_LINK_ACTIVE);
1713 ~DP_PSR_MAIN_LINK_ACTIVE);
1714 else 1692 else
1715 intel_dp_aux_native_write_1(intel_dp, DP_PSR_EN_CFG, 1693 drm_dp_dpcd_writeb(&intel_dp->aux, DP_PSR_EN_CFG,
1716 DP_PSR_ENABLE | 1694 DP_PSR_ENABLE | DP_PSR_MAIN_LINK_ACTIVE);
1717 DP_PSR_MAIN_LINK_ACTIVE);
1718 1695
1719 /* Setup AUX registers */ 1696 /* Setup AUX registers */
1720 I915_WRITE(EDP_PSR_AUX_DATA1(dev), EDP_PSR_DPCD_COMMAND); 1697 I915_WRITE(EDP_PSR_AUX_DATA1(dev), EDP_PSR_DPCD_COMMAND);
@@ -2026,26 +2003,25 @@ static void vlv_dp_pre_pll_enable(struct intel_encoder *encoder)
2026/* 2003/*
2027 * Native read with retry for link status and receiver capability reads for 2004 * Native read with retry for link status and receiver capability reads for
2028 * cases where the sink may still be asleep. 2005 * cases where the sink may still be asleep.
2006 *
2007 * Sinks are *supposed* to come up within 1ms from an off state, but we're also
2008 * supposed to retry 3 times per the spec.
2029 */ 2009 */
2030static bool 2010static ssize_t
2031intel_dp_aux_native_read_retry(struct intel_dp *intel_dp, uint16_t address, 2011intel_dp_dpcd_read_wake(struct drm_dp_aux *aux, unsigned int offset,
2032 uint8_t *recv, int recv_bytes) 2012 void *buffer, size_t size)
2033{ 2013{
2034 int ret, i; 2014 ssize_t ret;
2015 int i;
2035 2016
2036 /*
2037 * Sinks are *supposed* to come up within 1ms from an off state,
2038 * but we're also supposed to retry 3 times per the spec.
2039 */
2040 for (i = 0; i < 3; i++) { 2017 for (i = 0; i < 3; i++) {
2041 ret = intel_dp_aux_native_read(intel_dp, address, recv, 2018 ret = drm_dp_dpcd_read(aux, offset, buffer, size);
2042 recv_bytes); 2019 if (ret == size)
2043 if (ret == recv_bytes) 2020 return ret;
2044 return true;
2045 msleep(1); 2021 msleep(1);
2046 } 2022 }
2047 2023
2048 return false; 2024 return ret;
2049} 2025}
2050 2026
2051/* 2027/*
@@ -2055,10 +2031,10 @@ intel_dp_aux_native_read_retry(struct intel_dp *intel_dp, uint16_t address,
2055static bool 2031static bool
2056intel_dp_get_link_status(struct intel_dp *intel_dp, uint8_t link_status[DP_LINK_STATUS_SIZE]) 2032intel_dp_get_link_status(struct intel_dp *intel_dp, uint8_t link_status[DP_LINK_STATUS_SIZE])
2057{ 2033{
2058 return intel_dp_aux_native_read_retry(intel_dp, 2034 return intel_dp_dpcd_read_wake(&intel_dp->aux,
2059 DP_LANE0_1_STATUS, 2035 DP_LANE0_1_STATUS,
2060 link_status, 2036 link_status,
2061 DP_LINK_STATUS_SIZE); 2037 DP_LINK_STATUS_SIZE) == DP_LINK_STATUS_SIZE;
2062} 2038}
2063 2039
2064/* 2040/*
@@ -2572,8 +2548,8 @@ intel_dp_set_link_train(struct intel_dp *intel_dp,
2572 len = intel_dp->lane_count + 1; 2548 len = intel_dp->lane_count + 1;
2573 } 2549 }
2574 2550
2575 ret = intel_dp_aux_native_write(intel_dp, DP_TRAINING_PATTERN_SET, 2551 ret = drm_dp_dpcd_write(&intel_dp->aux, DP_TRAINING_PATTERN_SET,
2576 buf, len); 2552 buf, len);
2577 2553
2578 return ret == len; 2554 return ret == len;
2579} 2555}
@@ -2602,9 +2578,8 @@ intel_dp_update_link_train(struct intel_dp *intel_dp, uint32_t *DP,
2602 I915_WRITE(intel_dp->output_reg, *DP); 2578 I915_WRITE(intel_dp->output_reg, *DP);
2603 POSTING_READ(intel_dp->output_reg); 2579 POSTING_READ(intel_dp->output_reg);
2604 2580
2605 ret = intel_dp_aux_native_write(intel_dp, DP_TRAINING_LANE0_SET, 2581 ret = drm_dp_dpcd_write(&intel_dp->aux, DP_TRAINING_LANE0_SET,
2606 intel_dp->train_set, 2582 intel_dp->train_set, intel_dp->lane_count);
2607 intel_dp->lane_count);
2608 2583
2609 return ret == intel_dp->lane_count; 2584 return ret == intel_dp->lane_count;
2610} 2585}
@@ -2660,11 +2635,11 @@ intel_dp_start_link_train(struct intel_dp *intel_dp)
2660 link_config[1] = intel_dp->lane_count; 2635 link_config[1] = intel_dp->lane_count;
2661 if (drm_dp_enhanced_frame_cap(intel_dp->dpcd)) 2636 if (drm_dp_enhanced_frame_cap(intel_dp->dpcd))
2662 link_config[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN; 2637 link_config[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN;
2663 intel_dp_aux_native_write(intel_dp, DP_LINK_BW_SET, link_config, 2); 2638 drm_dp_dpcd_write(&intel_dp->aux, DP_LINK_BW_SET, link_config, 2);
2664 2639
2665 link_config[0] = 0; 2640 link_config[0] = 0;
2666 link_config[1] = DP_SET_ANSI_8B10B; 2641 link_config[1] = DP_SET_ANSI_8B10B;
2667 intel_dp_aux_native_write(intel_dp, DP_DOWNSPREAD_CTRL, link_config, 2); 2642 drm_dp_dpcd_write(&intel_dp->aux, DP_DOWNSPREAD_CTRL, link_config, 2);
2668 2643
2669 DP |= DP_PORT_EN; 2644 DP |= DP_PORT_EN;
2670 2645
@@ -2907,8 +2882,8 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp)
2907 2882
2908 char dpcd_hex_dump[sizeof(intel_dp->dpcd) * 3]; 2883 char dpcd_hex_dump[sizeof(intel_dp->dpcd) * 3];
2909 2884
2910 if (intel_dp_aux_native_read_retry(intel_dp, 0x000, intel_dp->dpcd, 2885 if (intel_dp_dpcd_read_wake(&intel_dp->aux, 0x000, intel_dp->dpcd,
2911 sizeof(intel_dp->dpcd)) == 0) 2886 sizeof(intel_dp->dpcd)) < 0)
2912 return false; /* aux transfer failed */ 2887 return false; /* aux transfer failed */
2913 2888
2914 hex_dump_to_buffer(intel_dp->dpcd, sizeof(intel_dp->dpcd), 2889 hex_dump_to_buffer(intel_dp->dpcd, sizeof(intel_dp->dpcd),
@@ -2921,9 +2896,9 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp)
2921 /* Check if the panel supports PSR */ 2896 /* Check if the panel supports PSR */
2922 memset(intel_dp->psr_dpcd, 0, sizeof(intel_dp->psr_dpcd)); 2897 memset(intel_dp->psr_dpcd, 0, sizeof(intel_dp->psr_dpcd));
2923 if (is_edp(intel_dp)) { 2898 if (is_edp(intel_dp)) {
2924 intel_dp_aux_native_read_retry(intel_dp, DP_PSR_SUPPORT, 2899 intel_dp_dpcd_read_wake(&intel_dp->aux, DP_PSR_SUPPORT,
2925 intel_dp->psr_dpcd, 2900 intel_dp->psr_dpcd,
2926 sizeof(intel_dp->psr_dpcd)); 2901 sizeof(intel_dp->psr_dpcd));
2927 if (intel_dp->psr_dpcd[0] & DP_PSR_IS_SUPPORTED) { 2902 if (intel_dp->psr_dpcd[0] & DP_PSR_IS_SUPPORTED) {
2928 dev_priv->psr.sink_support = true; 2903 dev_priv->psr.sink_support = true;
2929 DRM_DEBUG_KMS("Detected EDP PSR Panel.\n"); 2904 DRM_DEBUG_KMS("Detected EDP PSR Panel.\n");
@@ -2945,9 +2920,9 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp)
2945 if (intel_dp->dpcd[DP_DPCD_REV] == 0x10) 2920 if (intel_dp->dpcd[DP_DPCD_REV] == 0x10)
2946 return true; /* no per-port downstream info */ 2921 return true; /* no per-port downstream info */
2947 2922
2948 if (intel_dp_aux_native_read_retry(intel_dp, DP_DOWNSTREAM_PORT_0, 2923 if (intel_dp_dpcd_read_wake(&intel_dp->aux, DP_DOWNSTREAM_PORT_0,
2949 intel_dp->downstream_ports, 2924 intel_dp->downstream_ports,
2950 DP_MAX_DOWNSTREAM_PORTS) == 0) 2925 DP_MAX_DOWNSTREAM_PORTS) < 0)
2951 return false; /* downstream port status fetch failed */ 2926 return false; /* downstream port status fetch failed */
2952 2927
2953 return true; 2928 return true;
@@ -2963,11 +2938,11 @@ intel_dp_probe_oui(struct intel_dp *intel_dp)
2963 2938
2964 edp_panel_vdd_on(intel_dp); 2939 edp_panel_vdd_on(intel_dp);
2965 2940
2966 if (intel_dp_aux_native_read_retry(intel_dp, DP_SINK_OUI, buf, 3)) 2941 if (intel_dp_dpcd_read_wake(&intel_dp->aux, DP_SINK_OUI, buf, 3) == 3)
2967 DRM_DEBUG_KMS("Sink OUI: %02hx%02hx%02hx\n", 2942 DRM_DEBUG_KMS("Sink OUI: %02hx%02hx%02hx\n",
2968 buf[0], buf[1], buf[2]); 2943 buf[0], buf[1], buf[2]);
2969 2944
2970 if (intel_dp_aux_native_read_retry(intel_dp, DP_BRANCH_OUI, buf, 3)) 2945 if (intel_dp_dpcd_read_wake(&intel_dp->aux, DP_BRANCH_OUI, buf, 3) == 3)
2971 DRM_DEBUG_KMS("Branch OUI: %02hx%02hx%02hx\n", 2946 DRM_DEBUG_KMS("Branch OUI: %02hx%02hx%02hx\n",
2972 buf[0], buf[1], buf[2]); 2947 buf[0], buf[1], buf[2]);
2973 2948
@@ -2982,46 +2957,40 @@ int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc)
2982 to_intel_crtc(intel_dig_port->base.base.crtc); 2957 to_intel_crtc(intel_dig_port->base.base.crtc);
2983 u8 buf[1]; 2958 u8 buf[1];
2984 2959
2985 if (!intel_dp_aux_native_read(intel_dp, DP_TEST_SINK_MISC, buf, 1)) 2960 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK_MISC, buf) < 0)
2986 return -EAGAIN; 2961 return -EAGAIN;
2987 2962
2988 if (!(buf[0] & DP_TEST_CRC_SUPPORTED)) 2963 if (!(buf[0] & DP_TEST_CRC_SUPPORTED))
2989 return -ENOTTY; 2964 return -ENOTTY;
2990 2965
2991 if (!intel_dp_aux_native_write_1(intel_dp, DP_TEST_SINK, 2966 if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_SINK,
2992 DP_TEST_SINK_START)) 2967 DP_TEST_SINK_START) < 0)
2993 return -EAGAIN; 2968 return -EAGAIN;
2994 2969
2995 /* Wait 2 vblanks to be sure we will have the correct CRC value */ 2970 /* Wait 2 vblanks to be sure we will have the correct CRC value */
2996 intel_wait_for_vblank(dev, intel_crtc->pipe); 2971 intel_wait_for_vblank(dev, intel_crtc->pipe);
2997 intel_wait_for_vblank(dev, intel_crtc->pipe); 2972 intel_wait_for_vblank(dev, intel_crtc->pipe);
2998 2973
2999 if (!intel_dp_aux_native_read(intel_dp, DP_TEST_CRC_R_CR, crc, 6)) 2974 if (drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_CRC_R_CR, crc, 6) < 0)
3000 return -EAGAIN; 2975 return -EAGAIN;
3001 2976
3002 intel_dp_aux_native_write_1(intel_dp, DP_TEST_SINK, 0); 2977 drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_SINK, 0);
3003 return 0; 2978 return 0;
3004} 2979}
3005 2980
3006static bool 2981static bool
3007intel_dp_get_sink_irq(struct intel_dp *intel_dp, u8 *sink_irq_vector) 2982intel_dp_get_sink_irq(struct intel_dp *intel_dp, u8 *sink_irq_vector)
3008{ 2983{
3009 int ret; 2984 return intel_dp_dpcd_read_wake(&intel_dp->aux,
3010 2985 DP_DEVICE_SERVICE_IRQ_VECTOR,
3011 ret = intel_dp_aux_native_read_retry(intel_dp, 2986 sink_irq_vector, 1) == 1;
3012 DP_DEVICE_SERVICE_IRQ_VECTOR,
3013 sink_irq_vector, 1);
3014 if (!ret)
3015 return false;
3016
3017 return true;
3018} 2987}
3019 2988
3020static void 2989static void
3021intel_dp_handle_test_request(struct intel_dp *intel_dp) 2990intel_dp_handle_test_request(struct intel_dp *intel_dp)
3022{ 2991{
3023 /* NAK by default */ 2992 /* NAK by default */
3024 intel_dp_aux_native_write_1(intel_dp, DP_TEST_RESPONSE, DP_TEST_NAK); 2993 drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_RESPONSE, DP_TEST_NAK);
3025} 2994}
3026 2995
3027/* 2996/*
@@ -3060,9 +3029,9 @@ intel_dp_check_link_status(struct intel_dp *intel_dp)
3060 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11 && 3029 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11 &&
3061 intel_dp_get_sink_irq(intel_dp, &sink_irq_vector)) { 3030 intel_dp_get_sink_irq(intel_dp, &sink_irq_vector)) {
3062 /* Clear interrupt source */ 3031 /* Clear interrupt source */
3063 intel_dp_aux_native_write_1(intel_dp, 3032 drm_dp_dpcd_writeb(&intel_dp->aux,
3064 DP_DEVICE_SERVICE_IRQ_VECTOR, 3033 DP_DEVICE_SERVICE_IRQ_VECTOR,
3065 sink_irq_vector); 3034 sink_irq_vector);
3066 3035
3067 if (sink_irq_vector & DP_AUTOMATED_TEST_REQUEST) 3036 if (sink_irq_vector & DP_AUTOMATED_TEST_REQUEST)
3068 intel_dp_handle_test_request(intel_dp); 3037 intel_dp_handle_test_request(intel_dp);
@@ -3097,9 +3066,11 @@ intel_dp_detect_dpcd(struct intel_dp *intel_dp)
3097 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11 && 3066 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11 &&
3098 intel_dp->downstream_ports[0] & DP_DS_PORT_HPD) { 3067 intel_dp->downstream_ports[0] & DP_DS_PORT_HPD) {
3099 uint8_t reg; 3068 uint8_t reg;
3100 if (!intel_dp_aux_native_read_retry(intel_dp, DP_SINK_COUNT, 3069
3101 &reg, 1)) 3070 if (intel_dp_dpcd_read_wake(&intel_dp->aux, DP_SINK_COUNT,
3071 &reg, 1) < 0)
3102 return connector_status_unknown; 3072 return connector_status_unknown;
3073
3103 return DP_GET_SINK_COUNT(reg) ? connector_status_connected 3074 return DP_GET_SINK_COUNT(reg) ? connector_status_connected
3104 : connector_status_disconnected; 3075 : connector_status_disconnected;
3105 } 3076 }
@@ -3925,6 +3896,8 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
3925 intel_dp_init_panel_power_sequencer(dev, intel_dp, &power_seq); 3896 intel_dp_init_panel_power_sequencer(dev, intel_dp, &power_seq);
3926 } 3897 }
3927 3898
3899 intel_dp_aux_init(intel_dp, intel_connector);
3900
3928 error = intel_dp_i2c_init(intel_dp, intel_connector, name); 3901 error = intel_dp_i2c_init(intel_dp, intel_connector, name);
3929 WARN(error, "intel_dp_i2c_init failed with error %d for port %c\n", 3902 WARN(error, "intel_dp_i2c_init failed with error %d for port %c\n",
3930 error, port_name(port)); 3903 error, port_name(port));
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 9c7090590776..578c18ed982c 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -487,6 +487,7 @@ struct intel_dp {
487 uint8_t downstream_ports[DP_MAX_DOWNSTREAM_PORTS]; 487 uint8_t downstream_ports[DP_MAX_DOWNSTREAM_PORTS];
488 struct i2c_adapter adapter; 488 struct i2c_adapter adapter;
489 struct i2c_algo_dp_aux_data algo; 489 struct i2c_algo_dp_aux_data algo;
490 struct drm_dp_aux aux;
490 uint8_t train_set[4]; 491 uint8_t train_set[4];
491 int panel_power_up_delay; 492 int panel_power_up_delay;
492 int panel_power_down_delay; 493 int panel_power_down_delay;