/* Copyright (c) 2007, 2012-2013, 2018 The Linux Foundation. All rights reserved.
 * Copyright (C) 2007 Google Incorporated
 *
 * This software is licensed under the terms of the GNU General Public
 * License version 2, as published by the Free Software Foundation, and
 * may be copied, distributed, and modified under those terms.
 *
 * 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.
 */

#include <linux/types.h>

#include "mdss_fb.h"
#include "mdp3_ppp.h"

#define MDP_IS_IMGTYPE_BAD(x) ((x) >= MDP_IMGTYPE_LIMIT)

/* bg_config_lut not needed since it is same as src */
const uint32_t src_cfg_lut[MDP_IMGTYPE_LIMIT] = {
	[MDP_RGB_565] = MDP_RGB_565_SRC_REG,
	[MDP_BGR_565] = MDP_RGB_565_SRC_REG,
	[MDP_RGB_888] = MDP_RGB_888_SRC_REG,
	[MDP_BGR_888] = MDP_RGB_888_SRC_REG,
	[MDP_BGRA_8888] = MDP_RGBX_8888_SRC_REG,
	[MDP_RGBA_8888] = MDP_RGBX_8888_SRC_REG,
	[MDP_ARGB_8888] = MDP_RGBX_8888_SRC_REG,
	[MDP_XRGB_8888] = MDP_RGBX_8888_SRC_REG,
	[MDP_RGBX_8888] = MDP_RGBX_8888_SRC_REG,
	[MDP_Y_CRCB_H2V2] = MDP_Y_CBCR_H2V2_SRC_REG,
	[MDP_Y_CBCR_H2V2] = MDP_Y_CBCR_H2V2_SRC_REG,
	[MDP_Y_CBCR_H2V2_ADRENO] = MDP_Y_CBCR_H2V2_SRC_REG,
	[MDP_Y_CBCR_H2V2_VENUS] = MDP_Y_CBCR_H2V2_SRC_REG,
	[MDP_YCRYCB_H2V1] = MDP_YCRYCB_H2V1_SRC_REG,
	[MDP_Y_CBCR_H2V1] = MDP_Y_CRCB_H2V1_SRC_REG,
	[MDP_Y_CRCB_H2V1] = MDP_Y_CRCB_H2V1_SRC_REG,
	[MDP_BGRX_8888] = MDP_RGBX_8888_SRC_REG,
};

const uint32_t out_cfg_lut[MDP_IMGTYPE_LIMIT] = {
	[MDP_RGB_565] = MDP_RGB_565_DST_REG,
	[MDP_BGR_565] = MDP_RGB_565_DST_REG,
	[MDP_RGB_888] = MDP_RGB_888_DST_REG,
	[MDP_BGR_888] = MDP_RGB_888_DST_REG,
	[MDP_BGRA_8888] = MDP_RGBX_8888_DST_REG,
	[MDP_RGBA_8888] = MDP_RGBX_8888_DST_REG,
	[MDP_ARGB_8888] = MDP_RGBX_8888_DST_REG,
	[MDP_XRGB_8888] = MDP_RGBX_8888_DST_REG,
	[MDP_RGBX_8888] = MDP_RGBX_8888_DST_REG,
	[MDP_Y_CRCB_H2V2] = MDP_Y_CBCR_H2V2_DST_REG,
	[MDP_Y_CBCR_H2V2] = MDP_Y_CBCR_H2V2_DST_REG,
	[MDP_Y_CBCR_H2V2_ADRENO] = MDP_Y_CBCR_H2V2_DST_REG,
	[MDP_Y_CBCR_H2V2_VENUS] = MDP_Y_CBCR_H2V2_DST_REG,
	[MDP_YCRYCB_H2V1] = MDP_YCRYCB_H2V1_DST_REG,
	[MDP_Y_CBCR_H2V1] = MDP_Y_CRCB_H2V1_DST_REG,
	[MDP_Y_CRCB_H2V1] = MDP_Y_CRCB_H2V1_DST_REG,
	[MDP_BGRX_8888] = MDP_RGBX_8888_DST_REG,
};

const uint32_t pack_patt_lut[MDP_IMGTYPE_LIMIT] = {
	[MDP_RGB_565] = PPP_GET_PACK_PATTERN(0, CLR_B, CLR_G, CLR_R, 8),
	[MDP_BGR_565] = PPP_GET_PACK_PATTERN(0, CLR_R, CLR_G, CLR_B, 8),
	[MDP_RGB_888] = PPP_GET_PACK_PATTERN(0, CLR_R, CLR_G, CLR_B, 8),
	[MDP_BGR_888] = PPP_GET_PACK_PATTERN(0, CLR_B, CLR_G, CLR_R, 8),
	[MDP_BGRA_8888] = PPP_GET_PACK_PATTERN(CLR_ALPHA, CLR_B,
		CLR_G, CLR_R, 8),
	[MDP_RGBA_8888] = PPP_GET_PACK_PATTERN(CLR_ALPHA, CLR_R,
		CLR_G, CLR_B, 8),
	[MDP_ARGB_8888] = PPP_GET_PACK_PATTERN(CLR_R,
		CLR_G, CLR_B, CLR_ALPHA, 8),
	[MDP_XRGB_8888] = PPP_GET_PACK_PATTERN(CLR_R,
		CLR_G, CLR_B, CLR_ALPHA, 8),
	[MDP_RGBX_8888] = PPP_GET_PACK_PATTERN(CLR_ALPHA, CLR_R,
		CLR_G, CLR_B, 8),
	[MDP_Y_CRCB_H2V2] = PPP_GET_PACK_PATTERN(0, 0, CLR_CR, CLR_CB, 8),
	[MDP_Y_CBCR_H2V2] = PPP_GET_PACK_PATTERN(0, 0, CLR_CB, CLR_CR, 8),
	[MDP_Y_CBCR_H2V2_ADRENO] = PPP_GET_PACK_PATTERN(0, 0, CLR_CB,
		CLR_CR, 8),
	[MDP_Y_CBCR_H2V2_VENUS] = PPP_GET_PACK_PATTERN(0, 0, CLR_CB,
		CLR_CR, 8),
	[MDP_YCRYCB_H2V1] = PPP_GET_PACK_PATTERN(CLR_Y,
		CLR_CR, CLR_Y, CLR_CB, 8),
	[MDP_Y_CBCR_H2V1] = PPP_GET_PACK_PATTERN(0, 0, CLR_CB, CLR_CR, 8),
	[MDP_Y_CRCB_H2V1] = PPP_GET_PACK_PATTERN(0, 0, CLR_CR, CLR_CB, 8),
	[MDP_BGRX_8888] = PPP_GET_PACK_PATTERN(CLR_ALPHA, CLR_B,
		CLR_G, CLR_R, 8),
};

const uint32_t swapped_pack_patt_lut[MDP_IMGTYPE_LIMIT] = {
	[MDP_RGB_565] = PPP_GET_PACK_PATTERN(0, CLR_R, CLR_G, CLR_B, 8),
	[MDP_BGR_565] = PPP_GET_PACK_PATTERN(0, CLR_B, CLR_G, CLR_R, 8),
	[MDP_RGB_888] = PPP_GET_PACK_PATTERN(0, CLR_B, CLR_G, CLR_R, 8),
	[MDP_BGR_888] = PPP_GET_PACK_PATTERN(0, CLR_R, CLR_G, CLR_B, 8),
	[MDP_BGRA_8888] = PPP_GET_PACK_PATTERN(CLR_ALPHA, CLR_R,
		CLR_G, CLR_B, 8),
	[MDP_RGBA_8888] = PPP_GET_PACK_PATTERN(CLR_ALPHA, CLR_B,
		CLR_G, CLR_R, 8),
	[MDP_ARGB_8888] = PPP_GET_PACK_PATTERN(CLR_ALPHA, CLR_B,
		CLR_G, CLR_R, 8),
	[MDP_XRGB_8888] = PPP_GET_PACK_PATTERN(CLR_ALPHA, CLR_B,
		CLR_G, CLR_R, 8),
	[MDP_RGBX_8888] = PPP_GET_PACK_PATTERN(CLR_ALPHA, CLR_B,
		CLR_G, CLR_R, 8),
	[MDP_Y_CRCB_H2V2] = PPP_GET_PACK_PATTERN(0, 0, CLR_CB, CLR_CR, 8),
	[MDP_Y_CBCR_H2V2] = PPP_GET_PACK_PATTERN(0, 0, CLR_CR, CLR_CB, 8),
	[MDP_Y_CBCR_H2V2_ADRENO] = PPP_GET_PACK_PATTERN(0, 0, CLR_CR,
		CLR_CB, 8),
	[MDP_Y_CBCR_H2V2_VENUS] = PPP_GET_PACK_PATTERN(0, 0, CLR_CR,
		CLR_CB, 8),
	[MDP_YCRYCB_H2V1] = PPP_GET_PACK_PATTERN(CLR_Y,
		CLR_CB, CLR_Y, CLR_CR, 8),
	[MDP_Y_CBCR_H2V1] = PPP_GET_PACK_PATTERN(0, 0, CLR_CR, CLR_CB, 8),
	[MDP_Y_CRCB_H2V1] = PPP_GET_PACK_PATTERN(0, 0, CLR_CB, CLR_CR, 8),
	[MDP_BGRX_8888] = PPP_GET_PACK_PATTERN(CLR_ALPHA, CLR_R,
		CLR_G, CLR_B, 8),
};

const uint32_t dst_op_reg[MDP_IMGTYPE_LIMIT] = {
	[MDP_Y_CRCB_H2V2] = PPP_OP_DST_CHROMA_420,
	[MDP_Y_CBCR_H2V2] = PPP_OP_DST_CHROMA_420,
	[MDP_Y_CBCR_H2V1] = PPP_OP_DST_CHROMA_H2V1,
	[MDP_Y_CRCB_H2V1] = PPP_OP_DST_CHROMA_H2V1,
	[MDP_YCRYCB_H2V1] = PPP_OP_DST_CHROMA_H2V1,
};

const uint32_t src_op_reg[MDP_IMGTYPE_LIMIT] = {
	[MDP_Y_CRCB_H2V2] = PPP_OP_SRC_CHROMA_420 | PPP_OP_COLOR_SPACE_YCBCR,
	[MDP_Y_CBCR_H2V2] = PPP_OP_SRC_CHROMA_420 | PPP_OP_COLOR_SPACE_YCBCR,
	[MDP_Y_CBCR_H2V2_ADRENO] = PPP_OP_SRC_CHROMA_420 |
			PPP_OP_COLOR_SPACE_YCBCR,
	[MDP_Y_CBCR_H2V2_VENUS] = PPP_OP_SRC_CHROMA_420 |
			PPP_OP_COLOR_SPACE_YCBCR,
	[MDP_Y_CBCR_H2V1] = PPP_OP_SRC_CHROMA_H2V1,
	[MDP_Y_CRCB_H2V1] = PPP_OP_SRC_CHROMA_H2V1,
	[MDP_YCRYCB_H2V1] = PPP_OP_SRC_CHROMA_H2V1,
};

const uint32_t bytes_per_pixel[MDP_IMGTYPE_LIMIT] = {
	[MDP_RGB_565] = 2,
	[MDP_BGR_565] = 2,
	[MDP_RGB_888] = 3,
	[MDP_BGR_888] = 3,
	[MDP_XRGB_8888] = 4,
	[MDP_ARGB_8888] = 4,
	[MDP_RGBA_8888] = 4,
	[MDP_BGRA_8888] = 4,
	[MDP_RGBX_8888] = 4,
	[MDP_Y_CBCR_H2V1] = 1,
	[MDP_Y_CBCR_H2V2] = 1,
	[MDP_Y_CBCR_H2V2_ADRENO] = 1,
	[MDP_Y_CBCR_H2V2_VENUS] = 1,
	[MDP_Y_CRCB_H2V1] = 1,
	[MDP_Y_CRCB_H2V2] = 1,
	[MDP_YCRYCB_H2V1] = 2,
	[MDP_BGRX_8888] = 4,
};

const bool per_pixel_alpha[MDP_IMGTYPE_LIMIT] = {
	[MDP_BGRA_8888] = true,
	[MDP_RGBA_8888] = true,
	[MDP_ARGB_8888] = true,
};

const bool multi_plane[MDP_IMGTYPE_LIMIT] = {
	[MDP_Y_CRCB_H2V2] = true,
	[MDP_Y_CBCR_H2V2] = true,
	[MDP_Y_CBCR_H2V1] = true,
	[MDP_Y_CRCB_H2V1] = true,
};

/* lut default */
uint32_t default_pre_lut_val[PPP_LUT_MAX] = {
	0x0,
	0x151515,
	0x1d1d1d,
	0x232323,
	0x272727,
	0x2b2b2b,
	0x2f2f2f,
	0x333333,
	0x363636,
	0x393939,
	0x3b3b3b,
	0x3e3e3e,
	0x404040,
	0x434343,
	0x454545,
	0x474747,
	0x494949,
	0x4b4b4b,
	0x4d4d4d,
	0x4f4f4f,
	0x515151,
	0x535353,
	0x555555,
	0x565656,
	0x585858,
	0x5a5a5a,
	0x5b5b5b,
	0x5d5d5d,
	0x5e5e5e,
	0x606060,
	0x616161,
	0x636363,
	0x646464,
	0x666666,
	0x676767,
	0x686868,
	0x6a6a6a,
	0x6b6b6b,
	0x6c6c6c,
	0x6e6e6e,
	0x6f6f6f,
	0x707070,
	0x717171,
	0x727272,
	0x747474,
	0x757575,
	0x767676,
	0x777777,
	0x787878,
	0x797979,
	0x7a7a7a,
	0x7c7c7c,
	0x7d7d7d,
	0x7e7e7e,
	0x7f7f7f,
	0x808080,
	0x818181,
	0x828282,
	0x838383,
	0x848484,
	0x858585,
	0x868686,
	0x878787,
	0x888888,
	0x898989,
	0x8a8a8a,
	0x8b8b8b,
	0x8c8c8c,
	0x8d8d8d,
	0x8e8e8e,
	0x8f8f8f,
	0x8f8f8f,
	0x909090,
	0x919191,
	0x929292,
	0x939393,
	0x949494,
	0x959595,
	0x969696,
	0x969696,
	0x979797,
	0x989898,
	0x999999,
	0x9a9a9a,
	0x9b9b9b,
	0x9c9c9c,
	0x9c9c9c,
	0x9d9d9d,
	0x9e9e9e,
	0x9f9f9f,
	0xa0a0a0,
	0xa0a0a0,
	0xa1a1a1,
	0xa2a2a2,
	0xa3a3a3,
	0xa4a4a4,
	0xa4a4a4,
	0xa5a5a5,
	0xa6a6a6,
	0xa7a7a7,
	0xa7a7a7,
	0xa8a8a8,
	0xa9a9a9,
	0xaaaaaa,
	0xaaaaaa,
	0xababab,
	0xacacac,
	0xadadad,
	0xadadad,
	0xaeaeae,
	0xafafaf,
	0xafafaf,
	0xb0b0b0,
	0xb1b1b1,
	0xb2b2b2,
	0xb2b2b2,
	0xb3b3b3,
	0xb4b4b4,
	0xb4b4b4,
	0xb5b5b5,
	0xb6b6b6,
	0xb6b6b6,
	0xb7b7b7,
	0xb8b8b8,
	0xb8b8b8,
	0xb9b9b9,
	0xbababa,
	0xbababa,
	0xbbbbbb,
	0xbcbcbc,
	0xbcbcbc,
	0xbdbdbd,
	0xbebebe,
	0xbebebe,
	0xbfbfbf,
	0xc0c0c0,
	0xc0c0c0,
	0xc1c1c1,
	0xc1c1c1,
	0xc2c2c2,
	0xc3c3c3,
	0xc3c3c3,
	0xc4c4c4,
	0xc5c5c5,
	0xc5c5c5,
	0xc6c6c6,
	0xc6c6c6,
	0xc7c7c7,
	0xc8c8c8,
	0xc8c8c8,
	0xc9c9c9,
	0xc9c9c9,
	0xcacaca,
	0xcbcbcb,
	0xcbcbcb,
	0xcccccc,
	0xcccccc,
	0xcdcdcd,
	0xcecece,
	0xcecece,
	0xcfcfcf,
	0xcfcfcf,
	0xd0d0d0,
	0xd0d0d0,
	0xd1d1d1,
	0xd2d2d2,
	0xd2d2d2,
	0xd3d3d3,
	0xd3d3d3,
	0xd4d4d4,
	0xd4d4d4,
	0xd5d5d5,
	0xd6d6d6,
	0xd6d6d6,
	0xd7d7d7,
	0xd7d7d7,
	0xd8d8d8,
	0xd8d8d8,
	0xd9d9d9,
	0xd9d9d9,
	0xdadada,
	0xdbdbdb,
	0xdbdbdb,
	0xdcdcdc,
	0xdcdcdc,
	0xdddddd,
	0xdddddd,
	0xdedede,
	0xdedede,
	0xdfdfdf,
	0xdfdfdf,
	0xe0e0e0,
	0xe0e0e0,
	0xe1e1e1,
	0xe1e1e1,
	0xe2e2e2,
	0xe3e3e3,
	0xe3e3e3,
	0xe4e4e4,
	0xe4e4e4,
	0xe5e5e5,
	0xe5e5e5,
	0xe6e6e6,
	0xe6e6e6,
	0xe7e7e7,
	0xe7e7e7,
	0xe8e8e8,
	0xe8e8e8,
	0xe9e9e9,
	0xe9e9e9,
	0xeaeaea,
	0xeaeaea,
	0xebebeb,
	0xebebeb,
	0xececec,
	0xececec,
	0xededed,
	0xededed,
	0xeeeeee,
	0xeeeeee,
	0xefefef,
	0xefefef,
	0xf0f0f0,
	0xf0f0f0,
	0xf1f1f1,
	0xf1f1f1,
	0xf2f2f2,
	0xf2f2f2,
	0xf2f2f2,
	0xf3f3f3,
	0xf3f3f3,
	0xf4f4f4,
	0xf4f4f4,
	0xf5f5f5,
	0xf5f5f5,
	0xf6f6f6,
	0xf6f6f6,
	0xf7f7f7,
	0xf7f7f7,
	0xf8f8f8,
	0xf8f8f8,
	0xf9f9f9,
	0xf9f9f9,
	0xfafafa,
	0xfafafa,
	0xfafafa,
	0xfbfbfb,
	0xfbfbfb,
	0xfcfcfc,
	0xfcfcfc,
	0xfdfdfd,
	0xfdfdfd,
	0xfefefe,
	0xfefefe,
	0xffffff,
	0xffffff,
};

uint32_t default_post_lut_val[PPP_LUT_MAX] = {
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x10101,
	0x10101,
	0x10101,
	0x10101,
	0x10101,
	0x10101,
	0x10101,
	0x10101,
	0x10101,
	0x10101,
	0x20202,
	0x20202,
	0x20202,
	0x20202,
	0x20202,
	0x20202,
	0x30303,
	0x30303,
	0x30303,
	0x30303,
	0x30303,
	0x40404,
	0x40404,
	0x40404,
	0x40404,
	0x40404,
	0x50505,
	0x50505,
	0x50505,
	0x50505,
	0x60606,
	0x60606,
	0x60606,
	0x70707,
	0x70707,
	0x70707,
	0x70707,
	0x80808,
	0x80808,
	0x80808,
	0x90909,
	0x90909,
	0xa0a0a,
	0xa0a0a,
	0xa0a0a,
	0xb0b0b,
	0xb0b0b,
	0xb0b0b,
	0xc0c0c,
	0xc0c0c,
	0xd0d0d,
	0xd0d0d,
	0xe0e0e,
	0xe0e0e,
	0xe0e0e,
	0xf0f0f,
	0xf0f0f,
	0x101010,
	0x101010,
	0x111111,
	0x111111,
	0x121212,
	0x121212,
	0x131313,
	0x131313,
	0x141414,
	0x151515,
	0x151515,
	0x161616,
	0x161616,
	0x171717,
	0x171717,
	0x181818,
	0x191919,
	0x191919,
	0x1a1a1a,
	0x1b1b1b,
	0x1b1b1b,
	0x1c1c1c,
	0x1c1c1c,
	0x1d1d1d,
	0x1e1e1e,
	0x1f1f1f,
	0x1f1f1f,
	0x202020,
	0x212121,
	0x212121,
	0x222222,
	0x232323,
	0x242424,
	0x242424,
	0x252525,
	0x262626,
	0x272727,
	0x272727,
	0x282828,
	0x292929,
	0x2a2a2a,
	0x2b2b2b,
	0x2c2c2c,
	0x2c2c2c,
	0x2d2d2d,
	0x2e2e2e,
	0x2f2f2f,
	0x303030,
	0x313131,
	0x323232,
	0x333333,
	0x333333,
	0x343434,
	0x353535,
	0x363636,
	0x373737,
	0x383838,
	0x393939,
	0x3a3a3a,
	0x3b3b3b,
	0x3c3c3c,
	0x3d3d3d,
	0x3e3e3e,
	0x3f3f3f,
	0x404040,
	0x414141,
	0x424242,
	0x434343,
	0x444444,
	0x464646,
	0x474747,
	0x484848,
	0x494949,
	0x4a4a4a,
	0x4b4b4b,
	0x4c4c4c,
	0x4d4d4d,
	0x4f4f4f,
	0x505050,
	0x515151,
	0x525252,
	0x535353,
	0x545454,
	0x565656,
	0x575757,
	0x585858,
	0x595959,
	0x5b5b5b,
	0x5c5c5c,
	0x5d5d5d,
	0x5e5e5e,
	0x606060,
	0x616161,
	0x626262,
	0x646464,
	0x656565,
	0x666666,
	0x686868,
	0x696969,
	0x6a6a6a,
	0x6c6c6c,
	0x6d6d6d,
	0x6f6f6f,
	0x707070,
	0x717171,
	0x737373,
	0x747474,
	0x767676,
	0x777777,
	0x797979,
	0x7a7a7a,
	0x7c7c7c,
	0x7d7d7d,
	0x7f7f7f,
	0x808080,
	0x828282,
	0x838383,
	0x858585,
	0x868686,
	0x888888,
	0x898989,
	0x8b8b8b,
	0x8d8d8d,
	0x8e8e8e,
	0x909090,
	0x919191,
	0x939393,
	0x959595,
	0x969696,
	0x989898,
	0x9a9a9a,
	0x9b9b9b,
	0x9d9d9d,
	0x9f9f9f,
	0xa1a1a1,
	0xa2a2a2,
	0xa4a4a4,
	0xa6a6a6,
	0xa7a7a7,
	0xa9a9a9,
	0xababab,
	0xadadad,
	0xafafaf,
	0xb0b0b0,
	0xb2b2b2,
	0xb4b4b4,
	0xb6b6b6,
	0xb8b8b8,
	0xbababa,
	0xbbbbbb,
	0xbdbdbd,
	0xbfbfbf,
	0xc1c1c1,
	0xc3c3c3,
	0xc5c5c5,
	0xc7c7c7,
	0xc9c9c9,
	0xcbcbcb,
	0xcdcdcd,
	0xcfcfcf,
	0xd1d1d1,
	0xd3d3d3,
	0xd5d5d5,
	0xd7d7d7,
	0xd9d9d9,
	0xdbdbdb,
	0xdddddd,
	0xdfdfdf,
	0xe1e1e1,
	0xe3e3e3,
	0xe5e5e5,
	0xe7e7e7,
	0xe9e9e9,
	0xebebeb,
	0xeeeeee,
	0xf0f0f0,
	0xf2f2f2,
	0xf4f4f4,
	0xf6f6f6,
	0xf8f8f8,
	0xfbfbfb,
	0xfdfdfd,
	0xffffff,
};

struct ppp_csc_table rgb2yuv = {
	.fwd_matrix = {
		0x83,
		0x102,
		0x32,
		0xffb5,
		0xff6c,
		0xe1,
		0xe1,
		0xff45,
		0xffdc,
	},
	.rev_matrix = {
		0x254,
		0x0,
		0x331,
		0x254,
		0xff38,
		0xfe61,
		0x254,
		0x409,
		0x0,
	},
	.bv = {
		0x10,
		0x80,
		0x80,
	},
	.lv = {
		0x10,
		0xeb,
		0x10,
		0xf0,
	},
};

struct ppp_csc_table default_table2 = {
	.fwd_matrix = {
		0x5d,
		0x13a,
		0x20,
		0xffcd,
		0xff54,
		0xe1,
		0xe1,
		0xff35,
	},
	.rev_matrix = {
		0x254,
		0x0,
		0x396,
		0x254,
		0xff94,
		0xfef0,
		0x254,
		0x43a,
		0x0,
	},
	.bv = {
		0x10,
		0x80,
		0x80,
	},
	.lv = {
		0x10,
		0xeb,
		0x10,
		0xf0,
	},
};

const struct ppp_table upscale_table[PPP_UPSCALE_MAX] = {
	{ 0x5fffc, 0x0 },
	{ 0x50200, 0x7fc00000 },
	{ 0x5fffc, 0xff80000d },
	{ 0x50204, 0x7ec003f9 },
	{ 0x5fffc, 0xfec0001c },
	{ 0x50208, 0x7d4003f3 },
	{ 0x5fffc, 0xfe40002b },
	{ 0x5020c, 0x7b8003ed },
	{ 0x5fffc, 0xfd80003c },
	{ 0x50210, 0x794003e8 },
	{ 0x5fffc, 0xfcc0004d },
	{ 0x50214, 0x76c003e4 },
	{ 0x5fffc, 0xfc40005f },
	{ 0x50218, 0x73c003e0 },
	{ 0x5fffc, 0xfb800071 },
	{ 0x5021c, 0x708003de },
	{ 0x5fffc, 0xfac00085 },
	{ 0x50220, 0x6d0003db },
	{ 0x5fffc, 0xfa000098 },
	{ 0x50224, 0x698003d9 },
	{ 0x5fffc, 0xf98000ac },
	{ 0x50228, 0x654003d8 },
	{ 0x5fffc, 0xf8c000c1 },
	{ 0x5022c, 0x610003d7 },
	{ 0x5fffc, 0xf84000d5 },
	{ 0x50230, 0x5c8003d7 },
	{ 0x5fffc, 0xf7c000e9 },
	{ 0x50234, 0x580003d7 },
	{ 0x5fffc, 0xf74000fd },
	{ 0x50238, 0x534003d8 },
	{ 0x5fffc, 0xf6c00112 },
	{ 0x5023c, 0x4e8003d8 },
	{ 0x5fffc, 0xf6800126 },
	{ 0x50240, 0x494003da },
	{ 0x5fffc, 0xf600013a },
	{ 0x50244, 0x448003db },
	{ 0x5fffc, 0xf600014d },
	{ 0x50248, 0x3f4003dd },
	{ 0x5fffc, 0xf5c00160 },
	{ 0x5024c, 0x3a4003df },
	{ 0x5fffc, 0xf5c00172 },
	{ 0x50250, 0x354003e1 },
	{ 0x5fffc, 0xf5c00184 },
	{ 0x50254, 0x304003e3 },
	{ 0x5fffc, 0xf6000195 },
	{ 0x50258, 0x2b0003e6 },
	{ 0x5fffc, 0xf64001a6 },
	{ 0x5025c, 0x260003e8 },
	{ 0x5fffc, 0xf6c001b4 },
	{ 0x50260, 0x214003eb },
	{ 0x5fffc, 0xf78001c2 },
	{ 0x50264, 0x1c4003ee },
	{ 0x5fffc, 0xf80001cf },
	{ 0x50268, 0x17c003f1 },
	{ 0x5fffc, 0xf90001db },
	{ 0x5026c, 0x134003f3 },
	{ 0x5fffc, 0xfa0001e5 },
	{ 0x50270, 0xf0003f6 },
	{ 0x5fffc, 0xfb4001ee },
	{ 0x50274, 0xac003f9 },
	{ 0x5fffc, 0xfcc001f5 },
	{ 0x50278, 0x70003fb },
	{ 0x5fffc, 0xfe4001fb },
	{ 0x5027c, 0x34003fe },
};

const struct ppp_table mdp_gaussian_blur_table[PPP_BLUR_SCALE_MAX] = {
	/* max variance */
	{ 0x5fffc, 0x20000080 },
	{ 0x50280, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50284, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50288, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x5028c, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50290, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50294, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50298, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x5029c, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x502a0, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x502a4, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x502a8, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x502ac, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x502b0, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x502b4, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x502b8, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x502bc, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x502c0, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x502c4, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x502c8, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x502cc, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x502d0, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x502d4, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x502d8, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x502dc, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x502e0, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x502e4, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x502e8, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x502ec, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x502f0, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x502f4, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x502f8, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x502fc, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50300, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50304, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50308, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x5030c, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50310, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50314, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50318, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x5031c, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50320, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50324, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50328, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x5032c, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50330, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50334, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50338, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x5033c, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50340, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50344, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50348, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x5034c, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50350, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50354, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50358, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x5035c, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50360, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50364, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50368, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x5036c, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50370, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50374, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x50378, 0x20000080 },
	{ 0x5fffc, 0x20000080 },
	{ 0x5037c, 0x20000080 },
};

const struct ppp_table downscale_x_table_pt2topt4[] = {
	{ 0x5fffc, 0x740008c },
	{ 0x50280, 0x33800088 },
	{ 0x5fffc, 0x800008e },
	{ 0x50284, 0x33400084 },
	{ 0x5fffc, 0x8400092 },
	{ 0x50288, 0x33000080 },
	{ 0x5fffc, 0x9000094 },
	{ 0x5028c, 0x3300007b },
	{ 0x5fffc, 0x9c00098 },
	{ 0x50290, 0x32400077 },
	{ 0x5fffc, 0xa40009b },
	{ 0x50294, 0x32000073 },
	{ 0x5fffc, 0xb00009d },
	{ 0x50298, 0x31c0006f },
	{ 0x5fffc, 0xbc000a0 },
	{ 0x5029c, 0x3140006b },
	{ 0x5fffc, 0xc8000a2 },
	{ 0x502a0, 0x31000067 },
	{ 0x5fffc, 0xd8000a5 },
	{ 0x502a4, 0x30800062 },
	{ 0x5fffc, 0xe4000a8 },
	{ 0x502a8, 0x2fc0005f },
	{ 0x5fffc, 0xec000aa },
	{ 0x502ac, 0x2fc0005b },
	{ 0x5fffc, 0xf8000ad },
	{ 0x502b0, 0x2f400057 },
	{ 0x5fffc, 0x108000b0 },
	{ 0x502b4, 0x2e400054 },
	{ 0x5fffc, 0x114000b2 },
	{ 0x502b8, 0x2e000050 },
	{ 0x5fffc, 0x124000b4 },
	{ 0x502bc, 0x2d80004c },
	{ 0x5fffc, 0x130000b6 },
	{ 0x502c0, 0x2d000049 },
	{ 0x5fffc, 0x140000b8 },
	{ 0x502c4, 0x2c800045 },
	{ 0x5fffc, 0x150000b9 },
	{ 0x502c8, 0x2c000042 },
	{ 0x5fffc, 0x15c000bd },
	{ 0x502cc, 0x2b40003e },
	{ 0x5fffc, 0x16c000bf },
	{ 0x502d0, 0x2a80003b },
	{ 0x5fffc, 0x17c000bf },
	{ 0x502d4, 0x2a000039 },
	{ 0x5fffc, 0x188000c2 },
	{ 0x502d8, 0x29400036 },
	{ 0x5fffc, 0x19c000c4 },
	{ 0x502dc, 0x28800032 },
	{ 0x5fffc, 0x1ac000c5 },
	{ 0x502e0, 0x2800002f },
	{ 0x5fffc, 0x1bc000c7 },
	{ 0x502e4, 0x2740002c },
	{ 0x5fffc, 0x1cc000c8 },
	{ 0x502e8, 0x26c00029 },
	{ 0x5fffc, 0x1dc000c9 },
	{ 0x502ec, 0x26000027 },
	{ 0x5fffc, 0x1ec000cc },
	{ 0x502f0, 0x25000024 },
	{ 0x5fffc, 0x200000cc },
	{ 0x502f4, 0x24800021 },
	{ 0x5fffc, 0x210000cd },
	{ 0x502f8, 0x23800020 },
	{ 0x5fffc, 0x220000ce },
	{ 0x502fc, 0x2300001d },
};

static const struct ppp_table downscale_x_table_pt4topt6[] = {
	{ 0x5fffc, 0x740008c },
	{ 0x50280, 0x33800088 },
	{ 0x5fffc, 0x800008e },
	{ 0x50284, 0x33400084 },
	{ 0x5fffc, 0x8400092 },
	{ 0x50288, 0x33000080 },
	{ 0x5fffc, 0x9000094 },
	{ 0x5028c, 0x3300007b },
	{ 0x5fffc, 0x9c00098 },
	{ 0x50290, 0x32400077 },
	{ 0x5fffc, 0xa40009b },
	{ 0x50294, 0x32000073 },
	{ 0x5fffc, 0xb00009d },
	{ 0x50298, 0x31c0006f },
	{ 0x5fffc, 0xbc000a0 },
	{ 0x5029c, 0x3140006b },
	{ 0x5fffc, 0xc8000a2 },
	{ 0x502a0, 0x31000067 },
	{ 0x5fffc, 0xd8000a5 },
	{ 0x502a4, 0x30800062 },
	{ 0x5fffc, 0xe4000a8 },
	{ 0x502a8, 0x2fc0005f },
	{ 0x5fffc, 0xec000aa },
	{ 0x502ac, 0x2fc0005b },
	{ 0x5fffc, 0xf8000ad },
	{ 0x502b0, 0x2f400057 },
	{ 0x5fffc, 0x108000b0 },
	{ 0x502b4, 0x2e400054 },
	{ 0x5fffc, 0x114000b2 },
	{ 0x502b8, 0x2e000050 },
	{ 0x5fffc, 0x124000b4 },
	{ 0x502bc, 0x2d80004c },
	{ 0x5fffc, 0x130000b6 },
	{ 0x502c0, 0x2d000049 },
	{ 0x5fffc, 0x140000b8 },
	{ 0x502c4, 0x2c800045 },
	{ 0x5fffc, 0x150000b9 },
	{ 0x502c8, 0x2c000042 },
	{ 0x5fffc, 0x15c000bd },
	{ 0x502cc, 0x2b40003e },
	{ 0x5fffc, 0x16c000bf },
	{ 0x502d0, 0x2a80003b },
	{ 0x5fffc, 0x17c000bf },
	{ 0x502d4, 0x2a000039 },
	{ 0x5fffc, 0x188000c2 },
	{ 0x502d8, 0x29400036 },
	{ 0x5fffc, 0x19c000c4 },
	{ 0x502dc, 0x28800032 },
	{ 0x5fffc, 0x1ac000c5 },
	{ 0x502e0, 0x2800002f },
	{ 0x5fffc, 0x1bc000c7 },
	{ 0x502e4, 0x2740002c },
	{ 0x5fffc, 0x1cc000c8 },
	{ 0x502e8, 0x26c00029 },
	{ 0x5fffc, 0x1dc000c9 },
	{ 0x502ec, 0x26000027 },
	{ 0x5fffc, 0x1ec000cc },
	{ 0x502f0, 0x25000024 },
	{ 0x5fffc, 0x200000cc },
	{ 0x502f4, 0x24800021 },
	{ 0x5fffc, 0x210000cd },
	{ 0x502f8, 0x23800020 },
	{ 0x5fffc, 0x220000ce },
	{ 0x502fc, 0x2300001d },
};

static const struct ppp_table downscale_x_table_pt6topt8[] = {
	{ 0x5fffc, 0xfe000070 },
	{ 0x50280, 0x4bc00068 },
	{ 0x5fffc, 0xfe000078 },
	{ 0x50284, 0x4bc00060 },
	{ 0x5fffc, 0xfe000080 },
	{ 0x50288, 0x4b800059 },
	{ 0x5fffc, 0xfe000089 },
	{ 0x5028c, 0x4b000052 },
	{ 0x5fffc, 0xfe400091 },
	{ 0x50290, 0x4a80004b },
	{ 0x5fffc, 0xfe40009a },
	{ 0x50294, 0x4a000044 },
	{ 0x5fffc, 0xfe8000a3 },
	{ 0x50298, 0x4940003d },
	{ 0x5fffc, 0xfec000ac },
	{ 0x5029c, 0x48400037 },
	{ 0x5fffc, 0xff0000b4 },
	{ 0x502a0, 0x47800031 },
	{ 0x5fffc, 0xff8000bd },
	{ 0x502a4, 0x4640002b },
	{ 0x5fffc, 0xc5 },
	{ 0x502a8, 0x45000026 },
	{ 0x5fffc, 0x8000ce },
	{ 0x502ac, 0x43800021 },
	{ 0x5fffc, 0x10000d6 },
	{ 0x502b0, 0x4240001c },
	{ 0x5fffc, 0x18000df },
	{ 0x502b4, 0x40800018 },
	{ 0x5fffc, 0x24000e6 },
	{ 0x502b8, 0x3f000014 },
	{ 0x5fffc, 0x30000ee },
	{ 0x502bc, 0x3d400010 },
	{ 0x5fffc, 0x40000f5 },
	{ 0x502c0, 0x3b80000c },
	{ 0x5fffc, 0x50000fc },
	{ 0x502c4, 0x39800009 },
	{ 0x5fffc, 0x6000102 },
	{ 0x502c8, 0x37c00006 },
	{ 0x5fffc, 0x7000109 },
	{ 0x502cc, 0x35800004 },
	{ 0x5fffc, 0x840010e },
	{ 0x502d0, 0x33800002 },
	{ 0x5fffc, 0x9800114 },
	{ 0x502d4, 0x31400000 },
	{ 0x5fffc, 0xac00119 },
	{ 0x502d8, 0x2f4003fe },
	{ 0x5fffc, 0xc40011e },
	{ 0x502dc, 0x2d0003fc },
	{ 0x5fffc, 0xdc00121 },
	{ 0x502e0, 0x2b0003fb },
	{ 0x5fffc, 0xf400125 },
	{ 0x502e4, 0x28c003fa },
	{ 0x5fffc, 0x11000128 },
	{ 0x502e8, 0x268003f9 },
	{ 0x5fffc, 0x12c0012a },
	{ 0x502ec, 0x244003f9 },
	{ 0x5fffc, 0x1480012c },
	{ 0x502f0, 0x224003f8 },
	{ 0x5fffc, 0x1640012e },
	{ 0x502f4, 0x200003f8 },
	{ 0x5fffc, 0x1800012f },
	{ 0x502f8, 0x1e0003f8 },
	{ 0x5fffc, 0x1a00012f },
	{ 0x502fc, 0x1c0003f8 },
};

static const struct ppp_table downscale_x_table_pt8topt1[] = {
	{ 0x5fffc, 0x0 },
	{ 0x50280, 0x7fc00000 },
	{ 0x5fffc, 0xff80000d },
	{ 0x50284, 0x7ec003f9 },
	{ 0x5fffc, 0xfec0001c },
	{ 0x50288, 0x7d4003f3 },
	{ 0x5fffc, 0xfe40002b },
	{ 0x5028c, 0x7b8003ed },
	{ 0x5fffc, 0xfd80003c },
	{ 0x50290, 0x794003e8 },
	{ 0x5fffc, 0xfcc0004d },
	{ 0x50294, 0x76c003e4 },
	{ 0x5fffc, 0xfc40005f },
	{ 0x50298, 0x73c003e0 },
	{ 0x5fffc, 0xfb800071 },
	{ 0x5029c, 0x708003de },
	{ 0x5fffc, 0xfac00085 },
	{ 0x502a0, 0x6d0003db },
	{ 0x5fffc, 0xfa000098 },
	{ 0x502a4, 0x698003d9 },
	{ 0x5fffc, 0xf98000ac },
	{ 0x502a8, 0x654003d8 },
	{ 0x5fffc, 0xf8c000c1 },
	{ 0x502ac, 0x610003d7 },
	{ 0x5fffc, 0xf84000d5 },
	{ 0x502b0, 0x5c8003d7 },
	{ 0x5fffc, 0xf7c000e9 },
	{ 0x502b4, 0x580003d7 },
	{ 0x5fffc, 0xf74000fd },
	{ 0x502b8, 0x534003d8 },
	{ 0x5fffc, 0xf6c00112 },
	{ 0x502bc, 0x4e8003d8 },
	{ 0x5fffc, 0xf6800126 },
	{ 0x502c0, 0x494003da },
	{ 0x5fffc, 0xf600013a },
	{ 0x502c4, 0x448003db },
	{ 0x5fffc, 0xf600014d },
	{ 0x502c8, 0x3f4003dd },
	{ 0x5fffc, 0xf5c00160 },
	{ 0x502cc, 0x3a4003df },
	{ 0x5fffc, 0xf5c00172 },
	{ 0x502d0, 0x354003e1 },
	{ 0x5fffc, 0xf5c00184 },
	{ 0x502d4, 0x304003e3 },
	{ 0x5fffc, 0xf6000195 },
	{ 0x502d8, 0x2b0003e6 },
	{ 0x5fffc, 0xf64001a6 },
	{ 0x502dc, 0x260003e8 },
	{ 0x5fffc, 0xf6c001b4 },
	{ 0x502e0, 0x214003eb },
	{ 0x5fffc, 0xf78001c2 },
	{ 0x502e4, 0x1c4003ee },
	{ 0x5fffc, 0xf80001cf },
	{ 0x502e8, 0x17c003f1 },
	{ 0x5fffc, 0xf90001db },
	{ 0x502ec, 0x134003f3 },
	{ 0x5fffc, 0xfa0001e5 },
	{ 0x502f0, 0xf0003f6 },
	{ 0x5fffc, 0xfb4001ee },
	{ 0x502f4, 0xac003f9 },
	{ 0x5fffc, 0xfcc001f5 },
	{ 0x502f8, 0x70003fb },
	{ 0x5fffc, 0xfe4001fb },
	{ 0x502fc, 0x34003fe },
};

static const struct ppp_table *downscale_x_table[PPP_DOWNSCALE_MAX] = {
	[PPP_DOWNSCALE_PT2TOPT4] = downscale_x_table_pt2topt4,
	[PPP_DOWNSCALE_PT4TOPT6] = downscale_x_table_pt4topt6,
	[PPP_DOWNSCALE_PT6TOPT8] = downscale_x_table_pt6topt8,
	[PPP_DOWNSCALE_PT8TOPT1] = downscale_x_table_pt8topt1,
};

static const struct ppp_table downscale_y_table_pt2topt4[] = {
	{ 0x5fffc, 0x740008c },
	{ 0x50300, 0x33800088 },
	{ 0x5fffc, 0x800008e },
	{ 0x50304, 0x33400084 },
	{ 0x5fffc, 0x8400092 },
	{ 0x50308, 0x33000080 },
	{ 0x5fffc, 0x9000094 },
	{ 0x5030c, 0x3300007b },
	{ 0x5fffc, 0x9c00098 },
	{ 0x50310, 0x32400077 },
	{ 0x5fffc, 0xa40009b },
	{ 0x50314, 0x32000073 },
	{ 0x5fffc, 0xb00009d },
	{ 0x50318, 0x31c0006f },
	{ 0x5fffc, 0xbc000a0 },
	{ 0x5031c, 0x3140006b },
	{ 0x5fffc, 0xc8000a2 },
	{ 0x50320, 0x31000067 },
	{ 0x5fffc, 0xd8000a5 },
	{ 0x50324, 0x30800062 },
	{ 0x5fffc, 0xe4000a8 },
	{ 0x50328, 0x2fc0005f },
	{ 0x5fffc, 0xec000aa },
	{ 0x5032c, 0x2fc0005b },
	{ 0x5fffc, 0xf8000ad },
	{ 0x50330, 0x2f400057 },
	{ 0x5fffc, 0x108000b0 },
	{ 0x50334, 0x2e400054 },
	{ 0x5fffc, 0x114000b2 },
	{ 0x50338, 0x2e000050 },
	{ 0x5fffc, 0x124000b4 },
	{ 0x5033c, 0x2d80004c },
	{ 0x5fffc, 0x130000b6 },
	{ 0x50340, 0x2d000049 },
	{ 0x5fffc, 0x140000b8 },
	{ 0x50344, 0x2c800045 },
	{ 0x5fffc, 0x150000b9 },
	{ 0x50348, 0x2c000042 },
	{ 0x5fffc, 0x15c000bd },
	{ 0x5034c, 0x2b40003e },
	{ 0x5fffc, 0x16c000bf },
	{ 0x50350, 0x2a80003b },
	{ 0x5fffc, 0x17c000bf },
	{ 0x50354, 0x2a000039 },
	{ 0x5fffc, 0x188000c2 },
	{ 0x50358, 0x29400036 },
	{ 0x5fffc, 0x19c000c4 },
	{ 0x5035c, 0x28800032 },
	{ 0x5fffc, 0x1ac000c5 },
	{ 0x50360, 0x2800002f },
	{ 0x5fffc, 0x1bc000c7 },
	{ 0x50364, 0x2740002c },
	{ 0x5fffc, 0x1cc000c8 },
	{ 0x50368, 0x26c00029 },
	{ 0x5fffc, 0x1dc000c9 },
	{ 0x5036c, 0x26000027 },
	{ 0x5fffc, 0x1ec000cc },
	{ 0x50370, 0x25000024 },
	{ 0x5fffc, 0x200000cc },
	{ 0x50374, 0x24800021 },
	{ 0x5fffc, 0x210000cd },
	{ 0x50378, 0x23800020 },
	{ 0x5fffc, 0x220000ce },
	{ 0x5037c, 0x2300001d },
};

static const struct ppp_table downscale_y_table_pt4topt6[] = {
	{ 0x5fffc, 0x740008c },
	{ 0x50300, 0x33800088 },
	{ 0x5fffc, 0x800008e },
	{ 0x50304, 0x33400084 },
	{ 0x5fffc, 0x8400092 },
	{ 0x50308, 0x33000080 },
	{ 0x5fffc, 0x9000094 },
	{ 0x5030c, 0x3300007b },
	{ 0x5fffc, 0x9c00098 },
	{ 0x50310, 0x32400077 },
	{ 0x5fffc, 0xa40009b },
	{ 0x50314, 0x32000073 },
	{ 0x5fffc, 0xb00009d },
	{ 0x50318, 0x31c0006f },
	{ 0x5fffc, 0xbc000a0 },
	{ 0x5031c, 0x3140006b },
	{ 0x5fffc, 0xc8000a2 },
	{ 0x50320, 0x31000067 },
	{ 0x5fffc, 0xd8000a5 },
	{ 0x50324, 0x30800062 },
	{ 0x5fffc, 0xe4000a8 },
	{ 0x50328, 0x2fc0005f },
	{ 0x5fffc, 0xec000aa },
	{ 0x5032c, 0x2fc0005b },
	{ 0x5fffc, 0xf8000ad },
	{ 0x50330, 0x2f400057 },
	{ 0x5fffc, 0x108000b0 },
	{ 0x50334, 0x2e400054 },
	{ 0x5fffc, 0x114000b2 },
	{ 0x50338, 0x2e000050 },
	{ 0x5fffc, 0x124000b4 },
	{ 0x5033c, 0x2d80004c },
	{ 0x5fffc, 0x130000b6 },
	{ 0x50340, 0x2d000049 },
	{ 0x5fffc, 0x140000b8 },
	{ 0x50344, 0x2c800045 },
	{ 0x5fffc, 0x150000b9 },
	{ 0x50348, 0x2c000042 },
	{ 0x5fffc, 0x15c000bd },
	{ 0x5034c, 0x2b40003e },
	{ 0x5fffc, 0x16c000bf },
	{ 0x50350, 0x2a80003b },
	{ 0x5fffc, 0x17c000bf },
	{ 0x50354, 0x2a000039 },
	{ 0x5fffc, 0x188000c2 },
	{ 0x50358, 0x29400036 },
	{ 0x5fffc, 0x19c000c4 },
	{ 0x5035c, 0x28800032 },
	{ 0x5fffc, 0x1ac000c5 },
	{ 0x50360, 0x2800002f },
	{ 0x5fffc, 0x1bc000c7 },
	{ 0x50364, 0x2740002c },
	{ 0x5fffc, 0x1cc000c8 },
	{ 0x50368, 0x26c00029 },
	{ 0x5fffc, 0x1dc000c9 },
	{ 0x5036c, 0x26000027 },
	{ 0x5fffc, 0x1ec000cc },
	{ 0x50370, 0x25000024 },
	{ 0x5fffc, 0x200000cc },
	{ 0x50374, 0x24800021 },
	{ 0x5fffc, 0x210000cd },
	{ 0x50378, 0x23800020 },
	{ 0x5fffc, 0x220000ce },
	{ 0x5037c, 0x2300001d },
};

static const struct ppp_table downscale_y_table_pt6topt8[] = {
	{ 0x5fffc, 0xfe000070 },
	{ 0x50300, 0x4bc00068 },
	{ 0x5fffc, 0xfe000078 },
	{ 0x50304, 0x4bc00060 },
	{ 0x5fffc, 0xfe000080 },
	{ 0x50308, 0x4b800059 },
	{ 0x5fffc, 0xfe000089 },
	{ 0x5030c, 0x4b000052 },
	{ 0x5fffc, 0xfe400091 },
	{ 0x50310, 0x4a80004b },
	{ 0x5fffc, 0xfe40009a },
	{ 0x50314, 0x4a000044 },
	{ 0x5fffc, 0xfe8000a3 },
	{ 0x50318, 0x4940003d },
	{ 0x5fffc, 0xfec000ac },
	{ 0x5031c, 0x48400037 },
	{ 0x5fffc, 0xff0000b4 },
	{ 0x50320, 0x47800031 },
	{ 0x5fffc, 0xff8000bd },
	{ 0x50324, 0x4640002b },
	{ 0x5fffc, 0xc5 },
	{ 0x50328, 0x45000026 },
	{ 0x5fffc, 0x8000ce },
	{ 0x5032c, 0x43800021 },
	{ 0x5fffc, 0x10000d6 },
	{ 0x50330, 0x4240001c },
	{ 0x5fffc, 0x18000df },
	{ 0x50334, 0x40800018 },
	{ 0x5fffc, 0x24000e6 },
	{ 0x50338, 0x3f000014 },
	{ 0x5fffc, 0x30000ee },
	{ 0x5033c, 0x3d400010 },
	{ 0x5fffc, 0x40000f5 },
	{ 0x50340, 0x3b80000c },
	{ 0x5fffc, 0x50000fc },
	{ 0x50344, 0x39800009 },
	{ 0x5fffc, 0x6000102 },
	{ 0x50348, 0x37c00006 },
	{ 0x5fffc, 0x7000109 },
	{ 0x5034c, 0x35800004 },
	{ 0x5fffc, 0x840010e },
	{ 0x50350, 0x33800002 },
	{ 0x5fffc, 0x9800114 },
	{ 0x50354, 0x31400000 },
	{ 0x5fffc, 0xac00119 },
	{ 0x50358, 0x2f4003fe },
	{ 0x5fffc, 0xc40011e },
	{ 0x5035c, 0x2d0003fc },
	{ 0x5fffc, 0xdc00121 },
	{ 0x50360, 0x2b0003fb },
	{ 0x5fffc, 0xf400125 },
	{ 0x50364, 0x28c003fa },
	{ 0x5fffc, 0x11000128 },
	{ 0x50368, 0x268003f9 },
	{ 0x5fffc, 0x12c0012a },
	{ 0x5036c, 0x244003f9 },
	{ 0x5fffc, 0x1480012c },
	{ 0x50370, 0x224003f8 },
	{ 0x5fffc, 0x1640012e },
	{ 0x50374, 0x200003f8 },
	{ 0x5fffc, 0x1800012f },
	{ 0x50378, 0x1e0003f8 },
	{ 0x5fffc, 0x1a00012f },
	{ 0x5037c, 0x1c0003f8 },
};

static const struct ppp_table downscale_y_table_pt8topt1[] = {
	{ 0x5fffc, 0x0 },
	{ 0x50300, 0x7fc00000 },
	{ 0x5fffc, 0xff80000d },
	{ 0x50304, 0x7ec003f9 },
	{ 0x5fffc, 0xfec0001c },
	{ 0x50308, 0x7d4003f3 },
	{ 0x5fffc, 0xfe40002b },
	{ 0x5030c, 0x7b8003ed },
	{ 0x5fffc, 0xfd80003c },
	{ 0x50310, 0x794003e8 },
	{ 0x5fffc, 0xfcc0004d },
	{ 0x50314, 0x76c003e4 },
	{ 0x5fffc, 0xfc40005f },
	{ 0x50318, 0x73c003e0 },
	{ 0x5fffc, 0xfb800071 },
	{ 0x5031c, 0x708003de },
	{ 0x5fffc, 0xfac00085 },
	{ 0x50320, 0x6d0003db },
	{ 0x5fffc, 0xfa000098 },
	{ 0x50324, 0x698003d9 },
	{ 0x5fffc, 0xf98000ac },
	{ 0x50328, 0x654003d8 },
	{ 0x5fffc, 0xf8c000c1 },
	{ 0x5032c, 0x610003d7 },
	{ 0x5fffc, 0xf84000d5 },
	{ 0x50330, 0x5c8003d7 },
	{ 0x5fffc, 0xf7c000e9 },
	{ 0x50334, 0x580003d7 },
	{ 0x5fffc, 0xf74000fd },
	{ 0x50338, 0x534003d8 },
	{ 0x5fffc, 0xf6c00112 },
	{ 0x5033c, 0x4e8003d8 },
	{ 0x5fffc, 0xf6800126 },
	{ 0x50340, 0x494003da },
	{ 0x5fffc, 0xf600013a },
	{ 0x50344, 0x448003db },
	{ 0x5fffc, 0xf600014d },
	{ 0x50348, 0x3f4003dd },
	{ 0x5fffc, 0xf5c00160 },
	{ 0x5034c, 0x3a4003df },
	{ 0x5fffc, 0xf5c00172 },
	{ 0x50350, 0x354003e1 },
	{ 0x5fffc, 0xf5c00184 },
	{ 0x50354, 0x304003e3 },
	{ 0x5fffc, 0xf6000195 },
	{ 0x50358, 0x2b0003e6 },
	{ 0x5fffc, 0xf64001a6 },
	{ 0x5035c, 0x260003e8 },
	{ 0x5fffc, 0xf6c001b4 },
	{ 0x50360, 0x214003eb },
	{ 0x5fffc, 0xf78001c2 },
	{ 0x50364, 0x1c4003ee },
	{ 0x5fffc, 0xf80001cf },
	{ 0x50368, 0x17c003f1 },
	{ 0x5fffc, 0xf90001db },
	{ 0x5036c, 0x134003f3 },
	{ 0x5fffc, 0xfa0001e5 },
	{ 0x50370, 0xf0003f6 },
	{ 0x5fffc, 0xfb4001ee },
	{ 0x50374, 0xac003f9 },
	{ 0x5fffc, 0xfcc001f5 },
	{ 0x50378, 0x70003fb },
	{ 0x5fffc, 0xfe4001fb },
	{ 0x5037c, 0x34003fe },
};

static const struct ppp_table *downscale_y_table[PPP_DOWNSCALE_MAX] = {
	[PPP_DOWNSCALE_PT2TOPT4] = downscale_y_table_pt2topt4,
	[PPP_DOWNSCALE_PT4TOPT6] = downscale_y_table_pt4topt6,
	[PPP_DOWNSCALE_PT6TOPT8] = downscale_y_table_pt6topt8,
	[PPP_DOWNSCALE_PT8TOPT1] = downscale_y_table_pt8topt1,
};

void ppp_load_table(const struct ppp_table *table, int len)
{
	int i;
	for (i = 0; i < len; i++)
		PPP_WRITEL(table[i].val, table[i].reg);
}

void ppp_load_up_lut(void)
{
	ppp_load_table(upscale_table,
		PPP_UPSCALE_MAX);
}

void ppp_load_gaussian_lut(void)
{
	ppp_load_table(mdp_gaussian_blur_table,
		PPP_BLUR_SCALE_MAX);
}

void ppp_load_x_scale_table(int idx)
{
	ppp_load_table(downscale_x_table[idx], 64);
}

void ppp_load_y_scale_table(int idx)
{
	ppp_load_table(downscale_y_table[idx], 64);
}

uint32_t ppp_bpp(uint32_t type)
{
	if (MDP_IS_IMGTYPE_BAD(type))
		return 0;
	return bytes_per_pixel[type];
}

uint32_t ppp_src_config(uint32_t type)
{
	if (MDP_IS_IMGTYPE_BAD(type))
		return 0;
	return src_cfg_lut[type];
}

uint32_t ppp_out_config(uint32_t type)
{
	if (MDP_IS_IMGTYPE_BAD(type))
		return 0;
	return out_cfg_lut[type];
}

uint32_t ppp_pack_pattern(uint32_t type, uint32_t yuv2rgb)
{
	if (MDP_IS_IMGTYPE_BAD(type))
		return 0;
	if (yuv2rgb)
		return swapped_pack_patt_lut[type];

	return pack_patt_lut[type];
}

uint32_t ppp_dst_op_reg(uint32_t type)
{
	if (MDP_IS_IMGTYPE_BAD(type))
		return 0;
	return dst_op_reg[type];
}

uint32_t ppp_src_op_reg(uint32_t type)
{
	if (MDP_IS_IMGTYPE_BAD(type))
		return 0;
	return src_op_reg[type];
}

bool ppp_per_p_alpha(uint32_t type)
{
	if (MDP_IS_IMGTYPE_BAD(type))
		return 0;
	return per_pixel_alpha[type];
}

bool ppp_multi_plane(uint32_t type)
{
	if (MDP_IS_IMGTYPE_BAD(type))
		return 0;
	return multi_plane[type];
}

uint32_t *ppp_default_pre_lut(void)
{
	return default_pre_lut_val;
}

uint32_t *ppp_default_post_lut(void)
{
	return default_post_lut_val;
}

struct ppp_csc_table *ppp_csc_rgb2yuv(void)
{
	return &rgb2yuv;
}

struct ppp_csc_table *ppp_csc_table2(void)
{
	return &default_table2;
}
