[Intel-gfx] [PATCH 6/7] drm/i915: expose command stream timestamp frequency to userspace
Chris Wilson
chris at chris-wilson.co.uk
Fri Nov 10 20:58:12 UTC 2017
Quoting Lionel Landwerlin (2017-11-10 19:08:44)
> +static u64 read_timestamp_frequency(struct drm_i915_private *dev_priv)
> +{
> + u64 f12_5_mhz = 12500000;
> + u64 f19_2_mhz = 19200000;
> + u64 f24_mhz = 24000000;
> +
> + if (INTEL_GEN(dev_priv) <= 4) {
> + /* PRMs say:
> + *
> + * "The value in this register increments once every 16
> + * hclks." (through the “Clocking Configuration”
> + * (“CLKCFG”) MCHBAR register)
> + */
> + return (dev_priv->rawclk_freq * 1000) / 16;
> + } else if (INTEL_GEN(dev_priv) <= 8) {
> + /* PRMs say:
> + *
> + * "The PCU TSC counts 10ns increments; this timestamp
> + * reflects bits 38:3 of the TSC (i.e. 80ns granularity,
> + * rolling over every 1.5 hours).
> + */
> + return f12_5_mhz;
> + } else if (INTEL_GEN(dev_priv) <= 9) {
> + u32 ctc_reg = I915_READ(CTC_MODE);
> + u64 freq = 0;
> +
> + if ((ctc_reg & CTC_SOURCE_PARAMETER_MASK) == CTC_SOURCE_DIVIDE_LOGIC) {
> + freq = read_reference_ts_freq(dev_priv);
> + } else {
> + freq = IS_GEN9_LP(dev_priv) ? f19_2_mhz : f24_mhz;
> +
> + /* Now figure out how the command stream's timestamp
> + * register increments from this frequency (it might
> + * increment only every few clock cycle).
> + */
> + freq >>= 3 - ((ctc_reg & CTC_SHIFT_PARAMETER_MASK) >>
> + CTC_SHIFT_PARAMETER_SHIFT);
> + }
> +
> + return freq;
> + } else if (INTEL_GEN(dev_priv) <= 10) {
> + u32 ctc_reg = I915_READ(CTC_MODE);
> + u64 freq = 0;
> + u32 rpm_config_reg = 0;
> +
> + /* First figure out the reference frequency. There are 2 ways
> + * we can compute the frequency, either through the
> + * TIMESTAMP_OVERRIDE register or through RPM_CONFIG. CTC_MODE
> + * tells us which one we should use.
> + */
> + if ((ctc_reg & CTC_SOURCE_PARAMETER_MASK) == CTC_SOURCE_DIVIDE_LOGIC) {
> + freq = read_reference_ts_freq(dev_priv);
> + } else {
> + u32 crystal_clock;
> +
> + rpm_config_reg = I915_READ(RPM_CONFIG0);
> + crystal_clock = (rpm_config_reg &
> + GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_MASK) >>
> + GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_SHIFT;
> + switch (crystal_clock) {
> + case GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_19_2_MHZ:
> + freq = f19_2_mhz;
> + break;
> + case GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_24_MHZ:
> + freq = f24_mhz;
> + break;
> + }
> + }
> +
> + /* Now figure out how the command stream's timestamp register
> + * increments from this frequency (it might increment only
> + * every few clock cycle).
> + */
> + freq >>= 3 - ((rpm_config_reg &
> + GEN10_RPM_CONFIG0_CTC_SHIFT_PARAMETER_MASK) >>
> + GEN10_RPM_CONFIG0_CTC_SHIFT_PARAMETER_SHIFT);
> +
> + return freq;
> + }
> +
> + DRM_ERROR("Unknown gen, unable to compute command stream timestamp frequency\n");
Typically this would be a MISSING_CASE(). It gives something to grep for
when adding new gen.
-Chris
More information about the Intel-gfx
mailing list