LKML Archive on lore.kernel.org help / color / mirror / Atom feed
* [PATCH] drm/kms/mode: added a new helper for calculating videomode from crtc's display mode [not found] <CGME20180503055902epcas5p2eea7b9f58dc630e60fb28c8fc2ffad7b@epcas5p2.samsung.com> @ 2018-05-03 5:58 ` Satendra Singh Thakur 2018-05-03 8:02 ` Jani Nikula 2018-05-03 10:36 ` Liviu Dudau 0 siblings, 2 replies; 8+ messages in thread From: Satendra Singh Thakur @ 2018-05-03 5:58 UTC (permalink / raw) To: Liviu Dudau, Brian Starkey, Mali DP Maintainers, David Airlie, Boris Brezillon, Nicolas Ferre, Alexandre Belloni, Gustavo Padovan, Maarten Lankhorst, Sean Paul, Inki Dae, Joonyoung Shim, Seung-Woo Kim, Kyungmin Park, Kukjin Kim, Krzysztof Kozlowski, dri-devel, linux-kernel, linux-arm-kernel, linux-samsung-soc Cc: Satendra Singh Thakur, Madhur Verma, Hemanshu Srivastava 1. -Added a new helper drm_display_mode_crtc_to_videomode -This helper calculates mode parameters like horizontal front_porch, back_porch, sync length vertical front_porch, back_porch, sync length using crtc_* fields of struct drm_display_mode -It uses following fields of crtc mode horizontal sync start/end, active and total length vertical sync start/end, active and total length 2. -Most of the driver use user-supplied mode for calculating videomode -However, few drivers use HW (crtc) mode for calculating videomode -This helper will be useful for such drivers 3. -Currently following drivers will be using this new helper -arm hdlcd -atmel hlcdc -exynos 5433 decon -exynos7 decon -exynos fimd 4. -This patch removes related duplicate code from above mentioned drivers Signed-off-by: Satendra Singh Thakur <satendra.t@samsung.com> Cc: Madhur Verma <madhur.verma@samsung.com> Cc: Hemanshu Srivastava <hemanshu.s@samsung.com> --- drivers/gpu/drm/arm/hdlcd_crtc.c | 8 +------- drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c | 7 +------ drivers/gpu/drm/drm_modes.c | 20 ++++++++++++++++++++ drivers/gpu/drm/exynos/exynos5433_drm_decon.c | 22 ++++++++++------------ drivers/gpu/drm/exynos/exynos7_drm_decon.c | 23 ++++++++++------------- drivers/gpu/drm/exynos/exynos_drm_fimd.c | 22 +++++++++------------- include/drm/drm_modes.h | 2 ++ 7 files changed, 53 insertions(+), 51 deletions(-) diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c index cf5cbd6..d20e471 100644 --- a/drivers/gpu/drm/arm/hdlcd_crtc.c +++ b/drivers/gpu/drm/arm/hdlcd_crtc.c @@ -130,13 +130,7 @@ static void hdlcd_crtc_mode_set_nofb(struct drm_crtc *crtc) struct videomode vm; unsigned int polarities, err; - vm.vfront_porch = m->crtc_vsync_start - m->crtc_vdisplay; - vm.vback_porch = m->crtc_vtotal - m->crtc_vsync_end; - vm.vsync_len = m->crtc_vsync_end - m->crtc_vsync_start; - vm.hfront_porch = m->crtc_hsync_start - m->crtc_hdisplay; - vm.hback_porch = m->crtc_htotal - m->crtc_hsync_end; - vm.hsync_len = m->crtc_hsync_end - m->crtc_hsync_start; - + drm_display_mode_crtc_to_videomode(m, &vm); polarities = HDLCD_POLARITY_DATAEN | HDLCD_POLARITY_DATA; if (m->flags & DRM_MODE_FLAG_PHSYNC) diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c index d732810..bafcef6 100644 --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c @@ -81,12 +81,7 @@ static void atmel_hlcdc_crtc_mode_set_nofb(struct drm_crtc *c) unsigned int cfg; int div; - vm.vfront_porch = adj->crtc_vsync_start - adj->crtc_vdisplay; - vm.vback_porch = adj->crtc_vtotal - adj->crtc_vsync_end; - vm.vsync_len = adj->crtc_vsync_end - adj->crtc_vsync_start; - vm.hfront_porch = adj->crtc_hsync_start - adj->crtc_hdisplay; - vm.hback_porch = adj->crtc_htotal - adj->crtc_hsync_end; - vm.hsync_len = adj->crtc_hsync_end - adj->crtc_hsync_start; + drm_display_mode_crtc_to_videomode(adj, &vm); regmap_write(regmap, ATMEL_HLCDC_CFG(1), (vm.hsync_len - 1) | ((vm.vsync_len - 1) << 16)); diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c index e82b61e..a406749 100644 --- a/drivers/gpu/drm/drm_modes.c +++ b/drivers/gpu/drm/drm_modes.c @@ -654,6 +654,26 @@ void drm_display_mode_to_videomode(const struct drm_display_mode *dmode, vm->flags |= DISPLAY_FLAGS_DOUBLECLK; } EXPORT_SYMBOL_GPL(drm_display_mode_to_videomode); +/** + * drm_display_mode_crtc_to_videomode - fill in @vm using crtc fields of@dmode, + * @dmode: drm_display_mode structure to use as source + * @vm: videomode structure to use as destination + * + * Fills out @vm using the crtc display mode specified in @dmode. + */ +void drm_display_mode_crtc_to_videomode(const struct drm_display_mode *dmode, + struct videomode *vm) +{ + vm->hfront_porch = dmode->crtc_hsync_start - dmode->crtc_hdisplay; + vm->hsync_len = dmode->crtc_hsync_end - dmode->crtc_hsync_start; + vm->hback_porch = dmode->crtc_htotal - dmode->crtc_hsync_end; + + vm->vfront_porch = dmode->crtc_vsync_start - dmode->crtc_vdisplay; + vm->vsync_len = dmode->crtc_vsync_end - dmode->crtc_vsync_start; + vm->vback_porch = dmode->crtc_vtotal - dmode->crtc_vsync_end; + +} +EXPORT_SYMBOL_GPL(drm_display_mode_crtc_to_videomode); /** * drm_bus_flags_from_videomode - extract information about pixelclk and diff --git a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c index 1c330f2..1ba73a8 100644 --- a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c +++ b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c @@ -20,6 +20,7 @@ #include <linux/of_gpio.h> #include <linux/pm_runtime.h> #include <linux/regmap.h> +#include <video/videomode.h> #include "exynos_drm_drv.h" #include "exynos_drm_crtc.h" @@ -225,26 +226,23 @@ static void decon_commit(struct exynos_drm_crtc *crtc) writel(val, ctx->addr + DECON_VIDTCON2); if (!crtc->i80_mode) { - int vbp = m->crtc_vtotal - m->crtc_vsync_end; - int vfp = m->crtc_vsync_start - m->crtc_vdisplay; + struct videomode vm; + drm_display_mode_crtc_to_videomode(m, &vm); if (interlaced) - vbp = vbp / 2 - 1; - val = VIDTCON00_VBPD_F(vbp - 1) | VIDTCON00_VFPD_F(vfp - 1); + vm.vback_porch = (vm.vback_porch >> 1) - 1; + val = VIDTCON00_VBPD_F(vm.vback_porch - 1) | + VIDTCON00_VFPD_F(vm.vfront_porch - 1); writel(val, ctx->addr + DECON_VIDTCON00); - val = VIDTCON01_VSPW_F( - m->crtc_vsync_end - m->crtc_vsync_start - 1); + val = VIDTCON01_VSPW_F(vm.vsync_len - 1); writel(val, ctx->addr + DECON_VIDTCON01); - val = VIDTCON10_HBPD_F( - m->crtc_htotal - m->crtc_hsync_end - 1) | - VIDTCON10_HFPD_F( - m->crtc_hsync_start - m->crtc_hdisplay - 1); + val = VIDTCON10_HBPD_F(vm.hback_porch - 1) | + VIDTCON10_HFPD_F(vm.hfront_porch - 1); writel(val, ctx->addr + DECON_VIDTCON10); - val = VIDTCON11_HSPW_F( - m->crtc_hsync_end - m->crtc_hsync_start - 1); + val = VIDTCON11_HSPW_F(vm.hsync_len - 1); writel(val, ctx->addr + DECON_VIDTCON11); } diff --git a/drivers/gpu/drm/exynos/exynos7_drm_decon.c b/drivers/gpu/drm/exynos/exynos7_drm_decon.c index 3931d5e..148daae 100644 --- a/drivers/gpu/drm/exynos/exynos7_drm_decon.c +++ b/drivers/gpu/drm/exynos/exynos7_drm_decon.c @@ -25,6 +25,7 @@ #include <video/of_display_timing.h> #include <video/of_videomode.h> +#include <video/videomode.h> #include "exynos_drm_crtc.h" #include "exynos_drm_plane.h" @@ -168,28 +169,24 @@ static void decon_commit(struct exynos_drm_crtc *crtc) return; if (!ctx->i80_if) { - int vsync_len, vbpd, vfpd, hsync_len, hbpd, hfpd; + struct videomode vm; + + drm_display_mode_crtc_to_videomode(mode, &vm); /* setup vertical timing values. */ - vsync_len = mode->crtc_vsync_end - mode->crtc_vsync_start; - vbpd = mode->crtc_vtotal - mode->crtc_vsync_end; - vfpd = mode->crtc_vsync_start - mode->crtc_vdisplay; - val = VIDTCON0_VBPD(vbpd - 1) | VIDTCON0_VFPD(vfpd - 1); + val = VIDTCON0_VBPD(vm.vback_porch - 1) | + VIDTCON0_VFPD(vm.vfront_porch - 1); writel(val, ctx->regs + VIDTCON0); - val = VIDTCON1_VSPW(vsync_len - 1); + val = VIDTCON1_VSPW(vm.vsync_len - 1); writel(val, ctx->regs + VIDTCON1); /* setup horizontal timing values. */ - hsync_len = mode->crtc_hsync_end - mode->crtc_hsync_start; - hbpd = mode->crtc_htotal - mode->crtc_hsync_end; - hfpd = mode->crtc_hsync_start - mode->crtc_hdisplay; - - /* setup horizontal timing values. */ - val = VIDTCON2_HBPD(hbpd - 1) | VIDTCON2_HFPD(hfpd - 1); + val = VIDTCON2_HBPD(vm.hback_porch - 1) | + VIDTCON2_HFPD(vm.hfront_porch - 1); writel(val, ctx->regs + VIDTCON2); - val = VIDTCON3_HSPW(hsync_len - 1); + val = VIDTCON3_HSPW(vm.hsync_len - 1); writel(val, ctx->regs + VIDTCON3); } diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index d42ae2b..b3ab89d 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c @@ -25,6 +25,7 @@ #include <video/of_display_timing.h> #include <video/of_videomode.h> +#include <video/videomode.h> #include <video/samsung_fimd.h> #include <drm/exynos_drm.h> @@ -463,7 +464,7 @@ static void fimd_commit(struct exynos_drm_crtc *crtc) return; } } else { - int vsync_len, vbpd, vfpd, hsync_len, hbpd, hfpd; + struct videomode vm; u32 vidcon1; /* setup polarity values */ @@ -474,24 +475,19 @@ static void fimd_commit(struct exynos_drm_crtc *crtc) vidcon1 |= VIDCON1_INV_HSYNC; writel(vidcon1, ctx->regs + driver_data->timing_base + VIDCON1); + drm_display_mode_crtc_to_videomode(mode, &vm); /* setup vertical timing values. */ - vsync_len = mode->crtc_vsync_end - mode->crtc_vsync_start; - vbpd = mode->crtc_vtotal - mode->crtc_vsync_end; - vfpd = mode->crtc_vsync_start - mode->crtc_vdisplay; - val = VIDTCON0_VBPD(vbpd - 1) | - VIDTCON0_VFPD(vfpd - 1) | - VIDTCON0_VSPW(vsync_len - 1); + val = VIDTCON0_VBPD(vm.vback_porch - 1) | + VIDTCON0_VFPD(vm.vfront_porch - 1) | + VIDTCON0_VSPW(vm.vsync_len - 1); writel(val, ctx->regs + driver_data->timing_base + VIDTCON0); /* setup horizontal timing values. */ - hsync_len = mode->crtc_hsync_end - mode->crtc_hsync_start; - hbpd = mode->crtc_htotal - mode->crtc_hsync_end; - hfpd = mode->crtc_hsync_start - mode->crtc_hdisplay; - val = VIDTCON1_HBPD(hbpd - 1) | - VIDTCON1_HFPD(hfpd - 1) | - VIDTCON1_HSPW(hsync_len - 1); + val = VIDTCON1_HBPD(vm.hback_porch - 1) | + VIDTCON1_HFPD(vm.hfront_porch - 1) | + VIDTCON1_HSPW(vm.hsync_len - 1); writel(val, ctx->regs + driver_data->timing_base + VIDTCON1); } diff --git a/include/drm/drm_modes.h b/include/drm/drm_modes.h index 0d310be..9ac764b 100644 --- a/include/drm/drm_modes.h +++ b/include/drm/drm_modes.h @@ -473,6 +473,8 @@ void drm_display_mode_from_videomode(const struct videomode *vm, struct drm_display_mode *dmode); void drm_display_mode_to_videomode(const struct drm_display_mode *dmode, struct videomode *vm); +void drm_display_mode_crtc_to_videomode(const struct drm_display_mode *dmode, + struct videomode *vm); void drm_bus_flags_from_videomode(const struct videomode *vm, u32 *bus_flags); int of_get_drm_display_mode(struct device_node *np, struct drm_display_mode *dmode, u32 *bus_flags, -- 2.7.4 ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] drm/kms/mode: added a new helper for calculating videomode from crtc's display mode 2018-05-03 5:58 ` [PATCH] drm/kms/mode: added a new helper for calculating videomode from crtc's display mode Satendra Singh Thakur @ 2018-05-03 8:02 ` Jani Nikula 2018-05-03 10:36 ` Liviu Dudau 1 sibling, 0 replies; 8+ messages in thread From: Jani Nikula @ 2018-05-03 8:02 UTC (permalink / raw) To: Satendra Singh Thakur, Liviu Dudau, Brian Starkey, Mali DP Maintainers, David Airlie, Boris Brezillon, Nicolas Ferre, Alexandre Belloni, Gustavo Padovan, Maarten Lankhorst, Sean Paul, Inki Dae, Joonyoung Shim, Seung-Woo Kim, Kyungmin Park, Kukjin Kim, Krzysztof Kozlowski, dri-devel, linux-kernel, linux-arm-kernel, linux-samsung-soc Cc: Hemanshu Srivastava, Satendra Singh Thakur, Madhur Verma On Thu, 03 May 2018, Satendra Singh Thakur <satendra.t@samsung.com> wrote: > 1. > -Added a new helper drm_display_mode_crtc_to_videomode > -This helper calculates mode parameters like > horizontal front_porch, back_porch, sync length > vertical front_porch, back_porch, sync length > using crtc_* fields of struct drm_display_mode > -It uses following fields of crtc mode > horizontal sync start/end, active and total length > vertical sync start/end, active and total length > 2. > -Most of the driver use user-supplied mode for calculating videomode > -However, few drivers use HW (crtc) mode for calculating videomode > -This helper will be useful for such drivers > 3. > -Currently following drivers will be using this new helper > -arm hdlcd > -atmel hlcdc > -exynos 5433 decon > -exynos7 decon > -exynos fimd > 4. > -This patch removes related duplicate code from above mentioned drivers > > Signed-off-by: Satendra Singh Thakur <satendra.t@samsung.com> > Cc: Madhur Verma <madhur.verma@samsung.com> > Cc: Hemanshu Srivastava <hemanshu.s@samsung.com> > --- > drivers/gpu/drm/arm/hdlcd_crtc.c | 8 +------- > drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c | 7 +------ > drivers/gpu/drm/drm_modes.c | 20 ++++++++++++++++++++ > drivers/gpu/drm/exynos/exynos5433_drm_decon.c | 22 ++++++++++------------ > drivers/gpu/drm/exynos/exynos7_drm_decon.c | 23 ++++++++++------------- > drivers/gpu/drm/exynos/exynos_drm_fimd.c | 22 +++++++++------------- > include/drm/drm_modes.h | 2 ++ > 7 files changed, 53 insertions(+), 51 deletions(-) > > diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c > index cf5cbd6..d20e471 100644 > --- a/drivers/gpu/drm/arm/hdlcd_crtc.c > +++ b/drivers/gpu/drm/arm/hdlcd_crtc.c > @@ -130,13 +130,7 @@ static void hdlcd_crtc_mode_set_nofb(struct drm_crtc *crtc) > struct videomode vm; > unsigned int polarities, err; > > - vm.vfront_porch = m->crtc_vsync_start - m->crtc_vdisplay; > - vm.vback_porch = m->crtc_vtotal - m->crtc_vsync_end; > - vm.vsync_len = m->crtc_vsync_end - m->crtc_vsync_start; > - vm.hfront_porch = m->crtc_hsync_start - m->crtc_hdisplay; > - vm.hback_porch = m->crtc_htotal - m->crtc_hsync_end; > - vm.hsync_len = m->crtc_hsync_end - m->crtc_hsync_start; > - > + drm_display_mode_crtc_to_videomode(m, &vm); > polarities = HDLCD_POLARITY_DATAEN | HDLCD_POLARITY_DATA; > > if (m->flags & DRM_MODE_FLAG_PHSYNC) > diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c > index d732810..bafcef6 100644 > --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c > +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c > @@ -81,12 +81,7 @@ static void atmel_hlcdc_crtc_mode_set_nofb(struct drm_crtc *c) > unsigned int cfg; > int div; > > - vm.vfront_porch = adj->crtc_vsync_start - adj->crtc_vdisplay; > - vm.vback_porch = adj->crtc_vtotal - adj->crtc_vsync_end; > - vm.vsync_len = adj->crtc_vsync_end - adj->crtc_vsync_start; > - vm.hfront_porch = adj->crtc_hsync_start - adj->crtc_hdisplay; > - vm.hback_porch = adj->crtc_htotal - adj->crtc_hsync_end; > - vm.hsync_len = adj->crtc_hsync_end - adj->crtc_hsync_start; > + drm_display_mode_crtc_to_videomode(adj, &vm); > > regmap_write(regmap, ATMEL_HLCDC_CFG(1), > (vm.hsync_len - 1) | ((vm.vsync_len - 1) << 16)); > diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c > index e82b61e..a406749 100644 > --- a/drivers/gpu/drm/drm_modes.c > +++ b/drivers/gpu/drm/drm_modes.c > @@ -654,6 +654,26 @@ void drm_display_mode_to_videomode(const struct drm_display_mode *dmode, > vm->flags |= DISPLAY_FLAGS_DOUBLECLK; > } > EXPORT_SYMBOL_GPL(drm_display_mode_to_videomode); > +/** > + * drm_display_mode_crtc_to_videomode - fill in @vm using crtc fields of@dmode, "of@dmode" needs a space, superfluous comma at the end. > + * @dmode: drm_display_mode structure to use as source > + * @vm: videomode structure to use as destination > + * > + * Fills out @vm using the crtc display mode specified in @dmode. > + */ > +void drm_display_mode_crtc_to_videomode(const struct drm_display_mode *dmode, > + struct videomode *vm) > +{ > + vm->hfront_porch = dmode->crtc_hsync_start - dmode->crtc_hdisplay; > + vm->hsync_len = dmode->crtc_hsync_end - dmode->crtc_hsync_start; > + vm->hback_porch = dmode->crtc_htotal - dmode->crtc_hsync_end; > + > + vm->vfront_porch = dmode->crtc_vsync_start - dmode->crtc_vdisplay; > + vm->vsync_len = dmode->crtc_vsync_end - dmode->crtc_vsync_start; > + vm->vback_porch = dmode->crtc_vtotal - dmode->crtc_vsync_end; IMO this should fill in or at least clear all fields of videomode, in many call sites they'll contain stack garbage. > + Superfluous newline. > +} > +EXPORT_SYMBOL_GPL(drm_display_mode_crtc_to_videomode); > > /** > * drm_bus_flags_from_videomode - extract information about pixelclk and > diff --git a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c > index 1c330f2..1ba73a8 100644 > --- a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c > +++ b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c > @@ -20,6 +20,7 @@ > #include <linux/of_gpio.h> > #include <linux/pm_runtime.h> > #include <linux/regmap.h> > +#include <video/videomode.h> > > #include "exynos_drm_drv.h" > #include "exynos_drm_crtc.h" > @@ -225,26 +226,23 @@ static void decon_commit(struct exynos_drm_crtc *crtc) > writel(val, ctx->addr + DECON_VIDTCON2); > > if (!crtc->i80_mode) { > - int vbp = m->crtc_vtotal - m->crtc_vsync_end; > - int vfp = m->crtc_vsync_start - m->crtc_vdisplay; > + struct videomode vm; > > + drm_display_mode_crtc_to_videomode(m, &vm); > if (interlaced) > - vbp = vbp / 2 - 1; > - val = VIDTCON00_VBPD_F(vbp - 1) | VIDTCON00_VFPD_F(vfp - 1); > + vm.vback_porch = (vm.vback_porch >> 1) - 1; > + val = VIDTCON00_VBPD_F(vm.vback_porch - 1) | > + VIDTCON00_VFPD_F(vm.vfront_porch - 1); > writel(val, ctx->addr + DECON_VIDTCON00); > > - val = VIDTCON01_VSPW_F( > - m->crtc_vsync_end - m->crtc_vsync_start - 1); > + val = VIDTCON01_VSPW_F(vm.vsync_len - 1); > writel(val, ctx->addr + DECON_VIDTCON01); > > - val = VIDTCON10_HBPD_F( > - m->crtc_htotal - m->crtc_hsync_end - 1) | > - VIDTCON10_HFPD_F( > - m->crtc_hsync_start - m->crtc_hdisplay - 1); > + val = VIDTCON10_HBPD_F(vm.hback_porch - 1) | > + VIDTCON10_HFPD_F(vm.hfront_porch - 1); > writel(val, ctx->addr + DECON_VIDTCON10); > > - val = VIDTCON11_HSPW_F( > - m->crtc_hsync_end - m->crtc_hsync_start - 1); > + val = VIDTCON11_HSPW_F(vm.hsync_len - 1); > writel(val, ctx->addr + DECON_VIDTCON11); > } > > diff --git a/drivers/gpu/drm/exynos/exynos7_drm_decon.c b/drivers/gpu/drm/exynos/exynos7_drm_decon.c > index 3931d5e..148daae 100644 > --- a/drivers/gpu/drm/exynos/exynos7_drm_decon.c > +++ b/drivers/gpu/drm/exynos/exynos7_drm_decon.c > @@ -25,6 +25,7 @@ > > #include <video/of_display_timing.h> > #include <video/of_videomode.h> > +#include <video/videomode.h> > > #include "exynos_drm_crtc.h" > #include "exynos_drm_plane.h" > @@ -168,28 +169,24 @@ static void decon_commit(struct exynos_drm_crtc *crtc) > return; > > if (!ctx->i80_if) { > - int vsync_len, vbpd, vfpd, hsync_len, hbpd, hfpd; > + struct videomode vm; > + > + drm_display_mode_crtc_to_videomode(mode, &vm); > /* setup vertical timing values. */ > - vsync_len = mode->crtc_vsync_end - mode->crtc_vsync_start; > - vbpd = mode->crtc_vtotal - mode->crtc_vsync_end; > - vfpd = mode->crtc_vsync_start - mode->crtc_vdisplay; > > - val = VIDTCON0_VBPD(vbpd - 1) | VIDTCON0_VFPD(vfpd - 1); > + val = VIDTCON0_VBPD(vm.vback_porch - 1) | > + VIDTCON0_VFPD(vm.vfront_porch - 1); > writel(val, ctx->regs + VIDTCON0); > > - val = VIDTCON1_VSPW(vsync_len - 1); > + val = VIDTCON1_VSPW(vm.vsync_len - 1); > writel(val, ctx->regs + VIDTCON1); > > /* setup horizontal timing values. */ > - hsync_len = mode->crtc_hsync_end - mode->crtc_hsync_start; > - hbpd = mode->crtc_htotal - mode->crtc_hsync_end; > - hfpd = mode->crtc_hsync_start - mode->crtc_hdisplay; > - > - /* setup horizontal timing values. */ > - val = VIDTCON2_HBPD(hbpd - 1) | VIDTCON2_HFPD(hfpd - 1); > + val = VIDTCON2_HBPD(vm.hback_porch - 1) | > + VIDTCON2_HFPD(vm.hfront_porch - 1); > writel(val, ctx->regs + VIDTCON2); > > - val = VIDTCON3_HSPW(hsync_len - 1); > + val = VIDTCON3_HSPW(vm.hsync_len - 1); > writel(val, ctx->regs + VIDTCON3); > } > > diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c > index d42ae2b..b3ab89d 100644 > --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c > +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c > @@ -25,6 +25,7 @@ > > #include <video/of_display_timing.h> > #include <video/of_videomode.h> > +#include <video/videomode.h> > #include <video/samsung_fimd.h> > #include <drm/exynos_drm.h> > > @@ -463,7 +464,7 @@ static void fimd_commit(struct exynos_drm_crtc *crtc) > return; > } > } else { > - int vsync_len, vbpd, vfpd, hsync_len, hbpd, hfpd; > + struct videomode vm; > u32 vidcon1; > > /* setup polarity values */ > @@ -474,24 +475,19 @@ static void fimd_commit(struct exynos_drm_crtc *crtc) > vidcon1 |= VIDCON1_INV_HSYNC; > writel(vidcon1, ctx->regs + driver_data->timing_base + VIDCON1); > > + drm_display_mode_crtc_to_videomode(mode, &vm); > /* setup vertical timing values. */ > - vsync_len = mode->crtc_vsync_end - mode->crtc_vsync_start; > - vbpd = mode->crtc_vtotal - mode->crtc_vsync_end; > - vfpd = mode->crtc_vsync_start - mode->crtc_vdisplay; > > - val = VIDTCON0_VBPD(vbpd - 1) | > - VIDTCON0_VFPD(vfpd - 1) | > - VIDTCON0_VSPW(vsync_len - 1); > + val = VIDTCON0_VBPD(vm.vback_porch - 1) | > + VIDTCON0_VFPD(vm.vfront_porch - 1) | > + VIDTCON0_VSPW(vm.vsync_len - 1); > writel(val, ctx->regs + driver_data->timing_base + VIDTCON0); > > /* setup horizontal timing values. */ > - hsync_len = mode->crtc_hsync_end - mode->crtc_hsync_start; > - hbpd = mode->crtc_htotal - mode->crtc_hsync_end; > - hfpd = mode->crtc_hsync_start - mode->crtc_hdisplay; > > - val = VIDTCON1_HBPD(hbpd - 1) | > - VIDTCON1_HFPD(hfpd - 1) | > - VIDTCON1_HSPW(hsync_len - 1); > + val = VIDTCON1_HBPD(vm.hback_porch - 1) | > + VIDTCON1_HFPD(vm.hfront_porch - 1) | > + VIDTCON1_HSPW(vm.hsync_len - 1); > writel(val, ctx->regs + driver_data->timing_base + VIDTCON1); > } > > diff --git a/include/drm/drm_modes.h b/include/drm/drm_modes.h > index 0d310be..9ac764b 100644 > --- a/include/drm/drm_modes.h > +++ b/include/drm/drm_modes.h > @@ -473,6 +473,8 @@ void drm_display_mode_from_videomode(const struct videomode *vm, > struct drm_display_mode *dmode); > void drm_display_mode_to_videomode(const struct drm_display_mode *dmode, > struct videomode *vm); > +void drm_display_mode_crtc_to_videomode(const struct drm_display_mode *dmode, > + struct videomode *vm); > void drm_bus_flags_from_videomode(const struct videomode *vm, u32 *bus_flags); > int of_get_drm_display_mode(struct device_node *np, > struct drm_display_mode *dmode, u32 *bus_flags, -- Jani Nikula, Intel Open Source Technology Center ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] drm/kms/mode: added a new helper for calculating videomode from crtc's display mode 2018-05-03 5:58 ` [PATCH] drm/kms/mode: added a new helper for calculating videomode from crtc's display mode Satendra Singh Thakur 2018-05-03 8:02 ` Jani Nikula @ 2018-05-03 10:36 ` Liviu Dudau [not found] ` <CGME20180504074013epcas5p4564cb7043e1875154469052d097848db@epcas5p4.samsung.com> 1 sibling, 1 reply; 8+ messages in thread From: Liviu Dudau @ 2018-05-03 10:36 UTC (permalink / raw) To: Satendra Singh Thakur Cc: Brian Starkey, Mali DP Maintainers, David Airlie, Boris Brezillon, Nicolas Ferre, Alexandre Belloni, Gustavo Padovan, Maarten Lankhorst, Sean Paul, Inki Dae, Joonyoung Shim, Seung-Woo Kim, Kyungmin Park, Kukjin Kim, Krzysztof Kozlowski, dri-devel, linux-kernel, linux-arm-kernel, linux-samsung-soc, Madhur Verma, Hemanshu Srivastava On Thu, May 03, 2018 at 11:28:37AM +0530, Satendra Singh Thakur wrote: > 1. > -Added a new helper drm_display_mode_crtc_to_videomode > -This helper calculates mode parameters like > horizontal front_porch, back_porch, sync length > vertical front_porch, back_porch, sync length > using crtc_* fields of struct drm_display_mode > -It uses following fields of crtc mode > horizontal sync start/end, active and total length > vertical sync start/end, active and total length > 2. > -Most of the driver use user-supplied mode for calculating videomode > -However, few drivers use HW (crtc) mode for calculating videomode > -This helper will be useful for such drivers > 3. > -Currently following drivers will be using this new helper > -arm hdlcd > -atmel hlcdc > -exynos 5433 decon > -exynos7 decon > -exynos fimd > 4. > -This patch removes related duplicate code from above mentioned drivers > > Signed-off-by: Satendra Singh Thakur <satendra.t@samsung.com> > Cc: Madhur Verma <madhur.verma@samsung.com> > Cc: Hemanshu Srivastava <hemanshu.s@samsung.com> > --- > drivers/gpu/drm/arm/hdlcd_crtc.c | 8 +------- > drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c | 7 +------ > drivers/gpu/drm/drm_modes.c | 20 ++++++++++++++++++++ > drivers/gpu/drm/exynos/exynos5433_drm_decon.c | 22 ++++++++++------------ > drivers/gpu/drm/exynos/exynos7_drm_decon.c | 23 ++++++++++------------- > drivers/gpu/drm/exynos/exynos_drm_fimd.c | 22 +++++++++------------- > include/drm/drm_modes.h | 2 ++ > 7 files changed, 53 insertions(+), 51 deletions(-) > > diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c > index cf5cbd6..d20e471 100644 > --- a/drivers/gpu/drm/arm/hdlcd_crtc.c > +++ b/drivers/gpu/drm/arm/hdlcd_crtc.c > @@ -130,13 +130,7 @@ static void hdlcd_crtc_mode_set_nofb(struct drm_crtc *crtc) > struct videomode vm; > unsigned int polarities, err; > > - vm.vfront_porch = m->crtc_vsync_start - m->crtc_vdisplay; > - vm.vback_porch = m->crtc_vtotal - m->crtc_vsync_end; > - vm.vsync_len = m->crtc_vsync_end - m->crtc_vsync_start; > - vm.hfront_porch = m->crtc_hsync_start - m->crtc_hdisplay; > - vm.hback_porch = m->crtc_htotal - m->crtc_hsync_end; > - vm.hsync_len = m->crtc_hsync_end - m->crtc_hsync_start; > - > + drm_display_mode_crtc_to_videomode(m, &vm); > polarities = HDLCD_POLARITY_DATAEN | HDLCD_POLARITY_DATA; > > if (m->flags & DRM_MODE_FLAG_PHSYNC) For the HDLCD part: Acked-by: Liviu Dudau <liviu.dudau@arm.com> If you're not sending the final version through drm-misc then let me know and I can pick up the HDLCD part separately. Best regards, Liviu > diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c > index d732810..bafcef6 100644 > --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c > +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c > @@ -81,12 +81,7 @@ static void atmel_hlcdc_crtc_mode_set_nofb(struct drm_crtc *c) > unsigned int cfg; > int div; > > - vm.vfront_porch = adj->crtc_vsync_start - adj->crtc_vdisplay; > - vm.vback_porch = adj->crtc_vtotal - adj->crtc_vsync_end; > - vm.vsync_len = adj->crtc_vsync_end - adj->crtc_vsync_start; > - vm.hfront_porch = adj->crtc_hsync_start - adj->crtc_hdisplay; > - vm.hback_porch = adj->crtc_htotal - adj->crtc_hsync_end; > - vm.hsync_len = adj->crtc_hsync_end - adj->crtc_hsync_start; > + drm_display_mode_crtc_to_videomode(adj, &vm); > > regmap_write(regmap, ATMEL_HLCDC_CFG(1), > (vm.hsync_len - 1) | ((vm.vsync_len - 1) << 16)); > diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c > index e82b61e..a406749 100644 > --- a/drivers/gpu/drm/drm_modes.c > +++ b/drivers/gpu/drm/drm_modes.c > @@ -654,6 +654,26 @@ void drm_display_mode_to_videomode(const struct drm_display_mode *dmode, > vm->flags |= DISPLAY_FLAGS_DOUBLECLK; > } > EXPORT_SYMBOL_GPL(drm_display_mode_to_videomode); > +/** > + * drm_display_mode_crtc_to_videomode - fill in @vm using crtc fields of@dmode, > + * @dmode: drm_display_mode structure to use as source > + * @vm: videomode structure to use as destination > + * > + * Fills out @vm using the crtc display mode specified in @dmode. > + */ > +void drm_display_mode_crtc_to_videomode(const struct drm_display_mode *dmode, > + struct videomode *vm) > +{ > + vm->hfront_porch = dmode->crtc_hsync_start - dmode->crtc_hdisplay; > + vm->hsync_len = dmode->crtc_hsync_end - dmode->crtc_hsync_start; > + vm->hback_porch = dmode->crtc_htotal - dmode->crtc_hsync_end; > + > + vm->vfront_porch = dmode->crtc_vsync_start - dmode->crtc_vdisplay; > + vm->vsync_len = dmode->crtc_vsync_end - dmode->crtc_vsync_start; > + vm->vback_porch = dmode->crtc_vtotal - dmode->crtc_vsync_end; > + > +} > +EXPORT_SYMBOL_GPL(drm_display_mode_crtc_to_videomode); > > /** > * drm_bus_flags_from_videomode - extract information about pixelclk and > diff --git a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c > index 1c330f2..1ba73a8 100644 > --- a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c > +++ b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c > @@ -20,6 +20,7 @@ > #include <linux/of_gpio.h> > #include <linux/pm_runtime.h> > #include <linux/regmap.h> > +#include <video/videomode.h> > > #include "exynos_drm_drv.h" > #include "exynos_drm_crtc.h" > @@ -225,26 +226,23 @@ static void decon_commit(struct exynos_drm_crtc *crtc) > writel(val, ctx->addr + DECON_VIDTCON2); > > if (!crtc->i80_mode) { > - int vbp = m->crtc_vtotal - m->crtc_vsync_end; > - int vfp = m->crtc_vsync_start - m->crtc_vdisplay; > + struct videomode vm; > > + drm_display_mode_crtc_to_videomode(m, &vm); > if (interlaced) > - vbp = vbp / 2 - 1; > - val = VIDTCON00_VBPD_F(vbp - 1) | VIDTCON00_VFPD_F(vfp - 1); > + vm.vback_porch = (vm.vback_porch >> 1) - 1; > + val = VIDTCON00_VBPD_F(vm.vback_porch - 1) | > + VIDTCON00_VFPD_F(vm.vfront_porch - 1); > writel(val, ctx->addr + DECON_VIDTCON00); > > - val = VIDTCON01_VSPW_F( > - m->crtc_vsync_end - m->crtc_vsync_start - 1); > + val = VIDTCON01_VSPW_F(vm.vsync_len - 1); > writel(val, ctx->addr + DECON_VIDTCON01); > > - val = VIDTCON10_HBPD_F( > - m->crtc_htotal - m->crtc_hsync_end - 1) | > - VIDTCON10_HFPD_F( > - m->crtc_hsync_start - m->crtc_hdisplay - 1); > + val = VIDTCON10_HBPD_F(vm.hback_porch - 1) | > + VIDTCON10_HFPD_F(vm.hfront_porch - 1); > writel(val, ctx->addr + DECON_VIDTCON10); > > - val = VIDTCON11_HSPW_F( > - m->crtc_hsync_end - m->crtc_hsync_start - 1); > + val = VIDTCON11_HSPW_F(vm.hsync_len - 1); > writel(val, ctx->addr + DECON_VIDTCON11); > } > > diff --git a/drivers/gpu/drm/exynos/exynos7_drm_decon.c b/drivers/gpu/drm/exynos/exynos7_drm_decon.c > index 3931d5e..148daae 100644 > --- a/drivers/gpu/drm/exynos/exynos7_drm_decon.c > +++ b/drivers/gpu/drm/exynos/exynos7_drm_decon.c > @@ -25,6 +25,7 @@ > > #include <video/of_display_timing.h> > #include <video/of_videomode.h> > +#include <video/videomode.h> > > #include "exynos_drm_crtc.h" > #include "exynos_drm_plane.h" > @@ -168,28 +169,24 @@ static void decon_commit(struct exynos_drm_crtc *crtc) > return; > > if (!ctx->i80_if) { > - int vsync_len, vbpd, vfpd, hsync_len, hbpd, hfpd; > + struct videomode vm; > + > + drm_display_mode_crtc_to_videomode(mode, &vm); > /* setup vertical timing values. */ > - vsync_len = mode->crtc_vsync_end - mode->crtc_vsync_start; > - vbpd = mode->crtc_vtotal - mode->crtc_vsync_end; > - vfpd = mode->crtc_vsync_start - mode->crtc_vdisplay; > > - val = VIDTCON0_VBPD(vbpd - 1) | VIDTCON0_VFPD(vfpd - 1); > + val = VIDTCON0_VBPD(vm.vback_porch - 1) | > + VIDTCON0_VFPD(vm.vfront_porch - 1); > writel(val, ctx->regs + VIDTCON0); > > - val = VIDTCON1_VSPW(vsync_len - 1); > + val = VIDTCON1_VSPW(vm.vsync_len - 1); > writel(val, ctx->regs + VIDTCON1); > > /* setup horizontal timing values. */ > - hsync_len = mode->crtc_hsync_end - mode->crtc_hsync_start; > - hbpd = mode->crtc_htotal - mode->crtc_hsync_end; > - hfpd = mode->crtc_hsync_start - mode->crtc_hdisplay; > - > - /* setup horizontal timing values. */ > - val = VIDTCON2_HBPD(hbpd - 1) | VIDTCON2_HFPD(hfpd - 1); > + val = VIDTCON2_HBPD(vm.hback_porch - 1) | > + VIDTCON2_HFPD(vm.hfront_porch - 1); > writel(val, ctx->regs + VIDTCON2); > > - val = VIDTCON3_HSPW(hsync_len - 1); > + val = VIDTCON3_HSPW(vm.hsync_len - 1); > writel(val, ctx->regs + VIDTCON3); > } > > diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c > index d42ae2b..b3ab89d 100644 > --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c > +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c > @@ -25,6 +25,7 @@ > > #include <video/of_display_timing.h> > #include <video/of_videomode.h> > +#include <video/videomode.h> > #include <video/samsung_fimd.h> > #include <drm/exynos_drm.h> > > @@ -463,7 +464,7 @@ static void fimd_commit(struct exynos_drm_crtc *crtc) > return; > } > } else { > - int vsync_len, vbpd, vfpd, hsync_len, hbpd, hfpd; > + struct videomode vm; > u32 vidcon1; > > /* setup polarity values */ > @@ -474,24 +475,19 @@ static void fimd_commit(struct exynos_drm_crtc *crtc) > vidcon1 |= VIDCON1_INV_HSYNC; > writel(vidcon1, ctx->regs + driver_data->timing_base + VIDCON1); > > + drm_display_mode_crtc_to_videomode(mode, &vm); > /* setup vertical timing values. */ > - vsync_len = mode->crtc_vsync_end - mode->crtc_vsync_start; > - vbpd = mode->crtc_vtotal - mode->crtc_vsync_end; > - vfpd = mode->crtc_vsync_start - mode->crtc_vdisplay; > > - val = VIDTCON0_VBPD(vbpd - 1) | > - VIDTCON0_VFPD(vfpd - 1) | > - VIDTCON0_VSPW(vsync_len - 1); > + val = VIDTCON0_VBPD(vm.vback_porch - 1) | > + VIDTCON0_VFPD(vm.vfront_porch - 1) | > + VIDTCON0_VSPW(vm.vsync_len - 1); > writel(val, ctx->regs + driver_data->timing_base + VIDTCON0); > > /* setup horizontal timing values. */ > - hsync_len = mode->crtc_hsync_end - mode->crtc_hsync_start; > - hbpd = mode->crtc_htotal - mode->crtc_hsync_end; > - hfpd = mode->crtc_hsync_start - mode->crtc_hdisplay; > > - val = VIDTCON1_HBPD(hbpd - 1) | > - VIDTCON1_HFPD(hfpd - 1) | > - VIDTCON1_HSPW(hsync_len - 1); > + val = VIDTCON1_HBPD(vm.hback_porch - 1) | > + VIDTCON1_HFPD(vm.hfront_porch - 1) | > + VIDTCON1_HSPW(vm.hsync_len - 1); > writel(val, ctx->regs + driver_data->timing_base + VIDTCON1); > } > > diff --git a/include/drm/drm_modes.h b/include/drm/drm_modes.h > index 0d310be..9ac764b 100644 > --- a/include/drm/drm_modes.h > +++ b/include/drm/drm_modes.h > @@ -473,6 +473,8 @@ void drm_display_mode_from_videomode(const struct videomode *vm, > struct drm_display_mode *dmode); > void drm_display_mode_to_videomode(const struct drm_display_mode *dmode, > struct videomode *vm); > +void drm_display_mode_crtc_to_videomode(const struct drm_display_mode *dmode, > + struct videomode *vm); > void drm_bus_flags_from_videomode(const struct videomode *vm, u32 *bus_flags); > int of_get_drm_display_mode(struct device_node *np, > struct drm_display_mode *dmode, u32 *bus_flags, > -- > 2.7.4 > -- ==================== | I would like to | | fix the world, | | but they're not | | giving me the | \ source code! / --------------- ¯\_(ツ)_/¯ ^ permalink raw reply [flat|nested] 8+ messages in thread
[parent not found: <CGME20180504074013epcas5p4564cb7043e1875154469052d097848db@epcas5p4.samsung.com>]
* [PATCH v1] drm/kms/mode: added a new helper for calculating videomode from crtc's display mode [not found] ` <CGME20180504074013epcas5p4564cb7043e1875154469052d097848db@epcas5p4.samsung.com> @ 2018-05-04 7:40 ` Satendra Singh Thakur [not found] ` <CGME20180504090214epcas5p4e9c362da6cc7b65effcc042fc4f82d2a@epcas5p4.samsung.com> 2018-05-04 9:41 ` Jani Nikula 0 siblings, 2 replies; 8+ messages in thread From: Satendra Singh Thakur @ 2018-05-04 7:40 UTC (permalink / raw) To: jani.nikula, liviu.dudau, Brian Starkey, Mali DP Maintainers, David Airlie, Boris Brezillon, Nicolas Ferre, Alexandre Belloni, Gustavo Padovan, Maarten Lankhorst, Sean Paul, Inki Dae, Joonyoung Shim, Seung-Woo Kim, Kyungmin Park, Kukjin Kim, Krzysztof Kozlowski, dri-devel, linux-kernel, linux-arm-kernel, linux-samsung-soc Cc: madhur.verma, sst2005, Satendra Singh Thakur, Hemanshu Srivastava 1. -Added a new helper drm_display_mode_crtc_to_videomode -This helper calculates mode parameters like --horizontal front_porch, back_porch, sync length --vertical front_porch, back_porch, sync length -using crtc fields of struct drm_display_mode -It uses following fields of crtc mode --horizontal sync start/end, active and total length --vertical sync start/end, active and total length 2. -Most of the driver use user-supplied mode for calculating videomode -However, few drivers use HW (crtc) mode for calculating videomode -This helper will be useful for such drivers 3. -Currently following drivers will be using this new helper -arm hdlcd -atmel hlcdc -exynos 5433 decon -exynos7 decon -exynos fimd 4. -This change reduces several redundant lines of code for many drivers Reviewed-by: Jani Nikula <jani.nikula@linux.intel.com> Acked-by: Liviu Dudau <liviu.dudau@arm.com> Signed-off-by: Satendra Singh Thakur <satendra.t@samsung.com> Acked-by: Madhur Verma <madhur.verma@samsung.com> Cc: Hemanshu Srivastava <hemanshu.s@samsung.com> --- v1: Fixed review comments by Mr Jani Initialized with 0 the struct videomode so that stack garbage won't come Added Reviewed-by and Acked-by fields drivers/gpu/drm/arm/hdlcd_crtc.c | 10 ++-------- drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c | 9 ++------- drivers/gpu/drm/drm_modes.c | 19 +++++++++++++++++++ drivers/gpu/drm/exynos/exynos5433_drm_decon.c | 22 ++++++++++------------ drivers/gpu/drm/exynos/exynos7_drm_decon.c | 23 ++++++++++------------- drivers/gpu/drm/exynos/exynos_drm_fimd.c | 22 +++++++++------------- include/drm/drm_modes.h | 2 ++ 7 files changed, 54 insertions(+), 53 deletions(-) diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c index cf5cbd6..5cec264 100644 --- a/drivers/gpu/drm/arm/hdlcd_crtc.c +++ b/drivers/gpu/drm/arm/hdlcd_crtc.c @@ -127,16 +127,10 @@ static void hdlcd_crtc_mode_set_nofb(struct drm_crtc *crtc) { struct hdlcd_drm_private *hdlcd = crtc_to_hdlcd_priv(crtc); struct drm_display_mode *m = &crtc->state->adjusted_mode; - struct videomode vm; + struct videomode vm = {}; unsigned int polarities, err; - vm.vfront_porch = m->crtc_vsync_start - m->crtc_vdisplay; - vm.vback_porch = m->crtc_vtotal - m->crtc_vsync_end; - vm.vsync_len = m->crtc_vsync_end - m->crtc_vsync_start; - vm.hfront_porch = m->crtc_hsync_start - m->crtc_hdisplay; - vm.hback_porch = m->crtc_htotal - m->crtc_hsync_end; - vm.hsync_len = m->crtc_hsync_end - m->crtc_hsync_start; - + drm_display_mode_crtc_to_videomode(m, &vm); polarities = HDLCD_POLARITY_DATAEN | HDLCD_POLARITY_DATA; if (m->flags & DRM_MODE_FLAG_PHSYNC) diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c index d732810..fb298b8 100644 --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c @@ -76,17 +76,12 @@ static void atmel_hlcdc_crtc_mode_set_nofb(struct drm_crtc *c) struct drm_display_mode *adj = &c->state->adjusted_mode; struct atmel_hlcdc_crtc_state *state; unsigned long mode_rate; - struct videomode vm; + struct videomode vm = {}; unsigned long prate; unsigned int cfg; int div; - vm.vfront_porch = adj->crtc_vsync_start - adj->crtc_vdisplay; - vm.vback_porch = adj->crtc_vtotal - adj->crtc_vsync_end; - vm.vsync_len = adj->crtc_vsync_end - adj->crtc_vsync_start; - vm.hfront_porch = adj->crtc_hsync_start - adj->crtc_hdisplay; - vm.hback_porch = adj->crtc_htotal - adj->crtc_hsync_end; - vm.hsync_len = adj->crtc_hsync_end - adj->crtc_hsync_start; + drm_display_mode_crtc_to_videomode(adj, &vm); regmap_write(regmap, ATMEL_HLCDC_CFG(1), (vm.hsync_len - 1) | ((vm.vsync_len - 1) << 16)); diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c index e82b61e..328f771 100644 --- a/drivers/gpu/drm/drm_modes.c +++ b/drivers/gpu/drm/drm_modes.c @@ -654,6 +654,25 @@ void drm_display_mode_to_videomode(const struct drm_display_mode *dmode, vm->flags |= DISPLAY_FLAGS_DOUBLECLK; } EXPORT_SYMBOL_GPL(drm_display_mode_to_videomode); +/** + * drm_display_mode_crtc_to_videomode - fill in @vm using crtc fields of @dmode + * @dmode: drm_display_mode structure to use as source + * @vm: videomode structure to use as destination + * + * Fills out @vm using the crtc display mode specified in @dmode. + */ +void drm_display_mode_crtc_to_videomode(const struct drm_display_mode *dmode, + struct videomode *vm) +{ + vm->hfront_porch = dmode->crtc_hsync_start - dmode->crtc_hdisplay; + vm->hsync_len = dmode->crtc_hsync_end - dmode->crtc_hsync_start; + vm->hback_porch = dmode->crtc_htotal - dmode->crtc_hsync_end; + vm->vfront_porch = dmode->crtc_vsync_start - dmode->crtc_vdisplay; + vm->vsync_len = dmode->crtc_vsync_end - dmode->crtc_vsync_start; + vm->vback_porch = dmode->crtc_vtotal - dmode->crtc_vsync_end; + +} +EXPORT_SYMBOL_GPL(drm_display_mode_crtc_to_videomode); /** * drm_bus_flags_from_videomode - extract information about pixelclk and diff --git a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c index 1c330f2..2535ebb 100644 --- a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c +++ b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c @@ -20,6 +20,7 @@ #include <linux/of_gpio.h> #include <linux/pm_runtime.h> #include <linux/regmap.h> +#include <video/videomode.h> #include "exynos_drm_drv.h" #include "exynos_drm_crtc.h" @@ -225,26 +226,23 @@ static void decon_commit(struct exynos_drm_crtc *crtc) writel(val, ctx->addr + DECON_VIDTCON2); if (!crtc->i80_mode) { - int vbp = m->crtc_vtotal - m->crtc_vsync_end; - int vfp = m->crtc_vsync_start - m->crtc_vdisplay; + struct videomode vm = {}; + drm_display_mode_crtc_to_videomode(m, &vm); if (interlaced) - vbp = vbp / 2 - 1; - val = VIDTCON00_VBPD_F(vbp - 1) | VIDTCON00_VFPD_F(vfp - 1); + vm.vback_porch = (vm.vback_porch >> 1) - 1; + val = VIDTCON00_VBPD_F(vm.vback_porch - 1) | + VIDTCON00_VFPD_F(vm.vfront_porch - 1); writel(val, ctx->addr + DECON_VIDTCON00); - val = VIDTCON01_VSPW_F( - m->crtc_vsync_end - m->crtc_vsync_start - 1); + val = VIDTCON01_VSPW_F(vm.vsync_len - 1); writel(val, ctx->addr + DECON_VIDTCON01); - val = VIDTCON10_HBPD_F( - m->crtc_htotal - m->crtc_hsync_end - 1) | - VIDTCON10_HFPD_F( - m->crtc_hsync_start - m->crtc_hdisplay - 1); + val = VIDTCON10_HBPD_F(vm.hback_porch - 1) | + VIDTCON10_HFPD_F(vm.hfront_porch - 1); writel(val, ctx->addr + DECON_VIDTCON10); - val = VIDTCON11_HSPW_F( - m->crtc_hsync_end - m->crtc_hsync_start - 1); + val = VIDTCON11_HSPW_F(vm.hsync_len - 1); writel(val, ctx->addr + DECON_VIDTCON11); } diff --git a/drivers/gpu/drm/exynos/exynos7_drm_decon.c b/drivers/gpu/drm/exynos/exynos7_drm_decon.c index 3931d5e..5fdd093 100644 --- a/drivers/gpu/drm/exynos/exynos7_drm_decon.c +++ b/drivers/gpu/drm/exynos/exynos7_drm_decon.c @@ -25,6 +25,7 @@ #include <video/of_display_timing.h> #include <video/of_videomode.h> +#include <video/videomode.h> #include "exynos_drm_crtc.h" #include "exynos_drm_plane.h" @@ -168,28 +169,24 @@ static void decon_commit(struct exynos_drm_crtc *crtc) return; if (!ctx->i80_if) { - int vsync_len, vbpd, vfpd, hsync_len, hbpd, hfpd; + struct videomode vm = {}; + + drm_display_mode_crtc_to_videomode(mode, &vm); /* setup vertical timing values. */ - vsync_len = mode->crtc_vsync_end - mode->crtc_vsync_start; - vbpd = mode->crtc_vtotal - mode->crtc_vsync_end; - vfpd = mode->crtc_vsync_start - mode->crtc_vdisplay; - val = VIDTCON0_VBPD(vbpd - 1) | VIDTCON0_VFPD(vfpd - 1); + val = VIDTCON0_VBPD(vm.vback_porch - 1) | + VIDTCON0_VFPD(vm.vfront_porch - 1); writel(val, ctx->regs + VIDTCON0); - val = VIDTCON1_VSPW(vsync_len - 1); + val = VIDTCON1_VSPW(vm.vsync_len - 1); writel(val, ctx->regs + VIDTCON1); /* setup horizontal timing values. */ - hsync_len = mode->crtc_hsync_end - mode->crtc_hsync_start; - hbpd = mode->crtc_htotal - mode->crtc_hsync_end; - hfpd = mode->crtc_hsync_start - mode->crtc_hdisplay; - - /* setup horizontal timing values. */ - val = VIDTCON2_HBPD(hbpd - 1) | VIDTCON2_HFPD(hfpd - 1); + val = VIDTCON2_HBPD(vm.hback_porch - 1) | + VIDTCON2_HFPD(vm.hfront_porch - 1); writel(val, ctx->regs + VIDTCON2); - val = VIDTCON3_HSPW(hsync_len - 1); + val = VIDTCON3_HSPW(vm.hsync_len - 1); writel(val, ctx->regs + VIDTCON3); } diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index d42ae2b..c70b9ec 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c @@ -25,6 +25,7 @@ #include <video/of_display_timing.h> #include <video/of_videomode.h> +#include <video/videomode.h> #include <video/samsung_fimd.h> #include <drm/exynos_drm.h> @@ -463,7 +464,7 @@ static void fimd_commit(struct exynos_drm_crtc *crtc) return; } } else { - int vsync_len, vbpd, vfpd, hsync_len, hbpd, hfpd; + struct videomode vm = {}; u32 vidcon1; /* setup polarity values */ @@ -474,24 +475,19 @@ static void fimd_commit(struct exynos_drm_crtc *crtc) vidcon1 |= VIDCON1_INV_HSYNC; writel(vidcon1, ctx->regs + driver_data->timing_base + VIDCON1); + drm_display_mode_crtc_to_videomode(mode, &vm); /* setup vertical timing values. */ - vsync_len = mode->crtc_vsync_end - mode->crtc_vsync_start; - vbpd = mode->crtc_vtotal - mode->crtc_vsync_end; - vfpd = mode->crtc_vsync_start - mode->crtc_vdisplay; - val = VIDTCON0_VBPD(vbpd - 1) | - VIDTCON0_VFPD(vfpd - 1) | - VIDTCON0_VSPW(vsync_len - 1); + val = VIDTCON0_VBPD(vm.vback_porch - 1) | + VIDTCON0_VFPD(vm.vfront_porch - 1) | + VIDTCON0_VSPW(vm.vsync_len - 1); writel(val, ctx->regs + driver_data->timing_base + VIDTCON0); /* setup horizontal timing values. */ - hsync_len = mode->crtc_hsync_end - mode->crtc_hsync_start; - hbpd = mode->crtc_htotal - mode->crtc_hsync_end; - hfpd = mode->crtc_hsync_start - mode->crtc_hdisplay; - val = VIDTCON1_HBPD(hbpd - 1) | - VIDTCON1_HFPD(hfpd - 1) | - VIDTCON1_HSPW(hsync_len - 1); + val = VIDTCON1_HBPD(vm.hback_porch - 1) | + VIDTCON1_HFPD(vm.hfront_porch - 1) | + VIDTCON1_HSPW(vm.hsync_len - 1); writel(val, ctx->regs + driver_data->timing_base + VIDTCON1); } diff --git a/include/drm/drm_modes.h b/include/drm/drm_modes.h index 0d310be..9ac764b 100644 --- a/include/drm/drm_modes.h +++ b/include/drm/drm_modes.h @@ -473,6 +473,8 @@ void drm_display_mode_from_videomode(const struct videomode *vm, struct drm_display_mode *dmode); void drm_display_mode_to_videomode(const struct drm_display_mode *dmode, struct videomode *vm); +void drm_display_mode_crtc_to_videomode(const struct drm_display_mode *dmode, + struct videomode *vm); void drm_bus_flags_from_videomode(const struct videomode *vm, u32 *bus_flags); int of_get_drm_display_mode(struct device_node *np, struct drm_display_mode *dmode, u32 *bus_flags, -- 2.7.4 ^ permalink raw reply [flat|nested] 8+ messages in thread
[parent not found: <CGME20180504090214epcas5p4e9c362da6cc7b65effcc042fc4f82d2a@epcas5p4.samsung.com>]
* Re: [PATCH v1] drm/kms/mode: added a new helper for calculating videomode from crtc's display mode [not found] ` <CGME20180504090214epcas5p4e9c362da6cc7b65effcc042fc4f82d2a@epcas5p4.samsung.com> @ 2018-05-04 9:02 ` Satendra Singh Thakur 2018-05-04 9:38 ` Liviu Dudau 0 siblings, 1 reply; 8+ messages in thread From: Satendra Singh Thakur @ 2018-05-04 9:02 UTC (permalink / raw) To: liviu.dudau, dri-devel, linux-arm-kernel, linux-kernel Cc: Satendra Singh Thakur On Thu, May 03, 2018 at 11:36:39 +0100, Liviu Dudau wrote: > On Thu, May 03, 2018 at 11:28:37AM +0530, Satendra Singh Thakur wrote: > > 1. > > -Added a new helper drm_display_mode_crtc_to_videomode > > -This helper calculates mode parameters like > > horizontal front_porch, back_porch, sync length > > vertical front_porch, back_porch, sync length > > using crtc_* fields of struct drm_display_mode > > -It uses following fields of crtc mode > > horizontal sync start/end, active and total length > > vertical sync start/end, active and total length > > 2. > > -Most of the driver use user-supplied mode for calculating videomode > > -However, few drivers use HW (crtc) mode for calculating videomode > > -This helper will be useful for such drivers > > 3. > > -Currently following drivers will be using this new helper > > -arm hdlcd > > -atmel hlcdc > > -exynos 5433 decon > > -exynos7 decon > > -exynos fimd > > 4. > > -This patch removes related duplicate code from above mentioned drivers > > > > Signed-off-by: Satendra Singh Thakur <satendra.t@samsung.com> > > Cc: Madhur Verma <madhur.verma@samsung.com> > > Cc: Hemanshu Srivastava <hemanshu.s@samsung.com> > > --- > > drivers/gpu/drm/arm/hdlcd_crtc.c | 8 +------- > > drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c | 7 +------ > > drivers/gpu/drm/drm_modes.c | 20 ++++++++++++++++++++ > > drivers/gpu/drm/exynos/exynos5433_drm_decon.c | 22 ++++++++++------------ > > drivers/gpu/drm/exynos/exynos7_drm_decon.c | 23 ++++++++++------------- > > drivers/gpu/drm/exynos/exynos_drm_fimd.c | 22 +++++++++------------- > > include/drm/drm_modes.h | 2 ++ > > 7 files changed, 53 insertions(+), 51 deletions(-) > > > > diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c > > index cf5cbd6..d20e471 100644 > > --- a/drivers/gpu/drm/arm/hdlcd_crtc.c > > +++ b/drivers/gpu/drm/arm/hdlcd_crtc.c > > @@ -130,13 +130,7 @@ static void hdlcd_crtc_mode_set_nofb(struct drm_crtc *crtc) > > struct videomode vm; > > unsigned int polarities, err; > > > > - vm.vfront_porch = m->crtc_vsync_start - m->crtc_vdisplay; > > - vm.vback_porch = m->crtc_vtotal - m->crtc_vsync_end; > > - vm.vsync_len = m->crtc_vsync_end - m->crtc_vsync_start; > > - vm.hfront_porch = m->crtc_hsync_start - m->crtc_hdisplay; > > - vm.hback_porch = m->crtc_htotal - m->crtc_hsync_end; > > - vm.hsync_len = m->crtc_hsync_end - m->crtc_hsync_start; > > - > > + drm_display_mode_crtc_to_videomode(m, &vm); > > polarities = HDLCD_POLARITY_DATAEN | HDLCD_POLARITY_DATA; > > > > if (m->flags & DRM_MODE_FLAG_PHSYNC) > > For the HDLCD part: > > Acked-by: Liviu Dudau <liviu.dudau@arm.com> > > If you're not sending the final version through drm-misc then let me > know and I can pick up the HDLCD part separately. > > Best regards, > Liviu > > Hi Mr Liviu, Thanks for accepting the patch. I don't know how to send patch through drm-misc. You may please go ahead and pick HDLCD part separately. Thanks -Satendra ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v1] drm/kms/mode: added a new helper for calculating videomode from crtc's display mode 2018-05-04 9:02 ` Satendra Singh Thakur @ 2018-05-04 9:38 ` Liviu Dudau 0 siblings, 0 replies; 8+ messages in thread From: Liviu Dudau @ 2018-05-04 9:38 UTC (permalink / raw) To: Satendra Singh Thakur; +Cc: dri-devel, linux-arm-kernel, linux-kernel On Fri, May 04, 2018 at 02:32:03PM +0530, Satendra Singh Thakur wrote: > On Thu, May 03, 2018 at 11:36:39 +0100, Liviu Dudau wrote: > > On Thu, May 03, 2018 at 11:28:37AM +0530, Satendra Singh Thakur wrote: > > > 1. > > > -Added a new helper drm_display_mode_crtc_to_videomode > > > -This helper calculates mode parameters like > > > horizontal front_porch, back_porch, sync length > > > vertical front_porch, back_porch, sync length > > > using crtc_* fields of struct drm_display_mode > > > -It uses following fields of crtc mode > > > horizontal sync start/end, active and total length > > > vertical sync start/end, active and total length > > > 2. > > > -Most of the driver use user-supplied mode for calculating videomode > > > -However, few drivers use HW (crtc) mode for calculating videomode > > > -This helper will be useful for such drivers > > > 3. > > > -Currently following drivers will be using this new helper > > > -arm hdlcd > > > -atmel hlcdc > > > -exynos 5433 decon > > > -exynos7 decon > > > -exynos fimd > > > 4. > > > -This patch removes related duplicate code from above mentioned drivers > > > > > > Signed-off-by: Satendra Singh Thakur <satendra.t@samsung.com> > > > Cc: Madhur Verma <madhur.verma@samsung.com> > > > Cc: Hemanshu Srivastava <hemanshu.s@samsung.com> > > > --- > > > drivers/gpu/drm/arm/hdlcd_crtc.c | 8 +------- > > > drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c | 7 +------ > > > drivers/gpu/drm/drm_modes.c | 20 ++++++++++++++++++++ > > > drivers/gpu/drm/exynos/exynos5433_drm_decon.c | 22 ++++++++++------------ > > > drivers/gpu/drm/exynos/exynos7_drm_decon.c | 23 ++++++++++------------- > > > drivers/gpu/drm/exynos/exynos_drm_fimd.c | 22 +++++++++------------- > > > include/drm/drm_modes.h | 2 ++ > > > 7 files changed, 53 insertions(+), 51 deletions(-) > > > > > > diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c > > > index cf5cbd6..d20e471 100644 > > > --- a/drivers/gpu/drm/arm/hdlcd_crtc.c > > > +++ b/drivers/gpu/drm/arm/hdlcd_crtc.c > > > @@ -130,13 +130,7 @@ static void hdlcd_crtc_mode_set_nofb(struct drm_crtc *crtc) > > > struct videomode vm; > > > unsigned int polarities, err; > > > > > > - vm.vfront_porch = m->crtc_vsync_start - m->crtc_vdisplay; > > > - vm.vback_porch = m->crtc_vtotal - m->crtc_vsync_end; > > > - vm.vsync_len = m->crtc_vsync_end - m->crtc_vsync_start; > > > - vm.hfront_porch = m->crtc_hsync_start - m->crtc_hdisplay; > > > - vm.hback_porch = m->crtc_htotal - m->crtc_hsync_end; > > > - vm.hsync_len = m->crtc_hsync_end - m->crtc_hsync_start; > > > - > > > + drm_display_mode_crtc_to_videomode(m, &vm); > > > polarities = HDLCD_POLARITY_DATAEN | HDLCD_POLARITY_DATA; > > > > > > if (m->flags & DRM_MODE_FLAG_PHSYNC) > > > > For the HDLCD part: > > > > Acked-by: Liviu Dudau <liviu.dudau@arm.com> > > > > If you're not sending the final version through drm-misc then let me > > know and I can pick up the HDLCD part separately. > > > > Best regards, > > Liviu > > > > > > Hi Mr Liviu, > Thanks for accepting the patch. > I don't know how to send patch through drm-misc. > You may please go ahead and pick HDLCD part separately. Lets wait for the maintainers of other drivers to give their ACKs and then we'll sort out the submission. Usually it is just a matter of asking for the patch to be pulled from the relevant people. For drm-misc there are quite a few people and with enough patches accepted others can join too. I'll just put here some names, in no particular order, that you can ask for the patch to be pulled. Gustavo Padovan <gustavo@padovan.org> Daniel Stone <daniel@fooishbar.org> Eric Anholt <eric@anholt.net> Jani Nikula <jani.nikula@intel.com> Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Sean Paul <seanpaul@chromium.org> Daniel Vetter <daniel.vetter@intel.com> Best regards, Liviu > > Thanks > -Satendra -- ==================== | I would like to | | fix the world, | | but they're not | | giving me the | \ source code! / --------------- ¯\_(ツ)_/¯ ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v1] drm/kms/mode: added a new helper for calculating videomode from crtc's display mode 2018-05-04 7:40 ` [PATCH v1] " Satendra Singh Thakur [not found] ` <CGME20180504090214epcas5p4e9c362da6cc7b65effcc042fc4f82d2a@epcas5p4.samsung.com> @ 2018-05-04 9:41 ` Jani Nikula [not found] ` <CGME20180507033149epcas5p4b33b68a21f0883da6aa97419d5114296@epcas5p4.samsung.com> 1 sibling, 1 reply; 8+ messages in thread From: Jani Nikula @ 2018-05-04 9:41 UTC (permalink / raw) To: Satendra Singh Thakur, liviu.dudau, Brian Starkey, Mali DP Maintainers, David Airlie, Boris Brezillon, Nicolas Ferre, Alexandre Belloni, Gustavo Padovan, Maarten Lankhorst, Sean Paul, Inki Dae, Joonyoung Shim, Seung-Woo Kim, Kyungmin Park, Kukjin Kim, Krzysztof Kozlowski, dri-devel, linux-kernel, linux-arm-kernel, linux-samsung-soc Cc: madhur.verma, sst2005, Satendra Singh Thakur, Hemanshu Srivastava On Fri, 04 May 2018, Satendra Singh Thakur <satendra.t@samsung.com> wrote: > Reviewed-by: Jani Nikula <jani.nikula@linux.intel.com> No. I commented on the patch, but I never said Reviewed-by. Never assume Reviewed-by based on random comments on patches. BR, Jani. -- Jani Nikula, Intel Open Source Technology Center ^ permalink raw reply [flat|nested] 8+ messages in thread
[parent not found: <CGME20180507033149epcas5p4b33b68a21f0883da6aa97419d5114296@epcas5p4.samsung.com>]
* [PATCH v2] drm/kms/mode: added a new helper for calculating videomode from crtc's display mode [not found] ` <CGME20180507033149epcas5p4b33b68a21f0883da6aa97419d5114296@epcas5p4.samsung.com> @ 2018-05-07 3:31 ` Satendra Singh Thakur 0 siblings, 0 replies; 8+ messages in thread From: Satendra Singh Thakur @ 2018-05-07 3:31 UTC (permalink / raw) To: jani.nikula, liviu.dudau, Brian Starkey, Mali DP Maintainers, David Airlie, Boris Brezillon, Nicolas Ferre, Alexandre Belloni, Gustavo Padovan, Maarten Lankhorst, Sean Paul, Inki Dae, Joonyoung Shim, Seung-Woo Kim, Kyungmin Park, Kukjin Kim, Krzysztof Kozlowski, dri-devel, linux-kernel, linux-arm-kernel, linux-samsung-soc Cc: madhur.verma, sst2005, Satendra Singh Thakur, Hemanshu Srivastava 1. -Added a new helper drm_display_mode_crtc_to_videomode -This helper calculates mode parameters like --horizontal front_porch, back_porch, sync length --vertical front_porch, back_porch, sync length -using crtc fields of struct drm_display_mode -It uses following fields of crtc mode --horizontal sync start/end, active and total length --vertical sync start/end, active and total length 2. -Most of the driver use user-supplied mode for calculating videomode -However, few drivers use HW (crtc) mode for calculating videomode -This helper will be useful for such drivers 3. -Currently following drivers will be using this new helper -arm hdlcd -atmel hlcdc -exynos 5433 decon -exynos7 decon -exynos fimd 4. -This change reduces several redundant lines of code for many drivers Acked-by: Liviu Dudau <liviu.dudau@arm.com> Signed-off-by: Satendra Singh Thakur <satendra.t@samsung.com> Acked-by: Madhur Verma <madhur.verma@samsung.com> Cc: Hemanshu Srivastava <hemanshu.s@samsung.com> --- v2: Removed Mr Jani from Reviewed-by field drivers/gpu/drm/arm/hdlcd_crtc.c | 10 ++-------- drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c | 9 ++------- drivers/gpu/drm/drm_modes.c | 19 +++++++++++++++++++ drivers/gpu/drm/exynos/exynos5433_drm_decon.c | 22 ++++++++++------------ drivers/gpu/drm/exynos/exynos7_drm_decon.c | 23 ++++++++++------------- drivers/gpu/drm/exynos/exynos_drm_fimd.c | 22 +++++++++------------- include/drm/drm_modes.h | 2 ++ 7 files changed, 54 insertions(+), 53 deletions(-) diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c index cf5cbd6..5cec264 100644 --- a/drivers/gpu/drm/arm/hdlcd_crtc.c +++ b/drivers/gpu/drm/arm/hdlcd_crtc.c @@ -127,16 +127,10 @@ static void hdlcd_crtc_mode_set_nofb(struct drm_crtc *crtc) { struct hdlcd_drm_private *hdlcd = crtc_to_hdlcd_priv(crtc); struct drm_display_mode *m = &crtc->state->adjusted_mode; - struct videomode vm; + struct videomode vm = {}; unsigned int polarities, err; - vm.vfront_porch = m->crtc_vsync_start - m->crtc_vdisplay; - vm.vback_porch = m->crtc_vtotal - m->crtc_vsync_end; - vm.vsync_len = m->crtc_vsync_end - m->crtc_vsync_start; - vm.hfront_porch = m->crtc_hsync_start - m->crtc_hdisplay; - vm.hback_porch = m->crtc_htotal - m->crtc_hsync_end; - vm.hsync_len = m->crtc_hsync_end - m->crtc_hsync_start; - + drm_display_mode_crtc_to_videomode(m, &vm); polarities = HDLCD_POLARITY_DATAEN | HDLCD_POLARITY_DATA; if (m->flags & DRM_MODE_FLAG_PHSYNC) diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c index d732810..fb298b8 100644 --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c @@ -76,17 +76,12 @@ static void atmel_hlcdc_crtc_mode_set_nofb(struct drm_crtc *c) struct drm_display_mode *adj = &c->state->adjusted_mode; struct atmel_hlcdc_crtc_state *state; unsigned long mode_rate; - struct videomode vm; + struct videomode vm = {}; unsigned long prate; unsigned int cfg; int div; - vm.vfront_porch = adj->crtc_vsync_start - adj->crtc_vdisplay; - vm.vback_porch = adj->crtc_vtotal - adj->crtc_vsync_end; - vm.vsync_len = adj->crtc_vsync_end - adj->crtc_vsync_start; - vm.hfront_porch = adj->crtc_hsync_start - adj->crtc_hdisplay; - vm.hback_porch = adj->crtc_htotal - adj->crtc_hsync_end; - vm.hsync_len = adj->crtc_hsync_end - adj->crtc_hsync_start; + drm_display_mode_crtc_to_videomode(adj, &vm); regmap_write(regmap, ATMEL_HLCDC_CFG(1), (vm.hsync_len - 1) | ((vm.vsync_len - 1) << 16)); diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c index e82b61e..328f771 100644 --- a/drivers/gpu/drm/drm_modes.c +++ b/drivers/gpu/drm/drm_modes.c @@ -654,6 +654,25 @@ void drm_display_mode_to_videomode(const struct drm_display_mode *dmode, vm->flags |= DISPLAY_FLAGS_DOUBLECLK; } EXPORT_SYMBOL_GPL(drm_display_mode_to_videomode); +/** + * drm_display_mode_crtc_to_videomode - fill in @vm using crtc fields of @dmode + * @dmode: drm_display_mode structure to use as source + * @vm: videomode structure to use as destination + * + * Fills out @vm using the crtc display mode specified in @dmode. + */ +void drm_display_mode_crtc_to_videomode(const struct drm_display_mode *dmode, + struct videomode *vm) +{ + vm->hfront_porch = dmode->crtc_hsync_start - dmode->crtc_hdisplay; + vm->hsync_len = dmode->crtc_hsync_end - dmode->crtc_hsync_start; + vm->hback_porch = dmode->crtc_htotal - dmode->crtc_hsync_end; + vm->vfront_porch = dmode->crtc_vsync_start - dmode->crtc_vdisplay; + vm->vsync_len = dmode->crtc_vsync_end - dmode->crtc_vsync_start; + vm->vback_porch = dmode->crtc_vtotal - dmode->crtc_vsync_end; + +} +EXPORT_SYMBOL_GPL(drm_display_mode_crtc_to_videomode); /** * drm_bus_flags_from_videomode - extract information about pixelclk and diff --git a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c index 1c330f2..2535ebb 100644 --- a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c +++ b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c @@ -20,6 +20,7 @@ #include <linux/of_gpio.h> #include <linux/pm_runtime.h> #include <linux/regmap.h> +#include <video/videomode.h> #include "exynos_drm_drv.h" #include "exynos_drm_crtc.h" @@ -225,26 +226,23 @@ static void decon_commit(struct exynos_drm_crtc *crtc) writel(val, ctx->addr + DECON_VIDTCON2); if (!crtc->i80_mode) { - int vbp = m->crtc_vtotal - m->crtc_vsync_end; - int vfp = m->crtc_vsync_start - m->crtc_vdisplay; + struct videomode vm = {}; + drm_display_mode_crtc_to_videomode(m, &vm); if (interlaced) - vbp = vbp / 2 - 1; - val = VIDTCON00_VBPD_F(vbp - 1) | VIDTCON00_VFPD_F(vfp - 1); + vm.vback_porch = (vm.vback_porch >> 1) - 1; + val = VIDTCON00_VBPD_F(vm.vback_porch - 1) | + VIDTCON00_VFPD_F(vm.vfront_porch - 1); writel(val, ctx->addr + DECON_VIDTCON00); - val = VIDTCON01_VSPW_F( - m->crtc_vsync_end - m->crtc_vsync_start - 1); + val = VIDTCON01_VSPW_F(vm.vsync_len - 1); writel(val, ctx->addr + DECON_VIDTCON01); - val = VIDTCON10_HBPD_F( - m->crtc_htotal - m->crtc_hsync_end - 1) | - VIDTCON10_HFPD_F( - m->crtc_hsync_start - m->crtc_hdisplay - 1); + val = VIDTCON10_HBPD_F(vm.hback_porch - 1) | + VIDTCON10_HFPD_F(vm.hfront_porch - 1); writel(val, ctx->addr + DECON_VIDTCON10); - val = VIDTCON11_HSPW_F( - m->crtc_hsync_end - m->crtc_hsync_start - 1); + val = VIDTCON11_HSPW_F(vm.hsync_len - 1); writel(val, ctx->addr + DECON_VIDTCON11); } diff --git a/drivers/gpu/drm/exynos/exynos7_drm_decon.c b/drivers/gpu/drm/exynos/exynos7_drm_decon.c index 3931d5e..5fdd093 100644 --- a/drivers/gpu/drm/exynos/exynos7_drm_decon.c +++ b/drivers/gpu/drm/exynos/exynos7_drm_decon.c @@ -25,6 +25,7 @@ #include <video/of_display_timing.h> #include <video/of_videomode.h> +#include <video/videomode.h> #include "exynos_drm_crtc.h" #include "exynos_drm_plane.h" @@ -168,28 +169,24 @@ static void decon_commit(struct exynos_drm_crtc *crtc) return; if (!ctx->i80_if) { - int vsync_len, vbpd, vfpd, hsync_len, hbpd, hfpd; + struct videomode vm = {}; + + drm_display_mode_crtc_to_videomode(mode, &vm); /* setup vertical timing values. */ - vsync_len = mode->crtc_vsync_end - mode->crtc_vsync_start; - vbpd = mode->crtc_vtotal - mode->crtc_vsync_end; - vfpd = mode->crtc_vsync_start - mode->crtc_vdisplay; - val = VIDTCON0_VBPD(vbpd - 1) | VIDTCON0_VFPD(vfpd - 1); + val = VIDTCON0_VBPD(vm.vback_porch - 1) | + VIDTCON0_VFPD(vm.vfront_porch - 1); writel(val, ctx->regs + VIDTCON0); - val = VIDTCON1_VSPW(vsync_len - 1); + val = VIDTCON1_VSPW(vm.vsync_len - 1); writel(val, ctx->regs + VIDTCON1); /* setup horizontal timing values. */ - hsync_len = mode->crtc_hsync_end - mode->crtc_hsync_start; - hbpd = mode->crtc_htotal - mode->crtc_hsync_end; - hfpd = mode->crtc_hsync_start - mode->crtc_hdisplay; - - /* setup horizontal timing values. */ - val = VIDTCON2_HBPD(hbpd - 1) | VIDTCON2_HFPD(hfpd - 1); + val = VIDTCON2_HBPD(vm.hback_porch - 1) | + VIDTCON2_HFPD(vm.hfront_porch - 1); writel(val, ctx->regs + VIDTCON2); - val = VIDTCON3_HSPW(hsync_len - 1); + val = VIDTCON3_HSPW(vm.hsync_len - 1); writel(val, ctx->regs + VIDTCON3); } diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index d42ae2b..c70b9ec 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c @@ -25,6 +25,7 @@ #include <video/of_display_timing.h> #include <video/of_videomode.h> +#include <video/videomode.h> #include <video/samsung_fimd.h> #include <drm/exynos_drm.h> @@ -463,7 +464,7 @@ static void fimd_commit(struct exynos_drm_crtc *crtc) return; } } else { - int vsync_len, vbpd, vfpd, hsync_len, hbpd, hfpd; + struct videomode vm = {}; u32 vidcon1; /* setup polarity values */ @@ -474,24 +475,19 @@ static void fimd_commit(struct exynos_drm_crtc *crtc) vidcon1 |= VIDCON1_INV_HSYNC; writel(vidcon1, ctx->regs + driver_data->timing_base + VIDCON1); + drm_display_mode_crtc_to_videomode(mode, &vm); /* setup vertical timing values. */ - vsync_len = mode->crtc_vsync_end - mode->crtc_vsync_start; - vbpd = mode->crtc_vtotal - mode->crtc_vsync_end; - vfpd = mode->crtc_vsync_start - mode->crtc_vdisplay; - val = VIDTCON0_VBPD(vbpd - 1) | - VIDTCON0_VFPD(vfpd - 1) | - VIDTCON0_VSPW(vsync_len - 1); + val = VIDTCON0_VBPD(vm.vback_porch - 1) | + VIDTCON0_VFPD(vm.vfront_porch - 1) | + VIDTCON0_VSPW(vm.vsync_len - 1); writel(val, ctx->regs + driver_data->timing_base + VIDTCON0); /* setup horizontal timing values. */ - hsync_len = mode->crtc_hsync_end - mode->crtc_hsync_start; - hbpd = mode->crtc_htotal - mode->crtc_hsync_end; - hfpd = mode->crtc_hsync_start - mode->crtc_hdisplay; - val = VIDTCON1_HBPD(hbpd - 1) | - VIDTCON1_HFPD(hfpd - 1) | - VIDTCON1_HSPW(hsync_len - 1); + val = VIDTCON1_HBPD(vm.hback_porch - 1) | + VIDTCON1_HFPD(vm.hfront_porch - 1) | + VIDTCON1_HSPW(vm.hsync_len - 1); writel(val, ctx->regs + driver_data->timing_base + VIDTCON1); } diff --git a/include/drm/drm_modes.h b/include/drm/drm_modes.h index 0d310be..9ac764b 100644 --- a/include/drm/drm_modes.h +++ b/include/drm/drm_modes.h @@ -473,6 +473,8 @@ void drm_display_mode_from_videomode(const struct videomode *vm, struct drm_display_mode *dmode); void drm_display_mode_to_videomode(const struct drm_display_mode *dmode, struct videomode *vm); +void drm_display_mode_crtc_to_videomode(const struct drm_display_mode *dmode, + struct videomode *vm); void drm_bus_flags_from_videomode(const struct videomode *vm, u32 *bus_flags); int of_get_drm_display_mode(struct device_node *np, struct drm_display_mode *dmode, u32 *bus_flags, -- 2.7.4 ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2018-05-07 3:31 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- [not found] <CGME20180503055902epcas5p2eea7b9f58dc630e60fb28c8fc2ffad7b@epcas5p2.samsung.com> 2018-05-03 5:58 ` [PATCH] drm/kms/mode: added a new helper for calculating videomode from crtc's display mode Satendra Singh Thakur 2018-05-03 8:02 ` Jani Nikula 2018-05-03 10:36 ` Liviu Dudau [not found] ` <CGME20180504074013epcas5p4564cb7043e1875154469052d097848db@epcas5p4.samsung.com> 2018-05-04 7:40 ` [PATCH v1] " Satendra Singh Thakur [not found] ` <CGME20180504090214epcas5p4e9c362da6cc7b65effcc042fc4f82d2a@epcas5p4.samsung.com> 2018-05-04 9:02 ` Satendra Singh Thakur 2018-05-04 9:38 ` Liviu Dudau 2018-05-04 9:41 ` Jani Nikula [not found] ` <CGME20180507033149epcas5p4b33b68a21f0883da6aa97419d5114296@epcas5p4.samsung.com> 2018-05-07 3:31 ` [PATCH v2] " Satendra Singh Thakur
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).