Commit 56ef6ed9 authored by Anthony Koo's avatar Anthony Koo Committed by Alex Deucher
Browse files

drm/amd/display: Move hdr_metadata from plane to stream



Need to move HDR Metadata from Surface to Stream since there is only one
infoframe possible per stream.

Also cleaning up some duplicate definitions.

Signed-off-by: default avatarAnthony Koo <anthony.koo@amd.com>
Reviewed-by: default avatarTony Cheng <Tony.Cheng@amd.com>
Acked-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent de4a2967
Loading
Loading
Loading
Loading
+15 −4
Original line number Diff line number Diff line
@@ -1007,6 +1007,7 @@ bool dc_commit_planes_to_stream(
		flip_addr[i].address = plane_states[i]->address;
		flip_addr[i].flip_immediate = plane_states[i]->flip_immediate;
		plane_info[i].color_space = plane_states[i]->color_space;
		plane_info[i].input_tf = plane_states[i]->input_tf;
		plane_info[i].format = plane_states[i]->format;
		plane_info[i].plane_size = plane_states[i]->plane_size;
		plane_info[i].rotation = plane_states[i]->rotation;
@@ -1132,12 +1133,12 @@ static enum surface_update_type get_plane_info_update_type(

	/* Full update parameters */
	temp_plane_info.color_space = u->surface->color_space;
	temp_plane_info.input_tf = u->surface->input_tf;
	temp_plane_info.dcc = u->surface->dcc;
	temp_plane_info.horizontal_mirror = u->surface->horizontal_mirror;
	temp_plane_info.plane_size = u->surface->plane_size;
	temp_plane_info.rotation = u->surface->rotation;
	temp_plane_info.stereo_format = u->surface->stereo_format;
	temp_plane_info.input_csc_enabled = u->surface->input_csc_color_matrix.enable_adjustment;

	if (surface_index == 0)
		temp_plane_info.visible = u->plane_info->visible;
@@ -1218,7 +1219,6 @@ static enum surface_update_type det_surface_update(
		overall_type = type;

	if (u->in_transfer_func ||
		u->hdr_static_metadata ||
		u->input_csc_color_matrix) {
		if (overall_type < UPDATE_TYPE_MED)
			overall_type = UPDATE_TYPE_MED;
@@ -1350,6 +1350,16 @@ static void commit_planes_for_stream(struct dc *dc,
					pipe_ctx->top_pipe->plane_state == pipe_ctx->plane_state))
				dc->hwss.set_input_transfer_func(
						pipe_ctx, pipe_ctx->plane_state);
		}
	}

	if (update_type > UPDATE_TYPE_FAST) {
		for (j = 0; j < dc->res_pool->pipe_count; j++) {
			struct pipe_ctx *pipe_ctx =
					&context->res_ctx.pipe_ctx[j];

			if (!pipe_ctx->stream)
				continue;

			if (stream_update != NULL &&
				stream_update->out_transfer_func != NULL) {
@@ -1357,7 +1367,8 @@ static void commit_planes_for_stream(struct dc *dc,
						pipe_ctx, pipe_ctx->stream);
			}

			if (srf_updates[i].hdr_static_metadata) {
			if (stream_update != NULL &&
				stream_update->hdr_static_metadata) {
				resource_build_info_frame(pipe_ctx);
				dc->hwss.update_info_frame(pipe_ctx);
			}
+4 −0
Original line number Diff line number Diff line
@@ -137,6 +137,7 @@ void pre_surface_trace(
				"plane_state->tiling_info.gfx8.pipe_config = %d;\n"
				"plane_state->tiling_info.gfx8.array_mode = %d;\n"
				"plane_state->color_space = %d;\n"
				"plane_state->input_tf = %d;\n"
				"plane_state->dcc.enable = %d;\n"
				"plane_state->format = %d;\n"
				"plane_state->rotation = %d;\n"
@@ -144,6 +145,7 @@ void pre_surface_trace(
				plane_state->tiling_info.gfx8.pipe_config,
				plane_state->tiling_info.gfx8.array_mode,
				plane_state->color_space,
				plane_state->input_tf,
				plane_state->dcc.enable,
				plane_state->format,
				plane_state->rotation,
@@ -184,6 +186,7 @@ void update_surface_trace(
		if (update->plane_info) {
			SURFACE_TRACE(
					"plane_info->color_space = %d;\n"
					"plane_info->input_tf = %d;\n"
					"plane_info->format = %d;\n"
					"plane_info->plane_size.grph.surface_pitch = %d;\n"
					"plane_info->plane_size.grph.surface_size.height = %d;\n"
@@ -192,6 +195,7 @@ void update_surface_trace(
					"plane_info->plane_size.grph.surface_size.y = %d;\n"
					"plane_info->rotation = %d;\n",
					update->plane_info->color_space,
					update->plane_info->input_tf,
					update->plane_info->format,
					update->plane_info->plane_size.grph.surface_pitch,
					update->plane_info->plane_size.grph.surface_size.height,
+16 −25
Original line number Diff line number Diff line
@@ -2319,20 +2319,13 @@ static void set_spd_info_packet(

static void set_hdr_static_info_packet(
		struct encoder_info_packet *info_packet,
		struct dc_plane_state *plane_state,
		struct dc_stream_state *stream)
{
	uint16_t i = 0;
	enum signal_type signal = stream->signal;
	struct dc_hdr_static_metadata hdr_metadata;
	uint32_t data;

	if (!plane_state)
		return;

	hdr_metadata = plane_state->hdr_static_ctx;

	if (!hdr_metadata.hdr_supported)
	if (!stream->hdr_static_metadata.hdr_supported)
		return;

	if (dc_is_hdmi_signal(signal)) {
@@ -2352,55 +2345,55 @@ static void set_hdr_static_info_packet(
		i = 2;
	}

	data = hdr_metadata.is_hdr;
	data = stream->hdr_static_metadata.is_hdr;
	info_packet->sb[i++] = data ? 0x02 : 0x00;
	info_packet->sb[i++] = 0x00;

	data = hdr_metadata.chromaticity_green_x / 2;
	data = stream->hdr_static_metadata.chromaticity_green_x / 2;
	info_packet->sb[i++] = data & 0xFF;
	info_packet->sb[i++] = (data & 0xFF00) >> 8;

	data = hdr_metadata.chromaticity_green_y / 2;
	data = stream->hdr_static_metadata.chromaticity_green_y / 2;
	info_packet->sb[i++] = data & 0xFF;
	info_packet->sb[i++] = (data & 0xFF00) >> 8;

	data = hdr_metadata.chromaticity_blue_x / 2;
	data = stream->hdr_static_metadata.chromaticity_blue_x / 2;
	info_packet->sb[i++] = data & 0xFF;
	info_packet->sb[i++] = (data & 0xFF00) >> 8;

	data = hdr_metadata.chromaticity_blue_y / 2;
	data = stream->hdr_static_metadata.chromaticity_blue_y / 2;
	info_packet->sb[i++] = data & 0xFF;
	info_packet->sb[i++] = (data & 0xFF00) >> 8;

	data = hdr_metadata.chromaticity_red_x / 2;
	data = stream->hdr_static_metadata.chromaticity_red_x / 2;
	info_packet->sb[i++] = data & 0xFF;
	info_packet->sb[i++] = (data & 0xFF00) >> 8;

	data = hdr_metadata.chromaticity_red_y / 2;
	data = stream->hdr_static_metadata.chromaticity_red_y / 2;
	info_packet->sb[i++] = data & 0xFF;
	info_packet->sb[i++] = (data & 0xFF00) >> 8;

	data = hdr_metadata.chromaticity_white_point_x / 2;
	data = stream->hdr_static_metadata.chromaticity_white_point_x / 2;
	info_packet->sb[i++] = data & 0xFF;
	info_packet->sb[i++] = (data & 0xFF00) >> 8;

	data = hdr_metadata.chromaticity_white_point_y / 2;
	data = stream->hdr_static_metadata.chromaticity_white_point_y / 2;
	info_packet->sb[i++] = data & 0xFF;
	info_packet->sb[i++] = (data & 0xFF00) >> 8;

	data = hdr_metadata.max_luminance;
	data = stream->hdr_static_metadata.max_luminance;
	info_packet->sb[i++] = data & 0xFF;
	info_packet->sb[i++] = (data & 0xFF00) >> 8;

	data = hdr_metadata.min_luminance;
	data = stream->hdr_static_metadata.min_luminance;
	info_packet->sb[i++] = data & 0xFF;
	info_packet->sb[i++] = (data & 0xFF00) >> 8;

	data = hdr_metadata.maximum_content_light_level;
	data = stream->hdr_static_metadata.maximum_content_light_level;
	info_packet->sb[i++] = data & 0xFF;
	info_packet->sb[i++] = (data & 0xFF00) >> 8;

	data = hdr_metadata.maximum_frame_average_light_level;
	data = stream->hdr_static_metadata.maximum_frame_average_light_level;
	info_packet->sb[i++] = data & 0xFF;
	info_packet->sb[i++] = (data & 0xFF00) >> 8;

@@ -2551,16 +2544,14 @@ void resource_build_info_frame(struct pipe_ctx *pipe_ctx)

		set_spd_info_packet(&info->spd, pipe_ctx->stream);

		set_hdr_static_info_packet(&info->hdrsmd,
				pipe_ctx->plane_state, pipe_ctx->stream);
		set_hdr_static_info_packet(&info->hdrsmd, pipe_ctx->stream);

	} else if (dc_is_dp_signal(signal)) {
		set_vsc_info_packet(&info->vsc, pipe_ctx->stream);

		set_spd_info_packet(&info->spd, pipe_ctx->stream);

		set_hdr_static_info_packet(&info->hdrsmd,
				pipe_ctx->plane_state, pipe_ctx->stream);
		set_hdr_static_info_packet(&info->hdrsmd, pipe_ctx->stream);
	}

	patch_gamut_packet_checksum(&info->gamut);
+9 −26
Original line number Diff line number Diff line
@@ -334,24 +334,6 @@ enum color_transfer_func {
	transfer_func_gamma_26
};

enum color_color_space {
	color_space_unsupported,
	color_space_srgb,
	color_space_bt601,
	color_space_bt709,
	color_space_xv_ycc_bt601,
	color_space_xv_ycc_bt709,
	color_space_xr_rgb,
	color_space_bt2020,
	color_space_adobe,
	color_space_dci_p3,
	color_space_sc_rgb_ms_ref,
	color_space_display_native,
	color_space_app_ctrl,
	color_space_dolby_vision,
	color_space_custom_coordinates
};

struct dc_hdr_static_metadata {
	/* display chromaticities and white point in units of 0.00001 */
	unsigned int chromaticity_green_x;
@@ -427,7 +409,6 @@ struct dc_plane_state {
	union dc_tiling_info tiling_info;

	struct dc_plane_dcc_param dcc;
	struct dc_hdr_static_metadata hdr_static_ctx;

	struct dc_gamma *gamma_correction;
	struct dc_transfer_func *in_transfer_func;
@@ -435,13 +416,12 @@ struct dc_plane_state {
	struct csc_transform input_csc_color_matrix;
	struct fixed31_32 coeff_reduction_factor;

	// sourceContentAttribute cache
	bool is_source_input_valid;
	struct dc_hdr_static_metadata source_input_mastering_info;
	enum color_color_space source_input_color_space;
	enum color_transfer_func source_input_tf;
	// TODO: No longer used, remove
	struct dc_hdr_static_metadata hdr_static_ctx;

	enum dc_color_space color_space;
	enum color_transfer_func input_tf;

	enum surface_pixel_format format;
	enum dc_rotation_angle rotation;
	enum plane_stereo_format stereo_format;
@@ -467,7 +447,8 @@ struct dc_plane_info {
	enum surface_pixel_format format;
	enum dc_rotation_angle rotation;
	enum plane_stereo_format stereo_format;
	enum dc_color_space color_space; /*todo: wrong place, fits in scaling info*/
	enum dc_color_space color_space;
	enum color_transfer_func input_tf;
	bool horizontal_mirror;
	bool visible;
	bool per_pixel_alpha;
@@ -488,13 +469,13 @@ struct dc_surface_update {
	struct dc_flip_addrs *flip_addr;
	struct dc_plane_info *plane_info;
	struct dc_scaling_info *scaling_info;

	/* following updates require alloc/sleep/spin that is not isr safe,
	 * null means no updates
	 */
	/* gamma TO BE REMOVED */
	struct dc_gamma *gamma;
	struct dc_transfer_func *in_transfer_func;
	struct dc_hdr_static_metadata *hdr_static_metadata;

	struct csc_transform *input_csc_color_matrix;
	struct fixed31_32 *coeff_reduction_factor;
@@ -591,6 +572,7 @@ struct dc_stream_state {

	struct freesync_context freesync_ctx;

	struct dc_hdr_static_metadata hdr_static_metadata;
	struct dc_transfer_func *out_transfer_func;
	struct colorspace_transform gamut_remap_matrix;
	struct csc_transform csc_color_matrix;
@@ -631,6 +613,7 @@ struct dc_stream_update {
	struct rect src;
	struct rect dst;
	struct dc_transfer_func *out_transfer_func;
	struct dc_hdr_static_metadata *hdr_static_metadata;
};

bool dc_is_stream_unchanged(
+9 −0
Original line number Diff line number Diff line
@@ -492,15 +492,24 @@ struct dc_cursor_attributes {
enum dc_color_space {
	COLOR_SPACE_UNKNOWN,
	COLOR_SPACE_SRGB,
	COLOR_SPACE_XR_RGB,
	COLOR_SPACE_SRGB_LIMITED,
	COLOR_SPACE_MSREF_SCRGB,
	COLOR_SPACE_YCBCR601,
	COLOR_SPACE_YCBCR709,
	COLOR_SPACE_XV_YCC_709,
	COLOR_SPACE_XV_YCC_601,
	COLOR_SPACE_YCBCR601_LIMITED,
	COLOR_SPACE_YCBCR709_LIMITED,
	COLOR_SPACE_2020_RGB_FULLRANGE,
	COLOR_SPACE_2020_RGB_LIMITEDRANGE,
	COLOR_SPACE_2020_YCBCR,
	COLOR_SPACE_ADOBERGB,
	COLOR_SPACE_DCIP3,
	COLOR_SPACE_DISPLAYNATIVE,
	COLOR_SPACE_DOLBYVISION,
	COLOR_SPACE_APPCTRL,
	COLOR_SPACE_CUSTOMPOINTS,
};

enum dc_dither_option {
Loading