Received: by 10.213.65.68 with SMTP id h4csp249267imn; Fri, 23 Mar 2018 03:55:23 -0700 (PDT) X-Google-Smtp-Source: AG47ELsG7lh2ave+zx3aLxDS7AD24NxNmsVQ6Wo0vtwAn+sNjzcbCTryhfv7Q3CSHgdIpdkeKP7h X-Received: by 2002:a17:902:1744:: with SMTP id i62-v6mr10765086pli.62.1521802523020; Fri, 23 Mar 2018 03:55:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1521802522; cv=none; d=google.com; s=arc-20160816; b=wHWBYQ8rm1+q0C9oINFURPQBYTHtJ7ajZeVUO854VtTODxmadx94xhExE0yqFXpPcX AI5WmVfaarTZMkQ4aFmOCARaIaMOYbQqfqN2w1Weq2mSJRXDCHeEX3Fs1Za+qMlVj8wz 6bdSz+1cBgrN1SpVD9FTSE9qyceLWAVtr+4SoEr1KPbCRAPJEqf8L5r2yGn85AUcw0Yw EBR6ZwI8VrSIXil08qhUziNLg/acYWRjhBgkiW2Uw4ohJnCtSoqy9JhoEVu8qtctQ1nG n4w16h4faLeia66q3+Xpz7iyJGoYGupBmKz///S/VL/VCJ2bbbwLVRUytnc+uGyzxUrd /CPQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-transfer-encoding:content-disposition:mime-version :references:message-id:subject:cc:to:from:date :arc-authentication-results; bh=d3KZ1v+5/R3klex5/6WI71tXBy770L9dzxrgv2dFqqY=; b=Y34UTSkgaU/FLRpeLQmZa0sHkEB59/R4pwYHNqSNK9rpMWiJ+0mgN9+sEHKaFBp+fW E9kAGrfuOquUrnUuU6zUCEjNvvfi2hrwXn2gFYRc/fzy1ExE3DFPudtpyJdScyJEJNM1 9G8G4fUFwa6IkRzESepTvLWrPsrv3IG3vDJ346u6WfTCFmRsqKcYwyCKASIpJzWNV5Oq Q15IJEKL/jK0K45D8A5SXtewmA4f0nhiNgPNdJV1AROt9+Ur7bBvJa5NnUkwAO+tU9Mv Zzi/S0uwQXBYRAmTrmH1UmiYWBPspogBGZpLfgiTzqvZFNV4Qhl99wyQbOeK/7s73wLV CMLA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id x6si5966777pgq.260.2018.03.23.03.55.08; Fri, 23 Mar 2018 03:55:22 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755600AbeCWKxC convert rfc822-to-8bit (ORCPT + 99 others); Fri, 23 Mar 2018 06:53:02 -0400 Received: from mail.bootlin.com ([62.4.15.54]:41026 "EHLO mail.bootlin.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753331AbeCWKNw (ORCPT ); Fri, 23 Mar 2018 06:13:52 -0400 Received: by mail.bootlin.com (Postfix, from userid 110) id 93AFC20858; Fri, 23 Mar 2018 11:13:49 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on mail.bootlin.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=ALL_TRUSTED,SHORTCIRCUIT, URIBL_BLOCKED shortcircuit=ham autolearn=disabled version=3.4.0 Received: from localhost (unknown [212.77.163.108]) by mail.bootlin.com (Postfix) with ESMTPSA id E847C2046F; Fri, 23 Mar 2018 11:13:38 +0100 (CET) Date: Fri, 23 Mar 2018 11:13:38 +0100 From: Maxime Ripard To: Paul Kocialkowski Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, David Airlie , Chen-Yu Tsai , Daniel Vetter , Gustavo Padovan , Sean Paul Subject: Re: [PATCH 06/10] drm/sun4i: Move and extend format-related helpers and tables Message-ID: <20180323101338.z422gpxcsdre5hgj@flea> References: <20180321152904.22411-1-paul.kocialkowski@bootlin.com> <20180321152904.22411-7-paul.kocialkowski@bootlin.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: 8BIT In-Reply-To: <20180321152904.22411-7-paul.kocialkowski@bootlin.com> User-Agent: NeoMutt/20180223 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Mar 21, 2018 at 04:29:00PM +0100, Paul Kocialkowski wrote: > This moves the various helpers and tables related to format detection > and conversion to a dedicated file, while adding a bunch of new helpers > (especially for YUV and tiling support) along the way. The addition of new helpers should be in a separate patch. > Signed-off-by: Paul Kocialkowski > --- > drivers/gpu/drm/sun4i/Makefile | 1 + > drivers/gpu/drm/sun4i/sun4i_backend.c | 54 ++-------- > drivers/gpu/drm/sun4i/sun4i_format.c | 193 ++++++++++++++++++++++++++++++++++ > drivers/gpu/drm/sun4i/sun4i_format.h | 35 ++++++ > 4 files changed, 235 insertions(+), 48 deletions(-) > create mode 100644 drivers/gpu/drm/sun4i/sun4i_format.c > create mode 100644 drivers/gpu/drm/sun4i/sun4i_format.h > > diff --git a/drivers/gpu/drm/sun4i/Makefile b/drivers/gpu/drm/sun4i/Makefile > index 582607c0c488..c89c42ff803e 100644 > --- a/drivers/gpu/drm/sun4i/Makefile > +++ b/drivers/gpu/drm/sun4i/Makefile > @@ -4,6 +4,7 @@ sun4i-frontend-y += sun4i_frontend.o > > sun4i-drm-y += sun4i_drv.o > sun4i-drm-y += sun4i_framebuffer.o > +sun4i-drm-y += sun4i_format.o > > sun4i-drm-hdmi-y += sun4i_hdmi_ddc_clk.o > sun4i-drm-hdmi-y += sun4i_hdmi_enc.o > diff --git a/drivers/gpu/drm/sun4i/sun4i_backend.c b/drivers/gpu/drm/sun4i/sun4i_backend.c > index 1fad0714c70e..e8af9f3cf20b 100644 > --- a/drivers/gpu/drm/sun4i/sun4i_backend.c > +++ b/drivers/gpu/drm/sun4i/sun4i_backend.c > @@ -29,6 +29,7 @@ > #include "sun4i_drv.h" > #include "sun4i_frontend.h" > #include "sun4i_layer.h" > +#include "sun4i_format.h" > #include "sunxi_engine.h" > > struct sun4i_backend_quirks { > @@ -36,50 +37,6 @@ struct sun4i_backend_quirks { > bool needs_output_muxing; > }; > > -static const u32 sunxi_rgb2yuv_coef[12] = { > - 0x00000107, 0x00000204, 0x00000064, 0x00000108, > - 0x00003f69, 0x00003ed6, 0x000001c1, 0x00000808, > - 0x000001c1, 0x00003e88, 0x00003fb8, 0x00000808 > -}; > - > -static const u32 sunxi_bt601_yuv2rgb_coef[12] = { > - 0x000004a7, 0x00001e6f, 0x00001cbf, 0x00000877, > - 0x000004a7, 0x00000000, 0x00000662, 0x00003211, > - 0x000004a7, 0x00000812, 0x00000000, 0x00002eb1, > -}; > - > -static inline bool sun4i_backend_format_is_planar_yuv(uint32_t format) > -{ > - switch (format) { > - case DRM_FORMAT_YUV411: > - case DRM_FORMAT_YUV422: > - case DRM_FORMAT_YUV444: > - return true; > - default: > - return false; > - } > -} > - > -static inline bool sun4i_backend_format_is_packed_yuv422(uint32_t format) > -{ > - switch (format) { > - case DRM_FORMAT_YUYV: > - case DRM_FORMAT_YVYU: > - case DRM_FORMAT_UYVY: > - case DRM_FORMAT_VYUY: > - return true; > - > - default: > - return false; > - } > -} > - > -static inline bool sun4i_backend_format_is_yuv(uint32_t format) > -{ > - return sun4i_backend_format_is_planar_yuv(format) || > - sun4i_backend_format_is_packed_yuv422(format); > -} > - > static void sun4i_backend_apply_color_correction(struct sunxi_engine *engine) > { > int i; > @@ -259,7 +216,7 @@ static int sun4i_backend_update_yuv_format(struct sun4i_backend *backend, > SUN4I_BACKEND_ATTCTL_REG0_LAY_YUVEN, > SUN4I_BACKEND_ATTCTL_REG0_LAY_YUVEN); > > - if (sun4i_backend_format_is_packed_yuv422(format)) > + if (sun4i_format_is_packed_yuv422(format)) > val |= SUN4I_BACKEND_IYUVCTL_FBFMT_PACKED_YUV422; > else > DRM_DEBUG_DRIVER("Unknown YUV format\n"); > @@ -310,7 +267,7 @@ int sun4i_backend_update_layer_formats(struct sun4i_backend *backend, > DRM_DEBUG_DRIVER("Switching display backend interlaced mode %s\n", > interlaced ? "on" : "off"); > > - if (sun4i_backend_format_is_yuv(fb->format->format)) > + if (sun4i_format_is_yuv(fb->format->format)) > return sun4i_backend_update_yuv_format(backend, layer, plane); > > ret = sun4i_backend_drm_format_to_layer(fb->format->format, &val); > @@ -404,7 +361,7 @@ int sun4i_backend_update_layer_buffer(struct sun4i_backend *backend, > */ > paddr -= PHYS_OFFSET; > > - if (sun4i_backend_format_is_yuv(fb->format->format)) > + if (sun4i_format_is_yuv(fb->format->format)) > return sun4i_backend_update_yuv_buffer(backend, fb, paddr); > > /* Write the 32 lower bits of the address (in bits) */ > @@ -549,10 +506,11 @@ static int sun4i_backend_atomic_check(struct sunxi_engine *engine, > DRM_DEBUG_DRIVER("Plane FB format is %s\n", > drm_get_format_name(fb->format->format, > &format_name)); > + > if (fb->format->has_alpha) > num_alpha_planes++; > > - if (sun4i_backend_format_is_yuv(fb->format->format)) { > + if (sun4i_format_is_yuv(fb->format->format)) { > DRM_DEBUG_DRIVER("Plane FB format is YUV\n"); > num_yuv_planes++; > } > diff --git a/drivers/gpu/drm/sun4i/sun4i_format.c b/drivers/gpu/drm/sun4i/sun4i_format.c > new file mode 100644 > index 000000000000..3830767e6d5b > --- /dev/null > +++ b/drivers/gpu/drm/sun4i/sun4i_format.c > @@ -0,0 +1,193 @@ > +/* > + * Copyright (C) 2015-2018 Free Electrons/Bootlin > + * > + * Maxime Ripard > + * Paul Kocialkowski > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License as > + * published by the Free Software Foundation; either version 2 of > + * the License, or (at your option) any later version. > + */ > + > +#include > +#include > +#include > +#include > + > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include "sun4i_drv.h" > +#include "sun4i_format.h" I guess a lot of these headers are not needed. > + > +const u32 sunxi_rgb2yuv_coef[12] = { > + 0x00000107, 0x00000204, 0x00000064, 0x00000108, > + 0x00003f69, 0x00003ed6, 0x000001c1, 0x00000808, > + 0x000001c1, 0x00003e88, 0x00003fb8, 0x00000808 > +}; > + > +const u32 sunxi_bt601_yuv2rgb_coef[12] = { > + 0x000004a7, 0x00001e6f, 0x00001cbf, 0x00000877, > + 0x000004a7, 0x00000000, 0x00000662, 0x00003211, > + 0x000004a7, 0x00000812, 0x00000000, 0x00002eb1, > +}; > + > +bool sun4i_format_is_rgb(uint32_t format) > +{ > + switch (format) { > + case DRM_FORMAT_ARGB4444: > + case DRM_FORMAT_RGBA4444: > + case DRM_FORMAT_ARGB1555: > + case DRM_FORMAT_RGBA5551: > + case DRM_FORMAT_RGB888: > + case DRM_FORMAT_RGB565: > + case DRM_FORMAT_XRGB8888: > + case DRM_FORMAT_ARGB8888: > + return true; > + > + default: > + return false; > + } > +} > + > +bool sun4i_format_is_yuv(uint32_t format) > +{ > + return sun4i_format_is_yuv411(format) || > + sun4i_format_is_yuv420(format) || > + sun4i_format_is_yuv422(format) || > + sun4i_format_is_yuv444(format); > +} > + > +bool sun4i_format_is_yuv411(uint32_t format) > +{ > + switch (format) { > + case DRM_FORMAT_YUV411: > + case DRM_FORMAT_YVU411: > + return true; > + > + default: > + return false; > + } > +} > + > +bool sun4i_format_is_yuv420(uint32_t format) > +{ > + switch (format) { > + case DRM_FORMAT_NV12: > + case DRM_FORMAT_NV21: > + case DRM_FORMAT_YUV420: > + case DRM_FORMAT_YVU420: > + return true; > + > + default: > + return false; > + } > +} > + > +bool sun4i_format_is_yuv422(uint32_t format) > +{ > + switch (format) { > + case DRM_FORMAT_YUYV: > + case DRM_FORMAT_YVYU: > + case DRM_FORMAT_UYVY: > + case DRM_FORMAT_VYUY: > + case DRM_FORMAT_NV16: > + case DRM_FORMAT_NV61: > + case DRM_FORMAT_YUV422: > + case DRM_FORMAT_YVU422: > + return true; > + > + default: > + return false; > + } > +} > + > +bool sun4i_format_is_yuv444(uint32_t format) > +{ > + switch (format) { > + case DRM_FORMAT_YUV444: > + case DRM_FORMAT_YVU444: > + return true; > + > + default: > + return false; > + } > +} > + > +bool sun4i_format_is_packed(uint32_t format) > +{ > + if (sun4i_format_is_rgb(format)) > + return true; > + > + switch (format) { > + case DRM_FORMAT_YUYV: > + case DRM_FORMAT_YVYU: > + case DRM_FORMAT_UYVY: > + case DRM_FORMAT_VYUY: > + return true; > + > + default: > + return false; > + } > +} > + > +bool sun4i_format_is_semiplanar(uint32_t format) > +{ > + switch (format) { > + case DRM_FORMAT_NV12: > + case DRM_FORMAT_NV21: > + case DRM_FORMAT_NV16: > + case DRM_FORMAT_NV61: > + case DRM_FORMAT_NV24: > + case DRM_FORMAT_NV42: > + return true; > + default: > + return false; > + } > +} > + > +bool sun4i_format_is_planar(uint32_t format) > +{ > + switch (format) { > + case DRM_FORMAT_YUV410: > + case DRM_FORMAT_YVU410: > + case DRM_FORMAT_YUV411: > + case DRM_FORMAT_YVU411: > + case DRM_FORMAT_YUV420: > + case DRM_FORMAT_YVU420: > + case DRM_FORMAT_YUV422: > + case DRM_FORMAT_YVU422: > + case DRM_FORMAT_YUV444: > + case DRM_FORMAT_YVU444: > + return true; > + default: > + return false; > + } > +} > + > +bool sun4i_format_supports_tiling(uint32_t format) > +{ > + switch (format) { > + /* Semiplanar */ > + case DRM_FORMAT_NV12: > + case DRM_FORMAT_NV21: > + case DRM_FORMAT_NV16: > + case DRM_FORMAT_NV61: > + /* Planar */ > + case DRM_FORMAT_YUV420: > + case DRM_FORMAT_YVU420: > + case DRM_FORMAT_YUV422: > + case DRM_FORMAT_YVU422: > + case DRM_FORMAT_YUV411: > + case DRM_FORMAT_YVU411: > + return true; > + > + default: > + return false; > + } > +} > diff --git a/drivers/gpu/drm/sun4i/sun4i_format.h b/drivers/gpu/drm/sun4i/sun4i_format.h > new file mode 100644 > index 000000000000..1d6364cd3681 > --- /dev/null > +++ b/drivers/gpu/drm/sun4i/sun4i_format.h > @@ -0,0 +1,35 @@ > +/* > + * Copyright (C) 2015-2018 Free Electrons/Bootlin > + * > + * Maxime Ripard > + * Paul Kocialkowski > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License as > + * published by the Free Software Foundation; either version 2 of > + * the License, or (at your option) any later version. > + */ > + > +#ifndef _SUN4I_FORMAT_H_ > +#define _SUN4I_FORMAT_H_ > + > +extern const u32 sunxi_rgb2yuv_coef[12]; > +extern const u32 sunxi_bt601_yuv2rgb_coef[12]; > + > +bool sun4i_format_is_rgb(uint32_t format); > +bool sun4i_format_is_yuv(uint32_t format); > +bool sun4i_format_is_yuv411(uint32_t format); > +bool sun4i_format_is_yuv420(uint32_t format); > +bool sun4i_format_is_yuv422(uint32_t format); > +bool sun4i_format_is_yuv444(uint32_t format); > +bool sun4i_format_is_packed(uint32_t format); > +bool sun4i_format_is_semiplanar(uint32_t format); > +bool sun4i_format_is_planar(uint32_t format); > +bool sun4i_format_supports_tiling(uint32_t format); If we're going to add so many of them, then we should really consider to move them to drm_fourcc.c instead. Every one has some variation of some of these functions, we don't really need to duplicate it all the time. Maxime -- Maxime Ripard, Bootlin (formerly Free Electrons) Embedded Linux and Kernel engineering https://bootlin.com