123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- /* SPDX-License-Identifier: GPL-2.0-only */
- /*
- * Copyright (c) 2012-2014,2018-2019, 2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
- */
- #ifndef __KGSL_SYNC_H
- #define __KGSL_SYNC_H
- #include <linux/dma-fence.h>
- /**
- * struct kgsl_sync_timeline - A sync timeline associated with a kgsl context
- * @kref: Refcount to keep the struct alive until all its fences are signaled,
- and as long as the context exists
- * @name: String to describe this timeline
- * @fence_context: Used by the fence driver to identify fences belonging to
- * this context
- * @child_list_head: List head for all fences on this timeline
- * @lock: Spinlock to protect this timeline
- * @last_timestamp: Last timestamp when signaling fences
- * @device: kgsl device
- * @context: kgsl context
- */
- struct kgsl_sync_timeline {
- struct kref kref;
- char name[32];
- u64 fence_context;
- struct list_head child_list_head;
- spinlock_t lock;
- unsigned int last_timestamp;
- struct kgsl_device *device;
- struct kgsl_context *context;
- };
- /**
- * struct kgsl_sync_fence - A struct containing a fence and other data
- * associated with it
- * @fence: The fence struct
- * @sync_file: Pointer to the sync file
- * @parent: Pointer to the kgsl sync timeline this fence is on
- * @child_list: List of fences on the same timeline
- * @context_id: kgsl context id
- * @timestamp: Context timestamp that this fence is associated with
- */
- struct kgsl_sync_fence {
- struct dma_fence fence;
- struct sync_file *sync_file;
- struct kgsl_sync_timeline *parent;
- struct list_head child_list;
- u32 context_id;
- unsigned int timestamp;
- /** @hw_fence_index: Index of hw fence in hw fence table */
- u64 hw_fence_index;
- /** @hw_fence_handle: Handle to the hw fence client */
- void *hw_fence_handle;
- };
- /**
- * struct kgsl_sync_fence_cb - Used for fence callbacks
- * fence_cb: Fence callback struct
- * fence: Pointer to the fence for which the callback is done
- * priv: Private data for the callback
- * func: Pointer to the kgsl function to call. This function should return
- * false if the sync callback is marked for cancellation in a separate thread.
- */
- struct kgsl_sync_fence_cb {
- struct dma_fence_cb fence_cb;
- struct dma_fence *fence;
- void *priv;
- bool (*func)(void *priv);
- };
- struct kgsl_device_private;
- struct kgsl_drawobj_sync_event;
- struct event_fence_info;
- struct kgsl_process_private;
- struct kgsl_syncsource;
- #if defined(CONFIG_SYNC_FILE)
- int kgsl_add_fence_event(struct kgsl_device *device,
- u32 context_id, u32 timestamp, void __user *data, int len,
- struct kgsl_device_private *owner);
- int kgsl_sync_timeline_create(struct kgsl_context *context);
- void kgsl_sync_timeline_detach(struct kgsl_sync_timeline *ktimeline);
- void kgsl_sync_timeline_put(struct kgsl_sync_timeline *ktimeline);
- struct kgsl_sync_fence_cb *kgsl_sync_fence_async_wait(int fd, bool (*func)(void *priv), void *priv);
- void kgsl_get_fence_info(struct kgsl_drawobj_sync_event *event);
- void kgsl_sync_fence_async_cancel(struct kgsl_sync_fence_cb *kcb);
- long kgsl_ioctl_syncsource_create(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_syncsource_destroy(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_syncsource_create_fence(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_syncsource_signal_fence(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- void kgsl_syncsource_put(struct kgsl_syncsource *syncsource);
- void kgsl_syncsource_process_release_syncsources(
- struct kgsl_process_private *private);
- bool is_kgsl_fence(struct dma_fence *f);
- void kgsl_sync_timeline_signal(struct kgsl_sync_timeline *ktimeline,
- u32 timestamp);
- #else
- static inline int kgsl_add_fence_event(struct kgsl_device *device,
- u32 context_id, u32 timestamp, void __user *data, int len,
- struct kgsl_device_private *owner)
- {
- return -EINVAL;
- }
- static inline int kgsl_sync_timeline_create(struct kgsl_context *context)
- {
- context->ktimeline = NULL;
- return 0;
- }
- static inline void kgsl_sync_timeline_detach(struct kgsl_sync_timeline *ktimeline)
- {
- }
- static inline void kgsl_sync_timeline_put(struct kgsl_sync_timeline *ktimeline)
- {
- }
- static inline void kgsl_get_fence_info(struct kgsl_drawobj_sync_event *event)
- {
- }
- static inline struct kgsl_sync_fence_cb *kgsl_sync_fence_async_wait(int fd,
- bool (*func)(void *priv), void *priv);
- {
- return NULL;
- }
- static inline void
- kgsl_sync_fence_async_cancel(struct kgsl_sync_fence_cb *kcb)
- {
- }
- static inline long
- kgsl_ioctl_syncsource_create(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data)
- {
- return -ENOIOCTLCMD;
- }
- static inline long
- kgsl_ioctl_syncsource_destroy(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data)
- {
- return -ENOIOCTLCMD;
- }
- static inline long
- kgsl_ioctl_syncsource_create_fence(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data)
- {
- return -ENOIOCTLCMD;
- }
- static inline long
- kgsl_ioctl_syncsource_signal_fence(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data)
- {
- return -ENOIOCTLCMD;
- }
- static inline void kgsl_syncsource_put(struct kgsl_syncsource *syncsource)
- {
- }
- static inline void kgsl_syncsource_process_release_syncsources(
- struct kgsl_process_private *private)
- {
- }
- bool is_kgsl_fence(struct dma_fence *f)
- {
- }
- void kgsl_sync_timeline_signal(struct kgsl_sync_timeline *ktimeline,
- u32 timestamp)
- {
- }
- #endif /* CONFIG_SYNC_FILE */
- #endif /* __KGSL_SYNC_H */
|