123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704 |
- #ifndef __KGSL_H
- #define __KGSL_H
- #include <linux/cdev.h>
- #include <linux/compat.h>
- #include <linux/interrupt.h>
- #include <linux/kthread.h>
- #include <linux/mm.h>
- #include <uapi/linux/msm_kgsl.h>
- #include <linux/uaccess.h>
- #include <linux/version.h>
- #include "kgsl_gmu_core.h"
- #include "kgsl_pwrscale.h"
- #define KGSL_L3_DEVICE "kgsl-l3"
- #if (KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE)
- #include <soc/qcom/boot_stats.h>
- #define KGSL_BOOT_MARKER(str) place_marker("M - DRIVER " str)
- #else
- #define KGSL_BOOT_MARKER(str) pr_info("boot_kpi: M - DRIVER " str)
- #endif
- #define KGSL_DRAWOBJ_MEMLIST KGSL_CMDBATCH_MEMLIST
- #define KGSL_DRAWOBJ_MARKER KGSL_CMDBATCH_MARKER
- #define KGSL_DRAWOBJ_SUBMIT_IB_LIST KGSL_CMDBATCH_SUBMIT_IB_LIST
- #define KGSL_DRAWOBJ_CTX_SWITCH KGSL_CMDBATCH_CTX_SWITCH
- #define KGSL_DRAWOBJ_PROFILING KGSL_CMDBATCH_PROFILING
- #define KGSL_DRAWOBJ_PROFILING_KTIME KGSL_CMDBATCH_PROFILING_KTIME
- #define KGSL_DRAWOBJ_END_OF_FRAME KGSL_CMDBATCH_END_OF_FRAME
- #define KGSL_DRAWOBJ_SYNC KGSL_CMDBATCH_SYNC
- #define KGSL_DRAWOBJ_PWR_CONSTRAINT KGSL_CMDBATCH_PWR_CONSTRAINT
- #define KGSL_DRAWOBJ_START_RECURRING KGSL_CMDBATCH_START_RECURRING
- #define KGSL_DRAWOBJ_STOP_RECURRING KGSL_CMDBATCH_STOP_RECURRING
- #define kgsl_drawobj_profiling_buffer kgsl_cmdbatch_profiling_buffer
- #define KGSL_MEMSTORE_SIZE ((int)(PAGE_SIZE * 8))
- #define KGSL_MEMSTORE_GLOBAL (0)
- #define KGSL_PRIORITY_MAX_RB_LEVELS 4
- #define KGSL_LPAC_RB_ID KGSL_PRIORITY_MAX_RB_LEVELS
- #define KGSL_MEMSTORE_MAX (KGSL_MEMSTORE_SIZE / \
- sizeof(struct kgsl_devmemstore) - 2 - KGSL_PRIORITY_MAX_RB_LEVELS)
- #define KGSL_MAX_CONTEXTS_PER_PROC 200
- #define MEMSTORE_RB_OFFSET(rb, field) \
- KGSL_MEMSTORE_OFFSET(((rb)->id + KGSL_MEMSTORE_MAX), field)
- #define MEMSTORE_ID_GPU_ADDR(dev, iter, field) \
- ((dev)->memstore->gpuaddr + KGSL_MEMSTORE_OFFSET(iter, field))
- #define MEMSTORE_RB_GPU_ADDR(dev, rb, field) \
- ((dev)->memstore->gpuaddr + \
- KGSL_MEMSTORE_OFFSET(((rb)->id + KGSL_MEMSTORE_MAX), field))
- #define KGSL_CONTEXT_PRIORITY_HIGH 0
- #define KGSL_GLOBAL_CTXT_ID (KGSL_MEMSTORE_MAX - 1)
- struct adreno_rb_shadow {
-
- u32 rptr;
-
- u32 bv_rptr;
-
- u32 bv_ts;
-
- u32 current_rb_ptname;
-
- u64 ttbr0;
-
- u32 contextidr;
- };
- struct gpu_work_period {
- struct kref refcount;
- struct list_head list;
-
- uid_t uid;
-
- u64 active;
-
- u32 cmds;
-
- atomic_t frames;
-
- unsigned long flags;
-
- atomic_t active_cmds;
-
- struct work_struct defer_ws;
- };
- #define SCRATCH_RB_OFFSET(id, _field) ((id * sizeof(struct adreno_rb_shadow)) + \
- offsetof(struct adreno_rb_shadow, _field))
- #define SCRATCH_RB_GPU_ADDR(dev, id, _field) \
- ((dev)->scratch->gpuaddr + SCRATCH_RB_OFFSET(id, _field))
- #define SCRATCH_POSTAMBLE_OFFSET (100 * sizeof(u64))
- #define SCRATCH_POSTAMBLE_ADDR(dev) \
- ((dev)->scratch->gpuaddr + SCRATCH_POSTAMBLE_OFFSET)
- #define KGSL_TIMESTAMP_WINDOW 0x80000000
- static inline void KGSL_STATS_ADD(uint64_t size, atomic_long_t *stat,
- atomic_long_t *max)
- {
- uint64_t ret = atomic_long_add_return(size, stat);
- if (ret > atomic_long_read(max))
- atomic_long_set(max, ret);
- }
- #define KGSL_MAX_NUMIBS 2000
- #define KGSL_MAX_SYNCPOINTS 32
- struct kgsl_device;
- struct kgsl_context;
- struct kgsl_driver {
- struct cdev cdev;
- dev_t major;
- struct class *class;
- struct device virtdev;
- struct kobject *ptkobj;
- struct kobject *prockobj;
- struct kgsl_device *devp[1];
- struct list_head process_list;
-
- struct list_head wp_list;
-
- spinlock_t wp_list_lock;
- struct list_head pagetable_list;
- spinlock_t ptlock;
- struct mutex process_mutex;
- rwlock_t proclist_lock;
- struct mutex devlock;
- struct {
- atomic_long_t vmalloc;
- atomic_long_t vmalloc_max;
- atomic_long_t page_alloc;
- atomic_long_t page_alloc_max;
- atomic_long_t coherent;
- atomic_long_t coherent_max;
- atomic_long_t secure;
- atomic_long_t secure_max;
- atomic_long_t mapped;
- atomic_long_t mapped_max;
- } stats;
- unsigned int full_cache_threshold;
- struct workqueue_struct *workqueue;
-
- struct workqueue_struct *lockless_workqueue;
- };
- extern struct kgsl_driver kgsl_driver;
- struct kgsl_pagetable;
- struct kgsl_memdesc;
- struct kgsl_memdesc_ops {
- unsigned int vmflags;
- vm_fault_t (*vmfault)(struct kgsl_memdesc *memdesc,
- struct vm_area_struct *vma, struct vm_fault *vmf);
- void (*free)(struct kgsl_memdesc *memdesc);
- int (*map_kernel)(struct kgsl_memdesc *memdesc);
- void (*unmap_kernel)(struct kgsl_memdesc *memdesc);
-
- void (*put_gpuaddr)(struct kgsl_memdesc *memdesc);
- };
- #define KGSL_MEMDESC_GUARD_PAGE BIT(0)
- #define KGSL_MEMDESC_GLOBAL BIT(1)
- #define KGSL_MEMDESC_FROZEN BIT(2)
- #define KGSL_MEMDESC_MAPPED BIT(3)
- #define KGSL_MEMDESC_SECURE BIT(4)
- #define KGSL_MEMDESC_PRIVILEGED BIT(6)
- #define KGSL_MEMDESC_UCODE BIT(7)
- #define KGSL_MEMDESC_RANDOM BIT(8)
- #define KGSL_MEMDESC_SYSMEM BIT(9)
- #define KGSL_MEMDESC_CAN_RECLAIM BIT(10)
- #define KGSL_MEMDESC_RECLAIMED BIT(11)
- #define KGSL_MEMDESC_SKIP_RECLAIM BIT(12)
- #define KGSL_MEMDESC_HYPASSIGNED_HLOS BIT(13)
- struct kgsl_memdesc {
- struct kgsl_pagetable *pagetable;
- void *hostptr;
- unsigned int hostptr_count;
- uint64_t gpuaddr;
- phys_addr_t physaddr;
- uint64_t size;
- unsigned int priv;
- struct sg_table *sgt;
- const struct kgsl_memdesc_ops *ops;
- uint64_t flags;
- struct device *dev;
- unsigned long attrs;
- struct page **pages;
- unsigned int page_count;
-
- spinlock_t lock;
-
- struct file *shmem_filp;
-
- struct rb_root_cached ranges;
-
- struct mutex ranges_lock;
-
- u32 gmuaddr;
-
- struct list_head shmem_page_list;
- };
- struct kgsl_global_memdesc {
-
- struct kgsl_memdesc memdesc;
-
- const char *name;
-
- struct list_head node;
- };
- #define KGSL_MEM_ENTRY_KERNEL 0
- #define KGSL_MEM_ENTRY_USER (KGSL_USER_MEM_TYPE_ADDR + 1)
- #define KGSL_MEM_ENTRY_ION (KGSL_USER_MEM_TYPE_ION + 1)
- #define KGSL_MEM_ENTRY_MAX (KGSL_USER_MEM_TYPE_MAX + 1)
- #define KGSL_WORK_PERIOD 0
- #define KGSL_WORK_PERIOD_MS 900
- struct kgsl_mem_entry {
- struct kref refcount;
- struct kgsl_memdesc memdesc;
- void *priv_data;
- struct rb_node node;
- unsigned int id;
- struct kgsl_process_private *priv;
- int pending_free;
- char metadata[KGSL_GPUOBJ_ALLOC_METADATA_MAX + 1];
- struct work_struct work;
-
- atomic_t map_count;
-
- atomic_t vbo_count;
- };
- struct kgsl_device_private;
- struct kgsl_event_group;
- typedef void (*kgsl_event_func)(struct kgsl_device *, struct kgsl_event_group *,
- void *, int);
- struct kgsl_event {
- struct kgsl_device *device;
- struct kgsl_context *context;
- unsigned int timestamp;
- kgsl_event_func func;
- void *priv;
- struct list_head node;
- unsigned int created;
- struct kthread_work work;
- int result;
- struct kgsl_event_group *group;
- };
- typedef int (*readtimestamp_func)(struct kgsl_device *, void *,
- enum kgsl_timestamp_type, unsigned int *);
- struct kgsl_event_group {
- struct kgsl_context *context;
- spinlock_t lock;
- struct list_head events;
- struct list_head group;
- unsigned int processed;
- char name[64];
- readtimestamp_func readtimestamp;
- void *priv;
- };
- struct submission_info {
- int inflight;
- u32 rb_id;
- u32 rptr;
- u32 wptr;
- u32 gmu_dispatch_queue;
- };
- struct retire_info {
- int inflight;
- int rb_id;
- u32 rptr;
- u32 wptr;
- u32 gmu_dispatch_queue;
- u32 timestamp;
- u64 submitted_to_rb;
- u64 sop;
- u64 eop;
- u64 retired_on_gmu;
- u64 active;
- };
- long kgsl_ioctl_device_getproperty(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_device_setproperty(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_device_waittimestamp_ctxtid(struct kgsl_device_private
- *dev_priv, unsigned int cmd, void *data);
- long kgsl_ioctl_rb_issueibcmds(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_submit_commands(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_cmdstream_readtimestamp_ctxtid(struct kgsl_device_private
- *dev_priv, unsigned int cmd,
- void *data);
- long kgsl_ioctl_cmdstream_freememontimestamp_ctxtid(
- struct kgsl_device_private
- *dev_priv, unsigned int cmd,
- void *data);
- long kgsl_ioctl_drawctxt_create(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_drawctxt_destroy(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_sharedmem_free(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_gpumem_free_id(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_map_user_mem(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_gpumem_sync_cache(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_gpumem_sync_cache_bulk(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_sharedmem_flush_cache(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_gpumem_alloc(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_gpumem_alloc_id(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_gpumem_get_info(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_timestamp_event(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_gpuobj_alloc(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_gpuobj_free(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_gpuobj_info(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_gpuobj_import(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_gpuobj_sync(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_gpu_command(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_gpuobj_set_info(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_gpumem_bind_ranges(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_gpu_aux_command(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_timeline_create(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_timeline_wait(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_timeline_query(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_timeline_fence_get(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_timeline_signal(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_timeline_destroy(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_get_fault_report(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- long kgsl_ioctl_recurring_command(struct kgsl_device_private *dev_priv,
- unsigned int cmd, void *data);
- void kgsl_mem_entry_destroy(struct kref *kref);
- void kgsl_mem_entry_destroy_deferred(struct kref *kref);
- void kgsl_get_egl_counts(struct kgsl_mem_entry *entry,
- int *egl_surface_count, int *egl_image_count);
- unsigned long kgsl_get_dmabuf_inode_number(struct kgsl_mem_entry *entry);
- struct kgsl_mem_entry * __must_check
- kgsl_sharedmem_find(struct kgsl_process_private *private, uint64_t gpuaddr);
- struct kgsl_mem_entry * __must_check
- kgsl_sharedmem_find_id(struct kgsl_process_private *process, unsigned int id);
- struct kgsl_mem_entry *gpumem_alloc_entry(struct kgsl_device_private *dev_priv,
- uint64_t size, uint64_t flags);
- long gpumem_free_entry(struct kgsl_mem_entry *entry);
- enum kgsl_mmutype kgsl_mmu_get_mmutype(struct kgsl_device *device);
- int kgsl_request_irq(struct platform_device *pdev, const char *name,
- irq_handler_t handler, void *data);
- int kgsl_request_irq_optional(struct platform_device *pdev, const char *name,
- irq_handler_t handler, void *data);
- int __init kgsl_core_init(void);
- void kgsl_core_exit(void);
- static inline bool kgsl_gpuaddr_in_memdesc(const struct kgsl_memdesc *memdesc,
- uint64_t gpuaddr, uint64_t size)
- {
- if (IS_ERR_OR_NULL(memdesc))
- return false;
-
- if (!size)
- size = 1;
-
- if (size > U64_MAX - gpuaddr)
- return false;
- return (gpuaddr >= memdesc->gpuaddr &&
- ((gpuaddr + size) <= (memdesc->gpuaddr + memdesc->size)));
- }
- static inline void *kgsl_memdesc_map(struct kgsl_memdesc *memdesc)
- {
- if (memdesc->ops && memdesc->ops->map_kernel)
- memdesc->ops->map_kernel(memdesc);
- return memdesc->hostptr;
- }
- static inline void kgsl_memdesc_unmap(struct kgsl_memdesc *memdesc)
- {
- if (memdesc->ops && memdesc->ops->unmap_kernel)
- memdesc->ops->unmap_kernel(memdesc);
- }
- static inline void *kgsl_gpuaddr_to_vaddr(struct kgsl_memdesc *memdesc,
- uint64_t gpuaddr)
- {
- void *hostptr = NULL;
- if ((gpuaddr >= memdesc->gpuaddr) &&
- (gpuaddr < (memdesc->gpuaddr + memdesc->size)))
- hostptr = kgsl_memdesc_map(memdesc);
- return hostptr != NULL ? hostptr + (gpuaddr - memdesc->gpuaddr) : NULL;
- }
- static inline int timestamp_cmp(unsigned int a, unsigned int b)
- {
-
- if (a == b)
- return 0;
-
- if ((a > b) && (a - b < KGSL_TIMESTAMP_WINDOW))
- return 1;
-
- a += KGSL_TIMESTAMP_WINDOW;
- b += KGSL_TIMESTAMP_WINDOW;
- return ((a > b) && (a - b <= KGSL_TIMESTAMP_WINDOW)) ? 1 : -1;
- }
- static inline void kgsl_schedule_work(struct work_struct *work)
- {
- queue_work(kgsl_driver.workqueue, work);
- }
- static inline struct kgsl_mem_entry *
- kgsl_mem_entry_get(struct kgsl_mem_entry *entry)
- {
- if (!IS_ERR_OR_NULL(entry) && kref_get_unless_zero(&entry->refcount))
- return entry;
- return NULL;
- }
- static inline void
- kgsl_mem_entry_put(struct kgsl_mem_entry *entry)
- {
- if (!IS_ERR_OR_NULL(entry))
- kref_put(&entry->refcount, kgsl_mem_entry_destroy);
- }
- static inline void kgsl_mem_entry_put_deferred(struct kgsl_mem_entry *entry)
- {
- if (entry)
- kref_put(&entry->refcount, kgsl_mem_entry_destroy_deferred);
- }
- static inline bool kgsl_addr_range_overlap(uint64_t gpuaddr1,
- uint64_t size1, uint64_t gpuaddr2, uint64_t size2)
- {
- if ((size1 > (U64_MAX - gpuaddr1)) || (size2 > (U64_MAX - gpuaddr2)))
- return false;
- return !(((gpuaddr1 + size1) <= gpuaddr2) ||
- (gpuaddr1 >= (gpuaddr2 + size2)));
- }
- void kgsl_work_period_update(struct kgsl_device *device,
- struct gpu_work_period *period, u64 active);
- #endif
|