Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp6529pxk; Tue, 1 Sep 2020 14:31:23 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzomW83H2vwa5kK3mfgOdNK/phuGVDmB0FIB9kJfN5bphAcekPDn/5EYtEJc0T7PLtEIpxR X-Received: by 2002:a17:906:6a84:: with SMTP id p4mr3594883ejr.374.1598995883371; Tue, 01 Sep 2020 14:31:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1598995883; cv=none; d=google.com; s=arc-20160816; b=RORU1HqgDbL+yd/e98E6pwTINb8nVpaTDt8HWmOiJWrjeCh78GtREXF5SgK2hRWyVu 1CQWrm7mnHq4EvHxa0kPsGkxCWCc/rVrfDKX/lRiEuMdozMP5z0FRfUOM4x9/cMVRMGq e5UNveOH5GEUDPmFX9VZT8S46AZ9lyKGb/l0PHig+G/d1xLdF2Yca2+k2RVEyMG/t8vs mq2vPp1lLKofGHK3EJ49miGGaThf7nzZhw5ffv3RJjSIcL3gDfVn2TvWeVGaXW1fh5HO OlFP2z+Y7Inl7BEHOuLHDTsp79I2v8SLf5Y8NDQrJsAuMAGPCICzKtJEoGisqdyAOHPD DUww== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:in-reply-to:content-disposition :mime-version:references:mail-followup-to:message-id:subject:cc:to :from:date:dkim-signature; bh=dGUvOi9Vaj06t27lkMmtr1iPujDl9iMrIhGl6HTNHFk=; b=NJLBcw3/PCHD0LaXq3mFJLL18HX0yydhS900tTaYOeftNEppLLfpMbOY/QGZa9WsPF coN2reZkQ8JaWtSY3ep8g3dgXamRXsI4+UPoB+GjHug78sB0xlTfCEI+uuts5d/nWO2X XzB7fF4OwvXUGem1E6BawGeFbUOvsfQsRnL3OAkikUfYr1eakpkIwkvOjfetTTcpolqA 9Af8vZKTgUrAFzUpcjwZbizRNMLn4e5XnZCc3wcMT3k08r5RRj4PZYVmFXguE6iK1WYt W3s6tamRTxXJCG/O+GTjP7WcOVn3Bqjox0GtO8yi3zCDZZdSc1bjDKtE7W/A5ybYyaXf 0fQQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@megous.com header.s=mail header.b=Qs6nD3Id; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=megous.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id v22si1421997ejb.444.2020.09.01.14.30.56; Tue, 01 Sep 2020 14:31:23 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@megous.com header.s=mail header.b=Qs6nD3Id; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=megous.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728254AbgIAV3d (ORCPT + 99 others); Tue, 1 Sep 2020 17:29:33 -0400 Received: from vps.xff.cz ([195.181.215.36]:55512 "EHLO vps.xff.cz" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726892AbgIAV3b (ORCPT ); Tue, 1 Sep 2020 17:29:31 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=megous.com; s=mail; t=1598995769; bh=UVR0IHel+T0FWD7dA6eVPkZHb0vUQx1w3OEGve81MbY=; h=Date:From:To:Cc:Subject:References:X-My-GPG-KeyId:From; b=Qs6nD3IdWHH9RKN0XHSGx20Q9atSLEZgl3gxccoBuJDBaNfP+9OmD+Yja29dOvb8p OucJvB6eT8G3diKV0BFoIPH6n+dMzsBTjD0fQ46ucRrOHOzaABJGdzgBOw75fqLLYr cKo52rRA2qAZSz4r4iJTy+8uXb92ftIguYYzD/GU= Date: Tue, 1 Sep 2020 23:29:29 +0200 From: =?utf-8?Q?Ond=C5=99ej?= Jirman To: Roman Stratiienko Cc: jernej.skrabec@siol.net, jernej.skrabec@gmail.com, linux-sunxi@googlegroups.com, dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH] RFC: sun4i/drm: Swap back U and V channels for DRM_FORMAT_YVU4xx Message-ID: <20200901212929.xty2pvn3w4d5tkg4@core.my.home> Mail-Followup-To: =?utf-8?Q?Ond=C5=99ej?= Jirman , Roman Stratiienko , jernej.skrabec@siol.net, jernej.skrabec@gmail.com, linux-sunxi@googlegroups.com, dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org References: <20200901203047.1110851-1-r.stratiienko@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20200901203047.1110851-1-r.stratiienko@gmail.com> X-My-GPG-KeyId: EBFBDDE11FB918D44D1F56C1F9F0A873BE9777ED Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Sep 01, 2020 at 11:30:47PM +0300, Roman Stratiienko wrote: > Fixes: e1ef9006663b ("drm/sun4i: Wire in DE2 YUV support") > Signed-off-by: Roman Stratiienko > > --- > CC: megous@megous.com > CC: jernej.skrabec@gmail.com > CC: linux-sunxi@googlegroups.com > CC: dri-devel@lists.freedesktop.org > CC: linux-arm-kernel@lists.infradead.org > CC: linux-kernel@vger.kernel.org > > Hi, this patch fixes wrong colors during video playback for me. > Implemented ugly for now, please review/suggest how to improve. Why do you think the issue is at DRM level? Have you tried displaying a known color image via a vi layer, and was it wrong? I used DRM with YUV data in the past, and didn't notice any weird colors, so I'm a bit skeptical. regards, o. > --- > drivers/gpu/drm/sun4i/sun8i_mixer.c | 8 +++++++- > drivers/gpu/drm/sun4i/sun8i_mixer.h | 2 +- > drivers/gpu/drm/sun4i/sun8i_ui_layer.c | 2 +- > drivers/gpu/drm/sun4i/sun8i_vi_layer.c | 28 +++++++++++++++++++------- > 4 files changed, 30 insertions(+), 10 deletions(-) > > diff --git a/drivers/gpu/drm/sun4i/sun8i_mixer.c b/drivers/gpu/drm/sun4i/sun8i_mixer.c > index dce40c430100..bbbeef44899a 100644 > --- a/drivers/gpu/drm/sun4i/sun8i_mixer.c > +++ b/drivers/gpu/drm/sun4i/sun8i_mixer.c > @@ -31,6 +31,7 @@ > struct de2_fmt_info { > u32 drm_fmt; > u32 de2_fmt; > + bool swap_uv; > }; > > static bool hw_preconfigured; > @@ -219,14 +220,17 @@ static const struct de2_fmt_info de2_formats[] = { > { > .drm_fmt = DRM_FORMAT_YVU422, > .de2_fmt = SUN8I_MIXER_FBFMT_YUV422, > + .swap_uv = true, > }, > { > .drm_fmt = DRM_FORMAT_YVU420, > .de2_fmt = SUN8I_MIXER_FBFMT_YUV420, > + .swap_uv = true, > }, > { > .drm_fmt = DRM_FORMAT_YVU411, > .de2_fmt = SUN8I_MIXER_FBFMT_YUV411, > + .swap_uv = true, > }, > { > .drm_fmt = DRM_FORMAT_P010, > @@ -238,13 +242,15 @@ static const struct de2_fmt_info de2_formats[] = { > }, > }; > > -int sun8i_mixer_drm_format_to_hw(u32 format, u32 *hw_format) > +int sun8i_mixer_drm_format_to_hw(u32 format, u32 *hw_format, bool *swap_uv) > { > unsigned int i; > > for (i = 0; i < ARRAY_SIZE(de2_formats); ++i) > if (de2_formats[i].drm_fmt == format) { > *hw_format = de2_formats[i].de2_fmt; > + if (swap_uv) > + *swap_uv = de2_formats[i].swap_uv; > return 0; > } > > diff --git a/drivers/gpu/drm/sun4i/sun8i_mixer.h b/drivers/gpu/drm/sun4i/sun8i_mixer.h > index 79a74bca1ea3..6358ffd251f9 100644 > --- a/drivers/gpu/drm/sun4i/sun8i_mixer.h > +++ b/drivers/gpu/drm/sun4i/sun8i_mixer.h > @@ -207,5 +207,5 @@ sun8i_channel_base(struct sun8i_mixer *mixer, int channel) > return DE2_CH_BASE + channel * DE2_CH_SIZE; > } > > -int sun8i_mixer_drm_format_to_hw(u32 format, u32 *hw_format); > +int sun8i_mixer_drm_format_to_hw(u32 format, u32 *hw_format, bool *swap_uv); > #endif /* _SUN8I_MIXER_H_ */ > diff --git a/drivers/gpu/drm/sun4i/sun8i_ui_layer.c b/drivers/gpu/drm/sun4i/sun8i_ui_layer.c > index a7f21f08ec89..57bbd9f1071c 100644 > --- a/drivers/gpu/drm/sun4i/sun8i_ui_layer.c > +++ b/drivers/gpu/drm/sun4i/sun8i_ui_layer.c > @@ -215,7 +215,7 @@ static int sun8i_ui_layer_update_formats(struct sun8i_mixer *mixer, int channel, > ch_base = sun8i_channel_base(mixer, channel); > > fmt = state->fb->format; > - ret = sun8i_mixer_drm_format_to_hw(fmt->format, &hw_fmt); > + ret = sun8i_mixer_drm_format_to_hw(fmt->format, &hw_fmt, NULL); > if (ret || fmt->is_yuv) { > DRM_DEBUG_DRIVER("Invalid format\n"); > return -EINVAL; > diff --git a/drivers/gpu/drm/sun4i/sun8i_vi_layer.c b/drivers/gpu/drm/sun4i/sun8i_vi_layer.c > index 3553e38ec642..4da51155c4d5 100644 > --- a/drivers/gpu/drm/sun4i/sun8i_vi_layer.c > +++ b/drivers/gpu/drm/sun4i/sun8i_vi_layer.c > @@ -313,7 +313,7 @@ static int sun8i_vi_layer_update_formats(struct sun8i_mixer *mixer, int channel, > ch_base = sun8i_channel_base(mixer, channel); > > fmt = state->fb->format; > - ret = sun8i_mixer_drm_format_to_hw(fmt->format, &hw_fmt); > + ret = sun8i_mixer_drm_format_to_hw(fmt->format, &hw_fmt, NULL); > if (ret) { > DRM_DEBUG_DRIVER("Invalid format\n"); > return ret; > @@ -368,8 +368,17 @@ static int sun8i_vi_layer_update_buffer(struct sun8i_mixer *mixer, int channel, > struct drm_gem_cma_object *gem; > u32 dx, dy, src_x, src_y; > dma_addr_t paddr; > + bool swap_uv; > u32 ch_base; > - int i; > + u32 hw_fmt; > + int ret; > + int i, j; > + > + ret = sun8i_mixer_drm_format_to_hw(plane->state->fb->format->format, &hw_fmt, &swap_uv); > + if (ret) { > + DRM_DEBUG_DRIVER("Invalid format\n"); > + return ret; > + } > > ch_base = sun8i_channel_base(mixer, channel); > > @@ -377,7 +386,12 @@ static int sun8i_vi_layer_update_buffer(struct sun8i_mixer *mixer, int channel, > src_x = (state->src.x1 >> 16) & ~(format->hsub - 1); > src_y = (state->src.y1 >> 16) & ~(format->vsub - 1); > > - for (i = 0; i < format->num_planes; i++) { > + for (j = 0; j < format->num_planes; j++) { > + i = j; > + if (swap_uv && i > 0 && format->num_planes == 3) { > + i = j == 1 ? 2 : 1; > + } > + > /* Get the physical address of the buffer in memory */ > gem = drm_fb_cma_get_gem_obj(fb, i); > > @@ -400,18 +414,18 @@ static int sun8i_vi_layer_update_buffer(struct sun8i_mixer *mixer, int channel, > > /* Set the line width */ > DRM_DEBUG_DRIVER("Layer %d. line width: %d bytes\n", > - i + 1, fb->pitches[i]); > + j + 1, fb->pitches[i]); > regmap_write(mixer->engine.regs, > SUN8I_MIXER_CHAN_VI_LAYER_PITCH(ch_base, > - overlay, i), > + overlay, j), > fb->pitches[i]); > > DRM_DEBUG_DRIVER("Setting %d. buffer address to %pad\n", > - i + 1, &paddr); > + j + 1, &paddr); > > regmap_write(mixer->engine.regs, > SUN8I_MIXER_CHAN_VI_LAYER_TOP_LADDR(ch_base, > - overlay, i), > + overlay, j), > lower_32_bits(paddr)); > } > > -- > 2.25.1 >