123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347 |
- #ifndef __KGSL_DRAWOBJ_H
- #define __KGSL_DRAWOBJ_H
- #include <linux/dma-fence.h>
- #include <linux/kref.h>
- #define DRAWOBJ(obj) (&obj->base)
- #define SYNCOBJ(obj) \
- container_of(obj, struct kgsl_drawobj_sync, base)
- #define CMDOBJ(obj) \
- container_of(obj, struct kgsl_drawobj_cmd, base)
- #define CMDOBJ_TYPE BIT(0)
- #define MARKEROBJ_TYPE BIT(1)
- #define SYNCOBJ_TYPE BIT(2)
- #define BINDOBJ_TYPE BIT(3)
- #define TIMELINEOBJ_TYPE BIT(4)
- struct kgsl_drawobj {
- struct kgsl_device *device;
- struct kgsl_context *context;
- uint32_t type;
- uint32_t timestamp;
- unsigned long flags;
- struct kref refcount;
-
- void (*destroy)(struct kgsl_drawobj *drawobj);
-
- void (*destroy_object)(struct kgsl_drawobj *drawobj);
- };
- struct kgsl_drawobj_cmd {
- struct kgsl_drawobj base;
- unsigned long priv;
- unsigned int global_ts;
- unsigned long fault_policy;
- unsigned long fault_recovery;
- struct list_head cmdlist;
- struct list_head memlist;
- unsigned int marker_timestamp;
- struct kgsl_mem_entry *profiling_buf_entry;
- uint64_t profiling_buffer_gpuaddr;
- unsigned int profile_index;
- uint64_t submit_ticks;
-
- u32 numibs;
-
- u32 requeue_cnt;
- };
- #define KGSL_SYNCOBJ_SW BIT(0)
- #define KGSL_SYNCOBJ_HW BIT(1)
- struct kgsl_drawobj_sync {
- struct kgsl_drawobj base;
- struct kgsl_drawobj_sync_event *synclist;
- unsigned int numsyncs;
- unsigned long pending;
- struct timer_list timer;
- unsigned long timeout_jiffies;
-
- u32 flags;
-
- u32 num_hw_fence;
- };
- #define KGSL_BINDOBJ_STATE_START 0
- #define KGSL_BINDOBJ_STATE_DONE 1
- struct kgsl_drawobj_bind {
- struct kgsl_drawobj base;
- unsigned long state;
- struct kgsl_sharedmem_bind_op *bind;
- };
- static inline struct kgsl_drawobj_bind *BINDOBJ(struct kgsl_drawobj *obj)
- {
- return container_of(obj, struct kgsl_drawobj_bind, base);
- }
- struct kgsl_drawobj_timeline {
-
- struct kgsl_drawobj base;
-
- struct kref sig_refcount;
-
- struct kgsl_timeline_event *timelines;
-
- int count;
- };
- static inline struct kgsl_drawobj_timeline *
- TIMELINEOBJ(struct kgsl_drawobj *obj)
- {
- return container_of(obj, struct kgsl_drawobj_timeline, base);
- }
- #define KGSL_FENCE_NAME_LEN 74
- struct fence_info {
- char name[KGSL_FENCE_NAME_LEN];
- };
- struct event_fence_info {
- struct fence_info *fences;
- int num_fences;
- };
- struct event_timeline_info {
- u64 seqno;
- u32 timeline;
- };
- struct kgsl_drawobj_sync_event {
- unsigned int id;
- int type;
- struct kgsl_drawobj_sync *syncobj;
- struct kgsl_context *context;
- unsigned int timestamp;
- struct kgsl_sync_fence_cb *handle;
- struct kgsl_device *device;
-
- void *priv;
-
- struct dma_fence *fence;
-
- struct dma_fence_cb cb;
-
- struct work_struct work;
- };
- #define KGSL_DRAWOBJ_FLAGS \
- { KGSL_DRAWOBJ_MARKER, "MARKER" }, \
- { KGSL_DRAWOBJ_CTX_SWITCH, "CTX_SWITCH" }, \
- { KGSL_DRAWOBJ_SYNC, "SYNC" }, \
- { KGSL_DRAWOBJ_END_OF_FRAME, "EOF" }, \
- { KGSL_DRAWOBJ_PWR_CONSTRAINT, "PWR_CONSTRAINT" }, \
- { KGSL_DRAWOBJ_SUBMIT_IB_LIST, "IB_LIST" }
- enum kgsl_drawobj_cmd_priv {
- CMDOBJ_SKIP = 0,
- CMDOBJ_FORCE_PREAMBLE,
- CMDOBJ_WFI,
- CMDOBJ_PROFILE,
- CMDOBJ_FAULT,
- CMDOBJ_RECURRING_START,
- CMDOBJ_RECURRING_STOP,
- CMDOBJ_MARKER_EXPIRED,
- };
- struct kgsl_ibdesc;
- struct kgsl_cmd_syncpoint;
- struct kgsl_drawobj_cmd *kgsl_drawobj_cmd_create(struct kgsl_device *device,
- struct kgsl_context *context, unsigned int flags,
- unsigned int type);
- int kgsl_drawobj_cmd_add_ibdesc(struct kgsl_device *device,
- struct kgsl_drawobj_cmd *cmdobj, struct kgsl_ibdesc *ibdesc);
- int kgsl_drawobj_cmd_add_ibdesc_list(struct kgsl_device *device,
- struct kgsl_drawobj_cmd *cmdobj, void __user *ptr, int count);
- int kgsl_drawobj_cmd_add_cmdlist(struct kgsl_device *device,
- struct kgsl_drawobj_cmd *cmdobj, void __user *ptr,
- unsigned int size, unsigned int count);
- int kgsl_drawobj_cmd_add_memlist(struct kgsl_device *device,
- struct kgsl_drawobj_cmd *cmdobj, void __user *ptr,
- unsigned int size, unsigned int count);
- struct kgsl_drawobj_sync *kgsl_drawobj_sync_create(struct kgsl_device *device,
- struct kgsl_context *context);
- int kgsl_drawobj_sync_add_syncpoints(struct kgsl_device *device,
- struct kgsl_drawobj_sync *syncobj, void __user *ptr,
- int count);
- int kgsl_drawobj_sync_add_synclist(struct kgsl_device *device,
- struct kgsl_drawobj_sync *syncobj, void __user *ptr,
- unsigned int size, unsigned int count);
- int kgsl_drawobj_sync_add_sync(struct kgsl_device *device,
- struct kgsl_drawobj_sync *syncobj,
- struct kgsl_cmd_syncpoint *sync);
- int kgsl_drawobjs_cache_init(void);
- void kgsl_drawobjs_cache_exit(void);
- void kgsl_dump_syncpoints(struct kgsl_device *device,
- struct kgsl_drawobj_sync *syncobj);
- void kgsl_drawobj_destroy(struct kgsl_drawobj *drawobj);
- void kgsl_drawobj_destroy_object(struct kref *kref);
- static inline bool kgsl_drawobj_events_pending(
- struct kgsl_drawobj_sync *syncobj)
- {
- return !bitmap_empty(&syncobj->pending, KGSL_MAX_SYNCPOINTS);
- }
- static inline bool kgsl_drawobj_event_pending(
- struct kgsl_drawobj_sync *syncobj, unsigned int bit)
- {
- if (bit >= KGSL_MAX_SYNCPOINTS)
- return false;
- return test_bit(bit, &syncobj->pending);
- }
- static inline void kgsl_drawobj_put(struct kgsl_drawobj *drawobj)
- {
- if (drawobj)
- kref_put(&drawobj->refcount, kgsl_drawobj_destroy_object);
- }
- struct kgsl_drawobj_sync *
- kgsl_drawobj_create_timestamp_syncobj(struct kgsl_device *device,
- struct kgsl_context *context, unsigned int timestamp);
- struct kgsl_drawobj_bind *kgsl_drawobj_bind_create(struct kgsl_device *device,
- struct kgsl_context *context);
- int kgsl_drawobj_add_bind(struct kgsl_device_private *dev_priv,
- struct kgsl_drawobj_bind *bindobj,
- void __user *src, u64 cmdsize);
- struct kgsl_drawobj_timeline *
- kgsl_drawobj_timeline_create(struct kgsl_device *device,
- struct kgsl_context *context);
- int kgsl_drawobj_add_timeline(struct kgsl_device_private *dev_priv,
- struct kgsl_drawobj_timeline *timelineobj,
- void __user *src, u64 cmdsize);
- #endif
|