1 1.1 riastrad /* $NetBSD: intel_device_info.c,v 1.2 2021/12/18 23:45:28 riastradh Exp $ */ 2 1.1 riastrad 3 1.1 riastrad /* 4 1.1 riastrad * Copyright 2016 Intel Corporation 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 22 1.1 riastrad * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 23 1.1 riastrad * IN THE SOFTWARE. 24 1.1 riastrad * 25 1.1 riastrad */ 26 1.1 riastrad 27 1.1 riastrad #include <sys/cdefs.h> 28 1.1 riastrad __KERNEL_RCSID(0, "$NetBSD: intel_device_info.c,v 1.2 2021/12/18 23:45:28 riastradh Exp $"); 29 1.1 riastrad 30 1.1 riastrad #include <drm/drm_print.h> 31 1.1 riastrad 32 1.1 riastrad #include "intel_device_info.h" 33 1.1 riastrad #include "i915_drv.h" 34 1.1 riastrad 35 1.1 riastrad #define PLATFORM_NAME(x) [INTEL_##x] = #x 36 1.1 riastrad static const char * const platform_names[] = { 37 1.1 riastrad PLATFORM_NAME(I830), 38 1.1 riastrad PLATFORM_NAME(I845G), 39 1.1 riastrad PLATFORM_NAME(I85X), 40 1.1 riastrad PLATFORM_NAME(I865G), 41 1.1 riastrad PLATFORM_NAME(I915G), 42 1.1 riastrad PLATFORM_NAME(I915GM), 43 1.1 riastrad PLATFORM_NAME(I945G), 44 1.1 riastrad PLATFORM_NAME(I945GM), 45 1.1 riastrad PLATFORM_NAME(G33), 46 1.1 riastrad PLATFORM_NAME(PINEVIEW), 47 1.1 riastrad PLATFORM_NAME(I965G), 48 1.1 riastrad PLATFORM_NAME(I965GM), 49 1.1 riastrad PLATFORM_NAME(G45), 50 1.1 riastrad PLATFORM_NAME(GM45), 51 1.1 riastrad PLATFORM_NAME(IRONLAKE), 52 1.1 riastrad PLATFORM_NAME(SANDYBRIDGE), 53 1.1 riastrad PLATFORM_NAME(IVYBRIDGE), 54 1.1 riastrad PLATFORM_NAME(VALLEYVIEW), 55 1.1 riastrad PLATFORM_NAME(HASWELL), 56 1.1 riastrad PLATFORM_NAME(BROADWELL), 57 1.1 riastrad PLATFORM_NAME(CHERRYVIEW), 58 1.1 riastrad PLATFORM_NAME(SKYLAKE), 59 1.1 riastrad PLATFORM_NAME(BROXTON), 60 1.1 riastrad PLATFORM_NAME(KABYLAKE), 61 1.1 riastrad PLATFORM_NAME(GEMINILAKE), 62 1.1 riastrad PLATFORM_NAME(COFFEELAKE), 63 1.1 riastrad PLATFORM_NAME(CANNONLAKE), 64 1.1 riastrad PLATFORM_NAME(ICELAKE), 65 1.1 riastrad PLATFORM_NAME(ELKHARTLAKE), 66 1.1 riastrad PLATFORM_NAME(TIGERLAKE), 67 1.1 riastrad }; 68 1.1 riastrad #undef PLATFORM_NAME 69 1.1 riastrad 70 1.1 riastrad const char *intel_platform_name(enum intel_platform platform) 71 1.1 riastrad { 72 1.1 riastrad BUILD_BUG_ON(ARRAY_SIZE(platform_names) != INTEL_MAX_PLATFORMS); 73 1.1 riastrad 74 1.1 riastrad if (WARN_ON_ONCE(platform >= ARRAY_SIZE(platform_names) || 75 1.1 riastrad platform_names[platform] == NULL)) 76 1.1 riastrad return "<unknown>"; 77 1.1 riastrad 78 1.1 riastrad return platform_names[platform]; 79 1.1 riastrad } 80 1.1 riastrad 81 1.1 riastrad static const char *iommu_name(void) 82 1.1 riastrad { 83 1.1 riastrad const char *msg = "n/a"; 84 1.1 riastrad 85 1.1 riastrad #ifdef CONFIG_INTEL_IOMMU 86 1.1 riastrad msg = enableddisabled(intel_iommu_gfx_mapped); 87 1.1 riastrad #endif 88 1.1 riastrad 89 1.1 riastrad return msg; 90 1.1 riastrad } 91 1.1 riastrad 92 1.1 riastrad void intel_device_info_print_static(const struct intel_device_info *info, 93 1.1 riastrad struct drm_printer *p) 94 1.1 riastrad { 95 1.1 riastrad drm_printf(p, "engines: %x\n", info->engine_mask); 96 1.1 riastrad drm_printf(p, "gen: %d\n", info->gen); 97 1.1 riastrad drm_printf(p, "gt: %d\n", info->gt); 98 1.1 riastrad drm_printf(p, "iommu: %s\n", iommu_name()); 99 1.1 riastrad drm_printf(p, "memory-regions: %x\n", info->memory_regions); 100 1.1 riastrad drm_printf(p, "page-sizes: %x\n", info->page_sizes); 101 1.1 riastrad drm_printf(p, "platform: %s\n", intel_platform_name(info->platform)); 102 1.1 riastrad drm_printf(p, "ppgtt-size: %d\n", info->ppgtt_size); 103 1.1 riastrad drm_printf(p, "ppgtt-type: %d\n", info->ppgtt_type); 104 1.1 riastrad 105 1.1 riastrad #define PRINT_FLAG(name) drm_printf(p, "%s: %s\n", #name, yesno(info->name)); 106 1.1 riastrad DEV_INFO_FOR_EACH_FLAG(PRINT_FLAG); 107 1.1 riastrad #undef PRINT_FLAG 108 1.1 riastrad 109 1.1 riastrad #define PRINT_FLAG(name) drm_printf(p, "%s: %s\n", #name, yesno(info->display.name)); 110 1.1 riastrad DEV_INFO_DISPLAY_FOR_EACH_FLAG(PRINT_FLAG); 111 1.1 riastrad #undef PRINT_FLAG 112 1.1 riastrad } 113 1.1 riastrad 114 1.1 riastrad static void sseu_dump(const struct sseu_dev_info *sseu, struct drm_printer *p) 115 1.1 riastrad { 116 1.1 riastrad int s; 117 1.1 riastrad 118 1.1 riastrad drm_printf(p, "slice total: %u, mask=%04x\n", 119 1.1 riastrad hweight8(sseu->slice_mask), sseu->slice_mask); 120 1.1 riastrad drm_printf(p, "subslice total: %u\n", intel_sseu_subslice_total(sseu)); 121 1.1 riastrad for (s = 0; s < sseu->max_slices; s++) { 122 1.1 riastrad drm_printf(p, "slice%d: %u subslices, mask=%08x\n", 123 1.1 riastrad s, intel_sseu_subslices_per_slice(sseu, s), 124 1.1 riastrad intel_sseu_get_subslices(sseu, s)); 125 1.1 riastrad } 126 1.1 riastrad drm_printf(p, "EU total: %u\n", sseu->eu_total); 127 1.1 riastrad drm_printf(p, "EU per subslice: %u\n", sseu->eu_per_subslice); 128 1.1 riastrad drm_printf(p, "has slice power gating: %s\n", 129 1.1 riastrad yesno(sseu->has_slice_pg)); 130 1.1 riastrad drm_printf(p, "has subslice power gating: %s\n", 131 1.1 riastrad yesno(sseu->has_subslice_pg)); 132 1.1 riastrad drm_printf(p, "has EU power gating: %s\n", yesno(sseu->has_eu_pg)); 133 1.1 riastrad } 134 1.1 riastrad 135 1.1 riastrad void intel_device_info_print_runtime(const struct intel_runtime_info *info, 136 1.1 riastrad struct drm_printer *p) 137 1.1 riastrad { 138 1.1 riastrad sseu_dump(&info->sseu, p); 139 1.1 riastrad 140 1.1 riastrad drm_printf(p, "CS timestamp frequency: %u kHz\n", 141 1.1 riastrad info->cs_timestamp_frequency_khz); 142 1.1 riastrad } 143 1.1 riastrad 144 1.1 riastrad static int sseu_eu_idx(const struct sseu_dev_info *sseu, int slice, 145 1.1 riastrad int subslice) 146 1.1 riastrad { 147 1.1 riastrad int slice_stride = sseu->max_subslices * sseu->eu_stride; 148 1.1 riastrad 149 1.1 riastrad return slice * slice_stride + subslice * sseu->eu_stride; 150 1.1 riastrad } 151 1.1 riastrad 152 1.1 riastrad static u16 sseu_get_eus(const struct sseu_dev_info *sseu, int slice, 153 1.1 riastrad int subslice) 154 1.1 riastrad { 155 1.1 riastrad int i, offset = sseu_eu_idx(sseu, slice, subslice); 156 1.1 riastrad u16 eu_mask = 0; 157 1.1 riastrad 158 1.1 riastrad for (i = 0; i < sseu->eu_stride; i++) { 159 1.1 riastrad eu_mask |= ((u16)sseu->eu_mask[offset + i]) << 160 1.1 riastrad (i * BITS_PER_BYTE); 161 1.1 riastrad } 162 1.1 riastrad 163 1.1 riastrad return eu_mask; 164 1.1 riastrad } 165 1.1 riastrad 166 1.1 riastrad static void sseu_set_eus(struct sseu_dev_info *sseu, int slice, int subslice, 167 1.1 riastrad u16 eu_mask) 168 1.1 riastrad { 169 1.1 riastrad int i, offset = sseu_eu_idx(sseu, slice, subslice); 170 1.1 riastrad 171 1.1 riastrad for (i = 0; i < sseu->eu_stride; i++) { 172 1.1 riastrad sseu->eu_mask[offset + i] = 173 1.1 riastrad (eu_mask >> (BITS_PER_BYTE * i)) & 0xff; 174 1.1 riastrad } 175 1.1 riastrad } 176 1.1 riastrad 177 1.1 riastrad void intel_device_info_print_topology(const struct sseu_dev_info *sseu, 178 1.1 riastrad struct drm_printer *p) 179 1.1 riastrad { 180 1.1 riastrad int s, ss; 181 1.1 riastrad 182 1.1 riastrad if (sseu->max_slices == 0) { 183 1.1 riastrad drm_printf(p, "Unavailable\n"); 184 1.1 riastrad return; 185 1.1 riastrad } 186 1.1 riastrad 187 1.1 riastrad for (s = 0; s < sseu->max_slices; s++) { 188 1.1 riastrad drm_printf(p, "slice%d: %u subslice(s) (0x%08x):\n", 189 1.1 riastrad s, intel_sseu_subslices_per_slice(sseu, s), 190 1.1 riastrad intel_sseu_get_subslices(sseu, s)); 191 1.1 riastrad 192 1.1 riastrad for (ss = 0; ss < sseu->max_subslices; ss++) { 193 1.1 riastrad u16 enabled_eus = sseu_get_eus(sseu, s, ss); 194 1.1 riastrad 195 1.1 riastrad drm_printf(p, "\tsubslice%d: %u EUs (0x%hx)\n", 196 1.1 riastrad ss, hweight16(enabled_eus), enabled_eus); 197 1.1 riastrad } 198 1.1 riastrad } 199 1.1 riastrad } 200 1.1 riastrad 201 1.1 riastrad static u16 compute_eu_total(const struct sseu_dev_info *sseu) 202 1.1 riastrad { 203 1.1 riastrad u16 i, total = 0; 204 1.1 riastrad 205 1.1 riastrad for (i = 0; i < ARRAY_SIZE(sseu->eu_mask); i++) 206 1.1 riastrad total += hweight8(sseu->eu_mask[i]); 207 1.1 riastrad 208 1.1 riastrad return total; 209 1.1 riastrad } 210 1.1 riastrad 211 1.1 riastrad static void gen11_compute_sseu_info(struct sseu_dev_info *sseu, 212 1.1 riastrad u8 s_en, u32 ss_en, u16 eu_en) 213 1.1 riastrad { 214 1.1 riastrad int s, ss; 215 1.1 riastrad 216 1.1 riastrad /* ss_en represents entire subslice mask across all slices */ 217 1.1 riastrad GEM_BUG_ON(sseu->max_slices * sseu->max_subslices > 218 1.1 riastrad sizeof(ss_en) * BITS_PER_BYTE); 219 1.1 riastrad 220 1.1 riastrad for (s = 0; s < sseu->max_slices; s++) { 221 1.1 riastrad if ((s_en & BIT(s)) == 0) 222 1.1 riastrad continue; 223 1.1 riastrad 224 1.1 riastrad sseu->slice_mask |= BIT(s); 225 1.1 riastrad 226 1.1 riastrad intel_sseu_set_subslices(sseu, s, ss_en); 227 1.1 riastrad 228 1.1 riastrad for (ss = 0; ss < sseu->max_subslices; ss++) 229 1.1 riastrad if (intel_sseu_has_subslice(sseu, s, ss)) 230 1.1 riastrad sseu_set_eus(sseu, s, ss, eu_en); 231 1.1 riastrad } 232 1.1 riastrad sseu->eu_per_subslice = hweight16(eu_en); 233 1.1 riastrad sseu->eu_total = compute_eu_total(sseu); 234 1.1 riastrad } 235 1.1 riastrad 236 1.1 riastrad static void gen12_sseu_info_init(struct drm_i915_private *dev_priv) 237 1.1 riastrad { 238 1.1 riastrad struct sseu_dev_info *sseu = &RUNTIME_INFO(dev_priv)->sseu; 239 1.1 riastrad u8 s_en; 240 1.1 riastrad u32 dss_en; 241 1.1 riastrad u16 eu_en = 0; 242 1.1 riastrad u8 eu_en_fuse; 243 1.1 riastrad int eu; 244 1.1 riastrad 245 1.1 riastrad /* 246 1.1 riastrad * Gen12 has Dual-Subslices, which behave similarly to 2 gen11 SS. 247 1.1 riastrad * Instead of splitting these, provide userspace with an array 248 1.1 riastrad * of DSS to more closely represent the hardware resource. 249 1.1 riastrad */ 250 1.1 riastrad intel_sseu_set_info(sseu, 1, 6, 16); 251 1.1 riastrad 252 1.1 riastrad s_en = I915_READ(GEN11_GT_SLICE_ENABLE) & GEN11_GT_S_ENA_MASK; 253 1.1 riastrad 254 1.1 riastrad dss_en = I915_READ(GEN12_GT_DSS_ENABLE); 255 1.1 riastrad 256 1.1 riastrad /* one bit per pair of EUs */ 257 1.1 riastrad eu_en_fuse = ~(I915_READ(GEN11_EU_DISABLE) & GEN11_EU_DIS_MASK); 258 1.1 riastrad for (eu = 0; eu < sseu->max_eus_per_subslice / 2; eu++) 259 1.1 riastrad if (eu_en_fuse & BIT(eu)) 260 1.1 riastrad eu_en |= BIT(eu * 2) | BIT(eu * 2 + 1); 261 1.1 riastrad 262 1.1 riastrad gen11_compute_sseu_info(sseu, s_en, dss_en, eu_en); 263 1.1 riastrad 264 1.1 riastrad /* TGL only supports slice-level power gating */ 265 1.1 riastrad sseu->has_slice_pg = 1; 266 1.1 riastrad } 267 1.1 riastrad 268 1.1 riastrad static void gen11_sseu_info_init(struct drm_i915_private *dev_priv) 269 1.1 riastrad { 270 1.1 riastrad struct sseu_dev_info *sseu = &RUNTIME_INFO(dev_priv)->sseu; 271 1.1 riastrad u8 s_en; 272 1.1 riastrad u32 ss_en; 273 1.1 riastrad u8 eu_en; 274 1.1 riastrad 275 1.1 riastrad if (IS_ELKHARTLAKE(dev_priv)) 276 1.1 riastrad intel_sseu_set_info(sseu, 1, 4, 8); 277 1.1 riastrad else 278 1.1 riastrad intel_sseu_set_info(sseu, 1, 8, 8); 279 1.1 riastrad 280 1.1 riastrad s_en = I915_READ(GEN11_GT_SLICE_ENABLE) & GEN11_GT_S_ENA_MASK; 281 1.1 riastrad ss_en = ~I915_READ(GEN11_GT_SUBSLICE_DISABLE); 282 1.1 riastrad eu_en = ~(I915_READ(GEN11_EU_DISABLE) & GEN11_EU_DIS_MASK); 283 1.1 riastrad 284 1.1 riastrad gen11_compute_sseu_info(sseu, s_en, ss_en, eu_en); 285 1.1 riastrad 286 1.1 riastrad /* ICL has no power gating restrictions. */ 287 1.1 riastrad sseu->has_slice_pg = 1; 288 1.1 riastrad sseu->has_subslice_pg = 1; 289 1.1 riastrad sseu->has_eu_pg = 1; 290 1.1 riastrad } 291 1.1 riastrad 292 1.1 riastrad static void gen10_sseu_info_init(struct drm_i915_private *dev_priv) 293 1.1 riastrad { 294 1.1 riastrad struct sseu_dev_info *sseu = &RUNTIME_INFO(dev_priv)->sseu; 295 1.1 riastrad const u32 fuse2 = I915_READ(GEN8_FUSE2); 296 1.1 riastrad int s, ss; 297 1.1 riastrad const int eu_mask = 0xff; 298 1.1 riastrad u32 subslice_mask, eu_en; 299 1.1 riastrad 300 1.1 riastrad intel_sseu_set_info(sseu, 6, 4, 8); 301 1.1 riastrad 302 1.1 riastrad sseu->slice_mask = (fuse2 & GEN10_F2_S_ENA_MASK) >> 303 1.1 riastrad GEN10_F2_S_ENA_SHIFT; 304 1.1 riastrad 305 1.1 riastrad /* Slice0 */ 306 1.1 riastrad eu_en = ~I915_READ(GEN8_EU_DISABLE0); 307 1.1 riastrad for (ss = 0; ss < sseu->max_subslices; ss++) 308 1.1 riastrad sseu_set_eus(sseu, 0, ss, (eu_en >> (8 * ss)) & eu_mask); 309 1.1 riastrad /* Slice1 */ 310 1.1 riastrad sseu_set_eus(sseu, 1, 0, (eu_en >> 24) & eu_mask); 311 1.1 riastrad eu_en = ~I915_READ(GEN8_EU_DISABLE1); 312 1.1 riastrad sseu_set_eus(sseu, 1, 1, eu_en & eu_mask); 313 1.1 riastrad /* Slice2 */ 314 1.1 riastrad sseu_set_eus(sseu, 2, 0, (eu_en >> 8) & eu_mask); 315 1.1 riastrad sseu_set_eus(sseu, 2, 1, (eu_en >> 16) & eu_mask); 316 1.1 riastrad /* Slice3 */ 317 1.1 riastrad sseu_set_eus(sseu, 3, 0, (eu_en >> 24) & eu_mask); 318 1.1 riastrad eu_en = ~I915_READ(GEN8_EU_DISABLE2); 319 1.1 riastrad sseu_set_eus(sseu, 3, 1, eu_en & eu_mask); 320 1.1 riastrad /* Slice4 */ 321 1.1 riastrad sseu_set_eus(sseu, 4, 0, (eu_en >> 8) & eu_mask); 322 1.1 riastrad sseu_set_eus(sseu, 4, 1, (eu_en >> 16) & eu_mask); 323 1.1 riastrad /* Slice5 */ 324 1.1 riastrad sseu_set_eus(sseu, 5, 0, (eu_en >> 24) & eu_mask); 325 1.1 riastrad eu_en = ~I915_READ(GEN10_EU_DISABLE3); 326 1.1 riastrad sseu_set_eus(sseu, 5, 1, eu_en & eu_mask); 327 1.1 riastrad 328 1.1 riastrad subslice_mask = (1 << 4) - 1; 329 1.1 riastrad subslice_mask &= ~((fuse2 & GEN10_F2_SS_DIS_MASK) >> 330 1.1 riastrad GEN10_F2_SS_DIS_SHIFT); 331 1.1 riastrad 332 1.1 riastrad for (s = 0; s < sseu->max_slices; s++) { 333 1.1 riastrad u32 subslice_mask_with_eus = subslice_mask; 334 1.1 riastrad 335 1.1 riastrad for (ss = 0; ss < sseu->max_subslices; ss++) { 336 1.1 riastrad if (sseu_get_eus(sseu, s, ss) == 0) 337 1.1 riastrad subslice_mask_with_eus &= ~BIT(ss); 338 1.1 riastrad } 339 1.1 riastrad 340 1.1 riastrad /* 341 1.1 riastrad * Slice0 can have up to 3 subslices, but there are only 2 in 342 1.1 riastrad * slice1/2. 343 1.1 riastrad */ 344 1.1 riastrad intel_sseu_set_subslices(sseu, s, s == 0 ? 345 1.1 riastrad subslice_mask_with_eus : 346 1.1 riastrad subslice_mask_with_eus & 0x3); 347 1.1 riastrad } 348 1.1 riastrad 349 1.1 riastrad sseu->eu_total = compute_eu_total(sseu); 350 1.1 riastrad 351 1.1 riastrad /* 352 1.1 riastrad * CNL is expected to always have a uniform distribution 353 1.1 riastrad * of EU across subslices with the exception that any one 354 1.1 riastrad * EU in any one subslice may be fused off for die 355 1.1 riastrad * recovery. 356 1.1 riastrad */ 357 1.1 riastrad sseu->eu_per_subslice = intel_sseu_subslice_total(sseu) ? 358 1.1 riastrad DIV_ROUND_UP(sseu->eu_total, 359 1.1 riastrad intel_sseu_subslice_total(sseu)) : 360 1.1 riastrad 0; 361 1.1 riastrad 362 1.1 riastrad /* No restrictions on Power Gating */ 363 1.1 riastrad sseu->has_slice_pg = 1; 364 1.1 riastrad sseu->has_subslice_pg = 1; 365 1.1 riastrad sseu->has_eu_pg = 1; 366 1.1 riastrad } 367 1.1 riastrad 368 1.1 riastrad static void cherryview_sseu_info_init(struct drm_i915_private *dev_priv) 369 1.1 riastrad { 370 1.1 riastrad struct sseu_dev_info *sseu = &RUNTIME_INFO(dev_priv)->sseu; 371 1.1 riastrad u32 fuse; 372 1.1 riastrad u8 subslice_mask = 0; 373 1.1 riastrad 374 1.1 riastrad fuse = I915_READ(CHV_FUSE_GT); 375 1.1 riastrad 376 1.1 riastrad sseu->slice_mask = BIT(0); 377 1.1 riastrad intel_sseu_set_info(sseu, 1, 2, 8); 378 1.1 riastrad 379 1.1 riastrad if (!(fuse & CHV_FGT_DISABLE_SS0)) { 380 1.1 riastrad u8 disabled_mask = 381 1.1 riastrad ((fuse & CHV_FGT_EU_DIS_SS0_R0_MASK) >> 382 1.1 riastrad CHV_FGT_EU_DIS_SS0_R0_SHIFT) | 383 1.1 riastrad (((fuse & CHV_FGT_EU_DIS_SS0_R1_MASK) >> 384 1.1 riastrad CHV_FGT_EU_DIS_SS0_R1_SHIFT) << 4); 385 1.1 riastrad 386 1.1 riastrad subslice_mask |= BIT(0); 387 1.1 riastrad sseu_set_eus(sseu, 0, 0, ~disabled_mask); 388 1.1 riastrad } 389 1.1 riastrad 390 1.1 riastrad if (!(fuse & CHV_FGT_DISABLE_SS1)) { 391 1.1 riastrad u8 disabled_mask = 392 1.1 riastrad ((fuse & CHV_FGT_EU_DIS_SS1_R0_MASK) >> 393 1.1 riastrad CHV_FGT_EU_DIS_SS1_R0_SHIFT) | 394 1.1 riastrad (((fuse & CHV_FGT_EU_DIS_SS1_R1_MASK) >> 395 1.1 riastrad CHV_FGT_EU_DIS_SS1_R1_SHIFT) << 4); 396 1.1 riastrad 397 1.1 riastrad subslice_mask |= BIT(1); 398 1.1 riastrad sseu_set_eus(sseu, 0, 1, ~disabled_mask); 399 1.1 riastrad } 400 1.1 riastrad 401 1.1 riastrad intel_sseu_set_subslices(sseu, 0, subslice_mask); 402 1.1 riastrad 403 1.1 riastrad sseu->eu_total = compute_eu_total(sseu); 404 1.1 riastrad 405 1.1 riastrad /* 406 1.1 riastrad * CHV expected to always have a uniform distribution of EU 407 1.1 riastrad * across subslices. 408 1.1 riastrad */ 409 1.1 riastrad sseu->eu_per_subslice = intel_sseu_subslice_total(sseu) ? 410 1.1 riastrad sseu->eu_total / 411 1.1 riastrad intel_sseu_subslice_total(sseu) : 412 1.1 riastrad 0; 413 1.1 riastrad /* 414 1.1 riastrad * CHV supports subslice power gating on devices with more than 415 1.1 riastrad * one subslice, and supports EU power gating on devices with 416 1.1 riastrad * more than one EU pair per subslice. 417 1.1 riastrad */ 418 1.1 riastrad sseu->has_slice_pg = 0; 419 1.1 riastrad sseu->has_subslice_pg = intel_sseu_subslice_total(sseu) > 1; 420 1.1 riastrad sseu->has_eu_pg = (sseu->eu_per_subslice > 2); 421 1.1 riastrad } 422 1.1 riastrad 423 1.1 riastrad static void gen9_sseu_info_init(struct drm_i915_private *dev_priv) 424 1.1 riastrad { 425 1.1 riastrad struct intel_device_info *info = mkwrite_device_info(dev_priv); 426 1.1 riastrad struct sseu_dev_info *sseu = &RUNTIME_INFO(dev_priv)->sseu; 427 1.1 riastrad int s, ss; 428 1.1 riastrad u32 fuse2, eu_disable, subslice_mask; 429 1.1 riastrad const u8 eu_mask = 0xff; 430 1.1 riastrad 431 1.1 riastrad fuse2 = I915_READ(GEN8_FUSE2); 432 1.1 riastrad sseu->slice_mask = (fuse2 & GEN8_F2_S_ENA_MASK) >> GEN8_F2_S_ENA_SHIFT; 433 1.1 riastrad 434 1.1 riastrad /* BXT has a single slice and at most 3 subslices. */ 435 1.1 riastrad intel_sseu_set_info(sseu, IS_GEN9_LP(dev_priv) ? 1 : 3, 436 1.1 riastrad IS_GEN9_LP(dev_priv) ? 3 : 4, 8); 437 1.1 riastrad 438 1.1 riastrad /* 439 1.1 riastrad * The subslice disable field is global, i.e. it applies 440 1.1 riastrad * to each of the enabled slices. 441 1.1 riastrad */ 442 1.1 riastrad subslice_mask = (1 << sseu->max_subslices) - 1; 443 1.1 riastrad subslice_mask &= ~((fuse2 & GEN9_F2_SS_DIS_MASK) >> 444 1.1 riastrad GEN9_F2_SS_DIS_SHIFT); 445 1.1 riastrad 446 1.1 riastrad /* 447 1.1 riastrad * Iterate through enabled slices and subslices to 448 1.1 riastrad * count the total enabled EU. 449 1.1 riastrad */ 450 1.1 riastrad for (s = 0; s < sseu->max_slices; s++) { 451 1.1 riastrad if (!(sseu->slice_mask & BIT(s))) 452 1.1 riastrad /* skip disabled slice */ 453 1.1 riastrad continue; 454 1.1 riastrad 455 1.1 riastrad intel_sseu_set_subslices(sseu, s, subslice_mask); 456 1.1 riastrad 457 1.1 riastrad eu_disable = I915_READ(GEN9_EU_DISABLE(s)); 458 1.1 riastrad for (ss = 0; ss < sseu->max_subslices; ss++) { 459 1.1 riastrad int eu_per_ss; 460 1.1 riastrad u8 eu_disabled_mask; 461 1.1 riastrad 462 1.1 riastrad if (!intel_sseu_has_subslice(sseu, s, ss)) 463 1.1 riastrad /* skip disabled subslice */ 464 1.1 riastrad continue; 465 1.1 riastrad 466 1.1 riastrad eu_disabled_mask = (eu_disable >> (ss * 8)) & eu_mask; 467 1.1 riastrad 468 1.1 riastrad sseu_set_eus(sseu, s, ss, ~eu_disabled_mask); 469 1.1 riastrad 470 1.1 riastrad eu_per_ss = sseu->max_eus_per_subslice - 471 1.1 riastrad hweight8(eu_disabled_mask); 472 1.1 riastrad 473 1.1 riastrad /* 474 1.1 riastrad * Record which subslice(s) has(have) 7 EUs. we 475 1.1 riastrad * can tune the hash used to spread work among 476 1.1 riastrad * subslices if they are unbalanced. 477 1.1 riastrad */ 478 1.1 riastrad if (eu_per_ss == 7) 479 1.1 riastrad sseu->subslice_7eu[s] |= BIT(ss); 480 1.1 riastrad } 481 1.1 riastrad } 482 1.1 riastrad 483 1.1 riastrad sseu->eu_total = compute_eu_total(sseu); 484 1.1 riastrad 485 1.1 riastrad /* 486 1.1 riastrad * SKL is expected to always have a uniform distribution 487 1.1 riastrad * of EU across subslices with the exception that any one 488 1.1 riastrad * EU in any one subslice may be fused off for die 489 1.1 riastrad * recovery. BXT is expected to be perfectly uniform in EU 490 1.1 riastrad * distribution. 491 1.1 riastrad */ 492 1.1 riastrad sseu->eu_per_subslice = intel_sseu_subslice_total(sseu) ? 493 1.1 riastrad DIV_ROUND_UP(sseu->eu_total, 494 1.1 riastrad intel_sseu_subslice_total(sseu)) : 495 1.1 riastrad 0; 496 1.1 riastrad /* 497 1.1 riastrad * SKL+ supports slice power gating on devices with more than 498 1.1 riastrad * one slice, and supports EU power gating on devices with 499 1.1 riastrad * more than one EU pair per subslice. BXT+ supports subslice 500 1.1 riastrad * power gating on devices with more than one subslice, and 501 1.1 riastrad * supports EU power gating on devices with more than one EU 502 1.1 riastrad * pair per subslice. 503 1.1 riastrad */ 504 1.1 riastrad sseu->has_slice_pg = 505 1.1 riastrad !IS_GEN9_LP(dev_priv) && hweight8(sseu->slice_mask) > 1; 506 1.1 riastrad sseu->has_subslice_pg = 507 1.1 riastrad IS_GEN9_LP(dev_priv) && intel_sseu_subslice_total(sseu) > 1; 508 1.1 riastrad sseu->has_eu_pg = sseu->eu_per_subslice > 2; 509 1.1 riastrad 510 1.1 riastrad if (IS_GEN9_LP(dev_priv)) { 511 1.1 riastrad #define IS_SS_DISABLED(ss) (!(sseu->subslice_mask[0] & BIT(ss))) 512 1.1 riastrad info->has_pooled_eu = hweight8(sseu->subslice_mask[0]) == 3; 513 1.1 riastrad 514 1.1 riastrad sseu->min_eu_in_pool = 0; 515 1.1 riastrad if (info->has_pooled_eu) { 516 1.1 riastrad if (IS_SS_DISABLED(2) || IS_SS_DISABLED(0)) 517 1.1 riastrad sseu->min_eu_in_pool = 3; 518 1.1 riastrad else if (IS_SS_DISABLED(1)) 519 1.1 riastrad sseu->min_eu_in_pool = 6; 520 1.1 riastrad else 521 1.1 riastrad sseu->min_eu_in_pool = 9; 522 1.1 riastrad } 523 1.1 riastrad #undef IS_SS_DISABLED 524 1.1 riastrad } 525 1.1 riastrad } 526 1.1 riastrad 527 1.1 riastrad static void bdw_sseu_info_init(struct drm_i915_private *dev_priv) 528 1.1 riastrad { 529 1.1 riastrad struct sseu_dev_info *sseu = &RUNTIME_INFO(dev_priv)->sseu; 530 1.1 riastrad int s, ss; 531 1.1 riastrad u32 fuse2, subslice_mask, eu_disable[3]; /* s_max */ 532 1.1 riastrad 533 1.1 riastrad fuse2 = I915_READ(GEN8_FUSE2); 534 1.1 riastrad sseu->slice_mask = (fuse2 & GEN8_F2_S_ENA_MASK) >> GEN8_F2_S_ENA_SHIFT; 535 1.1 riastrad intel_sseu_set_info(sseu, 3, 3, 8); 536 1.1 riastrad 537 1.1 riastrad /* 538 1.1 riastrad * The subslice disable field is global, i.e. it applies 539 1.1 riastrad * to each of the enabled slices. 540 1.1 riastrad */ 541 1.1 riastrad subslice_mask = GENMASK(sseu->max_subslices - 1, 0); 542 1.1 riastrad subslice_mask &= ~((fuse2 & GEN8_F2_SS_DIS_MASK) >> 543 1.1 riastrad GEN8_F2_SS_DIS_SHIFT); 544 1.1 riastrad 545 1.1 riastrad eu_disable[0] = I915_READ(GEN8_EU_DISABLE0) & GEN8_EU_DIS0_S0_MASK; 546 1.1 riastrad eu_disable[1] = (I915_READ(GEN8_EU_DISABLE0) >> GEN8_EU_DIS0_S1_SHIFT) | 547 1.1 riastrad ((I915_READ(GEN8_EU_DISABLE1) & GEN8_EU_DIS1_S1_MASK) << 548 1.1 riastrad (32 - GEN8_EU_DIS0_S1_SHIFT)); 549 1.1 riastrad eu_disable[2] = (I915_READ(GEN8_EU_DISABLE1) >> GEN8_EU_DIS1_S2_SHIFT) | 550 1.1 riastrad ((I915_READ(GEN8_EU_DISABLE2) & GEN8_EU_DIS2_S2_MASK) << 551 1.1 riastrad (32 - GEN8_EU_DIS1_S2_SHIFT)); 552 1.1 riastrad 553 1.1 riastrad /* 554 1.1 riastrad * Iterate through enabled slices and subslices to 555 1.1 riastrad * count the total enabled EU. 556 1.1 riastrad */ 557 1.1 riastrad for (s = 0; s < sseu->max_slices; s++) { 558 1.1 riastrad if (!(sseu->slice_mask & BIT(s))) 559 1.1 riastrad /* skip disabled slice */ 560 1.1 riastrad continue; 561 1.1 riastrad 562 1.1 riastrad intel_sseu_set_subslices(sseu, s, subslice_mask); 563 1.1 riastrad 564 1.1 riastrad for (ss = 0; ss < sseu->max_subslices; ss++) { 565 1.1 riastrad u8 eu_disabled_mask; 566 1.1 riastrad u32 n_disabled; 567 1.1 riastrad 568 1.1 riastrad if (!intel_sseu_has_subslice(sseu, s, ss)) 569 1.1 riastrad /* skip disabled subslice */ 570 1.1 riastrad continue; 571 1.1 riastrad 572 1.1 riastrad eu_disabled_mask = 573 1.1 riastrad eu_disable[s] >> (ss * sseu->max_eus_per_subslice); 574 1.1 riastrad 575 1.1 riastrad sseu_set_eus(sseu, s, ss, ~eu_disabled_mask); 576 1.1 riastrad 577 1.1 riastrad n_disabled = hweight8(eu_disabled_mask); 578 1.1 riastrad 579 1.1 riastrad /* 580 1.1 riastrad * Record which subslices have 7 EUs. 581 1.1 riastrad */ 582 1.1 riastrad if (sseu->max_eus_per_subslice - n_disabled == 7) 583 1.1 riastrad sseu->subslice_7eu[s] |= 1 << ss; 584 1.1 riastrad } 585 1.1 riastrad } 586 1.1 riastrad 587 1.1 riastrad sseu->eu_total = compute_eu_total(sseu); 588 1.1 riastrad 589 1.1 riastrad /* 590 1.1 riastrad * BDW is expected to always have a uniform distribution of EU across 591 1.1 riastrad * subslices with the exception that any one EU in any one subslice may 592 1.1 riastrad * be fused off for die recovery. 593 1.1 riastrad */ 594 1.1 riastrad sseu->eu_per_subslice = intel_sseu_subslice_total(sseu) ? 595 1.1 riastrad DIV_ROUND_UP(sseu->eu_total, 596 1.1 riastrad intel_sseu_subslice_total(sseu)) : 597 1.1 riastrad 0; 598 1.1 riastrad 599 1.1 riastrad /* 600 1.1 riastrad * BDW supports slice power gating on devices with more than 601 1.1 riastrad * one slice. 602 1.1 riastrad */ 603 1.1 riastrad sseu->has_slice_pg = hweight8(sseu->slice_mask) > 1; 604 1.1 riastrad sseu->has_subslice_pg = 0; 605 1.1 riastrad sseu->has_eu_pg = 0; 606 1.1 riastrad } 607 1.1 riastrad 608 1.1 riastrad static void hsw_sseu_info_init(struct drm_i915_private *dev_priv) 609 1.1 riastrad { 610 1.1 riastrad struct sseu_dev_info *sseu = &RUNTIME_INFO(dev_priv)->sseu; 611 1.1 riastrad u32 fuse1; 612 1.1 riastrad u8 subslice_mask = 0; 613 1.1 riastrad int s, ss; 614 1.1 riastrad 615 1.1 riastrad /* 616 1.1 riastrad * There isn't a register to tell us how many slices/subslices. We 617 1.1 riastrad * work off the PCI-ids here. 618 1.1 riastrad */ 619 1.1 riastrad switch (INTEL_INFO(dev_priv)->gt) { 620 1.1 riastrad default: 621 1.1 riastrad MISSING_CASE(INTEL_INFO(dev_priv)->gt); 622 1.1 riastrad /* fall through */ 623 1.1 riastrad case 1: 624 1.1 riastrad sseu->slice_mask = BIT(0); 625 1.1 riastrad subslice_mask = BIT(0); 626 1.1 riastrad break; 627 1.1 riastrad case 2: 628 1.1 riastrad sseu->slice_mask = BIT(0); 629 1.1 riastrad subslice_mask = BIT(0) | BIT(1); 630 1.1 riastrad break; 631 1.1 riastrad case 3: 632 1.1 riastrad sseu->slice_mask = BIT(0) | BIT(1); 633 1.1 riastrad subslice_mask = BIT(0) | BIT(1); 634 1.1 riastrad break; 635 1.1 riastrad } 636 1.1 riastrad 637 1.1 riastrad fuse1 = I915_READ(HSW_PAVP_FUSE1); 638 1.1 riastrad switch ((fuse1 & HSW_F1_EU_DIS_MASK) >> HSW_F1_EU_DIS_SHIFT) { 639 1.1 riastrad default: 640 1.1 riastrad MISSING_CASE((fuse1 & HSW_F1_EU_DIS_MASK) >> 641 1.1 riastrad HSW_F1_EU_DIS_SHIFT); 642 1.1 riastrad /* fall through */ 643 1.1 riastrad case HSW_F1_EU_DIS_10EUS: 644 1.1 riastrad sseu->eu_per_subslice = 10; 645 1.1 riastrad break; 646 1.1 riastrad case HSW_F1_EU_DIS_8EUS: 647 1.1 riastrad sseu->eu_per_subslice = 8; 648 1.1 riastrad break; 649 1.1 riastrad case HSW_F1_EU_DIS_6EUS: 650 1.1 riastrad sseu->eu_per_subslice = 6; 651 1.1 riastrad break; 652 1.1 riastrad } 653 1.1 riastrad 654 1.1 riastrad intel_sseu_set_info(sseu, hweight8(sseu->slice_mask), 655 1.1 riastrad hweight8(subslice_mask), 656 1.1 riastrad sseu->eu_per_subslice); 657 1.1 riastrad 658 1.1 riastrad for (s = 0; s < sseu->max_slices; s++) { 659 1.1 riastrad intel_sseu_set_subslices(sseu, s, subslice_mask); 660 1.1 riastrad 661 1.1 riastrad for (ss = 0; ss < sseu->max_subslices; ss++) { 662 1.1 riastrad sseu_set_eus(sseu, s, ss, 663 1.1 riastrad (1UL << sseu->eu_per_subslice) - 1); 664 1.1 riastrad } 665 1.1 riastrad } 666 1.1 riastrad 667 1.1 riastrad sseu->eu_total = compute_eu_total(sseu); 668 1.1 riastrad 669 1.1 riastrad /* No powergating for you. */ 670 1.1 riastrad sseu->has_slice_pg = 0; 671 1.1 riastrad sseu->has_subslice_pg = 0; 672 1.1 riastrad sseu->has_eu_pg = 0; 673 1.1 riastrad } 674 1.1 riastrad 675 1.1 riastrad static u32 read_reference_ts_freq(struct drm_i915_private *dev_priv) 676 1.1 riastrad { 677 1.1 riastrad u32 ts_override = I915_READ(GEN9_TIMESTAMP_OVERRIDE); 678 1.1 riastrad u32 base_freq, frac_freq; 679 1.1 riastrad 680 1.1 riastrad base_freq = ((ts_override & GEN9_TIMESTAMP_OVERRIDE_US_COUNTER_DIVIDER_MASK) >> 681 1.1 riastrad GEN9_TIMESTAMP_OVERRIDE_US_COUNTER_DIVIDER_SHIFT) + 1; 682 1.1 riastrad base_freq *= 1000; 683 1.1 riastrad 684 1.1 riastrad frac_freq = ((ts_override & 685 1.1 riastrad GEN9_TIMESTAMP_OVERRIDE_US_COUNTER_DENOMINATOR_MASK) >> 686 1.1 riastrad GEN9_TIMESTAMP_OVERRIDE_US_COUNTER_DENOMINATOR_SHIFT); 687 1.1 riastrad frac_freq = 1000 / (frac_freq + 1); 688 1.1 riastrad 689 1.1 riastrad return base_freq + frac_freq; 690 1.1 riastrad } 691 1.1 riastrad 692 1.1 riastrad static u32 gen10_get_crystal_clock_freq(struct drm_i915_private *dev_priv, 693 1.1 riastrad u32 rpm_config_reg) 694 1.1 riastrad { 695 1.1 riastrad u32 f19_2_mhz = 19200; 696 1.1 riastrad u32 f24_mhz = 24000; 697 1.1 riastrad u32 crystal_clock = (rpm_config_reg & 698 1.1 riastrad GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_MASK) >> 699 1.1 riastrad GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_SHIFT; 700 1.1 riastrad 701 1.1 riastrad switch (crystal_clock) { 702 1.1 riastrad case GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_19_2_MHZ: 703 1.1 riastrad return f19_2_mhz; 704 1.1 riastrad case GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_24_MHZ: 705 1.1 riastrad return f24_mhz; 706 1.1 riastrad default: 707 1.1 riastrad MISSING_CASE(crystal_clock); 708 1.1 riastrad return 0; 709 1.1 riastrad } 710 1.1 riastrad } 711 1.1 riastrad 712 1.1 riastrad static u32 gen11_get_crystal_clock_freq(struct drm_i915_private *dev_priv, 713 1.1 riastrad u32 rpm_config_reg) 714 1.1 riastrad { 715 1.1 riastrad u32 f19_2_mhz = 19200; 716 1.1 riastrad u32 f24_mhz = 24000; 717 1.1 riastrad u32 f25_mhz = 25000; 718 1.1 riastrad u32 f38_4_mhz = 38400; 719 1.1 riastrad u32 crystal_clock = (rpm_config_reg & 720 1.1 riastrad GEN11_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_MASK) >> 721 1.1 riastrad GEN11_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_SHIFT; 722 1.1 riastrad 723 1.1 riastrad switch (crystal_clock) { 724 1.1 riastrad case GEN11_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_24_MHZ: 725 1.1 riastrad return f24_mhz; 726 1.1 riastrad case GEN11_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_19_2_MHZ: 727 1.1 riastrad return f19_2_mhz; 728 1.1 riastrad case GEN11_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_38_4_MHZ: 729 1.1 riastrad return f38_4_mhz; 730 1.1 riastrad case GEN11_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_25_MHZ: 731 1.1 riastrad return f25_mhz; 732 1.1 riastrad default: 733 1.1 riastrad MISSING_CASE(crystal_clock); 734 1.1 riastrad return 0; 735 1.1 riastrad } 736 1.1 riastrad } 737 1.1 riastrad 738 1.1 riastrad static u32 read_timestamp_frequency(struct drm_i915_private *dev_priv) 739 1.1 riastrad { 740 1.1 riastrad u32 f12_5_mhz = 12500; 741 1.1 riastrad u32 f19_2_mhz = 19200; 742 1.1 riastrad u32 f24_mhz = 24000; 743 1.1 riastrad 744 1.1 riastrad if (INTEL_GEN(dev_priv) <= 4) { 745 1.1 riastrad /* PRMs say: 746 1.1 riastrad * 747 1.1 riastrad * "The value in this register increments once every 16 748 1.1 riastrad * hclks." (through the Clocking Configuration 749 1.1 riastrad * (CLKCFG) MCHBAR register) 750 1.1 riastrad */ 751 1.1 riastrad return dev_priv->rawclk_freq / 16; 752 1.1 riastrad } else if (INTEL_GEN(dev_priv) <= 8) { 753 1.1 riastrad /* PRMs say: 754 1.1 riastrad * 755 1.1 riastrad * "The PCU TSC counts 10ns increments; this timestamp 756 1.1 riastrad * reflects bits 38:3 of the TSC (i.e. 80ns granularity, 757 1.1 riastrad * rolling over every 1.5 hours). 758 1.1 riastrad */ 759 1.1 riastrad return f12_5_mhz; 760 1.1 riastrad } else if (INTEL_GEN(dev_priv) <= 9) { 761 1.1 riastrad u32 ctc_reg = I915_READ(CTC_MODE); 762 1.1 riastrad u32 freq = 0; 763 1.1 riastrad 764 1.1 riastrad if ((ctc_reg & CTC_SOURCE_PARAMETER_MASK) == CTC_SOURCE_DIVIDE_LOGIC) { 765 1.1 riastrad freq = read_reference_ts_freq(dev_priv); 766 1.1 riastrad } else { 767 1.1 riastrad freq = IS_GEN9_LP(dev_priv) ? f19_2_mhz : f24_mhz; 768 1.1 riastrad 769 1.1 riastrad /* Now figure out how the command stream's timestamp 770 1.1 riastrad * register increments from this frequency (it might 771 1.1 riastrad * increment only every few clock cycle). 772 1.1 riastrad */ 773 1.1 riastrad freq >>= 3 - ((ctc_reg & CTC_SHIFT_PARAMETER_MASK) >> 774 1.1 riastrad CTC_SHIFT_PARAMETER_SHIFT); 775 1.1 riastrad } 776 1.1 riastrad 777 1.1 riastrad return freq; 778 1.1 riastrad } else if (INTEL_GEN(dev_priv) <= 12) { 779 1.1 riastrad u32 ctc_reg = I915_READ(CTC_MODE); 780 1.1 riastrad u32 freq = 0; 781 1.1 riastrad 782 1.1 riastrad /* First figure out the reference frequency. There are 2 ways 783 1.1 riastrad * we can compute the frequency, either through the 784 1.1 riastrad * TIMESTAMP_OVERRIDE register or through RPM_CONFIG. CTC_MODE 785 1.1 riastrad * tells us which one we should use. 786 1.1 riastrad */ 787 1.1 riastrad if ((ctc_reg & CTC_SOURCE_PARAMETER_MASK) == CTC_SOURCE_DIVIDE_LOGIC) { 788 1.1 riastrad freq = read_reference_ts_freq(dev_priv); 789 1.1 riastrad } else { 790 1.1 riastrad u32 rpm_config_reg = I915_READ(RPM_CONFIG0); 791 1.1 riastrad 792 1.1 riastrad if (INTEL_GEN(dev_priv) <= 10) 793 1.1 riastrad freq = gen10_get_crystal_clock_freq(dev_priv, 794 1.1 riastrad rpm_config_reg); 795 1.1 riastrad else 796 1.1 riastrad freq = gen11_get_crystal_clock_freq(dev_priv, 797 1.1 riastrad rpm_config_reg); 798 1.1 riastrad 799 1.1 riastrad /* Now figure out how the command stream's timestamp 800 1.1 riastrad * register increments from this frequency (it might 801 1.1 riastrad * increment only every few clock cycle). 802 1.1 riastrad */ 803 1.1 riastrad freq >>= 3 - ((rpm_config_reg & 804 1.1 riastrad GEN10_RPM_CONFIG0_CTC_SHIFT_PARAMETER_MASK) >> 805 1.1 riastrad GEN10_RPM_CONFIG0_CTC_SHIFT_PARAMETER_SHIFT); 806 1.1 riastrad } 807 1.1 riastrad 808 1.1 riastrad return freq; 809 1.1 riastrad } 810 1.1 riastrad 811 1.1 riastrad MISSING_CASE("Unknown gen, unable to read command streamer timestamp frequency\n"); 812 1.1 riastrad return 0; 813 1.1 riastrad } 814 1.1 riastrad 815 1.1 riastrad #undef INTEL_VGA_DEVICE 816 1.1 riastrad #define INTEL_VGA_DEVICE(id, info) (id) 817 1.1 riastrad 818 1.1 riastrad static const u16 subplatform_ult_ids[] = { 819 1.1 riastrad INTEL_HSW_ULT_GT1_IDS(0), 820 1.1 riastrad INTEL_HSW_ULT_GT2_IDS(0), 821 1.1 riastrad INTEL_HSW_ULT_GT3_IDS(0), 822 1.1 riastrad INTEL_BDW_ULT_GT1_IDS(0), 823 1.1 riastrad INTEL_BDW_ULT_GT2_IDS(0), 824 1.1 riastrad INTEL_BDW_ULT_GT3_IDS(0), 825 1.1 riastrad INTEL_BDW_ULT_RSVD_IDS(0), 826 1.1 riastrad INTEL_SKL_ULT_GT1_IDS(0), 827 1.1 riastrad INTEL_SKL_ULT_GT2_IDS(0), 828 1.1 riastrad INTEL_SKL_ULT_GT3_IDS(0), 829 1.1 riastrad INTEL_KBL_ULT_GT1_IDS(0), 830 1.1 riastrad INTEL_KBL_ULT_GT2_IDS(0), 831 1.1 riastrad INTEL_KBL_ULT_GT3_IDS(0), 832 1.1 riastrad INTEL_CFL_U_GT2_IDS(0), 833 1.1 riastrad INTEL_CFL_U_GT3_IDS(0), 834 1.1 riastrad INTEL_WHL_U_GT1_IDS(0), 835 1.1 riastrad INTEL_WHL_U_GT2_IDS(0), 836 1.1 riastrad INTEL_WHL_U_GT3_IDS(0), 837 1.1 riastrad INTEL_CML_U_GT1_IDS(0), 838 1.1 riastrad INTEL_CML_U_GT2_IDS(0), 839 1.1 riastrad }; 840 1.1 riastrad 841 1.1 riastrad static const u16 subplatform_ulx_ids[] = { 842 1.1 riastrad INTEL_HSW_ULX_GT1_IDS(0), 843 1.1 riastrad INTEL_HSW_ULX_GT2_IDS(0), 844 1.1 riastrad INTEL_BDW_ULX_GT1_IDS(0), 845 1.1 riastrad INTEL_BDW_ULX_GT2_IDS(0), 846 1.1 riastrad INTEL_BDW_ULX_GT3_IDS(0), 847 1.1 riastrad INTEL_BDW_ULX_RSVD_IDS(0), 848 1.1 riastrad INTEL_SKL_ULX_GT1_IDS(0), 849 1.1 riastrad INTEL_SKL_ULX_GT2_IDS(0), 850 1.1 riastrad INTEL_KBL_ULX_GT1_IDS(0), 851 1.1 riastrad INTEL_KBL_ULX_GT2_IDS(0), 852 1.1 riastrad INTEL_AML_KBL_GT2_IDS(0), 853 1.1 riastrad INTEL_AML_CFL_GT2_IDS(0), 854 1.1 riastrad }; 855 1.1 riastrad 856 1.1 riastrad static const u16 subplatform_portf_ids[] = { 857 1.1 riastrad INTEL_CNL_PORT_F_IDS(0), 858 1.1 riastrad INTEL_ICL_PORT_F_IDS(0), 859 1.1 riastrad }; 860 1.1 riastrad 861 1.1 riastrad static bool find_devid(u16 id, const u16 *p, unsigned int num) 862 1.1 riastrad { 863 1.1 riastrad for (; num; num--, p++) { 864 1.1 riastrad if (*p == id) 865 1.1 riastrad return true; 866 1.1 riastrad } 867 1.1 riastrad 868 1.1 riastrad return false; 869 1.1 riastrad } 870 1.1 riastrad 871 1.1 riastrad void intel_device_info_subplatform_init(struct drm_i915_private *i915) 872 1.1 riastrad { 873 1.1 riastrad const struct intel_device_info *info = INTEL_INFO(i915); 874 1.1 riastrad const struct intel_runtime_info *rinfo = RUNTIME_INFO(i915); 875 1.1 riastrad const unsigned int pi = __platform_mask_index(rinfo, info->platform); 876 1.1 riastrad const unsigned int pb = __platform_mask_bit(rinfo, info->platform); 877 1.1 riastrad u16 devid = INTEL_DEVID(i915); 878 1.1 riastrad u32 mask = 0; 879 1.1 riastrad 880 1.1 riastrad /* Make sure IS_<platform> checks are working. */ 881 1.1 riastrad RUNTIME_INFO(i915)->platform_mask[pi] = BIT(pb); 882 1.1 riastrad 883 1.1 riastrad /* Find and mark subplatform bits based on the PCI device id. */ 884 1.1 riastrad if (find_devid(devid, subplatform_ult_ids, 885 1.1 riastrad ARRAY_SIZE(subplatform_ult_ids))) { 886 1.1 riastrad mask = BIT(INTEL_SUBPLATFORM_ULT); 887 1.1 riastrad } else if (find_devid(devid, subplatform_ulx_ids, 888 1.1 riastrad ARRAY_SIZE(subplatform_ulx_ids))) { 889 1.1 riastrad mask = BIT(INTEL_SUBPLATFORM_ULX); 890 1.1 riastrad if (IS_HASWELL(i915) || IS_BROADWELL(i915)) { 891 1.1 riastrad /* ULX machines are also considered ULT. */ 892 1.1 riastrad mask |= BIT(INTEL_SUBPLATFORM_ULT); 893 1.1 riastrad } 894 1.1 riastrad } else if (find_devid(devid, subplatform_portf_ids, 895 1.1 riastrad ARRAY_SIZE(subplatform_portf_ids))) { 896 1.1 riastrad mask = BIT(INTEL_SUBPLATFORM_PORTF); 897 1.1 riastrad } 898 1.1 riastrad 899 1.1 riastrad GEM_BUG_ON(mask & ~INTEL_SUBPLATFORM_BITS); 900 1.1 riastrad 901 1.1 riastrad RUNTIME_INFO(i915)->platform_mask[pi] |= mask; 902 1.1 riastrad } 903 1.1 riastrad 904 1.1 riastrad /** 905 1.1 riastrad * intel_device_info_runtime_init - initialize runtime info 906 1.1 riastrad * @dev_priv: the i915 device 907 1.1 riastrad * 908 1.1 riastrad * Determine various intel_device_info fields at runtime. 909 1.1 riastrad * 910 1.1 riastrad * Use it when either: 911 1.1 riastrad * - it's judged too laborious to fill n static structures with the limit 912 1.1 riastrad * when a simple if statement does the job, 913 1.1 riastrad * - run-time checks (eg read fuse/strap registers) are needed. 914 1.1 riastrad * 915 1.1 riastrad * This function needs to be called: 916 1.1 riastrad * - after the MMIO has been setup as we are reading registers, 917 1.1 riastrad * - after the PCH has been detected, 918 1.1 riastrad * - before the first usage of the fields it can tweak. 919 1.1 riastrad */ 920 1.1 riastrad void intel_device_info_runtime_init(struct drm_i915_private *dev_priv) 921 1.1 riastrad { 922 1.1 riastrad struct intel_device_info *info = mkwrite_device_info(dev_priv); 923 1.1 riastrad struct intel_runtime_info *runtime = RUNTIME_INFO(dev_priv); 924 1.1 riastrad enum pipe pipe; 925 1.1 riastrad 926 1.1 riastrad if (INTEL_GEN(dev_priv) >= 10) { 927 1.1 riastrad for_each_pipe(dev_priv, pipe) 928 1.1 riastrad runtime->num_scalers[pipe] = 2; 929 1.1 riastrad } else if (IS_GEN(dev_priv, 9)) { 930 1.1 riastrad runtime->num_scalers[PIPE_A] = 2; 931 1.1 riastrad runtime->num_scalers[PIPE_B] = 2; 932 1.1 riastrad runtime->num_scalers[PIPE_C] = 1; 933 1.1 riastrad } 934 1.1 riastrad 935 1.1 riastrad BUILD_BUG_ON(BITS_PER_TYPE(intel_engine_mask_t) < I915_NUM_ENGINES); 936 1.1 riastrad 937 1.1 riastrad if (INTEL_GEN(dev_priv) >= 11) 938 1.1 riastrad for_each_pipe(dev_priv, pipe) 939 1.1 riastrad runtime->num_sprites[pipe] = 6; 940 1.1 riastrad else if (IS_GEN(dev_priv, 10) || IS_GEMINILAKE(dev_priv)) 941 1.1 riastrad for_each_pipe(dev_priv, pipe) 942 1.1 riastrad runtime->num_sprites[pipe] = 3; 943 1.1 riastrad else if (IS_BROXTON(dev_priv)) { 944 1.1 riastrad /* 945 1.1 riastrad * Skylake and Broxton currently don't expose the topmost plane as its 946 1.1 riastrad * use is exclusive with the legacy cursor and we only want to expose 947 1.1 riastrad * one of those, not both. Until we can safely expose the topmost plane 948 1.1 riastrad * as a DRM_PLANE_TYPE_CURSOR with all the features exposed/supported, 949 1.1 riastrad * we don't expose the topmost plane at all to prevent ABI breakage 950 1.1 riastrad * down the line. 951 1.1 riastrad */ 952 1.1 riastrad 953 1.1 riastrad runtime->num_sprites[PIPE_A] = 2; 954 1.1 riastrad runtime->num_sprites[PIPE_B] = 2; 955 1.1 riastrad runtime->num_sprites[PIPE_C] = 1; 956 1.1 riastrad } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) { 957 1.1 riastrad for_each_pipe(dev_priv, pipe) 958 1.1 riastrad runtime->num_sprites[pipe] = 2; 959 1.1 riastrad } else if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv)) { 960 1.1 riastrad for_each_pipe(dev_priv, pipe) 961 1.1 riastrad runtime->num_sprites[pipe] = 1; 962 1.1 riastrad } 963 1.1 riastrad 964 1.1 riastrad if (HAS_DISPLAY(dev_priv) && IS_GEN_RANGE(dev_priv, 7, 8) && 965 1.1 riastrad HAS_PCH_SPLIT(dev_priv)) { 966 1.1 riastrad u32 fuse_strap = I915_READ(FUSE_STRAP); 967 1.1 riastrad u32 sfuse_strap = I915_READ(SFUSE_STRAP); 968 1.1 riastrad 969 1.1 riastrad /* 970 1.1 riastrad * SFUSE_STRAP is supposed to have a bit signalling the display 971 1.1 riastrad * is fused off. Unfortunately it seems that, at least in 972 1.1 riastrad * certain cases, fused off display means that PCH display 973 1.1 riastrad * reads don't land anywhere. In that case, we read 0s. 974 1.1 riastrad * 975 1.1 riastrad * On CPT/PPT, we can detect this case as SFUSE_STRAP_FUSE_LOCK 976 1.1 riastrad * should be set when taking over after the firmware. 977 1.1 riastrad */ 978 1.1 riastrad if (fuse_strap & ILK_INTERNAL_DISPLAY_DISABLE || 979 1.1 riastrad sfuse_strap & SFUSE_STRAP_DISPLAY_DISABLED || 980 1.1 riastrad (HAS_PCH_CPT(dev_priv) && 981 1.1 riastrad !(sfuse_strap & SFUSE_STRAP_FUSE_LOCK))) { 982 1.1 riastrad DRM_INFO("Display fused off, disabling\n"); 983 1.1 riastrad info->pipe_mask = 0; 984 1.1 riastrad } else if (fuse_strap & IVB_PIPE_C_DISABLE) { 985 1.1 riastrad DRM_INFO("PipeC fused off\n"); 986 1.1 riastrad info->pipe_mask &= ~BIT(PIPE_C); 987 1.1 riastrad } 988 1.1 riastrad } else if (HAS_DISPLAY(dev_priv) && INTEL_GEN(dev_priv) >= 9) { 989 1.1 riastrad u32 dfsm = I915_READ(SKL_DFSM); 990 1.1 riastrad u8 enabled_mask = info->pipe_mask; 991 1.1 riastrad 992 1.1 riastrad if (dfsm & SKL_DFSM_PIPE_A_DISABLE) 993 1.1 riastrad enabled_mask &= ~BIT(PIPE_A); 994 1.1 riastrad if (dfsm & SKL_DFSM_PIPE_B_DISABLE) 995 1.1 riastrad enabled_mask &= ~BIT(PIPE_B); 996 1.1 riastrad if (dfsm & SKL_DFSM_PIPE_C_DISABLE) 997 1.1 riastrad enabled_mask &= ~BIT(PIPE_C); 998 1.1 riastrad if (INTEL_GEN(dev_priv) >= 12 && 999 1.1 riastrad (dfsm & TGL_DFSM_PIPE_D_DISABLE)) 1000 1.1 riastrad enabled_mask &= ~BIT(PIPE_D); 1001 1.1 riastrad 1002 1.1 riastrad /* 1003 1.1 riastrad * At least one pipe should be enabled and if there are 1004 1.1 riastrad * disabled pipes, they should be the last ones, with no holes 1005 1.1 riastrad * in the mask. 1006 1.1 riastrad */ 1007 1.1 riastrad if (enabled_mask == 0 || !is_power_of_2(enabled_mask + 1)) 1008 1.1 riastrad DRM_ERROR("invalid pipe fuse configuration: enabled_mask=0x%x\n", 1009 1.1 riastrad enabled_mask); 1010 1.1 riastrad else 1011 1.1 riastrad info->pipe_mask = enabled_mask; 1012 1.1 riastrad 1013 1.1 riastrad if (dfsm & SKL_DFSM_DISPLAY_HDCP_DISABLE) 1014 1.1 riastrad info->display.has_hdcp = 0; 1015 1.1 riastrad 1016 1.1 riastrad if (dfsm & SKL_DFSM_DISPLAY_PM_DISABLE) 1017 1.1 riastrad info->display.has_fbc = 0; 1018 1.1 riastrad 1019 1.1 riastrad if (INTEL_GEN(dev_priv) >= 11 && (dfsm & ICL_DFSM_DMC_DISABLE)) 1020 1.1 riastrad info->display.has_csr = 0; 1021 1.1 riastrad 1022 1.1 riastrad if (INTEL_GEN(dev_priv) >= 10 && 1023 1.1 riastrad (dfsm & CNL_DFSM_DISPLAY_DSC_DISABLE)) 1024 1.1 riastrad info->display.has_dsc = 0; 1025 1.1 riastrad } 1026 1.1 riastrad 1027 1.1 riastrad /* Initialize slice/subslice/EU info */ 1028 1.1 riastrad if (IS_HASWELL(dev_priv)) 1029 1.1 riastrad hsw_sseu_info_init(dev_priv); 1030 1.1 riastrad else if (IS_CHERRYVIEW(dev_priv)) 1031 1.1 riastrad cherryview_sseu_info_init(dev_priv); 1032 1.1 riastrad else if (IS_BROADWELL(dev_priv)) 1033 1.1 riastrad bdw_sseu_info_init(dev_priv); 1034 1.1 riastrad else if (IS_GEN(dev_priv, 9)) 1035 1.1 riastrad gen9_sseu_info_init(dev_priv); 1036 1.1 riastrad else if (IS_GEN(dev_priv, 10)) 1037 1.1 riastrad gen10_sseu_info_init(dev_priv); 1038 1.1 riastrad else if (IS_GEN(dev_priv, 11)) 1039 1.1 riastrad gen11_sseu_info_init(dev_priv); 1040 1.1 riastrad else if (INTEL_GEN(dev_priv) >= 12) 1041 1.1 riastrad gen12_sseu_info_init(dev_priv); 1042 1.1 riastrad 1043 1.1 riastrad if (IS_GEN(dev_priv, 6) && intel_vtd_active()) { 1044 1.1 riastrad DRM_INFO("Disabling ppGTT for VT-d support\n"); 1045 1.1 riastrad info->ppgtt_type = INTEL_PPGTT_NONE; 1046 1.1 riastrad } 1047 1.1 riastrad 1048 1.1 riastrad /* Initialize command stream timestamp frequency */ 1049 1.1 riastrad runtime->cs_timestamp_frequency_khz = read_timestamp_frequency(dev_priv); 1050 1.1 riastrad } 1051 1.1 riastrad 1052 1.1 riastrad void intel_driver_caps_print(const struct intel_driver_caps *caps, 1053 1.1 riastrad struct drm_printer *p) 1054 1.1 riastrad { 1055 1.1 riastrad drm_printf(p, "Has logical contexts? %s\n", 1056 1.1 riastrad yesno(caps->has_logical_contexts)); 1057 1.1 riastrad drm_printf(p, "scheduler: %x\n", caps->scheduler); 1058 1.1 riastrad } 1059 1.1 riastrad 1060 1.1 riastrad /* 1061 1.1 riastrad * Determine which engines are fused off in our particular hardware. Since the 1062 1.1 riastrad * fuse register is in the blitter powerwell, we need forcewake to be ready at 1063 1.1 riastrad * this point (but later we need to prune the forcewake domains for engines that 1064 1.1 riastrad * are indeed fused off). 1065 1.1 riastrad */ 1066 1.1 riastrad void intel_device_info_init_mmio(struct drm_i915_private *dev_priv) 1067 1.1 riastrad { 1068 1.1 riastrad struct intel_device_info *info = mkwrite_device_info(dev_priv); 1069 1.1 riastrad unsigned int logical_vdbox = 0; 1070 1.1 riastrad unsigned int i; 1071 1.1 riastrad u32 media_fuse; 1072 1.1 riastrad u16 vdbox_mask; 1073 1.1 riastrad u16 vebox_mask; 1074 1.1 riastrad 1075 1.1 riastrad if (INTEL_GEN(dev_priv) < 11) 1076 1.1 riastrad return; 1077 1.1 riastrad 1078 1.1 riastrad media_fuse = ~I915_READ(GEN11_GT_VEBOX_VDBOX_DISABLE); 1079 1.1 riastrad 1080 1.1 riastrad vdbox_mask = media_fuse & GEN11_GT_VDBOX_DISABLE_MASK; 1081 1.1 riastrad vebox_mask = (media_fuse & GEN11_GT_VEBOX_DISABLE_MASK) >> 1082 1.1 riastrad GEN11_GT_VEBOX_DISABLE_SHIFT; 1083 1.1 riastrad 1084 1.1 riastrad for (i = 0; i < I915_MAX_VCS; i++) { 1085 1.1 riastrad if (!HAS_ENGINE(dev_priv, _VCS(i))) { 1086 1.1 riastrad vdbox_mask &= ~BIT(i); 1087 1.1 riastrad continue; 1088 1.1 riastrad } 1089 1.1 riastrad 1090 1.1 riastrad if (!(BIT(i) & vdbox_mask)) { 1091 1.1 riastrad info->engine_mask &= ~BIT(_VCS(i)); 1092 1.1 riastrad DRM_DEBUG_DRIVER("vcs%u fused off\n", i); 1093 1.1 riastrad continue; 1094 1.1 riastrad } 1095 1.1 riastrad 1096 1.1 riastrad /* 1097 1.1 riastrad * In Gen11, only even numbered logical VDBOXes are 1098 1.1 riastrad * hooked up to an SFC (Scaler & Format Converter) unit. 1099 1.1 riastrad * In TGL each VDBOX has access to an SFC. 1100 1.1 riastrad */ 1101 1.1 riastrad if (INTEL_GEN(dev_priv) >= 12 || logical_vdbox++ % 2 == 0) 1102 1.1 riastrad RUNTIME_INFO(dev_priv)->vdbox_sfc_access |= BIT(i); 1103 1.1 riastrad } 1104 1.1 riastrad DRM_DEBUG_DRIVER("vdbox enable: %04x, instances: %04lx\n", 1105 1.1 riastrad vdbox_mask, VDBOX_MASK(dev_priv)); 1106 1.1 riastrad GEM_BUG_ON(vdbox_mask != VDBOX_MASK(dev_priv)); 1107 1.1 riastrad 1108 1.1 riastrad for (i = 0; i < I915_MAX_VECS; i++) { 1109 1.1 riastrad if (!HAS_ENGINE(dev_priv, _VECS(i))) { 1110 1.1 riastrad vebox_mask &= ~BIT(i); 1111 1.1 riastrad continue; 1112 1.1 riastrad } 1113 1.1 riastrad 1114 1.1 riastrad if (!(BIT(i) & vebox_mask)) { 1115 1.1 riastrad info->engine_mask &= ~BIT(_VECS(i)); 1116 1.1 riastrad DRM_DEBUG_DRIVER("vecs%u fused off\n", i); 1117 1.1 riastrad } 1118 1.1 riastrad } 1119 1.1 riastrad DRM_DEBUG_DRIVER("vebox enable: %04x, instances: %04lx\n", 1120 1.1 riastrad vebox_mask, VEBOX_MASK(dev_priv)); 1121 1.1 riastrad GEM_BUG_ON(vebox_mask != VEBOX_MASK(dev_priv)); 1122 1.1 riastrad } 1123