diff options
author | Sami Kiminki <skiminki@nvidia.com> | 2015-05-04 11:41:23 -0400 |
---|---|---|
committer | Terje Bergstrom <tbergstrom@nvidia.com> | 2015-11-18 12:45:07 -0500 |
commit | 9d2c9072c8b9a7742db3974d6027df9d44e0953f (patch) | |
tree | 15ed7e5a3495db6032b43381641d102837decfad /drivers/gpu/nvgpu/gk20a/as_gk20a.c | |
parent | 503d3a0b1002685e65efb8b99a2362117ee62104 (diff) |
gpu: nvgpu: User-space managed address space support
Implement NVGPU_GPU_IOCTL_ALLOC_AS_FLAGS_USERSPACE_MANAGED, which
enables creating userspace-managed GPU address spaces.
When an address space is marked as userspace-managed, the following
changes are in effect:
- Only fixed-address mappings are allowed.
- VA space allocation for fixed-address mappings is not required,
except to mark space as sparse.
- Maps and unmaps are always immediate. In particular, the mapping
ref increments at kickoffs and decrements at job completion are
skipped.
Bug 1614735
Bug 1623949
Bug 1660392
Change-Id: I834fe19b3f65e9b02c268952383eddee0e465759
Signed-off-by: Sami Kiminki <skiminki@nvidia.com>
Reviewed-on: http://git-master/r/738558
Reviewed-on: http://git-master/r/833253
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Tested-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/as_gk20a.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/as_gk20a.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/as_gk20a.c b/drivers/gpu/nvgpu/gk20a/as_gk20a.c index 87b32add..b6b38541 100644 --- a/drivers/gpu/nvgpu/gk20a/as_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/as_gk20a.c | |||
@@ -38,7 +38,8 @@ static void release_as_share_id(struct gk20a_as *as, int id) | |||
38 | } | 38 | } |
39 | 39 | ||
40 | int gk20a_as_alloc_share(struct gk20a_as *as, | 40 | int gk20a_as_alloc_share(struct gk20a_as *as, |
41 | u32 flags, struct gk20a_as_share **out) | 41 | u32 big_page_size, u32 flags, |
42 | struct gk20a_as_share **out) | ||
42 | { | 43 | { |
43 | struct gk20a *g = gk20a_from_as(as); | 44 | struct gk20a *g = gk20a_from_as(as); |
44 | struct gk20a_as_share *as_share; | 45 | struct gk20a_as_share *as_share; |
@@ -59,7 +60,7 @@ int gk20a_as_alloc_share(struct gk20a_as *as, | |||
59 | err = gk20a_busy(g->dev); | 60 | err = gk20a_busy(g->dev); |
60 | if (err) | 61 | if (err) |
61 | goto failed; | 62 | goto failed; |
62 | err = g->ops.mm.vm_alloc_share(as_share, flags); | 63 | err = g->ops.mm.vm_alloc_share(as_share, big_page_size, flags); |
63 | gk20a_idle(g->dev); | 64 | gk20a_idle(g->dev); |
64 | 65 | ||
65 | if (err) | 66 | if (err) |
@@ -332,7 +333,7 @@ int gk20a_as_dev_open(struct inode *inode, struct file *filp) | |||
332 | 333 | ||
333 | g = container_of(inode->i_cdev, struct gk20a, as.cdev); | 334 | g = container_of(inode->i_cdev, struct gk20a, as.cdev); |
334 | 335 | ||
335 | err = gk20a_as_alloc_share(&g->as, 0, &as_share); | 336 | err = gk20a_as_alloc_share(&g->as, 0, 0, &as_share); |
336 | if (err) { | 337 | if (err) { |
337 | gk20a_dbg_fn("failed to alloc share"); | 338 | gk20a_dbg_fn("failed to alloc share"); |
338 | return err; | 339 | return err; |