From ef828cf5c86a29bf0218a1a36885ce60ac90d8c3 Mon Sep 17 00:00:00 2001 From: Simon Dubray Date: Tue, 22 Aug 2017 11:14:50 +0200 Subject: intel_media: update qos requests instead of add/remove 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 Reviewed-on: https://android.intel.com/597693 Reviewed-by: jenkins_ndg Reviewed-by: Korpershoek, MattijsX Reviewed-by: Whitfield, MichaelX Reviewed-by: Rouis, KhalifaX Reviewed-by: Jacquet, CyrilX Reviewed-by: Ledentec, AlexandreX Reviewed-by: Zaghdoud, WalidX Reviewed-by: Tasayco Loarte, VictorX --- .../intel_media/display/tng/drv/ospm/gfx_rtpm.c | 6 ++---- .../intel_media/display/tng/drv/ospm/pwr_mgmt.c | 17 ++++++++++++----- 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); } -- cgit v1.2.3