Rev 5060 | Rev 6084 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5060 | Rev 5271 | ||
---|---|---|---|
Line 687... | Line 687... | ||
687 | } |
687 | } |
Line 688... | Line 688... | ||
688 | 688 | ||
689 | static int drm_dp_mst_assign_payload_id(struct drm_dp_mst_topology_mgr *mgr, |
689 | static int drm_dp_mst_assign_payload_id(struct drm_dp_mst_topology_mgr *mgr, |
690 | struct drm_dp_vcpi *vcpi) |
690 | struct drm_dp_vcpi *vcpi) |
691 | { |
691 | { |
Line 692... | Line 692... | ||
692 | int ret; |
692 | int ret, vcpi_ret; |
693 | 693 | ||
694 | mutex_lock(&mgr->payload_lock); |
694 | mutex_lock(&mgr->payload_lock); |
695 | ret = find_first_zero_bit(&mgr->payload_mask, mgr->max_payloads + 1); |
695 | ret = find_first_zero_bit(&mgr->payload_mask, mgr->max_payloads + 1); |
696 | if (ret > mgr->max_payloads) { |
696 | if (ret > mgr->max_payloads) { |
697 | ret = -EINVAL; |
697 | ret = -EINVAL; |
698 | DRM_DEBUG_KMS("out of payload ids %d\n", ret); |
698 | DRM_DEBUG_KMS("out of payload ids %d\n", ret); |
Line -... | Line 699... | ||
- | 699 | goto out_unlock; |
|
- | 700 | } |
|
- | 701 | ||
- | 702 | vcpi_ret = find_first_zero_bit(&mgr->vcpi_mask, mgr->max_payloads + 1); |
|
- | 703 | if (vcpi_ret > mgr->max_payloads) { |
|
- | 704 | ret = -EINVAL; |
|
- | 705 | DRM_DEBUG_KMS("out of vcpi ids %d\n", ret); |
|
699 | goto out_unlock; |
706 | goto out_unlock; |
- | 707 | } |
|
700 | } |
708 | |
701 | 709 | set_bit(ret, &mgr->payload_mask); |
|
702 | set_bit(ret, &mgr->payload_mask); |
710 | set_bit(vcpi_ret, &mgr->vcpi_mask); |
703 | vcpi->vcpi = ret; |
711 | vcpi->vcpi = vcpi_ret + 1; |
704 | mgr->proposed_vcpis[ret - 1] = vcpi; |
712 | mgr->proposed_vcpis[ret - 1] = vcpi; |
705 | out_unlock: |
713 | out_unlock: |
Line 706... | Line 714... | ||
706 | mutex_unlock(&mgr->payload_lock); |
714 | mutex_unlock(&mgr->payload_lock); |
707 | return ret; |
715 | return ret; |
708 | } |
716 | } |
- | 717 | ||
709 | 718 | static void drm_dp_mst_put_payload_id(struct drm_dp_mst_topology_mgr *mgr, |
|
710 | static void drm_dp_mst_put_payload_id(struct drm_dp_mst_topology_mgr *mgr, |
719 | int vcpi) |
Line 711... | Line 720... | ||
711 | int id) |
720 | { |
712 | { |
721 | int i; |
713 | if (id == 0) |
722 | if (vcpi == 0) |
- | 723 | return; |
|
- | 724 | ||
- | 725 | mutex_lock(&mgr->payload_lock); |
|
- | 726 | DRM_DEBUG_KMS("putting payload %d\n", vcpi); |
|
714 | return; |
727 | clear_bit(vcpi - 1, &mgr->vcpi_mask); |
- | 728 | ||
- | 729 | for (i = 0; i < mgr->max_payloads; i++) { |
|
- | 730 | if (mgr->proposed_vcpis[i]) |
|
715 | 731 | if (mgr->proposed_vcpis[i]->vcpi == vcpi) { |
|
716 | mutex_lock(&mgr->payload_lock); |
732 | mgr->proposed_vcpis[i] = NULL; |
Line 717... | Line 733... | ||
717 | DRM_DEBUG_KMS("putting payload %d\n", id); |
733 | clear_bit(i + 1, &mgr->payload_mask); |
718 | clear_bit(id, &mgr->payload_mask); |
734 | } |
Line 828... | Line 844... | ||
828 | } |
844 | } |
Line 829... | Line 845... | ||
829 | 845 | ||
830 | 846 | ||
- | 847 | static void drm_dp_port_teardown_pdt(struct drm_dp_mst_port *port, int old_pdt) |
|
- | 848 | { |
|
831 | static void drm_dp_port_teardown_pdt(struct drm_dp_mst_port *port, int old_pdt) |
849 | struct drm_dp_mst_branch *mstb; |
832 | { |
850 | |
833 | switch (old_pdt) { |
851 | switch (old_pdt) { |
834 | case DP_PEER_DEVICE_DP_LEGACY_CONV: |
852 | case DP_PEER_DEVICE_DP_LEGACY_CONV: |
835 | case DP_PEER_DEVICE_SST_SINK: |
853 | case DP_PEER_DEVICE_SST_SINK: |
836 | /* remove i2c over sideband */ |
854 | /* remove i2c over sideband */ |
837 | drm_dp_mst_unregister_i2c_bus(&port->aux); |
855 | drm_dp_mst_unregister_i2c_bus(&port->aux); |
838 | break; |
856 | break; |
839 | case DP_PEER_DEVICE_MST_BRANCHING: |
857 | case DP_PEER_DEVICE_MST_BRANCHING: |
- | 858 | mstb = port->mstb; |
|
840 | drm_dp_put_mst_branch_device(port->mstb); |
859 | port->mstb = NULL; |
841 | port->mstb = NULL; |
860 | drm_dp_put_mst_branch_device(mstb); |
842 | break; |
861 | break; |
Line 843... | Line 862... | ||
843 | } |
862 | } |
844 | } |
863 | } |
845 | 864 | ||
846 | static void drm_dp_destroy_port(struct kref *kref) |
865 | static void drm_dp_destroy_port(struct kref *kref) |
847 | { |
866 | { |
848 | struct drm_dp_mst_port *port = container_of(kref, struct drm_dp_mst_port, kref); |
867 | struct drm_dp_mst_port *port = container_of(kref, struct drm_dp_mst_port, kref); |
- | 868 | struct drm_dp_mst_topology_mgr *mgr = port->mgr; |
|
- | 869 | if (!port->input) { |
|
849 | struct drm_dp_mst_topology_mgr *mgr = port->mgr; |
870 | port->vcpi.num_slots = 0; |
850 | if (!port->input) { |
871 | |
851 | port->vcpi.num_slots = 0; |
872 | kfree(port->cached_edid); |
Line 852... | Line 873... | ||
852 | if (port->connector) |
873 | if (port->connector) |
Line 1000... | Line 1021... | ||
1000 | } |
1021 | } |
1001 | } |
1022 | } |
Line 1002... | Line 1023... | ||
1002 | 1023 | ||
1003 | static void build_mst_prop_path(struct drm_dp_mst_port *port, |
1024 | static void build_mst_prop_path(struct drm_dp_mst_port *port, |
1004 | struct drm_dp_mst_branch *mstb, |
1025 | struct drm_dp_mst_branch *mstb, |
- | 1026 | char *proppath, |
|
1005 | char *proppath) |
1027 | size_t proppath_size) |
1006 | { |
1028 | { |
1007 | int i; |
1029 | int i; |
1008 | char temp[8]; |
1030 | char temp[8]; |
1009 | snprintf(proppath, 255, "mst:%d", mstb->mgr->conn_base_id); |
1031 | snprintf(proppath, proppath_size, "mst:%d", mstb->mgr->conn_base_id); |
1010 | for (i = 0; i < (mstb->lct - 1); i++) { |
1032 | for (i = 0; i < (mstb->lct - 1); i++) { |
1011 | int shift = (i % 2) ? 0 : 4; |
1033 | int shift = (i % 2) ? 0 : 4; |
1012 | int port_num = mstb->rad[i / 2] >> shift; |
1034 | int port_num = mstb->rad[i / 2] >> shift; |
1013 | snprintf(temp, 8, "-%d", port_num); |
1035 | snprintf(temp, sizeof(temp), "-%d", port_num); |
1014 | strncat(proppath, temp, 255); |
1036 | strlcat(proppath, temp, proppath_size); |
1015 | } |
1037 | } |
1016 | snprintf(temp, 8, "-%d", port->port_num); |
1038 | snprintf(temp, sizeof(temp), "-%d", port->port_num); |
1017 | strncat(proppath, temp, 255); |
1039 | strlcat(proppath, temp, proppath_size); |
Line 1018... | Line 1040... | ||
1018 | } |
1040 | } |
1019 | 1041 | ||
1020 | static void drm_dp_add_port(struct drm_dp_mst_branch *mstb, |
1042 | static void drm_dp_add_port(struct drm_dp_mst_branch *mstb, |
Line 1083... | Line 1105... | ||
1083 | } |
1105 | } |
1084 | } |
1106 | } |
Line 1085... | Line 1107... | ||
1085 | 1107 | ||
1086 | if (created && !port->input) { |
1108 | if (created && !port->input) { |
1087 | char proppath[255]; |
1109 | char proppath[255]; |
1088 | build_mst_prop_path(port, mstb, proppath); |
1110 | build_mst_prop_path(port, mstb, proppath, sizeof(proppath)); |
- | 1111 | port->connector = (*mstb->mgr->cbs->add_connector)(mstb->mgr, port, proppath); |
|
- | 1112 | ||
- | 1113 | if (port->port_num >= 8) { |
|
- | 1114 | port->cached_edid = drm_get_edid(port->connector, &port->aux.ddc); |
|
1089 | port->connector = (*mstb->mgr->cbs->add_connector)(mstb->mgr, port, proppath); |
1115 | } |
Line 1090... | Line 1116... | ||
1090 | } |
1116 | } |
1091 | 1117 | ||
1092 | /* put reference to this port */ |
1118 | /* put reference to this port */ |
Line 1568... | Line 1594... | ||
1568 | if (port) { |
1594 | if (port) { |
1569 | drm_dp_payload_send_msg(mgr, port, id, 0); |
1595 | drm_dp_payload_send_msg(mgr, port, id, 0); |
1570 | } |
1596 | } |
Line 1571... | Line 1597... | ||
1571 | 1597 | ||
1572 | drm_dp_dpcd_write_payload(mgr, id, payload); |
1598 | drm_dp_dpcd_write_payload(mgr, id, payload); |
1573 | payload->payload_state = 0; |
1599 | payload->payload_state = DP_PAYLOAD_DELETE_LOCAL; |
1574 | return 0; |
1600 | return 0; |
Line 1575... | Line 1601... | ||
1575 | } |
1601 | } |
1576 | 1602 | ||
Line 1595... | Line 1621... | ||
1595 | * after calling this the driver should generate ACT and payload |
1621 | * after calling this the driver should generate ACT and payload |
1596 | * packets. |
1622 | * packets. |
1597 | */ |
1623 | */ |
1598 | int drm_dp_update_payload_part1(struct drm_dp_mst_topology_mgr *mgr) |
1624 | int drm_dp_update_payload_part1(struct drm_dp_mst_topology_mgr *mgr) |
1599 | { |
1625 | { |
1600 | int i; |
1626 | int i, j; |
1601 | int cur_slots = 1; |
1627 | int cur_slots = 1; |
1602 | struct drm_dp_payload req_payload; |
1628 | struct drm_dp_payload req_payload; |
1603 | struct drm_dp_mst_port *port; |
1629 | struct drm_dp_mst_port *port; |
Line 1604... | Line 1630... | ||
1604 | 1630 | ||
Line 1612... | Line 1638... | ||
1612 | req_payload.num_slots = mgr->proposed_vcpis[i]->num_slots; |
1638 | req_payload.num_slots = mgr->proposed_vcpis[i]->num_slots; |
1613 | } else { |
1639 | } else { |
1614 | port = NULL; |
1640 | port = NULL; |
1615 | req_payload.num_slots = 0; |
1641 | req_payload.num_slots = 0; |
1616 | } |
1642 | } |
- | 1643 | ||
- | 1644 | if (mgr->payloads[i].start_slot != req_payload.start_slot) { |
|
- | 1645 | mgr->payloads[i].start_slot = req_payload.start_slot; |
|
- | 1646 | } |
|
1617 | /* work out what is required to happen with this payload */ |
1647 | /* work out what is required to happen with this payload */ |
1618 | if (mgr->payloads[i].start_slot != req_payload.start_slot || |
- | |
1619 | mgr->payloads[i].num_slots != req_payload.num_slots) { |
1648 | if (mgr->payloads[i].num_slots != req_payload.num_slots) { |
Line 1620... | Line 1649... | ||
1620 | 1649 | ||
1621 | /* need to push an update for this payload */ |
1650 | /* need to push an update for this payload */ |
1622 | if (req_payload.num_slots) { |
1651 | if (req_payload.num_slots) { |
1623 | drm_dp_create_payload_step1(mgr, i + 1, &req_payload); |
1652 | drm_dp_create_payload_step1(mgr, mgr->proposed_vcpis[i]->vcpi, &req_payload); |
1624 | mgr->payloads[i].num_slots = req_payload.num_slots; |
1653 | mgr->payloads[i].num_slots = req_payload.num_slots; |
1625 | } else if (mgr->payloads[i].num_slots) { |
1654 | } else if (mgr->payloads[i].num_slots) { |
1626 | mgr->payloads[i].num_slots = 0; |
1655 | mgr->payloads[i].num_slots = 0; |
1627 | drm_dp_destroy_payload_step1(mgr, port, i + 1, &mgr->payloads[i]); |
1656 | drm_dp_destroy_payload_step1(mgr, port, port->vcpi.vcpi, &mgr->payloads[i]); |
1628 | req_payload.payload_state = mgr->payloads[i].payload_state; |
- | |
1629 | } else |
1657 | req_payload.payload_state = mgr->payloads[i].payload_state; |
1630 | req_payload.payload_state = 0; |
1658 | mgr->payloads[i].start_slot = 0; |
1631 | - | ||
1632 | mgr->payloads[i].start_slot = req_payload.start_slot; |
1659 | } |
1633 | mgr->payloads[i].payload_state = req_payload.payload_state; |
1660 | mgr->payloads[i].payload_state = req_payload.payload_state; |
1634 | } |
1661 | } |
1635 | cur_slots += req_payload.num_slots; |
1662 | cur_slots += req_payload.num_slots; |
- | 1663 | } |
|
- | 1664 | ||
- | 1665 | for (i = 0; i < mgr->max_payloads; i++) { |
|
- | 1666 | if (mgr->payloads[i].payload_state == DP_PAYLOAD_DELETE_LOCAL) { |
|
- | 1667 | DRM_DEBUG_KMS("removing payload %d\n", i); |
|
- | 1668 | for (j = i; j < mgr->max_payloads - 1; j++) { |
|
- | 1669 | memcpy(&mgr->payloads[j], &mgr->payloads[j + 1], sizeof(struct drm_dp_payload)); |
|
- | 1670 | mgr->proposed_vcpis[j] = mgr->proposed_vcpis[j + 1]; |
|
- | 1671 | if (mgr->proposed_vcpis[j] && mgr->proposed_vcpis[j]->num_slots) { |
|
- | 1672 | set_bit(j + 1, &mgr->payload_mask); |
|
- | 1673 | } else { |
|
- | 1674 | clear_bit(j + 1, &mgr->payload_mask); |
|
- | 1675 | } |
|
- | 1676 | } |
|
- | 1677 | memset(&mgr->payloads[mgr->max_payloads - 1], 0, sizeof(struct drm_dp_payload)); |
|
- | 1678 | mgr->proposed_vcpis[mgr->max_payloads - 1] = NULL; |
|
- | 1679 | clear_bit(mgr->max_payloads, &mgr->payload_mask); |
|
- | 1680 | ||
- | 1681 | } |
|
1636 | } |
1682 | } |
Line 1637... | Line 1683... | ||
1637 | mutex_unlock(&mgr->payload_lock); |
1683 | mutex_unlock(&mgr->payload_lock); |
1638 | 1684 | ||
1639 | return 0; |
1685 | return 0; |
Line 1662... | Line 1708... | ||
1662 | 1708 | ||
Line 1663... | Line 1709... | ||
1663 | port = container_of(mgr->proposed_vcpis[i], struct drm_dp_mst_port, vcpi); |
1709 | port = container_of(mgr->proposed_vcpis[i], struct drm_dp_mst_port, vcpi); |
1664 | 1710 | ||
1665 | DRM_DEBUG_KMS("payload %d %d\n", i, mgr->payloads[i].payload_state); |
1711 | DRM_DEBUG_KMS("payload %d %d\n", i, mgr->payloads[i].payload_state); |
1666 | if (mgr->payloads[i].payload_state == DP_PAYLOAD_LOCAL) { |
1712 | if (mgr->payloads[i].payload_state == DP_PAYLOAD_LOCAL) { |
1667 | ret = drm_dp_create_payload_step2(mgr, port, i + 1, &mgr->payloads[i]); |
1713 | ret = drm_dp_create_payload_step2(mgr, port, mgr->proposed_vcpis[i]->vcpi, &mgr->payloads[i]); |
1668 | } else if (mgr->payloads[i].payload_state == DP_PAYLOAD_DELETE_LOCAL) { |
1714 | } else if (mgr->payloads[i].payload_state == DP_PAYLOAD_DELETE_LOCAL) { |
1669 | ret = drm_dp_destroy_payload_step2(mgr, i + 1, &mgr->payloads[i]); |
1715 | ret = drm_dp_destroy_payload_step2(mgr, mgr->proposed_vcpis[i]->vcpi, &mgr->payloads[i]); |
1670 | } |
1716 | } |
1671 | if (ret) { |
1717 | if (ret) { |
1672 | mutex_unlock(&mgr->payload_lock); |
1718 | mutex_unlock(&mgr->payload_lock); |
Line 1767... | Line 1813... | ||
1767 | } |
1813 | } |
1768 | mutex_unlock(&mgr->qlock); |
1814 | mutex_unlock(&mgr->qlock); |
1769 | return 0; |
1815 | return 0; |
1770 | } |
1816 | } |
Line 1771... | Line 1817... | ||
1771 | 1817 | ||
- | 1818 | static bool drm_dp_get_vc_payload_bw(int dp_link_bw, |
|
- | 1819 | int dp_link_count, |
|
1772 | static int drm_dp_get_vc_payload_bw(int dp_link_bw, int dp_link_count) |
1820 | int *out) |
1773 | { |
1821 | { |
- | 1822 | switch (dp_link_bw) { |
|
- | 1823 | default: |
|
- | 1824 | DRM_DEBUG_KMS("invalid link bandwidth in DPCD: %x (link count: %d)\n", |
|
- | 1825 | dp_link_bw, dp_link_count); |
|
- | 1826 | return false; |
|
1774 | switch (dp_link_bw) { |
1827 | |
1775 | case DP_LINK_BW_1_62: |
1828 | case DP_LINK_BW_1_62: |
- | 1829 | *out = 3 * dp_link_count; |
|
1776 | return 3 * dp_link_count; |
1830 | break; |
1777 | case DP_LINK_BW_2_7: |
1831 | case DP_LINK_BW_2_7: |
- | 1832 | *out = 5 * dp_link_count; |
|
1778 | return 5 * dp_link_count; |
1833 | break; |
1779 | case DP_LINK_BW_5_4: |
1834 | case DP_LINK_BW_5_4: |
- | 1835 | *out = 10 * dp_link_count; |
|
1780 | return 10 * dp_link_count; |
1836 | break; |
1781 | } |
1837 | } |
1782 | return 0; |
1838 | return true; |
Line 1783... | Line 1839... | ||
1783 | } |
1839 | } |
1784 | 1840 | ||
1785 | /** |
1841 | /** |
Line 1809... | Line 1865... | ||
1809 | if (ret != DP_RECEIVER_CAP_SIZE) { |
1865 | if (ret != DP_RECEIVER_CAP_SIZE) { |
1810 | DRM_DEBUG_KMS("failed to read DPCD\n"); |
1866 | DRM_DEBUG_KMS("failed to read DPCD\n"); |
1811 | goto out_unlock; |
1867 | goto out_unlock; |
1812 | } |
1868 | } |
Line -... | Line 1869... | ||
- | 1869 | ||
1813 | 1870 | if (!drm_dp_get_vc_payload_bw(mgr->dpcd[1], |
|
- | 1871 | mgr->dpcd[2] & DP_MAX_LANE_COUNT_MASK, |
|
- | 1872 | &mgr->pbn_div)) { |
|
- | 1873 | ret = -EINVAL; |
|
- | 1874 | goto out_unlock; |
|
- | 1875 | } |
|
1814 | mgr->pbn_div = drm_dp_get_vc_payload_bw(mgr->dpcd[1], mgr->dpcd[2] & DP_MAX_LANE_COUNT_MASK); |
1876 | |
1815 | mgr->total_pbn = 2560; |
1877 | mgr->total_pbn = 2560; |
1816 | mgr->total_slots = DIV_ROUND_UP(mgr->total_pbn, mgr->pbn_div); |
1878 | mgr->total_slots = DIV_ROUND_UP(mgr->total_pbn, mgr->pbn_div); |
Line 1817... | Line 1879... | ||
1817 | mgr->avail_slots = mgr->total_slots; |
1879 | mgr->avail_slots = mgr->total_slots; |
Line 1866... | Line 1928... | ||
1866 | drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL, 0); |
1928 | drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL, 0); |
1867 | ret = 0; |
1929 | ret = 0; |
1868 | memset(mgr->payloads, 0, mgr->max_payloads * sizeof(struct drm_dp_payload)); |
1930 | memset(mgr->payloads, 0, mgr->max_payloads * sizeof(struct drm_dp_payload)); |
1869 | mgr->payload_mask = 0; |
1931 | mgr->payload_mask = 0; |
1870 | set_bit(0, &mgr->payload_mask); |
1932 | set_bit(0, &mgr->payload_mask); |
- | 1933 | mgr->vcpi_mask = 0; |
|
1871 | } |
1934 | } |
Line 1872... | Line 1935... | ||
1872 | 1935 | ||
1873 | out_unlock: |
1936 | out_unlock: |
1874 | mutex_unlock(&mgr->lock); |
1937 | mutex_unlock(&mgr->lock); |
Line 2076... | Line 2139... | ||
2076 | 2139 | ||
2077 | /** |
2140 | /** |
2078 | * drm_dp_mst_hpd_irq() - MST hotplug IRQ notify |
2141 | * drm_dp_mst_hpd_irq() - MST hotplug IRQ notify |
2079 | * @mgr: manager to notify irq for. |
2142 | * @mgr: manager to notify irq for. |
- | 2143 | * @esi: 4 bytes from SINK_COUNT_ESI |
|
2080 | * @esi: 4 bytes from SINK_COUNT_ESI |
2144 | * @handled: whether the hpd interrupt was consumed or not |
2081 | * |
2145 | * |
2082 | * This should be called from the driver when it detects a short IRQ, |
2146 | * This should be called from the driver when it detects a short IRQ, |
2083 | * along with the value of the DEVICE_SERVICE_IRQ_VECTOR_ESI0. The |
2147 | * along with the value of the DEVICE_SERVICE_IRQ_VECTOR_ESI0. The |
2084 | * topology manager will process the sideband messages received as a result |
2148 | * topology manager will process the sideband messages received as a result |
Line 2117... | Line 2181... | ||
2117 | * @port: unverified pointer to a port |
2181 | * @port: unverified pointer to a port |
2118 | * |
2182 | * |
2119 | * This returns the current connection state for a port. It validates the |
2183 | * This returns the current connection state for a port. It validates the |
2120 | * port pointer still exists so the caller doesn't require a reference |
2184 | * port pointer still exists so the caller doesn't require a reference |
2121 | */ |
2185 | */ |
2122 | enum drm_connector_status drm_dp_mst_detect_port(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port) |
2186 | enum drm_connector_status drm_dp_mst_detect_port(struct drm_connector *connector, |
- | 2187 | struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port) |
|
2123 | { |
2188 | { |
2124 | enum drm_connector_status status = connector_status_disconnected; |
2189 | enum drm_connector_status status = connector_status_disconnected; |
Line 2125... | Line 2190... | ||
2125 | 2190 | ||
2126 | /* we need to search for the port in the mgr in case its gone */ |
2191 | /* we need to search for the port in the mgr in case its gone */ |
Line 2136... | Line 2201... | ||
2136 | case DP_PEER_DEVICE_MST_BRANCHING: |
2201 | case DP_PEER_DEVICE_MST_BRANCHING: |
2137 | break; |
2202 | break; |
Line 2138... | Line 2203... | ||
2138 | 2203 | ||
2139 | case DP_PEER_DEVICE_SST_SINK: |
2204 | case DP_PEER_DEVICE_SST_SINK: |
- | 2205 | status = connector_status_connected; |
|
- | 2206 | /* for logical ports - cache the EDID */ |
|
- | 2207 | if (port->port_num >= 8 && !port->cached_edid) { |
|
- | 2208 | port->cached_edid = drm_get_edid(connector, &port->aux.ddc); |
|
2140 | status = connector_status_connected; |
2209 | } |
2141 | break; |
2210 | break; |
2142 | case DP_PEER_DEVICE_DP_LEGACY_CONV: |
2211 | case DP_PEER_DEVICE_DP_LEGACY_CONV: |
2143 | if (port->ldps) |
2212 | if (port->ldps) |
2144 | status = connector_status_connected; |
2213 | status = connector_status_connected; |
Line 2167... | Line 2236... | ||
2167 | /* we need to search for the port in the mgr in case its gone */ |
2236 | /* we need to search for the port in the mgr in case its gone */ |
2168 | port = drm_dp_get_validated_port_ref(mgr, port); |
2237 | port = drm_dp_get_validated_port_ref(mgr, port); |
2169 | if (!port) |
2238 | if (!port) |
2170 | return NULL; |
2239 | return NULL; |
Line -... | Line 2240... | ||
- | 2240 | ||
- | 2241 | if (port->cached_edid) |
|
- | 2242 | edid = drm_edid_duplicate(port->cached_edid); |
|
2171 | 2243 | else |
|
- | 2244 | edid = drm_get_edid(connector, &port->aux.ddc); |
|
- | 2245 | ||
2172 | edid = drm_get_edid(connector, &port->aux.ddc); |
2246 | drm_mode_connector_set_tile_property(connector); |
2173 | drm_dp_put_port(port); |
2247 | drm_dp_put_port(port); |
2174 | return edid; |
2248 | return edid; |
2175 | } |
2249 | } |