1*61890ccaSMoudy Ho /* SPDX-License-Identifier: GPL-2.0-only */ 2*61890ccaSMoudy Ho /* 3*61890ccaSMoudy Ho * Copyright (c) 2022 MediaTek Inc. 4*61890ccaSMoudy Ho * Author: Ping-Hsun Wu <ping-hsun.wu@mediatek.com> 5*61890ccaSMoudy Ho */ 6*61890ccaSMoudy Ho 7*61890ccaSMoudy Ho #ifndef __MTK_MDP3_REGS_H__ 8*61890ccaSMoudy Ho #define __MTK_MDP3_REGS_H__ 9*61890ccaSMoudy Ho 10*61890ccaSMoudy Ho #include <linux/videodev2.h> 11*61890ccaSMoudy Ho #include <media/videobuf2-core.h> 12*61890ccaSMoudy Ho #include "mtk-img-ipi.h" 13*61890ccaSMoudy Ho 14*61890ccaSMoudy Ho /* 15*61890ccaSMoudy Ho * MDP native color code 16*61890ccaSMoudy Ho * Plane count: 1, 2, 3 17*61890ccaSMoudy Ho * H-subsample: 0, 1, 2 18*61890ccaSMoudy Ho * V-subsample: 0, 1 19*61890ccaSMoudy Ho * Color group: 0-RGB, 1-YUV, 2-raw 20*61890ccaSMoudy Ho */ 21*61890ccaSMoudy Ho #define MDP_COLOR(PACKED, LOOSE, VIDEO, PLANE, HF, VF, BITS, GROUP, SWAP, ID)\ 22*61890ccaSMoudy Ho (((PACKED) << 27) | ((LOOSE) << 26) | ((VIDEO) << 23) |\ 23*61890ccaSMoudy Ho ((PLANE) << 21) | ((HF) << 19) | ((VF) << 18) | ((BITS) << 8) |\ 24*61890ccaSMoudy Ho ((GROUP) << 6) | ((SWAP) << 5) | ((ID) << 0)) 25*61890ccaSMoudy Ho 26*61890ccaSMoudy Ho #define MDP_COLOR_IS_10BIT_PACKED(c) ((0x08000000 & (c)) >> 27) 27*61890ccaSMoudy Ho #define MDP_COLOR_IS_10BIT_LOOSE(c) (((0x0c000000 & (c)) >> 26) == 1) 28*61890ccaSMoudy Ho #define MDP_COLOR_IS_10BIT_TILE(c) (((0x0c000000 & (c)) >> 26) == 3) 29*61890ccaSMoudy Ho #define MDP_COLOR_IS_UFP(c) ((0x02000000 & (c)) >> 25) 30*61890ccaSMoudy Ho #define MDP_COLOR_IS_INTERLACED(c) ((0x01000000 & (c)) >> 24) 31*61890ccaSMoudy Ho #define MDP_COLOR_IS_BLOCK_MODE(c) ((0x00800000 & (c)) >> 23) 32*61890ccaSMoudy Ho #define MDP_COLOR_GET_PLANE_COUNT(c) ((0x00600000 & (c)) >> 21) 33*61890ccaSMoudy Ho #define MDP_COLOR_GET_H_SUBSAMPLE(c) ((0x00180000 & (c)) >> 19) 34*61890ccaSMoudy Ho #define MDP_COLOR_GET_V_SUBSAMPLE(c) ((0x00040000 & (c)) >> 18) 35*61890ccaSMoudy Ho #define MDP_COLOR_BITS_PER_PIXEL(c) ((0x0003ff00 & (c)) >> 8) 36*61890ccaSMoudy Ho #define MDP_COLOR_GET_GROUP(c) ((0x000000c0 & (c)) >> 6) 37*61890ccaSMoudy Ho #define MDP_COLOR_IS_SWAPPED(c) ((0x00000020 & (c)) >> 5) 38*61890ccaSMoudy Ho #define MDP_COLOR_GET_UNIQUE_ID(c) ((0x0000001f & (c)) >> 0) 39*61890ccaSMoudy Ho #define MDP_COLOR_GET_HW_FORMAT(c) ((0x0000001f & (c)) >> 0) 40*61890ccaSMoudy Ho 41*61890ccaSMoudy Ho #define MDP_COLOR_IS_RGB(c) (MDP_COLOR_GET_GROUP(c) == 0) 42*61890ccaSMoudy Ho #define MDP_COLOR_IS_YUV(c) (MDP_COLOR_GET_GROUP(c) == 1) 43*61890ccaSMoudy Ho 44*61890ccaSMoudy Ho enum mdp_color { 45*61890ccaSMoudy Ho MDP_COLOR_UNKNOWN = 0, 46*61890ccaSMoudy Ho 47*61890ccaSMoudy Ho //MDP_COLOR_FULLG8, 48*61890ccaSMoudy Ho MDP_COLOR_FULLG8_RGGB = MDP_COLOR(0, 0, 0, 1, 0, 0, 8, 2, 0, 21), 49*61890ccaSMoudy Ho MDP_COLOR_FULLG8_GRBG = MDP_COLOR(0, 0, 0, 1, 0, 1, 8, 2, 0, 21), 50*61890ccaSMoudy Ho MDP_COLOR_FULLG8_GBRG = MDP_COLOR(0, 0, 0, 1, 1, 0, 8, 2, 0, 21), 51*61890ccaSMoudy Ho MDP_COLOR_FULLG8_BGGR = MDP_COLOR(0, 0, 0, 1, 1, 1, 8, 2, 0, 21), 52*61890ccaSMoudy Ho MDP_COLOR_FULLG8 = MDP_COLOR_FULLG8_BGGR, 53*61890ccaSMoudy Ho 54*61890ccaSMoudy Ho //MDP_COLOR_FULLG10, 55*61890ccaSMoudy Ho MDP_COLOR_FULLG10_RGGB = MDP_COLOR(0, 0, 0, 1, 0, 0, 10, 2, 0, 21), 56*61890ccaSMoudy Ho MDP_COLOR_FULLG10_GRBG = MDP_COLOR(0, 0, 0, 1, 0, 1, 10, 2, 0, 21), 57*61890ccaSMoudy Ho MDP_COLOR_FULLG10_GBRG = MDP_COLOR(0, 0, 0, 1, 1, 0, 10, 2, 0, 21), 58*61890ccaSMoudy Ho MDP_COLOR_FULLG10_BGGR = MDP_COLOR(0, 0, 0, 1, 1, 1, 10, 2, 0, 21), 59*61890ccaSMoudy Ho MDP_COLOR_FULLG10 = MDP_COLOR_FULLG10_BGGR, 60*61890ccaSMoudy Ho 61*61890ccaSMoudy Ho //MDP_COLOR_FULLG12, 62*61890ccaSMoudy Ho MDP_COLOR_FULLG12_RGGB = MDP_COLOR(0, 0, 0, 1, 0, 0, 12, 2, 0, 21), 63*61890ccaSMoudy Ho MDP_COLOR_FULLG12_GRBG = MDP_COLOR(0, 0, 0, 1, 0, 1, 12, 2, 0, 21), 64*61890ccaSMoudy Ho MDP_COLOR_FULLG12_GBRG = MDP_COLOR(0, 0, 0, 1, 1, 0, 12, 2, 0, 21), 65*61890ccaSMoudy Ho MDP_COLOR_FULLG12_BGGR = MDP_COLOR(0, 0, 0, 1, 1, 1, 12, 2, 0, 21), 66*61890ccaSMoudy Ho MDP_COLOR_FULLG12 = MDP_COLOR_FULLG12_BGGR, 67*61890ccaSMoudy Ho 68*61890ccaSMoudy Ho //MDP_COLOR_FULLG14, 69*61890ccaSMoudy Ho MDP_COLOR_FULLG14_RGGB = MDP_COLOR(0, 0, 0, 1, 0, 0, 14, 2, 0, 21), 70*61890ccaSMoudy Ho MDP_COLOR_FULLG14_GRBG = MDP_COLOR(0, 0, 0, 1, 0, 1, 14, 2, 0, 21), 71*61890ccaSMoudy Ho MDP_COLOR_FULLG14_GBRG = MDP_COLOR(0, 0, 0, 1, 1, 0, 14, 2, 0, 21), 72*61890ccaSMoudy Ho MDP_COLOR_FULLG14_BGGR = MDP_COLOR(0, 0, 0, 1, 1, 1, 14, 2, 0, 21), 73*61890ccaSMoudy Ho MDP_COLOR_FULLG14 = MDP_COLOR_FULLG14_BGGR, 74*61890ccaSMoudy Ho 75*61890ccaSMoudy Ho MDP_COLOR_UFO10 = MDP_COLOR(0, 0, 0, 1, 0, 0, 10, 2, 0, 24), 76*61890ccaSMoudy Ho 77*61890ccaSMoudy Ho //MDP_COLOR_BAYER8, 78*61890ccaSMoudy Ho MDP_COLOR_BAYER8_RGGB = MDP_COLOR(0, 0, 0, 1, 0, 0, 8, 2, 0, 20), 79*61890ccaSMoudy Ho MDP_COLOR_BAYER8_GRBG = MDP_COLOR(0, 0, 0, 1, 0, 1, 8, 2, 0, 20), 80*61890ccaSMoudy Ho MDP_COLOR_BAYER8_GBRG = MDP_COLOR(0, 0, 0, 1, 1, 0, 8, 2, 0, 20), 81*61890ccaSMoudy Ho MDP_COLOR_BAYER8_BGGR = MDP_COLOR(0, 0, 0, 1, 1, 1, 8, 2, 0, 20), 82*61890ccaSMoudy Ho MDP_COLOR_BAYER8 = MDP_COLOR_BAYER8_BGGR, 83*61890ccaSMoudy Ho 84*61890ccaSMoudy Ho //MDP_COLOR_BAYER10, 85*61890ccaSMoudy Ho MDP_COLOR_BAYER10_RGGB = MDP_COLOR(0, 0, 0, 1, 0, 0, 10, 2, 0, 20), 86*61890ccaSMoudy Ho MDP_COLOR_BAYER10_GRBG = MDP_COLOR(0, 0, 0, 1, 0, 1, 10, 2, 0, 20), 87*61890ccaSMoudy Ho MDP_COLOR_BAYER10_GBRG = MDP_COLOR(0, 0, 0, 1, 1, 0, 10, 2, 0, 20), 88*61890ccaSMoudy Ho MDP_COLOR_BAYER10_BGGR = MDP_COLOR(0, 0, 0, 1, 1, 1, 10, 2, 0, 20), 89*61890ccaSMoudy Ho MDP_COLOR_BAYER10 = MDP_COLOR_BAYER10_BGGR, 90*61890ccaSMoudy Ho 91*61890ccaSMoudy Ho //MDP_COLOR_BAYER12, 92*61890ccaSMoudy Ho MDP_COLOR_BAYER12_RGGB = MDP_COLOR(0, 0, 0, 1, 0, 0, 12, 2, 0, 20), 93*61890ccaSMoudy Ho MDP_COLOR_BAYER12_GRBG = MDP_COLOR(0, 0, 0, 1, 0, 1, 12, 2, 0, 20), 94*61890ccaSMoudy Ho MDP_COLOR_BAYER12_GBRG = MDP_COLOR(0, 0, 0, 1, 1, 0, 12, 2, 0, 20), 95*61890ccaSMoudy Ho MDP_COLOR_BAYER12_BGGR = MDP_COLOR(0, 0, 0, 1, 1, 1, 12, 2, 0, 20), 96*61890ccaSMoudy Ho MDP_COLOR_BAYER12 = MDP_COLOR_BAYER12_BGGR, 97*61890ccaSMoudy Ho 98*61890ccaSMoudy Ho //MDP_COLOR_BAYER14, 99*61890ccaSMoudy Ho MDP_COLOR_BAYER14_RGGB = MDP_COLOR(0, 0, 0, 1, 0, 0, 14, 2, 0, 20), 100*61890ccaSMoudy Ho MDP_COLOR_BAYER14_GRBG = MDP_COLOR(0, 0, 0, 1, 0, 1, 14, 2, 0, 20), 101*61890ccaSMoudy Ho MDP_COLOR_BAYER14_GBRG = MDP_COLOR(0, 0, 0, 1, 1, 0, 14, 2, 0, 20), 102*61890ccaSMoudy Ho MDP_COLOR_BAYER14_BGGR = MDP_COLOR(0, 0, 0, 1, 1, 1, 14, 2, 0, 20), 103*61890ccaSMoudy Ho MDP_COLOR_BAYER14 = MDP_COLOR_BAYER14_BGGR, 104*61890ccaSMoudy Ho 105*61890ccaSMoudy Ho MDP_COLOR_RGB48 = MDP_COLOR(0, 0, 0, 1, 0, 0, 48, 0, 0, 23), 106*61890ccaSMoudy Ho /* For bayer+mono raw-16 */ 107*61890ccaSMoudy Ho MDP_COLOR_RGB565_RAW = MDP_COLOR(0, 0, 0, 1, 0, 0, 16, 2, 0, 0), 108*61890ccaSMoudy Ho 109*61890ccaSMoudy Ho MDP_COLOR_BAYER8_UNPAK = MDP_COLOR(0, 0, 0, 1, 0, 0, 8, 2, 0, 22), 110*61890ccaSMoudy Ho MDP_COLOR_BAYER10_UNPAK = MDP_COLOR(0, 0, 0, 1, 0, 0, 10, 2, 0, 22), 111*61890ccaSMoudy Ho MDP_COLOR_BAYER12_UNPAK = MDP_COLOR(0, 0, 0, 1, 0, 0, 12, 2, 0, 22), 112*61890ccaSMoudy Ho MDP_COLOR_BAYER14_UNPAK = MDP_COLOR(0, 0, 0, 1, 0, 0, 14, 2, 0, 22), 113*61890ccaSMoudy Ho 114*61890ccaSMoudy Ho /* Unified formats */ 115*61890ccaSMoudy Ho MDP_COLOR_GREY = MDP_COLOR(0, 0, 0, 1, 0, 0, 8, 1, 0, 7), 116*61890ccaSMoudy Ho 117*61890ccaSMoudy Ho MDP_COLOR_RGB565 = MDP_COLOR(0, 0, 0, 1, 0, 0, 16, 0, 0, 0), 118*61890ccaSMoudy Ho MDP_COLOR_BGR565 = MDP_COLOR(0, 0, 0, 1, 0, 0, 16, 0, 1, 0), 119*61890ccaSMoudy Ho MDP_COLOR_RGB888 = MDP_COLOR(0, 0, 0, 1, 0, 0, 24, 0, 1, 1), 120*61890ccaSMoudy Ho MDP_COLOR_BGR888 = MDP_COLOR(0, 0, 0, 1, 0, 0, 24, 0, 0, 1), 121*61890ccaSMoudy Ho MDP_COLOR_RGBA8888 = MDP_COLOR(0, 0, 0, 1, 0, 0, 32, 0, 1, 2), 122*61890ccaSMoudy Ho MDP_COLOR_BGRA8888 = MDP_COLOR(0, 0, 0, 1, 0, 0, 32, 0, 0, 2), 123*61890ccaSMoudy Ho MDP_COLOR_ARGB8888 = MDP_COLOR(0, 0, 0, 1, 0, 0, 32, 0, 1, 3), 124*61890ccaSMoudy Ho MDP_COLOR_ABGR8888 = MDP_COLOR(0, 0, 0, 1, 0, 0, 32, 0, 0, 3), 125*61890ccaSMoudy Ho 126*61890ccaSMoudy Ho MDP_COLOR_UYVY = MDP_COLOR(0, 0, 0, 1, 1, 0, 16, 1, 0, 4), 127*61890ccaSMoudy Ho MDP_COLOR_VYUY = MDP_COLOR(0, 0, 0, 1, 1, 0, 16, 1, 1, 4), 128*61890ccaSMoudy Ho MDP_COLOR_YUYV = MDP_COLOR(0, 0, 0, 1, 1, 0, 16, 1, 0, 5), 129*61890ccaSMoudy Ho MDP_COLOR_YVYU = MDP_COLOR(0, 0, 0, 1, 1, 0, 16, 1, 1, 5), 130*61890ccaSMoudy Ho 131*61890ccaSMoudy Ho MDP_COLOR_I420 = MDP_COLOR(0, 0, 0, 3, 1, 1, 8, 1, 0, 8), 132*61890ccaSMoudy Ho MDP_COLOR_YV12 = MDP_COLOR(0, 0, 0, 3, 1, 1, 8, 1, 1, 8), 133*61890ccaSMoudy Ho MDP_COLOR_I422 = MDP_COLOR(0, 0, 0, 3, 1, 0, 8, 1, 0, 9), 134*61890ccaSMoudy Ho MDP_COLOR_YV16 = MDP_COLOR(0, 0, 0, 3, 1, 0, 8, 1, 1, 9), 135*61890ccaSMoudy Ho MDP_COLOR_I444 = MDP_COLOR(0, 0, 0, 3, 0, 0, 8, 1, 0, 10), 136*61890ccaSMoudy Ho MDP_COLOR_YV24 = MDP_COLOR(0, 0, 0, 3, 0, 0, 8, 1, 1, 10), 137*61890ccaSMoudy Ho 138*61890ccaSMoudy Ho MDP_COLOR_NV12 = MDP_COLOR(0, 0, 0, 2, 1, 1, 8, 1, 0, 12), 139*61890ccaSMoudy Ho MDP_COLOR_NV21 = MDP_COLOR(0, 0, 0, 2, 1, 1, 8, 1, 1, 12), 140*61890ccaSMoudy Ho MDP_COLOR_NV16 = MDP_COLOR(0, 0, 0, 2, 1, 0, 8, 1, 0, 13), 141*61890ccaSMoudy Ho MDP_COLOR_NV61 = MDP_COLOR(0, 0, 0, 2, 1, 0, 8, 1, 1, 13), 142*61890ccaSMoudy Ho MDP_COLOR_NV24 = MDP_COLOR(0, 0, 0, 2, 0, 0, 8, 1, 0, 14), 143*61890ccaSMoudy Ho MDP_COLOR_NV42 = MDP_COLOR(0, 0, 0, 2, 0, 0, 8, 1, 1, 14), 144*61890ccaSMoudy Ho 145*61890ccaSMoudy Ho /* MediaTek proprietary formats */ 146*61890ccaSMoudy Ho /* UFO encoded block mode */ 147*61890ccaSMoudy Ho MDP_COLOR_420_BLK_UFO = MDP_COLOR(0, 0, 5, 2, 1, 1, 256, 1, 0, 12), 148*61890ccaSMoudy Ho /* Block mode */ 149*61890ccaSMoudy Ho MDP_COLOR_420_BLK = MDP_COLOR(0, 0, 1, 2, 1, 1, 256, 1, 0, 12), 150*61890ccaSMoudy Ho /* Block mode + field mode */ 151*61890ccaSMoudy Ho MDP_COLOR_420_BLKI = MDP_COLOR(0, 0, 3, 2, 1, 1, 256, 1, 0, 12), 152*61890ccaSMoudy Ho /* Block mode */ 153*61890ccaSMoudy Ho MDP_COLOR_422_BLK = MDP_COLOR(0, 0, 1, 1, 1, 0, 512, 1, 0, 4), 154*61890ccaSMoudy Ho 155*61890ccaSMoudy Ho MDP_COLOR_IYU2 = MDP_COLOR(0, 0, 0, 1, 0, 0, 24, 1, 0, 25), 156*61890ccaSMoudy Ho MDP_COLOR_YUV444 = MDP_COLOR(0, 0, 0, 1, 0, 0, 24, 1, 0, 30), 157*61890ccaSMoudy Ho 158*61890ccaSMoudy Ho /* Packed 10-bit formats */ 159*61890ccaSMoudy Ho MDP_COLOR_RGBA1010102 = MDP_COLOR(1, 0, 0, 1, 0, 0, 32, 0, 1, 2), 160*61890ccaSMoudy Ho MDP_COLOR_BGRA1010102 = MDP_COLOR(1, 0, 0, 1, 0, 0, 32, 0, 0, 2), 161*61890ccaSMoudy Ho /* Packed 10-bit UYVY */ 162*61890ccaSMoudy Ho MDP_COLOR_UYVY_10P = MDP_COLOR(1, 0, 0, 1, 1, 0, 20, 1, 0, 4), 163*61890ccaSMoudy Ho /* Packed 10-bit NV21 */ 164*61890ccaSMoudy Ho MDP_COLOR_NV21_10P = MDP_COLOR(1, 0, 0, 2, 1, 1, 10, 1, 1, 12), 165*61890ccaSMoudy Ho /* 10-bit block mode */ 166*61890ccaSMoudy Ho MDP_COLOR_420_BLK_10_H = MDP_COLOR(1, 0, 1, 2, 1, 1, 320, 1, 0, 12), 167*61890ccaSMoudy Ho /* 10-bit HEVC tile mode */ 168*61890ccaSMoudy Ho MDP_COLOR_420_BLK_10_V = MDP_COLOR(1, 1, 1, 2, 1, 1, 320, 1, 0, 12), 169*61890ccaSMoudy Ho /* UFO encoded 10-bit block mode */ 170*61890ccaSMoudy Ho MDP_COLOR_420_BLK_U10_H = MDP_COLOR(1, 0, 5, 2, 1, 1, 320, 1, 0, 12), 171*61890ccaSMoudy Ho /* UFO encoded 10-bit HEVC tile mode */ 172*61890ccaSMoudy Ho MDP_COLOR_420_BLK_U10_V = MDP_COLOR(1, 1, 5, 2, 1, 1, 320, 1, 0, 12), 173*61890ccaSMoudy Ho 174*61890ccaSMoudy Ho /* Loose 10-bit formats */ 175*61890ccaSMoudy Ho MDP_COLOR_UYVY_10L = MDP_COLOR(0, 1, 0, 1, 1, 0, 20, 1, 0, 4), 176*61890ccaSMoudy Ho MDP_COLOR_VYUY_10L = MDP_COLOR(0, 1, 0, 1, 1, 0, 20, 1, 1, 4), 177*61890ccaSMoudy Ho MDP_COLOR_YUYV_10L = MDP_COLOR(0, 1, 0, 1, 1, 0, 20, 1, 0, 5), 178*61890ccaSMoudy Ho MDP_COLOR_YVYU_10L = MDP_COLOR(0, 1, 0, 1, 1, 0, 20, 1, 1, 5), 179*61890ccaSMoudy Ho MDP_COLOR_NV12_10L = MDP_COLOR(0, 1, 0, 2, 1, 1, 10, 1, 0, 12), 180*61890ccaSMoudy Ho MDP_COLOR_NV21_10L = MDP_COLOR(0, 1, 0, 2, 1, 1, 10, 1, 1, 12), 181*61890ccaSMoudy Ho MDP_COLOR_NV16_10L = MDP_COLOR(0, 1, 0, 2, 1, 0, 10, 1, 0, 13), 182*61890ccaSMoudy Ho MDP_COLOR_NV61_10L = MDP_COLOR(0, 1, 0, 2, 1, 0, 10, 1, 1, 13), 183*61890ccaSMoudy Ho MDP_COLOR_YV12_10L = MDP_COLOR(0, 1, 0, 3, 1, 1, 10, 1, 1, 8), 184*61890ccaSMoudy Ho MDP_COLOR_I420_10L = MDP_COLOR(0, 1, 0, 3, 1, 1, 10, 1, 0, 8), 185*61890ccaSMoudy Ho }; 186*61890ccaSMoudy Ho 187*61890ccaSMoudy Ho static inline bool MDP_COLOR_IS_UV_COPLANE(enum mdp_color c) 188*61890ccaSMoudy Ho { 189*61890ccaSMoudy Ho return (MDP_COLOR_GET_PLANE_COUNT(c) == 2 && MDP_COLOR_IS_YUV(c)); 190*61890ccaSMoudy Ho } 191*61890ccaSMoudy Ho 192*61890ccaSMoudy Ho /* Minimum Y stride that is accepted by MDP HW */ 193*61890ccaSMoudy Ho static inline u32 mdp_color_get_min_y_stride(enum mdp_color c, u32 width) 194*61890ccaSMoudy Ho { 195*61890ccaSMoudy Ho return ((MDP_COLOR_BITS_PER_PIXEL(c) * width) + 4) >> 3; 196*61890ccaSMoudy Ho } 197*61890ccaSMoudy Ho 198*61890ccaSMoudy Ho /* Minimum UV stride that is accepted by MDP HW */ 199*61890ccaSMoudy Ho static inline u32 mdp_color_get_min_uv_stride(enum mdp_color c, u32 width) 200*61890ccaSMoudy Ho { 201*61890ccaSMoudy Ho u32 min_stride; 202*61890ccaSMoudy Ho 203*61890ccaSMoudy Ho if (MDP_COLOR_GET_PLANE_COUNT(c) == 1) 204*61890ccaSMoudy Ho return 0; 205*61890ccaSMoudy Ho min_stride = mdp_color_get_min_y_stride(c, width) 206*61890ccaSMoudy Ho >> MDP_COLOR_GET_H_SUBSAMPLE(c); 207*61890ccaSMoudy Ho if (MDP_COLOR_IS_UV_COPLANE(c) && !MDP_COLOR_IS_BLOCK_MODE(c)) 208*61890ccaSMoudy Ho min_stride = min_stride * 2; 209*61890ccaSMoudy Ho return min_stride; 210*61890ccaSMoudy Ho } 211*61890ccaSMoudy Ho 212*61890ccaSMoudy Ho /* Minimum Y plane size that is necessary in buffer */ 213*61890ccaSMoudy Ho static inline u32 mdp_color_get_min_y_size(enum mdp_color c, 214*61890ccaSMoudy Ho u32 width, u32 height) 215*61890ccaSMoudy Ho { 216*61890ccaSMoudy Ho if (MDP_COLOR_IS_BLOCK_MODE(c)) 217*61890ccaSMoudy Ho return ((MDP_COLOR_BITS_PER_PIXEL(c) * width) >> 8) * height; 218*61890ccaSMoudy Ho return mdp_color_get_min_y_stride(c, width) * height; 219*61890ccaSMoudy Ho } 220*61890ccaSMoudy Ho 221*61890ccaSMoudy Ho /* Minimum UV plane size that is necessary in buffer */ 222*61890ccaSMoudy Ho static inline u32 mdp_color_get_min_uv_size(enum mdp_color c, 223*61890ccaSMoudy Ho u32 width, u32 height) 224*61890ccaSMoudy Ho { 225*61890ccaSMoudy Ho height = height >> MDP_COLOR_GET_V_SUBSAMPLE(c); 226*61890ccaSMoudy Ho if (MDP_COLOR_IS_BLOCK_MODE(c) && (MDP_COLOR_GET_PLANE_COUNT(c) > 1)) 227*61890ccaSMoudy Ho return ((MDP_COLOR_BITS_PER_PIXEL(c) * width) >> 8) * height; 228*61890ccaSMoudy Ho return mdp_color_get_min_uv_stride(c, width) * height; 229*61890ccaSMoudy Ho } 230*61890ccaSMoudy Ho 231*61890ccaSMoudy Ho /* Combine colorspace, xfer_func, ycbcr_encoding, and quantization */ 232*61890ccaSMoudy Ho enum mdp_ycbcr_profile { 233*61890ccaSMoudy Ho /* V4L2_YCBCR_ENC_601 and V4L2_QUANTIZATION_LIM_RANGE */ 234*61890ccaSMoudy Ho MDP_YCBCR_PROFILE_BT601, 235*61890ccaSMoudy Ho /* V4L2_YCBCR_ENC_709 and V4L2_QUANTIZATION_LIM_RANGE */ 236*61890ccaSMoudy Ho MDP_YCBCR_PROFILE_BT709, 237*61890ccaSMoudy Ho /* V4L2_YCBCR_ENC_601 and V4L2_QUANTIZATION_FULL_RANGE */ 238*61890ccaSMoudy Ho MDP_YCBCR_PROFILE_JPEG, 239*61890ccaSMoudy Ho MDP_YCBCR_PROFILE_FULL_BT601 = MDP_YCBCR_PROFILE_JPEG, 240*61890ccaSMoudy Ho 241*61890ccaSMoudy Ho /* Colorspaces not support for capture */ 242*61890ccaSMoudy Ho /* V4L2_YCBCR_ENC_BT2020 and V4L2_QUANTIZATION_LIM_RANGE */ 243*61890ccaSMoudy Ho MDP_YCBCR_PROFILE_BT2020, 244*61890ccaSMoudy Ho /* V4L2_YCBCR_ENC_709 and V4L2_QUANTIZATION_FULL_RANGE */ 245*61890ccaSMoudy Ho MDP_YCBCR_PROFILE_FULL_BT709, 246*61890ccaSMoudy Ho /* V4L2_YCBCR_ENC_BT2020 and V4L2_QUANTIZATION_FULL_RANGE */ 247*61890ccaSMoudy Ho MDP_YCBCR_PROFILE_FULL_BT2020, 248*61890ccaSMoudy Ho }; 249*61890ccaSMoudy Ho 250*61890ccaSMoudy Ho #define MDP_FMT_FLAG_OUTPUT BIT(0) 251*61890ccaSMoudy Ho #define MDP_FMT_FLAG_CAPTURE BIT(1) 252*61890ccaSMoudy Ho 253*61890ccaSMoudy Ho struct mdp_format { 254*61890ccaSMoudy Ho u32 pixelformat; 255*61890ccaSMoudy Ho u32 mdp_color; 256*61890ccaSMoudy Ho u8 depth[VIDEO_MAX_PLANES]; 257*61890ccaSMoudy Ho u8 row_depth[VIDEO_MAX_PLANES]; 258*61890ccaSMoudy Ho u8 num_planes; 259*61890ccaSMoudy Ho u8 walign; 260*61890ccaSMoudy Ho u8 halign; 261*61890ccaSMoudy Ho u8 salign; 262*61890ccaSMoudy Ho u32 flags; 263*61890ccaSMoudy Ho }; 264*61890ccaSMoudy Ho 265*61890ccaSMoudy Ho struct mdp_pix_limit { 266*61890ccaSMoudy Ho u32 wmin; 267*61890ccaSMoudy Ho u32 hmin; 268*61890ccaSMoudy Ho u32 wmax; 269*61890ccaSMoudy Ho u32 hmax; 270*61890ccaSMoudy Ho }; 271*61890ccaSMoudy Ho 272*61890ccaSMoudy Ho struct mdp_limit { 273*61890ccaSMoudy Ho struct mdp_pix_limit out_limit; 274*61890ccaSMoudy Ho struct mdp_pix_limit cap_limit; 275*61890ccaSMoudy Ho u32 h_scale_up_max; 276*61890ccaSMoudy Ho u32 v_scale_up_max; 277*61890ccaSMoudy Ho u32 h_scale_down_max; 278*61890ccaSMoudy Ho u32 v_scale_down_max; 279*61890ccaSMoudy Ho }; 280*61890ccaSMoudy Ho 281*61890ccaSMoudy Ho enum mdp_stream_type { 282*61890ccaSMoudy Ho MDP_STREAM_TYPE_UNKNOWN, 283*61890ccaSMoudy Ho MDP_STREAM_TYPE_BITBLT, 284*61890ccaSMoudy Ho MDP_STREAM_TYPE_GPU_BITBLT, 285*61890ccaSMoudy Ho MDP_STREAM_TYPE_DUAL_BITBLT, 286*61890ccaSMoudy Ho MDP_STREAM_TYPE_2ND_BITBLT, 287*61890ccaSMoudy Ho MDP_STREAM_TYPE_ISP_IC, 288*61890ccaSMoudy Ho MDP_STREAM_TYPE_ISP_VR, 289*61890ccaSMoudy Ho MDP_STREAM_TYPE_ISP_ZSD, 290*61890ccaSMoudy Ho MDP_STREAM_TYPE_ISP_IP, 291*61890ccaSMoudy Ho MDP_STREAM_TYPE_ISP_VSS, 292*61890ccaSMoudy Ho MDP_STREAM_TYPE_ISP_ZSD_SLOW, 293*61890ccaSMoudy Ho MDP_STREAM_TYPE_WPE, 294*61890ccaSMoudy Ho MDP_STREAM_TYPE_WPE2, 295*61890ccaSMoudy Ho }; 296*61890ccaSMoudy Ho 297*61890ccaSMoudy Ho struct mdp_crop { 298*61890ccaSMoudy Ho struct v4l2_rect c; 299*61890ccaSMoudy Ho struct v4l2_fract left_subpix; 300*61890ccaSMoudy Ho struct v4l2_fract top_subpix; 301*61890ccaSMoudy Ho struct v4l2_fract width_subpix; 302*61890ccaSMoudy Ho struct v4l2_fract height_subpix; 303*61890ccaSMoudy Ho }; 304*61890ccaSMoudy Ho 305*61890ccaSMoudy Ho struct mdp_frame { 306*61890ccaSMoudy Ho struct v4l2_format format; 307*61890ccaSMoudy Ho const struct mdp_format *mdp_fmt; 308*61890ccaSMoudy Ho u32 ycbcr_prof; /* enum mdp_ycbcr_profile */ 309*61890ccaSMoudy Ho u32 usage; /* enum mdp_buffer_usage */ 310*61890ccaSMoudy Ho struct mdp_crop crop; 311*61890ccaSMoudy Ho struct v4l2_rect compose; 312*61890ccaSMoudy Ho s32 rotation; 313*61890ccaSMoudy Ho u32 hflip:1; 314*61890ccaSMoudy Ho u32 vflip:1; 315*61890ccaSMoudy Ho u32 hdr:1; 316*61890ccaSMoudy Ho u32 dre:1; 317*61890ccaSMoudy Ho u32 sharpness:1; 318*61890ccaSMoudy Ho u32 dither:1; 319*61890ccaSMoudy Ho }; 320*61890ccaSMoudy Ho 321*61890ccaSMoudy Ho static inline bool mdp_target_is_crop(u32 target) 322*61890ccaSMoudy Ho { 323*61890ccaSMoudy Ho return (target == V4L2_SEL_TGT_CROP) || 324*61890ccaSMoudy Ho (target == V4L2_SEL_TGT_CROP_DEFAULT) || 325*61890ccaSMoudy Ho (target == V4L2_SEL_TGT_CROP_BOUNDS); 326*61890ccaSMoudy Ho } 327*61890ccaSMoudy Ho 328*61890ccaSMoudy Ho static inline bool mdp_target_is_compose(u32 target) 329*61890ccaSMoudy Ho { 330*61890ccaSMoudy Ho return (target == V4L2_SEL_TGT_COMPOSE) || 331*61890ccaSMoudy Ho (target == V4L2_SEL_TGT_COMPOSE_DEFAULT) || 332*61890ccaSMoudy Ho (target == V4L2_SEL_TGT_COMPOSE_BOUNDS); 333*61890ccaSMoudy Ho } 334*61890ccaSMoudy Ho 335*61890ccaSMoudy Ho #define MDP_MAX_CAPTURES IMG_MAX_HW_OUTPUTS 336*61890ccaSMoudy Ho 337*61890ccaSMoudy Ho #define MDP_VPU_INIT BIT(0) 338*61890ccaSMoudy Ho #define MDP_M2M_CTX_ERROR BIT(1) 339*61890ccaSMoudy Ho 340*61890ccaSMoudy Ho struct mdp_frameparam { 341*61890ccaSMoudy Ho struct list_head list; 342*61890ccaSMoudy Ho struct mdp_m2m_ctx *ctx; 343*61890ccaSMoudy Ho atomic_t state; 344*61890ccaSMoudy Ho const struct mdp_limit *limit; 345*61890ccaSMoudy Ho u32 type; /* enum mdp_stream_type */ 346*61890ccaSMoudy Ho u32 frame_no; 347*61890ccaSMoudy Ho struct mdp_frame output; 348*61890ccaSMoudy Ho struct mdp_frame captures[MDP_MAX_CAPTURES]; 349*61890ccaSMoudy Ho u32 num_captures; 350*61890ccaSMoudy Ho enum v4l2_colorspace colorspace; 351*61890ccaSMoudy Ho enum v4l2_ycbcr_encoding ycbcr_enc; 352*61890ccaSMoudy Ho enum v4l2_xfer_func xfer_func; 353*61890ccaSMoudy Ho enum v4l2_quantization quant; 354*61890ccaSMoudy Ho }; 355*61890ccaSMoudy Ho 356*61890ccaSMoudy Ho int mdp_enum_fmt_mplane(struct v4l2_fmtdesc *f); 357*61890ccaSMoudy Ho const struct mdp_format *mdp_try_fmt_mplane(struct v4l2_format *f, 358*61890ccaSMoudy Ho struct mdp_frameparam *param, 359*61890ccaSMoudy Ho u32 ctx_id); 360*61890ccaSMoudy Ho enum mdp_ycbcr_profile mdp_map_ycbcr_prof_mplane(struct v4l2_format *f, 361*61890ccaSMoudy Ho u32 mdp_color); 362*61890ccaSMoudy Ho int mdp_try_crop(struct mdp_m2m_ctx *ctx, struct v4l2_rect *r, 363*61890ccaSMoudy Ho const struct v4l2_selection *s, struct mdp_frame *frame); 364*61890ccaSMoudy Ho int mdp_check_scaling_ratio(const struct v4l2_rect *crop, 365*61890ccaSMoudy Ho const struct v4l2_rect *compose, s32 rotation, 366*61890ccaSMoudy Ho const struct mdp_limit *limit); 367*61890ccaSMoudy Ho void mdp_set_src_config(struct img_input *in, 368*61890ccaSMoudy Ho struct mdp_frame *frame, struct vb2_buffer *vb); 369*61890ccaSMoudy Ho void mdp_set_dst_config(struct img_output *out, 370*61890ccaSMoudy Ho struct mdp_frame *frame, struct vb2_buffer *vb); 371*61890ccaSMoudy Ho int mdp_frameparam_init(struct mdp_frameparam *param); 372*61890ccaSMoudy Ho 373*61890ccaSMoudy Ho #endif /* __MTK_MDP3_REGS_H__ */ 374