1 /* SPDX-License-Identifier: MIT */ 2 /* 3 * Copyright © 2023 Intel Corporation 4 */ 5 6 #ifndef __INTEL_DISPLAY_DEVICE_H__ 7 #define __INTEL_DISPLAY_DEVICE_H__ 8 9 #include <linux/types.h> 10 11 #include "intel_display_conversion.h" 12 #include "intel_display_limits.h" 13 14 struct drm_i915_private; 15 struct drm_printer; 16 17 /* Keep in gen based order, and chronological order within a gen */ 18 enum intel_display_platform { 19 INTEL_DISPLAY_PLATFORM_UNINITIALIZED = 0, 20 /* Display ver 2 */ 21 INTEL_DISPLAY_I830, 22 INTEL_DISPLAY_I845G, 23 INTEL_DISPLAY_I85X, 24 INTEL_DISPLAY_I865G, 25 /* Display ver 3 */ 26 INTEL_DISPLAY_I915G, 27 INTEL_DISPLAY_I915GM, 28 INTEL_DISPLAY_I945G, 29 INTEL_DISPLAY_I945GM, 30 INTEL_DISPLAY_G33, 31 INTEL_DISPLAY_PINEVIEW, 32 /* Display ver 4 */ 33 INTEL_DISPLAY_I965G, 34 INTEL_DISPLAY_I965GM, 35 INTEL_DISPLAY_G45, 36 INTEL_DISPLAY_GM45, 37 /* Display ver 5 */ 38 INTEL_DISPLAY_IRONLAKE, 39 /* Display ver 6 */ 40 INTEL_DISPLAY_SANDYBRIDGE, 41 /* Display ver 7 */ 42 INTEL_DISPLAY_IVYBRIDGE, 43 INTEL_DISPLAY_VALLEYVIEW, 44 INTEL_DISPLAY_HASWELL, 45 /* Display ver 8 */ 46 INTEL_DISPLAY_BROADWELL, 47 INTEL_DISPLAY_CHERRYVIEW, 48 /* Display ver 9 */ 49 INTEL_DISPLAY_SKYLAKE, 50 INTEL_DISPLAY_BROXTON, 51 INTEL_DISPLAY_KABYLAKE, 52 INTEL_DISPLAY_GEMINILAKE, 53 INTEL_DISPLAY_COFFEELAKE, 54 INTEL_DISPLAY_COMETLAKE, 55 /* Display ver 11 */ 56 INTEL_DISPLAY_ICELAKE, 57 INTEL_DISPLAY_JASPERLAKE, 58 INTEL_DISPLAY_ELKHARTLAKE, 59 /* Display ver 12 */ 60 INTEL_DISPLAY_TIGERLAKE, 61 INTEL_DISPLAY_ROCKETLAKE, 62 INTEL_DISPLAY_DG1, 63 INTEL_DISPLAY_ALDERLAKE_S, 64 /* Display ver 13 */ 65 INTEL_DISPLAY_ALDERLAKE_P, 66 INTEL_DISPLAY_DG2, 67 /* Display ver 14 (based on GMD ID) */ 68 INTEL_DISPLAY_METEORLAKE, 69 /* Display ver 20 (based on GMD ID) */ 70 INTEL_DISPLAY_LUNARLAKE, 71 /* Display ver 14.1 (based on GMD ID) */ 72 INTEL_DISPLAY_BATTLEMAGE, 73 }; 74 75 enum intel_display_subplatform { 76 INTEL_DISPLAY_SUBPLATFORM_UNINITIALIZED = 0, 77 INTEL_DISPLAY_HASWELL_ULT, 78 INTEL_DISPLAY_HASWELL_ULX, 79 INTEL_DISPLAY_BROADWELL_ULT, 80 INTEL_DISPLAY_BROADWELL_ULX, 81 INTEL_DISPLAY_SKYLAKE_ULT, 82 INTEL_DISPLAY_SKYLAKE_ULX, 83 INTEL_DISPLAY_KABYLAKE_ULT, 84 INTEL_DISPLAY_KABYLAKE_ULX, 85 INTEL_DISPLAY_COFFEELAKE_ULT, 86 INTEL_DISPLAY_COFFEELAKE_ULX, 87 INTEL_DISPLAY_COMETLAKE_ULT, 88 INTEL_DISPLAY_COMETLAKE_ULX, 89 INTEL_DISPLAY_ICELAKE_PORT_F, 90 INTEL_DISPLAY_TIGERLAKE_UY, 91 INTEL_DISPLAY_ALDERLAKE_S_RAPTORLAKE_S, 92 INTEL_DISPLAY_ALDERLAKE_P_ALDERLAKE_N, 93 INTEL_DISPLAY_ALDERLAKE_P_RAPTORLAKE_P, 94 INTEL_DISPLAY_ALDERLAKE_P_RAPTORLAKE_U, 95 INTEL_DISPLAY_DG2_G10, 96 INTEL_DISPLAY_DG2_G11, 97 INTEL_DISPLAY_DG2_G12, 98 }; 99 100 #define DEV_INFO_DISPLAY_FOR_EACH_FLAG(func) \ 101 /* Keep in alphabetical order */ \ 102 func(cursor_needs_physical); \ 103 func(has_cdclk_crawl); \ 104 func(has_cdclk_squash); \ 105 func(has_ddi); \ 106 func(has_dp_mst); \ 107 func(has_dsb); \ 108 func(has_fpga_dbg); \ 109 func(has_gmch); \ 110 func(has_hotplug); \ 111 func(has_hti); \ 112 func(has_ipc); \ 113 func(has_overlay); \ 114 func(has_psr); \ 115 func(has_psr_hw_tracking); \ 116 func(overlay_needs_physical); \ 117 func(supports_tv); 118 119 #define HAS_4TILE(i915) (IS_DG2(i915) || DISPLAY_VER(i915) >= 14) 120 #define HAS_ASYNC_FLIPS(i915) (DISPLAY_VER(i915) >= 5) 121 #define HAS_BIGJOINER(i915) (DISPLAY_VER(i915) >= 11 && HAS_DSC(i915)) 122 #define HAS_CDCLK_CRAWL(i915) (DISPLAY_INFO(i915)->has_cdclk_crawl) 123 #define HAS_CDCLK_SQUASH(i915) (DISPLAY_INFO(i915)->has_cdclk_squash) 124 #define HAS_CUR_FBC(i915) (!HAS_GMCH(i915) && IS_DISPLAY_VER(i915, 7, 13)) 125 #define HAS_D12_PLANE_MINIMIZATION(i915) (IS_ROCKETLAKE(i915) || IS_ALDERLAKE_S(i915)) 126 #define HAS_DDI(i915) (DISPLAY_INFO(i915)->has_ddi) 127 #define HAS_DISPLAY(i915) (DISPLAY_RUNTIME_INFO(i915)->pipe_mask != 0) 128 #define HAS_DMC(i915) (DISPLAY_RUNTIME_INFO(i915)->has_dmc) 129 #define HAS_DOUBLE_BUFFERED_M_N(i915) (DISPLAY_VER(i915) >= 9 || IS_BROADWELL(i915)) 130 #define HAS_DP_MST(i915) (DISPLAY_INFO(i915)->has_dp_mst) 131 #define HAS_DP20(i915) (IS_DG2(i915) || DISPLAY_VER(i915) >= 14) 132 #define HAS_DPT(i915) (DISPLAY_VER(i915) >= 13) 133 #define HAS_DSB(i915) (DISPLAY_INFO(i915)->has_dsb) 134 #define HAS_DSC(__i915) (DISPLAY_RUNTIME_INFO(__i915)->has_dsc) 135 #define HAS_DSC_MST(__i915) (DISPLAY_VER(__i915) >= 12 && HAS_DSC(__i915)) 136 #define HAS_FBC(i915) (DISPLAY_RUNTIME_INFO(i915)->fbc_mask != 0) 137 #define HAS_FPGA_DBG_UNCLAIMED(i915) (DISPLAY_INFO(i915)->has_fpga_dbg) 138 #define HAS_FW_BLC(i915) (DISPLAY_VER(i915) >= 3) 139 #define HAS_GMBUS_IRQ(i915) (DISPLAY_VER(i915) >= 4) 140 #define HAS_GMBUS_BURST_READ(i915) (DISPLAY_VER(i915) >= 10 || IS_KABYLAKE(i915)) 141 #define HAS_GMCH(i915) (DISPLAY_INFO(i915)->has_gmch) 142 #define HAS_HW_SAGV_WM(i915) (DISPLAY_VER(i915) >= 13 && !IS_DGFX(i915)) 143 #define HAS_IPC(i915) (DISPLAY_INFO(i915)->has_ipc) 144 #define HAS_IPS(i915) (IS_HASWELL_ULT(i915) || IS_BROADWELL(i915)) 145 #define HAS_LRR(i915) (DISPLAY_VER(i915) >= 12) 146 #define HAS_LSPCON(i915) (IS_DISPLAY_VER(i915, 9, 10)) 147 #define HAS_MBUS_JOINING(i915) (IS_ALDERLAKE_P(i915) || DISPLAY_VER(i915) >= 14) 148 #define HAS_MSO(i915) (DISPLAY_VER(i915) >= 12) 149 #define HAS_OVERLAY(i915) (DISPLAY_INFO(i915)->has_overlay) 150 #define HAS_PSR(i915) (DISPLAY_INFO(i915)->has_psr) 151 #define HAS_PSR_HW_TRACKING(i915) (DISPLAY_INFO(i915)->has_psr_hw_tracking) 152 #define HAS_PSR2_SEL_FETCH(i915) (DISPLAY_VER(i915) >= 12) 153 #define HAS_SAGV(i915) (DISPLAY_VER(i915) >= 9 && !IS_BROXTON(i915) && !IS_GEMINILAKE(i915)) 154 #define HAS_TRANSCODER(i915, trans) ((DISPLAY_RUNTIME_INFO(i915)->cpu_transcoder_mask & \ 155 BIT(trans)) != 0) 156 #define HAS_UNCOMPRESSED_JOINER(i915) (DISPLAY_VER(i915) >= 13) 157 #define HAS_ULTRAJOINER(i915) ((DISPLAY_VER(i915) >= 20 || \ 158 (IS_DGFX(i915) && DISPLAY_VER(i915) == 14)) && \ 159 HAS_DSC(i915)) 160 #define HAS_VRR(i915) (DISPLAY_VER(i915) >= 11) 161 #define HAS_AS_SDP(i915) (DISPLAY_VER(i915) >= 13) 162 #define HAS_CMRR(i915) (DISPLAY_VER(i915) >= 20) 163 #define INTEL_NUM_PIPES(i915) (hweight8(DISPLAY_RUNTIME_INFO(i915)->pipe_mask)) 164 #define I915_HAS_HOTPLUG(i915) (DISPLAY_INFO(i915)->has_hotplug) 165 #define OVERLAY_NEEDS_PHYSICAL(i915) (DISPLAY_INFO(i915)->overlay_needs_physical) 166 #define SUPPORTS_TV(i915) (DISPLAY_INFO(i915)->supports_tv) 167 168 /* Check that device has a display IP version within the specific range. */ 169 #define IS_DISPLAY_VER_FULL(__i915, from, until) ( \ 170 BUILD_BUG_ON_ZERO((from) < IP_VER(2, 0)) + \ 171 (DISPLAY_VER_FULL(__i915) >= (from) && \ 172 DISPLAY_VER_FULL(__i915) <= (until))) 173 174 /* 175 * Check if a device has a specific IP version as well as a stepping within the 176 * specified range [from, until). The lower bound is inclusive, the upper 177 * bound is exclusive. The most common use-case of this macro is for checking 178 * bounds for workarounds, which usually have a stepping ("from") at which the 179 * hardware issue is first present and another stepping ("until") at which a 180 * hardware fix is present and the software workaround is no longer necessary. 181 * E.g., 182 * 183 * IS_DISPLAY_VER_STEP(i915, IP_VER(14, 0), STEP_A0, STEP_B2) 184 * IS_DISPLAY_VER_STEP(i915, IP_VER(14, 0), STEP_C0, STEP_FOREVER) 185 * 186 * "STEP_FOREVER" can be passed as "until" for workarounds that have no upper 187 * stepping bound for the specified IP version. 188 */ 189 #define IS_DISPLAY_VER_STEP(__i915, ipver, from, until) \ 190 (IS_DISPLAY_VER_FULL((__i915), (ipver), (ipver)) && \ 191 IS_DISPLAY_STEP((__i915), (from), (until))) 192 193 #define DISPLAY_INFO(i915) (__to_intel_display(i915)->info.__device_info) 194 #define DISPLAY_RUNTIME_INFO(i915) (&__to_intel_display(i915)->info.__runtime_info) 195 196 #define DISPLAY_VER(i915) (DISPLAY_RUNTIME_INFO(i915)->ip.ver) 197 #define DISPLAY_VER_FULL(i915) IP_VER(DISPLAY_RUNTIME_INFO(i915)->ip.ver, \ 198 DISPLAY_RUNTIME_INFO(i915)->ip.rel) 199 #define IS_DISPLAY_VER(i915, from, until) \ 200 (DISPLAY_VER(i915) >= (from) && DISPLAY_VER(i915) <= (until)) 201 202 #define INTEL_DISPLAY_STEP(__i915) (DISPLAY_RUNTIME_INFO(__i915)->step) 203 204 #define IS_DISPLAY_STEP(__i915, since, until) \ 205 (drm_WARN_ON(__to_intel_display(__i915)->drm, INTEL_DISPLAY_STEP(__i915) == STEP_NONE), \ 206 INTEL_DISPLAY_STEP(__i915) >= (since) && INTEL_DISPLAY_STEP(__i915) < (until)) 207 208 struct intel_display_runtime_info { 209 enum intel_display_platform platform; 210 enum intel_display_subplatform subplatform; 211 212 struct intel_display_ip_ver { 213 u16 ver; 214 u16 rel; 215 u16 step; /* hardware */ 216 } ip; 217 int step; /* symbolic */ 218 219 u32 rawclk_freq; 220 221 u8 pipe_mask; 222 u8 cpu_transcoder_mask; 223 u16 port_mask; 224 225 u8 num_sprites[I915_MAX_PIPES]; 226 u8 num_scalers[I915_MAX_PIPES]; 227 228 u8 fbc_mask; 229 230 bool has_hdcp; 231 bool has_dmc; 232 bool has_dsc; 233 }; 234 235 struct intel_display_device_info { 236 /* Initial runtime info. */ 237 const struct intel_display_runtime_info __runtime_defaults; 238 239 u8 abox_mask; 240 241 struct { 242 u16 size; /* in blocks */ 243 u8 slice_mask; 244 } dbuf; 245 246 #define DEFINE_FLAG(name) u8 name:1 247 DEV_INFO_DISPLAY_FOR_EACH_FLAG(DEFINE_FLAG); 248 #undef DEFINE_FLAG 249 250 /* Global register offset for the display engine */ 251 u32 mmio_offset; 252 253 /* Register offsets for the various display pipes and transcoders */ 254 u32 pipe_offsets[I915_MAX_TRANSCODERS]; 255 u32 trans_offsets[I915_MAX_TRANSCODERS]; 256 u32 cursor_offsets[I915_MAX_PIPES]; 257 258 struct { 259 u32 degamma_lut_size; 260 u32 gamma_lut_size; 261 u32 degamma_lut_tests; 262 u32 gamma_lut_tests; 263 } color; 264 }; 265 266 bool intel_display_device_enabled(struct drm_i915_private *i915); 267 void intel_display_device_probe(struct drm_i915_private *i915); 268 void intel_display_device_remove(struct drm_i915_private *i915); 269 void intel_display_device_info_runtime_init(struct drm_i915_private *i915); 270 271 void intel_display_device_info_print(const struct intel_display_device_info *info, 272 const struct intel_display_runtime_info *runtime, 273 struct drm_printer *p); 274 275 #endif 276