summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAingara Paramakuru <aparamakuru@nvidia.com>2016-04-08 18:07:08 -0400
committerTerje Bergstrom <tbergstrom@nvidia.com>2016-04-16 10:35:51 -0400
commitc4e4f2567d4503c939eff9777273bc6ab0902db8 (patch)
tree919c8e46b9790ff6fc547ae357a6496e0c19c95d
parent6b35cb05b7822174bf037da7229154004df4f229 (diff)
gpu: nvgpu: add TSG interleave support
Add support for changing a TSG's runlist interleave level. JIRA VFND-1497 Bug 1749744 Change-Id: I3cf3ebc2334f83b1bfb6b3230fae2ca73c75c239 Signed-off-by: Aingara Paramakuru <aparamakuru@nvidia.com> Reviewed-on: http://git-master/r/1122677 Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com> Tested-by: Terje Bergstrom <tbergstrom@nvidia.com>
-rw-r--r--drivers/gpu/nvgpu/gk20a/tsg_gk20a.c34
-rw-r--r--include/uapi/linux/nvgpu.h4
2 files changed, 37 insertions, 1 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/tsg_gk20a.c b/drivers/gpu/nvgpu/gk20a/tsg_gk20a.c
index 7b98c80f..0eaa23ab 100644
--- a/drivers/gpu/nvgpu/gk20a/tsg_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/tsg_gk20a.c
@@ -325,6 +325,26 @@ static int gk20a_tsg_event_id_ctrl(struct gk20a *g, struct tsg_gk20a *tsg,
325 return err; 325 return err;
326} 326}
327 327
328static int gk20a_tsg_set_runlist_interleave(struct tsg_gk20a *tsg, u32 level)
329{
330 struct gk20a *g = tsg->g;
331 int ret;
332
333 switch (level) {
334 case NVGPU_RUNLIST_INTERLEAVE_LEVEL_LOW:
335 case NVGPU_RUNLIST_INTERLEAVE_LEVEL_MEDIUM:
336 case NVGPU_RUNLIST_INTERLEAVE_LEVEL_HIGH:
337 ret = g->ops.fifo.set_runlist_interleave(g, tsg->tsgid,
338 true, 0, level);
339 break;
340 default:
341 ret = -EINVAL;
342 break;
343 }
344
345 return ret ? ret : g->ops.fifo.update_runlist(g, 0, ~0, true, true);
346}
347
328static void release_used_tsg(struct fifo_gk20a *f, struct tsg_gk20a *tsg) 348static void release_used_tsg(struct fifo_gk20a *f, struct tsg_gk20a *tsg)
329{ 349{
330 mutex_lock(&f->tsg_inuse_mutex); 350 mutex_lock(&f->tsg_inuse_mutex);
@@ -520,6 +540,20 @@ long gk20a_tsg_dev_ioctl(struct file *filp, unsigned int cmd,
520 break; 540 break;
521 } 541 }
522 542
543 case NVGPU_IOCTL_TSG_SET_RUNLIST_INTERLEAVE:
544 {
545 err = gk20a_busy(g->dev);
546 if (err) {
547 gk20a_err(dev_from_gk20a(g),
548 "failed to host gk20a for ioctl cmd: 0x%x", cmd);
549 return err;
550 }
551 err = gk20a_tsg_set_runlist_interleave(tsg,
552 ((struct nvgpu_runlist_interleave_args *)buf)->level);
553 gk20a_idle(g->dev);
554 break;
555 }
556
523 default: 557 default:
524 gk20a_err(dev_from_gk20a(g), 558 gk20a_err(dev_from_gk20a(g),
525 "unrecognized tsg gpu ioctl cmd: 0x%x", 559 "unrecognized tsg gpu ioctl cmd: 0x%x",
diff --git a/include/uapi/linux/nvgpu.h b/include/uapi/linux/nvgpu.h
index cf89b9d8..16d60261 100644
--- a/include/uapi/linux/nvgpu.h
+++ b/include/uapi/linux/nvgpu.h
@@ -465,11 +465,13 @@ struct nvgpu_gpu_get_gpu_time_args {
465 _IOW(NVGPU_TSG_IOCTL_MAGIC, 6, struct nvgpu_set_priority_args) 465 _IOW(NVGPU_TSG_IOCTL_MAGIC, 6, struct nvgpu_set_priority_args)
466#define NVGPU_IOCTL_TSG_EVENT_ID_CTRL \ 466#define NVGPU_IOCTL_TSG_EVENT_ID_CTRL \
467 _IOWR(NVGPU_TSG_IOCTL_MAGIC, 7, struct nvgpu_event_id_ctrl_args) 467 _IOWR(NVGPU_TSG_IOCTL_MAGIC, 7, struct nvgpu_event_id_ctrl_args)
468#define NVGPU_IOCTL_TSG_SET_RUNLIST_INTERLEAVE \
469 _IOW(NVGPU_TSG_IOCTL_MAGIC, 8, struct nvgpu_runlist_interleave_args)
468 470
469#define NVGPU_TSG_IOCTL_MAX_ARG_SIZE \ 471#define NVGPU_TSG_IOCTL_MAX_ARG_SIZE \
470 sizeof(struct nvgpu_event_id_ctrl_args) 472 sizeof(struct nvgpu_event_id_ctrl_args)
471#define NVGPU_TSG_IOCTL_LAST \ 473#define NVGPU_TSG_IOCTL_LAST \
472 _IOC_NR(NVGPU_IOCTL_TSG_EVENT_ID_CTRL) 474 _IOC_NR(NVGPU_IOCTL_TSG_SET_RUNLIST_INTERLEAVE)
473 475
474 476
475/* 477/*