summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/common/linux/ioctl_channel.c
diff options
context:
space:
mode:
authorDeepak Nibade <dnibade@nvidia.com>2017-11-10 08:02:37 -0500
committermobile promotions <svcmobile_promotions@nvidia.com>2017-11-14 07:58:39 -0500
commit90aeab9dee07a63e4bac6d92646dfd80e65d2edd (patch)
treea175a1724590dc14c599db9c23f04d79a8f3ac79 /drivers/gpu/nvgpu/common/linux/ioctl_channel.c
parentfd2cac59f3491cb5b4f5d1f3fc97df94734bd682 (diff)
gpu: nvgpu: define preemption modes in common code
We use linux specific graphics/compute preemption modes defined in uapi header (and of below form) in all over common code NVGPU_GRAPHICS_PREEMPTION_MODE_* NVGPU_COMPUTE_PREEMPTION_MODE_* Since common code should be independent of linux specific code, define new modes of the form in common code and used them everywhere NVGPU_PREEMPTION_MODE_GRAPHICS_* NVGPU_PREEMPTION_MODE_COMPUTE_* Add required parser functions to convert both the modes into each other For linux IOCTL NVGPU_IOCTL_CHANNEL_SET_PREEMPTION_MODE, we need to convert linux specific modes into common modes first before passing them to common code And to pass gpu characteristics to user space we need to first convert common modes into linux specific modes and then pass them to user space Jira NVGPU-392 Change-Id: I8c62c6859bdc1baa5b44eb31c7020e42d2462c8c Signed-off-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1596930 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/common/linux/ioctl_channel.c')
-rw-r--r--drivers/gpu/nvgpu/common/linux/ioctl_channel.c148
1 files changed, 130 insertions, 18 deletions
diff --git a/drivers/gpu/nvgpu/common/linux/ioctl_channel.c b/drivers/gpu/nvgpu/common/linux/ioctl_channel.c
index f5947828..6feb6fb7 100644
--- a/drivers/gpu/nvgpu/common/linux/ioctl_channel.c
+++ b/drivers/gpu/nvgpu/common/linux/ioctl_channel.c
@@ -45,7 +45,7 @@
45static const char *gr_gk20a_graphics_preempt_mode_name(u32 graphics_preempt_mode) 45static const char *gr_gk20a_graphics_preempt_mode_name(u32 graphics_preempt_mode)
46{ 46{
47 switch (graphics_preempt_mode) { 47 switch (graphics_preempt_mode) {
48 case NVGPU_GRAPHICS_PREEMPTION_MODE_WFI: 48 case NVGPU_PREEMPTION_MODE_GRAPHICS_WFI:
49 return "WFI"; 49 return "WFI";
50 default: 50 default:
51 return "?"; 51 return "?";
@@ -55,9 +55,9 @@ static const char *gr_gk20a_graphics_preempt_mode_name(u32 graphics_preempt_mode
55static const char *gr_gk20a_compute_preempt_mode_name(u32 compute_preempt_mode) 55static const char *gr_gk20a_compute_preempt_mode_name(u32 compute_preempt_mode)
56{ 56{
57 switch (compute_preempt_mode) { 57 switch (compute_preempt_mode) {
58 case NVGPU_COMPUTE_PREEMPTION_MODE_WFI: 58 case NVGPU_PREEMPTION_MODE_COMPUTE_WFI:
59 return "WFI"; 59 return "WFI";
60 case NVGPU_COMPUTE_PREEMPTION_MODE_CTA: 60 case NVGPU_PREEMPTION_MODE_COMPUTE_CTA:
61 return "CTA"; 61 return "CTA";
62 default: 62 default:
63 return "?"; 63 return "?";
@@ -991,6 +991,130 @@ static int nvgpu_ioctl_channel_alloc_obj_ctx(struct channel_gk20a *ch,
991 nvgpu_obj_ctx_user_flags_to_common_flags(user_flags)); 991 nvgpu_obj_ctx_user_flags_to_common_flags(user_flags));
992} 992}
993 993
994/*
995 * Convert common preemption mode flags of the form NVGPU_PREEMPTION_MODE_GRAPHICS_*
996 * into linux preemption mode flags of the form NVGPU_GRAPHICS_PREEMPTION_MODE_*
997 */
998u32 nvgpu_get_ioctl_graphics_preempt_mode_flags(u32 graphics_preempt_mode_flags)
999{
1000 u32 flags = 0;
1001
1002 if (graphics_preempt_mode_flags & NVGPU_PREEMPTION_MODE_GRAPHICS_WFI)
1003 flags |= NVGPU_GRAPHICS_PREEMPTION_MODE_WFI;
1004 if (graphics_preempt_mode_flags & NVGPU_PREEMPTION_MODE_GRAPHICS_GFXP)
1005 flags |= NVGPU_GRAPHICS_PREEMPTION_MODE_GFXP;
1006
1007 return flags;
1008}
1009
1010/*
1011 * Convert common preemption mode flags of the form NVGPU_PREEMPTION_MODE_COMPUTE_*
1012 * into linux preemption mode flags of the form NVGPU_COMPUTE_PREEMPTION_MODE_*
1013 */
1014u32 nvgpu_get_ioctl_compute_preempt_mode_flags(u32 compute_preempt_mode_flags)
1015{
1016 u32 flags = 0;
1017
1018 if (compute_preempt_mode_flags & NVGPU_PREEMPTION_MODE_COMPUTE_WFI)
1019 flags |= NVGPU_COMPUTE_PREEMPTION_MODE_WFI;
1020 if (compute_preempt_mode_flags & NVGPU_PREEMPTION_MODE_COMPUTE_CTA)
1021 flags |= NVGPU_COMPUTE_PREEMPTION_MODE_CTA;
1022 if (compute_preempt_mode_flags & NVGPU_PREEMPTION_MODE_COMPUTE_CILP)
1023 flags |= NVGPU_COMPUTE_PREEMPTION_MODE_CILP;
1024
1025 return flags;
1026}
1027
1028/*
1029 * Convert common preemption modes of the form NVGPU_PREEMPTION_MODE_GRAPHICS_*
1030 * into linux preemption modes of the form NVGPU_GRAPHICS_PREEMPTION_MODE_*
1031 */
1032u32 nvgpu_get_ioctl_graphics_preempt_mode(u32 graphics_preempt_mode)
1033{
1034 switch (graphics_preempt_mode) {
1035 case NVGPU_PREEMPTION_MODE_GRAPHICS_WFI:
1036 return NVGPU_GRAPHICS_PREEMPTION_MODE_WFI;
1037 case NVGPU_PREEMPTION_MODE_GRAPHICS_GFXP:
1038 return NVGPU_GRAPHICS_PREEMPTION_MODE_GFXP;
1039 }
1040
1041 return graphics_preempt_mode;
1042}
1043
1044/*
1045 * Convert common preemption modes of the form NVGPU_PREEMPTION_MODE_COMPUTE_*
1046 * into linux preemption modes of the form NVGPU_COMPUTE_PREEMPTION_MODE_*
1047 */
1048u32 nvgpu_get_ioctl_compute_preempt_mode(u32 compute_preempt_mode)
1049{
1050 switch (compute_preempt_mode) {
1051 case NVGPU_PREEMPTION_MODE_COMPUTE_WFI:
1052 return NVGPU_COMPUTE_PREEMPTION_MODE_WFI;
1053 case NVGPU_PREEMPTION_MODE_COMPUTE_CTA:
1054 return NVGPU_COMPUTE_PREEMPTION_MODE_CTA;
1055 case NVGPU_PREEMPTION_MODE_COMPUTE_CILP:
1056 return NVGPU_COMPUTE_PREEMPTION_MODE_CILP;
1057 }
1058
1059 return compute_preempt_mode;
1060}
1061
1062/*
1063 * Convert linux preemption modes of the form NVGPU_GRAPHICS_PREEMPTION_MODE_*
1064 * into common preemption modes of the form NVGPU_PREEMPTION_MODE_GRAPHICS_*
1065 */
1066static u32 nvgpu_get_common_graphics_preempt_mode(u32 graphics_preempt_mode)
1067{
1068 switch (graphics_preempt_mode) {
1069 case NVGPU_GRAPHICS_PREEMPTION_MODE_WFI:
1070 return NVGPU_PREEMPTION_MODE_GRAPHICS_WFI;
1071 case NVGPU_GRAPHICS_PREEMPTION_MODE_GFXP:
1072 return NVGPU_PREEMPTION_MODE_GRAPHICS_GFXP;
1073 }
1074
1075 return graphics_preempt_mode;
1076}
1077
1078/*
1079 * Convert linux preemption modes of the form NVGPU_COMPUTE_PREEMPTION_MODE_*
1080 * into common preemption modes of the form NVGPU_PREEMPTION_MODE_COMPUTE_*
1081 */
1082static u32 nvgpu_get_common_compute_preempt_mode(u32 compute_preempt_mode)
1083{
1084 switch (compute_preempt_mode) {
1085 case NVGPU_COMPUTE_PREEMPTION_MODE_WFI:
1086 return NVGPU_PREEMPTION_MODE_COMPUTE_WFI;
1087 case NVGPU_COMPUTE_PREEMPTION_MODE_CTA:
1088 return NVGPU_PREEMPTION_MODE_COMPUTE_CTA;
1089 case NVGPU_COMPUTE_PREEMPTION_MODE_CILP:
1090 return NVGPU_PREEMPTION_MODE_COMPUTE_CILP;
1091 }
1092
1093 return compute_preempt_mode;
1094}
1095
1096static int nvgpu_ioctl_channel_set_preemption_mode(struct channel_gk20a *ch,
1097 u32 graphics_preempt_mode, u32 compute_preempt_mode)
1098{
1099 int err;
1100
1101 if (ch->g->ops.gr.set_preemption_mode) {
1102 err = gk20a_busy(ch->g);
1103 if (err) {
1104 nvgpu_err(ch->g, "failed to power on, %d", err);
1105 return err;
1106 }
1107 err = ch->g->ops.gr.set_preemption_mode(ch,
1108 nvgpu_get_common_graphics_preempt_mode(graphics_preempt_mode),
1109 nvgpu_get_common_compute_preempt_mode(compute_preempt_mode));
1110 gk20a_idle(ch->g);
1111 } else {
1112 err = -EINVAL;
1113 }
1114
1115 return err;
1116}
1117
994long gk20a_channel_ioctl(struct file *filp, 1118long gk20a_channel_ioctl(struct file *filp,
995 unsigned int cmd, unsigned long arg) 1119 unsigned int cmd, unsigned long arg)
996{ 1120{
@@ -1302,21 +1426,9 @@ long gk20a_channel_ioctl(struct file *filp,
1302 gk20a_channel_get_timeslice(ch); 1426 gk20a_channel_get_timeslice(ch);
1303 break; 1427 break;
1304 case NVGPU_IOCTL_CHANNEL_SET_PREEMPTION_MODE: 1428 case NVGPU_IOCTL_CHANNEL_SET_PREEMPTION_MODE:
1305 if (ch->g->ops.gr.set_preemption_mode) { 1429 err = nvgpu_ioctl_channel_set_preemption_mode(ch,
1306 err = gk20a_busy(ch->g); 1430 ((struct nvgpu_preemption_mode_args *)buf)->graphics_preempt_mode,
1307 if (err) { 1431 ((struct nvgpu_preemption_mode_args *)buf)->compute_preempt_mode);
1308 dev_err(dev,
1309 "%s: failed to host gk20a for ioctl cmd: 0x%x",
1310 __func__, cmd);
1311 break;
1312 }
1313 err = ch->g->ops.gr.set_preemption_mode(ch,
1314 ((struct nvgpu_preemption_mode_args *)buf)->graphics_preempt_mode,
1315 ((struct nvgpu_preemption_mode_args *)buf)->compute_preempt_mode);
1316 gk20a_idle(ch->g);
1317 } else {
1318 err = -EINVAL;
1319 }
1320 break; 1432 break;
1321 case NVGPU_IOCTL_CHANNEL_SET_BOOSTED_CTX: 1433 case NVGPU_IOCTL_CHANNEL_SET_BOOSTED_CTX:
1322 if (ch->g->ops.gr.set_boosted_ctx) { 1434 if (ch->g->ops.gr.set_boosted_ctx) {