From 3cb65f57d532d596bfb931f3e4b995004e36a129 Mon Sep 17 00:00:00 2001 From: Deepak Nibade Date: Wed, 8 Nov 2017 01:57:14 -0800 Subject: gpu: nvgpu: define runlist level in common code All the runlist levels NVGPU_RUNLIST_INTERLEAVE_LEVEL_* are declared in linux specific uapi header and used in common code But since common code should be linux-independent, move these uses out of common code Define new runlist levels NVGPU_FIFO_RUNLIST_INTERLEAVE_LEVEL_* in common code and use them wherever required Add new API nvgpu_get_common_runlist_level() to get common runlist level of the form NVGPU_FIFO_RUNLIST_INTERLEAVE_LEVEL_* from linux specific runlist level of the form NVGPU_RUNLIST_INTERLEAVE_LEVEL_* Jira NVGPU-259 Change-Id: Ic19239f0f8275683d5d1b981df530acd90e6dfbb Signed-off-by: Deepak Nibade Reviewed-on: https://git-master.nvidia.com/r/1594327 Reviewed-by: svc-mobile-coverity GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/common/linux/ioctl_channel.c | 55 ++++++++++++++++++++------ drivers/gpu/nvgpu/common/linux/ioctl_channel.h | 1 + drivers/gpu/nvgpu/common/linux/ioctl_tsg.c | 4 +- 3 files changed, 47 insertions(+), 13 deletions(-) (limited to 'drivers/gpu/nvgpu/common/linux') diff --git a/drivers/gpu/nvgpu/common/linux/ioctl_channel.c b/drivers/gpu/nvgpu/common/linux/ioctl_channel.c index 9a867bcb..781a803e 100644 --- a/drivers/gpu/nvgpu/common/linux/ioctl_channel.c +++ b/drivers/gpu/nvgpu/common/linux/ioctl_channel.c @@ -914,6 +914,48 @@ clean_up: return ret; } +/* + * Convert linux specific runlist level of the form NVGPU_RUNLIST_INTERLEAVE_LEVEL_* + * to common runlist level of the form NVGPU_FIFO_RUNLIST_INTERLEAVE_LEVEL_* + */ +u32 nvgpu_get_common_runlist_level(u32 level) +{ + switch (level) { + case NVGPU_RUNLIST_INTERLEAVE_LEVEL_LOW: + return NVGPU_FIFO_RUNLIST_INTERLEAVE_LEVEL_LOW; + case NVGPU_RUNLIST_INTERLEAVE_LEVEL_MEDIUM: + return NVGPU_FIFO_RUNLIST_INTERLEAVE_LEVEL_MEDIUM; + case NVGPU_RUNLIST_INTERLEAVE_LEVEL_HIGH: + return NVGPU_FIFO_RUNLIST_INTERLEAVE_LEVEL_HIGH; + default: + pr_err("%s: incorrect runlist level\n", __func__); + } + + return level; +} + +static int gk20a_ioctl_channel_set_runlist_interleave(struct channel_gk20a *ch, + u32 level) +{ + int err = 0; + + err = gk20a_busy(ch->g); + if (err) { + nvgpu_err(ch->g, "failed to power on, %d", err); + goto fail; + } + + level = nvgpu_get_common_runlist_level(level); + err = gk20a_channel_set_runlist_interleave(ch, level); + + gk20a_idle(ch->g); + gk20a_channel_trace_sched_param( + trace_gk20a_channel_set_runlist_interleave, ch); + +fail: + return err; +} + long gk20a_channel_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { @@ -1202,19 +1244,8 @@ long gk20a_channel_ioctl(struct file *filp, (struct nvgpu_channel_wdt_args *)buf); break; case NVGPU_IOCTL_CHANNEL_SET_RUNLIST_INTERLEAVE: - err = gk20a_busy(ch->g); - if (err) { - dev_err(dev, - "%s: failed to host gk20a for ioctl cmd: 0x%x", - __func__, cmd); - break; - } - err = gk20a_channel_set_runlist_interleave(ch, + err = gk20a_ioctl_channel_set_runlist_interleave(ch, ((struct nvgpu_runlist_interleave_args *)buf)->level); - - gk20a_idle(ch->g); - gk20a_channel_trace_sched_param( - trace_gk20a_channel_set_runlist_interleave, ch); break; case NVGPU_IOCTL_CHANNEL_SET_TIMESLICE: err = gk20a_busy(ch->g); diff --git a/drivers/gpu/nvgpu/common/linux/ioctl_channel.h b/drivers/gpu/nvgpu/common/linux/ioctl_channel.h index c3cd11c7..48caf9df 100644 --- a/drivers/gpu/nvgpu/common/linux/ioctl_channel.h +++ b/drivers/gpu/nvgpu/common/linux/ioctl_channel.h @@ -31,4 +31,5 @@ extern const struct file_operations gk20a_event_id_ops; extern const struct file_operations gk20a_channel_ops; u32 nvgpu_event_id_to_ioctl_channel_event_id(u32 event_id); +u32 nvgpu_get_common_runlist_level(u32 level); #endif diff --git a/drivers/gpu/nvgpu/common/linux/ioctl_tsg.c b/drivers/gpu/nvgpu/common/linux/ioctl_tsg.c index 681a5e66..eb223382 100644 --- a/drivers/gpu/nvgpu/common/linux/ioctl_tsg.c +++ b/drivers/gpu/nvgpu/common/linux/ioctl_tsg.c @@ -328,6 +328,7 @@ static int gk20a_tsg_ioctl_set_runlist_interleave(struct gk20a *g, { struct nvgpu_os_linux *l = nvgpu_os_linux_from_gk20a(g); struct gk20a_sched_ctrl *sched = &l->sched_ctrl; + u32 level = arg->level; int err; gk20a_dbg(gpu_dbg_fn | gpu_dbg_sched, "tsgid=%u", tsg->tsgid); @@ -343,7 +344,8 @@ static int gk20a_tsg_ioctl_set_runlist_interleave(struct gk20a *g, goto done; } - err = gk20a_tsg_set_runlist_interleave(tsg, arg->level); + level = nvgpu_get_common_runlist_level(level); + err = gk20a_tsg_set_runlist_interleave(tsg, level); gk20a_idle(g); done: -- cgit v1.2.2