Skip to content

Commit 0ab9cfe

Browse files
ideakdanvet
authored andcommitted
drm/i915: propagate the error code from runtime PM callbacks
Atm, none of the RPM callbacks can fail, but the next patch adding RPM support for VLV changes this, so prepare for it. In case one of these callbacks return error RPM will get permanently disabled until the error is explicitly cleared. In the future we could add support for re-enabling it, for example after resetting the HW, but for now - hopefully - we can live with the simpler solution. v2: - propagate the error from the resume callbacks too (Paulo) v3: - fix rebase fail typo around IS_GEN6() check in intel_runtime_suspend() Signed-off-by: Imre Deak <imre.deak@intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
1 parent 9e72b46 commit 0ab9cfe

File tree

1 file changed

+42
-15
lines changed

1 file changed

+42
-15
lines changed

drivers/gpu/drm/i915/i915_drv.c

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -916,21 +916,27 @@ static int i915_pm_poweroff(struct device *dev)
916916
return i915_drm_freeze(drm_dev);
917917
}
918918

919-
static void hsw_runtime_suspend(struct drm_i915_private *dev_priv)
919+
static int hsw_runtime_suspend(struct drm_i915_private *dev_priv)
920920
{
921921
hsw_enable_pc8(dev_priv);
922+
923+
return 0;
922924
}
923925

924-
static void snb_runtime_resume(struct drm_i915_private *dev_priv)
926+
static int snb_runtime_resume(struct drm_i915_private *dev_priv)
925927
{
926928
struct drm_device *dev = dev_priv->dev;
927929

928930
intel_init_pch_refclk(dev);
931+
932+
return 0;
929933
}
930934

931-
static void hsw_runtime_resume(struct drm_i915_private *dev_priv)
935+
static int hsw_runtime_resume(struct drm_i915_private *dev_priv)
932936
{
933937
hsw_disable_pc8(dev_priv);
938+
939+
return 0;
934940
}
935941

936942
int vlv_force_gfx_clock(struct drm_i915_private *dev_priv, bool force_on)
@@ -975,6 +981,7 @@ static int intel_runtime_suspend(struct device *device)
975981
struct pci_dev *pdev = to_pci_dev(device);
976982
struct drm_device *dev = pci_get_drvdata(pdev);
977983
struct drm_i915_private *dev_priv = dev->dev_private;
984+
int ret;
978985

979986
if (WARN_ON_ONCE(!(dev_priv->rps.enabled && intel_enable_rc6(dev))))
980987
return -ENODEV;
@@ -992,12 +999,21 @@ static int intel_runtime_suspend(struct device *device)
992999
cancel_work_sync(&dev_priv->rps.work);
9931000
intel_runtime_pm_disable_interrupts(dev);
9941001

995-
if (IS_GEN6(dev))
996-
;
997-
else if (IS_HASWELL(dev) || IS_BROADWELL(dev))
998-
hsw_runtime_suspend(dev_priv);
999-
else
1002+
if (IS_GEN6(dev)) {
1003+
ret = 0;
1004+
} else if (IS_HASWELL(dev) || IS_BROADWELL(dev)) {
1005+
ret = hsw_runtime_suspend(dev_priv);
1006+
} else {
1007+
ret = -ENODEV;
10001008
WARN_ON(1);
1009+
}
1010+
1011+
if (ret) {
1012+
DRM_ERROR("Runtime suspend failed, disabling it (%d)\n", ret);
1013+
intel_runtime_pm_restore_interrupts(dev);
1014+
1015+
return ret;
1016+
}
10011017

10021018
i915_gem_release_all_mmaps(dev_priv);
10031019

@@ -1022,6 +1038,7 @@ static int intel_runtime_resume(struct device *device)
10221038
struct pci_dev *pdev = to_pci_dev(device);
10231039
struct drm_device *dev = pci_get_drvdata(pdev);
10241040
struct drm_i915_private *dev_priv = dev->dev_private;
1041+
int ret;
10251042

10261043
WARN_ON(!HAS_RUNTIME_PM(dev));
10271044

@@ -1030,21 +1047,31 @@ static int intel_runtime_resume(struct device *device)
10301047
intel_opregion_notify_adapter(dev, PCI_D0);
10311048
dev_priv->pm.suspended = false;
10321049

1033-
if (IS_GEN6(dev))
1034-
snb_runtime_resume(dev_priv);
1035-
else if (IS_HASWELL(dev) || IS_BROADWELL(dev))
1036-
hsw_runtime_resume(dev_priv);
1037-
else
1050+
if (IS_GEN6(dev)) {
1051+
ret = snb_runtime_resume(dev_priv);
1052+
} else if (IS_HASWELL(dev) || IS_BROADWELL(dev)) {
1053+
ret = hsw_runtime_resume(dev_priv);
1054+
} else {
10381055
WARN_ON(1);
1056+
ret = -ENODEV;
1057+
}
10391058

1059+
/*
1060+
* No point of rolling back things in case of an error, as the best
1061+
* we can do is to hope that things will still work (and disable RPM).
1062+
*/
10401063
i915_gem_init_swizzling(dev);
10411064
gen6_update_ring_freq(dev);
10421065

10431066
intel_runtime_pm_restore_interrupts(dev);
10441067
intel_reset_gt_powersave(dev);
10451068

1046-
DRM_DEBUG_KMS("Device resumed\n");
1047-
return 0;
1069+
if (ret)
1070+
DRM_ERROR("Runtime resume failed, disabling it (%d)\n", ret);
1071+
else
1072+
DRM_DEBUG_KMS("Device resumed\n");
1073+
1074+
return ret;
10481075
}
10491076

10501077
static const struct dev_pm_ops i915_pm_ops = {

0 commit comments

Comments
 (0)