Skip to content

Commit 9fcee2f

Browse files
committed
drm/i915: Report the failure to write to the punit
The write to the punit may fail, so propagate the error code back to its callers. Of particular interest are the RPS writes, so add appropriate user error codes and logging. v2: Add DEBUG for failed frequency changes during RPS. Signed-off-by: Chris Wilson <[email protected]> Cc: Mika Kuoppala <[email protected]> Link: http://patchwork.freedesktop.org/patch/msgid/[email protected] Reviewed-by: Mika Kuoppala <[email protected]>
1 parent 611032b commit 9fcee2f

File tree

6 files changed

+53
-26
lines changed

6 files changed

+53
-26
lines changed

drivers/gpu/drm/i915/i915_debugfs.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4278,7 +4278,8 @@ i915_max_freq_set(void *data, u64 val)
42784278

42794279
dev_priv->rps.max_freq_softlimit = val;
42804280

4281-
intel_set_rps(dev_priv, val);
4281+
if (intel_set_rps(dev_priv, val))
4282+
DRM_DEBUG_DRIVER("failed to update RPS to new softlimit\n");
42824283

42834284
mutex_unlock(&dev_priv->rps.hw_lock);
42844285

@@ -4333,7 +4334,8 @@ i915_min_freq_set(void *data, u64 val)
43334334

43344335
dev_priv->rps.min_freq_softlimit = val;
43354336

4336-
intel_set_rps(dev_priv, val);
4337+
if (intel_set_rps(dev_priv, val))
4338+
DRM_DEBUG_DRIVER("failed to update RPS to new softlimit\n");
43374339

43384340
mutex_unlock(&dev_priv->rps.hw_lock);
43394341

drivers/gpu/drm/i915/i915_drv.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3701,7 +3701,7 @@ extern void i915_redisable_vga(struct drm_i915_private *dev_priv);
37013701
extern void i915_redisable_vga_power_on(struct drm_i915_private *dev_priv);
37023702
extern bool ironlake_set_drps(struct drm_i915_private *dev_priv, u8 val);
37033703
extern void intel_init_pch_refclk(struct drm_i915_private *dev_priv);
3704-
extern void intel_set_rps(struct drm_i915_private *dev_priv, u8 val);
3704+
extern int intel_set_rps(struct drm_i915_private *dev_priv, u8 val);
37053705
extern bool intel_set_memory_cxsr(struct drm_i915_private *dev_priv,
37063706
bool enable);
37073707

@@ -3727,7 +3727,7 @@ int skl_pcode_request(struct drm_i915_private *dev_priv, u32 mbox, u32 request,
37273727

37283728
/* intel_sideband.c */
37293729
u32 vlv_punit_read(struct drm_i915_private *dev_priv, u32 addr);
3730-
void vlv_punit_write(struct drm_i915_private *dev_priv, u32 addr, u32 val);
3730+
int vlv_punit_write(struct drm_i915_private *dev_priv, u32 addr, u32 val);
37313731
u32 vlv_nc_read(struct drm_i915_private *dev_priv, u8 addr);
37323732
u32 vlv_iosf_sb_read(struct drm_i915_private *dev_priv, u8 port, u32 reg);
37333733
void vlv_iosf_sb_write(struct drm_i915_private *dev_priv, u8 port, u32 reg, u32 val);

drivers/gpu/drm/i915/i915_irq.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1209,7 +1209,10 @@ static void gen6_pm_rps_work(struct work_struct *work)
12091209
new_delay += adj;
12101210
new_delay = clamp_t(int, new_delay, min, max);
12111211

1212-
intel_set_rps(dev_priv, new_delay);
1212+
if (intel_set_rps(dev_priv, new_delay)) {
1213+
DRM_DEBUG_DRIVER("Failed to set new GPU frequency\n");
1214+
dev_priv->rps.last_adj = 0;
1215+
}
12131216

12141217
mutex_unlock(&dev_priv->rps.hw_lock);
12151218
}

drivers/gpu/drm/i915/i915_sysfs.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -395,13 +395,13 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev,
395395
/* We still need *_set_rps to process the new max_delay and
396396
* update the interrupt limits and PMINTRMSK even though
397397
* frequency request may be unchanged. */
398-
intel_set_rps(dev_priv, val);
398+
ret = intel_set_rps(dev_priv, val);
399399

400400
mutex_unlock(&dev_priv->rps.hw_lock);
401401

402402
intel_runtime_pm_put(dev_priv);
403403

404-
return count;
404+
return ret ?: count;
405405
}
406406

407407
static ssize_t gt_min_freq_mhz_show(struct device *kdev, struct device_attribute *attr, char *buf)
@@ -448,14 +448,13 @@ static ssize_t gt_min_freq_mhz_store(struct device *kdev,
448448
/* We still need *_set_rps to process the new min_delay and
449449
* update the interrupt limits and PMINTRMSK even though
450450
* frequency request may be unchanged. */
451-
intel_set_rps(dev_priv, val);
451+
ret = intel_set_rps(dev_priv, val);
452452

453453
mutex_unlock(&dev_priv->rps.hw_lock);
454454

455455
intel_runtime_pm_put(dev_priv);
456456

457-
return count;
458-
457+
return ret ?: count;
459458
}
460459

461460
static DEVICE_ATTR(gt_act_freq_mhz, S_IRUGO, gt_act_freq_mhz_show, NULL);

drivers/gpu/drm/i915/intel_pm.c

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4933,7 +4933,7 @@ static u32 gen6_rps_pm_mask(struct drm_i915_private *dev_priv, u8 val)
49334933
/* gen6_set_rps is called to update the frequency request, but should also be
49344934
* called when the range (min_delay and max_delay) is modified so that we can
49354935
* update the GEN6_RP_INTERRUPT_LIMITS register accordingly. */
4936-
static void gen6_set_rps(struct drm_i915_private *dev_priv, u8 val)
4936+
static int gen6_set_rps(struct drm_i915_private *dev_priv, u8 val)
49374937
{
49384938
WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
49394939
WARN_ON(val > dev_priv->rps.max_freq);
@@ -4968,10 +4968,14 @@ static void gen6_set_rps(struct drm_i915_private *dev_priv, u8 val)
49684968

49694969
dev_priv->rps.cur_freq = val;
49704970
trace_intel_gpu_freq_change(intel_gpu_freq(dev_priv, val));
4971+
4972+
return 0;
49714973
}
49724974

4973-
static void valleyview_set_rps(struct drm_i915_private *dev_priv, u8 val)
4975+
static int valleyview_set_rps(struct drm_i915_private *dev_priv, u8 val)
49744976
{
4977+
int err;
4978+
49754979
WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
49764980
WARN_ON(val > dev_priv->rps.max_freq);
49774981
WARN_ON(val < dev_priv->rps.min_freq);
@@ -4983,13 +4987,18 @@ static void valleyview_set_rps(struct drm_i915_private *dev_priv, u8 val)
49834987
I915_WRITE(GEN6_PMINTRMSK, gen6_rps_pm_mask(dev_priv, val));
49844988

49854989
if (val != dev_priv->rps.cur_freq) {
4986-
vlv_punit_write(dev_priv, PUNIT_REG_GPU_FREQ_REQ, val);
4990+
err = vlv_punit_write(dev_priv, PUNIT_REG_GPU_FREQ_REQ, val);
4991+
if (err)
4992+
return err;
4993+
49874994
if (!IS_CHERRYVIEW(dev_priv))
49884995
gen6_set_rps_thresholds(dev_priv, val);
49894996
}
49904997

49914998
dev_priv->rps.cur_freq = val;
49924999
trace_intel_gpu_freq_change(intel_gpu_freq(dev_priv, val));
5000+
5001+
return 0;
49935002
}
49945003

49955004
/* vlv_set_rps_idle: Set the frequency to idle, if Gfx clocks are down
@@ -5002,6 +5011,7 @@ static void valleyview_set_rps(struct drm_i915_private *dev_priv, u8 val)
50025011
static void vlv_set_rps_idle(struct drm_i915_private *dev_priv)
50035012
{
50045013
u32 val = dev_priv->rps.idle_freq;
5014+
int err;
50055015

50065016
if (dev_priv->rps.cur_freq <= val)
50075017
return;
@@ -5019,8 +5029,11 @@ static void vlv_set_rps_idle(struct drm_i915_private *dev_priv)
50195029
* power than the render powerwell.
50205030
*/
50215031
intel_uncore_forcewake_get(dev_priv, FORCEWAKE_MEDIA);
5022-
valleyview_set_rps(dev_priv, val);
5032+
err = valleyview_set_rps(dev_priv, val);
50235033
intel_uncore_forcewake_put(dev_priv, FORCEWAKE_MEDIA);
5034+
5035+
if (err)
5036+
DRM_ERROR("Failed to set RPS for idle\n");
50245037
}
50255038

50265039
void gen6_rps_busy(struct drm_i915_private *dev_priv)
@@ -5035,10 +5048,11 @@ void gen6_rps_busy(struct drm_i915_private *dev_priv)
50355048
gen6_enable_rps_interrupts(dev_priv);
50365049

50375050
/* Ensure we start at the user's desired frequency */
5038-
intel_set_rps(dev_priv,
5039-
clamp(dev_priv->rps.cur_freq,
5040-
dev_priv->rps.min_freq_softlimit,
5041-
dev_priv->rps.max_freq_softlimit));
5051+
if (intel_set_rps(dev_priv,
5052+
clamp(dev_priv->rps.cur_freq,
5053+
dev_priv->rps.min_freq_softlimit,
5054+
dev_priv->rps.max_freq_softlimit)))
5055+
DRM_DEBUG_DRIVER("Failed to set idle frequency\n");
50425056
}
50435057
mutex_unlock(&dev_priv->rps.hw_lock);
50445058
}
@@ -5106,12 +5120,16 @@ void gen6_rps_boost(struct drm_i915_private *dev_priv,
51065120
spin_unlock(&dev_priv->rps.client_lock);
51075121
}
51085122

5109-
void intel_set_rps(struct drm_i915_private *dev_priv, u8 val)
5123+
int intel_set_rps(struct drm_i915_private *dev_priv, u8 val)
51105124
{
5125+
int err;
5126+
51115127
if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
5112-
valleyview_set_rps(dev_priv, val);
5128+
err = valleyview_set_rps(dev_priv, val);
51135129
else
5114-
gen6_set_rps(dev_priv, val);
5130+
err = gen6_set_rps(dev_priv, val);
5131+
5132+
return err;
51155133
}
51165134

51175135
static void gen9_disable_rc6(struct drm_i915_private *dev_priv)
@@ -5315,15 +5333,16 @@ static void gen6_init_rps_frequencies(struct drm_i915_private *dev_priv)
53155333
}
53165334

53175335
static void reset_rps(struct drm_i915_private *dev_priv,
5318-
void (*set)(struct drm_i915_private *, u8))
5336+
int (*set)(struct drm_i915_private *, u8))
53195337
{
53205338
u8 freq = dev_priv->rps.cur_freq;
53215339

53225340
/* force a reset */
53235341
dev_priv->rps.power = -1;
53245342
dev_priv->rps.cur_freq = -1;
53255343

5326-
set(dev_priv, freq);
5344+
if (set(dev_priv, freq))
5345+
DRM_ERROR("Failed to reset RPS to initial values\n");
53275346
}
53285347

53295348
/* See the Gen9_GT_PM_Programming_Guide doc for the below */

drivers/gpu/drm/i915/intel_sideband.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,14 +93,18 @@ u32 vlv_punit_read(struct drm_i915_private *dev_priv, u32 addr)
9393
return val;
9494
}
9595

96-
void vlv_punit_write(struct drm_i915_private *dev_priv, u32 addr, u32 val)
96+
int vlv_punit_write(struct drm_i915_private *dev_priv, u32 addr, u32 val)
9797
{
98+
int err;
99+
98100
WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
99101

100102
mutex_lock(&dev_priv->sb_lock);
101-
vlv_sideband_rw(dev_priv, PCI_DEVFN(0, 0), IOSF_PORT_PUNIT,
102-
SB_CRWRDA_NP, addr, &val);
103+
err = vlv_sideband_rw(dev_priv, PCI_DEVFN(0, 0), IOSF_PORT_PUNIT,
104+
SB_CRWRDA_NP, addr, &val);
103105
mutex_unlock(&dev_priv->sb_lock);
106+
107+
return err;
104108
}
105109

106110
u32 vlv_bunit_read(struct drm_i915_private *dev_priv, u32 reg)

0 commit comments

Comments
 (0)