summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Dubray <simonx.dubray@intel.com>2017-08-22 11:14:50 +0200
committerBertolin, PierreX <pierrex.bertolin@intel.com>2017-08-24 05:23:55 -0700
commitef828cf5c86a29bf0218a1a36885ce60ac90d8c3 (patch)
treeeb14e893ac8097a82aa2e925f6723471840847be
parent49de5d3ade4d826180f7a7b7fab612fc83117a9d (diff)
downloadx86-android-x86-anthracite-4.4-nougat-dr1-wear-release.tar.gz
intel_media: update qos requests instead of add/removeandroid-wear-7.1.1_r0.40android-x86-anthracite-4.4-nougat-dr1-wear-release
commit 5b127e3b introduced accesses to pm_qos requests in workqueues and hence some race conditions leading sometimes to kernel panics. To be thread-safe, initialize the request once and for all and only update its value to block or not s0i1. Change-Id: I6516c60496974fd6d98421b794f4f6fb0718b1ce Tracked-On: https://jira01.devtools.intel.com/browse/AW-6335 Signed-off-by: Simon Dubray <simonx.dubray@intel.com> Reviewed-on: https://android.intel.com/597693 Reviewed-by: jenkins_ndg <jenkins_ndg@intel.com> Reviewed-by: Korpershoek, MattijsX <mattijsx.korpershoek@intel.com> Reviewed-by: Whitfield, MichaelX <michaelx.whitfield@intel.com> Reviewed-by: Rouis, KhalifaX <khalifax.rouis@intel.com> Reviewed-by: Jacquet, CyrilX <cyrilx.jacquet@intel.com> Reviewed-by: Ledentec, AlexandreX <alexandrex.ledentec@intel.com> Reviewed-by: Zaghdoud, WalidX <walidx.zaghdoud@intel.com> Reviewed-by: Tasayco Loarte, VictorX <victorx.tasayco.loarte@intel.com>
-rwxr-xr-xdrivers/external_drivers/intel_media/display/tng/drv/ospm/gfx_rtpm.c6
-rwxr-xr-xdrivers/external_drivers/intel_media/display/tng/drv/ospm/pwr_mgmt.c17
2 files changed, 14 insertions, 9 deletions
diff --git a/drivers/external_drivers/intel_media/display/tng/drv/ospm/gfx_rtpm.c b/drivers/external_drivers/intel_media/display/tng/drv/ospm/gfx_rtpm.c
index 2a74b00655cb..fdd28341976e 100755
--- a/drivers/external_drivers/intel_media/display/tng/drv/ospm/gfx_rtpm.c
+++ b/drivers/external_drivers/intel_media/display/tng/drv/ospm/gfx_rtpm.c
@@ -45,8 +45,7 @@ int rtpm_suspend(struct device *dev)
rtpm_suspend_pci();
cancel_delayed_work(&resume_work);
- if (pm_qos_request_active(&dev_priv->s0ix_qos))
- pm_qos_remove_request(&dev_priv->s0ix_qos);
+ pm_qos_update_request(&dev_priv->s0ix_qos, PM_QOS_DEFAULT_VALUE);
return 0;
}
@@ -54,8 +53,7 @@ int rtpm_resume(struct device *dev)
{
struct drm_psb_private *dev_priv = gpDrmDevice->dev_private;
PSB_DEBUG_PM("%s\n", __func__);
- pm_qos_add_request(&dev_priv->s0ix_qos,
- PM_QOS_CPU_DMA_LATENCY, CSTATE_EXIT_LATENCY_S0i1 - 1);
+ pm_qos_update_request(&dev_priv->s0ix_qos, CSTATE_EXIT_LATENCY_S0i1 - 1);
/* No OPs of GFX/VED/VEC/VSP/DISP */
rtpm_resume_pci();
diff --git a/drivers/external_drivers/intel_media/display/tng/drv/ospm/pwr_mgmt.c b/drivers/external_drivers/intel_media/display/tng/drv/ospm/pwr_mgmt.c
index e1d3a1197545..faf18943f22f 100755
--- a/drivers/external_drivers/intel_media/display/tng/drv/ospm/pwr_mgmt.c
+++ b/drivers/external_drivers/intel_media/display/tng/drv/ospm/pwr_mgmt.c
@@ -465,7 +465,7 @@ bool power_island_get(u32 hw_island)
out_err:
if (ret && first_island)
- pm_qos_remove_request(&dev_priv->s0ix_qos);
+ pm_qos_update_request(&dev_priv->s0ix_qos, PM_QOS_DEFAULT_VALUE);
mutex_unlock(&g_ospm_data->ospm_lock);
return ret;
@@ -530,8 +530,8 @@ bool power_island_put(u32 hw_island)
/* Here, we use runtime pm framework to suit
* S3 PCI suspend/resume
*/
- pm_qos_add_request(&dev_priv->s0ix_qos,
- PM_QOS_CPU_DMA_LATENCY, CSTATE_EXIT_LATENCY_S0i1 - 1);
+ pm_qos_update_request(&dev_priv->s0ix_qos,
+ CSTATE_EXIT_LATENCY_S0i1 - 1);
pm_runtime_put_sync_suspend(&g_ospm_data->dev->pdev->dev);
wake_unlock(&dev_priv->ospm_wake_lock);
}
@@ -624,6 +624,8 @@ void ospm_power_init(struct drm_device *dev)
wake_lock_init(&dev_priv->ospm_wake_lock, WAKE_LOCK_SUSPEND,
"ospm_wake_lock");
+ pm_qos_add_request(&dev_priv->s0ix_qos,
+ PM_QOS_CPU_DMA_LATENCY, PM_QOS_DEFAULT_VALUE);
/* initilize individual islands */
for (i = 0; i < ARRAY_SIZE(island_list); i++) {
island_list[i].p_funcs = kmalloc(sizeof(struct power_ops),
@@ -664,6 +666,8 @@ out_err:
void ospm_power_uninit(void)
{
int i;
+ struct drm_psb_private *dev_priv = gpDrmDevice->dev_private;
+
PSB_DEBUG_PM("%s\n", __func__);
rtpm_uninit(gpDrmDevice);
@@ -671,6 +675,9 @@ void ospm_power_uninit(void)
/* Do we need to turn off all islands? */
power_island_put(OSPM_ALL_ISLANDS);
+ if (pm_qos_request_active(&dev_priv->s0ix_qos))
+ pm_qos_remove_request(&dev_priv->s0ix_qos);
+
for (i = 0; i < ARRAY_SIZE(island_list); i++)
kfree(island_list[i].p_funcs);
@@ -917,8 +924,8 @@ void ospm_apm_power_down_vsp(struct drm_device *dev)
if (!any_island_on()) {
PSB_DEBUG_PM("Suspending PCI\n");
- pm_qos_add_request(&dev_priv->s0ix_qos,
- PM_QOS_CPU_DMA_LATENCY, CSTATE_EXIT_LATENCY_S0i1 - 1);
+ pm_qos_update_request(&dev_priv->s0ix_qos,
+ CSTATE_EXIT_LATENCY_S0i1 - 1);
pm_runtime_put(&g_ospm_data->dev->pdev->dev);
wake_unlock(&dev_priv->ospm_wake_lock);
}