Re: [Intel-gfx] [PATCH v3 1/1] drm/i915: Sharing Gfx Clock, Wake and Gunit save/restore logic using common handler for runtime/system s/r paths
On Tue, 2014-08-12 at 16:21 +0530, sagar.a.kam...@intel.com wrote: From: Sagar Kamble sagar.a.kamble at intel.com The change is substantial enough that you should add a commit message explaining what it fixes and how. There are further useful guidelines on this topic in Documentation/SubmittingPatches. In the future, you would make the review (and a possible bisection) easier if you split this patch into a refactoring patch without functional change and one that fixes the issue. v1: Sequence to get gfx clocks on/off, allow/disallow wake and save/restore of gunit registers need to be followed in PM suspend and resume path similar to runtime suspend and resume. v2: 1. Keeping GT access, wake, gunit save/restore related helpers static. 2. Moved GT access check, Wake Control, Gunit state save to end of i915_drm_freeze. 3. Reusing the sequence in runtime_suspend/resume path at macro level. v3: 1. Prepared common handlers for platform specific tasks to be done before HW suspend and after HW resume from D0i3. 2. Changed commit header. Cc: Imre Deak imre.d...@intel.com Cc: Paulo Zanoni paulo.r.zan...@intel.com Cc: Daniel Vetter daniel.vet...@ffwll.ch Cc: Jani Nikula jani.nik...@linux.intel.com Cc: Goel, Akash akash.g...@intel.com Change-Id: I15cfdeeec9c976d9839bb281f809664f4a0c78a2 Signed-off-by: Sagar Kamble sagar.a.kamble at intel.com --- drivers/gpu/drm/i915/i915_drv.c | 130 ++-- 1 file changed, 85 insertions(+), 45 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index ec96f9a..4440722 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c @@ -494,6 +494,11 @@ bool i915_semaphore_is_enabled(struct drm_device *dev) return true; } + +static int pre_hw_suspend_deinit(struct drm_i915_private *dev_priv); +static int post_hw_resume_init(struct drm_i915_private *dev_priv, + bool resume_from_rpm_suspend); Nitpick: Something like intel_suspend_complete, intel_resume_prepare would be more descriptive names. + static int i915_drm_freeze(struct drm_device *dev) { struct drm_i915_private *dev_priv = dev-dev_private; @@ -614,15 +619,16 @@ void intel_console_resume(struct work_struct *work) static int i915_drm_thaw_early(struct drm_device *dev) { struct drm_i915_private *dev_priv = dev-dev_private; + int ret = 0; The initialization here is redundant and could suppress complier warnings. There are also a couple more instances below. - if (IS_HASWELL(dev) || IS_BROADWELL(dev)) - hsw_disable_pc8(dev_priv); + /* Restore any platform specific registers/clk state */ + ret = post_hw_resume_init(dev_priv, false); You could print an error message here, noting that we continue resuming despite the error. intel_uncore_early_sanitize(dev, true); intel_uncore_sanitize(dev); intel_power_domains_init_hw(dev_priv); - return 0; + return ret; } static int __i915_drm_thaw(struct drm_device *dev, bool restore_gtt_mappings) @@ -908,6 +914,7 @@ static int i915_pm_suspend_late(struct device *dev) struct pci_dev *pdev = to_pci_dev(dev); struct drm_device *drm_dev = pci_get_drvdata(pdev); struct drm_i915_private *dev_priv = drm_dev-dev_private; + int ret = 0; /* * We have a suspedn ordering issue with the snd-hda driver also @@ -921,13 +928,13 @@ static int i915_pm_suspend_late(struct device *dev) if (drm_dev-switch_power_state == DRM_SWITCH_POWER_OFF) return 0; - if (IS_HASWELL(drm_dev) || IS_BROADWELL(drm_dev)) - hsw_enable_pc8(dev_priv); + /* Save any platform specific registers/clk state needed post resume */ + ret = pre_hw_suspend_deinit(dev_priv); pci_disable_device(pdev); pci_set_power_state(pdev, PCI_D3hot); In case of error the suspend will be canceled and the resume handler will be called, so we shouldn't disable the device. - return 0; + return ret; } static int i915_pm_resume_early(struct device *dev) @@ -983,23 +990,26 @@ static int i915_pm_poweroff(struct device *dev) return i915_drm_freeze(drm_dev); } -static int hsw_runtime_suspend(struct drm_i915_private *dev_priv) +static int hsw_suspend(struct drm_i915_private *dev_priv) Based on the above nitpick something like hsw_suspend_prepare would be better. The same goes for the other platform handlers. { hsw_enable_pc8(dev_priv); return 0; } -static int snb_runtime_resume(struct drm_i915_private *dev_priv) +static int snb_resume(struct drm_i915_private *dev_priv, + bool resume_from_rpm_suspend) Nitpick: s/resume_from_rpm_suspend/rpm_resume/ would be a bit more compact. { struct drm_device *dev = dev_priv-dev; - intel_init_pch_refclk(dev); + if
Re: [Intel-gfx] [PATCH v3 1/1] drm/i915: Sharing Gfx Clock, Wake and Gunit save/restore logic using common handler for runtime/system s/r paths
On Wed, 2014-08-13 at 16:47 +0300, Imre Deak wrote: On Tue, 2014-08-12 at 16:21 +0530, sagar.a.kam...@intel.com wrote: From: Sagar Kamble sagar.a.kamble at intel.com The change is substantial enough that you should add a commit message explaining what it fixes and how. There are further useful guidelines on this topic in Documentation/SubmittingPatches. In the future, you would make the review (and a possible bisection) easier if you split this patch into a refactoring patch without functional change and one that fixes the issue. Thanks for the review Imre, Daniel. Agree that I need to split this patch and give more description for the changes. Will fix other reviewed code as well. v1: Sequence to get gfx clocks on/off, allow/disallow wake and save/restore of gunit registers need to be followed in PM suspend and resume path similar to runtime suspend and resume. v2: 1. Keeping GT access, wake, gunit save/restore related helpers static. 2. Moved GT access check, Wake Control, Gunit state save to end of i915_drm_freeze. 3. Reusing the sequence in runtime_suspend/resume path at macro level. v3: 1. Prepared common handlers for platform specific tasks to be done before HW suspend and after HW resume from D0i3. 2. Changed commit header. Cc: Imre Deak imre.d...@intel.com Cc: Paulo Zanoni paulo.r.zan...@intel.com Cc: Daniel Vetter daniel.vet...@ffwll.ch Cc: Jani Nikula jani.nik...@linux.intel.com Cc: Goel, Akash akash.g...@intel.com Change-Id: I15cfdeeec9c976d9839bb281f809664f4a0c78a2 Signed-off-by: Sagar Kamble sagar.a.kamble at intel.com --- drivers/gpu/drm/i915/i915_drv.c | 130 ++-- 1 file changed, 85 insertions(+), 45 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index ec96f9a..4440722 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c @@ -494,6 +494,11 @@ bool i915_semaphore_is_enabled(struct drm_device *dev) return true; } + +static int pre_hw_suspend_deinit(struct drm_i915_private *dev_priv); +static int post_hw_resume_init(struct drm_i915_private *dev_priv, + bool resume_from_rpm_suspend); Nitpick: Something like intel_suspend_complete, intel_resume_prepare would be more descriptive names. + static int i915_drm_freeze(struct drm_device *dev) { struct drm_i915_private *dev_priv = dev-dev_private; @@ -614,15 +619,16 @@ void intel_console_resume(struct work_struct *work) static int i915_drm_thaw_early(struct drm_device *dev) { struct drm_i915_private *dev_priv = dev-dev_private; + int ret = 0; The initialization here is redundant and could suppress complier warnings. There are also a couple more instances below. - if (IS_HASWELL(dev) || IS_BROADWELL(dev)) - hsw_disable_pc8(dev_priv); + /* Restore any platform specific registers/clk state */ + ret = post_hw_resume_init(dev_priv, false); You could print an error message here, noting that we continue resuming despite the error. intel_uncore_early_sanitize(dev, true); intel_uncore_sanitize(dev); intel_power_domains_init_hw(dev_priv); - return 0; + return ret; } static int __i915_drm_thaw(struct drm_device *dev, bool restore_gtt_mappings) @@ -908,6 +914,7 @@ static int i915_pm_suspend_late(struct device *dev) struct pci_dev *pdev = to_pci_dev(dev); struct drm_device *drm_dev = pci_get_drvdata(pdev); struct drm_i915_private *dev_priv = drm_dev-dev_private; + int ret = 0; /* * We have a suspedn ordering issue with the snd-hda driver also @@ -921,13 +928,13 @@ static int i915_pm_suspend_late(struct device *dev) if (drm_dev-switch_power_state == DRM_SWITCH_POWER_OFF) return 0; - if (IS_HASWELL(drm_dev) || IS_BROADWELL(drm_dev)) - hsw_enable_pc8(dev_priv); + /* Save any platform specific registers/clk state needed post resume */ + ret = pre_hw_suspend_deinit(dev_priv); pci_disable_device(pdev); pci_set_power_state(pdev, PCI_D3hot); In case of error the suspend will be canceled and the resume handler will be called, so we shouldn't disable the device. - return 0; + return ret; } static int i915_pm_resume_early(struct device *dev) @@ -983,23 +990,26 @@ static int i915_pm_poweroff(struct device *dev) return i915_drm_freeze(drm_dev); } -static int hsw_runtime_suspend(struct drm_i915_private *dev_priv) +static int hsw_suspend(struct drm_i915_private *dev_priv) Based on the above nitpick something like hsw_suspend_prepare would be better. The same goes for the other platform handlers. { hsw_enable_pc8(dev_priv); return 0; } -static int snb_runtime_resume(struct drm_i915_private *dev_priv) +static int snb_resume(struct
[Intel-gfx] [PATCH v3 1/1] drm/i915: Sharing Gfx Clock, Wake and Gunit save/restore logic using common handler for runtime/system s/r paths
From: Sagar Kamble sagar.a.kamble at intel.com v1: Sequence to get gfx clocks on/off, allow/disallow wake and save/restore of gunit registers need to be followed in PM suspend and resume path similar to runtime suspend and resume. v2: 1. Keeping GT access, wake, gunit save/restore related helpers static. 2. Moved GT access check, Wake Control, Gunit state save to end of i915_drm_freeze. 3. Reusing the sequence in runtime_suspend/resume path at macro level. v3: 1. Prepared common handlers for platform specific tasks to be done before HW suspend and after HW resume from D0i3. 2. Changed commit header. Cc: Imre Deak imre.d...@intel.com Cc: Paulo Zanoni paulo.r.zan...@intel.com Cc: Daniel Vetter daniel.vet...@ffwll.ch Cc: Jani Nikula jani.nik...@linux.intel.com Cc: Goel, Akash akash.g...@intel.com Change-Id: I15cfdeeec9c976d9839bb281f809664f4a0c78a2 Signed-off-by: Sagar Kamble sagar.a.kamble at intel.com --- drivers/gpu/drm/i915/i915_drv.c | 130 ++-- 1 file changed, 85 insertions(+), 45 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index ec96f9a..4440722 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c @@ -494,6 +494,11 @@ bool i915_semaphore_is_enabled(struct drm_device *dev) return true; } + +static int pre_hw_suspend_deinit(struct drm_i915_private *dev_priv); +static int post_hw_resume_init(struct drm_i915_private *dev_priv, + bool resume_from_rpm_suspend); + static int i915_drm_freeze(struct drm_device *dev) { struct drm_i915_private *dev_priv = dev-dev_private; @@ -614,15 +619,16 @@ void intel_console_resume(struct work_struct *work) static int i915_drm_thaw_early(struct drm_device *dev) { struct drm_i915_private *dev_priv = dev-dev_private; + int ret = 0; - if (IS_HASWELL(dev) || IS_BROADWELL(dev)) - hsw_disable_pc8(dev_priv); + /* Restore any platform specific registers/clk state */ + ret = post_hw_resume_init(dev_priv, false); intel_uncore_early_sanitize(dev, true); intel_uncore_sanitize(dev); intel_power_domains_init_hw(dev_priv); - return 0; + return ret; } static int __i915_drm_thaw(struct drm_device *dev, bool restore_gtt_mappings) @@ -908,6 +914,7 @@ static int i915_pm_suspend_late(struct device *dev) struct pci_dev *pdev = to_pci_dev(dev); struct drm_device *drm_dev = pci_get_drvdata(pdev); struct drm_i915_private *dev_priv = drm_dev-dev_private; + int ret = 0; /* * We have a suspedn ordering issue with the snd-hda driver also @@ -921,13 +928,13 @@ static int i915_pm_suspend_late(struct device *dev) if (drm_dev-switch_power_state == DRM_SWITCH_POWER_OFF) return 0; - if (IS_HASWELL(drm_dev) || IS_BROADWELL(drm_dev)) - hsw_enable_pc8(dev_priv); + /* Save any platform specific registers/clk state needed post resume */ + ret = pre_hw_suspend_deinit(dev_priv); pci_disable_device(pdev); pci_set_power_state(pdev, PCI_D3hot); - return 0; + return ret; } static int i915_pm_resume_early(struct device *dev) @@ -983,23 +990,26 @@ static int i915_pm_poweroff(struct device *dev) return i915_drm_freeze(drm_dev); } -static int hsw_runtime_suspend(struct drm_i915_private *dev_priv) +static int hsw_suspend(struct drm_i915_private *dev_priv) { hsw_enable_pc8(dev_priv); return 0; } -static int snb_runtime_resume(struct drm_i915_private *dev_priv) +static int snb_resume(struct drm_i915_private *dev_priv, + bool resume_from_rpm_suspend) { struct drm_device *dev = dev_priv-dev; - intel_init_pch_refclk(dev); + if (resume_from_rpm_suspend) + intel_init_pch_refclk(dev); return 0; } -static int hsw_runtime_resume(struct drm_i915_private *dev_priv) +static int hsw_resume(struct drm_i915_private *dev_priv, + bool resume_from_rpm_suspend) { hsw_disable_pc8(dev_priv); @@ -1295,10 +1305,10 @@ static void vlv_check_no_gt_access(struct drm_i915_private *dev_priv) I915_WRITE(VLV_GTLC_PW_STATUS, VLV_GTLC_ALLOWWAKEERR); } -static int vlv_runtime_suspend(struct drm_i915_private *dev_priv) +static int vlv_suspend(struct drm_i915_private *dev_priv) { u32 mask; - int err; + int ret = 0; /* * Bspec defines the following GT well on flags as debug only, so @@ -1311,20 +1321,19 @@ static int vlv_runtime_suspend(struct drm_i915_private *dev_priv) vlv_check_no_gt_access(dev_priv); - err = vlv_force_gfx_clock(dev_priv, true); - if (err) + ret = vlv_force_gfx_clock(dev_priv, true); + if (ret) goto err1; - err = vlv_allow_gt_wake(dev_priv, false); - if (err) + ret