Re: [PATCH] drm: rcar-du: Revert "drm: rcar-du: Use __drm_atomic_helper_plane_reset instead of copying the logic"

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Laurent,

I've looked through a bit further to try to understand this issue and I
think I have identified a possible/probable cause.

Before commit 161ad653d6c9, we *always* set the plane->state->alpha as
DRM_BLEND_ALPHA_OPAQUE. (0xffff)

After this commit, the __drm_atomic_helper_plane_reset() call will only
set state->alpha to 0xffff if the alpha_property is set:

        if (plane->alpha_property)
                state->alpha = plane->alpha_property->values[1];

Then the state->alpha value is always referenced in
rcar_du_vsp_plane_setup() and passed to the VSP for that layer.


We can see in rcar_du_planes_init(), that all OVERLAY planes are
configured to have this propery with a call to
drm_plane_create_alpha_property(&plane->plane); however - the PRIMARY
plane is skipped over before setting this.


I believe I recall seeing that the kms-test-planeposition.py
successfully showed other planes which were not the back one (I'm now
going from hazy memory of this afternoon - but I am fairly sure I saw this)


This implies that the primary planes are being incorrectly configured -
but the overlay planes are still functioning as expected.

So I believe we could move the call to create the alpha property:
	drm_plane_create_alpha_property(&plane->plane);

to occur before the if (type == DRM_PLANE_TYPE_PRIMARY) continue; statement.

It may or may not make sense to have alpha blending support on the
PRIMARY plane. At the risk of sounding silly - can we have anything else
behind the PRIMARY plane ? (I doubt this, I don't think we have any
extra layers hiding anywhere)

Otherwise, I think we would need to intercept the configuration of the
alpha blending and make sure that all PRIMARY planes are configured to
be fully opaque in our layers. I think this is happening in
rcar_du_vsp_plane_setup().

But rather than put in a conditional in there, I think I'd rather just
initialise the plane->state->alpha = DRM_BLEND_ALPHA_OPAQUE in our
rcar_du_vsp_plane_reset() call and be done with it.

Anyway - just some musings and thoughts at this stage, we can
investigate in more detail next week.

--
Regards

Kieran


On 14/09/18 21:09, Kieran Bingham wrote:
> Commit: 161ad653d6c9 ("drm: rcar-du: Use __drm_atomic_helper_plane_reset
> instead of copying the logic") causes a regression in the R-Car DU
> display driver, and prevents any output from being displayed.
> 
> The display appears to function correctly but only a black screen is
> ever visible.
> 
> Revert the commit.
> 
> Signed-off-by: Kieran Bingham <kieran.bingham+renesas@xxxxxxxxxxxxxxxx>
> 
> ---
> 
> Looking through the code, the reason for this issue isn't particularly
> obvious - and will need some further exploration, which I can't look at
> until Tuesday. So I'm posting this revert patch to
> 
>  A) Report the issue
>  B) Provide a temporary fix
> 
> I suspect either the initial alpha value is not set correctly or setting
> 
>          state->pixel_blend_mode = DRM_MODE_BLEND_PREMULTI;
> 
> causes some side effect perhaps. There's not much else that could be
> different between the helper, and the original code.
> 
>  drivers/gpu/drm/rcar-du/rcar_du_plane.c | 6 ++++--
>  drivers/gpu/drm/rcar-du/rcar_du_vsp.c   | 5 ++++-
>  2 files changed, 8 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.c b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
> index 9e07758a755c..5c2462afe408 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_plane.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
> @@ -686,12 +686,14 @@ static void rcar_du_plane_reset(struct drm_plane *plane)
>  	if (state == NULL)
>  		return;
>  
> -	__drm_atomic_helper_plane_reset(plane, &state->state);
> -
>  	state->hwindex = -1;
>  	state->source = RCAR_DU_PLANE_MEMORY;
>  	state->colorkey = RCAR_DU_COLORKEY_NONE;
>  	state->state.zpos = plane->type == DRM_PLANE_TYPE_PRIMARY ? 0 : 1;
> +
> +	plane->state = &state->state;
> +	plane->state->alpha = DRM_BLEND_ALPHA_OPAQUE;
> +	plane->state->plane = plane;
>  }
>  
>  static int rcar_du_plane_atomic_set_property(struct drm_plane *plane,
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_vsp.c b/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
> index 4576119e7777..3170b126cfba 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
> @@ -341,8 +341,11 @@ static void rcar_du_vsp_plane_reset(struct drm_plane *plane)
>  	if (state == NULL)
>  		return;
>  
> -	__drm_atomic_helper_plane_reset(plane, &state->state);
> +	state->state.alpha = DRM_BLEND_ALPHA_OPAQUE;
>  	state->state.zpos = plane->type == DRM_PLANE_TYPE_PRIMARY ? 0 : 1;
> +
> +	plane->state = &state->state;
> +	plane->state->plane = plane;
>  }
>  
>  static const struct drm_plane_funcs rcar_du_vsp_plane_funcs = {
> 




[Index of Archives]     [Linux Samsung SOC]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux