diff options
author | Sami Kiminki <skiminki@nvidia.com> | 2017-11-28 11:12:12 -0500 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2017-11-30 21:57:19 -0500 |
commit | d73ad6c07da23636c00c60effeeb53ea35847ee8 (patch) | |
tree | fc92c533909c84af308b10eb91a87e455e82dae4 /drivers/gpu/nvgpu/common | |
parent | 86a94230c6d57803d572bfba726e1b02db0e3dc3 (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>
Diffstat (limited to 'drivers/gpu/nvgpu/common')
4 files changed, 26 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 | ||