[PATCH] drm/amd/display: Only put primary planes into the mode_info->planes list

Wentland, Harry Harry.Wentland at amd.com
Mon Mar 18 20:45:51 UTC 2019


On 2019-03-14 12:53 p.m., Nicholas Kazlauskas wrote:
> We want DRM planes to be initialized in the following order:
> 
> - primary planes
> - overlay planes
> - cursor planes
> 
> to support existing userspace expectations for plane z-ordering. This
> means that we also need to register CRTCs after all planes have been
> initialized since overlay planes can be placed on any CRTC.
> 
> So the only reason why we have the mode_info->planes list is to
> remember the primary planes for use later when we need to register
> the CRTC.
> 
> Overlay planes have no purpose being in this list. DRM will cleanup
> any planes that we've registered for us, so the only planes that need to
> be explicitly cleaned up are the ones that have failed to register.
> 
> By dropping the explicit free on every plane in the mode_info->planes
> list this patch also fixes a double-free in the case where we fail to
> initialize only some of the planes.
> 
> Cc: Leo Li <sunpeng.li at amd.com>
> Cc: Harry Wentland <harry.wentland at amd.com>
> Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas at amd.com>

Reviewed-by: Harry Wentland <harry.wentland at amd.com>

Harry

> ---
>  .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 19 +++++++++----------
>  1 file changed, 9 insertions(+), 10 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 cde0da3ae964..f770de36121f 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -1818,8 +1818,6 @@ static int initialize_plane(struct amdgpu_display_manager *dm,
>  	int ret = 0;
>  
>  	plane = kzalloc(sizeof(struct drm_plane), GFP_KERNEL);
> -	mode_info->planes[plane_id] = plane;
> -
>  	if (!plane) {
>  		DRM_ERROR("KMS: Failed to allocate plane\n");
>  		return -ENOMEM;
> @@ -1836,13 +1834,17 @@ static int initialize_plane(struct amdgpu_display_manager *dm,
>  	if (plane_id >= dm->dc->caps.max_streams)
>  		possible_crtcs = 0xff;
>  
> -	ret = amdgpu_dm_plane_init(dm, mode_info->planes[plane_id], possible_crtcs);
> +	ret = amdgpu_dm_plane_init(dm, plane, possible_crtcs);
>  
>  	if (ret) {
>  		DRM_ERROR("KMS: Failed to initialize plane\n");
> +		kfree(plane);
>  		return ret;
>  	}
>  
> +	if (mode_info)
> +		mode_info->planes[plane_id] = plane;
> +
>  	return ret;
>  }
>  
> @@ -1885,7 +1887,7 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
>  	struct amdgpu_encoder *aencoder = NULL;
>  	struct amdgpu_mode_info *mode_info = &adev->mode_info;
>  	uint32_t link_cnt;
> -	int32_t overlay_planes, primary_planes, total_planes;
> +	int32_t overlay_planes, primary_planes;
>  	enum dc_connection_type new_connection_type = dc_connection_none;
>  
>  	link_cnt = dm->dc->caps.max_links;
> @@ -1914,9 +1916,7 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
>  
>  	/* There is one primary plane per CRTC */
>  	primary_planes = dm->dc->caps.max_streams;
> -
> -	total_planes = primary_planes + overlay_planes;
> -	ASSERT(total_planes <= AMDGPU_MAX_PLANES);
> +	ASSERT(primary_planes <= AMDGPU_MAX_PLANES);
>  
>  	/*
>  	 * Initialize primary planes, implicit planes for legacy IOCTLS.
> @@ -1937,7 +1937,7 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
>  	 * Order is reversed to match iteration order in atomic check.
>  	 */
>  	for (i = (overlay_planes - 1); i >= 0; i--) {
> -		if (initialize_plane(dm, mode_info, primary_planes + i,
> +		if (initialize_plane(dm, NULL, primary_planes + i,
>  				     DRM_PLANE_TYPE_OVERLAY)) {
>  			DRM_ERROR("KMS: Failed to initialize overlay plane\n");
>  			goto fail;
> @@ -2041,8 +2041,7 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
>  fail:
>  	kfree(aencoder);
>  	kfree(aconnector);
> -	for (i = 0; i < primary_planes; i++)
> -		kfree(mode_info->planes[i]);
> +
>  	return -EINVAL;
>  }
>  
> 


More information about the amd-gfx mailing list