diff options
| -rw-r--r-- | drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 19 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/dc/core/dc_debug.c | 40 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/dc/core/dc_stream.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/dc/inc/core_status.h | 2 | 
4 files changed, 59 insertions, 8 deletions
| diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index 7cfa0c91e748..16653e0573b1 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -7323,10 +7323,15 @@ create_validate_stream_for_sink(struct amdgpu_dm_connector *aconnector,  	const struct drm_connector_state *drm_state = dm_state ? &dm_state->base : NULL;  	int requested_bpc = drm_state ? drm_state->max_requested_bpc : 8;  	enum dc_status dc_result = DC_OK; +	uint8_t bpc_limit = 6;  	if (!dm_state)  		return NULL; +	if (aconnector->dc_link->connector_signal == SIGNAL_TYPE_HDMI_TYPE_A || +	    aconnector->dc_link->dpcd_caps.dongle_type == DISPLAY_DONGLE_DP_HDMI_CONVERTER) +		bpc_limit = 8; +  	do {  		stream = create_stream_for_sink(connector, drm_mode,  						dm_state, old_stream, @@ -7347,11 +7352,12 @@ create_validate_stream_for_sink(struct amdgpu_dm_connector *aconnector,  			dc_result = dm_validate_stream_and_context(adev->dm.dc, stream);  		if (dc_result != DC_OK) { -			DRM_DEBUG_KMS("Mode %dx%d (clk %d) failed DC validation with error %d (%s)\n", +			DRM_DEBUG_KMS("Mode %dx%d (clk %d) pixel_encoding:%s color_depth:%s failed validation -- %s\n",  				      drm_mode->hdisplay,  				      drm_mode->vdisplay,  				      drm_mode->clock, -				      dc_result, +				      dc_pixel_encoding_to_str(stream->timing.pixel_encoding), +				      dc_color_depth_to_str(stream->timing.display_color_depth),  				      dc_status_to_str(dc_result));  			dc_stream_release(stream); @@ -7359,10 +7365,13 @@ create_validate_stream_for_sink(struct amdgpu_dm_connector *aconnector,  			requested_bpc -= 2; /* lower bpc to retry validation */  		} -	} while (stream == NULL && requested_bpc >= 6); +	} while (stream == NULL && requested_bpc >= bpc_limit); -	if (dc_result == DC_FAIL_ENC_VALIDATE && !aconnector->force_yuv420_output) { -		DRM_DEBUG_KMS("Retry forcing YCbCr420 encoding\n"); +	if ((dc_result == DC_FAIL_ENC_VALIDATE || +	     dc_result == DC_EXCEED_DONGLE_CAP) && +	     !aconnector->force_yuv420_output) { +		DRM_DEBUG_KMS("%s:%d Retry forcing yuv420 encoding\n", +				     __func__, __LINE__);  		aconnector->force_yuv420_output = true;  		stream = create_validate_stream_for_sink(aconnector, drm_mode, diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_debug.c b/drivers/gpu/drm/amd/display/dc/core/dc_debug.c index 0bb25c537243..af1ea5792560 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_debug.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_debug.c @@ -392,3 +392,43 @@ char *dc_status_to_str(enum dc_status status)  	return "Unexpected status error";  } + +char *dc_pixel_encoding_to_str(enum dc_pixel_encoding pixel_encoding) +{ +	switch (pixel_encoding) { +	case PIXEL_ENCODING_RGB: +		return "RGB"; +	case PIXEL_ENCODING_YCBCR422: +		return "YUV422"; +	case PIXEL_ENCODING_YCBCR444: +		return "YUV444"; +	case PIXEL_ENCODING_YCBCR420: +		return "YUV420"; +	default: +		return "Unknown"; +	} +} + +char *dc_color_depth_to_str(enum dc_color_depth color_depth) +{ +	switch (color_depth) { +	case COLOR_DEPTH_666: +		return "6-bpc"; +	case COLOR_DEPTH_888: +		return "8-bpc"; +	case COLOR_DEPTH_101010: +		return "10-bpc"; +	case COLOR_DEPTH_121212: +		return "12-bpc"; +	case COLOR_DEPTH_141414: +		return "14-bpc"; +	case COLOR_DEPTH_161616: +		return "16-bpc"; +	case COLOR_DEPTH_999: +		return "9-bpc"; +	case COLOR_DEPTH_111111: +		return "11-bpc"; +	default: +		return "Unknown"; +	} +} diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c index 8b0632104aef..55dc482d9b36 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c @@ -812,12 +812,12 @@ void dc_stream_log(const struct dc *dc, const struct dc_stream_state *stream)  			stream->dst.height,  			stream->output_color_space);  	DC_LOG_DC( -			"\tpix_clk_khz: %d, h_total: %d, v_total: %d, pixelencoder:%d, displaycolorDepth:%d\n", +			"\tpix_clk_khz: %d, h_total: %d, v_total: %d, pixel_encoding:%s, color_depth:%s\n",  			stream->timing.pix_clk_100hz / 10,  			stream->timing.h_total,  			stream->timing.v_total, -			stream->timing.pixel_encoding, -			stream->timing.display_color_depth); +			dc_pixel_encoding_to_str(stream->timing.pixel_encoding), +			dc_color_depth_to_str(stream->timing.display_color_depth));  	DC_LOG_DC(  			"\tlink: %d\n",  			stream->link->link_index); diff --git a/drivers/gpu/drm/amd/display/dc/inc/core_status.h b/drivers/gpu/drm/amd/display/dc/inc/core_status.h index fa5edd03d004..b5afd8c3103d 100644 --- a/drivers/gpu/drm/amd/display/dc/inc/core_status.h +++ b/drivers/gpu/drm/amd/display/dc/inc/core_status.h @@ -60,5 +60,7 @@ enum dc_status {  };  char *dc_status_to_str(enum dc_status status); +char *dc_pixel_encoding_to_str(enum dc_pixel_encoding pixel_encoding); +char *dc_color_depth_to_str(enum dc_color_depth color_depth);  #endif /* _CORE_STATUS_H_ */ | 
