brintos

brintos / linux-shallow public Read only

0
0
Text · 2.1 KiB · edd58b3 Raw
76 lines · c
1/* SPDX-License-Identifier: MIT */2/*3 * Copyright © 2023 Intel Corporation4 */5 6#ifndef _XE_RANGE_FENCE_H_7#define _XE_RANGE_FENCE_H_8 9#include <linux/dma-fence.h>10#include <linux/rbtree.h>11#include <linux/types.h>12 13struct xe_range_fence_tree;14struct xe_range_fence;15 16/** struct xe_range_fence_ops - XE range fence ops */17struct xe_range_fence_ops {18	/** @free: free range fence op */19	void (*free)(struct xe_range_fence *rfence);20};21 22/** struct xe_range_fence - XE range fence (address conflict tracking) */23struct xe_range_fence {24	/** @rb: RB tree node inserted into interval tree */25	struct rb_node rb;26	/** @start: start address of range fence is interval tree */27	u64 start;28	/** @last: last address (inclusive) of range fence is interval tree */29	u64 last;30	/** @__subtree_last: interval tree internal usage */31	u64 __subtree_last;32	/**33	 * @fence: fence signals address in range fence no longer has conflict34	 */35	struct dma_fence *fence;36	/** @tree: interval tree which range fence belongs to */37	struct xe_range_fence_tree *tree;38	/**39	 * @cb: callback when fence signals to remove range fence free from interval tree40	 */41	struct dma_fence_cb cb;42	/** @link: used to defer free of range fence to non-irq context */43	struct llist_node link;44	/** @ops: range fence ops */45	const struct xe_range_fence_ops *ops;46};47 48/** struct xe_range_fence_tree - interval tree to store range fences */49struct xe_range_fence_tree {50	/** @root: interval tree root */51	struct rb_root_cached root;52	/** @list: list of pending range fences to be freed */53	struct llist_head list;54};55 56extern const struct xe_range_fence_ops xe_range_fence_kfree_ops;57 58struct xe_range_fence *59xe_range_fence_tree_first(struct xe_range_fence_tree *tree, u64 start,60			  u64 last);61 62struct xe_range_fence *63xe_range_fence_tree_next(struct xe_range_fence *rfence, u64 start, u64 last);64 65void xe_range_fence_tree_init(struct xe_range_fence_tree *tree);66 67void xe_range_fence_tree_fini(struct xe_range_fence_tree *tree);68 69int xe_range_fence_insert(struct xe_range_fence_tree *tree,70			  struct xe_range_fence *rfence,71			  const struct xe_range_fence_ops *ops,72			  u64 start, u64 end,73			  struct dma_fence *fence);74 75#endif76