diff options
Diffstat (limited to 'drivers/gpu/nvgpu/vgpu/gv11b/vgpu_fifo_gv11b.c')
-rw-r--r-- | drivers/gpu/nvgpu/vgpu/gv11b/vgpu_fifo_gv11b.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/vgpu/gv11b/vgpu_fifo_gv11b.c b/drivers/gpu/nvgpu/vgpu/gv11b/vgpu_fifo_gv11b.c index 048a4c64..ae9d52a7 100644 --- a/drivers/gpu/nvgpu/vgpu/gv11b/vgpu_fifo_gv11b.c +++ b/drivers/gpu/nvgpu/vgpu/gv11b/vgpu_fifo_gv11b.c | |||
@@ -23,6 +23,82 @@ | |||
23 | #include <gk20a/gk20a.h> | 23 | #include <gk20a/gk20a.h> |
24 | 24 | ||
25 | #include "vgpu/vgpu.h" | 25 | #include "vgpu/vgpu.h" |
26 | #include "gv11b/fifo_gv11b.h" | ||
27 | #include <nvgpu/nvhost_t19x.h> | ||
28 | |||
29 | #include <linux/tegra_vgpu.h> | ||
30 | |||
31 | #ifdef CONFIG_TEGRA_GK20A_NVHOST | ||
32 | int vgpu_gv11b_fifo_alloc_syncpt_buf(struct channel_gk20a *c, | ||
33 | u32 syncpt_id, struct nvgpu_mem *syncpt_buf) | ||
34 | { | ||
35 | int err; | ||
36 | struct gk20a *g = c->g; | ||
37 | struct vm_gk20a *vm = c->vm; | ||
38 | struct tegra_vgpu_cmd_msg msg = {}; | ||
39 | struct tegra_vgpu_map_syncpt_params *p = &msg.params.t19x.map_syncpt; | ||
40 | |||
41 | /* | ||
42 | * Add ro map for complete sync point shim range in vm. | ||
43 | * All channels sharing same vm will share same ro mapping. | ||
44 | * Create rw map for current channel sync point. | ||
45 | */ | ||
46 | if (!vm->syncpt_ro_map_gpu_va) { | ||
47 | vm->syncpt_ro_map_gpu_va = __nvgpu_vm_alloc_va(vm, | ||
48 | g->syncpt_unit_size, | ||
49 | gmmu_page_size_kernel); | ||
50 | if (!vm->syncpt_ro_map_gpu_va) { | ||
51 | nvgpu_err(g, "allocating read-only va space failed"); | ||
52 | return -ENOMEM; | ||
53 | } | ||
54 | |||
55 | msg.cmd = TEGRA_VGPU_CMD_MAP_SYNCPT; | ||
56 | msg.handle = vgpu_get_handle(g); | ||
57 | p->as_handle = c->vm->handle; | ||
58 | p->gpu_va = vm->syncpt_ro_map_gpu_va; | ||
59 | p->len = g->syncpt_unit_size; | ||
60 | p->offset = 0; | ||
61 | p->prot = TEGRA_VGPU_MAP_PROT_READ_ONLY; | ||
62 | err = vgpu_comm_sendrecv(&msg, sizeof(msg), sizeof(msg)); | ||
63 | err = err ? err : msg.ret; | ||
64 | if (err) { | ||
65 | nvgpu_err(g, | ||
66 | "mapping read-only va space failed err %d", | ||
67 | err); | ||
68 | __nvgpu_vm_free_va(c->vm, vm->syncpt_ro_map_gpu_va, | ||
69 | gmmu_page_size_kernel); | ||
70 | vm->syncpt_ro_map_gpu_va = 0; | ||
71 | return err; | ||
72 | } | ||
73 | } | ||
74 | |||
75 | syncpt_buf->gpu_va = __nvgpu_vm_alloc_va(c->vm, g->syncpt_size, | ||
76 | gmmu_page_size_kernel); | ||
77 | if (!syncpt_buf->gpu_va) { | ||
78 | nvgpu_err(g, "allocating syncpt va space failed"); | ||
79 | return -ENOMEM; | ||
80 | } | ||
81 | |||
82 | msg.cmd = TEGRA_VGPU_CMD_MAP_SYNCPT; | ||
83 | msg.handle = vgpu_get_handle(g); | ||
84 | p->as_handle = c->vm->handle; | ||
85 | p->gpu_va = syncpt_buf->gpu_va; | ||
86 | p->len = g->syncpt_size; | ||
87 | p->offset = | ||
88 | nvgpu_nvhost_syncpt_unit_interface_get_byte_offset(syncpt_id); | ||
89 | p->prot = TEGRA_VGPU_MAP_PROT_NONE; | ||
90 | err = vgpu_comm_sendrecv(&msg, sizeof(msg), sizeof(msg)); | ||
91 | err = err ? err : msg.ret; | ||
92 | if (err) { | ||
93 | nvgpu_err(g, "mapping syncpt va space failed err %d", err); | ||
94 | __nvgpu_vm_free_va(c->vm, syncpt_buf->gpu_va, | ||
95 | gmmu_page_size_kernel); | ||
96 | return err; | ||
97 | } | ||
98 | |||
99 | return 0; | ||
100 | } | ||
101 | #endif /* CONFIG_TEGRA_GK20A_NVHOST */ | ||
26 | 102 | ||
27 | int vgpu_gv11b_init_fifo_setup_hw(struct gk20a *g) | 103 | int vgpu_gv11b_init_fifo_setup_hw(struct gk20a *g) |
28 | { | 104 | { |