video: tegra: nvmap: Allow CPU read on VPR buffers

This patch allows CPU to read and mmap VPR buffers by restricting CPU
VPR read restrictions for pre-si platforms. The knob for controlling the
access is /sys/kernel/debug/nvmap/vpr/vpr_cpu_acces and by default VPR
CPU read is disallowed.
This change is necessary to support pre-si VPR validation for platforms
where there may not be a HW engine that supports CRC computation for VPR
buffers.

Bug 4670086

Change-Id: Ic0d575abbda3cdda10f075a2c7092ced09723333
Signed-off-by: Ashish Mhetre <amhetre@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3145680
Reviewed-by: Sachin Nikam <snikam@nvidia.com>
This commit is contained in:
Ashish Mhetre
2024-05-28 04:35:44 +00:00
committed by mobile promotions
parent 6fea0b4122
commit acc19f5003
3 changed files with 20 additions and 6 deletions

View File

@@ -1,14 +1,18 @@
// SPDX-License-Identifier: GPL-2.0-only // SPDX-License-Identifier: GPL-2.0-only
/* /*
* Copyright (c) 2011-2023, NVIDIA CORPORATION. All rights reserved. * Copyright (c) 2011-2024, NVIDIA CORPORATION. All rights reserved.
* *
* Interface with nvmap carveouts * Interface with nvmap carveouts
*/ */
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <soc/tegra/fuse-helper.h>
#include "nvmap_priv.h" #include "nvmap_priv.h"
bool vpr_cpu_access;
extern struct nvmap_device *nvmap_dev; extern struct nvmap_device *nvmap_dev;
extern const struct file_operations debug_clients_fops; extern const struct file_operations debug_clients_fops;
@@ -125,6 +129,10 @@ int nvmap_create_carveout(const struct nvmap_platform_carveout *co)
#endif /* NVMAP_CONFIG_DEBUG_MAPS */ #endif /* NVMAP_CONFIG_DEBUG_MAPS */
nvmap_heap_debugfs_init(heap_root, nvmap_heap_debugfs_init(heap_root,
node->carveout); node->carveout);
if (!tegra_platform_is_silicon() && node->heap_bit == NVMAP_HEAP_CARVEOUT_VPR)
debugfs_create_bool("allow_cpu_access", S_IRUGO | S_IWUGO,
heap_root, (bool *)&vpr_cpu_access);
} }
} }
out: out:

View File

@@ -35,6 +35,8 @@
#define NVMAP_DMABUF_ATTACH nvmap_dmabuf_attach #define NVMAP_DMABUF_ATTACH nvmap_dmabuf_attach
extern bool vpr_cpu_access;
struct nvmap_handle_sgt { struct nvmap_handle_sgt {
enum dma_data_direction dir; enum dma_data_direction dir;
struct sg_table *sgt; struct sg_table *sgt;
@@ -380,12 +382,14 @@ int __nvmap_map(struct nvmap_handle *h, struct vm_area_struct *vma)
nvmap_handle_put(h); nvmap_handle_put(h);
return -EPERM; return -EPERM;
} }
/* /*
* Don't allow mmap on VPR memory as it would be mapped * VPR memory would be mapped as device memory.
* as device memory. User space shouldn't be accessing * User space shouldn't be accessing device memory.
* device memory. * NvGPU require to access VPR from user-space for validation on pre-sil.
* So, allow VPR CPU access only if vpr_cpu_access flag is set else don't allow.
*/ */
if (h->heap_type == NVMAP_HEAP_CARVEOUT_VPR) { if (!vpr_cpu_access && h->heap_type == NVMAP_HEAP_CARVEOUT_VPR) {
nvmap_handle_put(h); nvmap_handle_put(h);
return -EPERM; return -EPERM;
} }

View File

@@ -44,6 +44,7 @@
MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver); MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver);
#endif #endif
extern bool vpr_cpu_access;
static ssize_t rw_handle(struct nvmap_client *client, struct nvmap_handle *h, static ssize_t rw_handle(struct nvmap_client *client, struct nvmap_handle *h,
int is_read, unsigned long h_offs, int is_read, unsigned long h_offs,
@@ -549,7 +550,8 @@ int nvmap_ioctl_rw_handle(struct file *filp, int is_read, void __user *arg,
goto fail; goto fail;
} }
if (is_read && h->heap_type == NVMAP_HEAP_CARVEOUT_VPR) { if (!vpr_cpu_access && is_read &&
h->heap_type == NVMAP_HEAP_CARVEOUT_VPR) {
pr_err("CPU read operation is not allowed on VPR carveout\n"); pr_err("CPU read operation is not allowed on VPR carveout\n");
err = -EPERM; err = -EPERM;
goto fail; goto fail;