Merge tag 'arc-5.10-rc1-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupt...
[linux-2.6-microblaze.git] / drivers / gpu / drm / msm / msm_gpu.c
index 57ddc94..55d1648 100644 (file)
@@ -24,7 +24,7 @@
 static int msm_devfreq_target(struct device *dev, unsigned long *freq,
                u32 flags)
 {
-       struct msm_gpu *gpu = platform_get_drvdata(to_platform_device(dev));
+       struct msm_gpu *gpu = dev_to_gpu(dev);
        struct dev_pm_opp *opp;
 
        opp = devfreq_recommended_opp(dev, freq, flags);
@@ -32,6 +32,8 @@ static int msm_devfreq_target(struct device *dev, unsigned long *freq,
        if (IS_ERR(opp))
                return PTR_ERR(opp);
 
+       trace_msm_gpu_freq_change(dev_pm_opp_get_freq(opp));
+
        if (gpu->funcs->gpu_set_freq)
                gpu->funcs->gpu_set_freq(gpu, opp);
        else
@@ -45,7 +47,7 @@ static int msm_devfreq_target(struct device *dev, unsigned long *freq,
 static int msm_devfreq_get_dev_status(struct device *dev,
                struct devfreq_dev_status *status)
 {
-       struct msm_gpu *gpu = platform_get_drvdata(to_platform_device(dev));
+       struct msm_gpu *gpu = dev_to_gpu(dev);
        ktime_t time;
 
        if (gpu->funcs->gpu_get_freq)
@@ -64,7 +66,7 @@ static int msm_devfreq_get_dev_status(struct device *dev,
 
 static int msm_devfreq_get_cur_freq(struct device *dev, unsigned long *freq)
 {
-       struct msm_gpu *gpu = platform_get_drvdata(to_platform_device(dev));
+       struct msm_gpu *gpu = dev_to_gpu(dev);
 
        if (gpu->funcs->gpu_get_freq)
                *freq = gpu->funcs->gpu_get_freq(gpu);
@@ -200,6 +202,7 @@ int msm_gpu_pm_resume(struct msm_gpu *gpu)
        int ret;
 
        DBG("%s", gpu->name);
+       trace_msm_gpu_resume(0);
 
        ret = enable_pwrrail(gpu);
        if (ret)
@@ -225,6 +228,7 @@ int msm_gpu_pm_suspend(struct msm_gpu *gpu)
        int ret;
 
        DBG("%s", gpu->name);
+       trace_msm_gpu_suspend(0);
 
        devfreq_suspend_device(gpu->devfreq.devfreq);
 
@@ -520,7 +524,7 @@ static void recover_worker(struct work_struct *work)
                        struct msm_ringbuffer *ring = gpu->rb[i];
 
                        list_for_each_entry(submit, &ring->submits, node)
-                               gpu->funcs->submit(gpu, submit, NULL);
+                               gpu->funcs->submit(gpu, submit);
                }
        }
 
@@ -694,8 +698,8 @@ static void retire_submit(struct msm_gpu *gpu, struct msm_ringbuffer *ring,
 
        for (i = 0; i < submit->nr_bos; i++) {
                struct msm_gem_object *msm_obj = submit->bos[i].obj;
-               /* move to inactive: */
-               msm_gem_move_to_inactive(&msm_obj->base);
+
+               msm_gem_active_put(&msm_obj->base);
                msm_gem_unpin_iova(&msm_obj->base, submit->aspace);
                drm_gem_object_put_locked(&msm_obj->base);
        }
@@ -747,8 +751,7 @@ void msm_gpu_retire(struct msm_gpu *gpu)
 }
 
 /* add bo's to gpu's ring, and kick gpu: */
-void msm_gpu_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit,
-               struct msm_file_private *ctx)
+void msm_gpu_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)
 {
        struct drm_device *dev = gpu->dev;
        struct msm_drm_private *priv = dev->dev_private;
@@ -771,6 +774,7 @@ void msm_gpu_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit,
 
        for (i = 0; i < submit->nr_bos; i++) {
                struct msm_gem_object *msm_obj = submit->bos[i].obj;
+               struct drm_gem_object *drm_obj = &msm_obj->base;
                uint64_t iova;
 
                /* can't happen yet.. but when we add 2d support we'll have
@@ -783,13 +787,15 @@ void msm_gpu_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit,
                msm_gem_get_and_pin_iova(&msm_obj->base, submit->aspace, &iova);
 
                if (submit->bos[i].flags & MSM_SUBMIT_BO_WRITE)
-                       msm_gem_move_to_active(&msm_obj->base, gpu, true, submit->fence);
+                       dma_resv_add_excl_fence(drm_obj->resv, submit->fence);
                else if (submit->bos[i].flags & MSM_SUBMIT_BO_READ)
-                       msm_gem_move_to_active(&msm_obj->base, gpu, false, submit->fence);
+                       dma_resv_add_shared_fence(drm_obj->resv, submit->fence);
+
+               msm_gem_active_get(drm_obj, gpu);
        }
 
-       gpu->funcs->submit(gpu, submit, ctx);
-       priv->lastctx = ctx;
+       gpu->funcs->submit(gpu, submit);
+       priv->lastctx = submit->queue->ctx;
 
        hangcheck_timer_reset(gpu);
 }
@@ -824,6 +830,30 @@ static int get_clocks(struct platform_device *pdev, struct msm_gpu *gpu)
        return 0;
 }
 
+/* Return a new address space for a msm_drm_private instance */
+struct msm_gem_address_space *
+msm_gpu_create_private_address_space(struct msm_gpu *gpu, struct task_struct *task)
+{
+       struct msm_gem_address_space *aspace = NULL;
+       if (!gpu)
+               return NULL;
+
+       /*
+        * If the target doesn't support private address spaces then return
+        * the global one
+        */
+       if (gpu->funcs->create_private_address_space) {
+               aspace = gpu->funcs->create_private_address_space(gpu);
+               if (!IS_ERR(aspace))
+                       aspace->pid = get_pid(task_pid(task));
+       }
+
+       if (IS_ERR_OR_NULL(aspace))
+               aspace = msm_gem_address_space_get(gpu->aspace);
+
+       return aspace;
+}
+
 int msm_gpu_init(struct drm_device *drm, struct platform_device *pdev,
                struct msm_gpu *gpu, const struct msm_gpu_funcs *funcs,
                const char *name, struct msm_gpu_config *config)
@@ -892,7 +922,7 @@ int msm_gpu_init(struct drm_device *drm, struct platform_device *pdev,
                gpu->gpu_cx = NULL;
 
        gpu->pdev = pdev;
-       platform_set_drvdata(pdev, gpu);
+       platform_set_drvdata(pdev, &gpu->adreno_smmu);
 
        msm_devfreq_init(gpu);