diff options
Diffstat (limited to 'drivers/gpu/nvgpu')
-rw-r--r-- | drivers/gpu/nvgpu/gp10b/gr_gp10b.c | 51 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gp10b/gr_gp10b.h | 2 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/vgpu/gp10b/vgpu_gr_gp10b.c | 21 |
3 files changed, 57 insertions, 17 deletions
diff --git a/drivers/gpu/nvgpu/gp10b/gr_gp10b.c b/drivers/gpu/nvgpu/gp10b/gr_gp10b.c index de6023b5..c801a2b8 100644 --- a/drivers/gpu/nvgpu/gp10b/gr_gp10b.c +++ b/drivers/gpu/nvgpu/gp10b/gr_gp10b.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/tegra-fuse.h> | 18 | #include <linux/tegra-fuse.h> |
19 | 19 | ||
20 | #include "gk20a/gr_gk20a.h" | 20 | #include "gk20a/gr_gk20a.h" |
21 | #include "gk20a/semaphore_gk20a.h" | ||
21 | 22 | ||
22 | #include "gm20b/gr_gm20b.h" /* for MAXWELL classes */ | 23 | #include "gm20b/gr_gm20b.h" /* for MAXWELL classes */ |
23 | #include "gp10b/gr_gp10b.h" | 24 | #include "gp10b/gr_gp10b.h" |
@@ -492,6 +493,36 @@ static int gr_gp10b_init_ctx_state(struct gk20a *g) | |||
492 | return 0; | 493 | return 0; |
493 | } | 494 | } |
494 | 495 | ||
496 | int gr_gp10b_alloc_buffer(struct vm_gk20a *vm, size_t size, | ||
497 | struct mem_desc *mem) | ||
498 | { | ||
499 | int err; | ||
500 | |||
501 | gk20a_dbg_fn(""); | ||
502 | |||
503 | err = gk20a_gmmu_alloc_attr(vm->mm->g, 0, size, mem); | ||
504 | if (err) | ||
505 | return err; | ||
506 | |||
507 | mem->gpu_va = gk20a_gmmu_map(vm, | ||
508 | &mem->sgt, | ||
509 | size, | ||
510 | NVGPU_MAP_BUFFER_FLAGS_CACHEABLE_TRUE, | ||
511 | gk20a_mem_flag_none, | ||
512 | false); | ||
513 | |||
514 | if (!mem->gpu_va) { | ||
515 | err = -ENOMEM; | ||
516 | goto fail_free; | ||
517 | } | ||
518 | |||
519 | return 0; | ||
520 | |||
521 | fail_free: | ||
522 | gk20a_gmmu_free(vm->mm->g, mem); | ||
523 | return err; | ||
524 | } | ||
525 | |||
495 | static int gr_gp10b_alloc_gr_ctx(struct gk20a *g, | 526 | static int gr_gp10b_alloc_gr_ctx(struct gk20a *g, |
496 | struct gr_ctx_desc **gr_ctx, struct vm_gk20a *vm, | 527 | struct gr_ctx_desc **gr_ctx, struct vm_gk20a *vm, |
497 | u32 class, | 528 | u32 class, |
@@ -530,32 +561,36 @@ static int gr_gp10b_alloc_gr_ctx(struct gk20a *g, | |||
530 | gk20a_dbg_info("gfxp context pagepool_size=%d", pagepool_size); | 561 | gk20a_dbg_info("gfxp context pagepool_size=%d", pagepool_size); |
531 | gk20a_dbg_info("gfxp context attrib_cb_size=%d", | 562 | gk20a_dbg_info("gfxp context attrib_cb_size=%d", |
532 | attrib_cb_size); | 563 | attrib_cb_size); |
533 | err = gk20a_gmmu_alloc_map(vm, g->gr.t18x.ctx_vars.preempt_image_size, | 564 | err = gr_gp10b_alloc_buffer(vm, |
534 | &(*gr_ctx)->t18x.preempt_ctxsw_buffer); | 565 | g->gr.t18x.ctx_vars.preempt_image_size, |
566 | &(*gr_ctx)->t18x.preempt_ctxsw_buffer); | ||
535 | if (err) { | 567 | if (err) { |
536 | gk20a_err(dev_from_gk20a(vm->mm->g), | 568 | gk20a_err(dev_from_gk20a(vm->mm->g), |
537 | "cannot allocate preempt buffer"); | 569 | "cannot allocate preempt buffer"); |
538 | goto fail_free_gk20a_ctx; | 570 | goto fail_free_gk20a_ctx; |
539 | } | 571 | } |
540 | 572 | ||
541 | err = gk20a_gmmu_alloc_map(vm, spill_size, | 573 | err = gr_gp10b_alloc_buffer(vm, |
542 | &(*gr_ctx)->t18x.spill_ctxsw_buffer); | 574 | spill_size, |
575 | &(*gr_ctx)->t18x.spill_ctxsw_buffer); | ||
543 | if (err) { | 576 | if (err) { |
544 | gk20a_err(dev_from_gk20a(vm->mm->g), | 577 | gk20a_err(dev_from_gk20a(vm->mm->g), |
545 | "cannot allocate spill buffer"); | 578 | "cannot allocate spill buffer"); |
546 | goto fail_free_preempt; | 579 | goto fail_free_preempt; |
547 | } | 580 | } |
548 | 581 | ||
549 | err = gk20a_gmmu_alloc_map(vm, attrib_cb_size, | 582 | err = gr_gp10b_alloc_buffer(vm, |
550 | &(*gr_ctx)->t18x.betacb_ctxsw_buffer); | 583 | attrib_cb_size, |
584 | &(*gr_ctx)->t18x.betacb_ctxsw_buffer); | ||
551 | if (err) { | 585 | if (err) { |
552 | gk20a_err(dev_from_gk20a(vm->mm->g), | 586 | gk20a_err(dev_from_gk20a(vm->mm->g), |
553 | "cannot allocate beta buffer"); | 587 | "cannot allocate beta buffer"); |
554 | goto fail_free_spill; | 588 | goto fail_free_spill; |
555 | } | 589 | } |
556 | 590 | ||
557 | err = gk20a_gmmu_alloc_map(vm, pagepool_size, | 591 | err = gr_gp10b_alloc_buffer(vm, |
558 | &(*gr_ctx)->t18x.pagepool_ctxsw_buffer); | 592 | pagepool_size, |
593 | &(*gr_ctx)->t18x.pagepool_ctxsw_buffer); | ||
559 | if (err) { | 594 | if (err) { |
560 | gk20a_err(dev_from_gk20a(vm->mm->g), | 595 | gk20a_err(dev_from_gk20a(vm->mm->g), |
561 | "cannot allocate page pool"); | 596 | "cannot allocate page pool"); |
diff --git a/drivers/gpu/nvgpu/gp10b/gr_gp10b.h b/drivers/gpu/nvgpu/gp10b/gr_gp10b.h index bf49ba6f..62b70a22 100644 --- a/drivers/gpu/nvgpu/gp10b/gr_gp10b.h +++ b/drivers/gpu/nvgpu/gp10b/gr_gp10b.h | |||
@@ -33,6 +33,8 @@ enum { | |||
33 | #define NVC0C0_SET_SHADER_EXCEPTIONS 0x1528 | 33 | #define NVC0C0_SET_SHADER_EXCEPTIONS 0x1528 |
34 | 34 | ||
35 | void gp10b_init_gr(struct gpu_ops *ops); | 35 | void gp10b_init_gr(struct gpu_ops *ops); |
36 | int gr_gp10b_alloc_buffer(struct vm_gk20a *vm, size_t size, | ||
37 | struct mem_desc *mem); | ||
36 | 38 | ||
37 | struct gr_t18x { | 39 | struct gr_t18x { |
38 | struct { | 40 | struct { |
diff --git a/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_gr_gp10b.c b/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_gr_gp10b.c index 5edaa819..c5c53b58 100644 --- a/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_gr_gp10b.c +++ b/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_gr_gp10b.c | |||
@@ -84,9 +84,9 @@ static int vgpu_gr_gp10b_alloc_gr_ctx(struct gk20a *g, | |||
84 | gk20a_dbg_info("gfxp context attrib cb size=%d", | 84 | gk20a_dbg_info("gfxp context attrib cb size=%d", |
85 | attrib_cb_size); | 85 | attrib_cb_size); |
86 | 86 | ||
87 | err = gk20a_gmmu_alloc_map(vm, | 87 | err = gr_gp10b_alloc_buffer(vm, |
88 | g->gr.t18x.ctx_vars.preempt_image_size, | 88 | g->gr.t18x.ctx_vars.preempt_image_size, |
89 | &gr_ctx->t18x.preempt_ctxsw_buffer); | 89 | &gr_ctx->t18x.preempt_ctxsw_buffer); |
90 | if (err) { | 90 | if (err) { |
91 | err = -ENOMEM; | 91 | err = -ENOMEM; |
92 | goto fail; | 92 | goto fail; |
@@ -95,8 +95,9 @@ static int vgpu_gr_gp10b_alloc_gr_ctx(struct gk20a *g, | |||
95 | p->gpu_va[TEGRA_VGPU_GR_BIND_CTXSW_BUFFER_MAIN] = desc->gpu_va; | 95 | p->gpu_va[TEGRA_VGPU_GR_BIND_CTXSW_BUFFER_MAIN] = desc->gpu_va; |
96 | p->size[TEGRA_VGPU_GR_BIND_CTXSW_BUFFER_MAIN] = desc->size; | 96 | p->size[TEGRA_VGPU_GR_BIND_CTXSW_BUFFER_MAIN] = desc->size; |
97 | 97 | ||
98 | err = gk20a_gmmu_alloc_map(vm, spill_size, | 98 | err = gr_gp10b_alloc_buffer(vm, |
99 | &gr_ctx->t18x.spill_ctxsw_buffer); | 99 | spill_size, |
100 | &gr_ctx->t18x.spill_ctxsw_buffer); | ||
100 | if (err) { | 101 | if (err) { |
101 | err = -ENOMEM; | 102 | err = -ENOMEM; |
102 | goto fail; | 103 | goto fail; |
@@ -105,8 +106,9 @@ static int vgpu_gr_gp10b_alloc_gr_ctx(struct gk20a *g, | |||
105 | p->gpu_va[TEGRA_VGPU_GR_BIND_CTXSW_BUFFER_SPILL] = desc->gpu_va; | 106 | p->gpu_va[TEGRA_VGPU_GR_BIND_CTXSW_BUFFER_SPILL] = desc->gpu_va; |
106 | p->size[TEGRA_VGPU_GR_BIND_CTXSW_BUFFER_SPILL] = desc->size; | 107 | p->size[TEGRA_VGPU_GR_BIND_CTXSW_BUFFER_SPILL] = desc->size; |
107 | 108 | ||
108 | err = gk20a_gmmu_alloc_map(vm, pagepool_size, | 109 | err = gr_gp10b_alloc_buffer(vm, |
109 | &gr_ctx->t18x.pagepool_ctxsw_buffer); | 110 | pagepool_size, |
111 | &gr_ctx->t18x.pagepool_ctxsw_buffer); | ||
110 | if (err) { | 112 | if (err) { |
111 | err = -ENOMEM; | 113 | err = -ENOMEM; |
112 | goto fail; | 114 | goto fail; |
@@ -116,8 +118,9 @@ static int vgpu_gr_gp10b_alloc_gr_ctx(struct gk20a *g, | |||
116 | desc->gpu_va; | 118 | desc->gpu_va; |
117 | p->size[TEGRA_VGPU_GR_BIND_CTXSW_BUFFER_PAGEPOOL] = desc->size; | 119 | p->size[TEGRA_VGPU_GR_BIND_CTXSW_BUFFER_PAGEPOOL] = desc->size; |
118 | 120 | ||
119 | err = gk20a_gmmu_alloc_map(vm, attrib_cb_size, | 121 | err = gr_gp10b_alloc_buffer(vm, |
120 | &gr_ctx->t18x.betacb_ctxsw_buffer); | 122 | attrib_cb_size, |
123 | &gr_ctx->t18x.betacb_ctxsw_buffer); | ||
121 | if (err) { | 124 | if (err) { |
122 | err = -ENOMEM; | 125 | err = -ENOMEM; |
123 | goto fail; | 126 | goto fail; |