mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-22 09:12:24 +03:00
gpu: nvgpu: track syncpt max internally
The max values that the Linux nvhost driver tracks are adding some complexity to our wrapper APIs. Max values are used only for internal submit syncpoint tracking, so implement that tracking in the sync code by just storing the last value that the syncpoing will reach after all jobs are complete. The value is a simple u32. It's accessed from functions in the submit path that already is serialized, so there's no worrying about atomic modifications. Previously nvhost_syncpt_set_min_eq_max_ext() was used to reset the syncpoint when necessary. Now with the internal max value we'll use nvhost_syncpt_set_minval(), so add a wrapper for it. The maxval reported with the user syncpoint allocation is just the current value at allocation time since no jobs have affected it yet; there is no means for the kernel to track the max value of user syncpoints. Jira NVGPU-5506 Change-Id: I34672eaa7fe3af36b2fbac92d11babe2bc6a2d2b Signed-off-by: Konsta Hölttä <kholtta@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2400635 Tested-by: mobile promotions <svcmobile_promotions@nvidia.com> Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
This commit is contained in:
committed by
Alex Waterman
parent
b062081c52
commit
5e570610b3
@@ -1087,6 +1087,7 @@ static int nvgpu_ioctl_channel_get_user_syncpoint(struct nvgpu_channel *ch,
|
||||
{
|
||||
#ifdef CONFIG_TEGRA_GK20A_NVHOST
|
||||
struct gk20a *g = ch->g;
|
||||
int err;
|
||||
|
||||
if (!nvgpu_is_enabled(g, NVGPU_SUPPORT_USER_SYNCPOINT)) {
|
||||
nvgpu_err(g, "user syncpoints not supported");
|
||||
@@ -1116,8 +1117,17 @@ static int nvgpu_ioctl_channel_get_user_syncpoint(struct nvgpu_channel *ch,
|
||||
}
|
||||
|
||||
args->syncpoint_id = nvgpu_channel_user_syncpt_get_id(ch->user_sync);
|
||||
args->syncpoint_max = nvgpu_nvhost_syncpt_read_maxval(g->nvhost,
|
||||
args->syncpoint_id);
|
||||
|
||||
/* The current value is the max we're expecting at the moment */
|
||||
err = nvgpu_nvhost_syncpt_read_ext_check(g->nvhost, args->syncpoint_id,
|
||||
&args->syncpoint_max);
|
||||
if (err != 0) {
|
||||
nvgpu_mutex_acquire(&ch->sync_lock);
|
||||
nvgpu_channel_user_syncpt_destroy(ch->user_sync);
|
||||
nvgpu_mutex_release(&ch->sync_lock);
|
||||
return err;
|
||||
}
|
||||
|
||||
if (nvgpu_is_enabled(g, NVGPU_SUPPORT_SYNCPOINT_ADDRESS)) {
|
||||
args->gpu_va =
|
||||
nvgpu_channel_user_syncpt_get_address(ch->user_sync);
|
||||
|
||||
Reference in New Issue
Block a user