mdp_format.c 6.4 KB
Newer Older
1
/*
2
 * Copyright (c) 2014 The Linux Foundation. All rights reserved.
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
 * Copyright (C) 2013 Red Hat
 * Author: Rob Clark <robdclark@gmail.com>
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 as published by
 * the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program.  If not, see <http://www.gnu.org/licenses/>.
 */


#include "msm_drv.h"
R
Rob Clark 已提交
21
#include "mdp_kms.h"
22

23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
static struct csc_cfg csc_convert[CSC_MAX] = {
	[CSC_RGB2RGB] = {
		.type = CSC_RGB2RGB,
		.matrix = {
			0x0200, 0x0000, 0x0000,
			0x0000, 0x0200, 0x0000,
			0x0000, 0x0000, 0x0200
		},
		.pre_bias =	{ 0x0, 0x0, 0x0 },
		.post_bias =	{ 0x0, 0x0, 0x0 },
		.pre_clamp =	{ 0x0, 0xff, 0x0, 0xff, 0x0, 0xff },
		.post_clamp =	{ 0x0, 0xff, 0x0, 0xff, 0x0, 0xff },
	},
	[CSC_YUV2RGB] = {
		.type = CSC_YUV2RGB,
		.matrix = {
			0x0254, 0x0000, 0x0331,
			0x0254, 0xff37, 0xfe60,
			0x0254, 0x0409, 0x0000
		},
		.pre_bias =	{ 0xfff0, 0xff80, 0xff80 },
		.post_bias =	{ 0x00, 0x00, 0x00 },
		.pre_clamp =	{ 0x00, 0xff, 0x00, 0xff, 0x00, 0xff },
		.post_clamp =	{ 0x00, 0xff, 0x00, 0xff, 0x00, 0xff },
	},
	[CSC_RGB2YUV] = {
		.type = CSC_RGB2YUV,
		.matrix = {
			0x0083, 0x0102, 0x0032,
			0x1fb5, 0x1f6c, 0x00e1,
			0x00e1, 0x1f45, 0x1fdc
		},
		.pre_bias =	{ 0x00, 0x00, 0x00 },
		.post_bias =	{ 0x10, 0x80, 0x80 },
		.pre_clamp =	{ 0x00, 0xff, 0x00, 0xff, 0x00, 0xff },
		.post_clamp =	{ 0x10, 0xeb, 0x10, 0xf0, 0x10, 0xf0 },
	},
	[CSC_YUV2YUV] = {
		.type = CSC_YUV2YUV,
		.matrix = {
			0x0200, 0x0000, 0x0000,
			0x0000, 0x0200, 0x0000,
			0x0000, 0x0000, 0x0200
		},
		.pre_bias =	{ 0x00, 0x00, 0x00 },
		.post_bias =	{ 0x00, 0x00, 0x00 },
		.pre_clamp =	{ 0x00, 0xff, 0x00, 0xff, 0x00, 0xff },
		.post_clamp =	{ 0x00, 0xff, 0x00, 0xff, 0x00, 0xff },
	},
};

74
#define FMT(name, a, r, g, b, e0, e1, e2, e3, alpha, tight, c, cnt, fp, cs, yuv) { \
75 76 77 78 79 80 81 82 83 84
		.base = { .pixel_format = DRM_FORMAT_ ## name }, \
		.bpc_a = BPC ## a ## A,                          \
		.bpc_r = BPC ## r,                               \
		.bpc_g = BPC ## g,                               \
		.bpc_b = BPC ## b,                               \
		.unpack = { e0, e1, e2, e3 },                    \
		.alpha_enable = alpha,                           \
		.unpack_tight = tight,                           \
		.cpp = c,                                        \
		.unpack_count = cnt,                             \
85
		.fetch_type = fp,                                \
86 87
		.chroma_sample = cs,                             \
		.is_yuv = yuv,                                   \
88
}
89 90 91

#define BPC0A 0

92 93 94 95
/*
 * Note: Keep RGB formats 1st, followed by YUV formats to avoid breaking
 * mdp_get_rgb_formats()'s implementation.
 */
R
Rob Clark 已提交
96
static const struct mdp_format formats[] = {
97 98
	/*  name      a  r  g  b   e0 e1 e2 e3  alpha   tight  cpp cnt ... */
	FMT(ARGB8888, 8, 8, 8, 8,  1, 0, 2, 3,  true,   true,  4,  4,
99
			MDP_PLANE_INTERLEAVED, CHROMA_FULL, false),
100
	FMT(ABGR8888, 8, 8, 8, 8,  2, 0, 1, 3,  true,   true,  4,  4,
101
			MDP_PLANE_INTERLEAVED, CHROMA_FULL, false),
102
	FMT(RGBA8888, 8, 8, 8, 8,  3, 1, 0, 2,  true,   true,  4,  4,
103
			MDP_PLANE_INTERLEAVED, CHROMA_FULL, false),
104
	FMT(BGRA8888, 8, 8, 8, 8,  3, 2, 0, 1,  true,   true,  4,  4,
105
			MDP_PLANE_INTERLEAVED, CHROMA_FULL, false),
106
	FMT(XRGB8888, 8, 8, 8, 8,  1, 0, 2, 3,  false,  true,  4,  4,
107
			MDP_PLANE_INTERLEAVED, CHROMA_FULL, false),
108 109 110 111 112 113
	FMT(XBGR8888, 8, 8, 8, 8,  2, 0, 1, 3,  false,   true,  4,  4,
			MDP_PLANE_INTERLEAVED, CHROMA_FULL, false),
	FMT(RGBX8888, 8, 8, 8, 8,  3, 1, 0, 2,  false,   true,  4,  4,
			MDP_PLANE_INTERLEAVED, CHROMA_FULL, false),
	FMT(BGRX8888, 8, 8, 8, 8,  3, 2, 0, 1,  false,   true,  4,  4,
			MDP_PLANE_INTERLEAVED, CHROMA_FULL, false),
114
	FMT(RGB888,   0, 8, 8, 8,  1, 0, 2, 0,  false,  true,  3,  3,
115
			MDP_PLANE_INTERLEAVED, CHROMA_FULL, false),
116
	FMT(BGR888,   0, 8, 8, 8,  2, 0, 1, 0,  false,  true,  3,  3,
117
			MDP_PLANE_INTERLEAVED, CHROMA_FULL, false),
118
	FMT(RGB565,   0, 5, 6, 5,  1, 0, 2, 0,  false,  true,  2,  3,
119
			MDP_PLANE_INTERLEAVED, CHROMA_FULL, false),
120
	FMT(BGR565,   0, 5, 6, 5,  2, 0, 1, 0,  false,  true,  2,  3,
121
			MDP_PLANE_INTERLEAVED, CHROMA_FULL, false),
122 123 124

	/* --- RGB formats above / YUV formats below this line --- */

125
	/* 2 plane YUV */
126
	FMT(NV12,     0, 8, 8, 8,  1, 2, 0, 0,  false,  true,  2, 2,
127
			MDP_PLANE_PSEUDO_PLANAR, CHROMA_420, true),
128
	FMT(NV21,     0, 8, 8, 8,  2, 1, 0, 0,  false,  true,  2, 2,
129
			MDP_PLANE_PSEUDO_PLANAR, CHROMA_420, true),
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
	FMT(NV16,     0, 8, 8, 8,  1, 2, 0, 0,  false,  true,  2, 2,
			MDP_PLANE_PSEUDO_PLANAR, CHROMA_H2V1, true),
	FMT(NV61,     0, 8, 8, 8,  2, 1, 0, 0,  false,  true,  2, 2,
			MDP_PLANE_PSEUDO_PLANAR, CHROMA_H2V1, true),
	/* 1 plane YUV */
	FMT(VYUY,     0, 8, 8, 8,  2, 0, 1, 0,  false,  true,  2, 4,
			MDP_PLANE_INTERLEAVED, CHROMA_H2V1, true),
	FMT(UYVY,     0, 8, 8, 8,  1, 0, 2, 0,  false,  true,  2, 4,
			MDP_PLANE_INTERLEAVED, CHROMA_H2V1, true),
	FMT(YUYV,     0, 8, 8, 8,  0, 1, 0, 2,  false,  true,  2, 4,
			MDP_PLANE_INTERLEAVED, CHROMA_H2V1, true),
	FMT(YVYU,     0, 8, 8, 8,  0, 2, 0, 1,  false,  true,  2, 4,
			MDP_PLANE_INTERLEAVED, CHROMA_H2V1, true),
	/* 3 plane YUV */
	FMT(YUV420,   0, 8, 8, 8,  2, 1, 0, 0,  false,  true,  1, 1,
			MDP_PLANE_PLANAR, CHROMA_420, true),
	FMT(YVU420,   0, 8, 8, 8,  1, 2, 0, 0,  false,  true,  1, 1,
			MDP_PLANE_PLANAR, CHROMA_420, true),
148 149
};

150 151 152 153 154 155 156
/*
 * Note:
 * @rgb_only must be set to true, when requesting
 * supported formats for RGB pipes.
 */
uint32_t mdp_get_formats(uint32_t *pixel_formats, uint32_t max_formats,
		bool rgb_only)
R
Rob Clark 已提交
157 158 159
{
	uint32_t i;
	for (i = 0; i < ARRAY_SIZE(formats); i++) {
R
Rob Clark 已提交
160
		const struct mdp_format *f = &formats[i];
R
Rob Clark 已提交
161 162 163 164

		if (i == max_formats)
			break;

165 166 167
		if (rgb_only && MDP_FORMAT_IS_YUV(f))
			break;

R
Rob Clark 已提交
168 169 170 171 172 173
		pixel_formats[i] = f->base.pixel_format;
	}

	return i;
}

174 175
const struct msm_format *mdp_get_format(struct msm_kms *kms, uint32_t format,
		uint64_t modifier)
176 177 178
{
	int i;
	for (i = 0; i < ARRAY_SIZE(formats); i++) {
R
Rob Clark 已提交
179
		const struct mdp_format *f = &formats[i];
180 181 182 183 184
		if (f->base.pixel_format == format)
			return &f->base;
	}
	return NULL;
}
185 186 187 188 189 190 191 192

struct csc_cfg *mdp_get_default_csc_cfg(enum csc_type type)
{
	if (unlikely(WARN_ON(type >= CSC_MAX)))
		return NULL;

	return &csc_convert[type];
}