Files
linux-nvgpu/drivers/gpu/nvgpu/hal/fifo/userd_gv11b.c
Ramalingam C ad320f60b9 gpu: nvgpu: sema based gpfifo submission tracking
Implement a hw semaphore which is used to track the gpfifo submission.
This is implementation used when the userd.gp_get() is not defined and
also the feature flag NVGPU_SUPPORT_SEMA_BASED_GPFIFO_GET is set.

At the end of each job submitted, submit a semaphore to write the
gpfifo get pointer at hw semaphore addr. At next job submission
processing we will read the gpfifo.get from the designated hw semaphore
location.

JIRA NVGPU-9588

Change-Id: Ic88ace1a3f60e3f38f159e1861464ebcaea04469
Signed-off-by: Ramalingam C <ramalingamc@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2898143
Reviewed-by: svc-mobile-coverity <svc-mobile-coverity@nvidia.com>
Reviewed-by: Sagar Kamble <skamble@nvidia.com>
Reviewed-by: Martin Radev <mradev@nvidia.com>
Reviewed-by: Ankur Kishore <ankkishore@nvidia.com>
Tested-by: Martin Radev <mradev@nvidia.com>
GVS: Gerrit_Virtual_Submit <buildbot_gerritrpt@nvidia.com>
2023-06-08 10:44:37 -07:00

78 lines
2.5 KiB
C

/*
* GV11B USERD
*
* Copyright (c) 2015-2019, NVIDIA CORPORATION. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#include <nvgpu/gk20a.h>
#include <nvgpu/io.h>
#include <nvgpu/nvgpu_mem.h>
#include <nvgpu/channel.h>
#include <nvgpu/hw/gv11b/hw_ram_gv11b.h>
#include <nvgpu/channel_sync_semaphore.h>
#include "userd_gv11b.h"
u32 gv11b_userd_gp_get(struct gk20a *g, struct nvgpu_channel *ch)
{
struct nvgpu_mem *mem = ch->userd_mem;
u32 offset = ch->userd_offset / U32(sizeof(u32));
u32 ret;
/*
* NVGPU_SUPPORT_SEMA_BASED_GPFIFO_GET is enabled when userd get
* is not getting updated by gpu anymore.
*/
if (nvgpu_is_enabled(g, (u32)NVGPU_SUPPORT_SEMA_BASED_GPFIFO_GET)) {
nvgpu_channel_update_gpfifo_get(ch);
ret = ch->gpfifo.get;
} else {
ret = nvgpu_mem_rd32(g, mem, offset + ram_userd_gp_get_w());
}
return ret;
}
u64 gv11b_userd_pb_get(struct gk20a *g, struct nvgpu_channel *ch)
{
struct nvgpu_mem *mem = ch->userd_mem;
u32 offset = ch->userd_offset / U32(sizeof(u32));
u32 lo, hi;
lo = nvgpu_mem_rd32(g, mem, offset + ram_userd_get_w());
hi = nvgpu_mem_rd32(g, mem, offset + ram_userd_get_hi_w());
return ((u64)hi << 32) | lo;
}
void gv11b_userd_gp_put(struct gk20a *g, struct nvgpu_channel *ch)
{
struct nvgpu_mem *mem = ch->userd_mem;
u32 offset = ch->userd_offset / U32(sizeof(u32));
nvgpu_mem_wr32(g, mem, offset + ram_userd_gp_put_w(), ch->gpfifo.put);
/* Commit everything to GPU. */
nvgpu_mb();
g->ops.usermode.ring_doorbell(ch);
}