On 17.05.2018 18:34, Thierry Reding wrote:
> From: Thierry Reding <tred...@nvidia.com>
> 
> 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.
> 
> Signed-off-by: Thierry Reding <tred...@nvidia.com>
> ---
>  drivers/gpu/drm/tegra/drm.c        |  62 +--------------
>  drivers/gpu/host1x/dev.h           |   8 --
>  drivers/gpu/host1x/hw/channel_hw.c |   3 +-
>  drivers/gpu/host1x/hw/syncpt_hw.c  |  11 ---
>  drivers/gpu/host1x/job.c           | 124 +----------------------------
>  drivers/gpu/host1x/syncpt.c        |   6 --
>  drivers/gpu/host1x/syncpt.h        |   3 -
>  include/linux/host1x.h             |  15 +---
>  include/trace/events/host1x.h      |  16 ++--
>  9 files changed, 14 insertions(+), 234 deletions(-)
> 
> diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c
> index 7afe2f635f74..33e479182773 100644
> --- a/drivers/gpu/drm/tegra/drm.c
> +++ b/drivers/gpu/drm/tegra/drm.c
> @@ -313,46 +313,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);
> @@ -364,7 +332,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 */
> @@ -376,12 +343,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;
> @@ -390,7 +356,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) {
> @@ -481,30 +447,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;
> diff --git a/drivers/gpu/host1x/dev.h b/drivers/gpu/host1x/dev.h
> index 43e9fabb43a1..36f44ffebe73 100644
> --- a/drivers/gpu/host1x/dev.h
> +++ b/drivers/gpu/host1x/dev.h
> @@ -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)
> diff --git a/drivers/gpu/host1x/hw/channel_hw.c 
> b/drivers/gpu/host1x/hw/channel_hw.c
> index 9af758785a11..4c9555038a95 100644
> --- a/drivers/gpu/host1x/hw/channel_hw.c
> +++ b/drivers/gpu/host1x/hw/channel_hw.c
> @@ -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);
> diff --git a/drivers/gpu/host1x/hw/syncpt_hw.c 
> b/drivers/gpu/host1x/hw/syncpt_hw.c
> index 7dfd47d74f89..a23bb3352d02 100644
> --- a/drivers/gpu/host1x/hw/syncpt_hw.c
> +++ b/drivers/gpu/host1x/hw/syncpt_hw.c
> @@ -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,
>  };
> diff --git a/drivers/gpu/host1x/job.c b/drivers/gpu/host1x/job.c
> index db509ab8874e..3cbfc6e37668 100644
> --- a/drivers/gpu/host1x/job.c
> +++ b/drivers/gpu/host1x/job.c
> @@ -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:
> diff --git a/drivers/gpu/host1x/syncpt.c b/drivers/gpu/host1x/syncpt.c
> index a2a952adc136..a108669188e8 100644
> --- a/drivers/gpu/host1x/syncpt.c
> +++ b/drivers/gpu/host1x/syncpt.c
> @@ -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;
> diff --git a/drivers/gpu/host1x/syncpt.h b/drivers/gpu/host1x/syncpt.h
> index 9d88d37c2397..d98e22325e9d 100644
> --- a/drivers/gpu/host1x/syncpt.h
> +++ b/drivers/gpu/host1x/syncpt.h
> @@ -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
> diff --git a/include/linux/host1x.h b/include/linux/host1x.h
> index ddf7f9ca86cc..f66bece1e1b7 100644
> --- a/include/linux/host1x.h
> +++ b/include/linux/host1x.h
> @@ -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);
> diff --git a/include/trace/events/host1x.h b/include/trace/events/host1x.h
> index 63116362543c..a37ef73092e5 100644
> --- a/include/trace/events/host1x.h
> +++ b/include/trace/events/host1x.h
> @@ -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,
> 

Reviewed-by: Dmitry Osipenko <dig...@gmail.com>
Tested-by: Dmitry Osipenko <dig...@gmail.com>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to