summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSami Kiminki <skiminki@nvidia.com>2017-11-28 11:12:12 -0500
committermobile promotions <svcmobile_promotions@nvidia.com>2017-11-30 21:57:19 -0500
commitd73ad6c07da23636c00c60effeeb53ea35847ee8 (patch)
treefc92c533909c84af308b10eb91a87e455e82dae4
parent86a94230c6d57803d572bfba726e1b02db0e3dc3 (diff)
gpu: nvgpu: Alignment check for compressible fixed-address mappings
Add an alignment check for compressible-kind fixed-address mappings. If we're using page size smaller than the comptag line coverage window, the GPU VA and the physical buffer offset must be aligned in respect to that window. Bug 1995897 Bug 2011640 Bug 2011668 Change-Id: If68043ee2828d54b9398d77553d10d35cc319236 Signed-off-by: Sami Kiminki <skiminki@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1606439 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
-rw-r--r--drivers/gpu/nvgpu/common/linux/vgpu/gm20b/vgpu_hal_gm20b.c1
-rw-r--r--drivers/gpu/nvgpu/common/linux/vgpu/gp10b/vgpu_hal_gp10b.c1
-rw-r--r--drivers/gpu/nvgpu/common/linux/vgpu/gv11b/vgpu_hal_gv11b.c1
-rw-r--r--drivers/gpu/nvgpu/common/mm/vm.c23
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a.h17
-rw-r--r--drivers/gpu/nvgpu/gm20b/fb_gm20b.c5
-rw-r--r--drivers/gpu/nvgpu/gm20b/fb_gm20b.h1
-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/gv100/hal_gv100.c1
-rw-r--r--drivers/gpu/nvgpu/gv11b/hal_gv11b.c1
12 files changed, 54 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/common/linux/vgpu/gm20b/vgpu_hal_gm20b.c b/drivers/gpu/nvgpu/common/linux/vgpu/gm20b/vgpu_hal_gm20b.c
index 0e560981..6f50dbb8 100644
--- a/drivers/gpu/nvgpu/common/linux/vgpu/gm20b/vgpu_hal_gm20b.c
+++ b/drivers/gpu/nvgpu/common/linux/vgpu/gm20b/vgpu_hal_gm20b.c
@@ -195,6 +195,7 @@ static const struct gpu_ops vgpu_gm20b_ops = {
195 gm20b_fb_set_use_full_comp_tag_line, 195 gm20b_fb_set_use_full_comp_tag_line,
196 .compression_page_size = gm20b_fb_compression_page_size, 196 .compression_page_size = gm20b_fb_compression_page_size,
197 .compressible_page_size = gm20b_fb_compressible_page_size, 197 .compressible_page_size = gm20b_fb_compressible_page_size,
198 .compression_align_mask = gm20b_fb_compression_align_mask,
198 .vpr_info_fetch = gm20b_fb_vpr_info_fetch, 199 .vpr_info_fetch = gm20b_fb_vpr_info_fetch,
199 .dump_vpr_wpr_info = gm20b_fb_dump_vpr_wpr_info, 200 .dump_vpr_wpr_info = gm20b_fb_dump_vpr_wpr_info,
200 .read_wpr_info = gm20b_fb_read_wpr_info, 201 .read_wpr_info = gm20b_fb_read_wpr_info,
diff --git a/drivers/gpu/nvgpu/common/linux/vgpu/gp10b/vgpu_hal_gp10b.c b/drivers/gpu/nvgpu/common/linux/vgpu/gp10b/vgpu_hal_gp10b.c
index acd0ad5d..7c376396 100644
--- a/drivers/gpu/nvgpu/common/linux/vgpu/gp10b/vgpu_hal_gp10b.c
+++ b/drivers/gpu/nvgpu/common/linux/vgpu/gp10b/vgpu_hal_gp10b.c
@@ -223,6 +223,7 @@ static const struct gpu_ops vgpu_gp10b_ops = {
223 gm20b_fb_set_use_full_comp_tag_line, 223 gm20b_fb_set_use_full_comp_tag_line,
224 .compression_page_size = gp10b_fb_compression_page_size, 224 .compression_page_size = gp10b_fb_compression_page_size,
225 .compressible_page_size = gp10b_fb_compressible_page_size, 225 .compressible_page_size = gp10b_fb_compressible_page_size,
226 .compression_align_mask = gm20b_fb_compression_align_mask,
226 .vpr_info_fetch = gm20b_fb_vpr_info_fetch, 227 .vpr_info_fetch = gm20b_fb_vpr_info_fetch,
227 .dump_vpr_wpr_info = gm20b_fb_dump_vpr_wpr_info, 228 .dump_vpr_wpr_info = gm20b_fb_dump_vpr_wpr_info,
228 .read_wpr_info = gm20b_fb_read_wpr_info, 229 .read_wpr_info = gm20b_fb_read_wpr_info,
diff --git a/drivers/gpu/nvgpu/common/linux/vgpu/gv11b/vgpu_hal_gv11b.c b/drivers/gpu/nvgpu/common/linux/vgpu/gv11b/vgpu_hal_gv11b.c
index a470377c..7d60bfb2 100644
--- a/drivers/gpu/nvgpu/common/linux/vgpu/gv11b/vgpu_hal_gv11b.c
+++ b/drivers/gpu/nvgpu/common/linux/vgpu/gv11b/vgpu_hal_gv11b.c
@@ -263,6 +263,7 @@ static const struct gpu_ops vgpu_gv11b_ops = {
263 gm20b_fb_set_use_full_comp_tag_line, 263 gm20b_fb_set_use_full_comp_tag_line,
264 .compression_page_size = gp10b_fb_compression_page_size, 264 .compression_page_size = gp10b_fb_compression_page_size,
265 .compressible_page_size = gp10b_fb_compressible_page_size, 265 .compressible_page_size = gp10b_fb_compressible_page_size,
266 .compression_align_mask = gm20b_fb_compression_align_mask,
266 .vpr_info_fetch = gm20b_fb_vpr_info_fetch, 267 .vpr_info_fetch = gm20b_fb_vpr_info_fetch,
267 .dump_vpr_wpr_info = gm20b_fb_dump_vpr_wpr_info, 268 .dump_vpr_wpr_info = gm20b_fb_dump_vpr_wpr_info,
268 .read_wpr_info = gm20b_fb_read_wpr_info, 269 .read_wpr_info = gm20b_fb_read_wpr_info,
diff --git a/drivers/gpu/nvgpu/common/mm/vm.c b/drivers/gpu/nvgpu/common/mm/vm.c
index 637632e0..f85089d5 100644
--- a/drivers/gpu/nvgpu/common/mm/vm.c
+++ b/drivers/gpu/nvgpu/common/mm/vm.c
@@ -847,6 +847,29 @@ struct nvgpu_mapped_buf *nvgpu_vm_map(struct vm_gk20a *vm,
847 goto clean_up; 847 goto clean_up;
848 } 848 }
849 849
850 if ((binfo.compr_kind != NVGPU_KIND_INVALID) &&
851 (flags & NVGPU_VM_MAP_FIXED_OFFSET)) {
852 /*
853 * Fixed-address compressible mapping is
854 * requested. Make sure we're respecting the alignment
855 * requirement for virtual addresses and buffer
856 * offsets.
857 *
858 * This check must be done before we may fall back to
859 * the incompressible kind.
860 */
861
862 const u64 offset_mask = g->ops.fb.compression_align_mask(g);
863
864 if ((map_addr & offset_mask) != (phys_offset & offset_mask)) {
865 nvgpu_log(g, gpu_dbg_map,
866 "Misaligned compressible-kind fixed-address "
867 "mapping");
868 err = -EINVAL;
869 goto clean_up;
870 }
871 }
872
850 if (binfo.compr_kind != NVGPU_KIND_INVALID) { 873 if (binfo.compr_kind != NVGPU_KIND_INVALID) {
851 struct gk20a_comptags comptags = { 0 }; 874 struct gk20a_comptags comptags = { 0 };
852 875
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h
index a361648f..c6bc129f 100644
--- a/drivers/gpu/nvgpu/gk20a/gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/gk20a.h
@@ -446,8 +446,25 @@ struct gpu_ops {
446 void (*init_kind_attr)(struct gk20a *g); 446 void (*init_kind_attr)(struct gk20a *g);
447 void (*set_mmu_page_size)(struct gk20a *g); 447 void (*set_mmu_page_size)(struct gk20a *g);
448 bool (*set_use_full_comp_tag_line)(struct gk20a *g); 448 bool (*set_use_full_comp_tag_line)(struct gk20a *g);
449
450 /*
451 * Compression tag line coverage. When mapping a compressible
452 * buffer, ctagline is increased when the virtual address
453 * crosses over the compression page boundary.
454 */
449 unsigned int (*compression_page_size)(struct gk20a *g); 455 unsigned int (*compression_page_size)(struct gk20a *g);
456
457 /*
458 * Minimum page size that can be used for compressible kinds.
459 */
450 unsigned int (*compressible_page_size)(struct gk20a *g); 460 unsigned int (*compressible_page_size)(struct gk20a *g);
461
462 /*
463 * Compressible kind mappings: Mask for the virtual and physical
464 * address bits that must match.
465 */
466 u32 (*compression_align_mask)(struct gk20a *g);
467
451 void (*dump_vpr_wpr_info)(struct gk20a *g); 468 void (*dump_vpr_wpr_info)(struct gk20a *g);
452 int (*vpr_info_fetch)(struct gk20a *g); 469 int (*vpr_info_fetch)(struct gk20a *g);
453 void (*read_wpr_info)(struct gk20a *g, 470 void (*read_wpr_info)(struct gk20a *g,
diff --git a/drivers/gpu/nvgpu/gm20b/fb_gm20b.c b/drivers/gpu/nvgpu/gm20b/fb_gm20b.c
index 1f8cc326..0157aa7a 100644
--- a/drivers/gpu/nvgpu/gm20b/fb_gm20b.c
+++ b/drivers/gpu/nvgpu/gm20b/fb_gm20b.c
@@ -70,6 +70,11 @@ unsigned int gm20b_fb_compressible_page_size(struct gk20a *g)
70 return SZ_64K; 70 return SZ_64K;
71} 71}
72 72
73u32 gm20b_fb_compression_align_mask(struct gk20a *g)
74{
75 return SZ_64K - 1;
76}
77
73void gm20b_fb_dump_vpr_wpr_info(struct gk20a *g) 78void gm20b_fb_dump_vpr_wpr_info(struct gk20a *g)
74{ 79{
75 u32 val; 80 u32 val;
diff --git a/drivers/gpu/nvgpu/gm20b/fb_gm20b.h b/drivers/gpu/nvgpu/gm20b/fb_gm20b.h
index 32d36f57..1d1d5899 100644
--- a/drivers/gpu/nvgpu/gm20b/fb_gm20b.h
+++ b/drivers/gpu/nvgpu/gm20b/fb_gm20b.h
@@ -31,6 +31,7 @@ void gm20b_fb_set_mmu_page_size(struct gk20a *g);
31bool gm20b_fb_set_use_full_comp_tag_line(struct gk20a *g); 31bool gm20b_fb_set_use_full_comp_tag_line(struct gk20a *g);
32unsigned int gm20b_fb_compression_page_size(struct gk20a *g); 32unsigned int gm20b_fb_compression_page_size(struct gk20a *g);
33unsigned int gm20b_fb_compressible_page_size(struct gk20a *g); 33unsigned int gm20b_fb_compressible_page_size(struct gk20a *g);
34u32 gm20b_fb_compression_align_mask(struct gk20a *g);
34void gm20b_fb_dump_vpr_wpr_info(struct gk20a *g); 35void gm20b_fb_dump_vpr_wpr_info(struct gk20a *g);
35void gm20b_fb_read_wpr_info(struct gk20a *g, struct wpr_carveout_info *inf); 36void gm20b_fb_read_wpr_info(struct gk20a *g, struct wpr_carveout_info *inf);
36int gm20b_fb_vpr_info_fetch(struct gk20a *g); 37int gm20b_fb_vpr_info_fetch(struct gk20a *g);
diff --git a/drivers/gpu/nvgpu/gm20b/hal_gm20b.c b/drivers/gpu/nvgpu/gm20b/hal_gm20b.c
index 920a3e9b..3ef11d11 100644
--- a/drivers/gpu/nvgpu/gm20b/hal_gm20b.c
+++ b/drivers/gpu/nvgpu/gm20b/hal_gm20b.c
@@ -321,6 +321,7 @@ static const struct gpu_ops gm20b_ops = {
321 gm20b_fb_set_use_full_comp_tag_line, 321 gm20b_fb_set_use_full_comp_tag_line,
322 .compression_page_size = gm20b_fb_compression_page_size, 322 .compression_page_size = gm20b_fb_compression_page_size,
323 .compressible_page_size = gm20b_fb_compressible_page_size, 323 .compressible_page_size = gm20b_fb_compressible_page_size,
324 .compression_align_mask = gm20b_fb_compression_align_mask,
324 .vpr_info_fetch = gm20b_fb_vpr_info_fetch, 325 .vpr_info_fetch = gm20b_fb_vpr_info_fetch,
325 .dump_vpr_wpr_info = gm20b_fb_dump_vpr_wpr_info, 326 .dump_vpr_wpr_info = gm20b_fb_dump_vpr_wpr_info,
326 .read_wpr_info = gm20b_fb_read_wpr_info, 327 .read_wpr_info = gm20b_fb_read_wpr_info,
diff --git a/drivers/gpu/nvgpu/gp106/hal_gp106.c b/drivers/gpu/nvgpu/gp106/hal_gp106.c
index d63398c7..a3a58903 100644
--- a/drivers/gpu/nvgpu/gp106/hal_gp106.c
+++ b/drivers/gpu/nvgpu/gp106/hal_gp106.c
@@ -378,6 +378,7 @@ static const struct gpu_ops gp106_ops = {
378 gm20b_fb_set_use_full_comp_tag_line, 378 gm20b_fb_set_use_full_comp_tag_line,
379 .compression_page_size = gp10b_fb_compression_page_size, 379 .compression_page_size = gp10b_fb_compression_page_size,
380 .compressible_page_size = gp10b_fb_compressible_page_size, 380 .compressible_page_size = gp10b_fb_compressible_page_size,
381 .compression_align_mask = gm20b_fb_compression_align_mask,
381 .vpr_info_fetch = gm20b_fb_vpr_info_fetch, 382 .vpr_info_fetch = gm20b_fb_vpr_info_fetch,
382 .dump_vpr_wpr_info = gm20b_fb_dump_vpr_wpr_info, 383 .dump_vpr_wpr_info = gm20b_fb_dump_vpr_wpr_info,
383 .read_wpr_info = gm20b_fb_read_wpr_info, 384 .read_wpr_info = gm20b_fb_read_wpr_info,
diff --git a/drivers/gpu/nvgpu/gp10b/hal_gp10b.c b/drivers/gpu/nvgpu/gp10b/hal_gp10b.c
index 5ae6b638..0186ba00 100644
--- a/drivers/gpu/nvgpu/gp10b/hal_gp10b.c
+++ b/drivers/gpu/nvgpu/gp10b/hal_gp10b.c
@@ -346,6 +346,7 @@ static const struct gpu_ops gp10b_ops = {
346 gm20b_fb_set_use_full_comp_tag_line, 346 gm20b_fb_set_use_full_comp_tag_line,
347 .compression_page_size = gp10b_fb_compression_page_size, 347 .compression_page_size = gp10b_fb_compression_page_size,
348 .compressible_page_size = gp10b_fb_compressible_page_size, 348 .compressible_page_size = gp10b_fb_compressible_page_size,
349 .compression_align_mask = gm20b_fb_compression_align_mask,
349 .vpr_info_fetch = gm20b_fb_vpr_info_fetch, 350 .vpr_info_fetch = gm20b_fb_vpr_info_fetch,
350 .dump_vpr_wpr_info = gm20b_fb_dump_vpr_wpr_info, 351 .dump_vpr_wpr_info = gm20b_fb_dump_vpr_wpr_info,
351 .read_wpr_info = gm20b_fb_read_wpr_info, 352 .read_wpr_info = gm20b_fb_read_wpr_info,
diff --git a/drivers/gpu/nvgpu/gv100/hal_gv100.c b/drivers/gpu/nvgpu/gv100/hal_gv100.c
index 4044c4b5..36ac029b 100644
--- a/drivers/gpu/nvgpu/gv100/hal_gv100.c
+++ b/drivers/gpu/nvgpu/gv100/hal_gv100.c
@@ -430,6 +430,7 @@ static const struct gpu_ops gv100_ops = {
430 gm20b_fb_set_use_full_comp_tag_line, 430 gm20b_fb_set_use_full_comp_tag_line,
431 .compression_page_size = gp10b_fb_compression_page_size, 431 .compression_page_size = gp10b_fb_compression_page_size,
432 .compressible_page_size = gp10b_fb_compressible_page_size, 432 .compressible_page_size = gp10b_fb_compressible_page_size,
433 .compression_align_mask = gm20b_fb_compression_align_mask,
433 .vpr_info_fetch = gm20b_fb_vpr_info_fetch, 434 .vpr_info_fetch = gm20b_fb_vpr_info_fetch,
434 .dump_vpr_wpr_info = gm20b_fb_dump_vpr_wpr_info, 435 .dump_vpr_wpr_info = gm20b_fb_dump_vpr_wpr_info,
435 .read_wpr_info = gm20b_fb_read_wpr_info, 436 .read_wpr_info = gm20b_fb_read_wpr_info,
diff --git a/drivers/gpu/nvgpu/gv11b/hal_gv11b.c b/drivers/gpu/nvgpu/gv11b/hal_gv11b.c
index e6cf0e62..db24a68e 100644
--- a/drivers/gpu/nvgpu/gv11b/hal_gv11b.c
+++ b/drivers/gpu/nvgpu/gv11b/hal_gv11b.c
@@ -403,6 +403,7 @@ static const struct gpu_ops gv11b_ops = {
403 gm20b_fb_set_use_full_comp_tag_line, 403 gm20b_fb_set_use_full_comp_tag_line,
404 .compression_page_size = gp10b_fb_compression_page_size, 404 .compression_page_size = gp10b_fb_compression_page_size,
405 .compressible_page_size = gp10b_fb_compressible_page_size, 405 .compressible_page_size = gp10b_fb_compressible_page_size,
406 .compression_align_mask = gm20b_fb_compression_align_mask,
406 .vpr_info_fetch = gm20b_fb_vpr_info_fetch, 407 .vpr_info_fetch = gm20b_fb_vpr_info_fetch,
407 .dump_vpr_wpr_info = gm20b_fb_dump_vpr_wpr_info, 408 .dump_vpr_wpr_info = gm20b_fb_dump_vpr_wpr_info,
408 .read_wpr_info = gm20b_fb_read_wpr_info, 409 .read_wpr_info = gm20b_fb_read_wpr_info,