cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

dma-fence-array.h (2588B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * fence-array: aggregates fence to be waited together
      4 *
      5 * Copyright (C) 2016 Collabora Ltd
      6 * Copyright (C) 2016 Advanced Micro Devices, Inc.
      7 * Authors:
      8 *	Gustavo Padovan <gustavo@padovan.org>
      9 *	Christian König <christian.koenig@amd.com>
     10 */
     11
     12#ifndef __LINUX_DMA_FENCE_ARRAY_H
     13#define __LINUX_DMA_FENCE_ARRAY_H
     14
     15#include <linux/dma-fence.h>
     16#include <linux/irq_work.h>
     17
     18/**
     19 * struct dma_fence_array_cb - callback helper for fence array
     20 * @cb: fence callback structure for signaling
     21 * @array: reference to the parent fence array object
     22 */
     23struct dma_fence_array_cb {
     24	struct dma_fence_cb cb;
     25	struct dma_fence_array *array;
     26};
     27
     28/**
     29 * struct dma_fence_array - fence to represent an array of fences
     30 * @base: fence base class
     31 * @lock: spinlock for fence handling
     32 * @num_fences: number of fences in the array
     33 * @num_pending: fences in the array still pending
     34 * @fences: array of the fences
     35 * @work: internal irq_work function
     36 */
     37struct dma_fence_array {
     38	struct dma_fence base;
     39
     40	spinlock_t lock;
     41	unsigned num_fences;
     42	atomic_t num_pending;
     43	struct dma_fence **fences;
     44
     45	struct irq_work work;
     46};
     47
     48/**
     49 * to_dma_fence_array - cast a fence to a dma_fence_array
     50 * @fence: fence to cast to a dma_fence_array
     51 *
     52 * Returns NULL if the fence is not a dma_fence_array,
     53 * or the dma_fence_array otherwise.
     54 */
     55static inline struct dma_fence_array *
     56to_dma_fence_array(struct dma_fence *fence)
     57{
     58	if (!fence || !dma_fence_is_array(fence))
     59		return NULL;
     60
     61	return container_of(fence, struct dma_fence_array, base);
     62}
     63
     64/**
     65 * dma_fence_array_for_each - iterate over all fences in array
     66 * @fence: current fence
     67 * @index: index into the array
     68 * @head: potential dma_fence_array object
     69 *
     70 * Test if @array is a dma_fence_array object and if yes iterate over all fences
     71 * in the array. If not just iterate over the fence in @array itself.
     72 *
     73 * For a deep dive iterator see dma_fence_unwrap_for_each().
     74 */
     75#define dma_fence_array_for_each(fence, index, head)			\
     76	for (index = 0, fence = dma_fence_array_first(head); fence;	\
     77	     ++(index), fence = dma_fence_array_next(head, index))
     78
     79struct dma_fence_array *dma_fence_array_create(int num_fences,
     80					       struct dma_fence **fences,
     81					       u64 context, unsigned seqno,
     82					       bool signal_on_any);
     83
     84bool dma_fence_match_context(struct dma_fence *fence, u64 context);
     85
     86struct dma_fence *dma_fence_array_first(struct dma_fence *head);
     87struct dma_fence *dma_fence_array_next(struct dma_fence *head,
     88				       unsigned int index);
     89
     90#endif /* __LINUX_DMA_FENCE_ARRAY_H */