mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-22 17:36:20 +03:00
Guard nvgpu_os_fence_syncpt_fdget() with an nvgpu_has_syncpoints() check. Even when CONFIG_TEGRA_GK20A_NVHOST is set, the platform data bit can be disabled independently; on Linux we have a runtime flag to disable them, too. If nvgpu doesn't have syncpt support, don't try reading syncpt-based sync files. If a sema-only-backed channel sync is given a syncpoint-based prefence fd, we can't wait for it with the current design that couples waits and increments in one interface. This should eventually be fixed, but for now the extra check at least guards another interesting case. A sync file with a zero fence count can be trivially accepted as either a valid syncpoint fence or a sema fence. If only semas are supported, and the syncpt check that happens first would turn the empty fd into a syncpt-based sync fence, the sema wait layer would wrongly reject it. Jira NVGPU-4548 Change-Id: Ib40c2d9a6a25812c5e24eef52c1d1a4f81eeed83 Signed-off-by: Konsta Hölttä <kholtta@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2325733 (cherry picked from commit 877f99d7c9977dfea14480a1b0488c990b813d1d) Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2326044 Reviewed-by: automaticguardword <automaticguardword@nvidia.com> Reviewed-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> GVS: Gerrit_Virtual_Submit Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
83 lines
2.1 KiB
C
83 lines
2.1 KiB
C
/*
|
|
* Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms and conditions of the GNU General Public License,
|
|
* version 2, as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#include <nvgpu/types.h>
|
|
#include <nvgpu/os_fence.h>
|
|
#include <nvgpu/linux/os_fence_android.h>
|
|
#include <nvgpu/gk20a.h>
|
|
#include <nvgpu/channel.h>
|
|
#include <nvgpu/nvhost.h>
|
|
|
|
#include "../drivers/staging/android/sync.h"
|
|
|
|
inline struct sync_fence *nvgpu_get_sync_fence(struct nvgpu_os_fence *s)
|
|
{
|
|
struct sync_fence *fence = (struct sync_fence *)s->priv;
|
|
return fence;
|
|
}
|
|
|
|
static void nvgpu_os_fence_clear(struct nvgpu_os_fence *fence_out)
|
|
{
|
|
fence_out->priv = NULL;
|
|
fence_out->g = NULL;
|
|
fence_out->ops = NULL;
|
|
}
|
|
|
|
void nvgpu_os_fence_init(struct nvgpu_os_fence *fence_out,
|
|
struct gk20a *g, const struct nvgpu_os_fence_ops *fops,
|
|
struct sync_fence *fence)
|
|
{
|
|
fence_out->g = g;
|
|
fence_out->ops = fops;
|
|
fence_out->priv = (void *)fence;
|
|
}
|
|
|
|
void nvgpu_os_fence_android_drop_ref(struct nvgpu_os_fence *s)
|
|
{
|
|
struct sync_fence *fence = nvgpu_get_sync_fence(s);
|
|
|
|
sync_fence_put(fence);
|
|
|
|
nvgpu_os_fence_clear(s);
|
|
}
|
|
|
|
void nvgpu_os_fence_android_install_fd(struct nvgpu_os_fence *s, int fd)
|
|
{
|
|
struct sync_fence *fence = nvgpu_get_sync_fence(s);
|
|
|
|
sync_fence_get(fence);
|
|
sync_fence_install(fence, fd);
|
|
}
|
|
|
|
int nvgpu_os_fence_fdget(struct nvgpu_os_fence *fence_out,
|
|
struct nvgpu_channel *c, int fd)
|
|
{
|
|
int err = -ENOSYS;
|
|
|
|
#ifdef CONFIG_TEGRA_GK20A_NVHOST
|
|
if (nvgpu_has_syncpoints(c->g)) {
|
|
err = nvgpu_os_fence_syncpt_fdget(fence_out, c, fd);
|
|
}
|
|
#endif
|
|
|
|
if (err)
|
|
err = nvgpu_os_fence_sema_fdget(fence_out, c, fd);
|
|
|
|
if (err)
|
|
nvgpu_err(c->g, "error obtaining fence from fd %d", fd);
|
|
|
|
return err;
|
|
}
|