gpu: host1x: Remove wait check support
authorThierry Reding <treding@nvidia.com>
Sat, 5 May 2018 06:45:47 +0000 (08:45 +0200)
committerThierry Reding <treding@nvidia.com>
Fri, 18 May 2018 19:50:04 +0000 (21:50 +0200)
The job submission userspace ABI doesn't support this and there are no
plans to implement it, so all of this code is dead and can be removed.

Reviewed-by: Dmitry Osipenko <digetx@gmail.com>
Tested-by: Dmitry Osipenko <digetx@gmail.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>
drivers/gpu/drm/tegra/drm.c
drivers/gpu/host1x/dev.h
drivers/gpu/host1x/hw/channel_hw.c
drivers/gpu/host1x/hw/syncpt_hw.c
drivers/gpu/host1x/job.c
drivers/gpu/host1x/syncpt.c
drivers/gpu/host1x/syncpt.h
include/linux/host1x.h
include/trace/events/host1x.h

index 3cdef659cd39a0cd6e7e72b5cce9dc4aef63f396..204b10e33f16e745bd0c246b52f60c9ab489989b 100644 (file)
@@ -321,46 +321,14 @@ static int host1x_reloc_copy_from_user(struct host1x_reloc *dest,
        return 0;
 }
 
-static int host1x_waitchk_copy_from_user(struct host1x_waitchk *dest,
-                                        struct drm_tegra_waitchk __user *src,
-                                        struct drm_file *file)
-{
-       u32 cmdbuf;
-       int err;
-
-       err = get_user(cmdbuf, &src->handle);
-       if (err < 0)
-               return err;
-
-       err = get_user(dest->offset, &src->offset);
-       if (err < 0)
-               return err;
-
-       err = get_user(dest->syncpt_id, &src->syncpt);
-       if (err < 0)
-               return err;
-
-       err = get_user(dest->thresh, &src->thresh);
-       if (err < 0)
-               return err;
-
-       dest->bo = host1x_bo_lookup(file, cmdbuf);
-       if (!dest->bo)
-               return -ENOENT;
-
-       return 0;
-}
-
 int tegra_drm_submit(struct tegra_drm_context *context,
                     struct drm_tegra_submit *args, struct drm_device *drm,
                     struct drm_file *file)
 {
        unsigned int num_cmdbufs = args->num_cmdbufs;
        unsigned int num_relocs = args->num_relocs;
-       unsigned int num_waitchks = args->num_waitchks;
        struct drm_tegra_cmdbuf __user *user_cmdbufs;
        struct drm_tegra_reloc __user *user_relocs;
-       struct drm_tegra_waitchk __user *user_waitchks;
        struct drm_tegra_syncpt __user *user_syncpt;
        struct drm_tegra_syncpt syncpt;
        struct host1x *host1x = dev_get_drvdata(drm->dev->parent);
@@ -372,7 +340,6 @@ int tegra_drm_submit(struct tegra_drm_context *context,
 
        user_cmdbufs = u64_to_user_ptr(args->cmdbufs);
        user_relocs = u64_to_user_ptr(args->relocs);
-       user_waitchks = u64_to_user_ptr(args->waitchks);
        user_syncpt = u64_to_user_ptr(args->syncpts);
 
        /* We don't yet support other than one syncpt_incr struct per submit */
@@ -384,12 +351,11 @@ int tegra_drm_submit(struct tegra_drm_context *context,
                return -EINVAL;
 
        job = host1x_job_alloc(context->channel, args->num_cmdbufs,
-                              args->num_relocs, args->num_waitchks);
+                              args->num_relocs);
        if (!job)
                return -ENOMEM;
 
        job->num_relocs = args->num_relocs;
-       job->num_waitchk = args->num_waitchks;
        job->client = (u32)args->context;
        job->class = context->client->base.class;
        job->serialize = true;
@@ -398,7 +364,7 @@ int tegra_drm_submit(struct tegra_drm_context *context,
         * Track referenced BOs so that they can be unreferenced after the
         * submission is complete.
         */
-       num_refs = num_cmdbufs + num_relocs * 2 + num_waitchks;
+       num_refs = num_cmdbufs + num_relocs * 2;
 
        refs = kmalloc_array(num_refs, sizeof(*refs), GFP_KERNEL);
        if (!refs) {
@@ -489,30 +455,6 @@ int tegra_drm_submit(struct tegra_drm_context *context,
                }
        }
 
-       /* copy and resolve waitchks from submit */
-       while (num_waitchks--) {
-               struct host1x_waitchk *wait = &job->waitchk[num_waitchks];
-               struct tegra_bo *obj;
-
-               err = host1x_waitchk_copy_from_user(
-                       wait, &user_waitchks[num_waitchks], file);
-               if (err < 0)
-                       goto fail;
-
-               obj = host1x_to_tegra_bo(wait->bo);
-               refs[num_refs++] = &obj->gem;
-
-               /*
-                * The unaligned offset will cause an unaligned write during
-                * of the waitchks patching, corrupting the commands stream.
-                */
-               if (wait->offset & 3 ||
-                   wait->offset >= obj->gem.size) {
-                       err = -EINVAL;
-                       goto fail;
-               }
-       }
-
        if (copy_from_user(&syncpt, user_syncpt, sizeof(syncpt))) {
                err = -EFAULT;
                goto fail;
index 43e9fabb43a1f5bdf2f3e7e5ca37451934aba70d..36f44ffebe739a98d8195f611bdafa2b07318676 100644 (file)
@@ -78,7 +78,6 @@ struct host1x_syncpt_ops {
        void (*load_wait_base)(struct host1x_syncpt *syncpt);
        u32 (*load)(struct host1x_syncpt *syncpt);
        int (*cpu_incr)(struct host1x_syncpt *syncpt);
-       int (*patch_wait)(struct host1x_syncpt *syncpt, void *patch_addr);
        void (*assign_to_channel)(struct host1x_syncpt *syncpt,
                                  struct host1x_channel *channel);
        void (*enable_protection)(struct host1x *host);
@@ -183,13 +182,6 @@ static inline int host1x_hw_syncpt_cpu_incr(struct host1x *host,
        return host->syncpt_op->cpu_incr(sp);
 }
 
-static inline int host1x_hw_syncpt_patch_wait(struct host1x *host,
-                                             struct host1x_syncpt *sp,
-                                             void *patch_addr)
-{
-       return host->syncpt_op->patch_wait(sp, patch_addr);
-}
-
 static inline void host1x_hw_syncpt_assign_to_channel(
        struct host1x *host, struct host1x_syncpt *sp,
        struct host1x_channel *ch)
index 9af758785a112733d122e7096a08d3733b5c8942..4c9555038a9599dc1e321e264d6b529c1ce53b63 100644 (file)
@@ -104,8 +104,7 @@ static int channel_submit(struct host1x_job *job)
        sp = host->syncpt + job->syncpt_id;
        trace_host1x_channel_submit(dev_name(ch->dev),
                                    job->num_gathers, job->num_relocs,
-                                   job->num_waitchk, job->syncpt_id,
-                                   job->syncpt_incrs);
+                                   job->syncpt_id, job->syncpt_incrs);
 
        /* before error checks, return current max */
        prev_max = job->syncpt_end = host1x_syncpt_read_max(sp);
index 7dfd47d74f89ff94954c33b02b80765c0512cbc0..a23bb3352d029303a4c3a750532a5e3a73053c0a 100644 (file)
@@ -96,16 +96,6 @@ static int syncpt_cpu_incr(struct host1x_syncpt *sp)
        return 0;
 }
 
-/* remove a wait pointed to by patch_addr */
-static int syncpt_patch_wait(struct host1x_syncpt *sp, void *patch_addr)
-{
-       u32 override = host1x_class_host_wait_syncpt(HOST1X_SYNCPT_RESERVED, 0);
-
-       *((u32 *)patch_addr) = override;
-
-       return 0;
-}
-
 /**
  * syncpt_assign_to_channel() - Assign syncpoint to channel
  * @sp: syncpoint
@@ -156,7 +146,6 @@ static const struct host1x_syncpt_ops host1x_syncpt_ops = {
        .load_wait_base = syncpt_read_wait_base,
        .load = syncpt_load,
        .cpu_incr = syncpt_cpu_incr,
-       .patch_wait = syncpt_patch_wait,
        .assign_to_channel = syncpt_assign_to_channel,
        .enable_protection = syncpt_enable_protection,
 };
index db509ab8874e58fd1f798da270fa8035ed4563d3..3cbfc6e37668372c76f86ce31be0b9836a566006 100644 (file)
@@ -34,8 +34,7 @@
 #define HOST1X_WAIT_SYNCPT_OFFSET 0x8
 
 struct host1x_job *host1x_job_alloc(struct host1x_channel *ch,
-                                   u32 num_cmdbufs, u32 num_relocs,
-                                   u32 num_waitchks)
+                                   u32 num_cmdbufs, u32 num_relocs)
 {
        struct host1x_job *job = NULL;
        unsigned int num_unpins = num_cmdbufs + num_relocs;
@@ -46,7 +45,6 @@ struct host1x_job *host1x_job_alloc(struct host1x_channel *ch,
        total = sizeof(struct host1x_job) +
                (u64)num_relocs * sizeof(struct host1x_reloc) +
                (u64)num_unpins * sizeof(struct host1x_job_unpin_data) +
-               (u64)num_waitchks * sizeof(struct host1x_waitchk) +
                (u64)num_cmdbufs * sizeof(struct host1x_job_gather) +
                (u64)num_unpins * sizeof(dma_addr_t) +
                (u64)num_unpins * sizeof(u32 *);
@@ -66,8 +64,6 @@ struct host1x_job *host1x_job_alloc(struct host1x_channel *ch,
        mem += num_relocs * sizeof(struct host1x_reloc);
        job->unpins = num_unpins ? mem : NULL;
        mem += num_unpins * sizeof(struct host1x_job_unpin_data);
-       job->waitchk = num_waitchks ? mem : NULL;
-       mem += num_waitchks * sizeof(struct host1x_waitchk);
        job->gathers = num_cmdbufs ? mem : NULL;
        mem += num_cmdbufs * sizeof(struct host1x_job_gather);
        job->addr_phys = num_unpins ? mem : NULL;
@@ -111,73 +107,6 @@ void host1x_job_add_gather(struct host1x_job *job, struct host1x_bo *bo,
 }
 EXPORT_SYMBOL(host1x_job_add_gather);
 
-/*
- * NULL an already satisfied WAIT_SYNCPT host method, by patching its
- * args in the command stream. The method data is changed to reference
- * a reserved (never given out or incr) HOST1X_SYNCPT_RESERVED syncpt
- * with a matching threshold value of 0, so is guaranteed to be popped
- * by the host HW.
- */
-static void host1x_syncpt_patch_offset(struct host1x_syncpt *sp,
-                                      struct host1x_bo *h, u32 offset)
-{
-       void *patch_addr = NULL;
-
-       /* patch the wait */
-       patch_addr = host1x_bo_kmap(h, offset >> PAGE_SHIFT);
-       if (patch_addr) {
-               host1x_syncpt_patch_wait(sp,
-                                        patch_addr + (offset & ~PAGE_MASK));
-               host1x_bo_kunmap(h, offset >> PAGE_SHIFT, patch_addr);
-       } else
-               pr_err("Could not map cmdbuf for wait check\n");
-}
-
-/*
- * Check driver supplied waitchk structs for syncpt thresholds
- * that have already been satisfied and NULL the comparison (to
- * avoid a wrap condition in the HW).
- */
-static int do_waitchks(struct host1x_job *job, struct host1x *host,
-                      struct host1x_job_gather *g)
-{
-       struct host1x_bo *patch = g->bo;
-       int i;
-
-       /* compare syncpt vs wait threshold */
-       for (i = 0; i < job->num_waitchk; i++) {
-               struct host1x_waitchk *wait = &job->waitchk[i];
-               struct host1x_syncpt *sp =
-                       host1x_syncpt_get(host, wait->syncpt_id);
-
-               /* validate syncpt id */
-               if (wait->syncpt_id > host1x_syncpt_nb_pts(host))
-                       continue;
-
-               /* skip all other gathers */
-               if (patch != wait->bo)
-                       continue;
-
-               trace_host1x_syncpt_wait_check(wait->bo, wait->offset,
-                                              wait->syncpt_id, wait->thresh,
-                                              host1x_syncpt_read_min(sp));
-
-               if (host1x_syncpt_is_expired(sp, wait->thresh)) {
-                       dev_dbg(host->dev,
-                               "drop WAIT id %u (%s) thresh 0x%x, min 0x%x\n",
-                               wait->syncpt_id, sp->name, wait->thresh,
-                               host1x_syncpt_read_min(sp));
-
-                       host1x_syncpt_patch_offset(sp, patch,
-                                                  g->offset + wait->offset);
-               }
-
-               wait->bo = NULL;
-       }
-
-       return 0;
-}
-
 static unsigned int pin_job(struct host1x *host, struct host1x_job *job)
 {
        unsigned int i;
@@ -331,17 +260,6 @@ static bool check_reloc(struct host1x_reloc *reloc, struct host1x_bo *cmdbuf,
        return true;
 }
 
-static bool check_wait(struct host1x_waitchk *wait, struct host1x_bo *cmdbuf,
-                      unsigned int offset)
-{
-       offset *= sizeof(u32);
-
-       if (wait->bo != cmdbuf || wait->offset != offset)
-               return false;
-
-       return true;
-}
-
 struct host1x_firewall {
        struct host1x_job *job;
        struct device *dev;
@@ -349,9 +267,6 @@ struct host1x_firewall {
        unsigned int num_relocs;
        struct host1x_reloc *reloc;
 
-       unsigned int num_waitchks;
-       struct host1x_waitchk *waitchk;
-
        struct host1x_bo *cmdbuf;
        unsigned int offset;
 
@@ -378,20 +293,6 @@ static int check_register(struct host1x_firewall *fw, unsigned long offset)
                fw->reloc++;
        }
 
-       if (offset == HOST1X_WAIT_SYNCPT_OFFSET) {
-               if (fw->class != HOST1X_CLASS_HOST1X)
-                       return -EINVAL;
-
-               if (!fw->num_waitchks)
-                       return -EINVAL;
-
-               if (!check_wait(fw->waitchk, fw->cmdbuf, fw->offset))
-                       return -EINVAL;
-
-               fw->num_waitchks--;
-               fw->waitchk++;
-       }
-
        return 0;
 }
 
@@ -556,8 +457,6 @@ static inline int copy_gathers(struct host1x_job *job, struct device *dev)
        fw.dev = dev;
        fw.reloc = job->relocarray;
        fw.num_relocs = job->num_relocs;
-       fw.waitchk = job->waitchk;
-       fw.num_waitchks = job->num_waitchk;
        fw.class = job->class;
 
        for (i = 0; i < job->num_gathers; i++) {
@@ -604,8 +503,8 @@ static inline int copy_gathers(struct host1x_job *job, struct device *dev)
                offset += g->words * sizeof(u32);
        }
 
-       /* No relocs and waitchks should remain at this point */
-       if (fw.num_relocs || fw.num_waitchks)
+       /* No relocs should remain at this point */
+       if (fw.num_relocs)
                return -EINVAL;
 
        return 0;
@@ -616,19 +515,6 @@ int host1x_job_pin(struct host1x_job *job, struct device *dev)
        int err;
        unsigned int i, j;
        struct host1x *host = dev_get_drvdata(dev->parent);
-       DECLARE_BITMAP(waitchk_mask, host1x_syncpt_nb_pts(host));
-
-       bitmap_zero(waitchk_mask, host1x_syncpt_nb_pts(host));
-       for (i = 0; i < job->num_waitchk; i++) {
-               u32 syncpt_id = job->waitchk[i].syncpt_id;
-
-               if (syncpt_id < host1x_syncpt_nb_pts(host))
-                       set_bit(syncpt_id, waitchk_mask);
-       }
-
-       /* get current syncpt values for waitchk */
-       for_each_set_bit(i, waitchk_mask, host1x_syncpt_nb_pts(host))
-               host1x_syncpt_load(host->syncpt + i);
 
        /* pin memory */
        err = pin_job(host, job);
@@ -663,10 +549,6 @@ int host1x_job_pin(struct host1x_job *job, struct device *dev)
                err = do_relocs(job, g);
                if (err)
                        break;
-
-               err = do_waitchks(job, host, g);
-               if (err)
-                       break;
        }
 
 out:
index a2a952adc136a42172d39b2866960211468afd00..a108669188e88ab29ee642d8308c2fd6816a452e 100644 (file)
@@ -373,12 +373,6 @@ bool host1x_syncpt_is_expired(struct host1x_syncpt *sp, u32 thresh)
                return (s32)(current_val - thresh) >= 0;
 }
 
-/* remove a wait pointed to by patch_addr */
-int host1x_syncpt_patch_wait(struct host1x_syncpt *sp, void *patch_addr)
-{
-       return host1x_hw_syncpt_patch_wait(sp->host, sp, patch_addr);
-}
-
 int host1x_syncpt_init(struct host1x *host)
 {
        struct host1x_syncpt_base *bases;
index 9d88d37c2397232cec563221c3fbc0244422e4ea..d98e22325e9df7e4c8b76c3d5ab2451be5051282 100644 (file)
@@ -124,7 +124,4 @@ static inline int host1x_syncpt_is_valid(struct host1x_syncpt *sp)
        return sp->id < host1x_syncpt_nb_pts(sp->host);
 }
 
-/* Patch a wait by replacing it with a wait for syncpt 0 value 0 */
-int host1x_syncpt_patch_wait(struct host1x_syncpt *sp, void *patch_addr);
-
 #endif
index ddf7f9ca86ccd6fe3702a14b78322bae7161fe83..f66bece1e1b747f076da01c573e1bf3fcab6378f 100644 (file)
@@ -192,13 +192,6 @@ struct host1x_reloc {
        unsigned long shift;
 };
 
-struct host1x_waitchk {
-       struct host1x_bo *bo;
-       u32 offset;
-       u32 syncpt_id;
-       u32 thresh;
-};
-
 struct host1x_job {
        /* When refcount goes to zero, job can be freed */
        struct kref ref;
@@ -215,11 +208,6 @@ struct host1x_job {
        struct host1x_job_gather *gathers;
        unsigned int num_gathers;
 
-       /* Wait checks to be processed at submit time */
-       struct host1x_waitchk *waitchk;
-       unsigned int num_waitchk;
-       u32 waitchk_mask;
-
        /* Array of handles to be pinned & unpinned */
        struct host1x_reloc *relocarray;
        unsigned int num_relocs;
@@ -261,8 +249,7 @@ struct host1x_job {
 };
 
 struct host1x_job *host1x_job_alloc(struct host1x_channel *ch,
-                                   u32 num_cmdbufs, u32 num_relocs,
-                                   u32 num_waitchks);
+                                   u32 num_cmdbufs, u32 num_relocs);
 void host1x_job_add_gather(struct host1x_job *job, struct host1x_bo *mem_id,
                           u32 words, u32 offset);
 struct host1x_job *host1x_job_get(struct host1x_job *job);
index 63116362543c7c3d58a207cbd4e19fb1828b9eeb..a37ef73092e5730db801685d0b0e7433adeeec8c 100644 (file)
@@ -115,16 +115,15 @@ TRACE_EVENT(host1x_cdma_push_gather,
 );
 
 TRACE_EVENT(host1x_channel_submit,
-       TP_PROTO(const char *name, u32 cmdbufs, u32 relocs, u32 waitchks,
-                       u32 syncpt_id, u32 syncpt_incrs),
+       TP_PROTO(const char *name, u32 cmdbufs, u32 relocs, u32 syncpt_id,
+                u32 syncpt_incrs),
 
-       TP_ARGS(name, cmdbufs, relocs, waitchks, syncpt_id, syncpt_incrs),
+       TP_ARGS(name, cmdbufs, relocs, syncpt_id, syncpt_incrs),
 
        TP_STRUCT__entry(
                __field(const char *, name)
                __field(u32, cmdbufs)
                __field(u32, relocs)
-               __field(u32, waitchks)
                __field(u32, syncpt_id)
                __field(u32, syncpt_incrs)
        ),
@@ -133,15 +132,14 @@ TRACE_EVENT(host1x_channel_submit,
                __entry->name = name;
                __entry->cmdbufs = cmdbufs;
                __entry->relocs = relocs;
-               __entry->waitchks = waitchks;
                __entry->syncpt_id = syncpt_id;
                __entry->syncpt_incrs = syncpt_incrs;
        ),
 
-       TP_printk("name=%s, cmdbufs=%u, relocs=%u, waitchks=%d,"
-               "syncpt_id=%u, syncpt_incrs=%u",
-         __entry->name, __entry->cmdbufs, __entry->relocs, __entry->waitchks,
-         __entry->syncpt_id, __entry->syncpt_incrs)
+       TP_printk("name=%s, cmdbufs=%u, relocs=%u, syncpt_id=%u, "
+                 "syncpt_incrs=%u",
+                 __entry->name, __entry->cmdbufs, __entry->relocs,
+                 __entry->syncpt_id, __entry->syncpt_incrs)
 );
 
 TRACE_EVENT(host1x_channel_submitted,