Re: [PATCH v10 02/17] drm/exynos: use adjusted_mode of crtc_state instead of mode

Tobias Jakobi
2015-06-01T15:09:18Z

Hello,

as pointed out in [1] before, this gives me an kernel oops during boot.

With best wishes,
Tobias

[1] http://www.spinics.net/lists/linux-samsung-soc/msg44736.html

On 2015-06-01 17:04, Gustavo Padovan wrote:
> From: Joonyoung Shim <jy0922.shim@samsung.com>
>
> Handle changes by removing copy from adjusted_mode to mode as using
> adjusted_mode of crtc_state.
>
> Signed-off-by: Joonyoung Shim <jy0922.shim@samsung.com>
> ---
> drivers/gpu/drm/exynos/exynos7_drm_decon.c | 4 ++--
> drivers/gpu/drm/exynos/exynos_drm_fimd.c | 2 +-
> drivers/gpu/drm/exynos/exynos_drm_plane.c | 13 +++++++------
> 3 files changed, 10 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/exynos/exynos7_drm_decon.c
> b/drivers/gpu/drm/exynos/exynos7_drm_decon.c
> index 6714e5b..f29e4be 100644
> --- a/drivers/gpu/drm/exynos/exynos7_drm_decon.c
> +++ b/drivers/gpu/drm/exynos/exynos7_drm_decon.c
> @@ -175,7 +175,7 @@ static bool decon_mode_fixup(struct exynos_drm_crtc
> *crtc,
> static void decon_commit(struct exynos_drm_crtc *crtc)
> {
> struct decon_context *ctx = crtc->ctx;
> - struct drm_display_mode *mode = &crtc->base.mode;
> + struct drm_display_mode *mode = &crtc->base.state->adjusted_mode;
> u32 val, clkdiv;
>
> if (ctx->suspended)
> @@ -395,7 +395,7 @@ static void decon_shadow_protect_win(struct
> decon_context *ctx,
> static void decon_win_commit(struct exynos_drm_crtc *crtc, unsigned
> int win)
> {
> struct decon_context *ctx = crtc->ctx;
> - struct drm_display_mode *mode = &crtc->base.mode;
> + struct drm_display_mode *mode = &crtc->base.state->adjusted_mode;
> struct exynos_drm_plane *plane;
> int padding;
> unsigned long val, alpha;
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> index a0edab8..b326b31 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> @@ -337,7 +337,7 @@ static bool fimd_mode_fixup(struct exynos_drm_crtc
> *crtc,
> static void fimd_commit(struct exynos_drm_crtc *crtc)
> {
> struct fimd_context *ctx = crtc->ctx;
> - struct drm_display_mode *mode = &crtc->base.mode;
> + struct drm_display_mode *mode = &crtc->base.state->adjusted_mode;
> struct fimd_driver_data *driver_data = ctx->driver_data;
> void *timing_base = ctx->regs + driver_data->timing_base;
> u32 val, clkdiv;
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_plane.c
> b/drivers/gpu/drm/exynos/exynos_drm_plane.c
> index b1180fb..01d2918 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_plane.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_plane.c
> @@ -92,11 +92,12 @@ void exynos_plane_mode_set(struct drm_plane
> *plane, struct drm_crtc *crtc,
> uint32_t src_w, uint32_t src_h)
> {
> struct exynos_drm_plane *exynos_plane = to_exynos_plane(plane);
> + struct drm_display_mode *mode = &crtc->state->adjusted_mode;
> unsigned int actual_w;
> unsigned int actual_h;
>
> - actual_w = exynos_plane_get_size(crtc_x, crtc_w,
> crtc->mode.hdisplay);
> - actual_h = exynos_plane_get_size(crtc_y, crtc_h,
> crtc->mode.vdisplay);
> + actual_w = exynos_plane_get_size(crtc_x, crtc_w, mode->hdisplay);
> + actual_h = exynos_plane_get_size(crtc_y, crtc_h, mode->vdisplay);
>
> if (crtc_x < 0) {
> if (actual_w)
> @@ -132,10 +133,10 @@ void exynos_plane_mode_set(struct drm_plane
> *plane, struct drm_crtc *crtc,
> exynos_plane->crtc_height = actual_h;
>
> /* set drm mode data. */
> - exynos_plane->mode_width = crtc->mode.hdisplay;
> - exynos_plane->mode_height = crtc->mode.vdisplay;
> - exynos_plane->refresh = crtc->mode.vrefresh;
> - exynos_plane->scan_flag = crtc->mode.flags;
> + exynos_plane->mode_width = mode->hdisplay;
> + exynos_plane->mode_height = mode->vdisplay;
> + exynos_plane->refresh = mode->vrefresh;
> + exynos_plane->scan_flag = mode->flags;
>
> DRM_DEBUG_KMS("plane : offset_x/y(%d,%d), width/height(%d,%d)",
> exynos_plane->crtc_x, exynos_plane->crtc_y,