From dbfff92937663ab71c12988f80340093b706b12b Mon Sep 17 00:00:00 2001 From: Harshdeep Dhatt Date: Sat, 8 Aug 2020 13:58:35 -0600 Subject: [PATCH] msm: kgsl: Turn off gpu interrupts during stall-on-fault Disable gpu interrupt inline instead of changing power states as gmu based targets do not implement the power state machine. Make sure we skip turning off the gpu interrupt during reset after stall on fault. Change-Id: I49c1702005f88eab523f00b25923c9c65193c7ca Signed-off-by: Harshdeep Dhatt --- drivers/gpu/msm/adreno_a6xx_gmu.c | 10 +++------- drivers/gpu/msm/kgsl_iommu.c | 7 ++++++- drivers/gpu/msm/kgsl_pwrctrl.c | 2 +- drivers/gpu/msm/kgsl_pwrctrl.h | 8 ++++++++ 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/msm/adreno_a6xx_gmu.c b/drivers/gpu/msm/adreno_a6xx_gmu.c index e7b2f5124748..ebe85967ec35 100644 --- a/drivers/gpu/msm/adreno_a6xx_gmu.c +++ b/drivers/gpu/msm/adreno_a6xx_gmu.c @@ -2821,25 +2821,21 @@ error: void a6xx_enable_gpu_irq(struct adreno_device *adreno_dev) { struct kgsl_device *device = KGSL_DEVICE(adreno_dev); - struct kgsl_pwrctrl *pwr = &device->pwrctrl; + + kgsl_pwrctrl_irq(device, KGSL_PWRFLAGS_ON); adreno_irqctrl(adreno_dev, 1); - enable_irq(pwr->interrupt_num); - - trace_kgsl_irq(device, 1); } void a6xx_disable_gpu_irq(struct adreno_device *adreno_dev) { struct kgsl_device *device = KGSL_DEVICE(adreno_dev); - struct kgsl_pwrctrl *pwr = &device->pwrctrl; - disable_irq(pwr->interrupt_num); + kgsl_pwrctrl_irq(device, KGSL_PWRFLAGS_OFF); if (a6xx_gmu_gx_is_on(device)) adreno_irqctrl(adreno_dev, 0); - trace_kgsl_irq(device, 0); } static int a6xx_gpu_boot(struct adreno_device *adreno_dev) diff --git a/drivers/gpu/msm/kgsl_iommu.c b/drivers/gpu/msm/kgsl_iommu.c index aa12bafebc0a..71619ddcfd6b 100644 --- a/drivers/gpu/msm/kgsl_iommu.c +++ b/drivers/gpu/msm/kgsl_iommu.c @@ -649,7 +649,12 @@ static int kgsl_iommu_fault_handler(struct iommu_domain *domain, * The device mutex must be held to change power state */ mutex_lock(&device->mutex); - kgsl_pwrctrl_change_state(device, KGSL_STATE_AWARE); + + if (gmu_core_isenabled(device)) + kgsl_pwrctrl_irq(device, KGSL_PWRFLAGS_OFF); + else + kgsl_pwrctrl_change_state(device, KGSL_STATE_AWARE); + mutex_unlock(&device->mutex); } diff --git a/drivers/gpu/msm/kgsl_pwrctrl.c b/drivers/gpu/msm/kgsl_pwrctrl.c index 504cde5aea09..e07c165a3fb1 100644 --- a/drivers/gpu/msm/kgsl_pwrctrl.c +++ b/drivers/gpu/msm/kgsl_pwrctrl.c @@ -1330,7 +1330,7 @@ static int kgsl_pwrctrl_pwrrail(struct kgsl_device *device, int state) return status; } -static void kgsl_pwrctrl_irq(struct kgsl_device *device, int state) +void kgsl_pwrctrl_irq(struct kgsl_device *device, int state) { struct kgsl_pwrctrl *pwr = &device->pwrctrl; diff --git a/drivers/gpu/msm/kgsl_pwrctrl.h b/drivers/gpu/msm/kgsl_pwrctrl.h index 483ab3464576..eeae3cec3568 100644 --- a/drivers/gpu/msm/kgsl_pwrctrl.h +++ b/drivers/gpu/msm/kgsl_pwrctrl.h @@ -228,4 +228,12 @@ int kgsl_pwrctrl_axi(struct kgsl_device *device, int state); * off state if the active_cnt is 0 and the hardware is idle. */ void kgsl_idle_check(struct work_struct *work); + +/** + * kgsl_pwrctrl_irq - Enable or disable gpu interrupts + * @device: Handle to the kgsl device + * @state: Variable to decide whether interrupts need to be enabled or disabled + * + */ +void kgsl_pwrctrl_irq(struct kgsl_device *device, int state); #endif /* __KGSL_PWRCTRL_H */