All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrzej Hajda <a.hajda@samsung.com>
To: Inki Dae <inki.dae@samsung.com>
Cc: linux-samsung-soc@vger.kernel.org,
	Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>,
	Krzysztof Kozlowski <krzk@kernel.org>,
	dri-devel@lists.freedesktop.org,
	Marek Szyprowski <m.szyprowski@samsung.com>
Subject: [PATCH v3 RESEND 20/24] drm/exynos/gscaler: add local path support
Date: Mon, 25 Mar 2019 08:13:45 +0100	[thread overview]
Message-ID: <20190325071349.22600-21-a.hajda@samsung.com> (raw)
In-Reply-To: <20190325071349.22600-1-a.hajda@samsung.com>

GSCALERs in Exynos5433 have local path to DECON and DECON_TV.
They can be used as extra planes with support for non-RGB formats and scaling.
To enable it GSCALER must expose exynos_plane with associated plane callbacks
and bind it to DECONs CRTCs. Moreover device locking should be added to prevent
simultanous device usage by IPP and DRM.

Signed-off-by: Andrzej Hajda <a.hajda@samsung.com>
---
 drivers/gpu/drm/exynos/exynos_drm_gsc.c | 179 ++++++++++++++++++++----
 drivers/gpu/drm/exynos/regs-gsc.h       |   6 +
 2 files changed, 156 insertions(+), 29 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_gsc.c b/drivers/gpu/drm/exynos/exynos_drm_gsc.c
index 8d5aa70c8ab8..28a738a68a82 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_gsc.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_gsc.c
@@ -16,14 +16,16 @@
 #include <linux/platform_device.h>
 #include <linux/clk.h>
 #include <linux/pm_runtime.h>
-#include <linux/mfd/syscon.h>
 #include <linux/of_device.h>
 #include <linux/regmap.h>
 
+#include <drm/drm_atomic.h>
 #include <drm/drmP.h>
 #include <drm/exynos_drm.h>
 #include "regs-gsc.h"
+#include "exynos_drm_crtc.h"
 #include "exynos_drm_drv.h"
+#include "exynos_drm_fb.h"
 #include "exynos_drm_ipp.h"
 
 /*
@@ -98,11 +100,13 @@ struct gsc_scaler {
  */
 struct gsc_context {
 	struct exynos_drm_ipp ipp;
+	struct exynos_drm_plane plane;
 	struct drm_device *drm_dev;
 	struct device	*dev;
 	struct exynos_drm_ipp_task	*task;
 	struct exynos_drm_ipp_formats	*formats;
 	unsigned int			num_formats;
+	struct spinlock lock;
 
 	struct resource	*regs_res;
 	void __iomem	*regs;
@@ -113,8 +117,12 @@ struct gsc_context {
 	int	id;
 	int	irq;
 	bool	rotation;
+	bool	enabled;
+	bool	use_local_path;
 };
 
+#define to_gsc(ptr) container_of(ptr, struct gsc_context, ptr)
+
 /**
  * struct gsc_driverdata - per device type driver data for init time.
  *
@@ -127,6 +135,7 @@ struct gsc_driverdata {
 	int		num_limits;
 	const char	*clk_names[GSC_MAX_CLOCKS];
 	int		num_clocks;
+	bool		use_local_path;
 };
 
 /* 8-tap Filter Coefficient */
@@ -377,6 +386,32 @@ static const int v_coef_4t[GSC_COEF_RATIO][GSC_COEF_ATTR][GSC_COEF_V_4T] = {
 	}
 };
 
+static int gsc_dev_lock(struct gsc_context *ctx, void *task)
+{
+	unsigned long flags;
+	int ret = 0;
+
+	spin_lock_irqsave(&ctx->lock, flags);
+	if (ctx->task)
+		ret = -EBUSY;
+	else
+		ctx->task = task;
+	spin_unlock_irqrestore(&ctx->lock, flags);
+	return ret;
+}
+
+static void *gsc_dev_unlock(struct gsc_context *ctx)
+{
+	unsigned long flags;
+	void *task;
+
+	spin_lock_irqsave(&ctx->lock, flags);
+	task = ctx->task;
+	ctx->task = NULL;
+	spin_unlock_irqrestore(&ctx->lock, flags);
+	return task;
+}
+
 static int gsc_sw_reset(struct gsc_context *ctx)
 {
 	u32 cfg;
@@ -1021,6 +1056,7 @@ static int gsc_get_dst_buf_index(struct gsc_context *ctx)
 static irqreturn_t gsc_irq_handler(int irq, void *dev_id)
 {
 	struct gsc_context *ctx = dev_id;
+	struct exynos_drm_ipp_task *task;
 	u32 status;
 	int err = 0;
 
@@ -1049,10 +1085,8 @@ static irqreturn_t gsc_irq_handler(int irq, void *dev_id)
 			err = -EINVAL;
 	}
 
-	if (ctx->task) {
-		struct exynos_drm_ipp_task *task = ctx->task;
-
-		ctx->task = NULL;
+	task = gsc_dev_unlock(ctx);
+	if (!IS_ERR_OR_NULL(task)) {
 		pm_runtime_mark_last_busy(ctx->dev);
 		pm_runtime_put_autosuspend(ctx->dev);
 		exynos_drm_ipp_task_done(task, err);
@@ -1117,13 +1151,15 @@ static int gsc_commit(struct exynos_drm_ipp *ipp,
 	struct gsc_context *ctx = container_of(ipp, struct gsc_context, ipp);
 	int ret;
 
-	pm_runtime_get_sync(ctx->dev);
-	ctx->task = task;
+	ret = gsc_dev_lock(ctx, task);
+	if (ret)
+		return ret;
 
+	pm_runtime_get_sync(ctx->dev);
 	ret = gsc_reset(ctx);
 	if (ret) {
 		pm_runtime_put_autosuspend(ctx->dev);
-		ctx->task = NULL;
+		gsc_dev_unlock(ctx);
 		return ret;
 	}
 
@@ -1147,10 +1183,8 @@ static void gsc_abort(struct exynos_drm_ipp *ipp,
 			container_of(ipp, struct gsc_context, ipp);
 
 	gsc_reset(ctx);
-	if (ctx->task) {
-		struct exynos_drm_ipp_task *task = ctx->task;
-
-		ctx->task = NULL;
+	task = gsc_dev_unlock(ctx);
+	if (!IS_ERR_OR_NULL(task)) {
 		pm_runtime_mark_last_busy(ctx->dev);
 		pm_runtime_put_autosuspend(ctx->dev);
 		exynos_drm_ipp_task_done(task, -EIO);
@@ -1162,11 +1196,97 @@ static struct exynos_drm_ipp_funcs ipp_funcs = {
 	.abort = gsc_abort,
 };
 
+static const unsigned int gsc_formats[] = {
+	DRM_FORMAT_ARGB8888, DRM_FORMAT_XRGB8888, DRM_FORMAT_BGRX8888,
+	DRM_FORMAT_RGB565,
+	DRM_FORMAT_NV12, DRM_FORMAT_NV16, DRM_FORMAT_NV21, DRM_FORMAT_NV61,
+	DRM_FORMAT_UYVY, DRM_FORMAT_VYUY, DRM_FORMAT_YUYV, DRM_FORMAT_YVYU,
+	DRM_FORMAT_YUV420, DRM_FORMAT_YVU420, DRM_FORMAT_YUV422,
+};
+
+static const unsigned int gsc_tiled_formats[] = {
+	DRM_FORMAT_NV12, DRM_FORMAT_NV21,
+};
+
+static void gsc_update_plane(struct exynos_drm_plane *plane)
+{
+	struct gsc_context *ctx = to_gsc(plane);
+	struct exynos_drm_plane_state *state =
+			to_exynos_plane_state(plane->base.state);
+	struct drm_framebuffer *fb = plane->base.state->fb;
+	u32 src_w = fb->pitches[0] / fb->format->cpp[0], src_h = state->src.h;
+	u32 src_x = state->src.x, src_y = state->src.y;
+	u32 cropped_w = state->src.w, cropped_h = state->src.h;
+	u32 scaled_w = state->crtc.w, scaled_h = state->crtc.h;
+	int i;
+
+	if (!ctx->enabled) {
+		while (gsc_dev_lock(ctx, ERR_PTR(-EBUSY)) < 0)
+			usleep_range(1000, 2000);
+		pm_runtime_get_sync(ctx->dev);
+		gsc_sw_reset(ctx);
+		gsc_src_set_buf_seq(ctx, 0, true);
+		gsc_write(GSC_SMART_IF_EN | GSC_HIERARCHICAL_MODE, GSC_SMART_IF_CON);
+		ctx->enabled = true;
+	}
+	gsc_write(GSC_POINT(src_x, src_y), GSC_SRCIMG_OFFSET);
+	gsc_write(GSC_POINT(src_w, src_h), GSC_SRCIMG_SIZE);
+	gsc_write(GSC_POINT(cropped_w, cropped_h), GSC_CROPPED_SIZE);
+	gsc_write(GSC_POINT(scaled_w, scaled_h), GSC_SCALED_SIZE);
+	gsc_write(GSC_OUT_PATH_LOCAL | GSC_OUT_RGB_HD_WIDE, GSC_OUT_CON);
+	gsc_write(GSC_POINT(1, 1), GSC_PRE_SCALE_RATIO);
+	gsc_write(BIT(16) * cropped_w / scaled_w, GSC_MAIN_H_RATIO);
+	gsc_write(BIT(16) * cropped_h / scaled_h, GSC_MAIN_V_RATIO);
+	gsc_write(exynos_drm_fb_dma_addr(fb, 0), GSC_IN_BASE_ADDR_Y(0));
+	if (fb->format->num_planes > 1)
+	        gsc_write(exynos_drm_fb_dma_addr(fb, 1), GSC_IN_BASE_ADDR_CB(0));
+	if (fb->format->num_planes > 2)
+	        gsc_write(exynos_drm_fb_dma_addr(fb, 2), GSC_IN_BASE_ADDR_CR(0));
+	gsc_src_set_fmt(ctx, fb->format->format, fb->modifier);
+	gsc_write(scaled_w * scaled_h, GSC_SMART_IF_PIXEL_NUM);
+	gsc_write(GSC_ENABLE_SFR_UPDATE | GSC_ENABLE_ON, GSC_ENABLE);
+}
+
+static void gsc_disable_plane(struct exynos_drm_plane *plane)
+{
+	struct gsc_context *ctx = to_gsc(plane);
+	u32 val;
+
+	val = gsc_read(GSC_ENABLE);
+	val |= GSC_ENABLE_SFR_UPDATE;
+	val &= ~GSC_ENABLE_ON;
+	gsc_write(val, GSC_ENABLE);
+	pm_runtime_mark_last_busy(ctx->dev);
+	pm_runtime_put_autosuspend(ctx->dev);
+	ctx->enabled = false;
+	gsc_dev_unlock(ctx);
+}
+
+const struct exynos_drm_plane_ops gsc_plane_ops = {
+	.update_plane = gsc_update_plane,
+	.disable_plane = gsc_disable_plane
+};
+
+static void gsc_set_possible_crtcs(struct gsc_context *ctx)
+{
+	struct exynos_drm_crtc *crtc;
+	u32 mask = 0;
+
+	crtc = exynos_drm_crtc_get_by_type(ctx->drm_dev, EXYNOS_DISPLAY_TYPE_HDMI);
+	if (crtc)
+		mask |= drm_crtc_mask(&crtc->base);
+	crtc = exynos_drm_crtc_get_by_type(ctx->drm_dev, EXYNOS_DISPLAY_TYPE_LCD);
+	if (crtc)
+		mask |= drm_crtc_mask(&crtc->base);
+	ctx->plane.base.possible_crtcs = mask;
+}
+
 static int gsc_bind(struct device *dev, struct device *master, void *data)
 {
 	struct gsc_context *ctx = dev_get_drvdata(dev);
 	struct drm_device *drm_dev = data;
 	struct exynos_drm_ipp *ipp = &ctx->ipp;
+	int ret;
 
 	ctx->drm_dev = drm_dev;
 	exynos_drm_register_dma(drm_dev, dev);
@@ -1176,9 +1296,19 @@ static int gsc_bind(struct device *dev, struct device *master, void *data)
 			DRM_EXYNOS_IPP_CAP_SCALE | DRM_EXYNOS_IPP_CAP_CONVERT,
 			ctx->formats, ctx->num_formats, "gsc");
 
-	dev_info(dev, "The exynos gscaler has been probed successfully\n");
-
-	return 0;
+	if (!ctx->use_local_path)
+		return 0;
+
+	ctx->plane.index = ctx->id;
+	ctx->plane.capabilities = EXYNOS_DRM_PLANE_CAP_GSCALER |
+				  EXYNOS_DRM_PLANE_CAP_ZPOS |
+				  EXYNOS_DRM_PLANE_CAP_SCALE |
+				  EXYNOS_DRM_PLANE_CAP_WIN_BLEND;
+	ctx->plane.ops = &gsc_plane_ops;
+	ret = exynos_plane_init(drm_dev, &ctx->plane, gsc_formats,
+			ARRAY_SIZE(gsc_formats), 0);
+	gsc_set_possible_crtcs(ctx);
+	return ret;
 }
 
 static void gsc_unbind(struct device *dev, struct device *master,
@@ -1197,18 +1327,6 @@ static const struct component_ops gsc_component_ops = {
 	.unbind = gsc_unbind,
 };
 
-static const unsigned int gsc_formats[] = {
-	DRM_FORMAT_ARGB8888,
-	DRM_FORMAT_XRGB8888, DRM_FORMAT_RGB565, DRM_FORMAT_BGRX8888,
-	DRM_FORMAT_NV12, DRM_FORMAT_NV16, DRM_FORMAT_NV21, DRM_FORMAT_NV61,
-	DRM_FORMAT_UYVY, DRM_FORMAT_VYUY, DRM_FORMAT_YUYV, DRM_FORMAT_YVYU,
-	DRM_FORMAT_YUV420, DRM_FORMAT_YVU420, DRM_FORMAT_YUV422,
-};
-
-static const unsigned int gsc_tiled_formats[] = {
-	DRM_FORMAT_NV12, DRM_FORMAT_NV21,
-};
-
 static int gsc_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
@@ -1226,6 +1344,8 @@ static int gsc_probe(struct platform_device *pdev)
 	ctx->dev = dev;
 	ctx->num_clocks = driver_data->num_clocks;
 	ctx->clk_names = driver_data->clk_names;
+	ctx->use_local_path = driver_data->use_local_path;
+	spin_lock_init(&ctx->lock);
 
 	/* construct formats/limits array */
 	num_formats = ARRAY_SIZE(gsc_formats) + ARRAY_SIZE(gsc_tiled_formats);
@@ -1395,10 +1515,11 @@ static struct gsc_driverdata gsc_exynos5420_drvdata = {
 };
 
 static struct gsc_driverdata gsc_exynos5433_drvdata = {
-	.clk_names = {"pclk", "aclk", "aclk_xiu", "aclk_gsclbend"},
-	.num_clocks = 4,
+	.clk_names = {"pclk", "aclk", "aclk_xiu", "aclk_gsclbend", "gsd"},
+	.num_clocks = 5,
 	.limits = gsc_5433_limits,
 	.num_limits = ARRAY_SIZE(gsc_5433_limits),
+	.use_local_path = true,
 };
 
 static const struct of_device_id exynos_drm_gsc_of_match[] = {
diff --git a/drivers/gpu/drm/exynos/regs-gsc.h b/drivers/gpu/drm/exynos/regs-gsc.h
index 16b39734115c..7c23a79085e2 100644
--- a/drivers/gpu/drm/exynos/regs-gsc.h
+++ b/drivers/gpu/drm/exynos/regs-gsc.h
@@ -91,6 +91,7 @@
 #define GSC_IN_PATH_LOCAL		(1 << 0)
 #define GSC_IN_PATH_MEMORY		(0 << 0)
 
+#define GSC_POINT(x, y)			((x) + ((y) << 16))
 /* G-Scaler source image size */
 #define GSC_SRCIMG_SIZE			0x14
 #define GSC_SRCIMG_HEIGHT_MASK		(0x1fff << 16)
@@ -264,6 +265,11 @@
 #define GSC_VPOSITION			0xA7C
 #define GSC_VPOS_F(x)			((x) << 0)
 
+#define GSC_SMART_IF_PIXEL_NUM		0xAF0
+
+#define GSC_SMART_IF_CON		0xAF4
+#define GSC_SMART_IF_EN			(1 << 0)
+#define GSC_HIERARCHICAL_MODE		(0x3 << 1)
 
 /* G-Scaler clock initial count */
 #define GSC_CLK_INIT_COUNT		0xC00
-- 
2.17.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  parent reply	other threads:[~2019-03-25  7:13 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CGME20190325071353eucas1p185d973e14dac923aab381083b2b67445@eucas1p1.samsung.com>
2019-03-25  7:13 ` [PATCH v3 RESEND 00/24] drm/exynos: add support for GSCALER planes on Exynos5433 Andrzej Hajda
     [not found]   ` <CGME20190325071353eucas1p13470b85473aa92b25d38fcf4eceea76e@eucas1p1.samsung.com>
2019-03-25  7:13     ` [PATCH v3 RESEND 01/24] arm64: dts: exynos: configure GSCALER related clocks Andrzej Hajda
2019-03-25  7:50       ` Krzysztof Kozlowski
2019-03-25  8:31         ` Andrzej Hajda
2019-03-25  8:44           ` Krzysztof Kozlowski
     [not found]   ` <CGME20190325071354eucas1p17f990ee93878c5909800044779b41451@eucas1p1.samsung.com>
2019-03-25  7:13     ` [PATCH v3 RESEND 02/24] arm64: dts: exynos: add DSD/GSD clocks to DECONs and GSCALERs Andrzej Hajda
     [not found]   ` <CGME20190325071354eucas1p181987b86e0e2df42f704f3e95f0c2b18@eucas1p1.samsung.com>
2019-03-25  7:13     ` [PATCH v3 RESEND 03/24] drm/exynos: remove exynos_drm_plane.h header Andrzej Hajda
     [not found]   ` <CGME20190325071354eucas1p11b39f3a06807b8619cea583c7dc40c18@eucas1p1.samsung.com>
2019-03-25  7:13     ` [PATCH v3 RESEND 04/24] drm/exynos: remove spare macro Andrzej Hajda
     [not found]   ` <CGME20190325071355eucas1p1bc10232953b0d9f122ee7d3d532374e8@eucas1p1.samsung.com>
2019-03-25  7:13     ` [PATCH v3 RESEND 05/24] drm/exynos: drop exynos_drm_plane_config structure Andrzej Hajda
     [not found]   ` <CGME20190325071355eucas1p1cbb56752b2560cb6384d79df9c4124a3@eucas1p1.samsung.com>
2019-03-25  7:13     ` [PATCH v3 RESEND 06/24] drm/exynos: add exynos_drm_crtc_init function Andrzej Hajda
     [not found]   ` <CGME20190325071356eucas1p111ff1323f9ef55582b6983ce91a0e58a@eucas1p1.samsung.com>
2019-03-25  7:13     ` [PATCH v3 RESEND 07/24] drm/exynos/decon5433: embed exynos_drm_crtc directly into context Andrzej Hajda
     [not found]   ` <CGME20190325071356eucas1p17598af50b99cecd3f04bd5bd7b665468@eucas1p1.samsung.com>
2019-03-25  7:13     ` [PATCH v3 RESEND 08/24] drm/exynos/decon7: " Andrzej Hajda
     [not found]   ` <CGME20190325071356eucas1p169112fff9a6b5914c93b162a267348f1@eucas1p1.samsung.com>
2019-03-25  7:13     ` [PATCH v3 RESEND 09/24] drm/exynos/fimd: " Andrzej Hajda
     [not found]   ` <CGME20190325071357eucas1p1d1def486ebc1697def8c4d670b7cd15c@eucas1p1.samsung.com>
2019-03-25  7:13     ` [PATCH v3 RESEND 10/24] drm/exynos/mixer: " Andrzej Hajda
     [not found]   ` <CGME20190325071357eucas1p107f56a7c71d033687e02d8eab03c8635@eucas1p1.samsung.com>
2019-03-25  7:13     ` [PATCH v3 RESEND 11/24] drm/exynos/vidi: " Andrzej Hajda
     [not found]   ` <CGME20190325071358eucas1p19d8fa7080e588979618ac4bb4aeccbeb@eucas1p1.samsung.com>
2019-03-25  7:13     ` [PATCH v3 RESEND 12/24] drm/exynos: remove standalone exynos_drm_crtc leftovers Andrzej Hajda
     [not found]   ` <CGME20190325071358eucas1p1e7f9aa715ac8f04b20fe6a64aa83700d@eucas1p1.samsung.com>
2019-03-25  7:13     ` [PATCH v3 RESEND 13/24] drm/exynos/vidi: remove encoder_to_vidi helper Andrzej Hajda
     [not found]   ` <CGME20190325071359eucas1p1b08952b714f0f81d694a0c0db8332521@eucas1p1.samsung.com>
2019-03-25  7:13     ` [PATCH v3 RESEND 14/24] drm/exynos: unify plane type assignment Andrzej Hajda
     [not found]   ` <CGME20190325071359eucas1p1701719f798584cd23cc8058d2f2c495b@eucas1p1.samsung.com>
2019-03-25  7:13     ` [PATCH v3 RESEND 15/24] drm/exynos: set primary plane in exynos_drm_crtc_init Andrzej Hajda
     [not found]   ` <CGME20190325071359eucas1p1b97bf55b51b840f4a049df4779800f11@eucas1p1.samsung.com>
2019-03-25  7:13     ` [PATCH v3 RESEND 16/24] drm/exynos: set cursor " Andrzej Hajda
     [not found]   ` <CGME20190325071400eucas1p1f80832bb0feba9bd11187aecf1ae61c7@eucas1p1.samsung.com>
2019-03-25  7:13     ` [PATCH v3 RESEND 17/24] drm/exynos: add plane update/disable callbacks for planes Andrzej Hajda
     [not found]   ` <CGME20190325071400eucas1p1a6740040c56d51b0a3658ec01c1bb9f6@eucas1p1.samsung.com>
2019-03-25  7:13     ` [PATCH v3 RESEND 18/24] drm/exynos: add GSCALER plane capability Andrzej Hajda
     [not found]   ` <CGME20190325071401eucas1p1ddc56702c8ff146f0fd84277f3f84e08@eucas1p1.samsung.com>
2019-03-25  7:13     ` [PATCH v3 RESEND 19/24] drm/exynos/gscaler: fix id assignement Andrzej Hajda
     [not found]   ` <CGME20190325071401eucas1p10d9ad1fcfc4a5e4f2b964cf04e5e5fe8@eucas1p1.samsung.com>
2019-03-25  7:13     ` Andrzej Hajda [this message]
     [not found]   ` <CGME20190325071401eucas1p10df709b256570f1aba9cbc4e875da1b3@eucas1p1.samsung.com>
2019-03-25  7:13     ` [PATCH v3 RESEND 21/24] drm/exynos/decon5433: add local path support Andrzej Hajda
2022-02-06 16:51       ` Krzysztof Kozlowski
2022-03-02  1:00         ` Inki Dae
2022-03-03 16:03           ` Krzysztof Kozlowski
2022-03-03 16:11             ` Marek Szyprowski
2022-03-03 16:12               ` Krzysztof Kozlowski
     [not found]   ` <CGME20190325071402eucas1p12176421bacd4f9bcf9341bc776044c56@eucas1p1.samsung.com>
2019-03-25  7:13     ` [PATCH v3 RESEND 22/24] drm/exynos/decon5433: wait for finish previous update Andrzej Hajda
     [not found]   ` <CGME20190325071402eucas1p1b21cd8cb6a2bfa0349821597b6291af5@eucas1p1.samsung.com>
2019-03-25  7:13     ` [PATCH v3 RESEND 23/24] drm/exynos/gscaler: change supported color format BGRX8888 to XBGR8888 Andrzej Hajda
     [not found]   ` <CGME20190325071403eucas1p15267241039dc4b1911f2357b7a43baac@eucas1p1.samsung.com>
2019-03-25  7:13     ` [PATCH v3 RESEND 24/24] drm/exynos/gscaler: fix handling YVU420 pixel format Andrzej Hajda
2019-03-26  8:45   ` [PATCH v3 RESEND 00/24] drm/exynos: add support for GSCALER planes on Exynos5433 Inki Dae
2019-03-26 13:51     ` Andrzej Hajda
2019-03-27  2:26       ` Inki Dae

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190325071349.22600-21-a.hajda@samsung.com \
    --to=a.hajda@samsung.com \
    --cc=b.zolnierkie@samsung.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=inki.dae@samsung.com \
    --cc=krzk@kernel.org \
    --cc=linux-samsung-soc@vger.kernel.org \
    --cc=m.szyprowski@samsung.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.