mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-24 10:34:43 +03:00
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>
This commit is contained in:
committed by
Dan Willemsen
parent
ecc6f27fd1
commit
2eb6dcb469
@@ -16,6 +16,8 @@
|
||||
|
||||
#include <linux/highmem.h>
|
||||
#include <linux/cdev.h>
|
||||
#include <linux/file.h>
|
||||
#include <linux/anon_inodes.h>
|
||||
#include <uapi/linux/nvgpu.h>
|
||||
|
||||
#include "gk20a.h"
|
||||
@@ -148,6 +150,53 @@ static int gk20a_ctrl_mark_compressible_write(
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int gk20a_ctrl_alloc_as(
|
||||
struct gk20a *g,
|
||||
struct nvgpu_alloc_as_args *args)
|
||||
{
|
||||
struct platform_device *dev = g->dev;
|
||||
struct gk20a_as_share *as_share;
|
||||
int err;
|
||||
int fd;
|
||||
struct file *file;
|
||||
char *name;
|
||||
|
||||
err = get_unused_fd_flags(O_RDWR);
|
||||
if (err < 0)
|
||||
return err;
|
||||
fd = err;
|
||||
|
||||
name = kasprintf(GFP_KERNEL, "nvhost-%s-fd%d",
|
||||
dev_name(&dev->dev), fd);
|
||||
|
||||
file = anon_inode_getfile(name, g->as.cdev.ops, NULL, O_RDWR);
|
||||
kfree(name);
|
||||
if (IS_ERR(file)) {
|
||||
err = PTR_ERR(file);
|
||||
goto clean_up;
|
||||
}
|
||||
fd_install(fd, file);
|
||||
|
||||
err = gk20a_get_client(g);
|
||||
if (err)
|
||||
goto clean_up;
|
||||
|
||||
err = gk20a_as_alloc_share(&g->as, args->big_page_size, &as_share);
|
||||
if (err)
|
||||
goto clean_up_client;
|
||||
|
||||
file->private_data = as_share;
|
||||
|
||||
args->as_fd = fd;
|
||||
return 0;
|
||||
|
||||
clean_up_client:
|
||||
gk20a_put_client(g);
|
||||
clean_up:
|
||||
put_unused_fd(fd);
|
||||
return err;
|
||||
}
|
||||
|
||||
long gk20a_ctrl_dev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
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
|
||||
err = gk20a_ctrl_mark_compressible_write(g,
|
||||
(struct nvgpu_gpu_mark_compressible_write_args *)buf);
|
||||
break;
|
||||
case NVGPU_GPU_IOCTL_ALLOC_AS:
|
||||
err = gk20a_ctrl_alloc_as(g,
|
||||
(struct nvgpu_alloc_as_args *)buf);
|
||||
break;
|
||||
default:
|
||||
dev_dbg(dev_from_gk20a(g), "unrecognized gpu ioctl cmd: 0x%x", cmd);
|
||||
err = -ENOTTY;
|
||||
|
||||
Reference in New Issue
Block a user