Subversion Repositories Kolibri OS

Rev

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
}