Skip to content

Commit b04002f

Browse files
committed
drm/i915: Read rawclk_freq earlier
Read the rawclk_freq during runtime info probing, prior to its first use in computing the CS timestamp frequency. Then store it in the runtime info, and include it in the debug printouts. Closes: https://gitlab.freedesktop.org/drm/intel/issues/834 Signed-off-by: Chris Wilson <[email protected]> Reviewed-by: Ville Syrjälä <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 0e744b5 commit b04002f

File tree

8 files changed

+35
-27
lines changed

8 files changed

+35
-27
lines changed

drivers/gpu/drm/i915/display/intel_cdclk.c

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2693,28 +2693,29 @@ static int g4x_hrawclk(struct drm_i915_private *dev_priv)
26932693
}
26942694

26952695
/**
2696-
* intel_update_rawclk - Determine the current RAWCLK frequency
2696+
* intel_read_rawclk - Determine the current RAWCLK frequency
26972697
* @dev_priv: i915 device
26982698
*
26992699
* Determine the current RAWCLK frequency. RAWCLK is a fixed
27002700
* frequency clock so this needs to done only once.
27012701
*/
2702-
void intel_update_rawclk(struct drm_i915_private *dev_priv)
2702+
u32 intel_read_rawclk(struct drm_i915_private *dev_priv)
27032703
{
2704+
u32 freq;
2705+
27042706
if (INTEL_PCH_TYPE(dev_priv) >= PCH_CNP)
2705-
dev_priv->rawclk_freq = cnp_rawclk(dev_priv);
2707+
freq = cnp_rawclk(dev_priv);
27062708
else if (HAS_PCH_SPLIT(dev_priv))
2707-
dev_priv->rawclk_freq = pch_rawclk(dev_priv);
2709+
freq = pch_rawclk(dev_priv);
27082710
else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
2709-
dev_priv->rawclk_freq = vlv_hrawclk(dev_priv);
2711+
freq = vlv_hrawclk(dev_priv);
27102712
else if (IS_G4X(dev_priv) || IS_PINEVIEW(dev_priv))
2711-
dev_priv->rawclk_freq = g4x_hrawclk(dev_priv);
2713+
freq = g4x_hrawclk(dev_priv);
27122714
else
27132715
/* no rawclk on other platforms, or no need to know it */
2714-
return;
2716+
return 0;
27152717

2716-
drm_dbg(&dev_priv->drm, "rawclk rate: %d kHz\n",
2717-
dev_priv->rawclk_freq);
2718+
return freq;
27182719
}
27192720

27202721
/**

drivers/gpu/drm/i915/display/intel_cdclk.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ void intel_cdclk_uninit_hw(struct drm_i915_private *i915);
6161
void intel_init_cdclk_hooks(struct drm_i915_private *dev_priv);
6262
void intel_update_max_cdclk(struct drm_i915_private *dev_priv);
6363
void intel_update_cdclk(struct drm_i915_private *dev_priv);
64-
void intel_update_rawclk(struct drm_i915_private *dev_priv);
64+
u32 intel_read_rawclk(struct drm_i915_private *dev_priv);
6565
bool intel_cdclk_needs_modeset(const struct intel_cdclk_config *a,
6666
const struct intel_cdclk_config *b);
6767
void intel_set_cdclk_pre_plane_update(struct intel_atomic_state *state);

drivers/gpu/drm/i915/display/intel_display_power.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1260,10 +1260,10 @@ static void vlv_init_display_clock_gating(struct drm_i915_private *dev_priv)
12601260
MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE);
12611261
intel_de_write(dev_priv, CBR1_VLV, 0);
12621262

1263-
WARN_ON(dev_priv->rawclk_freq == 0);
1264-
1263+
WARN_ON(RUNTIME_INFO(dev_priv)->rawclk_freq == 0);
12651264
intel_de_write(dev_priv, RAWCLK_FREQ_VLV,
1266-
DIV_ROUND_CLOSEST(dev_priv->rawclk_freq, 1000));
1265+
DIV_ROUND_CLOSEST(RUNTIME_INFO(dev_priv)->rawclk_freq,
1266+
1000));
12671267
}
12681268

12691269
static void vlv_display_power_well_init(struct drm_i915_private *dev_priv)
@@ -5236,9 +5236,6 @@ void intel_power_domains_init_hw(struct drm_i915_private *i915, bool resume)
52365236

52375237
power_domains->initializing = true;
52385238

5239-
/* Must happen before power domain init on VLV/CHV */
5240-
intel_update_rawclk(i915);
5241-
52425239
if (INTEL_GEN(i915) >= 11) {
52435240
icl_display_core_init(i915, resume);
52445241
} else if (IS_CANNONLAKE(i915)) {

drivers/gpu/drm/i915/display/intel_dp.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1213,13 +1213,14 @@ static u32 g4x_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
12131213
* The clock divider is based off the hrawclk, and would like to run at
12141214
* 2MHz. So, take the hrawclk value and divide by 2000 and use that
12151215
*/
1216-
return DIV_ROUND_CLOSEST(dev_priv->rawclk_freq, 2000);
1216+
return DIV_ROUND_CLOSEST(RUNTIME_INFO(dev_priv)->rawclk_freq, 2000);
12171217
}
12181218

12191219
static u32 ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
12201220
{
12211221
struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
12221222
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
1223+
u32 freq;
12231224

12241225
if (index)
12251226
return 0;
@@ -1230,9 +1231,10 @@ static u32 ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
12301231
* divide by 2000 and use that
12311232
*/
12321233
if (dig_port->aux_ch == AUX_CH_A)
1233-
return DIV_ROUND_CLOSEST(dev_priv->cdclk.hw.cdclk, 2000);
1234+
freq = dev_priv->cdclk.hw.cdclk;
12341235
else
1235-
return DIV_ROUND_CLOSEST(dev_priv->rawclk_freq, 2000);
1236+
freq = RUNTIME_INFO(dev_priv)->rawclk_freq;
1237+
return DIV_ROUND_CLOSEST(freq, 2000);
12361238
}
12371239

12381240
static u32 hsw_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
@@ -6883,7 +6885,7 @@ intel_dp_init_panel_power_sequencer_registers(struct intel_dp *intel_dp,
68836885
{
68846886
struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
68856887
u32 pp_on, pp_off, port_sel = 0;
6886-
int div = dev_priv->rawclk_freq / 1000;
6888+
int div = RUNTIME_INFO(dev_priv)->rawclk_freq / 1000;
68876889
struct pps_registers regs;
68886890
enum port port = dp_to_dig_port(intel_dp)->base.port;
68896891
const struct edp_power_seq *seq = &intel_dp->pps_delays;

drivers/gpu/drm/i915/display/intel_panel.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1406,7 +1406,8 @@ static u32 cnp_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
14061406
{
14071407
struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
14081408

1409-
return DIV_ROUND_CLOSEST(KHz(dev_priv->rawclk_freq), pwm_freq_hz);
1409+
return DIV_ROUND_CLOSEST(KHz(RUNTIME_INFO(dev_priv)->rawclk_freq),
1410+
pwm_freq_hz);
14101411
}
14111412

14121413
/*
@@ -1467,7 +1468,8 @@ static u32 pch_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
14671468
{
14681469
struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
14691470

1470-
return DIV_ROUND_CLOSEST(KHz(dev_priv->rawclk_freq), pwm_freq_hz * 128);
1471+
return DIV_ROUND_CLOSEST(KHz(RUNTIME_INFO(dev_priv)->rawclk_freq),
1472+
pwm_freq_hz * 128);
14711473
}
14721474

14731475
/*
@@ -1484,7 +1486,7 @@ static u32 i9xx_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
14841486
int clock;
14851487

14861488
if (IS_PINEVIEW(dev_priv))
1487-
clock = KHz(dev_priv->rawclk_freq);
1489+
clock = KHz(RUNTIME_INFO(dev_priv)->rawclk_freq);
14881490
else
14891491
clock = KHz(dev_priv->cdclk.hw.cdclk);
14901492

@@ -1502,7 +1504,7 @@ static u32 i965_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
15021504
int clock;
15031505

15041506
if (IS_G4X(dev_priv))
1505-
clock = KHz(dev_priv->rawclk_freq);
1507+
clock = KHz(RUNTIME_INFO(dev_priv)->rawclk_freq);
15061508
else
15071509
clock = KHz(dev_priv->cdclk.hw.cdclk);
15081510

@@ -1526,7 +1528,7 @@ static u32 vlv_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
15261528
clock = MHz(25);
15271529
mul = 16;
15281530
} else {
1529-
clock = KHz(dev_priv->rawclk_freq);
1531+
clock = KHz(RUNTIME_INFO(dev_priv)->rawclk_freq);
15301532
mul = 128;
15311533
}
15321534

drivers/gpu/drm/i915/i915_drv.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -992,7 +992,6 @@ struct drm_i915_private {
992992
unsigned int max_cdclk_freq;
993993

994994
unsigned int max_dotclk_freq;
995-
unsigned int rawclk_freq;
996995
unsigned int hpll_freq;
997996
unsigned int fdi_pll_freq;
998997
unsigned int czclk_freq;

drivers/gpu/drm/i915/intel_device_info.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
#include <drm/drm_print.h>
2626

27+
#include "display/intel_cdclk.h"
2728
#include "intel_device_info.h"
2829
#include "i915_drv.h"
2930

@@ -132,6 +133,7 @@ void intel_device_info_print_runtime(const struct intel_runtime_info *info,
132133
{
133134
sseu_dump(&info->sseu, p);
134135

136+
drm_printf(p, "rawclk rate: %u kHz\n", info->rawclk_freq);
135137
drm_printf(p, "CS timestamp frequency: %u kHz\n",
136138
info->cs_timestamp_frequency_khz);
137139
}
@@ -743,7 +745,7 @@ static u32 read_timestamp_frequency(struct drm_i915_private *dev_priv)
743745
* hclks." (through the “Clocking Configuration”
744746
* (“CLKCFG”) MCHBAR register)
745747
*/
746-
return dev_priv->rawclk_freq / 16;
748+
return RUNTIME_INFO(dev_priv)->rawclk_freq / 16;
747749
} else if (INTEL_GEN(dev_priv) <= 8) {
748750
/* PRMs say:
749751
*
@@ -1043,6 +1045,9 @@ void intel_device_info_runtime_init(struct drm_i915_private *dev_priv)
10431045
info->ppgtt_type = INTEL_PPGTT_NONE;
10441046
}
10451047

1048+
runtime->rawclk_freq = intel_read_rawclk(dev_priv);
1049+
drm_dbg(&dev_priv->drm, "rawclk rate: %d kHz\n", runtime->rawclk_freq);
1050+
10461051
/* Initialize command stream timestamp frequency */
10471052
runtime->cs_timestamp_frequency_khz =
10481053
read_timestamp_frequency(dev_priv);

drivers/gpu/drm/i915/intel_device_info.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,8 @@ struct intel_runtime_info {
216216
/* Slice/subslice/EU info */
217217
struct sseu_dev_info sseu;
218218

219+
u32 rawclk_freq;
220+
219221
u32 cs_timestamp_frequency_khz;
220222
u32 cs_timestamp_period_ns;
221223

0 commit comments

Comments
 (0)