Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/i915: Store CS timestamp frequency in Hz

kHz isn't accurate enough for storing the CS timestamp
frequency on some of the platforms. Store the value
in Hz instead.

Cc: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200302143943.32676-2-ville.syrjala@linux.intel.com
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>

+30 -30
+3 -3
drivers/gpu/drm/i915/i915_debugfs.c
··· 1304 1304 seq_printf(m, "GT awake? %s [%d]\n", 1305 1305 yesno(dev_priv->gt.awake), 1306 1306 atomic_read(&dev_priv->gt.wakeref.count)); 1307 - seq_printf(m, "CS timestamp frequency: %u kHz\n", 1308 - RUNTIME_INFO(dev_priv)->cs_timestamp_frequency_khz); 1307 + seq_printf(m, "CS timestamp frequency: %u Hz\n", 1308 + RUNTIME_INFO(dev_priv)->cs_timestamp_frequency_hz); 1309 1309 1310 1310 p = drm_seq_file_printer(m); 1311 1311 for_each_uabi_engine(engine, dev_priv) ··· 1404 1404 i915_perf_noa_delay_set(void *data, u64 val) 1405 1405 { 1406 1406 struct drm_i915_private *i915 = data; 1407 - const u32 clk = RUNTIME_INFO(i915)->cs_timestamp_frequency_khz; 1407 + const u32 clk = RUNTIME_INFO(i915)->cs_timestamp_frequency_hz / 1000; 1408 1408 1409 1409 /* 1410 1410 * This would lead to infinite waits as we're doing timestamp
+1 -1
drivers/gpu/drm/i915/i915_getparam.c
··· 153 153 return -ENODEV; 154 154 break; 155 155 case I915_PARAM_CS_TIMESTAMP_FREQUENCY: 156 - value = 1000 * RUNTIME_INFO(i915)->cs_timestamp_frequency_khz; 156 + value = RUNTIME_INFO(i915)->cs_timestamp_frequency_hz; 157 157 break; 158 158 case I915_PARAM_MMAP_GTT_COHERENT: 159 159 value = INTEL_INFO(i915)->has_coherent_ggtt;
+6 -6
drivers/gpu/drm/i915/i915_perf.c
··· 1613 1613 struct i915_vma *vma; 1614 1614 const u64 delay_ticks = 0xffffffffffffffff - 1615 1615 DIV_ROUND_UP_ULL(atomic64_read(&stream->perf->noa_programming_delay) * 1616 - RUNTIME_INFO(i915)->cs_timestamp_frequency_khz, 1617 - 1000000); 1616 + RUNTIME_INFO(i915)->cs_timestamp_frequency_hz, 1617 + 1000000000); 1618 1618 const u32 base = stream->engine->mmio_base; 1619 1619 #define CS_GPR(x) GEN8_RING_CS_GPR(base, x) 1620 1620 u32 *batch, *ts0, *cs, *jump; ··· 3484 3484 3485 3485 static u64 oa_exponent_to_ns(struct i915_perf *perf, int exponent) 3486 3486 { 3487 - return div_u64(1000000 * (2ULL << exponent), 3488 - RUNTIME_INFO(perf->i915)->cs_timestamp_frequency_khz); 3487 + return div_u64(1000000000 * (2ULL << exponent), 3488 + RUNTIME_INFO(perf->i915)->cs_timestamp_frequency_hz); 3489 3489 } 3490 3490 3491 3491 /** ··· 4343 4343 if (perf->ops.enable_metric_set) { 4344 4344 mutex_init(&perf->lock); 4345 4345 4346 - oa_sample_rate_hard_limit = 1000 * 4347 - (RUNTIME_INFO(i915)->cs_timestamp_frequency_khz / 2); 4346 + oa_sample_rate_hard_limit = 4347 + RUNTIME_INFO(i915)->cs_timestamp_frequency_hz / 2; 4348 4348 4349 4349 mutex_init(&perf->metrics_lock); 4350 4350 idr_init(&perf->metrics_idr);
+17 -17
drivers/gpu/drm/i915/intel_device_info.c
··· 136 136 sseu_dump(&info->sseu, p); 137 137 138 138 drm_printf(p, "rawclk rate: %u kHz\n", info->rawclk_freq); 139 - drm_printf(p, "CS timestamp frequency: %u kHz\n", 140 - info->cs_timestamp_frequency_khz); 139 + drm_printf(p, "CS timestamp frequency: %u Hz\n", 140 + info->cs_timestamp_frequency_hz); 141 141 } 142 142 143 143 static int sseu_eu_idx(const struct sseu_dev_info *sseu, int slice, ··· 678 678 679 679 base_freq = ((ts_override & GEN9_TIMESTAMP_OVERRIDE_US_COUNTER_DIVIDER_MASK) >> 680 680 GEN9_TIMESTAMP_OVERRIDE_US_COUNTER_DIVIDER_SHIFT) + 1; 681 - base_freq *= 1000; 681 + base_freq *= 1000000; 682 682 683 683 frac_freq = ((ts_override & 684 684 GEN9_TIMESTAMP_OVERRIDE_US_COUNTER_DENOMINATOR_MASK) >> 685 685 GEN9_TIMESTAMP_OVERRIDE_US_COUNTER_DENOMINATOR_SHIFT); 686 - frac_freq = 1000 / (frac_freq + 1); 686 + frac_freq = 1000000 / (frac_freq + 1); 687 687 688 688 return base_freq + frac_freq; 689 689 } ··· 691 691 static u32 gen10_get_crystal_clock_freq(struct drm_i915_private *dev_priv, 692 692 u32 rpm_config_reg) 693 693 { 694 - u32 f19_2_mhz = 19200; 695 - u32 f24_mhz = 24000; 694 + u32 f19_2_mhz = 19200000; 695 + u32 f24_mhz = 24000000; 696 696 u32 crystal_clock = (rpm_config_reg & 697 697 GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_MASK) >> 698 698 GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_SHIFT; ··· 711 711 static u32 gen11_get_crystal_clock_freq(struct drm_i915_private *dev_priv, 712 712 u32 rpm_config_reg) 713 713 { 714 - u32 f19_2_mhz = 19200; 715 - u32 f24_mhz = 24000; 716 - u32 f25_mhz = 25000; 717 - u32 f38_4_mhz = 38400; 714 + u32 f19_2_mhz = 19200000; 715 + u32 f24_mhz = 24000000; 716 + u32 f25_mhz = 25000000; 717 + u32 f38_4_mhz = 38400000; 718 718 u32 crystal_clock = (rpm_config_reg & 719 719 GEN11_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_MASK) >> 720 720 GEN11_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_SHIFT; ··· 736 736 737 737 static u32 read_timestamp_frequency(struct drm_i915_private *dev_priv) 738 738 { 739 - u32 f12_5_mhz = 12500; 740 - u32 f19_2_mhz = 19200; 741 - u32 f24_mhz = 24000; 739 + u32 f12_5_mhz = 12500000; 740 + u32 f19_2_mhz = 19200000; 741 + u32 f24_mhz = 24000000; 742 742 743 743 if (INTEL_GEN(dev_priv) <= 4) { 744 744 /* PRMs say: ··· 747 747 * hclks." (through the “Clocking Configuration” 748 748 * (“CLKCFG”) MCHBAR register) 749 749 */ 750 - return RUNTIME_INFO(dev_priv)->rawclk_freq / 16; 750 + return RUNTIME_INFO(dev_priv)->rawclk_freq * 1000 / 16; 751 751 } else if (INTEL_GEN(dev_priv) <= 8) { 752 752 /* PRMs say: 753 753 * ··· 1048 1048 drm_dbg(&dev_priv->drm, "rawclk rate: %d kHz\n", runtime->rawclk_freq); 1049 1049 1050 1050 /* Initialize command stream timestamp frequency */ 1051 - runtime->cs_timestamp_frequency_khz = 1051 + runtime->cs_timestamp_frequency_hz = 1052 1052 read_timestamp_frequency(dev_priv); 1053 - if (runtime->cs_timestamp_frequency_khz) { 1053 + if (runtime->cs_timestamp_frequency_hz) { 1054 1054 runtime->cs_timestamp_period_ns = 1055 - div_u64(1e6, runtime->cs_timestamp_frequency_khz); 1055 + div_u64(1e9, runtime->cs_timestamp_frequency_hz); 1056 1056 drm_dbg(&dev_priv->drm, 1057 1057 "CS timestamp wraparound in %lldms\n", 1058 1058 div_u64(mul_u32_u32(runtime->cs_timestamp_period_ns,
+1 -1
drivers/gpu/drm/i915/intel_device_info.h
··· 221 221 222 222 u32 rawclk_freq; 223 223 224 - u32 cs_timestamp_frequency_khz; 224 + u32 cs_timestamp_frequency_hz; 225 225 u32 cs_timestamp_period_ns; 226 226 227 227 /* Media engine access to SFC per instance */
+2 -2
drivers/gpu/drm/i915/selftests/i915_perf.c
··· 262 262 263 263 delay = intel_read_status_page(stream->engine, 0x102); 264 264 delay -= intel_read_status_page(stream->engine, 0x100); 265 - delay = div_u64(mul_u32_u32(delay, 1000 * 1000), 266 - RUNTIME_INFO(i915)->cs_timestamp_frequency_khz); 265 + delay = div_u64(mul_u32_u32(delay, 1000000000), 266 + RUNTIME_INFO(i915)->cs_timestamp_frequency_hz); 267 267 pr_info("GPU delay: %uns, expected %lluns\n", 268 268 delay, expected); 269 269