summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/ctrl_gk20a.c
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2014-10-16 08:15:11 -0400
committerDan Willemsen <dwillemsen@nvidia.com>2015-03-18 15:11:46 -0400
commit2eb6dcb4694c8b83e22c50d9fd4d3fdd85b93c46 (patch)
tree0a2d10c9873b81fd6a6821959874d4345cc6bfad /drivers/gpu/nvgpu/gk20a/ctrl_gk20a.c
parentecc6f27fd13e7560d124faf67d114b93d47b73de (diff)
gpu: nvgpu: Implement 64k large page support
Implement support for 64kB large page size. Add an API to create an address space via IOCTL so that we can accept flags, and assign one flag for enabling 64kB large page size. Also adds APIs to set per-context large page size. This is possible only on Maxwell, so return error if caller tries to set large page size on Kepler. Default large page size is still 128kB. Change-Id: I20b51c8f6d4a984acae8411ace3de9000c78e82f Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/ctrl_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/ctrl_gk20a.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/ctrl_gk20a.c b/drivers/gpu/nvgpu/gk20a/ctrl_gk20a.c
index ca587d00..6969a3a7 100644
--- a/drivers/gpu/nvgpu/gk20a/ctrl_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/ctrl_gk20a.c
@@ -16,6 +16,8 @@
16 16
17#include <linux/highmem.h> 17#include <linux/highmem.h>
18#include <linux/cdev.h> 18#include <linux/cdev.h>
19#include <linux/file.h>
20#include <linux/anon_inodes.h>
19#include <uapi/linux/nvgpu.h> 21#include <uapi/linux/nvgpu.h>
20 22
21#include "gk20a.h" 23#include "gk20a.h"
@@ -148,6 +150,53 @@ static int gk20a_ctrl_mark_compressible_write(
148 return ret; 150 return ret;
149} 151}
150 152
153static int gk20a_ctrl_alloc_as(
154 struct gk20a *g,
155 struct nvgpu_alloc_as_args *args)
156{
157 struct platform_device *dev = g->dev;
158 struct gk20a_as_share *as_share;
159 int err;
160 int fd;
161 struct file *file;
162 char *name;
163
164 err = get_unused_fd_flags(O_RDWR);
165 if (err < 0)
166 return err;
167 fd = err;
168
169 name = kasprintf(GFP_KERNEL, "nvhost-%s-fd%d",
170 dev_name(&dev->dev), fd);
171
172 file = anon_inode_getfile(name, g->as.cdev.ops, NULL, O_RDWR);
173 kfree(name);
174 if (IS_ERR(file)) {
175 err = PTR_ERR(file);
176 goto clean_up;
177 }
178 fd_install(fd, file);
179
180 err = gk20a_get_client(g);
181 if (err)
182 goto clean_up;
183
184 err = gk20a_as_alloc_share(&g->as, args->big_page_size, &as_share);
185 if (err)
186 goto clean_up_client;
187
188 file->private_data = as_share;
189
190 args->as_fd = fd;
191 return 0;
192
193clean_up_client:
194 gk20a_put_client(g);
195clean_up:
196 put_unused_fd(fd);
197 return err;
198}
199
151long gk20a_ctrl_dev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 200long gk20a_ctrl_dev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
152{ 201{
153 struct platform_device *dev = filp->private_data; 202 struct platform_device *dev = filp->private_data;
@@ -309,6 +358,10 @@ long gk20a_ctrl_dev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg
309 err = gk20a_ctrl_mark_compressible_write(g, 358 err = gk20a_ctrl_mark_compressible_write(g,
310 (struct nvgpu_gpu_mark_compressible_write_args *)buf); 359 (struct nvgpu_gpu_mark_compressible_write_args *)buf);
311 break; 360 break;
361 case NVGPU_GPU_IOCTL_ALLOC_AS:
362 err = gk20a_ctrl_alloc_as(g,
363 (struct nvgpu_alloc_as_args *)buf);
364 break;
312 default: 365 default:
313 dev_dbg(dev_from_gk20a(g), "unrecognized gpu ioctl cmd: 0x%x", cmd); 366 dev_dbg(dev_from_gk20a(g), "unrecognized gpu ioctl cmd: 0x%x", cmd);
314 err = -ENOTTY; 367 err = -ENOTTY;