1/* 2 * seqno-fence, using a dma-buf to synchronize fencing 3 * 4 * Copyright (C) 2012 Texas Instruments 5 * Copyright (C) 2012-2014 Canonical Ltd 6 * Authors: 7 * Rob Clark <robdclark@gmail.com> 8 * Maarten Lankhorst <maarten.lankhorst@canonical.com> 9 * 10 * This program is free software; you can redistribute it and/or modify it 11 * under the terms of the GNU General Public License version 2 as published by 12 * the Free Software Foundation. 13 * 14 * This program is distributed in the hope that it will be useful, but WITHOUT 15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 16 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 17 * more details. 18 */ 19 20#include <linux/slab.h> 21#include <linux/export.h> 22#include <linux/seqno-fence.h> 23 24static const char *seqno_fence_get_driver_name(struct fence *fence) 25{ 26 struct seqno_fence *seqno_fence = to_seqno_fence(fence); 27 return seqno_fence->ops->get_driver_name(fence); 28} 29 30static const char *seqno_fence_get_timeline_name(struct fence *fence) 31{ 32 struct seqno_fence *seqno_fence = to_seqno_fence(fence); 33 return seqno_fence->ops->get_timeline_name(fence); 34} 35 36static bool seqno_enable_signaling(struct fence *fence) 37{ 38 struct seqno_fence *seqno_fence = to_seqno_fence(fence); 39 return seqno_fence->ops->enable_signaling(fence); 40} 41 42static bool seqno_signaled(struct fence *fence) 43{ 44 struct seqno_fence *seqno_fence = to_seqno_fence(fence); 45 return seqno_fence->ops->signaled && seqno_fence->ops->signaled(fence); 46} 47 48static void seqno_release(struct fence *fence) 49{ 50 struct seqno_fence *f = to_seqno_fence(fence); 51 52 dma_buf_put(f->sync_buf); 53 if (f->ops->release) 54 f->ops->release(fence); 55 else 56 fence_free(&f->base); 57} 58 59static signed long seqno_wait(struct fence *fence, bool intr, signed long timeout) 60{ 61 struct seqno_fence *f = to_seqno_fence(fence); 62 return f->ops->wait(fence, intr, timeout); 63} 64 65const struct fence_ops seqno_fence_ops = { 66 .get_driver_name = seqno_fence_get_driver_name, 67 .get_timeline_name = seqno_fence_get_timeline_name, 68 .enable_signaling = seqno_enable_signaling, 69 .signaled = seqno_signaled, 70 .wait = seqno_wait, 71 .release = seqno_release, 72}; 73EXPORT_SYMBOL(seqno_fence_ops); 74