drm/amd/display: implement DSC pass-through support
Currently, we only attempt to setup DSC at the virtual DPCD port, however many modern displays come with DSC support and MST hubs can now support DSC pass-through. So, to more optimally make use of the available bandwidth, use DSC pass-through when possible by adding DSC pass-through enablement support into the DSC enable sequence. Signed-off-by: Hamza Mahfooz <hamza.mahfooz@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
8350bb59e6
commit
a4d3230353
@ -729,8 +729,14 @@ bool dm_helpers_dp_write_dsc_enable(
|
||||
const struct dc_stream_state *stream,
|
||||
bool enable)
|
||||
{
|
||||
uint8_t enable_dsc = enable ? 1 : 0;
|
||||
static const uint8_t DSC_DISABLE;
|
||||
static const uint8_t DSC_DECODING = 0x01;
|
||||
static const uint8_t DSC_PASSTHROUGH = 0x02;
|
||||
|
||||
struct amdgpu_dm_connector *aconnector;
|
||||
struct drm_dp_mst_port *port;
|
||||
uint8_t enable_dsc = enable ? DSC_DECODING : DSC_DISABLE;
|
||||
uint8_t enable_passthrough = enable ? DSC_PASSTHROUGH : DSC_DISABLE;
|
||||
uint8_t ret = 0;
|
||||
|
||||
if (!stream)
|
||||
@ -750,8 +756,39 @@ bool dm_helpers_dp_write_dsc_enable(
|
||||
aconnector->dsc_aux, stream, enable_dsc);
|
||||
#endif
|
||||
|
||||
ret = drm_dp_dpcd_write(aconnector->dsc_aux, DP_DSC_ENABLE, &enable_dsc, 1);
|
||||
DC_LOG_DC("Send DSC %s to MST RX\n", enable_dsc ? "enable" : "disable");
|
||||
port = aconnector->port;
|
||||
|
||||
if (enable) {
|
||||
if (port->passthrough_aux) {
|
||||
ret = drm_dp_dpcd_write(port->passthrough_aux,
|
||||
DP_DSC_ENABLE,
|
||||
&enable_passthrough, 1);
|
||||
DC_LOG_DC("Sent DSC pass-through enable to virtual dpcd port, ret = %u\n",
|
||||
ret);
|
||||
}
|
||||
|
||||
ret = drm_dp_dpcd_write(aconnector->dsc_aux,
|
||||
DP_DSC_ENABLE, &enable_dsc, 1);
|
||||
DC_LOG_DC("Sent DSC decoding enable to %s port, ret = %u\n",
|
||||
(port->passthrough_aux) ? "remote RX" :
|
||||
"virtual dpcd",
|
||||
ret);
|
||||
} else {
|
||||
ret = drm_dp_dpcd_write(aconnector->dsc_aux,
|
||||
DP_DSC_ENABLE, &enable_dsc, 1);
|
||||
DC_LOG_DC("Sent DSC decoding disable to %s port, ret = %u\n",
|
||||
(port->passthrough_aux) ? "remote RX" :
|
||||
"virtual dpcd",
|
||||
ret);
|
||||
|
||||
if (port->passthrough_aux) {
|
||||
ret = drm_dp_dpcd_write(port->passthrough_aux,
|
||||
DP_DSC_ENABLE,
|
||||
&enable_passthrough, 1);
|
||||
DC_LOG_DC("Sent DSC pass-through disable to virtual dpcd port, ret = %u\n",
|
||||
ret);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (stream->signal == SIGNAL_TYPE_DISPLAY_PORT || stream->signal == SIGNAL_TYPE_EDP) {
|
||||
@ -768,7 +805,7 @@ bool dm_helpers_dp_write_dsc_enable(
|
||||
#endif
|
||||
}
|
||||
|
||||
return (ret > 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool dm_helpers_is_dp_sink_present(struct dc_link *link)
|
||||
|
Loading…
x
Reference in New Issue
Block a user