| From foo@baz Mon Sep 17 12:33:31 CEST 2018 |
| From: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> |
| Date: Mon, 2 Jul 2018 12:01:53 -0700 |
| Subject: ata: libahci: Correct setting of DEVSLP register |
| |
| From: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> |
| |
| [ Upstream commit 2dbb3ec29a6c069035857a2fc4c24e80e5dfe3cc ] |
| |
| We have seen that on some platforms, SATA device never show any DEVSLP |
| residency. This prevent power gating of SATA IP, which prevent system |
| to transition to low power mode in systems with SLP_S0 aka modern |
| standby systems. The PHY logic is off only in DEVSLP not in slumber. |
| Reference: |
| https://www.intel.com/content/dam/www/public/us/en/documents/datasheets |
| /332995-skylake-i-o-platform-datasheet-volume-1.pdf |
| Section 28.7.6.1 |
| |
| Here driver is trying to do read-modify-write the devslp register. But |
| not resetting the bits for which this driver will modify values (DITO, |
| MDAT and DETO). So simply reset those bits before updating to new values. |
| |
| Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> |
| Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Reviewed-by: Hans de Goede <hdegoede@redhat.com> |
| Signed-off-by: Tejun Heo <tj@kernel.org> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/ata/libahci.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| --- a/drivers/ata/libahci.c |
| +++ b/drivers/ata/libahci.c |
| @@ -2153,6 +2153,8 @@ static void ahci_set_aggressive_devslp(s |
| deto = 20; |
| } |
| |
| + /* Make dito, mdat, deto bits to 0s */ |
| + devslp &= ~GENMASK_ULL(24, 2); |
| devslp |= ((dito << PORT_DEVSLP_DITO_OFFSET) | |
| (mdat << PORT_DEVSLP_MDAT_OFFSET) | |
| (deto << PORT_DEVSLP_DETO_OFFSET) | |