18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * seqno-fence, using a dma-buf to synchronize fencing
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (C) 2012 Texas Instruments
68c2ecf20Sopenharmony_ci * Copyright (C) 2012-2014 Canonical Ltd
78c2ecf20Sopenharmony_ci * Authors:
88c2ecf20Sopenharmony_ci *   Rob Clark <robdclark@gmail.com>
98c2ecf20Sopenharmony_ci *   Maarten Lankhorst <maarten.lankhorst@canonical.com>
108c2ecf20Sopenharmony_ci */
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <linux/slab.h>
138c2ecf20Sopenharmony_ci#include <linux/export.h>
148c2ecf20Sopenharmony_ci#include <linux/seqno-fence.h>
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_cistatic const char *seqno_fence_get_driver_name(struct dma_fence *fence)
178c2ecf20Sopenharmony_ci{
188c2ecf20Sopenharmony_ci	struct seqno_fence *seqno_fence = to_seqno_fence(fence);
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci	return seqno_fence->ops->get_driver_name(fence);
218c2ecf20Sopenharmony_ci}
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_cistatic const char *seqno_fence_get_timeline_name(struct dma_fence *fence)
248c2ecf20Sopenharmony_ci{
258c2ecf20Sopenharmony_ci	struct seqno_fence *seqno_fence = to_seqno_fence(fence);
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci	return seqno_fence->ops->get_timeline_name(fence);
288c2ecf20Sopenharmony_ci}
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_cistatic bool seqno_enable_signaling(struct dma_fence *fence)
318c2ecf20Sopenharmony_ci{
328c2ecf20Sopenharmony_ci	struct seqno_fence *seqno_fence = to_seqno_fence(fence);
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci	return seqno_fence->ops->enable_signaling(fence);
358c2ecf20Sopenharmony_ci}
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_cistatic bool seqno_signaled(struct dma_fence *fence)
388c2ecf20Sopenharmony_ci{
398c2ecf20Sopenharmony_ci	struct seqno_fence *seqno_fence = to_seqno_fence(fence);
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci	return seqno_fence->ops->signaled && seqno_fence->ops->signaled(fence);
428c2ecf20Sopenharmony_ci}
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_cistatic void seqno_release(struct dma_fence *fence)
458c2ecf20Sopenharmony_ci{
468c2ecf20Sopenharmony_ci	struct seqno_fence *f = to_seqno_fence(fence);
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci	dma_buf_put(f->sync_buf);
498c2ecf20Sopenharmony_ci	if (f->ops->release)
508c2ecf20Sopenharmony_ci		f->ops->release(fence);
518c2ecf20Sopenharmony_ci	else
528c2ecf20Sopenharmony_ci		dma_fence_free(&f->base);
538c2ecf20Sopenharmony_ci}
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_cistatic signed long seqno_wait(struct dma_fence *fence, bool intr,
568c2ecf20Sopenharmony_ci			      signed long timeout)
578c2ecf20Sopenharmony_ci{
588c2ecf20Sopenharmony_ci	struct seqno_fence *f = to_seqno_fence(fence);
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci	return f->ops->wait(fence, intr, timeout);
618c2ecf20Sopenharmony_ci}
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ciconst struct dma_fence_ops seqno_fence_ops = {
648c2ecf20Sopenharmony_ci	.get_driver_name = seqno_fence_get_driver_name,
658c2ecf20Sopenharmony_ci	.get_timeline_name = seqno_fence_get_timeline_name,
668c2ecf20Sopenharmony_ci	.enable_signaling = seqno_enable_signaling,
678c2ecf20Sopenharmony_ci	.signaled = seqno_signaled,
688c2ecf20Sopenharmony_ci	.wait = seqno_wait,
698c2ecf20Sopenharmony_ci	.release = seqno_release,
708c2ecf20Sopenharmony_ci};
718c2ecf20Sopenharmony_ciEXPORT_SYMBOL(seqno_fence_ops);
72