drm/etnaviv: simplify unbind checks
authorLucas Stach <l.stach@pengutronix.de>
Fri, 5 Jul 2019 17:17:20 +0000 (19:17 +0200)
committerLucas Stach <l.stach@pengutronix.de>
Thu, 15 Aug 2019 08:54:07 +0000 (10:54 +0200)
Remember if the GPU has been sucessfully initialized. Only in that case
do we need to clean up various structures in the unbind path. If the
GPU hasn't been sucessfully initialized all the cleanups should happen
in the failure paths of the init function.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
Reviewed-by: Guido Günther <agx@sigxcpu.org>
drivers/gpu/drm/etnaviv/etnaviv_gpu.c
drivers/gpu/drm/etnaviv/etnaviv_gpu.h

index 4822549500ee783f0d2c0115a4e8a517c6d0fc21..37f7dd69864ea83db7576e0c3635cd5404784794 100644 (file)
@@ -799,17 +799,16 @@ int etnaviv_gpu_init(struct etnaviv_gpu *gpu)
        pm_runtime_mark_last_busy(gpu->dev);
        pm_runtime_put_autosuspend(gpu->dev);
 
+       gpu->initialized = true;
+
        return 0;
 
 free_buffer:
        etnaviv_cmdbuf_free(&gpu->buffer);
-       gpu->buffer.suballoc = NULL;
 destroy_suballoc:
        etnaviv_cmdbuf_suballoc_destroy(gpu->cmdbuf_suballoc);
-       gpu->cmdbuf_suballoc = NULL;
 destroy_iommu:
        etnaviv_iommu_destroy(gpu->mmu);
-       gpu->mmu = NULL;
 fail:
        pm_runtime_mark_last_busy(gpu->dev);
        pm_runtime_put_autosuspend(gpu->dev);
@@ -1521,7 +1520,7 @@ int etnaviv_gpu_wait_idle(struct etnaviv_gpu *gpu, unsigned int timeout_ms)
 
 static int etnaviv_gpu_hw_suspend(struct etnaviv_gpu *gpu)
 {
-       if (gpu->buffer.suballoc) {
+       if (gpu->initialized) {
                /* Replace the last WAIT with END */
                mutex_lock(&gpu->lock);
                etnaviv_buffer_end(gpu);
@@ -1680,17 +1679,11 @@ static void etnaviv_gpu_unbind(struct device *dev, struct device *master,
        etnaviv_gpu_hw_suspend(gpu);
 #endif
 
-       if (gpu->buffer.suballoc)
+       if (gpu->initialized) {
                etnaviv_cmdbuf_free(&gpu->buffer);
-
-       if (gpu->cmdbuf_suballoc) {
                etnaviv_cmdbuf_suballoc_destroy(gpu->cmdbuf_suballoc);
-               gpu->cmdbuf_suballoc = NULL;
-       }
-
-       if (gpu->mmu) {
                etnaviv_iommu_destroy(gpu->mmu);
-               gpu->mmu = NULL;
+               gpu->initialized = false;
        }
 
        gpu->drm = NULL;
@@ -1827,7 +1820,7 @@ static int etnaviv_gpu_rpm_resume(struct device *dev)
                return ret;
 
        /* Re-initialise the basic hardware state */
-       if (gpu->drm && gpu->buffer.suballoc) {
+       if (gpu->drm && gpu->initialized) {
                ret = etnaviv_gpu_hw_resume(gpu);
                if (ret) {
                        etnaviv_gpu_clk_disable(gpu);
index 9bcf151f706bb7d1da8d518a92d2b446134fbad9..b06c7c98d522de270716809865535a3f866fdcb0 100644 (file)
@@ -99,6 +99,7 @@ struct etnaviv_gpu {
        enum etnaviv_sec_mode sec_mode;
        struct workqueue_struct *wq;
        struct drm_gpu_scheduler sched;
+       bool initialized;
 
        /* 'ring'-buffer: */
        struct etnaviv_cmdbuf buffer;