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