1 From foo@baz Wed Aug 22 10:28:26 CEST 2018
2 From: Marek Szyprowski <m.szyprowski@samsung.com>
3 Date: Thu, 7 Jun 2018 13:06:13 +0200
4 Subject: drm/exynos: gsc: Fix support for NV16/61, YUV420/YVU420 and YUV422 modes
6 From: Marek Szyprowski <m.szyprowski@samsung.com>
8 [ Upstream commit dd209ef809080ced903e7747ee3ef640c923a1d2 ]
10 Fix following issues related to planar YUV pixel format configuration:
11 - NV16/61 modes were incorrectly programmed as NV12/21,
12 - YVU420 was programmed as YUV420 on source,
13 - YVU420 and YUV422 were programmed as YUV420 on output.
15 Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
16 Signed-off-by: Inki Dae <inki.dae@samsung.com>
17 Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
18 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
20 drivers/gpu/drm/exynos/exynos_drm_gsc.c | 29 ++++++++++++++++++++---------
21 drivers/gpu/drm/exynos/regs-gsc.h | 1 +
22 2 files changed, 21 insertions(+), 9 deletions(-)
24 --- a/drivers/gpu/drm/exynos/exynos_drm_gsc.c
25 +++ b/drivers/gpu/drm/exynos/exynos_drm_gsc.c
26 @@ -526,21 +526,25 @@ static int gsc_src_set_fmt(struct device
27 GSC_IN_CHROMA_ORDER_CRCB);
30 + cfg |= (GSC_IN_CHROMA_ORDER_CRCB | GSC_IN_YUV420_2P);
33 - cfg |= (GSC_IN_CHROMA_ORDER_CRCB |
35 + cfg |= (GSC_IN_CHROMA_ORDER_CRCB | GSC_IN_YUV422_2P);
37 case DRM_FORMAT_YUV422:
38 cfg |= GSC_IN_YUV422_3P;
40 case DRM_FORMAT_YUV420:
41 + cfg |= (GSC_IN_CHROMA_ORDER_CBCR | GSC_IN_YUV420_3P);
43 case DRM_FORMAT_YVU420:
44 - cfg |= GSC_IN_YUV420_3P;
45 + cfg |= (GSC_IN_CHROMA_ORDER_CRCB | GSC_IN_YUV420_3P);
48 + cfg |= (GSC_IN_CHROMA_ORDER_CBCR | GSC_IN_YUV420_2P);
51 - cfg |= (GSC_IN_CHROMA_ORDER_CBCR |
53 + cfg |= (GSC_IN_CHROMA_ORDER_CBCR | GSC_IN_YUV422_2P);
56 dev_err(ippdrv->dev, "invalid target yuv order 0x%x.\n", fmt);
57 @@ -800,18 +804,25 @@ static int gsc_dst_set_fmt(struct device
58 GSC_OUT_CHROMA_ORDER_CRCB);
61 - case DRM_FORMAT_NV61:
62 cfg |= (GSC_OUT_CHROMA_ORDER_CRCB | GSC_OUT_YUV420_2P);
64 + case DRM_FORMAT_NV61:
65 + cfg |= (GSC_OUT_CHROMA_ORDER_CRCB | GSC_OUT_YUV422_2P);
67 case DRM_FORMAT_YUV422:
68 + cfg |= GSC_OUT_YUV422_3P;
70 case DRM_FORMAT_YUV420:
71 + cfg |= (GSC_OUT_CHROMA_ORDER_CBCR | GSC_OUT_YUV420_3P);
73 case DRM_FORMAT_YVU420:
74 - cfg |= GSC_OUT_YUV420_3P;
75 + cfg |= (GSC_OUT_CHROMA_ORDER_CRCB | GSC_OUT_YUV420_3P);
78 + cfg |= (GSC_OUT_CHROMA_ORDER_CBCR | GSC_OUT_YUV420_2P);
81 - cfg |= (GSC_OUT_CHROMA_ORDER_CBCR |
83 + cfg |= (GSC_OUT_CHROMA_ORDER_CBCR | GSC_OUT_YUV422_2P);
86 dev_err(ippdrv->dev, "invalid target yuv order 0x%x.\n", fmt);
87 --- a/drivers/gpu/drm/exynos/regs-gsc.h
88 +++ b/drivers/gpu/drm/exynos/regs-gsc.h
90 #define GSC_OUT_YUV420_3P (3 << 4)
91 #define GSC_OUT_YUV422_1P (4 << 4)
92 #define GSC_OUT_YUV422_2P (5 << 4)
93 +#define GSC_OUT_YUV422_3P (6 << 4)
94 #define GSC_OUT_YUV444 (7 << 4)
95 #define GSC_OUT_TILE_TYPE_MASK (1 << 2)
96 #define GSC_OUT_TILE_C_16x8 (0 << 2)