Re: [PATCH 13/14] drm/kmb: Enable alpha blended second plane
Hi Am 08.09.21 um 21:31 schrieb Sam Ravnborg: Hi Thomas, On Wed, Sep 08, 2021 at 07:50:42PM +0200, Thomas Zimmermann wrote: Hi Am 03.08.21 um 07:10 schrieb Sam Ravnborg: Hi Anitha, On Mon, Aug 02, 2021 at 08:44:26PM +, Chrisanthus, Anitha wrote: Hi Sam, Thanks. Where should this go, drm-misc-fixes or drm-misc-next? Looks like a drm-misc-next candidate to me. I may improve something for existing users, but it does not look like it fixes an existing bug. I found this patch in drm-misc-fixes, although it doesn't look like a bugfix. It should have gone into drm-misc-next. See [1]. If it indeed belongs into drm-misc-fixes, it certainly should have contained a Fixes tag. The patch fixes some warnings that has become errors the last week. Anitha pinged me about it, but I failed to followup. So in the end it was applied to shut up the warning => errors. Thanks for reply. I cc'd Dave, as he intended to not merge the rsp PR this week. Maybe the patch is important enough. Best regards Thomas Sam -- Thomas Zimmermann Graphics Driver Developer SUSE Software Solutions Germany GmbH Maxfeldstr. 5, 90409 Nürnberg, Germany (HRB 36809, AG Nürnberg) Geschäftsführer: Felix Imendörffer OpenPGP_signature Description: OpenPGP digital signature
Re: [PATCH 13/14] drm/kmb: Enable alpha blended second plane
Hi Thomas, On Wed, Sep 08, 2021 at 07:50:42PM +0200, Thomas Zimmermann wrote: > Hi > > Am 03.08.21 um 07:10 schrieb Sam Ravnborg: > > Hi Anitha, > > > > On Mon, Aug 02, 2021 at 08:44:26PM +, Chrisanthus, Anitha wrote: > > > Hi Sam, > > > Thanks. Where should this go, drm-misc-fixes or drm-misc-next? > > > > Looks like a drm-misc-next candidate to me. > > I may improve something for existing users, but it does not look like it > > fixes an existing bug. > > I found this patch in drm-misc-fixes, although it doesn't look like a > bugfix. It should have gone into drm-misc-next. See [1]. If it indeed > belongs into drm-misc-fixes, it certainly should have contained a Fixes tag. The patch fixes some warnings that has become errors the last week. Anitha pinged me about it, but I failed to followup. So in the end it was applied to shut up the warning => errors. Sam
Re: [PATCH 13/14] drm/kmb: Enable alpha blended second plane
Hi Am 03.08.21 um 07:10 schrieb Sam Ravnborg: Hi Anitha, On Mon, Aug 02, 2021 at 08:44:26PM +, Chrisanthus, Anitha wrote: Hi Sam, Thanks. Where should this go, drm-misc-fixes or drm-misc-next? Looks like a drm-misc-next candidate to me. I may improve something for existing users, but it does not look like it fixes an existing bug. I found this patch in drm-misc-fixes, although it doesn't look like a bugfix. It should have gone into drm-misc-next. See [1]. If it indeed belongs into drm-misc-fixes, it certainly should have contained a Fixes tag. Best regards Thomas [1] https://drm.pages.freedesktop.org/maintainer-tools/committer-drm-misc.html#where-do-i-apply-my-patch Sam -- Thomas Zimmermann Graphics Driver Developer SUSE Software Solutions Germany GmbH Maxfeldstr. 5, 90409 Nürnberg, Germany (HRB 36809, AG Nürnberg) Geschäftsführer: Felix Imendörffer OpenPGP_signature Description: OpenPGP digital signature
Re: [PATCH 13/14] drm/kmb: Enable alpha blended second plane
Hi Anitha, On Mon, Aug 02, 2021 at 08:44:26PM +, Chrisanthus, Anitha wrote: > Hi Sam, > Thanks. Where should this go, drm-misc-fixes or drm-misc-next? Looks like a drm-misc-next candidate to me. I may improve something for existing users, but it does not look like it fixes an existing bug. Sam
RE: [PATCH 13/14] drm/kmb: Enable alpha blended second plane
Hi Sam, Thanks. Where should this go, drm-misc-fixes or drm-misc-next? Anitha > -Original Message- > From: Sam Ravnborg > Sent: Wednesday, July 28, 2021 12:29 AM > To: Chrisanthus, Anitha > Cc: dri-devel@lists.freedesktop.org; Dea, Edmund J > > Subject: Re: [PATCH 13/14] drm/kmb: Enable alpha blended second plane > > Hi Anitha, > On Tue, Jul 27, 2021 at 05:31:25PM -0700, Anitha Chrisanthus wrote: > > From: Edmund Dea > > > > Enable one additional plane that is alpha blended on top > > of the primary plane. > > > > Signed-off-by: Edmund Dea > Your s-o-b is missing. > > With this fixed: > Acked-by: Sam Ravnborg > > --- > > drivers/gpu/drm/kmb/kmb_drv.c | 8 ++-- > > drivers/gpu/drm/kmb/kmb_plane.c | 81 +- > --- > > drivers/gpu/drm/kmb/kmb_plane.h | 5 +- > > drivers/gpu/drm/kmb/kmb_regs.h | 3 ++ > > 4 files changed, 82 insertions(+), 15 deletions(-) > > > > diff --git a/drivers/gpu/drm/kmb/kmb_drv.c > b/drivers/gpu/drm/kmb/kmb_drv.c > > index 12f35c43d838..d0de1db03493 100644 > > --- a/drivers/gpu/drm/kmb/kmb_drv.c > > +++ b/drivers/gpu/drm/kmb/kmb_drv.c > > @@ -173,10 +173,10 @@ static int kmb_setup_mode_config(struct > drm_device *drm) > > ret = drmm_mode_config_init(drm); > > if (ret) > > return ret; > > - drm->mode_config.min_width = KMB_MIN_WIDTH; > > - drm->mode_config.min_height = KMB_MIN_HEIGHT; > > - drm->mode_config.max_width = KMB_MAX_WIDTH; > > - drm->mode_config.max_height = KMB_MAX_HEIGHT; > > + drm->mode_config.min_width = KMB_FB_MIN_WIDTH; > > + drm->mode_config.min_height = KMB_FB_MIN_HEIGHT; > > + drm->mode_config.max_width = KMB_FB_MAX_WIDTH; > > + drm->mode_config.max_height = KMB_FB_MAX_HEIGHT; > > drm->mode_config.funcs = _mode_config_funcs; > > > > ret = kmb_setup_crtc(drm); > > diff --git a/drivers/gpu/drm/kmb/kmb_plane.c > b/drivers/gpu/drm/kmb/kmb_plane.c > > index 4523af949ea1..cbe4e981d73e 100644 > > --- a/drivers/gpu/drm/kmb/kmb_plane.c > > +++ b/drivers/gpu/drm/kmb/kmb_plane.c > > @@ -118,9 +118,10 @@ static int kmb_plane_atomic_check(struct > drm_plane *plane, > > if (ret) > > return ret; > > > > - if (new_plane_state->crtc_w > KMB_MAX_WIDTH || new_plane_state- > >crtc_h > KMB_MAX_HEIGHT) > > - return -EINVAL; > > - if (new_plane_state->crtc_w < KMB_MIN_WIDTH || new_plane_state- > >crtc_h < KMB_MIN_HEIGHT) > > + if (new_plane_state->crtc_w > KMB_FB_MAX_WIDTH || > > + new_plane_state->crtc_h > KMB_FB_MAX_HEIGHT || > > + new_plane_state->crtc_w < KMB_FB_MIN_WIDTH || > > + new_plane_state->crtc_h < KMB_FB_MIN_HEIGHT) > > return -EINVAL; > > > > /* Due to HW limitations, changing plane height or width after > > @@ -311,6 +312,44 @@ static void config_csc(struct kmb_drm_private > *kmb, int plane_id) > > kmb_write_lcd(kmb, LCD_LAYERn_CSC_OFF3(plane_id), > csc_coef_lcd[11]); > > } > > > > +static void kmb_plane_set_alpha(struct kmb_drm_private *kmb, > > + const struct drm_plane_state *state, > > + unsigned char plane_id, > > + unsigned int *val) > > +{ > > + u16 plane_alpha = state->alpha; > > + u16 pixel_blend_mode = state->pixel_blend_mode; > > + int has_alpha = state->fb->format->has_alpha; > > + > > + if (plane_alpha != DRM_BLEND_ALPHA_OPAQUE) > > + *val |= LCD_LAYER_ALPHA_STATIC; > > + > > + if (has_alpha) { > > + switch (pixel_blend_mode) { > > + case DRM_MODE_BLEND_PIXEL_NONE: > > + break; > > + case DRM_MODE_BLEND_PREMULTI: > > + *val |= LCD_LAYER_ALPHA_EMBED | > LCD_LAYER_ALPHA_PREMULT; > > + break; > > + case DRM_MODE_BLEND_COVERAGE: > > + *val |= LCD_LAYER_ALPHA_EMBED; > > + break; > > + default: > > + DRM_DEBUG("Missing pixel blend mode case (%s == > %ld)\n", > > + __stringify(pixel_blend_mode), > > + (long)pixel_blend_mode); > > + break; > > + } > > + } > > + > > + if (plane_alpha == DRM_BLEND_ALPHA_OPAQUE && !has_alpha) { > > + *val &= LCD_LAYER_ALPHA_DISABLED
Re: [PATCH 13/14] drm/kmb: Enable alpha blended second plane
Hi Anitha, On Tue, Jul 27, 2021 at 05:31:25PM -0700, Anitha Chrisanthus wrote: > From: Edmund Dea > > Enable one additional plane that is alpha blended on top > of the primary plane. > > Signed-off-by: Edmund Dea Your s-o-b is missing. With this fixed: Acked-by: Sam Ravnborg > --- > drivers/gpu/drm/kmb/kmb_drv.c | 8 ++-- > drivers/gpu/drm/kmb/kmb_plane.c | 81 + > drivers/gpu/drm/kmb/kmb_plane.h | 5 +- > drivers/gpu/drm/kmb/kmb_regs.h | 3 ++ > 4 files changed, 82 insertions(+), 15 deletions(-) > > diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c > index 12f35c43d838..d0de1db03493 100644 > --- a/drivers/gpu/drm/kmb/kmb_drv.c > +++ b/drivers/gpu/drm/kmb/kmb_drv.c > @@ -173,10 +173,10 @@ static int kmb_setup_mode_config(struct drm_device *drm) > ret = drmm_mode_config_init(drm); > if (ret) > return ret; > - drm->mode_config.min_width = KMB_MIN_WIDTH; > - drm->mode_config.min_height = KMB_MIN_HEIGHT; > - drm->mode_config.max_width = KMB_MAX_WIDTH; > - drm->mode_config.max_height = KMB_MAX_HEIGHT; > + drm->mode_config.min_width = KMB_FB_MIN_WIDTH; > + drm->mode_config.min_height = KMB_FB_MIN_HEIGHT; > + drm->mode_config.max_width = KMB_FB_MAX_WIDTH; > + drm->mode_config.max_height = KMB_FB_MAX_HEIGHT; > drm->mode_config.funcs = _mode_config_funcs; > > ret = kmb_setup_crtc(drm); > diff --git a/drivers/gpu/drm/kmb/kmb_plane.c b/drivers/gpu/drm/kmb/kmb_plane.c > index 4523af949ea1..cbe4e981d73e 100644 > --- a/drivers/gpu/drm/kmb/kmb_plane.c > +++ b/drivers/gpu/drm/kmb/kmb_plane.c > @@ -118,9 +118,10 @@ static int kmb_plane_atomic_check(struct drm_plane > *plane, > if (ret) > return ret; > > - if (new_plane_state->crtc_w > KMB_MAX_WIDTH || new_plane_state->crtc_h > > KMB_MAX_HEIGHT) > - return -EINVAL; > - if (new_plane_state->crtc_w < KMB_MIN_WIDTH || new_plane_state->crtc_h > < KMB_MIN_HEIGHT) > + if (new_plane_state->crtc_w > KMB_FB_MAX_WIDTH || > + new_plane_state->crtc_h > KMB_FB_MAX_HEIGHT || > + new_plane_state->crtc_w < KMB_FB_MIN_WIDTH || > + new_plane_state->crtc_h < KMB_FB_MIN_HEIGHT) > return -EINVAL; > > /* Due to HW limitations, changing plane height or width after > @@ -311,6 +312,44 @@ static void config_csc(struct kmb_drm_private *kmb, int > plane_id) > kmb_write_lcd(kmb, LCD_LAYERn_CSC_OFF3(plane_id), csc_coef_lcd[11]); > } > > +static void kmb_plane_set_alpha(struct kmb_drm_private *kmb, > + const struct drm_plane_state *state, > + unsigned char plane_id, > + unsigned int *val) > +{ > + u16 plane_alpha = state->alpha; > + u16 pixel_blend_mode = state->pixel_blend_mode; > + int has_alpha = state->fb->format->has_alpha; > + > + if (plane_alpha != DRM_BLEND_ALPHA_OPAQUE) > + *val |= LCD_LAYER_ALPHA_STATIC; > + > + if (has_alpha) { > + switch (pixel_blend_mode) { > + case DRM_MODE_BLEND_PIXEL_NONE: > + break; > + case DRM_MODE_BLEND_PREMULTI: > + *val |= LCD_LAYER_ALPHA_EMBED | LCD_LAYER_ALPHA_PREMULT; > + break; > + case DRM_MODE_BLEND_COVERAGE: > + *val |= LCD_LAYER_ALPHA_EMBED; > + break; > + default: > + DRM_DEBUG("Missing pixel blend mode case (%s == %ld)\n", > + __stringify(pixel_blend_mode), > + (long)pixel_blend_mode); > + break; > + } > + } > + > + if (plane_alpha == DRM_BLEND_ALPHA_OPAQUE && !has_alpha) { > + *val &= LCD_LAYER_ALPHA_DISABLED; > + return; > + } > + > + kmb_write_lcd(kmb, LCD_LAYERn_ALPHA(plane_id), plane_alpha); > +} > + > static void kmb_plane_atomic_update(struct drm_plane *plane, > struct drm_atomic_state *state) > { > @@ -341,11 +380,12 @@ static void kmb_plane_atomic_update(struct drm_plane > *plane, > fb = new_plane_state->fb; > if (!fb) > return; > + > num_planes = fb->format->num_planes; > kmb_plane = to_kmb_plane(plane); > - plane_id = kmb_plane->id; > > kmb = to_kmb(plane->dev); > + plane_id = kmb_plane->id; > > spin_lock_irq(>irq_lock); > if (kmb->kmb_under_flow || kmb->kmb_flush_done) { > @@ -467,20 +507,32 @@ static void kmb_plane_atomic_update(struct drm_plane > *plane, > config_csc(kmb, plane_id); > } > > + kmb_plane_set_alpha(kmb, plane->state, plane_id, ); > + > kmb_write_lcd(kmb, LCD_LAYERn_CFG(plane_id), val); > > + /* Configure LCD_CONTROL */ > + ctrl = kmb_read_lcd(kmb, LCD_CONTROL); > + > + /* Set layer blending config */ > + ctrl
[PATCH 13/14] drm/kmb: Enable alpha blended second plane
From: Edmund Dea Enable one additional plane that is alpha blended on top of the primary plane. Signed-off-by: Edmund Dea --- drivers/gpu/drm/kmb/kmb_drv.c | 8 ++-- drivers/gpu/drm/kmb/kmb_plane.c | 81 + drivers/gpu/drm/kmb/kmb_plane.h | 5 +- drivers/gpu/drm/kmb/kmb_regs.h | 3 ++ 4 files changed, 82 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c index 12f35c43d838..d0de1db03493 100644 --- a/drivers/gpu/drm/kmb/kmb_drv.c +++ b/drivers/gpu/drm/kmb/kmb_drv.c @@ -173,10 +173,10 @@ static int kmb_setup_mode_config(struct drm_device *drm) ret = drmm_mode_config_init(drm); if (ret) return ret; - drm->mode_config.min_width = KMB_MIN_WIDTH; - drm->mode_config.min_height = KMB_MIN_HEIGHT; - drm->mode_config.max_width = KMB_MAX_WIDTH; - drm->mode_config.max_height = KMB_MAX_HEIGHT; + drm->mode_config.min_width = KMB_FB_MIN_WIDTH; + drm->mode_config.min_height = KMB_FB_MIN_HEIGHT; + drm->mode_config.max_width = KMB_FB_MAX_WIDTH; + drm->mode_config.max_height = KMB_FB_MAX_HEIGHT; drm->mode_config.funcs = _mode_config_funcs; ret = kmb_setup_crtc(drm); diff --git a/drivers/gpu/drm/kmb/kmb_plane.c b/drivers/gpu/drm/kmb/kmb_plane.c index 4523af949ea1..cbe4e981d73e 100644 --- a/drivers/gpu/drm/kmb/kmb_plane.c +++ b/drivers/gpu/drm/kmb/kmb_plane.c @@ -118,9 +118,10 @@ static int kmb_plane_atomic_check(struct drm_plane *plane, if (ret) return ret; - if (new_plane_state->crtc_w > KMB_MAX_WIDTH || new_plane_state->crtc_h > KMB_MAX_HEIGHT) - return -EINVAL; - if (new_plane_state->crtc_w < KMB_MIN_WIDTH || new_plane_state->crtc_h < KMB_MIN_HEIGHT) + if (new_plane_state->crtc_w > KMB_FB_MAX_WIDTH || + new_plane_state->crtc_h > KMB_FB_MAX_HEIGHT || + new_plane_state->crtc_w < KMB_FB_MIN_WIDTH || + new_plane_state->crtc_h < KMB_FB_MIN_HEIGHT) return -EINVAL; /* Due to HW limitations, changing plane height or width after @@ -311,6 +312,44 @@ static void config_csc(struct kmb_drm_private *kmb, int plane_id) kmb_write_lcd(kmb, LCD_LAYERn_CSC_OFF3(plane_id), csc_coef_lcd[11]); } +static void kmb_plane_set_alpha(struct kmb_drm_private *kmb, + const struct drm_plane_state *state, + unsigned char plane_id, + unsigned int *val) +{ + u16 plane_alpha = state->alpha; + u16 pixel_blend_mode = state->pixel_blend_mode; + int has_alpha = state->fb->format->has_alpha; + + if (plane_alpha != DRM_BLEND_ALPHA_OPAQUE) + *val |= LCD_LAYER_ALPHA_STATIC; + + if (has_alpha) { + switch (pixel_blend_mode) { + case DRM_MODE_BLEND_PIXEL_NONE: + break; + case DRM_MODE_BLEND_PREMULTI: + *val |= LCD_LAYER_ALPHA_EMBED | LCD_LAYER_ALPHA_PREMULT; + break; + case DRM_MODE_BLEND_COVERAGE: + *val |= LCD_LAYER_ALPHA_EMBED; + break; + default: + DRM_DEBUG("Missing pixel blend mode case (%s == %ld)\n", + __stringify(pixel_blend_mode), + (long)pixel_blend_mode); + break; + } + } + + if (plane_alpha == DRM_BLEND_ALPHA_OPAQUE && !has_alpha) { + *val &= LCD_LAYER_ALPHA_DISABLED; + return; + } + + kmb_write_lcd(kmb, LCD_LAYERn_ALPHA(plane_id), plane_alpha); +} + static void kmb_plane_atomic_update(struct drm_plane *plane, struct drm_atomic_state *state) { @@ -341,11 +380,12 @@ static void kmb_plane_atomic_update(struct drm_plane *plane, fb = new_plane_state->fb; if (!fb) return; + num_planes = fb->format->num_planes; kmb_plane = to_kmb_plane(plane); - plane_id = kmb_plane->id; kmb = to_kmb(plane->dev); + plane_id = kmb_plane->id; spin_lock_irq(>irq_lock); if (kmb->kmb_under_flow || kmb->kmb_flush_done) { @@ -467,20 +507,32 @@ static void kmb_plane_atomic_update(struct drm_plane *plane, config_csc(kmb, plane_id); } + kmb_plane_set_alpha(kmb, plane->state, plane_id, ); + kmb_write_lcd(kmb, LCD_LAYERn_CFG(plane_id), val); + /* Configure LCD_CONTROL */ + ctrl = kmb_read_lcd(kmb, LCD_CONTROL); + + /* Set layer blending config */ + ctrl &= ~LCD_CTRL_ALPHA_ALL; + ctrl |= LCD_CTRL_ALPHA_BOTTOM_VL1 | + LCD_CTRL_ALPHA_BLEND_VL2; + + ctrl &= ~LCD_CTRL_ALPHA_BLEND_BKGND_DISABLE; + switch (plane_id) { case LAYER_0: - ctrl =