kgsl.h 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. /* Copyright (c) 2008-2014, The Linux Foundation. All rights reserved.
  2. *
  3. * This program is free software; you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License version 2 and
  5. * only version 2 as published by the Free Software Foundation.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. *
  12. */
  13. #ifndef __KGSL_H
  14. #define __KGSL_H
  15. #include <linux/types.h>
  16. #include <linux/msm_kgsl.h>
  17. #include <linux/platform_device.h>
  18. #include <linux/clk.h>
  19. #include <linux/interrupt.h>
  20. #include <linux/mutex.h>
  21. #include <linux/cdev.h>
  22. #include <linux/regulator/consumer.h>
  23. #include <linux/mm.h>
  24. #include <mach/kgsl.h>
  25. #define KGSL_NAME "kgsl"
  26. /* The number of memstore arrays limits the number of contexts allowed.
  27. * If more contexts are needed, update multiple for MEMSTORE_SIZE
  28. */
  29. #define KGSL_MEMSTORE_SIZE ((int)(PAGE_SIZE * 2))
  30. #define KGSL_MEMSTORE_GLOBAL (0)
  31. #define KGSL_MEMSTORE_MAX (KGSL_MEMSTORE_SIZE / \
  32. sizeof(struct kgsl_devmemstore) - 1)
  33. /* Timestamp window used to detect rollovers (half of integer range) */
  34. #define KGSL_TIMESTAMP_WINDOW 0x80000000
  35. /*cache coherency ops */
  36. #define DRM_KGSL_GEM_CACHE_OP_TO_DEV 0x0001
  37. #define DRM_KGSL_GEM_CACHE_OP_FROM_DEV 0x0002
  38. /* The size of each entry in a page table */
  39. #define KGSL_PAGETABLE_ENTRY_SIZE 4
  40. /* Pagetable Virtual Address base */
  41. #ifndef CONFIG_MSM_KGSL_CFF_DUMP
  42. #define KGSL_PAGETABLE_BASE 0x10000000
  43. #else
  44. #define KGSL_PAGETABLE_BASE 0xE0000000
  45. #endif
  46. /* Extra accounting entries needed in the pagetable */
  47. #define KGSL_PT_EXTRA_ENTRIES 16
  48. #define KGSL_PAGETABLE_ENTRIES(_sz) (((_sz) >> PAGE_SHIFT) + \
  49. KGSL_PT_EXTRA_ENTRIES)
  50. #ifdef CONFIG_KGSL_PER_PROCESS_PAGE_TABLE
  51. #define KGSL_PAGETABLE_COUNT (CONFIG_MSM_KGSL_PAGE_TABLE_COUNT)
  52. #else
  53. #define KGSL_PAGETABLE_COUNT 1
  54. #endif
  55. /* Casting using container_of() for structures that kgsl owns. */
  56. #define KGSL_CONTAINER_OF(ptr, type, member) \
  57. container_of(ptr, type, member)
  58. /* A macro for memory statistics - add the new size to the stat and if
  59. the statisic is greater then _max, set _max
  60. */
  61. static inline void KGSL_STATS_ADD(uint32_t size, atomic_t *stat,
  62. atomic_t *max)
  63. {
  64. uint32_t ret = atomic_add_return(size, stat);
  65. if (ret > atomic_read(max))
  66. atomic_set(max, ret);
  67. }
  68. #define KGSL_MAX_NUMIBS 100000
  69. struct kgsl_device;
  70. struct kgsl_context;
  71. struct kgsl_driver {
  72. struct cdev cdev;
  73. dev_t major;
  74. struct class *class;
  75. /* Virtual device for managing the core */
  76. struct device virtdev;
  77. /* Kobjects for storing pagetable and process statistics */
  78. struct kobject *ptkobj;
  79. struct kobject *prockobj;
  80. struct kgsl_device *devp[KGSL_DEVICE_MAX];
  81. /* Global lilst of open processes */
  82. struct list_head process_list;
  83. /* Global list of pagetables */
  84. struct list_head pagetable_list;
  85. /* Spinlock for accessing the pagetable list */
  86. spinlock_t ptlock;
  87. /* Mutex for accessing the process list */
  88. struct mutex process_mutex;
  89. /* Mutex for protecting the device list */
  90. struct mutex devlock;
  91. void *ptpool;
  92. struct {
  93. atomic_t vmalloc;
  94. atomic_t vmalloc_max;
  95. atomic_t page_alloc;
  96. atomic_t page_alloc_max;
  97. atomic_t coherent;
  98. atomic_t coherent_max;
  99. atomic_t mapped;
  100. atomic_t mapped_max;
  101. } stats;
  102. unsigned int full_cache_threshold;
  103. };
  104. extern struct kgsl_driver kgsl_driver;
  105. struct kgsl_pagetable;
  106. struct kgsl_memdesc;
  107. struct kgsl_cmdbatch;
  108. struct kgsl_memdesc_ops {
  109. int (*vmflags)(struct kgsl_memdesc *);
  110. int (*vmfault)(struct kgsl_memdesc *, struct vm_area_struct *,
  111. struct vm_fault *);
  112. void (*free)(struct kgsl_memdesc *memdesc);
  113. int (*map_kernel)(struct kgsl_memdesc *);
  114. void (*unmap_kernel)(struct kgsl_memdesc *);
  115. };
  116. /* Internal definitions for memdesc->priv */
  117. #define KGSL_MEMDESC_GUARD_PAGE BIT(0)
  118. /* Set if the memdesc is mapped into all pagetables */
  119. #define KGSL_MEMDESC_GLOBAL BIT(1)
  120. /* The memdesc is frozen during a snapshot */
  121. #define KGSL_MEMDESC_FROZEN BIT(2)
  122. /* The memdesc is mapped into a pagetable */
  123. #define KGSL_MEMDESC_MAPPED BIT(3)
  124. /* shared memory allocation */
  125. struct kgsl_memdesc {
  126. struct kgsl_pagetable *pagetable;
  127. void *hostptr; /* kernel virtual address */
  128. unsigned int hostptr_count; /* number of threads using hostptr */
  129. unsigned long useraddr; /* userspace address */
  130. unsigned int gpuaddr;
  131. phys_addr_t physaddr;
  132. unsigned int size;
  133. unsigned int priv; /* Internal flags and settings */
  134. struct scatterlist *sg;
  135. unsigned int sglen; /* Active entries in the sglist */
  136. unsigned int sglen_alloc; /* Allocated entries in the sglist */
  137. struct kgsl_memdesc_ops *ops;
  138. unsigned int flags; /* Flags set from userspace */
  139. };
  140. /* List of different memory entry types */
  141. #define KGSL_MEM_ENTRY_KERNEL 0
  142. #define KGSL_MEM_ENTRY_PMEM 1
  143. #define KGSL_MEM_ENTRY_ASHMEM 2
  144. #define KGSL_MEM_ENTRY_USER 3
  145. #define KGSL_MEM_ENTRY_ION 4
  146. #define KGSL_MEM_ENTRY_MAX 5
  147. struct kgsl_mem_entry {
  148. struct kref refcount;
  149. struct kgsl_memdesc memdesc;
  150. int memtype;
  151. void *priv_data;
  152. struct rb_node node;
  153. unsigned int id;
  154. unsigned int context_id;
  155. /* back pointer to private structure under whose context this
  156. * allocation is made */
  157. struct kgsl_process_private *priv;
  158. /* Initialized to 0, set to 1 when entry is marked for freeing */
  159. int pending_free;
  160. struct kgsl_device_private *dev_priv;
  161. };
  162. #ifdef CONFIG_MSM_KGSL_MMU_PAGE_FAULT
  163. #define MMU_CONFIG 2
  164. #else
  165. #define MMU_CONFIG 1
  166. #endif
  167. int kgsl_cmdbatch_add_memobj(struct kgsl_cmdbatch *cmdbatch,
  168. struct kgsl_ibdesc *ibdesc);
  169. void kgsl_mem_entry_destroy(struct kref *kref);
  170. int kgsl_postmortem_dump(struct kgsl_device *device, int manual);
  171. struct kgsl_mem_entry *kgsl_get_mem_entry(struct kgsl_device *device,
  172. phys_addr_t ptbase, unsigned int gpuaddr, unsigned int size);
  173. struct kgsl_mem_entry *kgsl_sharedmem_find_region(
  174. struct kgsl_process_private *private, unsigned int gpuaddr,
  175. size_t size);
  176. void kgsl_get_memory_usage(char *str, size_t len, unsigned int memflags);
  177. extern const struct dev_pm_ops kgsl_pm_ops;
  178. int kgsl_suspend_driver(struct platform_device *pdev, pm_message_t state);
  179. int kgsl_resume_driver(struct platform_device *pdev);
  180. void kgsl_trace_regwrite(struct kgsl_device *device, unsigned int offset,
  181. unsigned int value);
  182. void kgsl_trace_issueibcmds(struct kgsl_device *device, int id,
  183. struct kgsl_cmdbatch *cmdbatch, unsigned int numibs,
  184. unsigned int timestamp, unsigned int flags,
  185. int result, unsigned int type);
  186. int kgsl_open_device(struct kgsl_device *device);
  187. int kgsl_close_device(struct kgsl_device *device);
  188. #ifdef CONFIG_MSM_KGSL_DRM
  189. extern int kgsl_drm_init(struct platform_device *dev);
  190. extern void kgsl_drm_exit(void);
  191. #else
  192. static inline int kgsl_drm_init(struct platform_device *dev)
  193. {
  194. return 0;
  195. }
  196. static inline void kgsl_drm_exit(void)
  197. {
  198. }
  199. #endif
  200. static inline int kgsl_gpuaddr_in_memdesc(const struct kgsl_memdesc *memdesc,
  201. unsigned int gpuaddr, unsigned int size)
  202. {
  203. /* set a minimum size to search for */
  204. if (!size)
  205. size = 1;
  206. /* don't overflow */
  207. if (size > UINT_MAX - gpuaddr)
  208. return 0;
  209. if (gpuaddr >= memdesc->gpuaddr &&
  210. ((gpuaddr + size) <= (memdesc->gpuaddr + memdesc->size))) {
  211. return 1;
  212. }
  213. return 0;
  214. }
  215. static inline void *kgsl_memdesc_map(struct kgsl_memdesc *memdesc)
  216. {
  217. if (memdesc->ops && memdesc->ops->map_kernel)
  218. memdesc->ops->map_kernel(memdesc);
  219. return memdesc->hostptr;
  220. }
  221. static inline void kgsl_memdesc_unmap(struct kgsl_memdesc *memdesc)
  222. {
  223. if (memdesc->ops && memdesc->ops->unmap_kernel)
  224. memdesc->ops->unmap_kernel(memdesc);
  225. }
  226. static inline uint8_t *kgsl_gpuaddr_to_vaddr(struct kgsl_memdesc *memdesc,
  227. unsigned int gpuaddr)
  228. {
  229. void *hostptr = NULL;
  230. if ((gpuaddr >= memdesc->gpuaddr) &&
  231. (gpuaddr < (memdesc->gpuaddr + memdesc->size)))
  232. hostptr = kgsl_memdesc_map(memdesc);
  233. return hostptr != NULL ? hostptr + (gpuaddr - memdesc->gpuaddr) : NULL;
  234. }
  235. static inline int timestamp_cmp(unsigned int a, unsigned int b)
  236. {
  237. /* check for equal */
  238. if (a == b)
  239. return 0;
  240. /* check for greater-than for non-rollover case */
  241. if ((a > b) && (a - b < KGSL_TIMESTAMP_WINDOW))
  242. return 1;
  243. /* check for greater-than for rollover case
  244. * note that <= is required to ensure that consistent
  245. * results are returned for values whose difference is
  246. * equal to the window size
  247. */
  248. a += KGSL_TIMESTAMP_WINDOW;
  249. b += KGSL_TIMESTAMP_WINDOW;
  250. return ((a > b) && (a - b <= KGSL_TIMESTAMP_WINDOW)) ? 1 : -1;
  251. }
  252. static inline int
  253. kgsl_mem_entry_get(struct kgsl_mem_entry *entry)
  254. {
  255. return kref_get_unless_zero(&entry->refcount);
  256. }
  257. static inline void
  258. kgsl_mem_entry_put(struct kgsl_mem_entry *entry)
  259. {
  260. kref_put(&entry->refcount, kgsl_mem_entry_destroy);
  261. }
  262. #endif /* __KGSL_H */