1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright(c) 2011-2016 Intel Corporation. All rights reserved. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Permission is hereby granted, free of charge, to any person obtaining a 5*4882a593Smuzhiyun * copy of this software and associated documentation files (the "Software"), 6*4882a593Smuzhiyun * to deal in the Software without restriction, including without limitation 7*4882a593Smuzhiyun * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8*4882a593Smuzhiyun * and/or sell copies of the Software, and to permit persons to whom the 9*4882a593Smuzhiyun * Software is furnished to do so, subject to the following conditions: 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * The above copyright notice and this permission notice (including the next 12*4882a593Smuzhiyun * paragraph) shall be included in all copies or substantial portions of the 13*4882a593Smuzhiyun * Software. 14*4882a593Smuzhiyun * 15*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16*4882a593Smuzhiyun * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18*4882a593Smuzhiyun * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19*4882a593Smuzhiyun * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20*4882a593Smuzhiyun * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21*4882a593Smuzhiyun * SOFTWARE. 22*4882a593Smuzhiyun * 23*4882a593Smuzhiyun * Authors: 24*4882a593Smuzhiyun * Kevin Tian <kevin.tian@intel.com> 25*4882a593Smuzhiyun * 26*4882a593Smuzhiyun * Contributors: 27*4882a593Smuzhiyun * Bing Niu <bing.niu@intel.com> 28*4882a593Smuzhiyun * Xu Han <xu.han@intel.com> 29*4882a593Smuzhiyun * Ping Gao <ping.a.gao@intel.com> 30*4882a593Smuzhiyun * Xiaoguang Chen <xiaoguang.chen@intel.com> 31*4882a593Smuzhiyun * Yang Liu <yang2.liu@intel.com> 32*4882a593Smuzhiyun * Tina Zhang <tina.zhang@intel.com> 33*4882a593Smuzhiyun * 34*4882a593Smuzhiyun */ 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun #ifndef _GVT_FB_DECODER_H_ 37*4882a593Smuzhiyun #define _GVT_FB_DECODER_H_ 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun #include <linux/types.h> 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun #define _PLANE_CTL_FORMAT_SHIFT 24 42*4882a593Smuzhiyun #define _PLANE_CTL_TILED_SHIFT 10 43*4882a593Smuzhiyun #define _PIPE_V_SRCSZ_SHIFT 0 44*4882a593Smuzhiyun #define _PIPE_V_SRCSZ_MASK (0xfff << _PIPE_V_SRCSZ_SHIFT) 45*4882a593Smuzhiyun #define _PIPE_H_SRCSZ_SHIFT 16 46*4882a593Smuzhiyun #define _PIPE_H_SRCSZ_MASK (0x1fff << _PIPE_H_SRCSZ_SHIFT) 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun #define _PRI_PLANE_FMT_SHIFT 26 49*4882a593Smuzhiyun #define _PRI_PLANE_STRIDE_MASK (0x3ff << 6) 50*4882a593Smuzhiyun #define _PRI_PLANE_X_OFF_SHIFT 0 51*4882a593Smuzhiyun #define _PRI_PLANE_X_OFF_MASK (0x1fff << _PRI_PLANE_X_OFF_SHIFT) 52*4882a593Smuzhiyun #define _PRI_PLANE_Y_OFF_SHIFT 16 53*4882a593Smuzhiyun #define _PRI_PLANE_Y_OFF_MASK (0xfff << _PRI_PLANE_Y_OFF_SHIFT) 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun #define _CURSOR_MODE 0x3f 56*4882a593Smuzhiyun #define _CURSOR_ALPHA_FORCE_SHIFT 8 57*4882a593Smuzhiyun #define _CURSOR_ALPHA_FORCE_MASK (0x3 << _CURSOR_ALPHA_FORCE_SHIFT) 58*4882a593Smuzhiyun #define _CURSOR_ALPHA_PLANE_SHIFT 10 59*4882a593Smuzhiyun #define _CURSOR_ALPHA_PLANE_MASK (0x3 << _CURSOR_ALPHA_PLANE_SHIFT) 60*4882a593Smuzhiyun #define _CURSOR_POS_X_SHIFT 0 61*4882a593Smuzhiyun #define _CURSOR_POS_X_MASK (0x1fff << _CURSOR_POS_X_SHIFT) 62*4882a593Smuzhiyun #define _CURSOR_SIGN_X_SHIFT 15 63*4882a593Smuzhiyun #define _CURSOR_SIGN_X_MASK (1 << _CURSOR_SIGN_X_SHIFT) 64*4882a593Smuzhiyun #define _CURSOR_POS_Y_SHIFT 16 65*4882a593Smuzhiyun #define _CURSOR_POS_Y_MASK (0xfff << _CURSOR_POS_Y_SHIFT) 66*4882a593Smuzhiyun #define _CURSOR_SIGN_Y_SHIFT 31 67*4882a593Smuzhiyun #define _CURSOR_SIGN_Y_MASK (1 << _CURSOR_SIGN_Y_SHIFT) 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun #define _SPRITE_FMT_SHIFT 25 70*4882a593Smuzhiyun #define _SPRITE_COLOR_ORDER_SHIFT 20 71*4882a593Smuzhiyun #define _SPRITE_YUV_ORDER_SHIFT 16 72*4882a593Smuzhiyun #define _SPRITE_STRIDE_SHIFT 6 73*4882a593Smuzhiyun #define _SPRITE_STRIDE_MASK (0x1ff << _SPRITE_STRIDE_SHIFT) 74*4882a593Smuzhiyun #define _SPRITE_SIZE_WIDTH_SHIFT 0 75*4882a593Smuzhiyun #define _SPRITE_SIZE_HEIGHT_SHIFT 16 76*4882a593Smuzhiyun #define _SPRITE_SIZE_WIDTH_MASK (0x1fff << _SPRITE_SIZE_WIDTH_SHIFT) 77*4882a593Smuzhiyun #define _SPRITE_SIZE_HEIGHT_MASK (0xfff << _SPRITE_SIZE_HEIGHT_SHIFT) 78*4882a593Smuzhiyun #define _SPRITE_POS_X_SHIFT 0 79*4882a593Smuzhiyun #define _SPRITE_POS_Y_SHIFT 16 80*4882a593Smuzhiyun #define _SPRITE_POS_X_MASK (0x1fff << _SPRITE_POS_X_SHIFT) 81*4882a593Smuzhiyun #define _SPRITE_POS_Y_MASK (0xfff << _SPRITE_POS_Y_SHIFT) 82*4882a593Smuzhiyun #define _SPRITE_OFFSET_START_X_SHIFT 0 83*4882a593Smuzhiyun #define _SPRITE_OFFSET_START_Y_SHIFT 16 84*4882a593Smuzhiyun #define _SPRITE_OFFSET_START_X_MASK (0x1fff << _SPRITE_OFFSET_START_X_SHIFT) 85*4882a593Smuzhiyun #define _SPRITE_OFFSET_START_Y_MASK (0xfff << _SPRITE_OFFSET_START_Y_SHIFT) 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun enum GVT_FB_EVENT { 88*4882a593Smuzhiyun FB_MODE_SET_START = 1, 89*4882a593Smuzhiyun FB_MODE_SET_END, 90*4882a593Smuzhiyun FB_DISPLAY_FLIP, 91*4882a593Smuzhiyun }; 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun enum DDI_PORT { 94*4882a593Smuzhiyun DDI_PORT_NONE = 0, 95*4882a593Smuzhiyun DDI_PORT_B = 1, 96*4882a593Smuzhiyun DDI_PORT_C = 2, 97*4882a593Smuzhiyun DDI_PORT_D = 3, 98*4882a593Smuzhiyun DDI_PORT_E = 4 99*4882a593Smuzhiyun }; 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun struct intel_gvt; 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun /* color space conversion and gamma correction are not included */ 104*4882a593Smuzhiyun struct intel_vgpu_primary_plane_format { 105*4882a593Smuzhiyun u8 enabled; /* plane is enabled */ 106*4882a593Smuzhiyun u32 tiled; /* tiling mode: linear, X-tiled, Y tiled, etc */ 107*4882a593Smuzhiyun u8 bpp; /* bits per pixel */ 108*4882a593Smuzhiyun u32 hw_format; /* format field in the PRI_CTL register */ 109*4882a593Smuzhiyun u32 drm_format; /* format in DRM definition */ 110*4882a593Smuzhiyun u32 base; /* framebuffer base in graphics memory */ 111*4882a593Smuzhiyun u64 base_gpa; 112*4882a593Smuzhiyun u32 x_offset; /* in pixels */ 113*4882a593Smuzhiyun u32 y_offset; /* in lines */ 114*4882a593Smuzhiyun u32 width; /* in pixels */ 115*4882a593Smuzhiyun u32 height; /* in lines */ 116*4882a593Smuzhiyun u32 stride; /* in bytes */ 117*4882a593Smuzhiyun }; 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun struct intel_vgpu_sprite_plane_format { 120*4882a593Smuzhiyun u8 enabled; /* plane is enabled */ 121*4882a593Smuzhiyun u8 tiled; /* X-tiled */ 122*4882a593Smuzhiyun u8 bpp; /* bits per pixel */ 123*4882a593Smuzhiyun u32 hw_format; /* format field in the SPR_CTL register */ 124*4882a593Smuzhiyun u32 drm_format; /* format in DRM definition */ 125*4882a593Smuzhiyun u32 base; /* sprite base in graphics memory */ 126*4882a593Smuzhiyun u64 base_gpa; 127*4882a593Smuzhiyun u32 x_pos; /* in pixels */ 128*4882a593Smuzhiyun u32 y_pos; /* in lines */ 129*4882a593Smuzhiyun u32 x_offset; /* in pixels */ 130*4882a593Smuzhiyun u32 y_offset; /* in lines */ 131*4882a593Smuzhiyun u32 width; /* in pixels */ 132*4882a593Smuzhiyun u32 height; /* in lines */ 133*4882a593Smuzhiyun u32 stride; /* in bytes */ 134*4882a593Smuzhiyun }; 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun struct intel_vgpu_cursor_plane_format { 137*4882a593Smuzhiyun u8 enabled; 138*4882a593Smuzhiyun u8 mode; /* cursor mode select */ 139*4882a593Smuzhiyun u8 bpp; /* bits per pixel */ 140*4882a593Smuzhiyun u32 drm_format; /* format in DRM definition */ 141*4882a593Smuzhiyun u32 base; /* cursor base in graphics memory */ 142*4882a593Smuzhiyun u64 base_gpa; 143*4882a593Smuzhiyun u32 x_pos; /* in pixels */ 144*4882a593Smuzhiyun u32 y_pos; /* in lines */ 145*4882a593Smuzhiyun u8 x_sign; /* X Position Sign */ 146*4882a593Smuzhiyun u8 y_sign; /* Y Position Sign */ 147*4882a593Smuzhiyun u32 width; /* in pixels */ 148*4882a593Smuzhiyun u32 height; /* in lines */ 149*4882a593Smuzhiyun u32 x_hot; /* in pixels */ 150*4882a593Smuzhiyun u32 y_hot; /* in pixels */ 151*4882a593Smuzhiyun }; 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun struct intel_vgpu_pipe_format { 154*4882a593Smuzhiyun struct intel_vgpu_primary_plane_format primary; 155*4882a593Smuzhiyun struct intel_vgpu_sprite_plane_format sprite; 156*4882a593Smuzhiyun struct intel_vgpu_cursor_plane_format cursor; 157*4882a593Smuzhiyun enum DDI_PORT ddi_port; /* the DDI port that pipe is connected to */ 158*4882a593Smuzhiyun }; 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun struct intel_vgpu_fb_format { 161*4882a593Smuzhiyun struct intel_vgpu_pipe_format pipes[I915_MAX_PIPES]; 162*4882a593Smuzhiyun }; 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun int intel_vgpu_decode_primary_plane(struct intel_vgpu *vgpu, 165*4882a593Smuzhiyun struct intel_vgpu_primary_plane_format *plane); 166*4882a593Smuzhiyun int intel_vgpu_decode_cursor_plane(struct intel_vgpu *vgpu, 167*4882a593Smuzhiyun struct intel_vgpu_cursor_plane_format *plane); 168*4882a593Smuzhiyun int intel_vgpu_decode_sprite_plane(struct intel_vgpu *vgpu, 169*4882a593Smuzhiyun struct intel_vgpu_sprite_plane_format *plane); 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun #endif 172