dma-buf: add dma_fence_get_stub
Extract of useful code from the timeline work. This provides a function to return a stub or dummy fence which is always signaled. Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Chunming Zhou <david1.zhou@amd.com> Link: https://patchwork.freedesktop.org/patch/265248/
This commit is contained in:
parent
4fb86404a9
commit
078dec3326
@ -30,13 +30,16 @@
|
|||||||
EXPORT_TRACEPOINT_SYMBOL(dma_fence_emit);
|
EXPORT_TRACEPOINT_SYMBOL(dma_fence_emit);
|
||||||
EXPORT_TRACEPOINT_SYMBOL(dma_fence_enable_signal);
|
EXPORT_TRACEPOINT_SYMBOL(dma_fence_enable_signal);
|
||||||
|
|
||||||
|
static DEFINE_SPINLOCK(dma_fence_stub_lock);
|
||||||
|
static struct dma_fence dma_fence_stub;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* fence context counter: each execution context should have its own
|
* fence context counter: each execution context should have its own
|
||||||
* fence context, this allows checking if fences belong to the same
|
* fence context, this allows checking if fences belong to the same
|
||||||
* context or not. One device can have multiple separate contexts,
|
* context or not. One device can have multiple separate contexts,
|
||||||
* and they're used if some engine can run independently of another.
|
* and they're used if some engine can run independently of another.
|
||||||
*/
|
*/
|
||||||
static atomic64_t dma_fence_context_counter = ATOMIC64_INIT(0);
|
static atomic64_t dma_fence_context_counter = ATOMIC64_INIT(1);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* DOC: DMA fences overview
|
* DOC: DMA fences overview
|
||||||
@ -68,6 +71,37 @@ static atomic64_t dma_fence_context_counter = ATOMIC64_INIT(0);
|
|||||||
* &dma_buf.resv pointer.
|
* &dma_buf.resv pointer.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static const char *dma_fence_stub_get_name(struct dma_fence *fence)
|
||||||
|
{
|
||||||
|
return "stub";
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct dma_fence_ops dma_fence_stub_ops = {
|
||||||
|
.get_driver_name = dma_fence_stub_get_name,
|
||||||
|
.get_timeline_name = dma_fence_stub_get_name,
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dma_fence_get_stub - return a signaled fence
|
||||||
|
*
|
||||||
|
* Return a stub fence which is already signaled.
|
||||||
|
*/
|
||||||
|
struct dma_fence *dma_fence_get_stub(void)
|
||||||
|
{
|
||||||
|
spin_lock(&dma_fence_stub_lock);
|
||||||
|
if (!dma_fence_stub.ops) {
|
||||||
|
dma_fence_init(&dma_fence_stub,
|
||||||
|
&dma_fence_stub_ops,
|
||||||
|
&dma_fence_stub_lock,
|
||||||
|
0, 0);
|
||||||
|
dma_fence_signal_locked(&dma_fence_stub);
|
||||||
|
}
|
||||||
|
spin_unlock(&dma_fence_stub_lock);
|
||||||
|
|
||||||
|
return dma_fence_get(&dma_fence_stub);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(dma_fence_get_stub);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dma_fence_context_alloc - allocate an array of fence contexts
|
* dma_fence_context_alloc - allocate an array of fence contexts
|
||||||
* @num: amount of contexts to allocate
|
* @num: amount of contexts to allocate
|
||||||
|
@ -541,6 +541,7 @@ static inline signed long dma_fence_wait(struct dma_fence *fence, bool intr)
|
|||||||
return ret < 0 ? ret : 0;
|
return ret < 0 ? ret : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct dma_fence *dma_fence_get_stub(void);
|
||||||
u64 dma_fence_context_alloc(unsigned num);
|
u64 dma_fence_context_alloc(unsigned num);
|
||||||
|
|
||||||
#define DMA_FENCE_TRACE(f, fmt, args...) \
|
#define DMA_FENCE_TRACE(f, fmt, args...) \
|
||||||
|
Loading…
Reference in New Issue
Block a user