mirror of
git://nv-tegra.nvidia.com/linux-nv-oot.git
synced 2025-12-23 01:31:30 +03:00
host1x_emu: SyncpointIncre per-improvement
1. Add mechanism(s) to trigger syncpoint fence scan when syncpoint increment UMD called. Following methods are added. - METHOD-1: Check fence expire in user context when syncpoint increment UMD API is called. - METHOD-2: Add tasklet based mechanism that schedule tasklet to scan for syncpoint fence expiry. This also improve signaling latency. METHOD-1 is enabled by default, to enable METHOD-2 define MACRO "HOST1X_EMU_SYNC_INC_TASKLET". 2. Add interface "host1x_syncpt_fence_scan()" that can be called from client interrupt handler to initiate syncpoint fence scan. Jira HOSTX-5527 Change-Id: I4d5a0ba9fd67042d824a1df2794b316831001dc4 Signed-off-by: amitabhd <amitabhd@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3267144 Reviewed-by: Raghavendra Vishnu Kumar <rvk@nvidia.com> Reviewed-by: Sanif Veeras <sveeras@nvidia.com> GVS: buildbot_gerritrpt <buildbot_gerritrpt@nvidia.com> Reviewed-by: Leslin Varghese <lvarghese@nvidia.com>
This commit is contained in:
@@ -1,17 +1,33 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
* SPDX-License-Identifier: GPL-2.0-only
|
||||
*/
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
// SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
#include <linux/module.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/dma-fence.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/timekeeping.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#include "dev.h"
|
||||
#include "syncpt.h"
|
||||
|
||||
#ifdef HOST1X_EMU_SYNC_INC_TASKLET
|
||||
static void tasklet_fn(struct tasklet_struct *unused);
|
||||
static DEFINE_PER_CPU(struct host1x_syncpt *, tasklet_sp);
|
||||
|
||||
DECLARE_TASKLET(syncpt_tasklet, tasklet_fn);
|
||||
|
||||
static void tasklet_fn(struct tasklet_struct *unused)
|
||||
{
|
||||
struct host1x_syncpt *sp = NULL;
|
||||
|
||||
sp = this_cpu_read(tasklet_sp);
|
||||
if (sp != NULL)
|
||||
host1x_poll_irq_check_syncpt_fence(sp);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void syncpt_release(struct kref *ref)
|
||||
{
|
||||
struct host1x_syncpt *sp = container_of(ref, struct host1x_syncpt, ref);
|
||||
@@ -241,7 +257,17 @@ HOST1X_EMU_EXPORT_SYMBOL(host1x_syncpt_read_max);
|
||||
*/
|
||||
HOST1X_EMU_EXPORT_DECL(int, host1x_syncpt_incr(struct host1x_syncpt *sp))
|
||||
{
|
||||
return host1x_hw_syncpt_cpu_incr(sp->host, sp);
|
||||
int err;
|
||||
|
||||
err = host1x_hw_syncpt_cpu_incr(sp->host, sp);
|
||||
#ifdef HOST1X_EMU_SYNC_INC_TASKLET
|
||||
/*Improve Signaling performance*/
|
||||
this_cpu_write(tasklet_sp, sp);
|
||||
tasklet_schedule(&syncpt_tasklet);
|
||||
#else
|
||||
host1x_poll_irq_check_syncpt_fence(sp);
|
||||
#endif
|
||||
return err;
|
||||
}
|
||||
HOST1X_EMU_EXPORT_SYMBOL(host1x_syncpt_incr);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user