drm/amd/display: Detect dpcd_rev when hotplug mst monitor
[Why] Once mst topology is constructed, later on new connected monitors are reported to source by CSN message. Within CSN, there is no carried info of DPCD_REV comparing to LINK_ADDRESS reply. As the result, we might leave some ports connected to DP but without DPCD revision number which will affect us determining the capability of the DP Rx. [How] Send out remote DPCD read when the port's dpcd_rev is 0x0 in detect_ctx(). Firstly, read out the value from DPCD 0x2200. If the return value is 0x0, it's likely the DP1.2 DP Rx then we reques revision from DPCD 0x0 again. Reviewed-by: Hersen Wu <hersenwu@amd.com> Acked-by: Hamza Mahfooz <hamza.mahfooz@amd.com> Signed-off-by: Wayne Lin <Wayne.Lin@amd.com> Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
84de5c2e92
commit
453b0016a0
@ -344,12 +344,48 @@ dm_dp_mst_detect(struct drm_connector *connector,
|
||||
{
|
||||
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
|
||||
struct amdgpu_dm_connector *master = aconnector->mst_port;
|
||||
struct drm_dp_mst_port *port = aconnector->port;
|
||||
int connection_status;
|
||||
|
||||
if (drm_connector_is_unregistered(connector))
|
||||
return connector_status_disconnected;
|
||||
|
||||
return drm_dp_mst_detect_port(connector, ctx, &master->mst_mgr,
|
||||
connection_status = drm_dp_mst_detect_port(connector, ctx, &master->mst_mgr,
|
||||
aconnector->port);
|
||||
|
||||
if (port->pdt != DP_PEER_DEVICE_NONE && !port->dpcd_rev) {
|
||||
uint8_t dpcd_rev;
|
||||
int ret;
|
||||
|
||||
ret = drm_dp_dpcd_readb(&port->aux, DP_DP13_DPCD_REV, &dpcd_rev);
|
||||
|
||||
if (ret == 1) {
|
||||
port->dpcd_rev = dpcd_rev;
|
||||
|
||||
/* Could be DP1.2 DP Rx case*/
|
||||
if (!dpcd_rev) {
|
||||
ret = drm_dp_dpcd_readb(&port->aux, DP_DPCD_REV, &dpcd_rev);
|
||||
|
||||
if (ret == 1)
|
||||
port->dpcd_rev = dpcd_rev;
|
||||
}
|
||||
|
||||
if (!dpcd_rev)
|
||||
DRM_DEBUG_KMS("Can't decide DPCD revision number!");
|
||||
}
|
||||
|
||||
/*
|
||||
* Could be legacy sink, logical port etc on DP1.2.
|
||||
* Will get Nack under these cases when issue remote
|
||||
* DPCD read.
|
||||
*/
|
||||
if (ret != 1)
|
||||
DRM_DEBUG_KMS("Can't access DPCD");
|
||||
} else if (port->pdt == DP_PEER_DEVICE_NONE) {
|
||||
port->dpcd_rev = 0;
|
||||
}
|
||||
|
||||
return connection_status;
|
||||
}
|
||||
|
||||
static int dm_dp_mst_atomic_check(struct drm_connector *connector,
|
||||
|
Loading…
x
Reference in New Issue
Block a user