summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Nieto <dmartineznie@nvidia.com>2017-10-23 16:58:37 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2017-10-26 20:56:08 -0400
commit0f8746130ba79ec82a4b0675bbe00ab1ba17d3f8 (patch)
tree697a3965e29d4e55f053e3a8fd7bb94aac8aa844
parent00e52529a8431a6520b8e1bbcbfa44b4cc86be80 (diff)
gpu: nvgpu: halify size of patch buffer
Allow per chip calculation of gr patch buffer size and set default to match hw default of 512 data-address pair entries (4K) bug 200350539 Change-Id: I6010c9e0304332825cb02612d3f10523ef27d128 Signed-off-by: David Nieto <dmartineznie@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1584033 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a.h1
-rw-r--r--drivers/gpu/nvgpu/gk20a/gr_gk20a.c17
-rw-r--r--drivers/gpu/nvgpu/gk20a/gr_gk20a.h9
-rw-r--r--drivers/gpu/nvgpu/gm20b/hal_gm20b.c1
-rw-r--r--drivers/gpu/nvgpu/gp106/hal_gp106.c1
-rw-r--r--drivers/gpu/nvgpu/gp10b/hal_gp10b.c1
-rw-r--r--drivers/gpu/nvgpu/vgpu/gm20b/vgpu_hal_gm20b.c1
-rw-r--r--drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c1
8 files changed, 29 insertions, 3 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h
index 80d85d65..d7fdffb0 100644
--- a/drivers/gpu/nvgpu/gk20a/gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/gk20a.h
@@ -172,6 +172,7 @@ struct gpu_ops {
172 u32 (*get_num_pce)(struct gk20a *g); 172 u32 (*get_num_pce)(struct gk20a *g);
173 } ce2; 173 } ce2;
174 struct { 174 struct {
175 u32 (*get_patch_slots)(struct gk20a *g);
175 int (*init_fs_state)(struct gk20a *g); 176 int (*init_fs_state)(struct gk20a *g);
176 int (*init_preemption_state)(struct gk20a *g); 177 int (*init_preemption_state)(struct gk20a *g);
177 void (*access_smpc_reg)(struct gk20a *g, u32 quad, u32 offset); 178 void (*access_smpc_reg)(struct gk20a *g, u32 quad, u32 offset);
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
index 71fe44a3..3c3ddc80 100644
--- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
@@ -714,7 +714,8 @@ void gr_gk20a_ctx_patch_write(struct gk20a *g,
714 if (patch) { 714 if (patch) {
715 u32 patch_slot = ch_ctx->patch_ctx.data_count * 715 u32 patch_slot = ch_ctx->patch_ctx.data_count *
716 PATCH_CTX_SLOTS_REQUIRED_PER_ENTRY; 716 PATCH_CTX_SLOTS_REQUIRED_PER_ENTRY;
717 if (patch_slot > (PATCH_CTX_SLOTS_MAX - 717 if (patch_slot > (PATCH_CTX_ENTRIES_FROM_SIZE(
718 ch_ctx->patch_ctx.mem.size) -
718 PATCH_CTX_SLOTS_REQUIRED_PER_ENTRY)) { 719 PATCH_CTX_SLOTS_REQUIRED_PER_ENTRY)) {
719 nvgpu_err(g, "failed to access patch_slot %d", 720 nvgpu_err(g, "failed to access patch_slot %d",
720 patch_slot); 721 patch_slot);
@@ -2813,17 +2814,29 @@ static void gr_gk20a_free_channel_gr_ctx(struct channel_gk20a *c)
2813 c->ch_ctx.gr_ctx = NULL; 2814 c->ch_ctx.gr_ctx = NULL;
2814} 2815}
2815 2816
2817u32 gr_gk20a_get_patch_slots(struct gk20a *g)
2818{
2819 return PATCH_CTX_SLOTS_PER_PAGE;
2820}
2821
2816static int gr_gk20a_alloc_channel_patch_ctx(struct gk20a *g, 2822static int gr_gk20a_alloc_channel_patch_ctx(struct gk20a *g,
2817 struct channel_gk20a *c) 2823 struct channel_gk20a *c)
2818{ 2824{
2819 struct patch_desc *patch_ctx = &c->ch_ctx.patch_ctx; 2825 struct patch_desc *patch_ctx = &c->ch_ctx.patch_ctx;
2820 struct vm_gk20a *ch_vm = c->vm; 2826 struct vm_gk20a *ch_vm = c->vm;
2827 u32 alloc_size;
2821 int err = 0; 2828 int err = 0;
2822 2829
2823 gk20a_dbg_fn(""); 2830 gk20a_dbg_fn("");
2824 2831
2832 alloc_size = g->ops.gr.get_patch_slots(g) *
2833 PATCH_CTX_SLOTS_REQUIRED_PER_ENTRY;
2834
2835 nvgpu_log(g, gpu_dbg_info, "patch buffer size in entries: %d",
2836 alloc_size);
2837
2825 err = nvgpu_dma_alloc_map_flags_sys(ch_vm, NVGPU_DMA_NO_KERNEL_MAPPING, 2838 err = nvgpu_dma_alloc_map_flags_sys(ch_vm, NVGPU_DMA_NO_KERNEL_MAPPING,
2826 PATCH_CTX_SLOTS_MAX * sizeof(u32), &patch_ctx->mem); 2839 alloc_size * sizeof(u32), &patch_ctx->mem);
2827 if (err) 2840 if (err)
2828 return err; 2841 return err;
2829 2842
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.h b/drivers/gpu/nvgpu/gk20a/gr_gk20a.h
index 0a685d01..db1a9514 100644
--- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.h
@@ -52,8 +52,14 @@
52 52
53#define GK20A_TIMEOUT_FPGA 100000 /* 100 sec */ 53#define GK20A_TIMEOUT_FPGA 100000 /* 100 sec */
54 54
55#define PATCH_CTX_SLOTS_MAX 128 55/*
56 * allocate a minimum of 1 page (4KB) worth of patch space, this is 512 entries
57 * of address and data pairs
58 */
56#define PATCH_CTX_SLOTS_REQUIRED_PER_ENTRY 2 59#define PATCH_CTX_SLOTS_REQUIRED_PER_ENTRY 2
60#define PATCH_CTX_SLOTS_PER_PAGE \
61 (PAGE_SIZE/(PATCH_CTX_SLOTS_REQUIRED_PER_ENTRY * sizeof(u32)))
62#define PATCH_CTX_ENTRIES_FROM_SIZE(size) (size/sizeof(u32))
57 63
58struct channel_gk20a; 64struct channel_gk20a;
59struct nvgpu_warpstate; 65struct nvgpu_warpstate;
@@ -756,5 +762,6 @@ void gk20a_gr_get_ovr_perf_regs(struct gk20a *g, u32 *num_ovr_perf_regs,
756 u32 **ovr_perf_regs); 762 u32 **ovr_perf_regs);
757void gk20a_gr_init_ctxsw_hdr_data(struct gk20a *g, 763void gk20a_gr_init_ctxsw_hdr_data(struct gk20a *g,
758 struct nvgpu_mem *mem); 764 struct nvgpu_mem *mem);
765u32 gr_gk20a_get_patch_slots(struct gk20a *g);
759 766
760#endif /*__GR_GK20A_H__*/ 767#endif /*__GR_GK20A_H__*/
diff --git a/drivers/gpu/nvgpu/gm20b/hal_gm20b.c b/drivers/gpu/nvgpu/gm20b/hal_gm20b.c
index d081fb24..69afb9bc 100644
--- a/drivers/gpu/nvgpu/gm20b/hal_gm20b.c
+++ b/drivers/gpu/nvgpu/gm20b/hal_gm20b.c
@@ -181,6 +181,7 @@ static const struct gpu_ops gm20b_ops = {
181 .isr_nonstall = gk20a_ce2_nonstall_isr, 181 .isr_nonstall = gk20a_ce2_nonstall_isr,
182 }, 182 },
183 .gr = { 183 .gr = {
184 .get_patch_slots = gr_gk20a_get_patch_slots,
184 .init_gpc_mmu = gr_gm20b_init_gpc_mmu, 185 .init_gpc_mmu = gr_gm20b_init_gpc_mmu,
185 .bundle_cb_defaults = gr_gm20b_bundle_cb_defaults, 186 .bundle_cb_defaults = gr_gm20b_bundle_cb_defaults,
186 .cb_size_default = gr_gm20b_cb_size_default, 187 .cb_size_default = gr_gm20b_cb_size_default,
diff --git a/drivers/gpu/nvgpu/gp106/hal_gp106.c b/drivers/gpu/nvgpu/gp106/hal_gp106.c
index c5b62948..f576278d 100644
--- a/drivers/gpu/nvgpu/gp106/hal_gp106.c
+++ b/drivers/gpu/nvgpu/gp106/hal_gp106.c
@@ -235,6 +235,7 @@ static const struct gpu_ops gp106_ops = {
235 .isr_nonstall = gp10b_ce_nonstall_isr, 235 .isr_nonstall = gp10b_ce_nonstall_isr,
236 }, 236 },
237 .gr = { 237 .gr = {
238 .get_patch_slots = gr_gk20a_get_patch_slots,
238 .init_gpc_mmu = gr_gm20b_init_gpc_mmu, 239 .init_gpc_mmu = gr_gm20b_init_gpc_mmu,
239 .bundle_cb_defaults = gr_gm20b_bundle_cb_defaults, 240 .bundle_cb_defaults = gr_gm20b_bundle_cb_defaults,
240 .cb_size_default = gr_gp106_cb_size_default, 241 .cb_size_default = gr_gp106_cb_size_default,
diff --git a/drivers/gpu/nvgpu/gp10b/hal_gp10b.c b/drivers/gpu/nvgpu/gp10b/hal_gp10b.c
index 7b5cc2ac..cbec89bc 100644
--- a/drivers/gpu/nvgpu/gp10b/hal_gp10b.c
+++ b/drivers/gpu/nvgpu/gp10b/hal_gp10b.c
@@ -190,6 +190,7 @@ static const struct gpu_ops gp10b_ops = {
190 .isr_nonstall = gp10b_ce_nonstall_isr, 190 .isr_nonstall = gp10b_ce_nonstall_isr,
191 }, 191 },
192 .gr = { 192 .gr = {
193 .get_patch_slots = gr_gk20a_get_patch_slots,
193 .init_gpc_mmu = gr_gm20b_init_gpc_mmu, 194 .init_gpc_mmu = gr_gm20b_init_gpc_mmu,
194 .bundle_cb_defaults = gr_gm20b_bundle_cb_defaults, 195 .bundle_cb_defaults = gr_gm20b_bundle_cb_defaults,
195 .cb_size_default = gr_gp10b_cb_size_default, 196 .cb_size_default = gr_gp10b_cb_size_default,
diff --git a/drivers/gpu/nvgpu/vgpu/gm20b/vgpu_hal_gm20b.c b/drivers/gpu/nvgpu/vgpu/gm20b/vgpu_hal_gm20b.c
index 81bcdc21..29eaf80b 100644
--- a/drivers/gpu/nvgpu/vgpu/gm20b/vgpu_hal_gm20b.c
+++ b/drivers/gpu/nvgpu/vgpu/gm20b/vgpu_hal_gm20b.c
@@ -77,6 +77,7 @@ static const struct gpu_ops vgpu_gm20b_ops = {
77 .get_num_pce = vgpu_ce_get_num_pce, 77 .get_num_pce = vgpu_ce_get_num_pce,
78 }, 78 },
79 .gr = { 79 .gr = {
80 .get_patch_slots = gr_gk20a_get_patch_slots,
80 .init_gpc_mmu = gr_gm20b_init_gpc_mmu, 81 .init_gpc_mmu = gr_gm20b_init_gpc_mmu,
81 .bundle_cb_defaults = gr_gm20b_bundle_cb_defaults, 82 .bundle_cb_defaults = gr_gm20b_bundle_cb_defaults,
82 .cb_size_default = gr_gm20b_cb_size_default, 83 .cb_size_default = gr_gm20b_cb_size_default,
diff --git a/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c b/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c
index 04a7349a..8dd63144 100644
--- a/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c
+++ b/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c
@@ -90,6 +90,7 @@ static const struct gpu_ops vgpu_gp10b_ops = {
90 .get_num_pce = vgpu_ce_get_num_pce, 90 .get_num_pce = vgpu_ce_get_num_pce,
91 }, 91 },
92 .gr = { 92 .gr = {
93 .get_patch_slots = gr_gk20a_get_patch_slots,
93 .init_gpc_mmu = gr_gm20b_init_gpc_mmu, 94 .init_gpc_mmu = gr_gm20b_init_gpc_mmu,
94 .bundle_cb_defaults = gr_gm20b_bundle_cb_defaults, 95 .bundle_cb_defaults = gr_gm20b_bundle_cb_defaults,
95 .cb_size_default = gr_gp10b_cb_size_default, 96 .cb_size_default = gr_gp10b_cb_size_default,