blob: b4252cad857a41d7cc076878966fc6d492ce5e87 [file] [log] [blame]
/* Copyright (c) 2007, 2013 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.
*/
#ifndef MDP3_PPP_H
#define MDP3_PPP_H
#include "mdp3.h"
#include "mdss_fb.h"
#define PPP_WRITEL(val, off) MDP3_REG_WRITE(off, val)
#define MAX_BLIT_REQ 16
#define PPP_UPSCALE_MAX 64
#define PPP_BLUR_SCALE_MAX 128
#define PPP_LUT_MAX 256
/* MDP PPP Operations */
#define MDPOP_NOP 0
#define MDPOP_LR BIT(0) /* left to right flip */
#define MDPOP_UD BIT(1) /* up and down flip */
#define MDPOP_ROT90 BIT(2) /* rotate image to 90 degree */
#define MDPOP_ROT180 (MDPOP_UD|MDPOP_LR)
#define MDPOP_ROT270 (MDPOP_ROT90|MDPOP_UD|MDPOP_LR)
#define MDPOP_ASCALE BIT(7)
#define MDPOP_ALPHAB BIT(8) /* enable alpha blending */
#define MDPOP_TRANSP BIT(9) /* enable transparency */
#define MDPOP_DITHER BIT(10) /* enable dither */
#define MDPOP_SHARPENING BIT(11) /* enable sharpening */
#define MDPOP_BLUR BIT(12) /* enable blur */
#define MDPOP_FG_PM_ALPHA BIT(13)
#define MDPOP_LAYER_IS_FG BIT(14)
#define MDPOP_ROTATION (MDPOP_ROT90|MDPOP_LR|MDPOP_UD)
#define PPP_OP_CONVERT_YCBCR2RGB BIT(2)
#define PPP_OP_CONVERT_ON BIT(3)
#define PPP_OP_SCALE_X_ON BIT(0)
#define PPP_OP_SCALE_Y_ON BIT(1)
#define PPP_OP_ROT_ON BIT(8)
#define PPP_OP_ROT_90 BIT(9)
#define PPP_OP_FLIP_LR BIT(10)
#define PPP_OP_FLIP_UD BIT(11)
#define PPP_OP_BLEND_ON BIT(12)
#define PPP_OP_BLEND_CONSTANT_ALPHA BIT(14)
#define PPP_OP_DITHER_EN BIT(16)
#define PPP_BLEND_CALPHA_TRNASP BIT(24)
#define PPP_OP_BLEND_SRCPIXEL_ALPHA 0
#define PPP_OP_BLEND_ALPHA_BLEND_NORMAL 0
#define PPP_OP_BLEND_ALPHA_BLEND_REVERSE BIT(15)
#define PPP_BLEND_BG_USE_ALPHA_SEL (1 << 0)
#define PPP_BLEND_BG_ALPHA_REVERSE (1 << 3)
#define PPP_BLEND_BG_SRCPIXEL_ALPHA (0 << 1)
#define PPP_BLEND_BG_DSTPIXEL_ALPHA (1 << 1)
#define PPP_BLEND_BG_CONSTANT_ALPHA (2 << 1)
#define PPP_BLEND_BG_CONST_ALPHA_VAL(x) ((x) << 24)
#define PPP_OP_BG_CHROMA_H2V1 BIT(25)
#define CLR_G 0x0
#define CLR_B 0x1
#define CLR_R 0x2
#define CLR_ALPHA 0x3
#define CLR_Y CLR_G
#define CLR_CB CLR_B
#define CLR_CR CLR_R
/* from lsb to msb */
#define PPP_GET_PACK_PATTERN(a, x, y, z, bit) \
(((a)<<(bit*3))|((x)<<(bit*2))|((y)<<bit)|(z))
/* Frame unpacking */
#define PPP_C0G_8BITS (BIT(1)|BIT(0))
#define PPP_C1B_8BITS (BIT(3)|BIT(2))
#define PPP_C2R_8BITS (BIT(5)|BIT(4))
#define PPP_C3A_8BITS (BIT(7)|BIT(6))
#define PPP_C0G_6BITS BIT(1)
#define PPP_C1B_6BITS BIT(3)
#define PPP_C2R_6BITS BIT(5)
#define PPP_C0G_5BITS BIT(0)
#define PPP_C1B_5BITS BIT(2)
#define PPP_C2R_5BITS BIT(4)
#define PPP_SRC_C3_ALPHA_EN BIT(8)
#define PPP_SRC_BPP_INTERLVD_1BYTES 0
#define PPP_SRC_BPP_INTERLVD_2BYTES BIT(9)
#define PPP_SRC_BPP_INTERLVD_3BYTES BIT(10)
#define PPP_SRC_BPP_INTERLVD_4BYTES (BIT(10)|BIT(9))
#define PPP_SRC_BPP_ROI_ODD_X BIT(11)
#define PPP_SRC_BPP_ROI_ODD_Y BIT(12)
#define PPP_SRC_INTERLVD_2COMPONENTS BIT(13)
#define PPP_SRC_INTERLVD_3COMPONENTS BIT(14)
#define PPP_SRC_INTERLVD_4COMPONENTS (BIT(14)|BIT(13))
#define PPP_SRC_UNPACK_TIGHT BIT(17)
#define PPP_SRC_UNPACK_LOOSE 0
#define PPP_SRC_UNPACK_ALIGN_LSB 0
#define PPP_SRC_UNPACK_ALIGN_MSB BIT(18)
#define PPP_SRC_FETCH_PLANES_INTERLVD 0
#define PPP_SRC_FETCH_PLANES_PSEUDOPLNR BIT(20)
#define PPP_OP_SRC_CHROMA_H2V1 BIT(18)
#define PPP_OP_SRC_CHROMA_H1V2 BIT(19)
#define PPP_OP_SRC_CHROMA_420 (BIT(18)|BIT(19))
#define PPP_OP_SRC_CHROMA_OFFSITE BIT(20)
#define PPP_DST_PACKET_CNT_INTERLVD_2ELEM BIT(9)
#define PPP_DST_PACKET_CNT_INTERLVD_3ELEM BIT(10)
#define PPP_DST_PACKET_CNT_INTERLVD_4ELEM (BIT(10)|BIT(9))
#define PPP_DST_PACKET_CNT_INTERLVD_6ELEM (BIT(11)|BIT(9))
#define PPP_DST_C3A_8BIT (BIT(7)|BIT(6))
#define PPP_DST_C3ALPHA_EN BIT(8)
#define PPP_DST_PACK_LOOSE 0
#define PPP_DST_PACK_TIGHT BIT(13)
#define PPP_DST_PACK_ALIGN_LSB 0
#define PPP_DST_PACK_ALIGN_MSB BIT(14)
#define PPP_DST_OUT_SEL_AXI 0
#define PPP_DST_OUT_SEL_MDDI BIT(15)
#define PPP_DST_BPP_2BYTES BIT(16)
#define PPP_DST_BPP_3BYTES BIT(17)
#define PPP_DST_BPP_4BYTES (BIT(17)|BIT(16))
#define PPP_DST_PLANE_INTERLVD 0
#define PPP_DST_PLANE_PLANAR BIT(18)
#define PPP_DST_PLANE_PSEUDOPLN BIT(19)
#define PPP_OP_DST_CHROMA_H2V1 BIT(21)
#define PPP_OP_DST_CHROMA_420 (BIT(21)|BIT(22))
#define PPP_OP_COLOR_SPACE_YCBCR BIT(17)
#define MDP_SCALE_Q_FACTOR 512
#define MDP_MAX_X_SCALE_FACTOR (MDP_SCALE_Q_FACTOR*4)
#define MDP_MIN_X_SCALE_FACTOR (MDP_SCALE_Q_FACTOR/4)
#define MDP_MAX_Y_SCALE_FACTOR (MDP_SCALE_Q_FACTOR*4)
#define MDP_MIN_Y_SCALE_FACTOR (MDP_SCALE_Q_FACTOR/4)
#define MDP_TOP_LUMA 16
#define MDP_TOP_CHROMA 0
#define MDP_BOTTOM_LUMA 19
#define MDP_BOTTOM_CHROMA 3
#define MDP_LEFT_LUMA 22
#define MDP_LEFT_CHROMA 6
#define MDP_RIGHT_LUMA 25
#define MDP_RIGHT_CHROMA 9
#define MDP_RGB_565_SRC_REG (PPP_C2R_5BITS | PPP_C0G_6BITS | \
PPP_C1B_5BITS | PPP_SRC_BPP_INTERLVD_2BYTES | \
PPP_SRC_INTERLVD_3COMPONENTS | PPP_SRC_UNPACK_TIGHT | \
PPP_SRC_UNPACK_ALIGN_LSB | \
PPP_SRC_FETCH_PLANES_INTERLVD)
#define MDP_RGB_888_SRC_REG (PPP_C2R_8BITS | PPP_C0G_8BITS | \
PPP_C1B_8BITS | PPP_SRC_BPP_INTERLVD_3BYTES | \
PPP_SRC_INTERLVD_3COMPONENTS | PPP_SRC_UNPACK_TIGHT | \
PPP_SRC_UNPACK_ALIGN_LSB | PPP_SRC_FETCH_PLANES_INTERLVD)
#define MDP_RGBX_8888_SRC_REG (PPP_C2R_8BITS | PPP_C0G_8BITS | \
PPP_C1B_8BITS | PPP_C3A_8BITS | \
PPP_SRC_C3_ALPHA_EN | PPP_SRC_BPP_INTERLVD_4BYTES | \
PPP_SRC_INTERLVD_4COMPONENTS | PPP_SRC_UNPACK_TIGHT | \
PPP_SRC_UNPACK_ALIGN_LSB | \
PPP_SRC_FETCH_PLANES_INTERLVD)
#define MDP_Y_CBCR_H2V2_SRC_REG (PPP_C2R_8BITS | PPP_C0G_8BITS | \
PPP_C1B_8BITS | PPP_SRC_BPP_INTERLVD_2BYTES | \
PPP_SRC_INTERLVD_2COMPONENTS | PPP_SRC_UNPACK_TIGHT | \
PPP_SRC_UNPACK_ALIGN_LSB | \
PPP_SRC_FETCH_PLANES_PSEUDOPLNR)
#define MDP_YCRYCB_H2V1_SRC_REG (PPP_C2R_8BITS | \
PPP_C0G_8BITS | PPP_C1B_8BITS | \
PPP_C3A_8BITS | PPP_SRC_BPP_INTERLVD_2BYTES | \
PPP_SRC_INTERLVD_4COMPONENTS | \
PPP_SRC_UNPACK_TIGHT | PPP_SRC_UNPACK_ALIGN_LSB)
#define MDP_Y_CRCB_H2V1_SRC_REG (PPP_C2R_8BITS | \
PPP_C0G_8BITS | PPP_C1B_8BITS | \
PPP_C3A_8BITS | PPP_SRC_BPP_INTERLVD_2BYTES | \
PPP_SRC_INTERLVD_2COMPONENTS | PPP_SRC_UNPACK_TIGHT | \
PPP_SRC_UNPACK_ALIGN_LSB | PPP_SRC_FETCH_PLANES_PSEUDOPLNR)
#define MDP_RGB_565_DST_REG (PPP_C0G_6BITS | \
PPP_C1B_5BITS | PPP_C2R_5BITS | \
PPP_DST_PACKET_CNT_INTERLVD_3ELEM | \
PPP_DST_PACK_TIGHT | PPP_DST_PACK_ALIGN_LSB | \
PPP_DST_OUT_SEL_AXI | PPP_DST_BPP_2BYTES | \
PPP_DST_PLANE_INTERLVD)
#define MDP_RGB_888_DST_REG (PPP_C0G_8BITS | \
PPP_C1B_8BITS | PPP_C2R_8BITS | \
PPP_DST_PACKET_CNT_INTERLVD_3ELEM | PPP_DST_PACK_TIGHT | \
PPP_DST_PACK_ALIGN_LSB | PPP_DST_OUT_SEL_AXI | \
PPP_DST_BPP_3BYTES | PPP_DST_PLANE_INTERLVD)
#define MDP_RGBX_8888_DST_REG (PPP_C0G_8BITS | \
PPP_C1B_8BITS | PPP_C2R_8BITS | PPP_C3A_8BITS | \
PPP_DST_C3ALPHA_EN | PPP_DST_PACKET_CNT_INTERLVD_4ELEM | \
PPP_DST_PACK_TIGHT | PPP_DST_PACK_ALIGN_LSB | \
PPP_DST_OUT_SEL_AXI | PPP_DST_BPP_4BYTES | \
PPP_DST_PLANE_INTERLVD)
#define MDP_Y_CBCR_H2V2_DST_REG (PPP_C2R_8BITS | \
PPP_C0G_8BITS | PPP_C1B_8BITS | PPP_C3A_8BITS | \
PPP_DST_PACKET_CNT_INTERLVD_2ELEM | \
PPP_DST_PACK_TIGHT | PPP_DST_PACK_ALIGN_LSB | \
PPP_DST_OUT_SEL_AXI | PPP_DST_BPP_2BYTES)
#define MDP_YCRYCB_H2V1_DST_REG (PPP_C2R_8BITS | PPP_C0G_8BITS | \
PPP_C1B_8BITS | PPP_C3A_8BITS | PPP_DST_PACKET_CNT_INTERLVD_4ELEM | \
PPP_DST_PACK_TIGHT | PPP_DST_PACK_ALIGN_LSB | \
PPP_DST_OUT_SEL_AXI | PPP_DST_BPP_2BYTES | \
PPP_DST_PLANE_INTERLVD)
#define MDP_Y_CRCB_H2V1_DST_REG (PPP_C2R_8BITS | \
PPP_C0G_8BITS | PPP_C1B_8BITS | PPP_C3A_8BITS | \
PPP_DST_PACKET_CNT_INTERLVD_2ELEM | PPP_DST_PACK_TIGHT | \
PPP_DST_PACK_ALIGN_LSB | PPP_DST_OUT_SEL_AXI | \
PPP_DST_BPP_2BYTES)
/* LUT */
#define MDP_LUT_C0_EN BIT(5)
#define MDP_LUT_C1_EN BIT(6)
#define MDP_LUT_C2_EN BIT(7)
/* Dither */
#define MDP_OP_DITHER_EN BIT(16)
/* Rotator */
#define MDP_OP_ROT_ON BIT(8)
#define MDP_OP_ROT_90 BIT(9)
#define MDP_OP_FLIP_LR BIT(10)
#define MDP_OP_FLIP_UD BIT(11)
/* Blend */
#define MDP_OP_BLEND_EN BIT(12)
#define MDP_OP_BLEND_EQ_SEL BIT(15)
#define MDP_OP_BLEND_TRANSP_EN BIT(24)
#define MDP_BLEND_MASK (MDP_OP_BLEND_EN | MDP_OP_BLEND_EQ_SEL | \
MDP_OP_BLEND_TRANSP_EN | BIT(14) | BIT(13))
#define MDP_BLEND_ALPHA_SEL 13
#define MDP_BLEND_ALPHA_MASK 0x3
#define MDP_BLEND_CONST_ALPHA 24
#define MDP_BLEND_TRASP_COL_MASK 0xFFFFFF
/* CSC Matrix */
#define MDP_CSC_RGB2YUV 0
#define MDP_CSC_YUV2RGB 1
#define MDP_CSC_SIZE 9
#define MDP_BV_SIZE 3
#define MDP_LV_SIZE 4
enum ppp_lut_type {
LUT_PRE_TABLE = 0,
LUT_POST_TABLE,
};
enum ppp_csc_matrix {
CSC_PRIMARY_MATRIX = 0,
CSC_SECONDARY_MATRIX,
};
/* scale tables */
enum {
PPP_DOWNSCALE_PT2TOPT4,
PPP_DOWNSCALE_PT4TOPT6,
PPP_DOWNSCALE_PT6TOPT8,
PPP_DOWNSCALE_PT8TOPT1,
PPP_DOWNSCALE_MAX,
};
struct ppp_table {
uint32_t reg;
uint32_t val;
};
struct ppp_csc_table {
int direction; /* MDP_CCS_RGB2YUV or YUV2RGB */
uint16_t fwd_matrix[MDP_CCS_SIZE]; /* 3x3 color coefficients */
uint16_t rev_matrix[MDP_CCS_SIZE]; /* 3x3 color coefficients */
uint16_t bv[MDP_BV_SIZE]; /* 1x3 bias vector */
uint16_t lv[MDP_LV_SIZE]; /* 1x3 limit vector */
};
struct ppp_blend {
int const_alpha;
int trans_color; /*color keying*/
};
struct ppp_img_prop {
int32_t x;
int32_t y;
uint32_t width;
uint32_t height;
};
struct ppp_img_desc {
struct ppp_img_prop prop;
struct ppp_img_prop roi;
int color_fmt;
void *p0; /* plane 0 */
void *p1;
void *p3;
int stride0;
int stride1;
int stride2;
};
struct ppp_blit_op {
struct ppp_img_desc src;
struct ppp_img_desc dst;
struct ppp_img_desc bg;
struct ppp_blend blend;
uint32_t mdp_op; /* Operations */
};
struct ppp_edge_rep {
uint32_t dst_roi_width;
uint32_t dst_roi_height;
uint32_t is_scale_enabled;
/*
* positions of the luma pixel(relative to the image ) required for
* scaling the ROI
*/
int32_t luma_interp_point_left;
int32_t luma_interp_point_right;
int32_t luma_interp_point_top;
int32_t luma_interp_point_bottom;
/*
* positions of the chroma pixel(relative to the image ) required for
* interpolating a chroma value at all required luma positions
*/
int32_t chroma_interp_point_left;
int32_t chroma_interp_point_right;
int32_t chroma_interp_point_top;
int32_t chroma_interp_point_bottom;
/*
* a rectangular region within the chroma plane of the "image".
* Chroma pixels falling inside of this rectangle belongs to the ROI
*/
int32_t chroma_bound_left;
int32_t chroma_bound_right;
int32_t chroma_bound_top;
int32_t chroma_bound_bottom;
/*
* number of chroma pixels to replicate on the left, right,
* top and bottom edge of the ROI.
*/
int32_t chroma_repeat_left;
int32_t chroma_repeat_right;
int32_t chroma_repeat_top;
int32_t chroma_repeat_bottom;
/*
* number of luma pixels to replicate on the left, right,
* top and bottom edge of the ROI.
*/
int32_t luma_repeat_left;
int32_t luma_repeat_right;
int32_t luma_repeat_top;
int32_t luma_repeat_bottom;
};
/* func for ppp register values */
uint32_t ppp_bpp(uint32_t type);
uint32_t ppp_src_config(uint32_t type);
uint32_t ppp_out_config(uint32_t type);
uint32_t ppp_pack_pattern(uint32_t type);
uint32_t ppp_dst_op_reg(uint32_t type);
uint32_t ppp_src_op_reg(uint32_t type);
bool ppp_per_p_alpha(uint32_t type);
bool ppp_multi_plane(uint32_t type);
uint32_t *ppp_default_pre_lut(void);
uint32_t *ppp_default_post_lut(void);
struct ppp_csc_table *ppp_csc_rgb2yuv(void);
struct ppp_csc_table *ppp_csc_table2(void);
void ppp_load_up_lut(void);
void ppp_load_gaussian_lut(void);
void ppp_load_x_scale_table(int idx);
void ppp_load_y_scale_table(int idx);
int mdp3_ppp_res_init(struct msm_fb_data_type *mfd);
int mdp3_ppp_init(void);
int config_ppp_op_mode(struct ppp_blit_op *blit_op);
void ppp_enable(void);
int mdp3_ppp_parse_req(void __user *p,
struct mdp_async_blit_req_list *req_list_header,
int async);
#endif