Skip to content

Commit

Permalink
drm/i915/display/dg2: Read CD clock from squasher table
Browse files Browse the repository at this point in the history
To calculate CD clock with squasher unit, we set CD clock ratio to fixed value of 34.
The CD clock value is read from CD clock squasher table.

BSpec: 54034

v2: Read ratio from register (Ville)
    Drop unnecessary local variable (Ville)
    Get CD clock from the given table
v3: Calculate CD clock frequency based on waveform bit pattern (Ville)
[v4: vsyrjala: Actually do a proper blind readout from the hardware]
[v5: vsyrjala: Use has_cdclk_squasher()]

Signed-off-by: Mika Kahola <mika.kahola@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20211119131348.725220-5-mika.kahola@intel.com
  • Loading branch information
Mika Kahola authored and Stanislav Lisovskiy committed Dec 7, 2021
1 parent 2060a68 commit 77ab3a1
Showing 1 changed file with 16 additions and 1 deletion.
17 changes: 16 additions & 1 deletion drivers/gpu/drm/i915/display/intel_cdclk.c
Original file line number Diff line number Diff line change
Expand Up @@ -1466,6 +1466,7 @@ static void bxt_de_pll_readout(struct drm_i915_private *dev_priv,
static void bxt_get_cdclk(struct drm_i915_private *dev_priv,
struct intel_cdclk_config *cdclk_config)
{
u32 squash_ctl = 0;
u32 divider;
int div;

Expand Down Expand Up @@ -1503,7 +1504,21 @@ static void bxt_get_cdclk(struct drm_i915_private *dev_priv,
return;
}

cdclk_config->cdclk = DIV_ROUND_CLOSEST(cdclk_config->vco, div);
if (has_cdclk_squasher(dev_priv))
squash_ctl = intel_de_read(dev_priv, CDCLK_SQUASH_CTL);

if (squash_ctl & CDCLK_SQUASH_ENABLE) {
u16 waveform;
int size;

size = REG_FIELD_GET(CDCLK_SQUASH_WINDOW_SIZE_MASK, squash_ctl) + 1;
waveform = REG_FIELD_GET(CDCLK_SQUASH_WAVEFORM_MASK, squash_ctl) >> (16 - size);

cdclk_config->cdclk = DIV_ROUND_CLOSEST(hweight16(waveform) *
cdclk_config->vco, size * div);
} else {
cdclk_config->cdclk = DIV_ROUND_CLOSEST(cdclk_config->vco, div);
}

out:
/*
Expand Down

0 comments on commit 77ab3a1

Please sign in to comment.