diff options
author | Dave Airlie <airlied@redhat.com> | 2017-12-03 18:40:35 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2017-12-03 19:56:53 -0500 |
commit | ca797d29cd63e7b71b4eea29aff3b1cefd1ecb59 (patch) | |
tree | db1ada69f713da68b43c828bd15f90e250f86ab7 /drivers/gpu/drm/i915/intel_device_info.c | |
parent | 2c1c55cb75a9c72f9726fabb8c3607947711a8df (diff) | |
parent | 010d118c20617021025a930bc8e90f371ab99da5 (diff) |
Merge tag 'drm-intel-next-2017-11-17-1' of git://anongit.freedesktop.org/drm/drm-intel into drm-next
More change sets for 4.16:
- Many improvements for selftests and other igt tests (Chris)
- Forcewake with PUNIT->PMIC bus fixes and robustness (Hans)
- Define an engine class for uABI (Tvrtko)
- Context switch fixes and improvements (Chris)
- GT powersavings and power gating simplification and fixes (Chris)
- Other general driver clean-ups (Chris, Lucas, Ville)
- Removing old, useless and/or bad workarounds (Chris, Oscar, Radhakrishna)
- IPS, pipe config, etc in preparation for another Fast Boot attempt (Maarten)
- OA perf fixes and support to Coffee Lake and Cannonlake (Lionel)
- Fixes around GPU fault registers (Michel)
- GEM Proxy (Tina)
- Refactor of Geminilake and Cannonlake plane color handling (James)
- Generalize transcoder loop (Mika Kahola)
- New HW Workaround for Cannonlake and Geminilake (Rodrigo)
- Resume GuC before using GEM (Chris)
- Stolen Memory handling improvements (Ville)
- Initialize entry in PPAT for older compilers (Chris)
- Other fixes and robustness improvements on execbuf (Chris)
- Improve logs of GEM_BUG_ON (Mika Kuoppala)
- Rework with massive rename of GuC functions and files (Sagar)
- Don't sanitize frame start delay if pipe is off (Ville)
- Cannonlake clock fixes (Rodrigo)
- Cannonlake HDMI 2.0 support (Rodrigo)
- Add a GuC doorbells selftest (Michel)
- Add might_sleep() check to our wait_for() (Chris)
Many GVT changes for 4.16:
- CSB HWSP update support (Weinan)
- GVT debug helpers, dyndbg and debugfs (Chuanxiao, Shuo)
- full virtualized opregion (Xiaolin)
- VM health check for sane fallback (Fred)
- workload submission code refactor for future enabling (Zhi)
- Updated repo URL in MAINTAINERS (Zhenyu)
- other many misc fixes
* tag 'drm-intel-next-2017-11-17-1' of git://anongit.freedesktop.org/drm/drm-intel: (260 commits)
drm/i915: Update DRIVER_DATE to 20171117
drm/i915: Add a policy note for removing workarounds
drm/i915/selftests: Report ENOMEM clearly for an allocation failure
Revert "drm/i915: Display WA #1133 WaFbcSkipSegments:cnl, glk"
drm/i915: Calculate g4x intermediate watermarks correctly
drm/i915: Calculate vlv/chv intermediate watermarks correctly, v3.
drm/i915: Pass crtc_state to ips toggle functions, v2
drm/i915: Pass idle crtc_state to intel_dp_sink_crc
drm/i915: Enable FIFO underrun reporting after initial fastset, v4.
drm/i915: Mark the userptr invalidate workqueue as WQ_MEM_RECLAIM
drm/i915: Add might_sleep() check to wait_for()
drm/i915/selftests: Add a GuC doorbells selftest
drm/i915/cnl: Extend HDMI 2.0 support to CNL.
drm/i915/cnl: Simplify dco_fraction calculation.
drm/i915/cnl: Don't blindly replace qdiv.
drm/i915/cnl: Fix wrpll math for higher freqs.
drm/i915/cnl: Fix, simplify and unify wrpll variable sizes.
drm/i915/cnl: Remove useless conversion.
drm/i915/cnl: Remove spurious central_freq.
drm/i915/selftests: exercise_ggtt may have nothing to do
...
Diffstat (limited to 'drivers/gpu/drm/i915/intel_device_info.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_device_info.c | 121 |
1 files changed, 110 insertions, 11 deletions
diff --git a/drivers/gpu/drm/i915/intel_device_info.c b/drivers/gpu/drm/i915/intel_device_info.c index 875d428ea75f..02f8bf101ccd 100644 --- a/drivers/gpu/drm/i915/intel_device_info.c +++ b/drivers/gpu/drm/i915/intel_device_info.c | |||
@@ -235,16 +235,6 @@ static void gen9_sseu_info_init(struct drm_i915_private *dev_priv) | |||
235 | #define IS_SS_DISABLED(ss) (!(sseu->subslice_mask & BIT(ss))) | 235 | #define IS_SS_DISABLED(ss) (!(sseu->subslice_mask & BIT(ss))) |
236 | info->has_pooled_eu = hweight8(sseu->subslice_mask) == 3; | 236 | info->has_pooled_eu = hweight8(sseu->subslice_mask) == 3; |
237 | 237 | ||
238 | /* | ||
239 | * There is a HW issue in 2x6 fused down parts that requires | ||
240 | * Pooled EU to be enabled as a WA. The pool configuration | ||
241 | * changes depending upon which subslice is fused down. This | ||
242 | * doesn't affect if the device has all 3 subslices enabled. | ||
243 | */ | ||
244 | /* WaEnablePooledEuFor2x6:bxt */ | ||
245 | info->has_pooled_eu |= (hweight8(sseu->subslice_mask) == 2 && | ||
246 | IS_BXT_REVID(dev_priv, 0, BXT_REVID_B_LAST)); | ||
247 | |||
248 | sseu->min_eu_in_pool = 0; | 238 | sseu->min_eu_in_pool = 0; |
249 | if (info->has_pooled_eu) { | 239 | if (info->has_pooled_eu) { |
250 | if (IS_SS_DISABLED(2) || IS_SS_DISABLED(0)) | 240 | if (IS_SS_DISABLED(2) || IS_SS_DISABLED(0)) |
@@ -329,6 +319,107 @@ static void broadwell_sseu_info_init(struct drm_i915_private *dev_priv) | |||
329 | sseu->has_eu_pg = 0; | 319 | sseu->has_eu_pg = 0; |
330 | } | 320 | } |
331 | 321 | ||
322 | static u32 read_reference_ts_freq(struct drm_i915_private *dev_priv) | ||
323 | { | ||
324 | u32 ts_override = I915_READ(GEN9_TIMESTAMP_OVERRIDE); | ||
325 | u32 base_freq, frac_freq; | ||
326 | |||
327 | base_freq = ((ts_override & GEN9_TIMESTAMP_OVERRIDE_US_COUNTER_DIVIDER_MASK) >> | ||
328 | GEN9_TIMESTAMP_OVERRIDE_US_COUNTER_DIVIDER_SHIFT) + 1; | ||
329 | base_freq *= 1000; | ||
330 | |||
331 | frac_freq = ((ts_override & | ||
332 | GEN9_TIMESTAMP_OVERRIDE_US_COUNTER_DENOMINATOR_MASK) >> | ||
333 | GEN9_TIMESTAMP_OVERRIDE_US_COUNTER_DENOMINATOR_SHIFT); | ||
334 | frac_freq = 1000 / (frac_freq + 1); | ||
335 | |||
336 | return base_freq + frac_freq; | ||
337 | } | ||
338 | |||
339 | static u32 read_timestamp_frequency(struct drm_i915_private *dev_priv) | ||
340 | { | ||
341 | u32 f12_5_mhz = 12500; | ||
342 | u32 f19_2_mhz = 19200; | ||
343 | u32 f24_mhz = 24000; | ||
344 | |||
345 | if (INTEL_GEN(dev_priv) <= 4) { | ||
346 | /* PRMs say: | ||
347 | * | ||
348 | * "The value in this register increments once every 16 | ||
349 | * hclks." (through the “Clocking Configuration” | ||
350 | * (“CLKCFG”) MCHBAR register) | ||
351 | */ | ||
352 | return dev_priv->rawclk_freq / 16; | ||
353 | } else if (INTEL_GEN(dev_priv) <= 8) { | ||
354 | /* PRMs say: | ||
355 | * | ||
356 | * "The PCU TSC counts 10ns increments; this timestamp | ||
357 | * reflects bits 38:3 of the TSC (i.e. 80ns granularity, | ||
358 | * rolling over every 1.5 hours). | ||
359 | */ | ||
360 | return f12_5_mhz; | ||
361 | } else if (INTEL_GEN(dev_priv) <= 9) { | ||
362 | u32 ctc_reg = I915_READ(CTC_MODE); | ||
363 | u32 freq = 0; | ||
364 | |||
365 | if ((ctc_reg & CTC_SOURCE_PARAMETER_MASK) == CTC_SOURCE_DIVIDE_LOGIC) { | ||
366 | freq = read_reference_ts_freq(dev_priv); | ||
367 | } else { | ||
368 | freq = IS_GEN9_LP(dev_priv) ? f19_2_mhz : f24_mhz; | ||
369 | |||
370 | /* Now figure out how the command stream's timestamp | ||
371 | * register increments from this frequency (it might | ||
372 | * increment only every few clock cycle). | ||
373 | */ | ||
374 | freq >>= 3 - ((ctc_reg & CTC_SHIFT_PARAMETER_MASK) >> | ||
375 | CTC_SHIFT_PARAMETER_SHIFT); | ||
376 | } | ||
377 | |||
378 | return freq; | ||
379 | } else if (INTEL_GEN(dev_priv) <= 10) { | ||
380 | u32 ctc_reg = I915_READ(CTC_MODE); | ||
381 | u32 freq = 0; | ||
382 | u32 rpm_config_reg = 0; | ||
383 | |||
384 | /* First figure out the reference frequency. There are 2 ways | ||
385 | * we can compute the frequency, either through the | ||
386 | * TIMESTAMP_OVERRIDE register or through RPM_CONFIG. CTC_MODE | ||
387 | * tells us which one we should use. | ||
388 | */ | ||
389 | if ((ctc_reg & CTC_SOURCE_PARAMETER_MASK) == CTC_SOURCE_DIVIDE_LOGIC) { | ||
390 | freq = read_reference_ts_freq(dev_priv); | ||
391 | } else { | ||
392 | u32 crystal_clock; | ||
393 | |||
394 | rpm_config_reg = I915_READ(RPM_CONFIG0); | ||
395 | crystal_clock = (rpm_config_reg & | ||
396 | GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_MASK) >> | ||
397 | GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_SHIFT; | ||
398 | switch (crystal_clock) { | ||
399 | case GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_19_2_MHZ: | ||
400 | freq = f19_2_mhz; | ||
401 | break; | ||
402 | case GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_24_MHZ: | ||
403 | freq = f24_mhz; | ||
404 | break; | ||
405 | } | ||
406 | } | ||
407 | |||
408 | /* Now figure out how the command stream's timestamp register | ||
409 | * increments from this frequency (it might increment only | ||
410 | * every few clock cycle). | ||
411 | */ | ||
412 | freq >>= 3 - ((rpm_config_reg & | ||
413 | GEN10_RPM_CONFIG0_CTC_SHIFT_PARAMETER_MASK) >> | ||
414 | GEN10_RPM_CONFIG0_CTC_SHIFT_PARAMETER_SHIFT); | ||
415 | |||
416 | return freq; | ||
417 | } | ||
418 | |||
419 | DRM_ERROR("Unknown gen, unable to compute command stream timestamp frequency\n"); | ||
420 | return 0; | ||
421 | } | ||
422 | |||
332 | /* | 423 | /* |
333 | * Determine various intel_device_info fields at runtime. | 424 | * Determine various intel_device_info fields at runtime. |
334 | * | 425 | * |
@@ -347,7 +438,10 @@ void intel_device_info_runtime_init(struct drm_i915_private *dev_priv) | |||
347 | struct intel_device_info *info = mkwrite_device_info(dev_priv); | 438 | struct intel_device_info *info = mkwrite_device_info(dev_priv); |
348 | enum pipe pipe; | 439 | enum pipe pipe; |
349 | 440 | ||
350 | if (INTEL_GEN(dev_priv) >= 9) { | 441 | if (INTEL_GEN(dev_priv) >= 10) { |
442 | for_each_pipe(dev_priv, pipe) | ||
443 | info->num_scalers[pipe] = 2; | ||
444 | } else if (INTEL_GEN(dev_priv) == 9) { | ||
351 | info->num_scalers[PIPE_A] = 2; | 445 | info->num_scalers[PIPE_A] = 2; |
352 | info->num_scalers[PIPE_B] = 2; | 446 | info->num_scalers[PIPE_B] = 2; |
353 | info->num_scalers[PIPE_C] = 1; | 447 | info->num_scalers[PIPE_C] = 1; |
@@ -447,6 +541,9 @@ void intel_device_info_runtime_init(struct drm_i915_private *dev_priv) | |||
447 | else if (INTEL_GEN(dev_priv) >= 10) | 541 | else if (INTEL_GEN(dev_priv) >= 10) |
448 | gen10_sseu_info_init(dev_priv); | 542 | gen10_sseu_info_init(dev_priv); |
449 | 543 | ||
544 | /* Initialize command stream timestamp frequency */ | ||
545 | info->cs_timestamp_frequency_khz = read_timestamp_frequency(dev_priv); | ||
546 | |||
450 | DRM_DEBUG_DRIVER("slice mask: %04x\n", info->sseu.slice_mask); | 547 | DRM_DEBUG_DRIVER("slice mask: %04x\n", info->sseu.slice_mask); |
451 | DRM_DEBUG_DRIVER("slice total: %u\n", hweight8(info->sseu.slice_mask)); | 548 | DRM_DEBUG_DRIVER("slice total: %u\n", hweight8(info->sseu.slice_mask)); |
452 | DRM_DEBUG_DRIVER("subslice total: %u\n", | 549 | DRM_DEBUG_DRIVER("subslice total: %u\n", |
@@ -462,4 +559,6 @@ void intel_device_info_runtime_init(struct drm_i915_private *dev_priv) | |||
462 | info->sseu.has_subslice_pg ? "y" : "n"); | 559 | info->sseu.has_subslice_pg ? "y" : "n"); |
463 | DRM_DEBUG_DRIVER("has EU power gating: %s\n", | 560 | DRM_DEBUG_DRIVER("has EU power gating: %s\n", |
464 | info->sseu.has_eu_pg ? "y" : "n"); | 561 | info->sseu.has_eu_pg ? "y" : "n"); |
562 | DRM_DEBUG_DRIVER("CS timestamp frequency: %u kHz\n", | ||
563 | info->cs_timestamp_frequency_khz); | ||
465 | } | 564 | } |