gpu: nvgpu: report number of syncpoints in nvgpu_as_get_sync_ro_map_arg

Add reporting for the number of syncpoints when mapping the RO
shim. This allows the userspace to perform boundary condition checks
when computing the GPU VA for a syncpoint.

JIRA GCSS-1579

Change-Id: Ia6c9eee917d2c1e08f9905701e03f2b09e01ba60
Signed-off-by: Sami Kiminki <skiminki@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2533981
Reviewed-by: Seshendra Gadagottu <sgadagottu@nvidia.com>
Reviewed-by: Lakshmanan M <lm@nvidia.com>
Reviewed-by: Deepak Nibade <dnibade@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
GVS: Gerrit_Virtual_Submit
This commit is contained in:
Sami Kiminki
2021-05-24 16:49:36 +03:00
committed by mobile promotions
parent 8834275906
commit 5f6ff29aea
8 changed files with 25 additions and 10 deletions

View File

@@ -52,7 +52,7 @@ int gv11b_syncpt_alloc_buf(struct nvgpu_channel *c,
u32 syncpt_id, struct nvgpu_mem *syncpt_buf);
int gv11b_syncpt_get_sync_ro_map(struct vm_gk20a *vm,
u64 *base_gpuva, u32 *sync_size);
u64 *base_gpuva, u32 *sync_size, u32 *num_syncpoints);
#else

View File

@@ -105,10 +105,11 @@ void gv11b_syncpt_free_buf(struct nvgpu_channel *c,
}
int gv11b_syncpt_get_sync_ro_map(struct vm_gk20a *vm,
u64 *base_gpuva, u32 *sync_size)
u64 *base_gpuva, u32 *sync_size, u32 *num_syncpoints)
{
struct gk20a *g = gk20a_from_vm(vm);
int err;
size_t tmp;
nvgpu_mutex_acquire(&vm->syncpt_ro_map_lock);
err = set_syncpt_ro_map_gpu_va_locked(vm);
@@ -120,5 +121,8 @@ int gv11b_syncpt_get_sync_ro_map(struct vm_gk20a *vm,
*base_gpuva = vm->syncpt_ro_map_gpu_va;
*sync_size = g->syncpt_size;
tmp = g->syncpt_size ? (g->syncpt_unit_size / g->syncpt_size) : 0U;
*num_syncpoints = (tmp <= U32_MAX) ? tmp : U32_MAX;
return 0;
}

View File

@@ -131,10 +131,11 @@ void vgpu_gv11b_syncpt_free_buf(struct nvgpu_channel *c,
}
int vgpu_gv11b_syncpt_get_sync_ro_map(struct vm_gk20a *vm,
u64 *base_gpuva, u32 *sync_size)
u64 *base_gpuva, u32 *sync_size, u32 *num_syncpoints)
{
struct gk20a *g = gk20a_from_vm(vm);
int err;
size_t tmp;
nvgpu_mutex_acquire(&vm->syncpt_ro_map_lock);
err = set_syncpt_ro_map_gpu_va_locked(vm);
@@ -146,6 +147,9 @@ int vgpu_gv11b_syncpt_get_sync_ro_map(struct vm_gk20a *vm,
*base_gpuva = vm->syncpt_ro_map_gpu_va;
*sync_size = g->syncpt_size;
tmp = g->syncpt_size ? (g->syncpt_unit_size / g->syncpt_size) : 0U;
*num_syncpoints = (tmp <= U32_MAX) ? tmp : U32_MAX;
return 0;
}
#endif /* CONFIG_TEGRA_GK20A_NVHOST */

View File

@@ -35,5 +35,5 @@ int vgpu_gv11b_syncpt_alloc_buf(struct nvgpu_channel *c,
void vgpu_gv11b_syncpt_free_buf(struct nvgpu_channel *c,
struct nvgpu_mem *syncpt_buf);
int vgpu_gv11b_syncpt_get_sync_ro_map(struct vm_gk20a *vm,
u64 *base_gpuva, u32 *sync_size);
u64 *base_gpuva, u32 *sync_size, u32 *num_syncpoints);
#endif /* NVGPU_SYNCPT_CMDBUF_GV11B_VGPU_H */

View File

@@ -44,8 +44,9 @@ struct gops_sync_syncpt {
* @param vm [in] VM area for channel.
* @param base_gpu [out] Base GPU VA for mapped
* syncpoint aperture.
* @param sync_size [out] Size of syncpoint aperture
* in bytes.
* @param sync_size [out] Size per syncpoint in bytes.
* @param num_syncpoints [out] Number of syncpoints in the
* aperture.
*
* Map syncpoint aperture in GPU virtual memory as read-only:
* - Acquire syncpoint read-only map lock.
@@ -53,12 +54,14 @@ struct gops_sync_syncpt {
* if not already mapped. Map as read-only.
* - Release syncpoint read-only map lock.
*
* The syncpoint shim mapping size is sync_size * num_syncpoints.
*
* @return 0 in case of success, < 0 in case of failure.
* @retval -ENOMEM if syncpoint aperture could not be
* mapped to GPU virtual memory.
*/
int (*get_sync_ro_map)(struct vm_gk20a *vm,
u64 *base_gpuva, u32 *sync_size);
u64 *base_gpuva, u32 *sync_size, u32 *num_syncpoints);
/** @cond DOXYGEN_SHOULD_SKIP_THIS */
int (*alloc_buf)(struct nvgpu_channel *c,

View File

@@ -281,6 +281,7 @@ static int nvgpu_as_ioctl_get_sync_ro_map(
struct gk20a *g = gk20a_from_vm(vm);
u64 base_gpuva;
u32 sync_size;
u32 num_syncpoints;
int err = 0;
if (g->ops.sync.syncpt.get_sync_ro_map == NULL)
@@ -289,12 +290,14 @@ static int nvgpu_as_ioctl_get_sync_ro_map(
if (!nvgpu_has_syncpoints(g))
return -EINVAL;
err = g->ops.sync.syncpt.get_sync_ro_map(vm, &base_gpuva, &sync_size);
err = g->ops.sync.syncpt.get_sync_ro_map(vm, &base_gpuva, &sync_size,
&num_syncpoints);
if (err)
return err;
args->base_gpuva = base_gpuva;
args->sync_size = sync_size;
args->num_syncpoints = num_syncpoints;
return err;
#else

View File

@@ -375,7 +375,7 @@ struct nvgpu_as_map_buffer_batch_args {
struct nvgpu_as_get_sync_ro_map_args {
__u64 base_gpuva;
__u32 sync_size;
__u32 padding;
__u32 num_syncpoints;
};
/*

View File

@@ -341,6 +341,7 @@ int test_sync_get_ro_map(struct unit_module *m, struct gk20a *g, void *args)
{
u64 base_gpuva = 0U;
u32 sync_size = 0U;
u32 num_syncpoints = 0U;
u32 branches;
int err = 0;
@@ -366,7 +367,7 @@ int test_sync_get_ro_map(struct unit_module *m, struct gk20a *g, void *args)
unit_info(m, "%s branch: %s\n", __func__, f_sync_get_ro_map[branches]);
err = g->ops.sync.syncpt.get_sync_ro_map(ch->vm,
&base_gpuva, &sync_size);
&base_gpuva, &sync_size, &num_syncpoints);
if (branches < F_SYNC_GET_RO_MAP_FAIL) {
if(err != 0) {