diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1781-drm-amd-display-Rework-DC-plane-filling-and-surface-.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1781-drm-amd-display-Rework-DC-plane-filling-and-surface-.patch | 624 |
1 files changed, 624 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1781-drm-amd-display-Rework-DC-plane-filling-and-surface-.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1781-drm-amd-display-Rework-DC-plane-filling-and-surface-.patch new file mode 100644 index 00000000..92670a0c --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1781-drm-amd-display-Rework-DC-plane-filling-and-surface-.patch @@ -0,0 +1,624 @@ +From ee5512e5b856d5d840606df15c44b43861d03eec Mon Sep 17 00:00:00 2001 +From: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> +Date: Thu, 28 Mar 2019 14:45:19 -0400 +Subject: [PATCH 1781/2940] drm/amd/display: Rework DC plane filling and + surface updates + +[Why] +We currently don't do DC validation for medium or full updates where +the plane state isn't created. There are some medium and full updates +that can cause bandwidth or clock changes to occur resulting in +underflow or corruption. + +We need to be able to fill surface and plane info updates during +atomic commit for dm_determine_update_type for commit. Since we already +do this during atomic commit tail it would be good if we had the same +logic in both places for creating these structures. + +[How] +Introduce fill_dc_scaling_info and fill_dc_plane_info_and_addr. +These two functions cover the following three update structures: + +- struct dc_scaling_info +- struct dc_plane_info +- struct dc_plane_address + +Cleanup and adapter the existing fill_plane_* helpers to work with +these functions. + +Update call sites that used most of these sub helpers directly to work +with the new functions. The exception being prepare_fb - we just want +the new buffer attributes specifically in the case where we're +creating the plane. This is needed for dc_commit_state in the case +where the FB hasn't been previously been used. + +This isn't quite a refactor, but functionally driver behavior should +be mostly the smae as before. The one exception is that we now check +the return code for fill_plane_buffer_attributes which means that +commits will be rejected that try to enable DCC with erroneous +parameters. + +Change-Id: Ie9ced8c42f9c62afd83169300073f616f74f0724 +Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> +Reviewed-by: David Francis <David.Francis@amd.com> +Acked-by: Bhawanpreet Lakha <Bhawanpreet Lakha@amd.com> +Signed-off-by: Chaudhary Amit Kumar <Chaudharyamit.Kumar@amd.com> +--- + .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 409 +++++++++--------- + 1 file changed, 207 insertions(+), 202 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 8a1e7085c3b1..ba7bb3338abf 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +@@ -2473,59 +2473,48 @@ static const struct drm_encoder_funcs amdgpu_dm_encoder_funcs = { + .destroy = amdgpu_dm_encoder_destroy, + }; + +-static bool fill_rects_from_plane_state(const struct drm_plane_state *state, +- struct rect *src_rect, +- struct rect *dst_rect, +- struct rect *clip_rect, +- enum dc_rotation_angle *rotation) +-{ +- src_rect->x = state->src_x >> 16; +- src_rect->y = state->src_y >> 16; +- /* we ignore the mantissa for now and do not deal with floating pixels :( */ +- src_rect->width = state->src_w >> 16; +- +- if (src_rect->width == 0) +- return false; + +- src_rect->height = state->src_h >> 16; +- if (src_rect->height == 0) +- return false; ++static int fill_dc_scaling_info(const struct drm_plane_state *state, ++ struct dc_scaling_info *scaling_info) ++{ ++ memset(scaling_info, 0, sizeof(*scaling_info)); ++ ++ /* Source is fixed 16.16 but we ignore mantissa for now... */ ++ scaling_info->src_rect.x = state->src_x >> 16; ++ scaling_info->src_rect.y = state->src_y >> 16; ++ ++ scaling_info->src_rect.width = state->src_w >> 16; ++ if (scaling_info->src_rect.width == 0) ++ return -EINVAL; ++ ++ scaling_info->src_rect.height = state->src_h >> 16; ++ if (scaling_info->src_rect.height == 0) ++ return -EINVAL; + +- dst_rect->x = state->crtc_x; +- dst_rect->y = state->crtc_y; ++ scaling_info->dst_rect.x = state->crtc_x; ++ scaling_info->dst_rect.y = state->crtc_y; + + if (state->crtc_w == 0) +- return false; ++ return -EINVAL; + +- dst_rect->width = state->crtc_w; ++ scaling_info->dst_rect.width = state->crtc_w; + + if (state->crtc_h == 0) +- return false; ++ return -EINVAL; + +- dst_rect->height = state->crtc_h; ++ scaling_info->dst_rect.height = state->crtc_h; + +- *clip_rect = *dst_rect; ++ /* DRM doesn't specify clipping on destination output. */ ++ scaling_info->clip_rect = scaling_info->dst_rect; + +- switch (state->rotation & DRM_MODE_ROTATE_MASK) { +- case DRM_MODE_ROTATE_0: +- *rotation = ROTATION_ANGLE_0; +- break; +- case DRM_MODE_ROTATE_90: +- *rotation = ROTATION_ANGLE_90; +- break; +- case DRM_MODE_ROTATE_180: +- *rotation = ROTATION_ANGLE_180; +- break; +- case DRM_MODE_ROTATE_270: +- *rotation = ROTATION_ANGLE_270; +- break; +- default: +- *rotation = ROTATION_ANGLE_0; +- break; +- } ++ /* ++ * The "scaling_quality" can be ignored for now, quality = 0 has DC ++ * assume reasonable defaults based on the format. ++ */ + +- return true; ++ return 0; + } ++ + static int get_fb_info(const struct amdgpu_framebuffer *amdgpu_fb, + uint64_t *tiling_flags) + { +@@ -2554,12 +2543,16 @@ static inline uint64_t get_dcc_address(uint64_t address, uint64_t tiling_flags) + return offset ? (address + offset * 256) : 0; + } + +-static int fill_plane_dcc_attributes(struct amdgpu_device *adev, +- const struct amdgpu_framebuffer *afb, +- const struct dc_plane_state *plane_state, +- struct dc_plane_dcc_param *dcc, +- struct dc_plane_address *address, +- uint64_t info) ++static int ++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 union dc_tiling_info *tiling_info, ++ const uint64_t info, ++ struct dc_plane_dcc_param *dcc, ++ struct dc_plane_address *address) + { + struct dc *dc = adev->dm.dc; + struct dc_dcc_surface_param input; +@@ -2574,24 +2567,20 @@ static int fill_plane_dcc_attributes(struct amdgpu_device *adev, + if (!offset) + return 0; + +- if (plane_state->address.type != PLN_ADDR_TYPE_GRAPHICS) ++ if (format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN) + return 0; + + if (!dc->cap_funcs.get_dcc_compression_cap) + return -EINVAL; + +- input.format = plane_state->format; +- input.surface_size.width = +- plane_state->plane_size.grph.surface_size.width; +- input.surface_size.height = +- plane_state->plane_size.grph.surface_size.height; +- input.swizzle_mode = plane_state->tiling_info.gfx9.swizzle; ++ input.format = format; ++ input.surface_size.width = plane_size->grph.surface_size.width; ++ input.surface_size.height = plane_size->grph.surface_size.height; ++ input.swizzle_mode = tiling_info->gfx9.swizzle; + +- if (plane_state->rotation == ROTATION_ANGLE_0 || +- plane_state->rotation == ROTATION_ANGLE_180) ++ if (rotation == ROTATION_ANGLE_0 || rotation == ROTATION_ANGLE_180) + input.scan = SCAN_DIRECTION_HORIZONTAL; +- else if (plane_state->rotation == ROTATION_ANGLE_90 || +- plane_state->rotation == ROTATION_ANGLE_270) ++ else if (rotation == ROTATION_ANGLE_90 || rotation == ROTATION_ANGLE_270) + input.scan = SCAN_DIRECTION_VERTICAL; + + if (!dc->cap_funcs.get_dcc_compression_cap(dc, &input, &output)) +@@ -2618,12 +2607,13 @@ static int fill_plane_dcc_attributes(struct amdgpu_device *adev, + static int + fill_plane_buffer_attributes(struct amdgpu_device *adev, + const struct amdgpu_framebuffer *afb, +- const struct dc_plane_state *plane_state, ++ const enum surface_pixel_format format, ++ const enum dc_rotation_angle rotation, ++ const uint64_t tiling_flags, + union dc_tiling_info *tiling_info, + union plane_size *plane_size, + struct dc_plane_dcc_param *dcc, +- struct dc_plane_address *address, +- uint64_t tiling_flags) ++ struct dc_plane_address *address) + { + const struct drm_framebuffer *fb = &afb->base; + int ret; +@@ -2633,7 +2623,7 @@ fill_plane_buffer_attributes(struct amdgpu_device *adev, + memset(dcc, 0, sizeof(*dcc)); + memset(address, 0, sizeof(*address)); + +- if (plane_state->format < SURFACE_PIXEL_FORMAT_VIDEO_BEGIN) { ++ 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; +@@ -2723,8 +2713,9 @@ fill_plane_buffer_attributes(struct amdgpu_device *adev, + AMDGPU_TILING_GET(tiling_flags, SWIZZLE_MODE); + tiling_info->gfx9.shaderEnable = 1; + +- ret = fill_plane_dcc_attributes(adev, afb, plane_state, dcc, +- address, tiling_flags); ++ ret = fill_plane_dcc_attributes(adev, afb, format, rotation, ++ plane_size, tiling_info, ++ tiling_flags, dcc, address); + if (ret) + return ret; + } +@@ -2732,80 +2723,8 @@ fill_plane_buffer_attributes(struct amdgpu_device *adev, + return 0; + } + +-static int fill_plane_attributes_from_fb(struct amdgpu_device *adev, +- struct dc_plane_state *plane_state, +- const struct amdgpu_framebuffer *amdgpu_fb) +-{ +- uint64_t tiling_flags; +- const struct drm_framebuffer *fb = &amdgpu_fb->base; +- int ret = 0; +- struct drm_format_name_buf format_name; +- +- ret = get_fb_info( +- amdgpu_fb, +- &tiling_flags); +- +- if (ret) +- return ret; +- +- switch (fb->format->format) { +- case DRM_FORMAT_C8: +- plane_state->format = SURFACE_PIXEL_FORMAT_GRPH_PALETA_256_COLORS; +- break; +- case DRM_FORMAT_RGB565: +- plane_state->format = SURFACE_PIXEL_FORMAT_GRPH_RGB565; +- break; +- case DRM_FORMAT_XRGB8888: +- case DRM_FORMAT_ARGB8888: +- plane_state->format = SURFACE_PIXEL_FORMAT_GRPH_ARGB8888; +- break; +- case DRM_FORMAT_XRGB2101010: +- case DRM_FORMAT_ARGB2101010: +- plane_state->format = SURFACE_PIXEL_FORMAT_GRPH_ARGB2101010; +- break; +- case DRM_FORMAT_XBGR2101010: +- case DRM_FORMAT_ABGR2101010: +- plane_state->format = SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010; +- break; +- case DRM_FORMAT_XBGR8888: +- case DRM_FORMAT_ABGR8888: +- plane_state->format = SURFACE_PIXEL_FORMAT_GRPH_ABGR8888; +- break; +- case DRM_FORMAT_NV21: +- plane_state->format = SURFACE_PIXEL_FORMAT_VIDEO_420_YCbCr; +- break; +- case DRM_FORMAT_NV12: +- plane_state->format = SURFACE_PIXEL_FORMAT_VIDEO_420_YCrCb; +- break; +- default: +- DRM_ERROR("Unsupported screen format %s\n", +- drm_get_format_name(fb->format->format, &format_name)); +- return -EINVAL; +- } +- +- fill_plane_buffer_attributes(adev, amdgpu_fb, plane_state, +- &plane_state->tiling_info, +- &plane_state->plane_size, +- &plane_state->dcc, +- &plane_state->address, +- tiling_flags); +- +- plane_state->visible = true; +- plane_state->scaling_quality.h_taps_c = 0; +- plane_state->scaling_quality.v_taps_c = 0; +- +- /* is this needed? is plane_state zeroed at allocation? */ +- plane_state->scaling_quality.h_taps = 0; +- plane_state->scaling_quality.v_taps = 0; +- plane_state->stereo_format = PLANE_STEREO_FORMAT_NONE; +- +- return ret; +- +-} +- + static void +-fill_blending_from_plane_state(struct drm_plane_state *plane_state, +- const struct dc_plane_state *dc_plane_state, ++fill_blending_from_plane_state(const struct drm_plane_state *plane_state, + bool *per_pixel_alpha, bool *global_alpha, + int *global_alpha_value) + { +@@ -2841,7 +2760,7 @@ fill_blending_from_plane_state(struct drm_plane_state *plane_state, + + static int + fill_plane_color_attributes(const struct drm_plane_state *plane_state, +- const struct dc_plane_state *dc_plane_state, ++ const enum surface_pixel_format format, + enum dc_color_space *color_space) + { + bool full_range; +@@ -2849,7 +2768,7 @@ fill_plane_color_attributes(const struct drm_plane_state *plane_state, + *color_space = COLOR_SPACE_SRGB; + + /* DRM color properties only affect non-RGB formats. */ +- if (dc_plane_state->format < SURFACE_PIXEL_FORMAT_VIDEO_BEGIN) ++ if (format < SURFACE_PIXEL_FORMAT_VIDEO_BEGIN) + return 0; + + full_range = (plane_state->color_range == DRM_COLOR_YCBCR_FULL_RANGE); +@@ -2883,33 +2802,144 @@ fill_plane_color_attributes(const struct drm_plane_state *plane_state, + return 0; + } + +-static int fill_plane_attributes(struct amdgpu_device *adev, +- struct dc_plane_state *dc_plane_state, +- struct drm_plane_state *plane_state, +- struct drm_crtc_state *crtc_state) ++static int ++fill_dc_plane_info_and_addr(struct amdgpu_device *adev, ++ const struct drm_plane_state *plane_state, ++ const uint64_t tiling_flags, ++ struct dc_plane_info *plane_info, ++ struct dc_plane_address *address) ++{ ++ const struct drm_framebuffer *fb = plane_state->fb; ++ const struct amdgpu_framebuffer *afb = ++ to_amdgpu_framebuffer(plane_state->fb); ++ struct drm_format_name_buf format_name; ++ int ret; ++ ++ memset(plane_info, 0, sizeof(*plane_info)); ++ ++ switch (fb->format->format) { ++ case DRM_FORMAT_C8: ++ plane_info->format = ++ SURFACE_PIXEL_FORMAT_GRPH_PALETA_256_COLORS; ++ break; ++ case DRM_FORMAT_RGB565: ++ plane_info->format = SURFACE_PIXEL_FORMAT_GRPH_RGB565; ++ break; ++ case DRM_FORMAT_XRGB8888: ++ case DRM_FORMAT_ARGB8888: ++ plane_info->format = SURFACE_PIXEL_FORMAT_GRPH_ARGB8888; ++ break; ++ case DRM_FORMAT_XRGB2101010: ++ case DRM_FORMAT_ARGB2101010: ++ plane_info->format = SURFACE_PIXEL_FORMAT_GRPH_ARGB2101010; ++ break; ++ case DRM_FORMAT_XBGR2101010: ++ case DRM_FORMAT_ABGR2101010: ++ plane_info->format = SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010; ++ break; ++ case DRM_FORMAT_XBGR8888: ++ case DRM_FORMAT_ABGR8888: ++ plane_info->format = SURFACE_PIXEL_FORMAT_GRPH_ABGR8888; ++ break; ++ case DRM_FORMAT_NV21: ++ plane_info->format = SURFACE_PIXEL_FORMAT_VIDEO_420_YCbCr; ++ break; ++ case DRM_FORMAT_NV12: ++ plane_info->format = SURFACE_PIXEL_FORMAT_VIDEO_420_YCrCb; ++ break; ++ default: ++ DRM_ERROR( ++ "Unsupported screen format %s\n", ++ drm_get_format_name(fb->format->format, &format_name)); ++ return -EINVAL; ++ } ++ ++ switch (plane_state->rotation & DRM_MODE_ROTATE_MASK) { ++ case DRM_MODE_ROTATE_0: ++ plane_info->rotation = ROTATION_ANGLE_0; ++ break; ++ case DRM_MODE_ROTATE_90: ++ plane_info->rotation = ROTATION_ANGLE_90; ++ break; ++ case DRM_MODE_ROTATE_180: ++ plane_info->rotation = ROTATION_ANGLE_180; ++ break; ++ case DRM_MODE_ROTATE_270: ++ plane_info->rotation = ROTATION_ANGLE_270; ++ break; ++ default: ++ plane_info->rotation = ROTATION_ANGLE_0; ++ break; ++ } ++ ++ plane_info->visible = true; ++ plane_info->stereo_format = PLANE_STEREO_FORMAT_NONE; ++ ++ ret = fill_plane_color_attributes(plane_state, plane_info->format, ++ &plane_info->color_space); ++ if (ret) ++ return ret; ++ ++ ret = fill_plane_buffer_attributes(adev, afb, plane_info->format, ++ plane_info->rotation, tiling_flags, ++ &plane_info->tiling_info, ++ &plane_info->plane_size, ++ &plane_info->dcc, address); ++ if (ret) ++ return ret; ++ ++ fill_blending_from_plane_state( ++ plane_state, &plane_info->per_pixel_alpha, ++ &plane_info->global_alpha, &plane_info->global_alpha_value); ++ ++ return 0; ++} ++ ++static int fill_dc_plane_attributes(struct amdgpu_device *adev, ++ struct dc_plane_state *dc_plane_state, ++ struct drm_plane_state *plane_state, ++ struct drm_crtc_state *crtc_state) + { + const struct amdgpu_framebuffer *amdgpu_fb = + to_amdgpu_framebuffer(plane_state->fb); +- const struct drm_crtc *crtc = plane_state->crtc; +- int ret = 0; ++ struct dc_scaling_info scaling_info; ++ struct dc_plane_info plane_info; ++ uint64_t tiling_flags; ++ int ret; + +- if (!fill_rects_from_plane_state(plane_state, +- &dc_plane_state->src_rect, +- &dc_plane_state->dst_rect, +- &dc_plane_state->clip_rect, +- &dc_plane_state->rotation)) +- return -EINVAL; ++ ret = fill_dc_scaling_info(plane_state, &scaling_info); ++ if (ret) ++ return ret; + +- ret = fill_plane_attributes_from_fb( +- crtc->dev->dev_private, +- dc_plane_state, +- amdgpu_fb); ++ dc_plane_state->src_rect = scaling_info.src_rect; ++ dc_plane_state->dst_rect = scaling_info.dst_rect; ++ dc_plane_state->clip_rect = scaling_info.clip_rect; ++ dc_plane_state->scaling_quality = scaling_info.scaling_quality; + ++ ret = get_fb_info(amdgpu_fb, &tiling_flags); + if (ret) + return ret; + +- /* In case of gamma set, update gamma value */ +- if (crtc_state->gamma_lut) ++ ret = fill_dc_plane_info_and_addr(adev, plane_state, tiling_flags, ++ &plane_info, ++ &dc_plane_state->address); ++ if (ret) ++ return ret; ++ ++ dc_plane_state->format = plane_info.format; ++ dc_plane_state->color_space = plane_info.color_space; ++ dc_plane_state->format = plane_info.format; ++ dc_plane_state->plane_size = plane_info.plane_size; ++ dc_plane_state->rotation = plane_info.rotation; ++ dc_plane_state->horizontal_mirror = plane_info.horizontal_mirror; ++ dc_plane_state->stereo_format = plane_info.stereo_format; ++ dc_plane_state->tiling_info = plane_info.tiling_info; ++ dc_plane_state->visible = plane_info.visible; ++ dc_plane_state->per_pixel_alpha = plane_info.per_pixel_alpha; ++ dc_plane_state->global_alpha = plane_info.global_alpha; ++ dc_plane_state->global_alpha_value = plane_info.global_alpha_value; ++ dc_plane_state->dcc = plane_info.dcc; ++ + /* + * Always set input transfer function, since plane state is refreshed + * every time. +@@ -2920,11 +2950,6 @@ static int fill_plane_attributes(struct amdgpu_device *adev, + dc_plane_state->in_transfer_func = NULL; + } + +- fill_blending_from_plane_state(plane_state, dc_plane_state, +- &dc_plane_state->per_pixel_alpha, +- &dc_plane_state->global_alpha, +- &dc_plane_state->global_alpha_value); +- + return ret; + } + +@@ -4109,9 +4134,10 @@ static int dm_plane_helper_prepare_fb(struct drm_plane *plane, + struct dc_plane_state *plane_state = dm_plane_state_new->dc_state; + + fill_plane_buffer_attributes( +- adev, afb, plane_state, &plane_state->tiling_info, ++ adev, afb, plane_state->format, plane_state->rotation, ++ tiling_flags, &plane_state->tiling_info, + &plane_state->plane_size, &plane_state->dcc, +- &plane_state->address, tiling_flags); ++ &plane_state->address); + } + + return 0; +@@ -4144,17 +4170,17 @@ static int dm_plane_atomic_check(struct drm_plane *plane, + struct amdgpu_device *adev = plane->dev->dev_private; + struct dc *dc = adev->dm.dc; + struct dm_plane_state *dm_plane_state; +- struct rect src_rect, dst_rect, clip_rect; +- enum dc_rotation_angle rotation; ++ struct dc_scaling_info scaling_info; ++ int ret; + + dm_plane_state = to_dm_plane_state(state); + + if (!dm_plane_state->dc_state) + return 0; + +- if (!fill_rects_from_plane_state(state, &src_rect, &dst_rect, +- &clip_rect, &rotation)) +- return -EINVAL; ++ ret = fill_dc_scaling_info(state, &scaling_info); ++ if (ret) ++ return ret; + + if (dc_validate_plane(dc, dm_plane_state->dc_state) == DC_OK) + return 0; +@@ -5205,7 +5231,6 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, + struct drm_crtc *crtc = new_plane_state->crtc; + struct drm_crtc_state *new_crtc_state; + struct drm_framebuffer *fb = new_plane_state->fb; +- struct amdgpu_framebuffer *afb = to_amdgpu_framebuffer(fb); + bool plane_needs_flip; + struct dc_plane_state *dc_plane; + struct dm_plane_state *dm_new_plane_state = to_dm_plane_state(new_plane_state); +@@ -5229,32 +5254,11 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, + bundle->surface_updates[planes_count].in_transfer_func = dc_plane->in_transfer_func; + } + ++ fill_dc_scaling_info(new_plane_state, ++ &bundle->scaling_infos[planes_count]); + +- bundle->scaling_infos[planes_count].scaling_quality = dc_plane->scaling_quality; +- +- fill_rects_from_plane_state(new_plane_state, +- &bundle->scaling_infos[planes_count].src_rect, +- &bundle->scaling_infos[planes_count].dst_rect, +- &bundle->scaling_infos[planes_count].clip_rect, +- &bundle->plane_infos[planes_count].rotation); +- +- bundle->surface_updates[planes_count].scaling_info = &bundle->scaling_infos[planes_count]; +- +- fill_plane_color_attributes( +- new_plane_state, dc_plane, +- &bundle->plane_infos[planes_count].color_space); +- +- bundle->plane_infos[planes_count].format = dc_plane->format; +- bundle->plane_infos[planes_count].plane_size = dc_plane->plane_size; +- bundle->plane_infos[planes_count].horizontal_mirror = dc_plane->horizontal_mirror; +- bundle->plane_infos[planes_count].stereo_format = dc_plane->stereo_format; +- bundle->plane_infos[planes_count].tiling_info = dc_plane->tiling_info; +- bundle->plane_infos[planes_count].visible = dc_plane->visible; +- bundle->plane_infos[planes_count].global_alpha = dc_plane->global_alpha; +- bundle->plane_infos[planes_count].global_alpha_value = dc_plane->global_alpha_value; +- bundle->plane_infos[planes_count].per_pixel_alpha = dc_plane->per_pixel_alpha; +- bundle->plane_infos[planes_count].dcc = dc_plane->dcc; +- bundle->surface_updates[planes_count].plane_info = &bundle->plane_infos[planes_count]; ++ bundle->surface_updates[planes_count].scaling_info = ++ &bundle->scaling_infos[planes_count]; + + plane_needs_flip = old_plane_state->fb && new_plane_state->fb; + +@@ -5286,12 +5290,13 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, + + amdgpu_bo_unreserve(abo); + +- fill_plane_buffer_attributes(dm->adev, afb, dc_plane, +- &bundle->plane_infos[planes_count].tiling_info, +- &bundle->plane_infos[planes_count].plane_size, +- &bundle->plane_infos[planes_count].dcc, +- &bundle->flip_addrs[planes_count].address, +- tiling_flags); ++ fill_dc_plane_info_and_addr( ++ dm->adev, new_plane_state, tiling_flags, ++ &bundle->plane_infos[planes_count], ++ &bundle->flip_addrs[planes_count].address); ++ ++ bundle->surface_updates[planes_count].plane_info = ++ &bundle->plane_infos[planes_count]; + + bundle->flip_addrs[planes_count].flip_immediate = + (crtc->state->pageflip_flags & DRM_MODE_PAGE_FLIP_ASYNC) != 0; +@@ -6319,7 +6324,7 @@ static int dm_update_plane_state(struct dc *dc, + DRM_DEBUG_DRIVER("Enabling DRM plane: %d on DRM crtc %d\n", + plane->base.id, new_plane_crtc->base.id); + +- ret = fill_plane_attributes( ++ ret = fill_dc_plane_attributes( + new_plane_crtc->dev->dev_private, + dc_new_plane_state, + new_plane_state, +-- +2.17.1 + |