* [PATCH v1 0/2] drm/stm: ltdc: add non-alpha color formats @ 2018-02-01 10:42 Philippe Cornu 2018-02-01 10:42 ` [PATCH v1 1/2] " Philippe Cornu 2018-02-01 10:42 ` [PATCH v1 2/2] drm/stm: ltdc: remove non-alpha color formats on layer 2 for older hw Philippe Cornu 0 siblings, 2 replies; 9+ messages in thread From: Philippe Cornu @ 2018-02-01 10:42 UTC (permalink / raw) To: Yannick Fertre, Philippe Cornu, Benjamin Gaignard, Vincent Abriou, David Airlie, dri-devel, linux-kernel Cc: Fabien Dessenne, Mickael Reulier, Alexandre Torgue This patchset adds non-alpha color format support taking into account older hw versions. Philippe Cornu (2): drm/stm: ltdc: add non-alpha color formats drm/stm: ltdc: remove non-alpha color formats on layer 2 for older hw drivers/gpu/drm/stm/ltdc.c | 53 ++++++++++++++++++++++++++++++++++++++++++++-- drivers/gpu/drm/stm/ltdc.h | 1 + 2 files changed, 52 insertions(+), 2 deletions(-) -- 2.15.1 ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v1 1/2] drm/stm: ltdc: add non-alpha color formats 2018-02-01 10:42 [PATCH v1 0/2] drm/stm: ltdc: add non-alpha color formats Philippe Cornu @ 2018-02-01 10:42 ` Philippe Cornu 2018-02-05 19:23 ` kbuild test robot 2018-02-06 9:12 ` Yannick FERTRE 2018-02-01 10:42 ` [PATCH v1 2/2] drm/stm: ltdc: remove non-alpha color formats on layer 2 for older hw Philippe Cornu 1 sibling, 2 replies; 9+ messages in thread From: Philippe Cornu @ 2018-02-01 10:42 UTC (permalink / raw) To: Yannick Fertre, Philippe Cornu, Benjamin Gaignard, Vincent Abriou, David Airlie, dri-devel, linux-kernel Cc: Fabien Dessenne, Mickael Reulier, Alexandre Torgue ltdc supports natively some color formats with alpha (like ARGB8888, ARGB1555, ARGB4444...). Related non-alpha formats are supported too (ARGB8888->XRGB8888, ARGB4444->XRGB4444...) by adjusting ltdc blending factors. Note: Wayland/Weston requests by default the non-alpha XRGB8888 color format. Signed-off-by: Philippe Cornu <philippe.cornu@st.com> --- drivers/gpu/drm/stm/ltdc.c | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/stm/ltdc.c b/drivers/gpu/drm/stm/ltdc.c index 90b3de516c91..f6f26fc0ae9e 100644 --- a/drivers/gpu/drm/stm/ltdc.c +++ b/drivers/gpu/drm/stm/ltdc.c @@ -328,6 +328,26 @@ static inline u32 to_drm_pixelformat(enum ltdc_pix_fmt pf) } } +static inline u32 get_pixelformat_without_alpha(u32 drm) +{ + switch (drm) { + case DRM_FORMAT_ARGB4444: + return DRM_FORMAT_XRGB4444; + case DRM_FORMAT_RGBA4444: + return DRM_FORMAT_RGBX4444; + case DRM_FORMAT_ARGB1555: + return DRM_FORMAT_XRGB1555; + case DRM_FORMAT_RGBA5551: + return DRM_FORMAT_RGBX5551; + case DRM_FORMAT_ARGB8888: + return DRM_FORMAT_XRGB8888; + case DRM_FORMAT_RGBA8888: + return DRM_FORMAT_RGBX8888; + default: + return 0; + } +} + static irqreturn_t ltdc_irq_thread(int irq, void *arg) { struct drm_device *ddev = arg; @@ -680,6 +700,9 @@ static void ltdc_plane_atomic_update(struct drm_plane *plane, /* Specifies the blending factors */ val = BF1_PAXCA | BF2_1PAXCA; + if (!fb->format->has_alpha) + val = BF1_CA | BF2_1CA; + reg_update_bits(ldev->regs, LTDC_L1BFCR + lofs, LXBFCR_BF2 | LXBFCR_BF1, val); @@ -747,8 +770,8 @@ static struct drm_plane *ltdc_plane_create(struct drm_device *ddev, struct device *dev = ddev->dev; struct drm_plane *plane; unsigned int i, nb_fmt = 0; - u32 formats[NB_PF]; - u32 drm_fmt; + u32 formats[NB_PF * 2]; + u32 drm_fmt, drm_fmt_no_alpha; int ret; /* Get supported pixel formats */ @@ -757,6 +780,12 @@ static struct drm_plane *ltdc_plane_create(struct drm_device *ddev, if (!drm_fmt) continue; formats[nb_fmt++] = drm_fmt; + + /* Add the no-alpha related format if any & supported */ + drm_fmt_no_alpha = get_pixelformat_without_alpha(drm_fmt); + if (!drm_fmt_no_alpha) + continue; + formats[nb_fmt++] = drm_fmt_no_alpha; } plane = devm_kzalloc(dev, sizeof(*plane), GFP_KERNEL); -- 2.15.1 ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v1 1/2] drm/stm: ltdc: add non-alpha color formats 2018-02-01 10:42 ` [PATCH v1 1/2] " Philippe Cornu @ 2018-02-05 19:23 ` kbuild test robot 2018-02-06 9:12 ` Yannick FERTRE 1 sibling, 0 replies; 9+ messages in thread From: kbuild test robot @ 2018-02-05 19:23 UTC (permalink / raw) To: Philippe Cornu Cc: kbuild-all, Yannick Fertre, Philippe Cornu, Benjamin Gaignard, Vincent Abriou, David Airlie, dri-devel, linux-kernel, Mickael Reulier, Alexandre Torgue, Fabien Dessenne [-- Attachment #1: Type: text/plain, Size: 5403 bytes --] Hi Philippe, I love your patch! Yet something to improve: [auto build test ERROR on drm/drm-next] [also build test ERROR on v4.15 next-20180205] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Philippe-Cornu/drm-stm-ltdc-add-non-alpha-color-formats/20180201-211736 base: git://people.freedesktop.org/~airlied/linux.git drm-next config: arm-allmodconfig (attached as .config) compiler: arm-linux-gnueabi-gcc (Debian 7.2.0-11) 7.2.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=arm All errors (new ones prefixed by >>): drivers/gpu//drm/stm/ltdc.c: In function 'ltdc_plane_atomic_update': >> drivers/gpu//drm/stm/ltdc.c:661:17: error: 'const struct drm_format_info' has no member named 'has_alpha' if (!fb->format->has_alpha) ^~ vim +661 drivers/gpu//drm/stm/ltdc.c 587 588 static void ltdc_plane_atomic_update(struct drm_plane *plane, 589 struct drm_plane_state *oldstate) 590 { 591 struct ltdc_device *ldev = plane_to_ltdc(plane); 592 struct drm_plane_state *state = plane->state; 593 struct drm_framebuffer *fb = state->fb; 594 u32 lofs = plane->index * LAY_OFS; 595 u32 x0 = state->crtc_x; 596 u32 x1 = state->crtc_x + state->crtc_w - 1; 597 u32 y0 = state->crtc_y; 598 u32 y1 = state->crtc_y + state->crtc_h - 1; 599 u32 src_x, src_y, src_w, src_h; 600 u32 val, pitch_in_bytes, line_length, paddr, ahbp, avbp, bpcr; 601 enum ltdc_pix_fmt pf; 602 603 if (!state->crtc || !fb) { 604 DRM_DEBUG_DRIVER("fb or crtc NULL"); 605 return; 606 } 607 608 /* convert src_ from 16:16 format */ 609 src_x = state->src_x >> 16; 610 src_y = state->src_y >> 16; 611 src_w = state->src_w >> 16; 612 src_h = state->src_h >> 16; 613 614 DRM_DEBUG_DRIVER("plane:%d fb:%d (%dx%d)@(%d,%d) -> (%dx%d)@(%d,%d)\n", 615 plane->base.id, fb->base.id, 616 src_w, src_h, src_x, src_y, 617 state->crtc_w, state->crtc_h, 618 state->crtc_x, state->crtc_y); 619 620 bpcr = reg_read(ldev->regs, LTDC_BPCR); 621 ahbp = (bpcr & BPCR_AHBP) >> 16; 622 avbp = bpcr & BPCR_AVBP; 623 624 /* Configures the horizontal start and stop position */ 625 val = ((x1 + 1 + ahbp) << 16) + (x0 + 1 + ahbp); 626 reg_update_bits(ldev->regs, LTDC_L1WHPCR + lofs, 627 LXWHPCR_WHSTPOS | LXWHPCR_WHSPPOS, val); 628 629 /* Configures the vertical start and stop position */ 630 val = ((y1 + 1 + avbp) << 16) + (y0 + 1 + avbp); 631 reg_update_bits(ldev->regs, LTDC_L1WVPCR + lofs, 632 LXWVPCR_WVSTPOS | LXWVPCR_WVSPPOS, val); 633 634 /* Specifies the pixel format */ 635 pf = to_ltdc_pixelformat(fb->format->format); 636 for (val = 0; val < NB_PF; val++) 637 if (ldev->caps.pix_fmt_hw[val] == pf) 638 break; 639 640 if (val == NB_PF) { 641 DRM_ERROR("Pixel format %.4s not supported\n", 642 (char *)&fb->format->format); 643 val = 0; /* set by default ARGB 32 bits */ 644 } 645 reg_update_bits(ldev->regs, LTDC_L1PFCR + lofs, LXPFCR_PF, val); 646 647 /* Configures the color frame buffer pitch in bytes & line length */ 648 pitch_in_bytes = fb->pitches[0]; 649 line_length = drm_format_plane_cpp(fb->format->format, 0) * 650 (x1 - x0 + 1) + (ldev->caps.bus_width >> 3) - 1; 651 val = ((pitch_in_bytes << 16) | line_length); 652 reg_update_bits(ldev->regs, LTDC_L1CFBLR + lofs, 653 LXCFBLR_CFBLL | LXCFBLR_CFBP, val); 654 655 /* Specifies the constant alpha value */ 656 val = CONSTA_MAX; 657 reg_update_bits(ldev->regs, LTDC_L1CACR + lofs, LXCACR_CONSTA, val); 658 659 /* Specifies the blending factors */ 660 val = BF1_PAXCA | BF2_1PAXCA; > 661 if (!fb->format->has_alpha) 662 val = BF1_CA | BF2_1CA; 663 664 reg_update_bits(ldev->regs, LTDC_L1BFCR + lofs, 665 LXBFCR_BF2 | LXBFCR_BF1, val); 666 667 /* Configures the frame buffer line number */ 668 val = y1 - y0 + 1; 669 reg_update_bits(ldev->regs, LTDC_L1CFBLNR + lofs, LXCFBLNR_CFBLN, val); 670 671 /* Sets the FB address */ 672 paddr = (u32)drm_fb_cma_get_gem_addr(fb, state, 0); 673 674 DRM_DEBUG_DRIVER("fb: phys 0x%08x", paddr); 675 reg_write(ldev->regs, LTDC_L1CFBAR + lofs, paddr); 676 677 /* Enable layer and CLUT if needed */ 678 val = fb->format->format == DRM_FORMAT_C8 ? LXCR_CLUTEN : 0; 679 val |= LXCR_LEN; 680 reg_update_bits(ldev->regs, LTDC_L1CR + lofs, 681 LXCR_LEN | LXCR_CLUTEN, val); 682 683 mutex_lock(&ldev->err_lock); 684 if (ldev->error_status & ISR_FUIF) { 685 DRM_DEBUG_DRIVER("Fifo underrun\n"); 686 ldev->error_status &= ~ISR_FUIF; 687 } 688 if (ldev->error_status & ISR_TERRIF) { 689 DRM_DEBUG_DRIVER("Transfer error\n"); 690 ldev->error_status &= ~ISR_TERRIF; 691 } 692 mutex_unlock(&ldev->err_lock); 693 } 694 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation [-- Attachment #2: .config.gz --] [-- Type: application/gzip, Size: 64744 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v1 1/2] drm/stm: ltdc: add non-alpha color formats 2018-02-01 10:42 ` [PATCH v1 1/2] " Philippe Cornu 2018-02-05 19:23 ` kbuild test robot @ 2018-02-06 9:12 ` Yannick FERTRE 2018-02-08 9:40 ` Benjamin Gaignard 1 sibling, 1 reply; 9+ messages in thread From: Yannick FERTRE @ 2018-02-06 9:12 UTC (permalink / raw) To: Philippe CORNU, Benjamin Gaignard, Vincent ABRIOU, David Airlie, dri-devel, linux-kernel Cc: Fabien DESSENNE, Mickael REULIER, Alexandre TORGUE Reviewed-by: Yannick Fertré <yannick.fertre@st.com> On 02/01/2018 11:42 AM, Philippe Cornu wrote: > ltdc supports natively some color formats with alpha (like > ARGB8888, ARGB1555, ARGB4444...). Related non-alpha formats are > supported too (ARGB8888->XRGB8888, ARGB4444->XRGB4444...) by > adjusting ltdc blending factors. > > Note: Wayland/Weston requests by default the non-alpha XRGB8888 > color format. > > Signed-off-by: Philippe Cornu <philippe.cornu@st.com> > --- > drivers/gpu/drm/stm/ltdc.c | 33 +++++++++++++++++++++++++++++++-- > 1 file changed, 31 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/stm/ltdc.c b/drivers/gpu/drm/stm/ltdc.c > index 90b3de516c91..f6f26fc0ae9e 100644 > --- a/drivers/gpu/drm/stm/ltdc.c > +++ b/drivers/gpu/drm/stm/ltdc.c > @@ -328,6 +328,26 @@ static inline u32 to_drm_pixelformat(enum ltdc_pix_fmt pf) > } > } > > +static inline u32 get_pixelformat_without_alpha(u32 drm) > +{ > + switch (drm) { > + case DRM_FORMAT_ARGB4444: > + return DRM_FORMAT_XRGB4444; > + case DRM_FORMAT_RGBA4444: > + return DRM_FORMAT_RGBX4444; > + case DRM_FORMAT_ARGB1555: > + return DRM_FORMAT_XRGB1555; > + case DRM_FORMAT_RGBA5551: > + return DRM_FORMAT_RGBX5551; > + case DRM_FORMAT_ARGB8888: > + return DRM_FORMAT_XRGB8888; > + case DRM_FORMAT_RGBA8888: > + return DRM_FORMAT_RGBX8888; > + default: > + return 0; > + } > +} > + > static irqreturn_t ltdc_irq_thread(int irq, void *arg) > { > struct drm_device *ddev = arg; > @@ -680,6 +700,9 @@ static void ltdc_plane_atomic_update(struct drm_plane *plane, > > /* Specifies the blending factors */ > val = BF1_PAXCA | BF2_1PAXCA; > + if (!fb->format->has_alpha) > + val = BF1_CA | BF2_1CA; > + > reg_update_bits(ldev->regs, LTDC_L1BFCR + lofs, > LXBFCR_BF2 | LXBFCR_BF1, val); > > @@ -747,8 +770,8 @@ static struct drm_plane *ltdc_plane_create(struct drm_device *ddev, > struct device *dev = ddev->dev; > struct drm_plane *plane; > unsigned int i, nb_fmt = 0; > - u32 formats[NB_PF]; > - u32 drm_fmt; > + u32 formats[NB_PF * 2]; > + u32 drm_fmt, drm_fmt_no_alpha; > int ret; > > /* Get supported pixel formats */ > @@ -757,6 +780,12 @@ static struct drm_plane *ltdc_plane_create(struct drm_device *ddev, > if (!drm_fmt) > continue; > formats[nb_fmt++] = drm_fmt; > + > + /* Add the no-alpha related format if any & supported */ > + drm_fmt_no_alpha = get_pixelformat_without_alpha(drm_fmt); > + if (!drm_fmt_no_alpha) > + continue; > + formats[nb_fmt++] = drm_fmt_no_alpha; > } > > plane = devm_kzalloc(dev, sizeof(*plane), GFP_KERNEL); ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v1 1/2] drm/stm: ltdc: add non-alpha color formats 2018-02-06 9:12 ` Yannick FERTRE @ 2018-02-08 9:40 ` Benjamin Gaignard 2018-02-08 15:02 ` Philippe CORNU 0 siblings, 1 reply; 9+ messages in thread From: Benjamin Gaignard @ 2018-02-08 9:40 UTC (permalink / raw) To: Yannick FERTRE Cc: Philippe CORNU, Vincent ABRIOU, David Airlie, dri-devel, linux-kernel, Fabien DESSENNE, Mickael REULIER, Alexandre TORGUE 2018-02-06 10:12 GMT+01:00 Yannick FERTRE <yannick.fertre@st.com>: > Reviewed-by: Yannick Fertré <yannick.fertre@st.com> > > > On 02/01/2018 11:42 AM, Philippe Cornu wrote: >> ltdc supports natively some color formats with alpha (like >> ARGB8888, ARGB1555, ARGB4444...). Related non-alpha formats are >> supported too (ARGB8888->XRGB8888, ARGB4444->XRGB4444...) by >> adjusting ltdc blending factors. >> >> Note: Wayland/Weston requests by default the non-alpha XRGB8888 >> color format. >> >> Signed-off-by: Philippe Cornu <philippe.cornu@st.com> Applied on drm-misc-next Benjamin >> --- >> drivers/gpu/drm/stm/ltdc.c | 33 +++++++++++++++++++++++++++++++-- >> 1 file changed, 31 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/gpu/drm/stm/ltdc.c b/drivers/gpu/drm/stm/ltdc.c >> index 90b3de516c91..f6f26fc0ae9e 100644 >> --- a/drivers/gpu/drm/stm/ltdc.c >> +++ b/drivers/gpu/drm/stm/ltdc.c >> @@ -328,6 +328,26 @@ static inline u32 to_drm_pixelformat(enum ltdc_pix_fmt pf) >> } >> } >> >> +static inline u32 get_pixelformat_without_alpha(u32 drm) >> +{ >> + switch (drm) { >> + case DRM_FORMAT_ARGB4444: >> + return DRM_FORMAT_XRGB4444; >> + case DRM_FORMAT_RGBA4444: >> + return DRM_FORMAT_RGBX4444; >> + case DRM_FORMAT_ARGB1555: >> + return DRM_FORMAT_XRGB1555; >> + case DRM_FORMAT_RGBA5551: >> + return DRM_FORMAT_RGBX5551; >> + case DRM_FORMAT_ARGB8888: >> + return DRM_FORMAT_XRGB8888; >> + case DRM_FORMAT_RGBA8888: >> + return DRM_FORMAT_RGBX8888; >> + default: >> + return 0; >> + } >> +} >> + >> static irqreturn_t ltdc_irq_thread(int irq, void *arg) >> { >> struct drm_device *ddev = arg; >> @@ -680,6 +700,9 @@ static void ltdc_plane_atomic_update(struct drm_plane *plane, >> >> /* Specifies the blending factors */ >> val = BF1_PAXCA | BF2_1PAXCA; >> + if (!fb->format->has_alpha) >> + val = BF1_CA | BF2_1CA; >> + >> reg_update_bits(ldev->regs, LTDC_L1BFCR + lofs, >> LXBFCR_BF2 | LXBFCR_BF1, val); >> >> @@ -747,8 +770,8 @@ static struct drm_plane *ltdc_plane_create(struct drm_device *ddev, >> struct device *dev = ddev->dev; >> struct drm_plane *plane; >> unsigned int i, nb_fmt = 0; >> - u32 formats[NB_PF]; >> - u32 drm_fmt; >> + u32 formats[NB_PF * 2]; >> + u32 drm_fmt, drm_fmt_no_alpha; >> int ret; >> >> /* Get supported pixel formats */ >> @@ -757,6 +780,12 @@ static struct drm_plane *ltdc_plane_create(struct drm_device *ddev, >> if (!drm_fmt) >> continue; >> formats[nb_fmt++] = drm_fmt; >> + >> + /* Add the no-alpha related format if any & supported */ >> + drm_fmt_no_alpha = get_pixelformat_without_alpha(drm_fmt); >> + if (!drm_fmt_no_alpha) >> + continue; >> + formats[nb_fmt++] = drm_fmt_no_alpha; >> } >> >> plane = devm_kzalloc(dev, sizeof(*plane), GFP_KERNEL); ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v1 1/2] drm/stm: ltdc: add non-alpha color formats 2018-02-08 9:40 ` Benjamin Gaignard @ 2018-02-08 15:02 ` Philippe CORNU 0 siblings, 0 replies; 9+ messages in thread From: Philippe CORNU @ 2018-02-08 15:02 UTC (permalink / raw) To: Benjamin Gaignard, Yannick FERTRE Cc: Alexandre TORGUE, David Airlie, Fabien DESSENNE, linux-kernel, dri-devel, Mickael REULIER, Vincent ABRIOU Hi Benjamin, and many thanks for having applied the 2 patches. Philippe :-) On 02/08/2018 10:40 AM, Benjamin Gaignard wrote: > 2018-02-06 10:12 GMT+01:00 Yannick FERTRE <yannick.fertre@st.com>: >> Reviewed-by: Yannick Fertré <yannick.fertre@st.com> >> >> >> On 02/01/2018 11:42 AM, Philippe Cornu wrote: >>> ltdc supports natively some color formats with alpha (like >>> ARGB8888, ARGB1555, ARGB4444...). Related non-alpha formats are >>> supported too (ARGB8888->XRGB8888, ARGB4444->XRGB4444...) by >>> adjusting ltdc blending factors. >>> >>> Note: Wayland/Weston requests by default the non-alpha XRGB8888 >>> color format. >>> >>> Signed-off-by: Philippe Cornu <philippe.cornu@st.com> > > Applied on drm-misc-next > > Benjamin >>> --- >>> drivers/gpu/drm/stm/ltdc.c | 33 +++++++++++++++++++++++++++++++-- >>> 1 file changed, 31 insertions(+), 2 deletions(-) >>> >>> diff --git a/drivers/gpu/drm/stm/ltdc.c b/drivers/gpu/drm/stm/ltdc.c >>> index 90b3de516c91..f6f26fc0ae9e 100644 >>> --- a/drivers/gpu/drm/stm/ltdc.c >>> +++ b/drivers/gpu/drm/stm/ltdc.c >>> @@ -328,6 +328,26 @@ static inline u32 to_drm_pixelformat(enum ltdc_pix_fmt pf) >>> } >>> } >>> >>> +static inline u32 get_pixelformat_without_alpha(u32 drm) >>> +{ >>> + switch (drm) { >>> + case DRM_FORMAT_ARGB4444: >>> + return DRM_FORMAT_XRGB4444; >>> + case DRM_FORMAT_RGBA4444: >>> + return DRM_FORMAT_RGBX4444; >>> + case DRM_FORMAT_ARGB1555: >>> + return DRM_FORMAT_XRGB1555; >>> + case DRM_FORMAT_RGBA5551: >>> + return DRM_FORMAT_RGBX5551; >>> + case DRM_FORMAT_ARGB8888: >>> + return DRM_FORMAT_XRGB8888; >>> + case DRM_FORMAT_RGBA8888: >>> + return DRM_FORMAT_RGBX8888; >>> + default: >>> + return 0; >>> + } >>> +} >>> + >>> static irqreturn_t ltdc_irq_thread(int irq, void *arg) >>> { >>> struct drm_device *ddev = arg; >>> @@ -680,6 +700,9 @@ static void ltdc_plane_atomic_update(struct drm_plane *plane, >>> >>> /* Specifies the blending factors */ >>> val = BF1_PAXCA | BF2_1PAXCA; >>> + if (!fb->format->has_alpha) >>> + val = BF1_CA | BF2_1CA; >>> + >>> reg_update_bits(ldev->regs, LTDC_L1BFCR + lofs, >>> LXBFCR_BF2 | LXBFCR_BF1, val); >>> >>> @@ -747,8 +770,8 @@ static struct drm_plane *ltdc_plane_create(struct drm_device *ddev, >>> struct device *dev = ddev->dev; >>> struct drm_plane *plane; >>> unsigned int i, nb_fmt = 0; >>> - u32 formats[NB_PF]; >>> - u32 drm_fmt; >>> + u32 formats[NB_PF * 2]; >>> + u32 drm_fmt, drm_fmt_no_alpha; >>> int ret; >>> >>> /* Get supported pixel formats */ >>> @@ -757,6 +780,12 @@ static struct drm_plane *ltdc_plane_create(struct drm_device *ddev, >>> if (!drm_fmt) >>> continue; >>> formats[nb_fmt++] = drm_fmt; >>> + >>> + /* Add the no-alpha related format if any & supported */ >>> + drm_fmt_no_alpha = get_pixelformat_without_alpha(drm_fmt); >>> + if (!drm_fmt_no_alpha) >>> + continue; >>> + formats[nb_fmt++] = drm_fmt_no_alpha; >>> } >>> >>> plane = devm_kzalloc(dev, sizeof(*plane), GFP_KERNEL); > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel > ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v1 2/2] drm/stm: ltdc: remove non-alpha color formats on layer 2 for older hw 2018-02-01 10:42 [PATCH v1 0/2] drm/stm: ltdc: add non-alpha color formats Philippe Cornu 2018-02-01 10:42 ` [PATCH v1 1/2] " Philippe Cornu @ 2018-02-01 10:42 ` Philippe Cornu 2018-02-06 9:13 ` Yannick FERTRE 1 sibling, 1 reply; 9+ messages in thread From: Philippe Cornu @ 2018-02-01 10:42 UTC (permalink / raw) To: Yannick Fertre, Philippe Cornu, Benjamin Gaignard, Vincent Abriou, David Airlie, dri-devel, linux-kernel Cc: Fabien Dessenne, Mickael Reulier, Alexandre Torgue Hw older versions support non-alpha color formats derived from native alpha color formats only on the primary layer. For instance, RG16 native format without alpha works fine on 2nd layer but XR24 (derived color format from AR24) does not work on 2nd layer. Signed-off-by: Philippe Cornu <philippe.cornu@st.com> --- drivers/gpu/drm/stm/ltdc.c | 20 ++++++++++++++++++++ drivers/gpu/drm/stm/ltdc.h | 1 + 2 files changed, 21 insertions(+) diff --git a/drivers/gpu/drm/stm/ltdc.c b/drivers/gpu/drm/stm/ltdc.c index f6f26fc0ae9e..1a3277e483d5 100644 --- a/drivers/gpu/drm/stm/ltdc.c +++ b/drivers/gpu/drm/stm/ltdc.c @@ -703,6 +703,11 @@ static void ltdc_plane_atomic_update(struct drm_plane *plane, if (!fb->format->has_alpha) val = BF1_CA | BF2_1CA; + /* Manage hw-specific capabilities */ + if (ldev->caps.non_alpha_only_l1 && + plane->type != DRM_PLANE_TYPE_PRIMARY) + val = BF1_PAXCA | BF2_1PAXCA; + reg_update_bits(ldev->regs, LTDC_L1BFCR + lofs, LXBFCR_BF2 | LXBFCR_BF1, val); @@ -785,6 +790,12 @@ static struct drm_plane *ltdc_plane_create(struct drm_device *ddev, drm_fmt_no_alpha = get_pixelformat_without_alpha(drm_fmt); if (!drm_fmt_no_alpha) continue; + + /* Manage hw-specific capabilities */ + if (ldev->caps.non_alpha_only_l1 && + type != DRM_PLANE_TYPE_PRIMARY) + continue; + formats[nb_fmt++] = drm_fmt_no_alpha; } @@ -913,10 +924,19 @@ static int ltdc_get_caps(struct drm_device *ddev) case HWVER_10300: ldev->caps.reg_ofs = REG_OFS_NONE; ldev->caps.pix_fmt_hw = ltdc_pix_fmt_a0; + /* + * Hw older versions support non-alpha color formats derived + * from native alpha color formats only on the primary layer. + * For instance, RG16 native format without alpha works fine + * on 2nd layer but XR24 (derived color format from AR24) + * does not work on 2nd layer. + */ + ldev->caps.non_alpha_only_l1 = true; break; case HWVER_20101: ldev->caps.reg_ofs = REG_OFS_4; ldev->caps.pix_fmt_hw = ltdc_pix_fmt_a1; + ldev->caps.non_alpha_only_l1 = false; break; default: return -ENODEV; diff --git a/drivers/gpu/drm/stm/ltdc.h b/drivers/gpu/drm/stm/ltdc.h index edd1c0a446d1..edb268129c54 100644 --- a/drivers/gpu/drm/stm/ltdc.h +++ b/drivers/gpu/drm/stm/ltdc.h @@ -17,6 +17,7 @@ struct ltdc_caps { u32 reg_ofs; /* register offset for applicable regs */ u32 bus_width; /* bus width (32 or 64 bits) */ const u32 *pix_fmt_hw; /* supported pixel formats */ + bool non_alpha_only_l1; /* non-native no-alpha formats on layer 1 */ }; struct ltdc_device { -- 2.15.1 ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v1 2/2] drm/stm: ltdc: remove non-alpha color formats on layer 2 for older hw 2018-02-01 10:42 ` [PATCH v1 2/2] drm/stm: ltdc: remove non-alpha color formats on layer 2 for older hw Philippe Cornu @ 2018-02-06 9:13 ` Yannick FERTRE 2018-02-08 9:40 ` Benjamin Gaignard 0 siblings, 1 reply; 9+ messages in thread From: Yannick FERTRE @ 2018-02-06 9:13 UTC (permalink / raw) To: Philippe CORNU, Benjamin Gaignard, Vincent ABRIOU, David Airlie, dri-devel, linux-kernel Cc: Fabien DESSENNE, Mickael REULIER, Alexandre TORGUE Reviewed-by: Yannick Fertré <yannick.fertre@st.com> On 02/01/2018 11:42 AM, Philippe Cornu wrote: > Hw older versions support non-alpha color formats derived > from native alpha color formats only on the primary layer. > For instance, RG16 native format without alpha works fine > on 2nd layer but XR24 (derived color format from AR24) > does not work on 2nd layer. > > Signed-off-by: Philippe Cornu <philippe.cornu@st.com> > --- > drivers/gpu/drm/stm/ltdc.c | 20 ++++++++++++++++++++ > drivers/gpu/drm/stm/ltdc.h | 1 + > 2 files changed, 21 insertions(+) > > diff --git a/drivers/gpu/drm/stm/ltdc.c b/drivers/gpu/drm/stm/ltdc.c > index f6f26fc0ae9e..1a3277e483d5 100644 > --- a/drivers/gpu/drm/stm/ltdc.c > +++ b/drivers/gpu/drm/stm/ltdc.c > @@ -703,6 +703,11 @@ static void ltdc_plane_atomic_update(struct drm_plane *plane, > if (!fb->format->has_alpha) > val = BF1_CA | BF2_1CA; > > + /* Manage hw-specific capabilities */ > + if (ldev->caps.non_alpha_only_l1 && > + plane->type != DRM_PLANE_TYPE_PRIMARY) > + val = BF1_PAXCA | BF2_1PAXCA; > + > reg_update_bits(ldev->regs, LTDC_L1BFCR + lofs, > LXBFCR_BF2 | LXBFCR_BF1, val); > > @@ -785,6 +790,12 @@ static struct drm_plane *ltdc_plane_create(struct drm_device *ddev, > drm_fmt_no_alpha = get_pixelformat_without_alpha(drm_fmt); > if (!drm_fmt_no_alpha) > continue; > + > + /* Manage hw-specific capabilities */ > + if (ldev->caps.non_alpha_only_l1 && > + type != DRM_PLANE_TYPE_PRIMARY) > + continue; > + > formats[nb_fmt++] = drm_fmt_no_alpha; > } > > @@ -913,10 +924,19 @@ static int ltdc_get_caps(struct drm_device *ddev) > case HWVER_10300: > ldev->caps.reg_ofs = REG_OFS_NONE; > ldev->caps.pix_fmt_hw = ltdc_pix_fmt_a0; > + /* > + * Hw older versions support non-alpha color formats derived > + * from native alpha color formats only on the primary layer. > + * For instance, RG16 native format without alpha works fine > + * on 2nd layer but XR24 (derived color format from AR24) > + * does not work on 2nd layer. > + */ > + ldev->caps.non_alpha_only_l1 = true; > break; > case HWVER_20101: > ldev->caps.reg_ofs = REG_OFS_4; > ldev->caps.pix_fmt_hw = ltdc_pix_fmt_a1; > + ldev->caps.non_alpha_only_l1 = false; > break; > default: > return -ENODEV; > diff --git a/drivers/gpu/drm/stm/ltdc.h b/drivers/gpu/drm/stm/ltdc.h > index edd1c0a446d1..edb268129c54 100644 > --- a/drivers/gpu/drm/stm/ltdc.h > +++ b/drivers/gpu/drm/stm/ltdc.h > @@ -17,6 +17,7 @@ struct ltdc_caps { > u32 reg_ofs; /* register offset for applicable regs */ > u32 bus_width; /* bus width (32 or 64 bits) */ > const u32 *pix_fmt_hw; /* supported pixel formats */ > + bool non_alpha_only_l1; /* non-native no-alpha formats on layer 1 */ > }; > > struct ltdc_device { ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v1 2/2] drm/stm: ltdc: remove non-alpha color formats on layer 2 for older hw 2018-02-06 9:13 ` Yannick FERTRE @ 2018-02-08 9:40 ` Benjamin Gaignard 0 siblings, 0 replies; 9+ messages in thread From: Benjamin Gaignard @ 2018-02-08 9:40 UTC (permalink / raw) To: Yannick FERTRE Cc: Philippe CORNU, Vincent ABRIOU, David Airlie, dri-devel, linux-kernel, Fabien DESSENNE, Mickael REULIER, Alexandre TORGUE 2018-02-06 10:13 GMT+01:00 Yannick FERTRE <yannick.fertre@st.com>: > Reviewed-by: Yannick Fertré <yannick.fertre@st.com> > > > On 02/01/2018 11:42 AM, Philippe Cornu wrote: >> Hw older versions support non-alpha color formats derived >> from native alpha color formats only on the primary layer. >> For instance, RG16 native format without alpha works fine >> on 2nd layer but XR24 (derived color format from AR24) >> does not work on 2nd layer. >> >> Signed-off-by: Philippe Cornu <philippe.cornu@st.com> Applied on drm-misc-next Benjamin >> --- >> drivers/gpu/drm/stm/ltdc.c | 20 ++++++++++++++++++++ >> drivers/gpu/drm/stm/ltdc.h | 1 + >> 2 files changed, 21 insertions(+) >> >> diff --git a/drivers/gpu/drm/stm/ltdc.c b/drivers/gpu/drm/stm/ltdc.c >> index f6f26fc0ae9e..1a3277e483d5 100644 >> --- a/drivers/gpu/drm/stm/ltdc.c >> +++ b/drivers/gpu/drm/stm/ltdc.c >> @@ -703,6 +703,11 @@ static void ltdc_plane_atomic_update(struct drm_plane *plane, >> if (!fb->format->has_alpha) >> val = BF1_CA | BF2_1CA; >> >> + /* Manage hw-specific capabilities */ >> + if (ldev->caps.non_alpha_only_l1 && >> + plane->type != DRM_PLANE_TYPE_PRIMARY) >> + val = BF1_PAXCA | BF2_1PAXCA; >> + >> reg_update_bits(ldev->regs, LTDC_L1BFCR + lofs, >> LXBFCR_BF2 | LXBFCR_BF1, val); >> >> @@ -785,6 +790,12 @@ static struct drm_plane *ltdc_plane_create(struct drm_device *ddev, >> drm_fmt_no_alpha = get_pixelformat_without_alpha(drm_fmt); >> if (!drm_fmt_no_alpha) >> continue; >> + >> + /* Manage hw-specific capabilities */ >> + if (ldev->caps.non_alpha_only_l1 && >> + type != DRM_PLANE_TYPE_PRIMARY) >> + continue; >> + >> formats[nb_fmt++] = drm_fmt_no_alpha; >> } >> >> @@ -913,10 +924,19 @@ static int ltdc_get_caps(struct drm_device *ddev) >> case HWVER_10300: >> ldev->caps.reg_ofs = REG_OFS_NONE; >> ldev->caps.pix_fmt_hw = ltdc_pix_fmt_a0; >> + /* >> + * Hw older versions support non-alpha color formats derived >> + * from native alpha color formats only on the primary layer. >> + * For instance, RG16 native format without alpha works fine >> + * on 2nd layer but XR24 (derived color format from AR24) >> + * does not work on 2nd layer. >> + */ >> + ldev->caps.non_alpha_only_l1 = true; >> break; >> case HWVER_20101: >> ldev->caps.reg_ofs = REG_OFS_4; >> ldev->caps.pix_fmt_hw = ltdc_pix_fmt_a1; >> + ldev->caps.non_alpha_only_l1 = false; >> break; >> default: >> return -ENODEV; >> diff --git a/drivers/gpu/drm/stm/ltdc.h b/drivers/gpu/drm/stm/ltdc.h >> index edd1c0a446d1..edb268129c54 100644 >> --- a/drivers/gpu/drm/stm/ltdc.h >> +++ b/drivers/gpu/drm/stm/ltdc.h >> @@ -17,6 +17,7 @@ struct ltdc_caps { >> u32 reg_ofs; /* register offset for applicable regs */ >> u32 bus_width; /* bus width (32 or 64 bits) */ >> const u32 *pix_fmt_hw; /* supported pixel formats */ >> + bool non_alpha_only_l1; /* non-native no-alpha formats on layer 1 */ >> }; >> >> struct ltdc_device { ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2018-02-08 15:02 UTC | newest] Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2018-02-01 10:42 [PATCH v1 0/2] drm/stm: ltdc: add non-alpha color formats Philippe Cornu 2018-02-01 10:42 ` [PATCH v1 1/2] " Philippe Cornu 2018-02-05 19:23 ` kbuild test robot 2018-02-06 9:12 ` Yannick FERTRE 2018-02-08 9:40 ` Benjamin Gaignard 2018-02-08 15:02 ` Philippe CORNU 2018-02-01 10:42 ` [PATCH v1 2/2] drm/stm: ltdc: remove non-alpha color formats on layer 2 for older hw Philippe Cornu 2018-02-06 9:13 ` Yannick FERTRE 2018-02-08 9:40 ` Benjamin Gaignard
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®