Commit 12e2b2d4 authored by Dmytro Laktyushkin's avatar Dmytro Laktyushkin Committed by Alex Deucher
Browse files

drm/amd/display: add dcc programming for dual plane



Add dual plane dcc programming support for
surfaces.

Removes unions from plane size and dcc params as they
serve no practical purpose only making our code
more convoluted. This results in easy dual plane
dcc and surface size programming.

Temporary diags_dm code is used to handle the interface
change without breaking functionality as a diags change
needs to be applied after this one.

Signed-off-by: default avatarDmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
Reviewed-by: default avatarCharlene Liu <Charlene.Liu@amd.com>
Acked-by: default avatarLeo Li <sunpeng.li@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent f7938bc0
Loading
Loading
Loading
Loading
+21 −21
Original line number Diff line number Diff line
@@ -2672,7 +2672,7 @@ fill_plane_dcc_attributes(struct amdgpu_device *adev,
			  const struct amdgpu_framebuffer *afb,
			  const enum surface_pixel_format format,
			  const enum dc_rotation_angle rotation,
			  const union plane_size *plane_size,
			  const struct plane_size *plane_size,
			  const union dc_tiling_info *tiling_info,
			  const uint64_t info,
			  struct dc_plane_dcc_param *dcc,
@@ -2698,8 +2698,8 @@ fill_plane_dcc_attributes(struct amdgpu_device *adev,
		return -EINVAL;

	input.format = format;
	input.surface_size.width = plane_size->grph.surface_size.width;
	input.surface_size.height = plane_size->grph.surface_size.height;
	input.surface_size.width = plane_size->surface_size.width;
	input.surface_size.height = plane_size->surface_size.height;
	input.swizzle_mode = tiling_info->gfx9.swizzle;

	if (rotation == ROTATION_ANGLE_0 || rotation == ROTATION_ANGLE_180)
@@ -2717,9 +2717,9 @@ fill_plane_dcc_attributes(struct amdgpu_device *adev,
		return -EINVAL;

	dcc->enable = 1;
	dcc->grph.meta_pitch =
	dcc->meta_pitch =
		AMDGPU_TILING_GET(info, DCC_PITCH_MAX) + 1;
	dcc->grph.independent_64b_blks = i64b;
	dcc->independent_64b_blks = i64b;

	dcc_address = get_dcc_address(afb->address, info);
	address->grph.meta_addr.low_part = lower_32_bits(dcc_address);
@@ -2735,7 +2735,7 @@ fill_plane_buffer_attributes(struct amdgpu_device *adev,
			     const enum dc_rotation_angle rotation,
			     const uint64_t tiling_flags,
			     union dc_tiling_info *tiling_info,
			     union plane_size *plane_size,
			     struct plane_size *plane_size,
			     struct dc_plane_dcc_param *dcc,
			     struct dc_plane_address *address)
{
@@ -2748,11 +2748,11 @@ fill_plane_buffer_attributes(struct amdgpu_device *adev,
	memset(address, 0, sizeof(*address));

	if (format < SURFACE_PIXEL_FORMAT_VIDEO_BEGIN) {
		plane_size->grph.surface_size.x = 0;
		plane_size->grph.surface_size.y = 0;
		plane_size->grph.surface_size.width = fb->width;
		plane_size->grph.surface_size.height = fb->height;
		plane_size->grph.surface_pitch =
		plane_size->surface_size.x = 0;
		plane_size->surface_size.y = 0;
		plane_size->surface_size.width = fb->width;
		plane_size->surface_size.height = fb->height;
		plane_size->surface_pitch =
			fb->pitches[0] / fb->format->cpp[0];

		address->type = PLN_ADDR_TYPE_GRAPHICS;
@@ -2761,20 +2761,20 @@ fill_plane_buffer_attributes(struct amdgpu_device *adev,
	} else if (format < SURFACE_PIXEL_FORMAT_INVALID) {
		uint64_t chroma_addr = afb->address + fb->offsets[1];

		plane_size->video.luma_size.x = 0;
		plane_size->video.luma_size.y = 0;
		plane_size->video.luma_size.width = fb->width;
		plane_size->video.luma_size.height = fb->height;
		plane_size->video.luma_pitch =
		plane_size->surface_size.x = 0;
		plane_size->surface_size.y = 0;
		plane_size->surface_size.width = fb->width;
		plane_size->surface_size.height = fb->height;
		plane_size->surface_pitch =
			fb->pitches[0] / fb->format->cpp[0];

		plane_size->video.chroma_size.x = 0;
		plane_size->video.chroma_size.y = 0;
		plane_size->chroma_size.x = 0;
		plane_size->chroma_size.y = 0;
		/* TODO: set these based on surface format */
		plane_size->video.chroma_size.width = fb->width / 2;
		plane_size->video.chroma_size.height = fb->height / 2;
		plane_size->chroma_size.width = fb->width / 2;
		plane_size->chroma_size.height = fb->height / 2;

		plane_size->video.chroma_pitch =
		plane_size->chroma_pitch =
			fb->pitches[1] / fb->format->cpp[1];

		address->type = PLN_ADDR_TYPE_VIDEO_PROGRESSIVE;
+1 −1
Original line number Diff line number Diff line
@@ -2852,7 +2852,7 @@ static void populate_initial_data(
			data->src_height[num_displays * 2 + j] = bw_int_to_fixed(pipe[i].bottom_pipe->plane_res.scl_data.viewport.height);
			data->src_width[num_displays * 2 + j] = bw_int_to_fixed(pipe[i].bottom_pipe->plane_res.scl_data.viewport.width);
			data->pitch_in_pixels[num_displays * 2 + j] = bw_int_to_fixed(
					pipe[i].bottom_pipe->plane_state->plane_size.grph.surface_pitch);
					pipe[i].bottom_pipe->plane_state->plane_size.surface_pitch);
			data->h_taps[num_displays * 2 + j] = bw_int_to_fixed(pipe[i].bottom_pipe->plane_res.scl_data.taps.h_taps);
			data->v_taps[num_displays * 2 + j] = bw_int_to_fixed(pipe[i].bottom_pipe->plane_res.scl_data.taps.v_taps);
			data->h_scale_ratio[num_displays * 2 + j] = fixed31_32_to_bw_fixed(
+1 −1
Original line number Diff line number Diff line
@@ -329,7 +329,7 @@ static void pipe_ctx_to_e2e_pipe_params (
			dcc_support_pixel_format(pipe->plane_state->format, &bpe) ? 1 : 0;
	}
	input->src.dcc_rate            = 1;
	input->src.meta_pitch          = pipe->plane_state->dcc.grph.meta_pitch;
	input->src.meta_pitch          = pipe->plane_state->dcc.meta_pitch;
	input->src.source_scan         = dm_horz;
	input->src.sw_mode             = pipe->plane_state->tiling_info.gfx9.swizzle;

+5 −5
Original line number Diff line number Diff line
@@ -1349,8 +1349,8 @@ static enum surface_update_type get_plane_info_update_type(const struct dc_surfa
	}

	if (u->plane_info->dcc.enable != u->surface->dcc.enable
			|| u->plane_info->dcc.grph.independent_64b_blks != u->surface->dcc.grph.independent_64b_blks
			|| u->plane_info->dcc.grph.meta_pitch != u->surface->dcc.grph.meta_pitch) {
			|| u->plane_info->dcc.independent_64b_blks != u->surface->dcc.independent_64b_blks
			|| u->plane_info->dcc.meta_pitch != u->surface->dcc.meta_pitch) {
		update_flags->bits.dcc_change = 1;
		elevate_update_type(&update_type, UPDATE_TYPE_MED);
	}
@@ -1364,9 +1364,9 @@ static enum surface_update_type get_plane_info_update_type(const struct dc_surfa
		elevate_update_type(&update_type, UPDATE_TYPE_FULL);
	}

	if (u->plane_info->plane_size.grph.surface_pitch != u->surface->plane_size.grph.surface_pitch
			|| u->plane_info->plane_size.video.luma_pitch != u->surface->plane_size.video.luma_pitch
			|| u->plane_info->plane_size.video.chroma_pitch != u->surface->plane_size.video.chroma_pitch) {
	if (u->plane_info->plane_size.surface_pitch != u->surface->plane_size.surface_pitch
			|| u->plane_info->plane_size.surface_pitch != u->surface->plane_size.surface_pitch
			|| u->plane_info->plane_size.chroma_pitch != u->surface->plane_size.chroma_pitch) {
		update_flags->bits.plane_size_change = 1;
		elevate_update_type(&update_type, UPDATE_TYPE_MED);
	}
+20 −20
Original line number Diff line number Diff line
@@ -115,16 +115,16 @@ void pre_surface_trace(
				plane_state->clip_rect.height);

		SURFACE_TRACE(
				"plane_state->plane_size.grph.surface_size.x = %d;\n"
				"plane_state->plane_size.grph.surface_size.y = %d;\n"
				"plane_state->plane_size.grph.surface_size.width = %d;\n"
				"plane_state->plane_size.grph.surface_size.height = %d;\n"
				"plane_state->plane_size.grph.surface_pitch = %d;\n",
				plane_state->plane_size.grph.surface_size.x,
				plane_state->plane_size.grph.surface_size.y,
				plane_state->plane_size.grph.surface_size.width,
				plane_state->plane_size.grph.surface_size.height,
				plane_state->plane_size.grph.surface_pitch);
				"plane_state->plane_size.surface_size.x = %d;\n"
				"plane_state->plane_size.surface_size.y = %d;\n"
				"plane_state->plane_size.surface_size.width = %d;\n"
				"plane_state->plane_size.surface_size.height = %d;\n"
				"plane_state->plane_size.surface_pitch = %d;\n",
				plane_state->plane_size.surface_size.x,
				plane_state->plane_size.surface_size.y,
				plane_state->plane_size.surface_size.width,
				plane_state->plane_size.surface_size.height,
				plane_state->plane_size.surface_pitch);


		SURFACE_TRACE(
@@ -202,20 +202,20 @@ void update_surface_trace(
			SURFACE_TRACE(
					"plane_info->color_space = %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"
					"plane_info->plane_size.grph.surface_size.width = %d;\n"
					"plane_info->plane_size.grph.surface_size.x = %d;\n"
					"plane_info->plane_size.grph.surface_size.y = %d;\n"
					"plane_info->plane_size.surface_pitch = %d;\n"
					"plane_info->plane_size.surface_size.height = %d;\n"
					"plane_info->plane_size.surface_size.width = %d;\n"
					"plane_info->plane_size.surface_size.x = %d;\n"
					"plane_info->plane_size.surface_size.y = %d;\n"
					"plane_info->rotation = %d;\n"
					"plane_info->stereo_format = %d;\n",
					update->plane_info->color_space,
					update->plane_info->format,
					update->plane_info->plane_size.grph.surface_pitch,
					update->plane_info->plane_size.grph.surface_size.height,
					update->plane_info->plane_size.grph.surface_size.width,
					update->plane_info->plane_size.grph.surface_size.x,
					update->plane_info->plane_size.grph.surface_size.y,
					update->plane_info->plane_size.surface_pitch,
					update->plane_info->plane_size.surface_size.height,
					update->plane_info->plane_size.surface_size.width,
					update->plane_info->plane_size.surface_size.x,
					update->plane_info->plane_size.surface_size.y,
					update->plane_info->rotation,
					update->plane_info->stereo_format);

Loading