switch (pattern) { case DP_TRAINING_PATTERN_DISABLE:
val = 0; break; case DP_TRAINING_PATTERN_1:
val = 1; break; case DP_TRAINING_PATTERN_2:
val = 2; break; case DP_TRAINING_PATTERN_3:
val = 3; break; case DP_TRAINING_PATTERN_4:
val = 4; break; default: return -EINVAL;
}
ret = drm_dp_dpcd_write(dp->aux, DP_TRAINING_PATTERN_SET, &buf, sizeof(buf)); if (ret != sizeof(buf)) {
drm_dbg_dp(dp->dev, "dp aux write training pattern set failed\n"); return ret >= 0 ? -EIO : ret;
}
ret = hibmc_dp_link_training_configure(dp); if (ret) return ret;
ret = hibmc_dp_link_set_pattern(dp, DP_TRAINING_PATTERN_1); if (ret) return ret;
for (i = 0; i < dp->link.cap.lanes; i++)
train_set[i] = DP_TRAIN_VOLTAGE_SWING_LEVEL_0;
ret = hibmc_dp_serdes_set_tx_cfg(dp, dp->link.train_set); if (ret) return ret;
ret = drm_dp_dpcd_write(dp->aux, DP_TRAINING_LANE0_SET, train_set, dp->link.cap.lanes); if (ret != dp->link.cap.lanes) {
drm_dbg_dp(dp->dev, "dp aux write training lane set failed\n"); return ret >= 0 ? -EIO : ret;
}
/* * DP 1.4 spec define 10 for maxtries value, for pre DP 1.4 version set a limit of 80 * (4 voltage levels x 4 preemphasis levels x 5 identical voltage retries)
*/
ret = drm_dp_dpcd_read_link_status(dp->aux, lane_status); if (ret) {
drm_err(dp->dev, "Get lane status failed\n"); return ret;
}
if (drm_dp_clock_recovery_ok(lane_status, dp->link.cap.lanes)) {
drm_dbg_dp(dp->dev, "dp link training cr done\n");
dp->link.status.clock_recovered = true; return0;
}
if (voltage_tries == 5) {
drm_dbg_dp(dp->dev, "same voltage tries 5 times\n");
dp->link.status.clock_recovered = false; return0;
}
ret = hibmc_dp_serdes_set_tx_cfg(dp, dp->link.train_set); if (ret) return ret;
ret = drm_dp_dpcd_write(dp->aux, DP_TRAINING_LANE0_SET, dp->link.train_set,
dp->link.cap.lanes); if (ret != dp->link.cap.lanes) {
drm_dbg_dp(dp->dev, "Update link training failed\n"); return ret >= 0 ? -EIO : ret;
}
if (drm_dp_channel_eq_ok(lane_status, dp->link.cap.lanes)) {
dp->link.status.channel_equalized = true;
drm_dbg_dp(dp->dev, "dp link training eq done\n"); break;
}
hibmc_dp_link_get_adjust_train(dp, lane_status);
ret = hibmc_dp_serdes_set_tx_cfg(dp, dp->link.train_set); if (ret) return ret;
ret = drm_dp_dpcd_write(dp->aux, DP_TRAINING_LANE0_SET,
dp->link.train_set, dp->link.cap.lanes); if (ret != dp->link.cap.lanes) {
drm_dbg_dp(dp->dev, "Update link training failed\n");
ret = (ret >= 0) ? -EIO : ret; break;
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.