1 1.1 riastrad /* $NetBSD: display.h,v 1.2 2021/12/18 23:45:31 riastradh Exp $ */ 2 1.1 riastrad 3 1.1 riastrad /* 4 1.1 riastrad * Copyright(c) 2011-2016 Intel Corporation. All rights reserved. 5 1.1 riastrad * 6 1.1 riastrad * Permission is hereby granted, free of charge, to any person obtaining a 7 1.1 riastrad * copy of this software and associated documentation files (the "Software"), 8 1.1 riastrad * to deal in the Software without restriction, including without limitation 9 1.1 riastrad * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 1.1 riastrad * and/or sell copies of the Software, and to permit persons to whom the 11 1.1 riastrad * Software is furnished to do so, subject to the following conditions: 12 1.1 riastrad * 13 1.1 riastrad * The above copyright notice and this permission notice (including the next 14 1.1 riastrad * paragraph) shall be included in all copies or substantial portions of the 15 1.1 riastrad * Software. 16 1.1 riastrad * 17 1.1 riastrad * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 1.1 riastrad * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 1.1 riastrad * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 1.1 riastrad * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 1.1 riastrad * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 1.1 riastrad * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 1.1 riastrad * SOFTWARE. 24 1.1 riastrad * 25 1.1 riastrad * Authors: 26 1.1 riastrad * Ke Yu 27 1.1 riastrad * Zhiyuan Lv <zhiyuan.lv (at) intel.com> 28 1.1 riastrad * 29 1.1 riastrad * Contributors: 30 1.1 riastrad * Terrence Xu <terrence.xu (at) intel.com> 31 1.1 riastrad * Changbin Du <changbin.du (at) intel.com> 32 1.1 riastrad * Bing Niu <bing.niu (at) intel.com> 33 1.1 riastrad * Zhi Wang <zhi.a.wang (at) intel.com> 34 1.1 riastrad * 35 1.1 riastrad */ 36 1.1 riastrad 37 1.1 riastrad #ifndef _GVT_DISPLAY_H_ 38 1.1 riastrad #define _GVT_DISPLAY_H_ 39 1.1 riastrad 40 1.1 riastrad #include <linux/types.h> 41 1.1 riastrad 42 1.1 riastrad struct intel_gvt; 43 1.1 riastrad struct intel_vgpu; 44 1.1 riastrad 45 1.1 riastrad #define SBI_REG_MAX 20 46 1.1 riastrad #define DPCD_SIZE 0x700 47 1.1 riastrad 48 1.1 riastrad #define intel_vgpu_port(vgpu, port) \ 49 1.1 riastrad (&(vgpu->display.ports[port])) 50 1.1 riastrad 51 1.1 riastrad #define intel_vgpu_has_monitor_on_port(vgpu, port) \ 52 1.1 riastrad (intel_vgpu_port(vgpu, port)->edid && \ 53 1.1 riastrad intel_vgpu_port(vgpu, port)->edid->data_valid) 54 1.1 riastrad 55 1.1 riastrad #define intel_vgpu_port_is_dp(vgpu, port) \ 56 1.1 riastrad ((intel_vgpu_port(vgpu, port)->type == GVT_DP_A) || \ 57 1.1 riastrad (intel_vgpu_port(vgpu, port)->type == GVT_DP_B) || \ 58 1.1 riastrad (intel_vgpu_port(vgpu, port)->type == GVT_DP_C) || \ 59 1.1 riastrad (intel_vgpu_port(vgpu, port)->type == GVT_DP_D)) 60 1.1 riastrad 61 1.1 riastrad #define INTEL_GVT_MAX_UEVENT_VARS 3 62 1.1 riastrad 63 1.1 riastrad /* DPCD start */ 64 1.1 riastrad #define DPCD_SIZE 0x700 65 1.1 riastrad 66 1.1 riastrad /* DPCD */ 67 1.1 riastrad #define DP_SET_POWER 0x600 68 1.1 riastrad #define DP_SET_POWER_D0 0x1 69 1.1 riastrad #define AUX_NATIVE_WRITE 0x8 70 1.1 riastrad #define AUX_NATIVE_READ 0x9 71 1.1 riastrad 72 1.1 riastrad #define AUX_NATIVE_REPLY_MASK (0x3 << 4) 73 1.1 riastrad #define AUX_NATIVE_REPLY_ACK (0x0 << 4) 74 1.1 riastrad #define AUX_NATIVE_REPLY_NAK (0x1 << 4) 75 1.1 riastrad #define AUX_NATIVE_REPLY_DEFER (0x2 << 4) 76 1.1 riastrad 77 1.1 riastrad #define AUX_BURST_SIZE 20 78 1.1 riastrad 79 1.1 riastrad /* DPCD addresses */ 80 1.1 riastrad #define DPCD_REV 0x000 81 1.1 riastrad #define DPCD_MAX_LINK_RATE 0x001 82 1.1 riastrad #define DPCD_MAX_LANE_COUNT 0x002 83 1.1 riastrad 84 1.1 riastrad #define DPCD_TRAINING_PATTERN_SET 0x102 85 1.1 riastrad #define DPCD_SINK_COUNT 0x200 86 1.1 riastrad #define DPCD_LANE0_1_STATUS 0x202 87 1.1 riastrad #define DPCD_LANE2_3_STATUS 0x203 88 1.1 riastrad #define DPCD_LANE_ALIGN_STATUS_UPDATED 0x204 89 1.1 riastrad #define DPCD_SINK_STATUS 0x205 90 1.1 riastrad 91 1.1 riastrad /* link training */ 92 1.1 riastrad #define DPCD_TRAINING_PATTERN_SET_MASK 0x03 93 1.1 riastrad #define DPCD_LINK_TRAINING_DISABLED 0x00 94 1.1 riastrad #define DPCD_TRAINING_PATTERN_1 0x01 95 1.1 riastrad #define DPCD_TRAINING_PATTERN_2 0x02 96 1.1 riastrad 97 1.1 riastrad #define DPCD_CP_READY_MASK (1 << 6) 98 1.1 riastrad 99 1.1 riastrad /* lane status */ 100 1.1 riastrad #define DPCD_LANES_CR_DONE 0x11 101 1.1 riastrad #define DPCD_LANES_EQ_DONE 0x22 102 1.1 riastrad #define DPCD_SYMBOL_LOCKED 0x44 103 1.1 riastrad 104 1.1 riastrad #define DPCD_INTERLANE_ALIGN_DONE 0x01 105 1.1 riastrad 106 1.1 riastrad #define DPCD_SINK_IN_SYNC 0x03 107 1.1 riastrad /* DPCD end */ 108 1.1 riastrad 109 1.1 riastrad #define SBI_RESPONSE_MASK 0x3 110 1.1 riastrad #define SBI_RESPONSE_SHIFT 0x1 111 1.1 riastrad #define SBI_STAT_MASK 0x1 112 1.1 riastrad #define SBI_STAT_SHIFT 0x0 113 1.1 riastrad #define SBI_OPCODE_SHIFT 8 114 1.1 riastrad #define SBI_OPCODE_MASK (0xff << SBI_OPCODE_SHIFT) 115 1.1 riastrad #define SBI_CMD_IORD 2 116 1.1 riastrad #define SBI_CMD_IOWR 3 117 1.1 riastrad #define SBI_CMD_CRRD 6 118 1.1 riastrad #define SBI_CMD_CRWR 7 119 1.1 riastrad #define SBI_ADDR_OFFSET_SHIFT 16 120 1.1 riastrad #define SBI_ADDR_OFFSET_MASK (0xffff << SBI_ADDR_OFFSET_SHIFT) 121 1.1 riastrad 122 1.1 riastrad struct intel_vgpu_sbi_register { 123 1.1 riastrad unsigned int offset; 124 1.1 riastrad u32 value; 125 1.1 riastrad }; 126 1.1 riastrad 127 1.1 riastrad struct intel_vgpu_sbi { 128 1.1 riastrad int number; 129 1.1 riastrad struct intel_vgpu_sbi_register registers[SBI_REG_MAX]; 130 1.1 riastrad }; 131 1.1 riastrad 132 1.1 riastrad enum intel_gvt_plane_type { 133 1.1 riastrad PRIMARY_PLANE = 0, 134 1.1 riastrad CURSOR_PLANE, 135 1.1 riastrad SPRITE_PLANE, 136 1.1 riastrad MAX_PLANE 137 1.1 riastrad }; 138 1.1 riastrad 139 1.1 riastrad struct intel_vgpu_dpcd_data { 140 1.1 riastrad bool data_valid; 141 1.1 riastrad u8 data[DPCD_SIZE]; 142 1.1 riastrad }; 143 1.1 riastrad 144 1.1 riastrad enum intel_vgpu_port_type { 145 1.1 riastrad GVT_CRT = 0, 146 1.1 riastrad GVT_DP_A, 147 1.1 riastrad GVT_DP_B, 148 1.1 riastrad GVT_DP_C, 149 1.1 riastrad GVT_DP_D, 150 1.1 riastrad GVT_HDMI_B, 151 1.1 riastrad GVT_HDMI_C, 152 1.1 riastrad GVT_HDMI_D, 153 1.1 riastrad GVT_PORT_MAX 154 1.1 riastrad }; 155 1.1 riastrad 156 1.1 riastrad enum intel_vgpu_edid { 157 1.1 riastrad GVT_EDID_1024_768, 158 1.1 riastrad GVT_EDID_1920_1200, 159 1.1 riastrad GVT_EDID_NUM, 160 1.1 riastrad }; 161 1.1 riastrad 162 1.1 riastrad struct intel_vgpu_port { 163 1.1 riastrad /* per display EDID information */ 164 1.1 riastrad struct intel_vgpu_edid_data *edid; 165 1.1 riastrad /* per display DPCD information */ 166 1.1 riastrad struct intel_vgpu_dpcd_data *dpcd; 167 1.1 riastrad int type; 168 1.1 riastrad enum intel_vgpu_edid id; 169 1.1 riastrad }; 170 1.1 riastrad 171 1.1 riastrad static inline char *vgpu_edid_str(enum intel_vgpu_edid id) 172 1.1 riastrad { 173 1.1 riastrad switch (id) { 174 1.1 riastrad case GVT_EDID_1024_768: 175 1.1 riastrad return "1024x768"; 176 1.1 riastrad case GVT_EDID_1920_1200: 177 1.1 riastrad return "1920x1200"; 178 1.1 riastrad default: 179 1.1 riastrad return ""; 180 1.1 riastrad } 181 1.1 riastrad } 182 1.1 riastrad 183 1.1 riastrad static inline unsigned int vgpu_edid_xres(enum intel_vgpu_edid id) 184 1.1 riastrad { 185 1.1 riastrad switch (id) { 186 1.1 riastrad case GVT_EDID_1024_768: 187 1.1 riastrad return 1024; 188 1.1 riastrad case GVT_EDID_1920_1200: 189 1.1 riastrad return 1920; 190 1.1 riastrad default: 191 1.1 riastrad return 0; 192 1.1 riastrad } 193 1.1 riastrad } 194 1.1 riastrad 195 1.1 riastrad static inline unsigned int vgpu_edid_yres(enum intel_vgpu_edid id) 196 1.1 riastrad { 197 1.1 riastrad switch (id) { 198 1.1 riastrad case GVT_EDID_1024_768: 199 1.1 riastrad return 768; 200 1.1 riastrad case GVT_EDID_1920_1200: 201 1.1 riastrad return 1200; 202 1.1 riastrad default: 203 1.1 riastrad return 0; 204 1.1 riastrad } 205 1.1 riastrad } 206 1.1 riastrad 207 1.1 riastrad void intel_gvt_emulate_vblank(struct intel_gvt *gvt); 208 1.1 riastrad void intel_gvt_check_vblank_emulation(struct intel_gvt *gvt); 209 1.1 riastrad 210 1.1 riastrad int intel_vgpu_init_display(struct intel_vgpu *vgpu, u64 resolution); 211 1.1 riastrad void intel_vgpu_reset_display(struct intel_vgpu *vgpu); 212 1.1 riastrad void intel_vgpu_clean_display(struct intel_vgpu *vgpu); 213 1.1 riastrad 214 1.1 riastrad int pipe_is_enabled(struct intel_vgpu *vgpu, int pipe); 215 1.1 riastrad 216 1.1 riastrad #endif 217